@everfur/sdk 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/CHANGELOG.md +326 -0
  2. package/README.md +24 -16
  3. package/dist/{Chat-DZpYH8Uh.d.ts → Chat-Cv9EYMYA.d.ts} +3 -3
  4. package/dist/{Chat-bATY4atj.d.cts → Chat-s2vcPbw3.d.cts} +3 -3
  5. package/dist/{DepthViews-qBIoA48w.d.ts → DepthViews-CVxUHOJ-.d.ts} +1 -1
  6. package/dist/{DepthViews-C4DC4Kom.d.cts → DepthViews-Cz7mSW7p.d.cts} +1 -1
  7. package/dist/{DepthViews-dLTizxjr.d.ts → DepthViews-DNRY0Ugm.d.ts} +1 -1
  8. package/dist/{DepthViews-BpHUbjSY.d.cts → DepthViews-DvNixbxg.d.cts} +1 -1
  9. package/dist/{ErrorPolicyPort-D22LUVrK.d.ts → ErrorPolicyPort-DwSnmGcX.d.ts} +1 -1
  10. package/dist/{ErrorPolicyPort-D6CybiqJ.d.cts → ErrorPolicyPort-NFDPe-5w.d.cts} +1 -1
  11. package/dist/{EverfurError-DmELDpXp.d.cts → EverfurError-pEXDbUJ1.d.cts} +9 -1
  12. package/dist/{EverfurError-DmELDpXp.d.ts → EverfurError-pEXDbUJ1.d.ts} +9 -1
  13. package/dist/{EverfurResult-ZtH-YV1h.d.cts → EverfurResult-dtl8ERAw.d.cts} +1 -1
  14. package/dist/{EverfurResult-SGvHKsCB.d.ts → EverfurResult-sKkoXew0.d.ts} +1 -1
  15. package/dist/IntakeMedia-BFZfBLjB.d.cts +116 -0
  16. package/dist/{BookedScreen-DFJcgf1e.d.ts → IntakeMedia-BH0fYDT2.d.cts} +58 -2
  17. package/dist/{BookedScreen-R5X_Zrlh.d.cts → IntakeMedia-Bavl7E4Z.d.ts} +58 -2
  18. package/dist/IntakeMedia-C8GlN_GK.d.ts +116 -0
  19. package/dist/animations/index.cjs +109 -1
  20. package/dist/animations/index.d.cts +6 -6
  21. package/dist/animations/index.d.ts +6 -6
  22. package/dist/animations/index.js +109 -1
  23. package/dist/{attachments-CPRFfoHT.d.ts → attachments-BaslXMdS.d.ts} +3 -3
  24. package/dist/{attachments-CUOGILir.d.cts → attachments-DbFwz4iq.d.cts} +7 -7
  25. package/dist/{attachments-Ce06TWqe.d.cts → attachments-y3EcOX_w.d.cts} +3 -3
  26. package/dist/{attachments-CXAnZcEg.d.ts → attachments-y_aO4hlk.d.ts} +7 -7
  27. package/dist/{bookingCopy-BwVopcoV.d.cts → bookingCopy-4i1R7klo.d.cts} +15 -7
  28. package/dist/{bookingCopy-DFTv9w6J.d.ts → bookingCopy-B3UMITD-.d.ts} +15 -7
  29. package/dist/{branding-ytH4jJq1.d.ts → branding-BYEqU855.d.ts} +1 -1
  30. package/dist/{branding-Bio5MM6g.d.cts → branding-BwEu68C8.d.cts} +1 -1
  31. package/dist/{callRoom-7wrE3RP2.d.ts → callRoom-B1qq_D-4.d.ts} +1 -1
  32. package/dist/{callRoom-B_EqaUzx.d.cts → callRoom-DfZTWFXh.d.cts} +1 -1
  33. package/dist/{casesRepository-CJchNp3x.d.cts → casesRepository-B6Z0XBIb.d.cts} +2 -2
  34. package/dist/{casesRepository-DAVcY3jC.d.ts → casesRepository-SI0zp5YH.d.ts} +2 -2
  35. package/dist/chat/index.cjs +333 -1
  36. package/dist/chat/index.d.cts +12 -12
  37. package/dist/chat/index.d.ts +12 -12
  38. package/dist/chat/index.js +333 -1
  39. package/dist/client/index.cjs +115 -11
  40. package/dist/client/index.d.cts +14 -14
  41. package/dist/client/index.d.ts +14 -14
  42. package/dist/client/index.js +115 -11
  43. package/dist/{config-ZxwCylac.d.ts → config-Cvo47voG.d.ts} +3 -3
  44. package/dist/{config-h5h6TsHL.d.cts → config-v5k6NsK_.d.cts} +3 -3
  45. package/dist/consent/index.cjs +112 -1
  46. package/dist/consent/index.d.cts +9 -9
  47. package/dist/consent/index.d.ts +9 -9
  48. package/dist/consent/index.js +112 -1
  49. package/dist/{context-CtsAgJnc.d.cts → context-BZOtJbBO.d.cts} +9 -9
  50. package/dist/{context-DtPIshVA.d.ts → context-cZ7NZ0sG.d.ts} +9 -9
  51. package/dist/{copy-Cg89Qoal.d.ts → copy-CZBUHbyS.d.ts} +5 -5
  52. package/dist/{copy-CaWaplQc.d.cts → copy-ChJupm1p.d.cts} +5 -5
  53. package/dist/core/index.cjs +140 -13
  54. package/dist/core/index.d.cts +19 -19
  55. package/dist/core/index.d.ts +19 -19
  56. package/dist/core/index.js +140 -13
  57. package/dist/{depth-EXZYEO70.d.cts → depth-CRyU7-pf.d.cts} +8 -7
  58. package/dist/{depth-Bo4bAwcn.d.ts → depth-vNpwOkZ8.d.ts} +8 -7
  59. package/dist/{entitlementRepository-BYtVb1oU.d.cts → entitlementRepository-Bv8nSYRd.d.cts} +4 -4
  60. package/dist/{entitlementRepository-DcbIx8yV.d.ts → entitlementRepository-CUdxbQrP.d.ts} +4 -4
  61. package/dist/{identity-EC5-apbY.d.ts → identity-B8GkH53J.d.ts} +2 -2
  62. package/dist/{identity-b5Vp32Vp.d.cts → identity-BHaMJ3KK.d.cts} +2 -2
  63. package/dist/index.cjs +363 -12
  64. package/dist/index.d.cts +19 -19
  65. package/dist/index.d.ts +19 -19
  66. package/dist/index.js +363 -12
  67. package/dist/{models-DSqA5Ahs.d.ts → models-CrbUwbuS.d.ts} +1 -1
  68. package/dist/{models-Bn2z0NNo.d.cts → models-DzvqEjMm.d.cts} +1 -1
  69. package/dist/notifications/index.cjs +94 -2
  70. package/dist/notifications/index.d.cts +5 -5
  71. package/dist/notifications/index.d.ts +5 -5
  72. package/dist/notifications/index.js +94 -2
  73. package/dist/{pets-DM8QvKLo.d.cts → pets-BI7Ji8hi.d.cts} +2 -2
  74. package/dist/{pets-B_27_agU.d.ts → pets-Dnn-DK1T.d.ts} +2 -2
  75. package/dist/{petsRepository-CuYZZaI5.d.ts → petsRepository-B2lO1sKS.d.ts} +2 -2
  76. package/dist/{petsRepository-BJsJ4cju.d.cts → petsRepository-BP9nhM1R.d.cts} +2 -2
  77. package/dist/photo/index.cjs +131 -1
  78. package/dist/photo/index.d.cts +3 -3
  79. package/dist/photo/index.d.ts +3 -3
  80. package/dist/photo/index.js +131 -1
  81. package/dist/{ports-nXHf50_X.d.ts → ports-BUXF0Rp3.d.ts} +7 -7
  82. package/dist/{ports-ZmJYgd5I.d.cts → ports-C40S2V14.d.cts} +7 -7
  83. package/dist/records/depth/index.cjs +200 -2
  84. package/dist/records/depth/index.d.cts +11 -11
  85. package/dist/records/depth/index.d.ts +11 -11
  86. package/dist/records/depth/index.js +200 -2
  87. package/dist/records/index.cjs +742 -4
  88. package/dist/records/index.d.cts +22 -14
  89. package/dist/records/index.d.ts +22 -14
  90. package/dist/records/index.js +742 -4
  91. package/dist/{requestFunnel-Ve9BshTB.d.ts → requestFunnel-BrOijMcw.d.ts} +5 -5
  92. package/dist/{requestFunnel-C_cZXhIA.d.cts → requestFunnel-BxNVGyGm.d.cts} +5 -5
  93. package/dist/{runtimeTypes-ByKsp8hm.d.ts → runtimeTypes-CvI1ZH8j.d.ts} +7 -7
  94. package/dist/{runtimeTypes-D155OlBW.d.cts → runtimeTypes-DOO3f-W-.d.cts} +7 -7
  95. package/dist/server/events/index.cjs +92 -2
  96. package/dist/server/events/index.d.cts +4 -4
  97. package/dist/server/events/index.d.ts +4 -4
  98. package/dist/server/events/index.js +92 -2
  99. package/dist/server/index.cjs +95 -2
  100. package/dist/server/index.d.cts +5 -5
  101. package/dist/server/index.d.ts +5 -5
  102. package/dist/server/index.js +95 -2
  103. package/dist/televet/booking/index.cjs +394 -4
  104. package/dist/televet/booking/index.d.cts +24 -127
  105. package/dist/televet/booking/index.d.ts +24 -127
  106. package/dist/televet/booking/index.js +394 -4
  107. package/dist/televet/call/index.cjs +71 -1
  108. package/dist/televet/call/index.d.cts +3 -3
  109. package/dist/televet/call/index.d.ts +3 -3
  110. package/dist/televet/call/index.js +71 -1
  111. package/dist/televet/index.cjs +101 -1
  112. package/dist/televet/index.d.cts +25 -8
  113. package/dist/televet/index.d.ts +25 -8
  114. package/dist/televet/index.js +101 -1
  115. package/dist/{bookingTypes-D4pD3tHs.d.ts → televetGlobal-C5dTUACe.d.cts} +34 -1
  116. package/dist/{bookingTypes-D4pD3tHs.d.cts → televetGlobal-CnjrfhT4.d.ts} +34 -1
  117. package/dist/testing/index.cjs +98 -7
  118. package/dist/testing/index.d.cts +3 -3
  119. package/dist/testing/index.d.ts +3 -3
  120. package/dist/testing/index.js +98 -7
  121. package/dist/testing/rn/index.cjs +101 -1
  122. package/dist/testing/rn/index.d.cts +13 -13
  123. package/dist/testing/rn/index.d.ts +13 -13
  124. package/dist/testing/rn/index.js +101 -1
  125. package/dist/testing/web/index.cjs +95 -1
  126. package/dist/testing/web/index.d.cts +14 -14
  127. package/dist/testing/web/index.d.ts +14 -14
  128. package/dist/testing/web/index.js +95 -1
  129. package/dist/{timelineRows-DXpjECfA.d.ts → timelineRows-CEx2TzYB.d.ts} +1 -1
  130. package/dist/{timelineRows-BNF43SXK.d.cts → timelineRows-Dffceql_.d.cts} +1 -1
  131. package/dist/{tokens-BYtbKwFh.d.cts → tokens-Tzo1KBND.d.cts} +43 -2
  132. package/dist/{tokens-BYtbKwFh.d.ts → tokens-Tzo1KBND.d.ts} +43 -2
  133. package/dist/{typeStyle-BqfwxZH4.d.cts → typeStyle-C3IG9Sft.d.ts} +22 -3
  134. package/dist/{typeStyle-DKz02DGU.d.ts → typeStyle-CZ3Tj60N.d.cts} +22 -3
  135. package/dist/{useRecordsDepth-CARTuHKh.d.cts → useRecordsDepth-D6a6-_u_.d.cts} +7 -6
  136. package/dist/{useRecordsDepth-fPSv-GXU.d.ts → useRecordsDepth-DuPUJFDQ.d.ts} +7 -6
  137. package/dist/{useVetVisit-Ds8f1peV.d.cts → useVetVisit-BQX_aTJs.d.cts} +2 -2
  138. package/dist/{useVetVisit-BsjoDO-n.d.ts → useVetVisit-RPBOabl8.d.ts} +2 -2
  139. package/dist/video/index.cjs +122 -1
  140. package/dist/video/index.d.cts +3 -3
  141. package/dist/video/index.d.ts +3 -3
  142. package/dist/video/index.js +122 -1
  143. package/dist/{view-Dc-JlFkf.d.ts → view-BSmN5RWf.d.ts} +5 -5
  144. package/dist/{view-DGPaVno8.d.cts → view-UFwCG1Pn.d.cts} +5 -5
  145. package/dist/web/consent/index.cjs +111 -1
  146. package/dist/web/consent/index.d.cts +9 -9
  147. package/dist/web/consent/index.d.ts +9 -9
  148. package/dist/web/consent/index.js +111 -1
  149. package/dist/web/index.cjs +325 -14
  150. package/dist/web/index.d.cts +22 -22
  151. package/dist/web/index.d.ts +22 -22
  152. package/dist/web/index.js +325 -14
  153. package/dist/web/notifications/index.cjs +95 -2
  154. package/dist/web/notifications/index.d.cts +7 -7
  155. package/dist/web/notifications/index.d.ts +7 -7
  156. package/dist/web/notifications/index.js +95 -2
  157. package/dist/web/records/depth/index.cjs +169 -2
  158. package/dist/web/records/depth/index.d.cts +11 -11
  159. package/dist/web/records/depth/index.d.ts +11 -11
  160. package/dist/web/records/depth/index.js +169 -2
  161. package/dist/web/records/index.cjs +689 -4
  162. package/dist/web/records/index.d.cts +34 -37
  163. package/dist/web/records/index.d.ts +34 -37
  164. package/dist/web/records/index.js +689 -4
  165. package/dist/web/records/upload/index.cjs +3 -0
  166. package/dist/web/records/upload/index.d.cts +23 -0
  167. package/dist/web/records/upload/index.d.ts +23 -0
  168. package/dist/web/records/upload/index.js +3 -0
  169. package/dist/web/televet/booking/index.cjs +423 -4
  170. package/dist/web/televet/booking/index.d.cts +26 -74
  171. package/dist/web/televet/booking/index.d.ts +26 -74
  172. package/dist/web/televet/booking/index.js +423 -4
  173. package/dist/web/televet/call/index.cjs +28 -1
  174. package/dist/web/televet/call/index.d.cts +2 -2
  175. package/dist/web/televet/call/index.d.ts +2 -2
  176. package/dist/web/televet/call/index.js +28 -1
  177. package/dist/web/televet/index.cjs +102 -4
  178. package/dist/web/televet/index.d.cts +29 -10
  179. package/dist/web/televet/index.d.ts +29 -10
  180. package/dist/web/televet/index.js +102 -4
  181. package/package.json +20 -4
  182. package/web/records/upload/native-blocked.cjs +12 -0
  183. package/web/records/upload/package.json +8 -0
  184. package/dist/televetGlobal-CEk0_cW9.d.cts +0 -34
  185. package/dist/televetGlobal-Cs9Wbqsy.d.ts +0 -34
