@everfur/sdk 0.5.1 → 0.5.2
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.
- package/CHANGELOG.md +337 -0
- package/dist/BookedScreen-BJPbXLCG.d.ts +54 -0
- package/dist/BookedScreen-Cnld-jB_.d.cts +54 -0
- package/dist/{Chat-ypo6miKm.d.cts → Chat-B43wIXCv.d.cts} +3 -3
- package/dist/{Chat-Rzplrf5M.d.ts → Chat-my5aJLz5.d.ts} +3 -3
- package/dist/{DepthViews-ClykXOJj.d.cts → DepthViews-BBTv9VAs.d.cts} +1 -1
- package/dist/{DepthViews-Cui3oonj.d.cts → DepthViews-BLK0kgza.d.cts} +1 -1
- package/dist/{DepthViews-baYLMNQ-.d.ts → DepthViews-CNqAyjne.d.ts} +1 -1
- package/dist/{DepthViews-CeTfPUBX.d.ts → DepthViews-G-7YRtOX.d.ts} +1 -1
- package/dist/animations/index.d.cts +3 -3
- package/dist/animations/index.d.ts +3 -3
- package/dist/{attachments-CwsR-bPN.d.cts → attachments-CEmT52IA.d.cts} +5 -5
- package/dist/{attachments-D3HCBmOE.d.ts → attachments-CMNWE6YT.d.ts} +2 -2
- package/dist/{attachments-CzZ7in24.d.ts → attachments-DU1djTNd.d.ts} +5 -5
- package/dist/{attachments-Nk73Lll8.d.cts → attachments-ZyjWsZdI.d.cts} +2 -2
- package/dist/{bookingCopy-SDkXaxDf.d.ts → bookingCopy-BVhEt1bj.d.ts} +38 -200
- package/dist/{bookingCopy-Dv8rKqyV.d.cts → bookingCopy-ChZR5mtd.d.cts} +38 -200
- package/dist/bookingTypes-DCs8mmBb.d.cts +188 -0
- package/dist/bookingTypes-DCs8mmBb.d.ts +188 -0
- package/dist/{callCopy-rDH9JTFo.d.cts → callCopy-CPe9mbwG.d.cts} +7 -2
- package/dist/{callCopy-rDH9JTFo.d.ts → callCopy-CPe9mbwG.d.ts} +7 -2
- package/dist/{casesRepository-BTAecTnF.d.ts → casesRepository-C5zrCcaE.d.ts} +1 -1
- package/dist/{casesRepository-aryld7fJ.d.cts → casesRepository-q2ak9AW0.d.cts} +1 -1
- package/dist/chat/index.cjs +1 -1
- package/dist/chat/index.d.cts +14 -10
- package/dist/chat/index.d.ts +14 -10
- package/dist/chat/index.js +1 -1
- package/dist/client/index.cjs +1 -1
- package/dist/client/index.d.cts +6 -6
- package/dist/client/index.d.ts +6 -6
- package/dist/client/index.js +1 -1
- package/dist/{config-X6BtwDwQ.d.ts → config-DBpKJJbg.d.ts} +1 -1
- package/dist/{config-6qS7Sohy.d.cts → config-jocy3q66.d.cts} +1 -1
- package/dist/consent/index.d.cts +5 -5
- package/dist/consent/index.d.ts +5 -5
- package/dist/{context-CkqPM4Ml.d.cts → context-BfVBRgro.d.cts} +5 -5
- package/dist/{context-7f3Nb_xE.d.ts → context-C3n9s4aG.d.ts} +5 -5
- package/dist/{copy-Bd__Pw5s.d.cts → copy-IysFx8yL.d.cts} +2 -2
- package/dist/{copy-NgKgOOET.d.ts → copy-KP91zgtW.d.ts} +2 -2
- package/dist/core/index.cjs +5 -5
- package/dist/core/index.d.cts +12 -12
- package/dist/core/index.d.ts +12 -12
- package/dist/core/index.js +5 -5
- package/dist/{depth-CYPH92jE.d.ts → depth-BsMLLrQo.d.ts} +2 -2
- package/dist/{depth-CyjaJJ6V.d.cts → depth-O9kiVUjs.d.cts} +2 -2
- package/dist/{entitlementRepository-DdeFuEKp.d.ts → entitlementRepository-CHsY2kF3.d.ts} +2 -2
- package/dist/{entitlementRepository-Dl1qRLcJ.d.cts → entitlementRepository-DIG16pso.d.cts} +2 -2
- package/dist/{identity-DjqhDm5Z.d.cts → identity-D7GKfOE7.d.cts} +1 -1
- package/dist/{identity-Dy_L7Yq4.d.ts → identity-k8nCQ_qM.d.ts} +1 -1
- package/dist/index.cjs +6 -6
- package/dist/index.d.cts +13 -13
- package/dist/index.d.ts +13 -13
- package/dist/index.js +6 -6
- package/dist/notifications/index.d.cts +2 -2
- package/dist/notifications/index.d.ts +2 -2
- package/dist/{pets-BSG2qbr_.d.cts → pets-Bod_DDiW.d.cts} +1 -1
- package/dist/{pets-D7cZutrX.d.ts → pets-C_QX8s5f.d.ts} +1 -1
- package/dist/{petsRepository-D1bnxDZg.d.cts → petsRepository-B3vr628I.d.cts} +1 -1
- package/dist/{petsRepository-DhsX3GLw.d.ts → petsRepository-DdzgINfF.d.ts} +1 -1
- package/dist/{ports-DNXyyzZF.d.cts → ports-BSm48zIC.d.cts} +16 -5
- package/dist/{ports-C0m1G1fS.d.ts → ports-DHhxhn95.d.ts} +16 -5
- package/dist/records/depth/index.d.cts +7 -7
- package/dist/records/depth/index.d.ts +7 -7
- package/dist/records/index.cjs +3 -3
- package/dist/records/index.d.cts +10 -10
- package/dist/records/index.d.ts +10 -10
- package/dist/records/index.js +3 -3
- package/dist/{requestFunnel-FvE5yLDD.d.ts → requestFunnel-CTG-wNc3.d.ts} +2 -2
- package/dist/{requestFunnel-Bqc1inM9.d.cts → requestFunnel-Dcjyh0j2.d.cts} +2 -2
- package/dist/{runtimeTypes-RN-VXTFV.d.cts → runtimeTypes-4qptUulD.d.cts} +4 -4
- package/dist/{runtimeTypes-C0yPBz89.d.ts → runtimeTypes-CmpdQaE2.d.ts} +4 -4
- package/dist/server/events/index.cjs +1 -1
- package/dist/server/events/index.d.cts +2 -2
- package/dist/server/events/index.d.ts +2 -2
- package/dist/server/events/index.js +1 -1
- package/dist/server/index.cjs +2 -2
- package/dist/server/index.d.cts +3 -3
- package/dist/server/index.d.ts +3 -3
- package/dist/server/index.js +2 -2
- package/dist/televet/booking/index.cjs +1 -1
- package/dist/televet/booking/index.d.cts +17 -9
- package/dist/televet/booking/index.d.ts +17 -9
- package/dist/televet/booking/index.js +1 -1
- package/dist/televet/call/index.cjs +1 -1
- package/dist/televet/call/index.d.cts +13 -1
- package/dist/televet/call/index.d.ts +13 -1
- package/dist/televet/call/index.js +1 -1
- package/dist/televet/index.cjs +1 -1
- package/dist/televet/index.js +1 -1
- package/dist/testing/index.d.cts +1 -1
- package/dist/testing/index.d.ts +1 -1
- package/dist/testing/rn/index.d.cts +7 -7
- package/dist/testing/rn/index.d.ts +7 -7
- package/dist/testing/web/index.d.cts +7 -7
- package/dist/testing/web/index.d.ts +7 -7
- package/dist/{timelineRows-DAB5dpjF.d.cts → timelineRows-BkLhRUDt.d.cts} +1 -1
- package/dist/{timelineRows-D4U6A8zE.d.ts → timelineRows-Dp4ZSnAo.d.ts} +1 -1
- package/dist/{uploadTransport-DKJHs3Yj.d.cts → uploadTransport-C1p8FuG8.d.cts} +5 -1
- package/dist/{uploadTransport-D0M0T4hN.d.ts → uploadTransport-bZIKBTyK.d.ts} +5 -1
- package/dist/{useRecordsDepth-B35y8bV-.d.cts → useRecordsDepth-DRNry1r9.d.cts} +1 -1
- package/dist/{useRecordsDepth--ObtMyjH.d.ts → useRecordsDepth-DnDhTaUL.d.ts} +1 -1
- package/dist/{view-D9JqNQai.d.ts → view-CwuOPIJc.d.ts} +7 -4
- package/dist/{view-B-Toym_j.d.cts → view-D4VdPKCa.d.cts} +7 -4
- package/dist/web/consent/index.d.cts +5 -5
- package/dist/web/consent/index.d.ts +5 -5
- package/dist/web/index.cjs +10 -10
- package/dist/web/index.d.cts +14 -14
- package/dist/web/index.d.ts +14 -14
- package/dist/web/index.js +10 -10
- package/dist/web/notifications/index.d.cts +3 -3
- package/dist/web/notifications/index.d.ts +3 -3
- package/dist/web/records/depth/index.d.cts +7 -7
- package/dist/web/records/depth/index.d.ts +7 -7
- package/dist/web/records/index.cjs +3 -3
- package/dist/web/records/index.d.cts +9 -9
- package/dist/web/records/index.d.ts +9 -9
- package/dist/web/records/index.js +3 -3
- package/dist/web/televet/booking/index.cjs +2 -2
- package/dist/web/televet/booking/index.d.cts +35 -50
- package/dist/web/televet/booking/index.d.ts +35 -50
- package/dist/web/televet/booking/index.js +2 -2
- package/dist/web/televet/call/index.cjs +1 -1
- package/dist/web/televet/call/index.d.cts +12 -5
- package/dist/web/televet/call/index.d.ts +12 -5
- package/dist/web/televet/call/index.js +1 -1
- package/dist/web/televet/index.cjs +4 -1
- package/dist/web/televet/index.d.cts +31 -2
- package/dist/web/televet/index.d.ts +31 -2
- package/dist/web/televet/index.js +4 -1
- package/package.json +4 -3
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { b as EverfurErrorCode } from './EverfurError-DmELDpXp.js';
|
|
2
2
|
import { E as ErrorPolicyPort } from './ErrorPolicyPort-D22LUVrK.js';
|
|
3
3
|
import { E as EverfurResult } from './EverfurResult-SGvHKsCB.js';
|
|
4
|
-
import { d as EverfurRequest, F as Frame } from './config-
|
|
5
|
-
import { A as AuthContext } from './identity-
|
|
4
|
+
import { d as EverfurRequest, F as Frame } from './config-DBpKJJbg.js';
|
|
5
|
+
import { A as AuthContext } from './identity-k8nCQ_qM.js';
|
|
6
6
|
|
|
7
7
|
/** Why the funnel stopped, or kept going. Every settle and every retry names one. */
|
|
8
8
|
type FunnelRetryReason = 'ok' | 'aborted' | 'terminal-code' | 'attempts-exhausted' | 'daily-quota-exhausted' | 'burst-throttle' | 'retryable-code' | 'server-reset-beyond-budget';
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { b as EverfurErrorCode } from './EverfurError-DmELDpXp.cjs';
|
|
2
2
|
import { E as ErrorPolicyPort } from './ErrorPolicyPort-D6CybiqJ.cjs';
|
|
3
3
|
import { E as EverfurResult } from './EverfurResult-ZtH-YV1h.cjs';
|
|
4
|
-
import { d as EverfurRequest, F as Frame } from './config-
|
|
5
|
-
import { A as AuthContext } from './identity-
|
|
4
|
+
import { d as EverfurRequest, F as Frame } from './config-jocy3q66.cjs';
|
|
5
|
+
import { A as AuthContext } from './identity-D7GKfOE7.cjs';
|
|
6
6
|
|
|
7
7
|
/** Why the funnel stopped, or kept going. Every settle and every retry names one. */
|
|
8
8
|
type FunnelRetryReason = 'ok' | 'aborted' | 'terminal-code' | 'attempts-exhausted' | 'daily-quota-exhausted' | 'burst-throttle' | 'retryable-code' | 'server-reset-beyond-budget';
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { E as EntitlementDecision, C as CapabilityName } from './resolve-D4Ywz5OS.cjs';
|
|
2
|
-
import { P as PetProfileInput, R as RegisteredPet, a as PetProfilePatch } from './petsRepository-
|
|
2
|
+
import { P as PetProfileInput, R as RegisteredPet, a as PetProfilePatch } from './petsRepository-B3vr628I.cjs';
|
|
3
3
|
import { E as EverfurResult } from './EverfurResult-ZtH-YV1h.cjs';
|
|
4
4
|
import { E as EverfurThemeInput, C as ClientBranding } from './branding-Xb_wL8N1.cjs';
|
|
5
|
-
import { A as AuthContext, T as TokenProvider } from './identity-
|
|
5
|
+
import { A as AuthContext, T as TokenProvider } from './identity-D7GKfOE7.cjs';
|
|
6
6
|
import { U as UserRef, P as PetRef, C as ConversationId } from './ids-B2GAAifq.cjs';
|
|
7
|
-
import { T as TransportPort } from './config-
|
|
7
|
+
import { T as TransportPort } from './config-jocy3q66.cjs';
|
|
8
8
|
import { I as ImageCachePort, K as KvPort } from './cacheEpoch-DknKn3S0.cjs';
|
|
9
9
|
import { E as ErrorPolicyPort } from './ErrorPolicyPort-D6CybiqJ.cjs';
|
|
10
|
-
import { U as UploadPort, l as ChatController } from './ports-
|
|
10
|
+
import { U as UploadPort, l as ChatController } from './ports-BSm48zIC.cjs';
|
|
11
11
|
import { C as CameraPort } from './CameraPort-Cv31Pz7g.cjs';
|
|
12
12
|
import { T as TelemetryPort } from './TelemetryPort-BDNr00hu.cjs';
|
|
13
13
|
import { U as UploadTransport } from './ports-BN6RHF9W.cjs';
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { E as EntitlementDecision, C as CapabilityName } from './resolve-D4Ywz5OS.js';
|
|
2
|
-
import { P as PetProfileInput, R as RegisteredPet, a as PetProfilePatch } from './petsRepository-
|
|
2
|
+
import { P as PetProfileInput, R as RegisteredPet, a as PetProfilePatch } from './petsRepository-DdzgINfF.js';
|
|
3
3
|
import { E as EverfurResult } from './EverfurResult-SGvHKsCB.js';
|
|
4
4
|
import { E as EverfurThemeInput, C as ClientBranding } from './branding-xpQ056sM.js';
|
|
5
|
-
import { A as AuthContext, T as TokenProvider } from './identity-
|
|
5
|
+
import { A as AuthContext, T as TokenProvider } from './identity-k8nCQ_qM.js';
|
|
6
6
|
import { U as UserRef, P as PetRef, C as ConversationId } from './ids-B2GAAifq.js';
|
|
7
|
-
import { T as TransportPort } from './config-
|
|
7
|
+
import { T as TransportPort } from './config-DBpKJJbg.js';
|
|
8
8
|
import { I as ImageCachePort, K as KvPort } from './cacheEpoch-DknKn3S0.js';
|
|
9
9
|
import { E as ErrorPolicyPort } from './ErrorPolicyPort-D22LUVrK.js';
|
|
10
|
-
import { U as UploadPort, l as ChatController } from './ports-
|
|
10
|
+
import { U as UploadPort, l as ChatController } from './ports-DHhxhn95.js';
|
|
11
11
|
import { C as CameraPort } from './CameraPort-Cv31Pz7g.js';
|
|
12
12
|
import { T as TelemetryPort } from './TelemetryPort-BDNr00hu.js';
|
|
13
13
|
import { U as UploadTransport } from './ports-BN6RHF9W.js';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var crypto=require('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&&crypto.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 crypto.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.5.1",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??crypto.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");
|
|
1
|
+
'use strict';var crypto=require('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&&crypto.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 crypto.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.5.2",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??crypto.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
2
|
exports.DEFAULT_WEBHOOK_TOLERANCE_SECONDS=N;exports.EVERFUR_SIGNATURE_HEADER=ke;exports.EVERFUR_WEBHOOK_EVENT_TYPES=ie;exports.EVERFUR_WEBHOOK_ONLY_EVENT_TYPES=it;exports.EverfurWebhookVerificationError=p;exports.PARTNER_INBOUND_EVENT_TYPES=w;exports.constructEvent=Ie;exports.generateTestSignatureHeader=Ae;exports.isEverfurWebhookEvent=at;exports.isEverfurWebhookEventType=ae;exports.sendPartnerEvent=It;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { b as PartnerPetProfile } from '../../pets-
|
|
1
|
+
import { b as PartnerPetProfile } from '../../pets-Bod_DDiW.cjs';
|
|
2
2
|
import { E as EverfurResult } from '../../EverfurResult-ZtH-YV1h.cjs';
|
|
3
|
-
import { j as FetchLike } from '../../config-
|
|
3
|
+
import { j as FetchLike } from '../../config-jocy3q66.cjs';
|
|
4
4
|
export { b as PetActivityLevel, c as PetAllergy, d as PetAllergySeverity, e as PetBirthDatePrecision, f as PetCondition, P as PetHealthProfileInput, g as PetIndoorOutdoor, h as PetMedication, i as PetSex } from '../../profile-CSs1wlXT.cjs';
|
|
5
5
|
import '../../EverfurError-DmELDpXp.cjs';
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { b as PartnerPetProfile } from '../../pets-
|
|
1
|
+
import { b as PartnerPetProfile } from '../../pets-C_QX8s5f.js';
|
|
2
2
|
import { E as EverfurResult } from '../../EverfurResult-SGvHKsCB.js';
|
|
3
|
-
import { j as FetchLike } from '../../config-
|
|
3
|
+
import { j as FetchLike } from '../../config-DBpKJJbg.js';
|
|
4
4
|
export { b as PetActivityLevel, c as PetAllergy, d as PetAllergySeverity, e as PetBirthDatePrecision, f as PetCondition, P as PetHealthProfileInput, g as PetIndoorOutdoor, h as PetMedication, i as PetSex } from '../../profile-CSs1wlXT.js';
|
|
5
5
|
import '../../EverfurError-DmELDpXp.js';
|
|
6
6
|
|
|
@@ -1,2 +1,2 @@
|
|
|
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.5.1",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");
|
|
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.5.2",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
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};
|