@@ -1,2 +1,92 @@
1
- import {timingSafeEqual,createHmac,randomUUID}from'crypto';var we=Object.defineProperty;var n=(e,t)=>we(e,"name",{value:t,configurable:true});function k(e,t){return Object.freeze(t===void 0?{ok:true,value:e}:{ok:true,value:e,warning:t})}n(k,"ok");function _(e){return Object.freeze({ok:false,error:e})}n(_,"err");var E=class E extends Error{constructor(t,r){super(r),this.name="EverfurConfigError",this.kind=t,Object.setPrototypeOf(this,E.prototype);}};n(E,"EverfurConfigError");var s=E;var ke="Everfur-Signature",N=300,j="v1",Oe=4096,Te=64,xe=/^[0-9]+$/,R=class R extends Error{constructor(t){super(`Everfur webhook verification failed: ${t}`),this.name="EverfurWebhookVerificationError",this.code=t,Object.setPrototypeOf(this,R.prototype);}};n(R,"EverfurWebhookVerificationError");var p=R;function Ie(e,t,r,o={}){let i=L(e),a=M(r),l=o.toleranceSeconds??N;if(!Number.isInteger(l)||l<0)throw new s("invalid-argument","toleranceSeconds must be a non-negative integer");let d=De(t),u=o.nowSeconds??Math.floor(Date.now()/1e3);if(Math.abs(u-d.timestamp)>l)throw new p("timestamp_outside_tolerance");let c=false;for(let f of a){let y=Buffer.from(U(f,d.timestamp,i),"ascii");for(let m of d.signatures){if(m.length!==Te)continue;let g=Buffer.from(m,"utf8");g.length===y.length&&timingSafeEqual(y,g)&&(c=true);}}if(!c)throw new p("no_matching_signature");return Fe(i)}n(Ie,"constructEvent");function Ae(e){let t=L(e.payload),r=M(e.secrets),o=e.timestamp??Math.floor(Date.now()/1e3);if(!Number.isSafeInteger(o)||o<0)throw new s("invalid-argument","timestamp must be a non-negative integer (unix seconds)");return [`t=${o}`,...r.map(i=>`${j}=${U(i,o,t)}`)].join(",")}n(Ae,"generateTestSignatureHeader");function U(e,t,r){return createHmac("sha256",Buffer.from(e,"utf8")).update(`${t}.`,"ascii").update(r).digest("hex")}n(U,"computeSignature");function L(e){if(typeof e=="string")return Buffer.from(e,"utf8");if(e instanceof Uint8Array)return e;throw new s("invalid-argument","constructEvent needs the raw request body (a string or a Buffer), not parsed JSON: re-serialised JSON does not reproduce the signed bytes.")}n(L,"rawBodyBytes");function M(e){let t=typeof e=="string"?[e]:Array.isArray(e)?e:[];if(t.length===0||t.some(r=>typeof r!="string"||r.length===0))throw new s("invalid-argument","at least one non-empty webhook signing secret is required");return t}n(M,"requireSecrets");function De(e){if(typeof e!="string"||e.length===0||e.length>Oe)throw new p("malformed_header");let t=null,r=[];for(let o of e.split(",")){let i=o.trim(),a=i.indexOf("=");if(a<0)throw new p("malformed_header");let l=i.slice(0,a),d=i.slice(a+1);if(l==="t"){if(t!==null||!xe.test(d))throw new p("malformed_header");let u=Number(d);if(!Number.isSafeInteger(u))throw new p("malformed_header");t=u;}else l===j&&r.push(d);}if(t===null||r.length===0)throw new p("malformed_header");return {timestamp:t,signatures:r}}n(De,"parseSignatureHeader");function Fe(e){let t;try{t=JSON.parse(Buffer.from(e.buffer,e.byteOffset,e.byteLength).toString("utf8"));}catch{throw new p("malformed_payload")}if(!O(t))throw new p("malformed_payload");let{id:r,object:o,type:i,api_version:a,created:l,livemode:d,data:u}=t;if(typeof r!="string"||r.length===0||o!=="event"||typeof i!="string"||i.length===0||typeof a!="string"||typeof l!="number"||typeof d!="boolean"||!O(u)||!O(u.object))throw new p("malformed_payload");return t}n(Fe,"parseEnvelope");function O(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}n(O,"isRecord");var V="0.7.0",B="react-native",q="2026-09-19",z="EVERFUR_API_BASE_URL";function h(e,t){return Object.freeze({ok:false,failure:Object.freeze({reason:e,message:t})})}n(h,"configFailure");function Ne(e){let t=e?.trim(),r=t&&t.length>0?t:qe(z);return r?Ve(r):h("missing-api-base-url",`apiBaseUrl is required: pass config.apiBaseUrl or set ${z}. The SDK never ships a hardcoded host.`)}n(Ne,"tryResolveApiBaseUrl");function W(e){let t=Ne(e);if(!t.ok)throw new s("invalid-argument",t.failure.message);return t.value}n(W,"resolveApiBaseUrl");function H(e){return {"X-Everfur-SDK-Version":e.sdkVersion,"X-Everfur-SDK-Platform":e.platform,"X-Everfur-Contract":e.contractVersion}}n(H,"buildBaseHeaders");var je=/^([A-Za-z][A-Za-z0-9+.-]*):\/\/([^/?#]*)/;function Ue(e){return e.slice(e.lastIndexOf("@")+1).replace(/:\d+$/,"").toLowerCase()}n(Ue,"hostOf");function Le(e){return e.length===0||e.includes("@")?false:e.startsWith("[")&&e.endsWith("]")?true:!e.includes(":")}n(Le,"isPrintableHost");function Me(e,t){let r=e.indexOf("://");return r<0||e.slice(r+3).includes("@")?false:Le(t)}n(Me,"canEchoOrigin");function ze(e,t){return `${e}://${t}`}n(ze,"safeOrigin");function Ve(e){let t=e.trim(),r=je.exec(t);if(r===null||r[2]===void 0||r[2].length===0)return h("malformed-api-base-url","apiBaseUrl is not a valid absolute URL");let o=(r[1]??"").toLowerCase(),i=Ue(r[2]);if(i.length===0)return h("malformed-api-base-url","apiBaseUrl is not a valid absolute URL");let a=Me(t,i)?`: ${ze(o,i)}`:"";if(o!=="https"){if(!(o==="http"&&Be(i)))return o==="http"?h("insecure-api-base-url",`apiBaseUrl must use https (cleartext http is only allowed for localhost)${a}`):h("unsupported-api-base-url-scheme",`apiBaseUrl must be http(s)${a}`)}let l=t.endsWith("/")?t.slice(0,-1):t;return Object.freeze({ok:true,value:l})}n(Ve,"normalizeBaseUrl");function Be(e){let t=e.toLowerCase();return t==="localhost"||t==="127.0.0.1"||t==="[::1]"||t==="::1"}n(Be,"isLoopbackHost");function qe(e){let r=globalThis.process?.env?.[e];return typeof r=="string"&&r.trim().length>0?r.trim():void 0}n(qe,"readEnv");var T=Object.freeze([Object.freeze({wireCode:"AccessDeniedException",envelope:"http_envelope",httpStatus:403,retryable:false}),Object.freeze({wireCode:"AuthorizationException",envelope:"http_envelope",httpStatus:401,retryable:false}),Object.freeze({wireCode:"ConflictException",envelope:"http_envelope",httpStatus:409,retryable:true}),Object.freeze({wireCode:"DAILY_QUOTA_EXCEEDED",envelope:"http_envelope",httpStatus:429,retryable:true}),Object.freeze({wireCode:"FILE_TOO_LARGE",envelope:"http_envelope",httpStatus:400,retryable:false}),Object.freeze({wireCode:"IDEMPOTENCY_KEY_IN_FLIGHT",envelope:"http_envelope",httpStatus:409,retryable:true}),Object.freeze({wireCode:"IDEMPOTENCY_KEY_REUSED_DIFFERENT_REQUEST",envelope:"http_envelope",httpStatus:409,retryable:false}),Object.freeze({wireCode:"INVALID_CONTENT_TYPE",envelope:"http_envelope",httpStatus:400,retryable:false}),Object.freeze({wireCode:"InternalFailureException",envelope:"http_envelope",httpStatus:500,retryable:true}),Object.freeze({wireCode:"MethodNotAllowedException",envelope:"http_envelope",httpStatus:405,retryable:false}),Object.freeze({wireCode:"NotImplementedException",envelope:"http_envelope",httpStatus:501,retryable:false}),Object.freeze({wireCode:"PaymentRequiredException",envelope:"http_envelope",httpStatus:402,retryable:false}),Object.freeze({wireCode:"ResourceNotFoundException",envelope:"http_envelope",httpStatus:404,retryable:false}),Object.freeze({wireCode:"ServiceUnavailableException",envelope:"http_envelope",httpStatus:503,retryable:true}),Object.freeze({wireCode:"TIER_UPGRADE_REQUIRED",envelope:"http_envelope",httpStatus:402,retryable:false}),Object.freeze({wireCode:"ThrottlingException",envelope:"http_envelope",httpStatus:429,retryable:true}),Object.freeze({wireCode:"ValidationException",envelope:"http_envelope",httpStatus:400,retryable:false}),Object.freeze({wireCode:"accessDenied",envelope:"http_envelope",httpStatus:403,retryable:false}),Object.freeze({wireCode:"access_denied",envelope:"oauth_error",httpStatus:302,retryable:false}),Object.freeze({wireCode:"attachment_unreadable",envelope:"http_envelope",httpStatus:400,retryable:false}),Object.freeze({wireCode:"authExpired",envelope:"http_envelope",httpStatus:401,retryable:true}),Object.freeze({wireCode:"authRejected",envelope:"http_envelope",httpStatus:401,retryable:false}),Object.freeze({wireCode:"consent_invalid",envelope:"http_envelope",httpStatus:422,retryable:false}),Object.freeze({wireCode:"consent_required",envelope:"http_envelope",httpStatus:422,retryable:false}),Object.freeze({wireCode:"consent_scope_wrong_route",envelope:"http_envelope",httpStatus:400,retryable:false}),Object.freeze({wireCode:"device_cipher_unavailable",envelope:"http_envelope",httpStatus:503,retryable:true}),Object.freeze({wireCode:"email_invalid",envelope:"http_envelope",httpStatus:422,retryable:false}),Object.freeze({wireCode:"event_cursor_invalid",envelope:"http_envelope",httpStatus:400,retryable:false}),Object.freeze({wireCode:"event_filter_invalid",envelope:"http_envelope",httpStatus:400,retryable:false}),Object.freeze({wireCode:"event_payload_invalid",envelope:"http_envelope",httpStatus:400,retryable:false}),Object.freeze({wireCode:"event_type_not_available",envelope:"http_envelope",httpStatus:400,retryable:false}),Object.freeze({wireCode:"event_type_unknown",envelope:"http_envelope",httpStatus:400,retryable:false}),Object.freeze({wireCode:"idempotency_key_invalid",envelope:"http_envelope",httpStatus:400,retryable:false}),Object.freeze({wireCode:"idempotency_key_required",envelope:"http_envelope",httpStatus:400,retryable:false}),Object.freeze({wireCode:"idempotency_key_reused",envelope:"http_envelope",httpStatus:409,retryable:false}),Object.freeze({wireCode:"insufficientCapability",envelope:"http_envelope",httpStatus:403,retryable:false}),Object.freeze({wireCode:"insufficient_scope",envelope:"http_envelope",httpStatus:403,retryable:false}),Object.freeze({wireCode:"internal_error",envelope:"sse_frame",httpStatus:200,retryable:false}),Object.freeze({wireCode:"invalidRequest",envelope:"http_envelope",httpStatus:400,retryable:false}),Object.freeze({wireCode:"invalid_client",envelope:"oauth_error",httpStatus:401,retryable:false}),Object.freeze({wireCode:"invalid_client_metadata",envelope:"oauth_error",httpStatus:400,retryable:false}),Object.freeze({wireCode:"invalid_grant",envelope:"oauth_error",httpStatus:400,retryable:false}),Object.freeze({wireCode:"invalid_redirect_uri",envelope:"oauth_error",httpStatus:400,retryable:false}),Object.freeze({wireCode:"invalid_request",envelope:"oauth_error",httpStatus:400,retryable:false}),Object.freeze({wireCode:"invalid_scope",envelope:"oauth_error",httpStatus:400,retryable:false}),Object.freeze({wireCode:"invalid_target",envelope:"oauth_error",httpStatus:400,retryable:false}),Object.freeze({wireCode:"mcp_connection_not_found",envelope:"http_envelope",httpStatus:404,retryable:false}),Object.freeze({wireCode:"mcp_request_conflict",envelope:"http_envelope",httpStatus:409,retryable:false}),Object.freeze({wireCode:"mcp_request_gone",envelope:"http_envelope",httpStatus:410,retryable:false}),Object.freeze({wireCode:"mcp_request_not_found",envelope:"http_envelope",httpStatus:404,retryable:false}),Object.freeze({wireCode:"not_found",envelope:"sse_frame",httpStatus:200,retryable:false}),Object.freeze({wireCode:"partner_visit_link_conflict",envelope:"http_envelope",httpStatus:409,retryable:false}),Object.freeze({wireCode:"partner_visit_owner_only",envelope:"http_envelope",httpStatus:403,retryable:false}),Object.freeze({wireCode:"partner_visit_pet_already_mapped",envelope:"http_envelope",httpStatus:409,retryable:false}),Object.freeze({wireCode:"payload_too_large",envelope:"http_envelope",httpStatus:413,retryable:false}),Object.freeze({wireCode:"petRefInUse",envelope:"http_envelope",httpStatus:409,retryable:false}),Object.freeze({wireCode:"pet_health_list_removals_unconfirmed",envelope:"http_envelope",httpStatus:422,retryable:false}),Object.freeze({wireCode:"pet_health_species_unsupported",envelope:"http_envelope",httpStatus:422,retryable:false}),Object.freeze({wireCode:"pet_not_registered",envelope:"http_envelope",httpStatus:404,retryable:false}),Object.freeze({wireCode:"provider_unsupported",envelope:"http_envelope",httpStatus:422,retryable:false}),Object.freeze({wireCode:"rateLimited",envelope:"http_envelope",httpStatus:429,retryable:true}),Object.freeze({wireCode:"record_species_unsupported",envelope:"http_envelope",httpStatus:422,retryable:false}),Object.freeze({wireCode:"record_subject_not_found",envelope:"http_envelope",httpStatus:404,retryable:false}),Object.freeze({wireCode:"record_upload_invalid",envelope:"http_envelope",httpStatus:400,retryable:false}),Object.freeze({wireCode:"records_consent_required",envelope:"http_envelope",httpStatus:409,retryable:false}),Object.freeze({wireCode:"sandbox_only",envelope:"http_envelope",httpStatus:403,retryable:false}),Object.freeze({wireCode:"session_required",envelope:"http_envelope",httpStatus:403,retryable:false}),Object.freeze({wireCode:"share_limit_reached",envelope:"http_envelope",httpStatus:429,retryable:false}),Object.freeze({wireCode:"slow_down",envelope:"oauth_error",httpStatus:429,retryable:true}),Object.freeze({wireCode:"species_unsupported",envelope:"http_envelope",httpStatus:422,retryable:false}),Object.freeze({wireCode:"tenant_filter_invalid",envelope:"http_envelope",httpStatus:400,retryable:false}),Object.freeze({wireCode:"tenant_has_no_capabilities",envelope:"http_envelope",httpStatus:409,retryable:false}),Object.freeze({wireCode:"tenant_resource_not_found",envelope:"http_envelope",httpStatus:404,retryable:false}),Object.freeze({wireCode:"tenant_surface_not_enabled",envelope:"http_envelope",httpStatus:409,retryable:false}),Object.freeze({wireCode:"timeout",envelope:"sse_frame",httpStatus:200,retryable:true}),Object.freeze({wireCode:"token_invalid",envelope:"http_envelope",httpStatus:422,retryable:false}),Object.freeze({wireCode:"unavailable",envelope:"sse_frame",httpStatus:200,retryable:true}),Object.freeze({wireCode:"unavailable",envelope:"http_envelope",httpStatus:503,retryable:true}),Object.freeze({wireCode:"unsupported_grant_type",envelope:"oauth_error",httpStatus:400,retryable:false}),Object.freeze({wireCode:"unsupported_response_type",envelope:"oauth_error",httpStatus:302,retryable:false}),Object.freeze({wireCode:"verify_mint_rate_limited",envelope:"http_envelope",httpStatus:429,retryable:true}),Object.freeze({wireCode:"verify_mint_refused",envelope:"http_envelope",httpStatus:403,retryable:false}),Object.freeze({wireCode:"verify_mint_unavailable",envelope:"http_envelope",httpStatus:503,retryable:true}),Object.freeze({wireCode:"verify_user_ref_invalid",envelope:"http_envelope",httpStatus:422,retryable:false}),Object.freeze({wireCode:"webhook_endpoint_update_empty",envelope:"http_envelope",httpStatus:400,retryable:false}),Object.freeze({wireCode:"webhook_endpoint_update_invalid",envelope:"http_envelope",httpStatus:400,retryable:false}),Object.freeze({wireCode:"webhook_url_rejected",envelope:"http_envelope",httpStatus:400,retryable:false})]);Object.freeze(T.map(e=>e.wireCode));var We=Object.freeze({ValidationException:"validationFailed",AuthorizationException:"authRejected",PaymentRequiredException:"paymentRequired",AccessDeniedException:"accessDenied",ResourceNotFoundException:"resourceNotFound",ConflictException:"conflict",ThrottlingException:"rateLimited",InternalFailureException:"internalError",NotImplementedException:"notImplemented",ServiceUnavailableException:"serviceUnavailable",MethodNotAllowedException:"validationFailed",authExpired:"authExpired",unavailable:"serviceUnavailable",session_required:"sessionRequired",accessDenied:"accessDenied",invalidRequest:"sdkUpdateRequired",authRejected:"authRejected",rateLimited:"rateLimited",insufficientCapability:"accessDenied",event_cursor_invalid:"validationFailed",event_filter_invalid:"validationFailed",event_payload_invalid:"validationFailed",event_type_unknown:"validationFailed",idempotency_key_invalid:"validationFailed",idempotency_key_required:"validationFailed",idempotency_key_reused:"idempotencyConflict",payload_too_large:"validationFailed",webhook_url_rejected:"validationFailed",webhook_endpoint_update_empty:"validationFailed",webhook_endpoint_update_invalid:"validationFailed",event_type_not_available:"conflict",record_subject_not_found:"resourceNotFound",records_consent_required:"conflict",record_species_unsupported:"validationFailed",record_upload_invalid:"validationFailed",FILE_TOO_LARGE:"validationFailed",INVALID_CONTENT_TYPE:"validationFailed",attachment_unreadable:"validationFailed",provider_unsupported:"validationFailed",token_invalid:"validationFailed",device_cipher_unavailable:"serviceUnavailable",email_invalid:"validationFailed",consent_required:"validationFailed",consent_invalid:"validationFailed",consent_scope_wrong_route:"validationFailed",IDEMPOTENCY_KEY_IN_FLIGHT:"idempotencyInFlight",IDEMPOTENCY_KEY_REUSED_DIFFERENT_REQUEST:"idempotencyConflict",DAILY_QUOTA_EXCEEDED:"quotaExceeded",TIER_UPGRADE_REQUIRED:"paymentRequired",not_found:"conversationNotFound",timeout:"streamTimeout",internal_error:"internalError",invalid_request:"validationFailed",invalid_client:"authRejected",invalid_grant:"authRejected",unsupported_grant_type:"validationFailed",invalid_scope:"validationFailed",invalid_target:"validationFailed",invalid_redirect_uri:"validationFailed",invalid_client_metadata:"validationFailed",unsupported_response_type:"validationFailed",access_denied:"accessDenied",slow_down:"rateLimited",mcp_request_not_found:"resourceNotFound",mcp_request_gone:"resourceNotFound",mcp_connection_not_found:"resourceNotFound",mcp_request_conflict:"conflict",sandbox_only:"accessDenied",tenant_has_no_capabilities:"conflict",verify_mint_refused:"accessDenied",verify_mint_rate_limited:"rateLimited",verify_mint_unavailable:"serviceUnavailable",verify_user_ref_invalid:"validationFailed",insufficient_scope:"accessDenied",tenant_filter_invalid:"validationFailed",tenant_resource_not_found:"resourceNotFound",tenant_surface_not_enabled:"conflict",pet_health_species_unsupported:"validationFailed",pet_health_list_removals_unconfirmed:"validationFailed",petRefInUse:"conflict",share_limit_reached:"conflict",pet_not_registered:"resourceNotFound",species_unsupported:"validationFailed",partner_visit_owner_only:"accessDenied",partner_visit_link_conflict:"conflict",partner_visit_pet_already_mapped:"conflict"}),K=Object.freeze(T.map(e=>Object.freeze({wireCode:e.wireCode,envelope:e.envelope,retryable:e.retryable,normalized:We[e.wireCode]}))),He=new Map(K.map(e=>[e.envelope+e.wireCode.toUpperCase(),e])),$e=Object.freeze(["http_envelope",...[...new Set(K.map(e=>e.envelope))].filter(e=>e!=="http_envelope").sort()]);function P(e,t){if(typeof e!="string")return;let r=e.trim().toUpperCase();if(r.length!==0)for(let o of [t??"http_envelope",...$e]){let i=He.get(o+r);if(i)return i}}n(P,"contractErrorFor");function Ke(e){return e.envelope==="sse_frame"?`/errors#sse-${e.wireCode}`:e.envelope==="oauth_error"?`/errors#oauth-${e.wireCode}`:`/errors#${e.wireCode}`}n(Ke,"contractDocUrl");function Y(e){return null}n(Y,"publishedDocUrl");var Ye=Object.freeze({authExpired:"authentication",authRejected:"authentication",sessionRequired:"authentication",accessDenied:"authorization",paymentRequired:"entitlement",quotaExceeded:"rateLimit",rateLimited:"rateLimit",validationFailed:"invalidRequest",sdkUpdateRequired:"invalidRequest",conversationNotFound:"notFound",petNotFound:"notFound",resourceNotFound:"notFound",conflict:"conflict",idempotencyConflict:"conflict",idempotencyInFlight:"conflict",streamTimeout:"connection",streamIncomplete:"connection",upstreamLlmTimeout:"connection",serviceUnavailable:"connection",internalError:"server",notImplemented:"server",mediaUploadFailed:"media",moderationBlocked:"policy",unknown:"unknown"});function G(e){return Ye[e]}n(G,"categoryFor");function X(e){let t=P(e);if(t)return t.normalized;let r=(e??"").trim().toUpperCase(),o=r.replace(/[^A-Z0-9]/g,"");if(o==="AUTHREJECTED")return "authRejected";if(r.startsWith("AUTH"))return "authExpired";switch(o){case "DAILYQUOTAEXCEEDED":case "QUOTAEXCEEDED":return "quotaExceeded";case "RATELIMITED":case "TOOMANYREQUESTS":case "TELEVETRATELIMITED":return "rateLimited";case "IDEMPOTENCYKEYCONFLICT":case "IDEMPOTENCYCONFLICT":return "idempotencyConflict";case "ACCESSDENIED":case "FORBIDDEN":return "accessDenied";case "NOTFOUND":case "CONVERSATIONNOTFOUND":return "conversationNotFound";case "PETNOTFOUND":return "petNotFound";case "TIMEOUT":case "STREAMTIMEOUT":return "streamTimeout";case "MEDIAUPLOADFAILED":case "UNRECOGNIZEDVIDEOFORMAT":case "FILETOOSMALL":return "mediaUploadFailed";case "MODERATIONBLOCKED":return "moderationBlocked";case "UPSTREAMLLMTIMEOUT":return "upstreamLlmTimeout";case "INTERNALERROR":case "INTERNALSERVERERROR":return "internalError";case "STREAMINCOMPLETE":case "CHATSTREAMINCOMPLETE":return "streamIncomplete";case "INVALIDANALYSISTYPE":case "INVALIDUPLOADPURPOSE":return "unknown";default:return "unknown"}}n(X,"fromWire");function J(e){return e===401?"authExpired":e===403?"accessDenied":e===404?"conversationNotFound":e===409?"idempotencyConflict":e===421?"unknown":e===429?"rateLimited":e===400||e===422?"unknown":e>=500?"internalError":"unknown"}n(J,"fromHttpStatus");var Ge=new Set(["streamTimeout","rateLimited","internalError","upstreamLlmTimeout","streamIncomplete"]);function Q(e){return Ge.has(e)}n(Q,"isAutoRetryable");var Xe=new Set(["serviceUnavailable","conflict","idempotencyInFlight"]);function Z(e){return Q(e)||Xe.has(e)}n(Z,"isRetryableCode");var Je=Object.freeze({authExpired:"Please sign in again to continue.",authRejected:"Please sign in again to continue.",sessionRequired:"This app needs to be updated to keep using Everfur.",accessDenied:"This feature isn't available on your account right now.",paymentRequired:"This is part of a paid plan.",quotaExceeded:"You have used today's messages. This resets tomorrow.",rateLimited:"You are sending messages quickly. Try again in a few seconds.",validationFailed:"Something in that request was not right. Check the details and try again.",sdkUpdateRequired:"This app needs to be updated to keep using Everfur.",conflict:"That is already running. Wait for it to finish, then try again.",idempotencyConflict:"That message was already delivered.",idempotencyInFlight:"That is still processing. Give it a moment.",conversationNotFound:"This conversation is no longer available.",petNotFound:"We could not find that pet. Please pick a pet and try again.",resourceNotFound:"We could not find that.",streamTimeout:"The response timed out. Tap retry to try again.",mediaUploadFailed:"We could not upload that photo. Please attach it again.",moderationBlocked:"This request cannot be answered here.",upstreamLlmTimeout:"The response timed out. Tap retry to try again.",internalError:"We hit a snag on our end. Please try again.",notImplemented:"That is not available yet.",serviceUnavailable:"That service is briefly unavailable. Try again shortly.",streamIncomplete:"The connection dropped mid-answer. Tap retry to continue.",unknown:"Something went wrong. Please try again."});function Qe(e){return Je[e]}n(Qe,"userFacingError");function ee(e,t,r){Object.defineProperty(e,t,{value:r,enumerable:false,writable:false,configurable:false});}n(ee,"defineHidden");var Ze=/^[a-z][a-z0-9_]{0,63}$/;function x(e,t){let r=P(t?.wireCode,t?.wireEnvelope),o={code:e,category:G(e),retryable:t?.retryable??Z(e),displayMessage:Qe(e)};if(t?.httpStatus!==void 0&&(o.httpStatus=t.httpStatus),t?.requestId&&(o.requestId=t.requestId),typeof t?.reasonCode=="string"&&Ze.test(t.reasonCode)&&(o.reasonCode=t.reasonCode),r);return t?.wireMessage&&ee(o,"wireMessage",t.wireMessage),t?.raw!==void 0&&t.raw!==null&&ee(o,"raw",t.raw),Object.freeze(o)}n(x,"makeEverfurError");var et="x-request-id";function I(e,t,r){let o=tt(t),i=o?X(o):J(e),a=rt(t);return x(i,{httpStatus:e,...nt(t)?{retryable:true}:{},...r?{requestId:r}:{},...o?{wireCode:o}:{},...te(t)?{reasonCode:te(t)}:{},...a?{wireMessage:a}:{},...t!=null?{raw:t}:{}})}n(I,"errorFromResponse");function re(e){return x("internalError",{retryable:true,wireMessage:ot(e)})}n(re,"networkError");function ne(e){let t=e.headers.get(et);return typeof t=="string"&&t.length>0?t:null}n(ne,"requestIdOf");function oe(){let e=globalThis.fetch;if(typeof e!="function")throw new s("missing-peer-dependency","global fetch is unavailable; provide config.transport or an injected fetch implementation");return e}n(oe,"getGlobalFetch");function te(e){let t=e,r=t?.error?.reason_code??t?.reason_code;return typeof r=="string"&&r.length>0?r:null}n(te,"extractReasonCode");function tt(e){let t=e,r=t?.error?.code??t?.code;return typeof r=="string"&&r.length>0?r:null}n(tt,"extractWireCode");function rt(e){let t=e,r=t?.error?.message??t?.message;return typeof r=="string"&&r.length>0?r:null}n(rt,"extractWireMessage");function nt(e){let t=e;return t?.error?.retryable===true||t?.retryable===true}n(nt,"extractRetryable");function ot(e){return e instanceof Error?e.message:typeof e=="string"?e:"network request failed"}n(ot,"describeCause");var ie=Object.freeze(["member.linked","member.unlinked","visit.booked","visit.cancelled","visit.completed","visit.no_show","record_request.updated","record.ready","webhook_endpoint.test","chat.follow_up_due","chat.urgency.flagged","pet.vaccination.due","visit.rescheduled","visit.reminder","visit.followup_sent","chat.reminder_due","record.activation","visit.message_received","visit.ended"]),it=Object.freeze(["member.linked","member.unlinked","chat.urgency.flagged","webhook_endpoint.test"]);function ae(e){return typeof e=="string"&&ie.includes(e)}n(ae,"isEverfurWebhookEventType");function at(e){return ae(e.type)}n(at,"isEverfurWebhookEvent");var w=Object.freeze(["pet.profile.updated","pet.incident.reported","pet.behavior_note.added","pet.service_score.recorded","pet.deleted","member.status_changed","member.deleted"]);var se=128;function S(e){let t=typeof e=="string"?[...e].length:0;if(typeof e!="string"||t<1||t>se)throw new s("invalid-argument",`user_ref must be 1..${se} characters`);if(e.trim().length===0)throw new s("invalid-argument","user_ref must not be blank: the server strips surrounding whitespace before validating, so a whitespace-only value arrives empty and is rejected as required.");if(e!==e.trim())throw new s("invalid-argument","user_ref must not have leading or trailing whitespace: the server strips it, so padded and unpadded forms of the same id resolve to ONE user. Pass the exact id you want to key on.");if(e.includes("@"))throw new s("invalid-argument","user_ref must not contain '@'");if(!st(e))throw new s("invalid-argument","user_ref must be printable (no control characters)");return e}n(S,"assertValidUserRef");function st(e){return !lt.test(e)}n(st,"isPrintable");var lt=/[\p{Cc}\p{Cf}\p{Cs}\p{Co}\p{Cn}\p{Zl}\p{Zp}]|(?!\u0020)[\p{Zs}]/u;function le(e){for(let t=0;t<e.length;t+=1){let r=e.charCodeAt(t);if(r>=55296&&r<=56319){let o=e.charCodeAt(t+1);if(!(o>=56320&&o<=57343))return true;t+=1;}else if(r>=56320&&r<=57343)return true}return false}n(le,"hasLoneSurrogate");function de(e){return [...e].length}n(de,"serverLength");var ue=Object.freeze({dog:"dog",canine:"dog",k9:"dog",puppy:"dog",cat:"cat",feline:"cat",kitten:"cat"});function ce(e){if(typeof e!="string")return null;let t=e.trim().toLowerCase();return Object.prototype.hasOwnProperty.call(ue,t)?ue[t]:null}n(ce,"canonicalPetSpecies");var pe=50,dt=128,A=120,fe=120,ut=2e3,ye=120,ct=80,pt=new Set(["male","female","unknown"]),ft=new Set(["day","month","year"]),yt=new Set(["low","medium","high","athletic"]),mt=new Set(["indoor","outdoor","both"]),vt=new Set(["mild","moderate","severe"]),gt=/^(\d{4})-(\d{2})-(\d{2})$/,ve=[["sex","sex"],["spayedNeutered","spayed_neutered"],["birthDate","birth_date"],["birthDatePrecision","birth_date_precision"],["activityLevel","activity_level"],["indoorOutdoor","indoor_outdoor"],["foodBrand","food_brand"],["foodType","food_type"],["microchipId","microchip_id"]],ge=[["allergies","allergies"],["medications","medications"],["supplements","supplements"],["conditions","conditions"]];Object.freeze([...ve,...ge].map(([e])=>e));function _t(e){let t=gt.exec(e);if(t===null)return false;let[r,o,i]=[Number(t[1]),Number(t[2]),Number(t[3])],a=new Date(Date.UTC(r,o-1,i));return a.getUTCFullYear()===r&&a.getUTCMonth()===o-1&&a.getUTCDate()===i}n(_t,"isRealDate");var b=n(e=>(t,r)=>typeof r=="string"&&e.has(r)?null:`${t} must be one of ${[...e].join(", ")}`,"oneOf"),ht=n((e,t)=>typeof t=="boolean"?null:`${e} must be true or false`,"boolean"),C=n((e,t)=>typeof t=="string"&&_t(t)?null:`${e} must be a real date written YYYY-MM-DD`,"date"),v=n((e,t={})=>(r,o)=>{if(typeof o!="string")return `${r} must be a string`;if(le(o))return `${r} contains an unpaired surrogate and cannot be encoded`;let i=t.trimmed?o.trim():o;if(t.required&&i.length===0)return `${r} is required and must not be blank`;let a=de(i);return a<=e?null:`${r} is ${a} characters; the server accepts at most ${e}`},"text"),bt={sex:b(pt),spayedNeutered:ht,birthDate:C,birthDatePrecision:b(ft),activityLevel:b(yt),indoorOutdoor:b(mt),foodBrand:v(ye),foodType:v(ye),microchipId:v(ct)},D=["ref","ref",false,v(dt,{required:true,trimmed:true})],F=["notes","notes",false,v(ut,{trimmed:true})],me=[D,["name","name",true,v(A,{required:true,trimmed:true})],["dose","dose",false,v(fe,{trimmed:true})],["frequency","frequency",false,v(fe,{trimmed:true})],["startDate","start_date",false,C],["endDate","end_date",false,C],F],Et={allergies:[D,["allergen","allergen",true,v(A,{required:true,trimmed:true})],["severity","severity",false,b(vt)],F],medications:me,supplements:me,conditions:[D,["conditionName","condition_name",true,v(A,{required:true,trimmed:true})],["diagnosedDate","diagnosed_date",false,C],F]};function Rt(e,t,r){let o=`${e}[${t}]`;if(typeof r!="object"||r===null||Array.isArray(r))return {error:`${o} must be an object`};let i=r,a={};for(let[u,c,f,y]of Et[e]){let m=i[u];if(m==null){if(f)return {error:`${o}.${u} is required`};m===null&&(a[c]=null);continue}let g=y(`${o}.${u}`,m);if(g!==null)return {error:g};a[c]=m;}let l=a.start_date,d=a.end_date;return typeof l=="string"&&typeof d=="string"&&d<l?{error:`${o}.endDate must not be before startDate`}:{item:a}}n(Rt,"itemToWire");function Pt(e,t){if(!Array.isArray(t))return {error:`${e} must be an array (send [] to clear it)`};if(t.length>pe)return {error:`${e} has ${t.length} items; the server accepts at most ${pe}`};let r=[],o=new Set;for(let i=0;i<t.length;i+=1){let a=Rt(e,i,t[i]);if("error"in a)return a;let l=a.item.ref;if(typeof l=="string"){let d=l.trim();if(o.has(d))return {error:`${e}: ref ${JSON.stringify(d)} is used twice; a ref names one item`};o.add(d);}r.push(a.item);}return {items:r}}n(Pt,"listToWire");function _e(e,t){let r=e,o={};for(let[l,d]of ve){let u=r[l];if(u!==void 0){if(u!==null){let c=bt[l](l,u);if(c!==null)return {error:c}}o[d]=u;}}let i=r.birthDate!==void 0,a=r.birthDatePrecision!==void 0;if(i!==a||i&&r.birthDate===null!=(r.birthDatePrecision===null))return {error:"birthDate and birthDatePrecision must be sent together, both set or both null"};for(let[l,d]of ge){let u=r[l];if(u===void 0)continue;let c=Pt(l,u);if("error"in c)return c;o[d]=c.items;}return Object.keys(o).length>0&&t!==void 0&&ce(t)===null?{error:"health fields need a pet Everfur reads as a dog or a cat (dog, canine, k9, puppy, cat, feline, kitten)"}:{body:o}}n(_e,"petHealthToWire");var wt=["sk_partner_","rk_partner_"];function he(e,t){if(typeof e!="string"||e.length===0)throw new s("invalid-argument","partnerSecretKey is required");if(e.startsWith("pk_"))throw new s("invalid-argument",`partnerSecretKey is a publishable key (pk_...): ${t} needs your secret key, server side only`);if(!wt.some(r=>e.startsWith(r)))throw new s("invalid-argument","partnerSecretKey must be an sk_partner_ secret key or an rk_partner_ restricted key")}n(he,"assertServerSecretKey");var St=[["name","name"],["species","species"],["breed","breed"],["ageYears","age_years"],["weightKg","weight_kg"],["partnerLabelInstructions","partner_label_instructions"]];function be(e){if(typeof e!="object"||e===null||Array.isArray(e))throw new s("invalid-argument","the pet profile must be an object");let t={};for(let[o,i]of St)e[o]!==void 0&&(t[i]=e[o]);let r=_e(e,e.species);if("error"in r)throw new s("invalid-argument",r.error);return Object.assign(t,r.body)}n(be,"partnerPetProfileBody");var kt=/^[\x21-\x7e]{1,255}$/,Ee=32*1024,Ot=/^\d{4}-\d{2}-\d{2}[Tt ]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:[Zz]|[+-]\d{2}:?\d{2})$/,Tt=3e4,xt=Object.freeze({"pet.profile.updated":{subject:"pet",schemaVersions:[1,2]},"pet.incident.reported":{subject:"pet",schemaVersions:[1]},"pet.behavior_note.added":{subject:"pet",schemaVersions:[1]},"pet.service_score.recorded":{subject:"pet",schemaVersions:[1]},"pet.deleted":{subject:"pet",schemaVersions:[1]},"member.status_changed":{subject:"member",schemaVersions:[1]},"member.deleted":{subject:"member",schemaVersions:[1]}});async function It(e,t,r){let o=r??randomUUID();if(typeof o!="string"||!kt.test(o))throw new s("invalid-argument","idempotencyKey must be 1 to 255 visible ASCII characters (no spaces, no control or non-ASCII characters)");he(e.partnerSecretKey,"sending events");let i=Nt(At(t)),a=e.fetchImpl??oe(),l=`${W(e.apiBaseUrl)}/partners/events`,d={...H({sdkVersion:V,platform:B,contractVersion:e.contractVersion??q}),accept:"application/json","content-type":"application/json","idempotency-key":o,"x-everfur-partner-secret-key":e.partnerSecretKey},u=new AbortController,c=setTimeout(()=>u.abort(),Tt),f;try{f=await a(l,{method:"POST",headers:d,body:i,signal:u.signal});}catch(Pe){return _(re(Pe))}finally{clearTimeout(c);}let y=null;try{y=await f.json();}catch{y=null;}let m=ne(f);if(!f.ok)return _(I(f.status,y,m));let g=jt(y,o);return g?k(g):_(I(502,{error:{code:"INTERNAL_ERROR"}},m))}n(It,"sendPartnerEvent");function Re(e){return typeof e=="string"&&w.includes(e)}n(Re,"isInboundType");function At(e){if(typeof e!="object"||e===null)throw new s("invalid-argument","event is required");if(!Re(e.type))throw new s("invalid-argument",`event.type must be one of ${w.join(", ")}`);let t=xt[e.type],r=e.schemaVersion??1;if(typeof r!="number"||!t.schemaVersions.includes(r))throw new s("invalid-argument",`event.schemaVersion must be one of ${t.schemaVersions.join(", ")} for ${e.type}`);let o=S(e.userRef);if(t.subject==="pet"&&e.petRef===void 0)throw new s("invalid-argument",`event.petRef is required for ${e.type}`);if(t.subject==="member"&&e.petRef!==void 0)throw new s("invalid-argument",`event.petRef is not accepted on ${e.type}`);let i=e.petRef===void 0?void 0:Dt(e.petRef);if(typeof e.data!="object"||e.data===null||Array.isArray(e.data))throw new s("invalid-argument","event.data must be an object");let a=e.type==="pet.profile.updated"&&r===2?be(e.data):e.data,l={type:e.type,schema_version:r,user_ref:o,occurred_at:Ft(e.occurredAt),data:a};return i!==void 0&&(l.pet_ref=i),l}n(At,"buildBody");function Dt(e){try{return S(e)}catch(t){throw t instanceof s?new s("invalid-argument",`event.petRef follows the user_ref rule: ${t.message}`):t}}n(Dt,"assertValidPetRef");function Ft(e){if(typeof e=="string"&&!Ot.test(e))throw new s("invalid-argument","event.occurredAt must be a Date or an ISO 8601 date-time with an explicit offset (Z or +05:30)");let t=e instanceof Date?e:typeof e=="string"?new Date(e):new Date(Number.NaN);if(Number.isNaN(t.getTime()))throw new s("invalid-argument","event.occurredAt must be a Date or an ISO 8601 date-time with an explicit offset (Z or +05:30)");return t.toISOString()}n(Ft,"occurredAtIso");function Nt(e){let t;try{t=JSON.stringify(e);}catch{throw new s("invalid-argument","event.data must be JSON-serialisable")}let r=new TextEncoder().encode(t).byteLength;if(r>Ee)throw new s("invalid-argument",`the event is ${r} bytes once serialised; Everfur accepts at most ${Ee} (32 KB)`);return t}n(Nt,"serialize");function jt(e,t){if(typeof e!="object"||e===null)return null;let r=e,o=r.id,i=r.type,a=r.schema_version,l=r.user_ref,d=r.pet_ref??null,u=r.occurred_at,c=r.received_at,f=r.status,y=r.livemode;return typeof o!="string"||o.length===0||!Re(i)||typeof a!="number"||typeof l!="string"||d!==null&&typeof d!="string"||typeof u!="string"||typeof c!="string"||typeof f!="string"||typeof y!="boolean"?null:Object.freeze({id:o,type:i,schemaVersion:a,userRef:l,petRef:d,occurredAt:u,receivedAt:c,status:f,livemode:y,idempotencyKey:t})}n(jt,"parseReceipt");
2
- export{N as DEFAULT_WEBHOOK_TOLERANCE_SECONDS,ke as EVERFUR_SIGNATURE_HEADER,ie as EVERFUR_WEBHOOK_EVENT_TYPES,it as EVERFUR_WEBHOOK_ONLY_EVENT_TYPES,p as EverfurWebhookVerificationError,w as PARTNER_INBOUND_EVENT_TYPES,Ie as constructEvent,Ae as generateTestSignatureHeader,at as isEverfurWebhookEvent,ae as isEverfurWebhookEventType,It as sendPartnerEvent};
1
+ import{timingSafeEqual,createHmac,randomUUID}from"crypto";function ok(value,warning){/* @__PURE__ */
2
+ return Object.freeze({ok:true,value:value})}function err(error){/* @__PURE__ */
3
+ return Object.freeze({ok:false,error:error})}var EverfurConfigError=class _EverfurConfigError extends Error{constructor(kind,message){super(message),this.name="EverfurConfigError",this.kind=kind,Object.setPrototypeOf(this,_EverfurConfigError.prototype)}};var EVERFUR_SIGNATURE_HEADER="Everfur-Signature",DEFAULT_WEBHOOK_TOLERANCE_SECONDS=300,SIGNATURE_SCHEME="v1",MAX_HEADER_LENGTH=4096,HEX_SHA256_LENGTH=64,DIGITS=/^[0-9]+$/,EverfurWebhookVerificationError=class _EverfurWebhookVerificationError extends Error{constructor(code){super(`Everfur webhook verification failed: ${code}`),this.name="EverfurWebhookVerificationError",this.code=code,Object.setPrototypeOf(this,_EverfurWebhookVerificationError.prototype)}};function constructEvent(payload,signatureHeader,secrets,options={}){let body=rawBodyBytes(payload),keys=requireSecrets(secrets),tolerance=options.toleranceSeconds??DEFAULT_WEBHOOK_TOLERANCE_SECONDS;if(!Number.isInteger(tolerance)||tolerance<0)throw new EverfurConfigError("invalid-argument","toleranceSeconds must be a non-negative integer");let parsed=parseSignatureHeader(signatureHeader),now=options.nowSeconds??Math.floor(Date.now()/1e3);if(Math.abs(now-parsed.timestamp)>tolerance)throw new EverfurWebhookVerificationError("timestamp_outside_tolerance");let matched=false;for(let key of keys){let expected=Buffer.from(computeSignature(key,parsed.timestamp,body),"ascii");for(let candidate of parsed.signatures){if(candidate.length!==HEX_SHA256_LENGTH)continue;let actual=Buffer.from(candidate,"utf8");actual.length===expected.length&&timingSafeEqual(expected,actual)&&(matched=true)}}if(!matched)throw new EverfurWebhookVerificationError("no_matching_signature");return parseEnvelope(body)}function generateTestSignatureHeader(params){let body=rawBodyBytes(params.payload),keys=requireSecrets(params.secrets),timestamp=params.timestamp??Math.floor(Date.now()/1e3);if(!Number.isSafeInteger(timestamp)||timestamp<0)throw new EverfurConfigError("invalid-argument","timestamp must be a non-negative integer (unix seconds)");return[`t=${timestamp}`,...keys.map(key=>`${SIGNATURE_SCHEME}=${computeSignature(key,timestamp,body)}`)].join(",")}function computeSignature(secret,timestamp,body){return createHmac("sha256",Buffer.from(secret,"utf8")).update(`${timestamp}.`,"ascii").update(body).digest("hex")}function rawBodyBytes(payload){if(typeof payload=="string")return Buffer.from(payload,"utf8");if(payload instanceof Uint8Array)return payload;throw new EverfurConfigError("invalid-argument","constructEvent needs the raw request body (a string or a Buffer), not parsed JSON: re-serialised JSON does not reproduce the signed bytes.")}function requireSecrets(secrets){let list=typeof secrets=="string"?[secrets]:Array.isArray(secrets)?secrets:[];if(list.length===0||list.some(s=>typeof s!="string"||s.length===0))throw new EverfurConfigError("invalid-argument","at least one non-empty webhook signing secret is required");return list}function parseSignatureHeader(header){if(typeof header!="string"||header.length===0||header.length>MAX_HEADER_LENGTH)throw new EverfurWebhookVerificationError("malformed_header");let timestamp=null,signatures=[];for(let item of header.split(",")){let trimmed=item.trim(),at=trimmed.indexOf("=");if(at<0)throw new EverfurWebhookVerificationError("malformed_header");let key=trimmed.slice(0,at),value=trimmed.slice(at+1);if(key==="t"){if(timestamp!==null||!DIGITS.test(value))throw new EverfurWebhookVerificationError("malformed_header");let parsed=Number(value);if(!Number.isSafeInteger(parsed))throw new EverfurWebhookVerificationError("malformed_header");timestamp=parsed}else key===SIGNATURE_SCHEME&&signatures.push(value)}if(timestamp===null||signatures.length===0)throw new EverfurWebhookVerificationError("malformed_header");return{timestamp:timestamp,signatures:signatures}}function parseEnvelope(body){let json;try{json=JSON.parse(Buffer.from(body.buffer,body.byteOffset,body.byteLength).toString("utf8"))}catch{throw new EverfurWebhookVerificationError("malformed_payload")}if(!isRecord(json))throw new EverfurWebhookVerificationError("malformed_payload");let{id:id,object:object,type:type,api_version:apiVersion,created:created,livemode:livemode,data:data}=json;if(typeof id!="string"||id.length===0||object!=="event"||typeof type!="string"||type.length===0||typeof apiVersion!="string"||typeof created!="number"||typeof livemode!="boolean"||!isRecord(data)||!isRecord(data.object))throw new EverfurWebhookVerificationError("malformed_payload");return json}function isRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}var SDK_VERSION="0.8.0",SDK_PLATFORM="react-native",DEFAULT_CONTRACT_VERSION="2026-09-19",ENV_API_BASE_URL="EVERFUR_API_BASE_URL";function configFailure(reason,message){/* @__PURE__ */
4
+ return Object.freeze({ok:false,failure:/* @__PURE__ */Object.freeze({reason:reason,message:message})})}function tryResolveApiBaseUrl(apiBaseUrl){let explicit=apiBaseUrl?.trim(),candidate=explicit&&explicit.length>0?explicit:readEnv(ENV_API_BASE_URL);return candidate?normalizeBaseUrl(candidate):configFailure("missing-api-base-url",`apiBaseUrl is required: pass config.apiBaseUrl or set ${ENV_API_BASE_URL}. The SDK never ships a hardcoded host.`)}function resolveApiBaseUrl(apiBaseUrl){let outcome=tryResolveApiBaseUrl(apiBaseUrl);if(!outcome.ok)throw new EverfurConfigError("invalid-argument",outcome.failure.message);return outcome.value}function buildBaseHeaders(cfg){return{"X-Everfur-SDK-Version":cfg.sdkVersion,"X-Everfur-SDK-Platform":cfg.platform,"X-Everfur-Contract":cfg.contractVersion}}var ABSOLUTE_URL=/^([A-Za-z][A-Za-z0-9+.-]*):\/\/([^/?#]*)/;function hostOf(authority){return authority.slice(authority.lastIndexOf("@")+1).replace(/:\d+$/,"").toLowerCase()}function isPrintableHost(host){return host.length===0||host.includes("@")?false:host.startsWith("[")&&host.endsWith("]")?true:!host.includes(":")}function canEchoOrigin(rawTrimmed,host){let schemeEnd=rawTrimmed.indexOf("://");return schemeEnd<0||rawTrimmed.slice(schemeEnd+3).includes("@")?false:isPrintableHost(host)}function safeOrigin(scheme,host){return`${scheme}://${host}`}function normalizeBaseUrl(raw){let trimmed=raw.trim(),match=ABSOLUTE_URL.exec(trimmed);if(match===null||match[2]===void 0||match[2].length===0)return configFailure("malformed-api-base-url","apiBaseUrl is not a valid absolute URL");let scheme=(match[1]??"").toLowerCase(),host=hostOf(match[2]);if(host.length===0)return configFailure("malformed-api-base-url","apiBaseUrl is not a valid absolute URL");let shown=canEchoOrigin(trimmed,host)?`: ${safeOrigin(scheme,host)}`:"";if(scheme!=="https"){if(!(scheme==="http"&&isLoopbackHost(host)))return scheme==="http"?configFailure("insecure-api-base-url",`apiBaseUrl must use https (cleartext http is only allowed for localhost)${shown}`):configFailure("unsupported-api-base-url-scheme",`apiBaseUrl must be http(s)${shown}`)}let value=trimmed.endsWith("/")?trimmed.slice(0,-1):trimmed;/* @__PURE__ */
5
+ return Object.freeze({ok:true,value:value})}function isLoopbackHost(hostname){let host=hostname.toLowerCase();return host==="localhost"||host==="127.0.0.1"||host==="[::1]"||host==="::1"}function readEnv(name){let value=globalThis.process?.env?.[name];return typeof value=="string"&&value.trim().length>0?value.trim():void 0}var CONTRACT_RETRYABILITY=/* @__PURE__ */Object.freeze([
6
+ /* @__PURE__ */Object.freeze({wireCode:"AccessDeniedException",envelope:"http_envelope",httpStatus:403,retryable:false}),
7
+ /* @__PURE__ */Object.freeze({wireCode:"AuthorizationException",envelope:"http_envelope",httpStatus:401,retryable:false}),
8
+ /* @__PURE__ */Object.freeze({wireCode:"ConflictException",envelope:"http_envelope",httpStatus:409,retryable:true}),
9
+ /* @__PURE__ */Object.freeze({wireCode:"DAILY_QUOTA_EXCEEDED",envelope:"http_envelope",httpStatus:429,retryable:true}),
10
+ /* @__PURE__ */Object.freeze({wireCode:"FILE_TOO_LARGE",envelope:"http_envelope",httpStatus:400,retryable:false}),
11
+ /* @__PURE__ */Object.freeze({wireCode:"IDEMPOTENCY_KEY_IN_FLIGHT",envelope:"http_envelope",httpStatus:409,retryable:true}),
12
+ /* @__PURE__ */Object.freeze({wireCode:"IDEMPOTENCY_KEY_REUSED_DIFFERENT_REQUEST",envelope:"http_envelope",httpStatus:409,retryable:false}),
13
+ /* @__PURE__ */Object.freeze({wireCode:"INVALID_CONTENT_TYPE",envelope:"http_envelope",httpStatus:400,retryable:false}),
14
+ /* @__PURE__ */Object.freeze({wireCode:"InternalFailureException",envelope:"http_envelope",httpStatus:500,retryable:true}),
15
+ /* @__PURE__ */Object.freeze({wireCode:"MethodNotAllowedException",envelope:"http_envelope",httpStatus:405,retryable:false}),
16
+ /* @__PURE__ */Object.freeze({wireCode:"NotImplementedException",envelope:"http_envelope",httpStatus:501,retryable:false}),
17
+ /* @__PURE__ */Object.freeze({wireCode:"PaymentRequiredException",envelope:"http_envelope",httpStatus:402,retryable:false}),
18
+ /* @__PURE__ */Object.freeze({wireCode:"ResourceNotFoundException",envelope:"http_envelope",httpStatus:404,retryable:false}),
19
+ /* @__PURE__ */Object.freeze({wireCode:"ServiceUnavailableException",envelope:"http_envelope",httpStatus:503,retryable:true}),
20
+ /* @__PURE__ */Object.freeze({wireCode:"TIER_UPGRADE_REQUIRED",envelope:"http_envelope",httpStatus:402,retryable:false}),
21
+ /* @__PURE__ */Object.freeze({wireCode:"ThrottlingException",envelope:"http_envelope",httpStatus:429,retryable:true}),
22
+ /* @__PURE__ */Object.freeze({wireCode:"ValidationException",envelope:"http_envelope",httpStatus:400,retryable:false}),
23
+ /* @__PURE__ */Object.freeze({wireCode:"accessDenied",envelope:"http_envelope",httpStatus:403,retryable:false}),
24
+ /* @__PURE__ */Object.freeze({wireCode:"access_denied",envelope:"oauth_error",httpStatus:302,retryable:false}),
25
+ /* @__PURE__ */Object.freeze({wireCode:"attachment_unreadable",envelope:"http_envelope",httpStatus:400,retryable:false}),
26
+ /* @__PURE__ */Object.freeze({wireCode:"authExpired",envelope:"http_envelope",httpStatus:401,retryable:true}),
27
+ /* @__PURE__ */Object.freeze({wireCode:"authRejected",envelope:"http_envelope",httpStatus:401,retryable:false}),
28
+ /* @__PURE__ */Object.freeze({wireCode:"consent_invalid",envelope:"http_envelope",httpStatus:422,retryable:false}),
29
+ /* @__PURE__ */Object.freeze({wireCode:"consent_required",envelope:"http_envelope",httpStatus:422,retryable:false}),
30
+ /* @__PURE__ */Object.freeze({wireCode:"consent_scope_wrong_route",envelope:"http_envelope",httpStatus:400,retryable:false}),
31
+ /* @__PURE__ */Object.freeze({wireCode:"device_cipher_unavailable",envelope:"http_envelope",httpStatus:503,retryable:true}),
32
+ /* @__PURE__ */Object.freeze({wireCode:"email_invalid",envelope:"http_envelope",httpStatus:422,retryable:false}),
33
+ /* @__PURE__ */Object.freeze({wireCode:"event_cursor_invalid",envelope:"http_envelope",httpStatus:400,retryable:false}),
34
+ /* @__PURE__ */Object.freeze({wireCode:"event_filter_invalid",envelope:"http_envelope",httpStatus:400,retryable:false}),
35
+ /* @__PURE__ */Object.freeze({wireCode:"event_payload_invalid",envelope:"http_envelope",httpStatus:400,retryable:false}),
36
+ /* @__PURE__ */Object.freeze({wireCode:"event_type_not_available",envelope:"http_envelope",httpStatus:400,retryable:false}),
37
+ /* @__PURE__ */Object.freeze({wireCode:"event_type_unknown",envelope:"http_envelope",httpStatus:400,retryable:false}),
38
+ /* @__PURE__ */Object.freeze({wireCode:"idempotency_key_invalid",envelope:"http_envelope",httpStatus:400,retryable:false}),
39
+ /* @__PURE__ */Object.freeze({wireCode:"idempotency_key_required",envelope:"http_envelope",httpStatus:400,retryable:false}),
40
+ /* @__PURE__ */Object.freeze({wireCode:"idempotency_key_reused",envelope:"http_envelope",httpStatus:409,retryable:false}),
41
+ /* @__PURE__ */Object.freeze({wireCode:"insufficientCapability",envelope:"http_envelope",httpStatus:403,retryable:false}),
42
+ /* @__PURE__ */Object.freeze({wireCode:"insufficient_scope",envelope:"http_envelope",httpStatus:403,retryable:false}),
43
+ /* @__PURE__ */Object.freeze({wireCode:"internal_error",envelope:"sse_frame",httpStatus:200,retryable:false}),
44
+ /* @__PURE__ */Object.freeze({wireCode:"invalidRequest",envelope:"http_envelope",httpStatus:400,retryable:false}),
45
+ /* @__PURE__ */Object.freeze({wireCode:"invalid_client",envelope:"oauth_error",httpStatus:401,retryable:false}),
46
+ /* @__PURE__ */Object.freeze({wireCode:"invalid_client_metadata",envelope:"oauth_error",httpStatus:400,retryable:false}),
47
+ /* @__PURE__ */Object.freeze({wireCode:"invalid_grant",envelope:"oauth_error",httpStatus:400,retryable:false}),
48
+ /* @__PURE__ */Object.freeze({wireCode:"invalid_redirect_uri",envelope:"oauth_error",httpStatus:400,retryable:false}),
49
+ /* @__PURE__ */Object.freeze({wireCode:"invalid_request",envelope:"oauth_error",httpStatus:400,retryable:false}),
50
+ /* @__PURE__ */Object.freeze({wireCode:"invalid_scope",envelope:"oauth_error",httpStatus:400,retryable:false}),
51
+ /* @__PURE__ */Object.freeze({wireCode:"invalid_target",envelope:"oauth_error",httpStatus:400,retryable:false}),
52
+ /* @__PURE__ */Object.freeze({wireCode:"mcp_connection_not_found",envelope:"http_envelope",httpStatus:404,retryable:false}),
53
+ /* @__PURE__ */Object.freeze({wireCode:"mcp_request_conflict",envelope:"http_envelope",httpStatus:409,retryable:false}),
54
+ /* @__PURE__ */Object.freeze({wireCode:"mcp_request_gone",envelope:"http_envelope",httpStatus:410,retryable:false}),
55
+ /* @__PURE__ */Object.freeze({wireCode:"mcp_request_not_found",envelope:"http_envelope",httpStatus:404,retryable:false}),
56
+ /* @__PURE__ */Object.freeze({wireCode:"not_found",envelope:"sse_frame",httpStatus:200,retryable:false}),
57
+ /* @__PURE__ */Object.freeze({wireCode:"partner_visit_link_conflict",envelope:"http_envelope",httpStatus:409,retryable:false}),
58
+ /* @__PURE__ */Object.freeze({wireCode:"partner_visit_owner_only",envelope:"http_envelope",httpStatus:403,retryable:false}),
59
+ /* @__PURE__ */Object.freeze({wireCode:"partner_visit_pet_already_mapped",envelope:"http_envelope",httpStatus:409,retryable:false}),
60
+ /* @__PURE__ */Object.freeze({wireCode:"payload_too_large",envelope:"http_envelope",httpStatus:413,retryable:false}),
61
+ /* @__PURE__ */Object.freeze({wireCode:"petRefInUse",envelope:"http_envelope",httpStatus:409,retryable:false}),
62
+ /* @__PURE__ */Object.freeze({wireCode:"pet_health_list_removals_unconfirmed",envelope:"http_envelope",httpStatus:422,retryable:false}),
63
+ /* @__PURE__ */Object.freeze({wireCode:"pet_health_species_unsupported",envelope:"http_envelope",httpStatus:422,retryable:false}),
64
+ /* @__PURE__ */Object.freeze({wireCode:"pet_not_registered",envelope:"http_envelope",httpStatus:404,retryable:false}),
65
+ /* @__PURE__ */Object.freeze({wireCode:"provider_unsupported",envelope:"http_envelope",httpStatus:422,retryable:false}),
66
+ /* @__PURE__ */Object.freeze({wireCode:"rateLimited",envelope:"http_envelope",httpStatus:429,retryable:true}),
67
+ /* @__PURE__ */Object.freeze({wireCode:"record_species_unsupported",envelope:"http_envelope",httpStatus:422,retryable:false}),
68
+ /* @__PURE__ */Object.freeze({wireCode:"record_subject_not_found",envelope:"http_envelope",httpStatus:404,retryable:false}),
69
+ /* @__PURE__ */Object.freeze({wireCode:"record_upload_invalid",envelope:"http_envelope",httpStatus:400,retryable:false}),
70
+ /* @__PURE__ */Object.freeze({wireCode:"records_consent_required",envelope:"http_envelope",httpStatus:409,retryable:false}),
71
+ /* @__PURE__ */Object.freeze({wireCode:"sandbox_only",envelope:"http_envelope",httpStatus:403,retryable:false}),
72
+ /* @__PURE__ */Object.freeze({wireCode:"session_required",envelope:"http_envelope",httpStatus:403,retryable:false}),
73
+ /* @__PURE__ */Object.freeze({wireCode:"share_limit_reached",envelope:"http_envelope",httpStatus:429,retryable:false}),
74
+ /* @__PURE__ */Object.freeze({wireCode:"slow_down",envelope:"oauth_error",httpStatus:429,retryable:true}),
75
+ /* @__PURE__ */Object.freeze({wireCode:"species_unsupported",envelope:"http_envelope",httpStatus:422,retryable:false}),
76
+ /* @__PURE__ */Object.freeze({wireCode:"tenant_filter_invalid",envelope:"http_envelope",httpStatus:400,retryable:false}),
77
+ /* @__PURE__ */Object.freeze({wireCode:"tenant_has_no_capabilities",envelope:"http_envelope",httpStatus:409,retryable:false}),
78
+ /* @__PURE__ */Object.freeze({wireCode:"tenant_resource_not_found",envelope:"http_envelope",httpStatus:404,retryable:false}),
79
+ /* @__PURE__ */Object.freeze({wireCode:"tenant_surface_not_enabled",envelope:"http_envelope",httpStatus:409,retryable:false}),
80
+ /* @__PURE__ */Object.freeze({wireCode:"timeout",envelope:"sse_frame",httpStatus:200,retryable:true}),
81
+ /* @__PURE__ */Object.freeze({wireCode:"token_invalid",envelope:"http_envelope",httpStatus:422,retryable:false}),
82
+ /* @__PURE__ */Object.freeze({wireCode:"unavailable",envelope:"sse_frame",httpStatus:200,retryable:true}),
83
+ /* @__PURE__ */Object.freeze({wireCode:"unavailable",envelope:"http_envelope",httpStatus:503,retryable:true}),
84
+ /* @__PURE__ */Object.freeze({wireCode:"unsupported_grant_type",envelope:"oauth_error",httpStatus:400,retryable:false}),
85
+ /* @__PURE__ */Object.freeze({wireCode:"unsupported_response_type",envelope:"oauth_error",httpStatus:302,retryable:false}),
86
+ /* @__PURE__ */Object.freeze({wireCode:"verify_mint_rate_limited",envelope:"http_envelope",httpStatus:429,retryable:true}),
87
+ /* @__PURE__ */Object.freeze({wireCode:"verify_mint_refused",envelope:"http_envelope",httpStatus:403,retryable:false}),
88
+ /* @__PURE__ */Object.freeze({wireCode:"verify_mint_unavailable",envelope:"http_envelope",httpStatus:503,retryable:true}),
89
+ /* @__PURE__ */Object.freeze({wireCode:"verify_user_ref_invalid",envelope:"http_envelope",httpStatus:422,retryable:false}),
90
+ /* @__PURE__ */Object.freeze({wireCode:"webhook_endpoint_update_empty",envelope:"http_envelope",httpStatus:400,retryable:false}),
91
+ /* @__PURE__ */Object.freeze({wireCode:"webhook_endpoint_update_invalid",envelope:"http_envelope",httpStatus:400,retryable:false}),
92
+ /* @__PURE__ */Object.freeze({wireCode:"webhook_url_rejected",envelope:"http_envelope",httpStatus:400,retryable:false})]);/* @__PURE__ */Object.freeze(CONTRACT_RETRYABILITY.map(row=>row.wireCode));var NORMALIZED_FOLD=/* @__PURE__ */Object.freeze({ValidationException:"validationFailed",AuthorizationException:"authRejected",PaymentRequiredException:"paymentRequired",AccessDeniedException:"accessDenied",ResourceNotFoundException:"resourceNotFound",ConflictException:"conflict",ThrottlingException:"rateLimited",InternalFailureException:"internalError",NotImplementedException:"notImplemented",ServiceUnavailableException:"serviceUnavailable",MethodNotAllowedException:"validationFailed",authExpired:"authExpired",unavailable:"serviceUnavailable",session_required:"sessionRequired",accessDenied:"accessDenied",invalidRequest:"sdkUpdateRequired",authRejected:"authRejected",rateLimited:"rateLimited",insufficientCapability:"accessDenied",event_cursor_invalid:"validationFailed",event_filter_invalid:"validationFailed",event_payload_invalid:"validationFailed",event_type_unknown:"validationFailed",idempotency_key_invalid:"validationFailed",idempotency_key_required:"validationFailed",idempotency_key_reused:"idempotencyConflict",payload_too_large:"validationFailed",webhook_url_rejected:"validationFailed",webhook_endpoint_update_empty:"validationFailed",webhook_endpoint_update_invalid:"validationFailed",event_type_not_available:"conflict",record_subject_not_found:"resourceNotFound",records_consent_required:"conflict",record_species_unsupported:"validationFailed",record_upload_invalid:"validationFailed",FILE_TOO_LARGE:"validationFailed",INVALID_CONTENT_TYPE:"validationFailed",attachment_unreadable:"validationFailed",provider_unsupported:"validationFailed",token_invalid:"validationFailed",device_cipher_unavailable:"serviceUnavailable",email_invalid:"validationFailed",consent_required:"validationFailed",consent_invalid:"validationFailed",consent_scope_wrong_route:"validationFailed",IDEMPOTENCY_KEY_IN_FLIGHT:"idempotencyInFlight",IDEMPOTENCY_KEY_REUSED_DIFFERENT_REQUEST:"idempotencyConflict",DAILY_QUOTA_EXCEEDED:"quotaExceeded",TIER_UPGRADE_REQUIRED:"paymentRequired",not_found:"conversationNotFound",timeout:"streamTimeout",internal_error:"internalError",invalid_request:"validationFailed",invalid_client:"authRejected",invalid_grant:"authRejected",unsupported_grant_type:"validationFailed",invalid_scope:"validationFailed",invalid_target:"validationFailed",invalid_redirect_uri:"validationFailed",invalid_client_metadata:"validationFailed",unsupported_response_type:"validationFailed",access_denied:"accessDenied",slow_down:"rateLimited",mcp_request_not_found:"resourceNotFound",mcp_request_gone:"resourceNotFound",mcp_connection_not_found:"resourceNotFound",mcp_request_conflict:"conflict",sandbox_only:"accessDenied",tenant_has_no_capabilities:"conflict",verify_mint_refused:"accessDenied",verify_mint_rate_limited:"rateLimited",verify_mint_unavailable:"serviceUnavailable",verify_user_ref_invalid:"validationFailed",insufficient_scope:"accessDenied",tenant_filter_invalid:"validationFailed",tenant_resource_not_found:"resourceNotFound",tenant_surface_not_enabled:"conflict",pet_health_species_unsupported:"validationFailed",pet_health_list_removals_unconfirmed:"validationFailed",petRefInUse:"conflict",share_limit_reached:"conflict",pet_not_registered:"resourceNotFound",species_unsupported:"validationFailed",partner_visit_owner_only:"accessDenied",partner_visit_link_conflict:"conflict",partner_visit_pet_already_mapped:"conflict"}),CONTRACT_ERROR_ROWS=/* @__PURE__ */Object.freeze(CONTRACT_RETRYABILITY.map(generated=>/* @__PURE__ */Object.freeze({wireCode:generated.wireCode,envelope:generated.envelope,retryable:generated.retryable,normalized:NORMALIZED_FOLD[generated.wireCode]}))),BY_KEY=new Map(CONTRACT_ERROR_ROWS.map(r=>[r.envelope+r.wireCode.toUpperCase(),r])),ENVELOPE_LOOKUP_ORDER=/* @__PURE__ */Object.freeze(["http_envelope",...[...new Set(CONTRACT_ERROR_ROWS.map(r=>r.envelope))].filter(e=>e!=="http_envelope").sort()]);function contractErrorFor(wireCode,envelope){if(typeof wireCode!="string")return;let key=wireCode.trim().toUpperCase();if(key.length!==0)for(let candidate of[envelope??"http_envelope",...ENVELOPE_LOOKUP_ORDER]){let row=BY_KEY.get(candidate+key);if(row)return row}}var CATEGORY_OF=/* @__PURE__ */Object.freeze({authExpired:"authentication",authRejected:"authentication",sessionRequired:"authentication",identitySignatureRequired:"authentication",accessDenied:"authorization",paymentRequired:"entitlement",quotaExceeded:"rateLimit",rateLimited:"rateLimit",validationFailed:"invalidRequest",sdkUpdateRequired:"invalidRequest",conversationNotFound:"notFound",petNotFound:"notFound",resourceNotFound:"notFound",conflict:"conflict",idempotencyConflict:"conflict",idempotencyInFlight:"conflict",streamTimeout:"connection",streamIncomplete:"connection",upstreamLlmTimeout:"connection",serviceUnavailable:"connection",internalError:"server",notImplemented:"server",mediaUploadFailed:"media",moderationBlocked:"policy",unknown:"unknown"});function categoryFor(code){return CATEGORY_OF[code]}function fromWire(wire){let contractRow=contractErrorFor(wire);if(contractRow)return contractRow.normalized;let upper=(wire??"").trim().toUpperCase(),canonical=upper.replace(/[^A-Z0-9]/g,"");if(canonical==="AUTHREJECTED")return"authRejected";if(upper.startsWith("AUTH"))return"authExpired";switch(canonical){case"DAILYQUOTAEXCEEDED":case"QUOTAEXCEEDED":return"quotaExceeded";case"RATELIMITED":case"TOOMANYREQUESTS":case"TELEVETRATELIMITED":return"rateLimited";case"IDEMPOTENCYKEYCONFLICT":case"IDEMPOTENCYCONFLICT":return"idempotencyConflict";case"ACCESSDENIED":case"FORBIDDEN":return"accessDenied";case"IDENTITYSIGNATUREREQUIRED":return"identitySignatureRequired";case"NOTFOUND":case"CONVERSATIONNOTFOUND":return"conversationNotFound";case"PETNOTFOUND":return"petNotFound";case"TIMEOUT":case"STREAMTIMEOUT":return"streamTimeout";case"MEDIAUPLOADFAILED":case"UNRECOGNIZEDVIDEOFORMAT":case"FILETOOSMALL":return"mediaUploadFailed";case"MODERATIONBLOCKED":return"moderationBlocked";case"UPSTREAMLLMTIMEOUT":return"upstreamLlmTimeout";case"INTERNALERROR":case"INTERNALSERVERERROR":return"internalError";case"STREAMINCOMPLETE":case"CHATSTREAMINCOMPLETE":return"streamIncomplete";case"INVALIDANALYSISTYPE":case"INVALIDUPLOADPURPOSE":return"unknown";default:return"unknown"}}function fromHttpStatus(status){return status===401?"authExpired":status===403?"accessDenied":status===404?"conversationNotFound":status===409?"idempotencyConflict":status===421?"unknown":status===429?"rateLimited":status===400||status===422?"unknown":status>=500?"internalError":"unknown"}var AUTO_RETRYABLE_CODES=/* @__PURE__ */new Set(["streamTimeout","rateLimited","internalError","upstreamLlmTimeout","streamIncomplete"]);function isAutoRetryable(code){return AUTO_RETRYABLE_CODES.has(code)}var RETRYABLE_CONTRACT_CODES=/* @__PURE__ */new Set(["serviceUnavailable","conflict","idempotencyInFlight"]);function isRetryableCode(code){return isAutoRetryable(code)||RETRYABLE_CONTRACT_CODES.has(code)}var ACCESS_DENIED_COPY="This feature isn't available on your account right now.",USER_FACING_COPY=/* @__PURE__ */Object.freeze({authExpired:"Please sign in again to continue.",authRejected:"Please sign in again to continue.",sessionRequired:"This app needs to be updated to keep using Everfur.",accessDenied:ACCESS_DENIED_COPY,paymentRequired:"This is part of a paid plan.",quotaExceeded:"You have used today's messages. This resets tomorrow.",rateLimited:"You are sending messages quickly. Try again in a few seconds.",validationFailed:"Something in that request was not right. Check the details and try again.",sdkUpdateRequired:"This app needs to be updated to keep using Everfur.",conflict:"That is already running. Wait for it to finish, then try again.",idempotencyConflict:"That message was already delivered.",idempotencyInFlight:"That is still processing. Give it a moment.",conversationNotFound:"This conversation is no longer available.",petNotFound:"We could not find that pet. Please pick a pet and try again.",resourceNotFound:"We could not find that.",streamTimeout:"The response timed out. Tap retry to try again.",mediaUploadFailed:"We could not upload that photo. Please attach it again.",moderationBlocked:"This request cannot be answered here.",upstreamLlmTimeout:"The response timed out. Tap retry to try again.",internalError:"We hit a snag on our end. Please try again.",notImplemented:"That is not available yet.",serviceUnavailable:"That service is briefly unavailable. Try again shortly.",streamIncomplete:"The connection dropped mid-answer. Tap retry to continue.",identitySignatureRequired:ACCESS_DENIED_COPY,unknown:"Something went wrong. Please try again."});function userFacingError(code){return USER_FACING_COPY[code]}function defineHidden(target,key,value){Object.defineProperty(target,key,{value:value,enumerable:false,writable:false,configurable:false})}var REASON_CODE_SHAPE=/^[a-z][a-z0-9_]{0,63}$/;function makeEverfurError(code,opts){let row=contractErrorFor(opts?.wireCode,opts?.wireEnvelope),error={code:code,category:categoryFor(code),retryable:opts?.retryable??isRetryableCode(code),displayMessage:userFacingError(code)};opts?.httpStatus!==void 0&&(error.httpStatus=opts.httpStatus),opts?.requestId&&(error.requestId=opts.requestId),typeof opts?.reasonCode=="string"&&REASON_CODE_SHAPE.test(opts.reasonCode)&&(error.reasonCode=opts.reasonCode);let wait=opts?.retryAfterSeconds;if(typeof wait=="number"&&Number.isFinite(wait)&&wait>=0&&(error.retryAfterSeconds=Math.round(wait)),row);return opts?.wireMessage&&defineHidden(error,"wireMessage",opts.wireMessage),opts?.raw!==void 0&&opts.raw!==null&&defineHidden(error,"raw",opts.raw),/* @__PURE__ */Object.freeze(error)}var REQUEST_ID_HEADER="x-request-id";function errorFromResponse(status,body,requestId){let wireCode=extractWireCode(body),code=wireCode?fromWire(wireCode):fromHttpStatus(status),wireMessage=extractWireMessage(body);return makeEverfurError(code,{httpStatus:status,...extractRetryable(body)?{retryable:true}:{},...requestId?{requestId:requestId}:{},...wireCode?{wireCode:wireCode}:{},...extractReasonCode(body)?{reasonCode:extractReasonCode(body)}:{},...extractRetryAfterSeconds(body)!==null?{retryAfterSeconds:extractRetryAfterSeconds(body)}:{},...wireMessage?{wireMessage:wireMessage}:{},...body!=null?{raw:body}:{}})}function extractRetryAfterSeconds(body){let b=body,value=b?.retry_after_seconds??b?.error?.retry_after_seconds;return typeof value=="number"&&Number.isFinite(value)&&value>=0?value:null}function networkError(cause){return makeEverfurError("internalError",{retryable:true,wireMessage:describeCause(cause)})}function requestIdOf(res){let value=res.headers.get(REQUEST_ID_HEADER);return typeof value=="string"&&value.length>0?value:null}function getGlobalFetch(){let candidate=globalThis.fetch;if(typeof candidate!="function")throw new EverfurConfigError("missing-peer-dependency","global fetch is unavailable; provide config.transport or an injected fetch implementation");return candidate}function extractReasonCode(body){let b=body,reason=b?.error?.reason_code??b?.reason_code;return typeof reason=="string"&&reason.length>0?reason:null}function extractWireCode(body){let b=body,code=b?.error?.code??b?.code;return typeof code=="string"&&code.length>0?code:null}function extractWireMessage(body){let b=body,message=b?.error?.message??b?.message;return typeof message=="string"&&message.length>0?message:null}function extractRetryable(body){let b=body;return b?.error?.retryable===true||b?.retryable===true}function describeCause(cause){return cause instanceof Error?cause.message:typeof cause=="string"?cause:"network request failed"}var EVERFUR_WEBHOOK_EVENT_TYPES=/* @__PURE__ */Object.freeze(["member.linked","member.unlinked","visit.booked","visit.cancelled","visit.completed","visit.no_show","record_request.updated","record.ready","webhook_endpoint.test","chat.follow_up_due","chat.urgency.flagged","pet.vaccination.due","visit.rescheduled","visit.reminder","visit.followup_sent","chat.reminder_due","record.activation","visit.message_received","visit.ended"]),EVERFUR_WEBHOOK_ONLY_EVENT_TYPES=/* @__PURE__ */Object.freeze(["member.linked","member.unlinked","chat.urgency.flagged","webhook_endpoint.test"]);function isEverfurWebhookEventType(type){return typeof type=="string"&&EVERFUR_WEBHOOK_EVENT_TYPES.includes(type)}function isEverfurWebhookEvent(event){return isEverfurWebhookEventType(event.type)}var PARTNER_INBOUND_EVENT_TYPES=/* @__PURE__ */Object.freeze(["pet.profile.updated","pet.incident.reported","pet.behavior_note.added","pet.service_score.recorded","pet.deleted","member.status_changed","member.deleted"]);var USER_REF_MAX=128;function assertValidUserRef(raw){let length=typeof raw=="string"?[...raw].length:0;if(typeof raw!="string"||length<1||length>USER_REF_MAX)throw new EverfurConfigError("invalid-argument",`user_ref must be 1..${USER_REF_MAX} characters`);if(raw.trim().length===0)throw new EverfurConfigError("invalid-argument","user_ref must not be blank: the server strips surrounding whitespace before validating, so a whitespace-only value arrives empty and is rejected as required.");if(raw!==raw.trim())throw new EverfurConfigError("invalid-argument","user_ref must not have leading or trailing whitespace: the server strips it, so padded and unpadded forms of the same id resolve to ONE user. Pass the exact id you want to key on.");if(raw.includes("@"))throw new EverfurConfigError("invalid-argument","user_ref must not contain '@'");if(!isPrintable(raw))throw new EverfurConfigError("invalid-argument","user_ref must be printable (no control characters)");return raw}function isPrintable(value){return!NON_PRINTABLE.test(value)}var NON_PRINTABLE=/[\p{Cc}\p{Cf}\p{Cs}\p{Co}\p{Cn}\p{Zl}\p{Zp}]|(?!\u0020)[\p{Zs}]/u;function hasLoneSurrogate(value){for(let i=0;i<value.length;i+=1){let code=value.charCodeAt(i);if(code>=55296&&code<=56319){let low=value.charCodeAt(i+1);if(!(low>=56320&&low<=57343))return true;i+=1}else if(code>=56320&&code<=57343)return true}return false}function serverLength(value){return[...value].length}var SPECIES_ALIASES=/* @__PURE__ */Object.freeze({dog:"dog",canine:"dog",k9:"dog",puppy:"dog",cat:"cat",feline:"cat",kitten:"cat"});function canonicalPetSpecies(raw){if(typeof raw!="string")return null;let key=raw.trim().toLowerCase();return Object.prototype.hasOwnProperty.call(SPECIES_ALIASES,key)?SPECIES_ALIASES[key]:null}var LIST_MAX=50,REF_MAX=128,NAME_MAX=120,SHORT_MAX=120,NOTES_MAX=2e3,FOOD_MAX=120,MICROCHIP_MAX=80,SEXES=/* @__PURE__ */new Set(["male","female","unknown"]),PRECISIONS=/* @__PURE__ */new Set(["day","month","year"]),ACTIVITY=/* @__PURE__ */new Set(["low","medium","high","athletic"]),INDOOR_OUTDOOR=/* @__PURE__ */new Set(["indoor","outdoor","both"]),SEVERITIES=/* @__PURE__ */new Set(["mild","moderate","severe"]),ISO_DATE=/^(\d{4})-(\d{2})-(\d{2})$/,SCALAR_WIRE=[["sex","sex"],["spayedNeutered","spayed_neutered"],["birthDate","birth_date"],["birthDatePrecision","birth_date_precision"],["activityLevel","activity_level"],["indoorOutdoor","indoor_outdoor"],["foodBrand","food_brand"],["foodType","food_type"],["microchipId","microchip_id"]],LIST_WIRE=[["allergies","allergies"],["medications","medications"],["supplements","supplements"],["conditions","conditions"]];/* @__PURE__ */Object.freeze([...SCALAR_WIRE,...LIST_WIRE].map(([key])=>key));function isRealDate(value){let match=ISO_DATE.exec(value);if(match===null)return false;let[year,month,day]=[Number(match[1]),Number(match[2]),Number(match[3])],date2=new Date(Date.UTC(year,month-1,day));return date2.getUTCFullYear()===year&&date2.getUTCMonth()===month-1&&date2.getUTCDate()===day}var oneOf=allowed=>(field,value)=>typeof value=="string"&&allowed.has(value)?null:`${field} must be one of ${[...allowed].join(", ")}`,boolean=(field,value)=>typeof value=="boolean"?null:`${field} must be true or false`,date=(field,value)=>typeof value=="string"&&isRealDate(value)?null:`${field} must be a real date written YYYY-MM-DD`,text=(max,opts={})=>(field,value)=>{if(typeof value!="string")return`${field} must be a string`;if(hasLoneSurrogate(value))return`${field} contains an unpaired surrogate and cannot be encoded`;let measured=opts.trimmed?value.trim():value;if(opts.required&&measured.length===0)return`${field} is required and must not be blank`;let length=serverLength(measured);return length<=max?null:`${field} is ${length} characters; the server accepts at most ${max}`},SCALAR_CHECKS={sex:oneOf(SEXES),spayedNeutered:boolean,birthDate:date,birthDatePrecision:oneOf(PRECISIONS),activityLevel:oneOf(ACTIVITY),indoorOutdoor:oneOf(INDOOR_OUTDOOR),foodBrand:text(FOOD_MAX),foodType:text(FOOD_MAX),microchipId:text(MICROCHIP_MAX)},REF_FIELD=["ref","ref",false,text(REF_MAX,{required:true,trimmed:true})],NOTES_FIELD=["notes","notes",false,text(NOTES_MAX,{trimmed:true})],MEDICATION_FIELDS=[REF_FIELD,["name","name",true,text(NAME_MAX,{required:true,trimmed:true})],["dose","dose",false,text(SHORT_MAX,{trimmed:true})],["frequency","frequency",false,text(SHORT_MAX,{trimmed:true})],["startDate","start_date",false,date],["endDate","end_date",false,date],NOTES_FIELD],ITEM_FIELDS={allergies:[REF_FIELD,["allergen","allergen",true,text(NAME_MAX,{required:true,trimmed:true})],["severity","severity",false,oneOf(SEVERITIES)],NOTES_FIELD],medications:MEDICATION_FIELDS,supplements:MEDICATION_FIELDS,conditions:[REF_FIELD,["conditionName","condition_name",true,text(NAME_MAX,{required:true,trimmed:true})],["diagnosedDate","diagnosed_date",false,date],NOTES_FIELD]};function itemToWire(list,index,raw){let at=`${list}[${index}]`;if(typeof raw!="object"||raw===null||Array.isArray(raw))return{error:`${at} must be an object`};let source=raw,item={};for(let[key,wire,isRequired,check]of ITEM_FIELDS[list]){let value=source[key];if(value==null){if(isRequired)return{error:`${at}.${key} is required`};value===null&&(item[wire]=null);continue}let bad=check(`${at}.${key}`,value);if(bad!==null)return{error:bad};item[wire]=value}let start=item.start_date,end=item.end_date;return typeof start=="string"&&typeof end=="string"&&end<start?{error:`${at}.endDate must not be before startDate`}:{item:item}}function listToWire(list,raw){if(!Array.isArray(raw))return{error:`${list} must be an array (send [] to clear it)`};if(raw.length>LIST_MAX)return{error:`${list} has ${raw.length} items; the server accepts at most ${LIST_MAX}`};let items=[],refs=/* @__PURE__ */new Set;for(let index=0;index<raw.length;index+=1){let mapped=itemToWire(list,index,raw[index]);if("error"in mapped)return mapped;let ref=mapped.item.ref;if(typeof ref=="string"){let key=ref.trim();if(refs.has(key))return{error:`${list}: ref ${JSON.stringify(key)} is used twice; a ref names one item`};refs.add(key)}items.push(mapped.item)}return{items:items}}function petHealthToWire(input,species){let source=input,body={};for(let[key,wire]of SCALAR_WIRE){let value=source[key];if(value!==void 0){if(value!==null){let bad=SCALAR_CHECKS[key](key,value);if(bad!==null)return{error:bad}}body[wire]=value}}let dateSent=source.birthDate!==void 0,precisionSent=source.birthDatePrecision!==void 0;if(dateSent!==precisionSent||dateSent&&source.birthDate===null!=(source.birthDatePrecision===null))return{error:"birthDate and birthDatePrecision must be sent together, both set or both null"};for(let[key,wire]of LIST_WIRE){let value=source[key];if(value===void 0)continue;let mapped=listToWire(key,value);if("error"in mapped)return mapped;body[wire]=mapped.items}return Object.keys(body).length>0&&species!==void 0&&canonicalPetSpecies(species)===null?{error:"health fields need a pet Everfur reads as a dog or a cat (dog, canine, k9, puppy, cat, feline, kitten)"}:{body:body}}var SECRET_KEY_PREFIXES=["sk_partner_","rk_partner_"];function assertServerSecretKey(value,action){if(typeof value!="string"||value.length===0)throw new EverfurConfigError("invalid-argument","partnerSecretKey is required");if(value.startsWith("pk_"))throw new EverfurConfigError("invalid-argument",`partnerSecretKey is a publishable key (pk_...): ${action} needs your secret key, server side only`);if(!SECRET_KEY_PREFIXES.some(prefix=>value.startsWith(prefix)))throw new EverfurConfigError("invalid-argument","partnerSecretKey must be an sk_partner_ secret key or an rk_partner_ restricted key")}var PROFILE_FIELDS=[["name","name"],["species","species"],["breed","breed"],["ageYears","age_years"],["weightKg","weight_kg"],["partnerLabelInstructions","partner_label_instructions"]];function partnerPetProfileBody(profile){if(typeof profile!="object"||profile===null||Array.isArray(profile))throw new EverfurConfigError("invalid-argument","the pet profile must be an object");let body={};for(let[key,wire]of PROFILE_FIELDS)profile[key]!==void 0&&(body[wire]=profile[key]);let health=petHealthToWire(profile,profile.species);if("error"in health)throw new EverfurConfigError("invalid-argument",health.error);return Object.assign(body,health.body)}var IDEMPOTENCY_KEY_SHAPE=/^[\x21-\x7e]{1,255}$/,MAX_BODY_BYTES=32*1024,DATE_TIME_WITH_OFFSET=/^\d{4}-\d{2}-\d{2}[Tt ]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:[Zz]|[+-]\d{2}:?\d{2})$/,SEND_TIMEOUT_MS=3e4,INBOUND_RULES=/* @__PURE__ */Object.freeze({"pet.profile.updated":{subject:"pet",schemaVersions:[1,2]},"pet.incident.reported":{subject:"pet",schemaVersions:[1]},"pet.behavior_note.added":{subject:"pet",schemaVersions:[1]},"pet.service_score.recorded":{subject:"pet",schemaVersions:[1]},"pet.deleted":{subject:"pet",schemaVersions:[1]},"member.status_changed":{subject:"member",schemaVersions:[1]},"member.deleted":{subject:"member",schemaVersions:[1]}});async function sendPartnerEvent(client,event,idempotencyKey){let key=idempotencyKey??randomUUID();if(typeof key!="string"||!IDEMPOTENCY_KEY_SHAPE.test(key))throw new EverfurConfigError("invalid-argument","idempotencyKey must be 1 to 255 visible ASCII characters (no spaces, no control or non-ASCII characters)");assertServerSecretKey(client.partnerSecretKey,"sending events");let payload=serialize(buildBody(event)),fetchImpl=client.fetchImpl??getGlobalFetch(),url=`${resolveApiBaseUrl(client.apiBaseUrl)}/partners/events`,headers={...buildBaseHeaders({sdkVersion:SDK_VERSION,platform:SDK_PLATFORM,contractVersion:client.contractVersion??DEFAULT_CONTRACT_VERSION}),accept:"application/json","content-type":"application/json","idempotency-key":key,"x-everfur-partner-secret-key":client.partnerSecretKey},controller=new AbortController,timer=setTimeout(()=>controller.abort(),SEND_TIMEOUT_MS),res;try{res=await fetchImpl(url,{method:"POST",headers:headers,body:payload,signal:controller.signal})}catch(cause){return err(networkError(cause))}finally{clearTimeout(timer)}let json=null;try{json=await res.json()}catch{json=null}let requestId=requestIdOf(res);if(!res.ok)return err(errorFromResponse(res.status,json,requestId));let receipt=parseReceipt(json,key);return receipt?ok(receipt):err(errorFromResponse(502,{error:{code:"INTERNAL_ERROR"}},requestId))}function isInboundType(value){return typeof value=="string"&&PARTNER_INBOUND_EVENT_TYPES.includes(value)}function buildBody(event){if(typeof event!="object"||event===null)throw new EverfurConfigError("invalid-argument","event is required");if(!isInboundType(event.type))throw new EverfurConfigError("invalid-argument",`event.type must be one of ${PARTNER_INBOUND_EVENT_TYPES.join(", ")}`);let rule=INBOUND_RULES[event.type],schemaVersion=event.schemaVersion??1;if(typeof schemaVersion!="number"||!rule.schemaVersions.includes(schemaVersion))throw new EverfurConfigError("invalid-argument",`event.schemaVersion must be one of ${rule.schemaVersions.join(", ")} for ${event.type}`);let userRef=assertValidUserRef(event.userRef);if(rule.subject==="pet"&&event.petRef===void 0)throw new EverfurConfigError("invalid-argument",`event.petRef is required for ${event.type}`);if(rule.subject==="member"&&event.petRef!==void 0)throw new EverfurConfigError("invalid-argument",`event.petRef is not accepted on ${event.type}`);let petRef=event.petRef===void 0?void 0:assertValidPetRef(event.petRef);if(typeof event.data!="object"||event.data===null||Array.isArray(event.data))throw new EverfurConfigError("invalid-argument","event.data must be an object");let data=event.type==="pet.profile.updated"&&schemaVersion===2?partnerPetProfileBody(event.data):event.data,body={type:event.type,schema_version:schemaVersion,user_ref:userRef,occurred_at:occurredAtIso(event.occurredAt),data:data};return petRef!==void 0&&(body.pet_ref=petRef),body}function assertValidPetRef(raw){try{return assertValidUserRef(raw)}catch(cause){throw cause instanceof EverfurConfigError?new EverfurConfigError("invalid-argument",`event.petRef follows the user_ref rule: ${cause.message}`):cause}}function occurredAtIso(value){if(typeof value=="string"&&!DATE_TIME_WITH_OFFSET.test(value))throw new EverfurConfigError("invalid-argument","event.occurredAt must be a Date or an ISO 8601 date-time with an explicit offset (Z or +05:30)");let date2=value instanceof Date?value:typeof value=="string"?new Date(value):new Date(Number.NaN);if(Number.isNaN(date2.getTime()))throw new EverfurConfigError("invalid-argument","event.occurredAt must be a Date or an ISO 8601 date-time with an explicit offset (Z or +05:30)");return date2.toISOString()}function serialize(body){let payload;try{payload=JSON.stringify(body)}catch{throw new EverfurConfigError("invalid-argument","event.data must be JSON-serialisable")}let bytes=(new TextEncoder).encode(payload).byteLength;if(bytes>MAX_BODY_BYTES)throw new EverfurConfigError("invalid-argument",`the event is ${bytes} bytes once serialised; Everfur accepts at most ${MAX_BODY_BYTES} (32 KB)`);return payload}function parseReceipt(json,idempotencyKey){if(typeof json!="object"||json===null)return null;let obj=json,id=obj.id,type=obj.type,schemaVersion=obj.schema_version,userRef=obj.user_ref,petRef=obj.pet_ref??null,occurredAt=obj.occurred_at,receivedAt=obj.received_at,status=obj.status,livemode=obj.livemode;return typeof id!="string"||id.length===0||!isInboundType(type)||typeof schemaVersion!="number"||typeof userRef!="string"||petRef!==null&&typeof petRef!="string"||typeof occurredAt!="string"||typeof receivedAt!="string"||typeof status!="string"||typeof livemode!="boolean"?null:/* @__PURE__ */Object.freeze({id:id,type:type,schemaVersion:schemaVersion,userRef:userRef,petRef:petRef,occurredAt:occurredAt,receivedAt:receivedAt,status:status,livemode:livemode,idempotencyKey:idempotencyKey})}export{DEFAULT_WEBHOOK_TOLERANCE_SECONDS,EVERFUR_SIGNATURE_HEADER,EVERFUR_WEBHOOK_EVENT_TYPES,EVERFUR_WEBHOOK_ONLY_EVENT_TYPES,EverfurWebhookVerificationError,PARTNER_INBOUND_EVENT_TYPES,constructEvent,generateTestSignatureHeader,isEverfurWebhookEvent,isEverfurWebhookEventType,sendPartnerEvent};