@everfur/sdk 0.1.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +703 -4
- package/README.md +63 -23
- package/consent/package.json +8 -0
- package/dist/Chat-BZZ-Py5l.d.ts +128 -0
- package/dist/Chat-Dq4fffIO.d.cts +128 -0
- package/dist/DepthViews-BG3E25MD.d.ts +16 -0
- package/dist/DepthViews-B_hIypI6.d.cts +19 -0
- package/dist/DepthViews-CL75jyRA.d.cts +16 -0
- package/dist/DepthViews-CkYri51q.d.ts +19 -0
- package/dist/ErrorPolicyPort-CNf4uQZP.d.cts +22 -0
- package/dist/ErrorPolicyPort-CwbfmxzJ.d.ts +22 -0
- package/dist/{EverfurResult-D92-uL82.d.cts → EverfurResult-DN9pL2Ab.d.cts} +11 -10
- package/dist/{EverfurResult-D92-uL82.d.ts → EverfurResult-DN9pL2Ab.d.ts} +11 -10
- package/dist/{PhotoController-BItt5M7u.d.cts → PhotoController-3l7MT9jA.d.cts} +1 -1
- package/dist/{PhotoController-D8zMTdcW.d.ts → PhotoController-vzY5bfY_.d.ts} +1 -1
- package/dist/animations/index.cjs +1 -1997
- package/dist/animations/index.d.cts +35 -35
- package/dist/animations/index.d.ts +35 -35
- package/dist/animations/index.js +1 -1972
- package/dist/attachments-BorG422I.d.cts +146 -0
- package/dist/attachments-BrUWQYNK.d.ts +257 -0
- package/dist/attachments-D_SECjr1.d.cts +257 -0
- package/dist/attachments-DpldrvIW.d.ts +146 -0
- package/dist/bookingCopy-CqtDYvCR.d.ts +732 -0
- package/dist/bookingCopy-SREvkG19.d.cts +732 -0
- package/dist/branding-CsRdeNwK.d.cts +566 -0
- package/dist/branding-CsRdeNwK.d.ts +566 -0
- package/dist/callCopy-DoQKG3-L.d.cts +40 -0
- package/dist/callCopy-DoQKG3-L.d.ts +40 -0
- package/dist/casesRepository-DwtZVsbj.d.cts +51 -0
- package/dist/casesRepository-v6QczS9N.d.ts +51 -0
- package/dist/chat/index.cjs +1 -1170
- package/dist/chat/index.d.cts +32 -53
- package/dist/chat/index.d.ts +32 -53
- package/dist/chat/index.js +1 -1167
- package/dist/client/index.cjs +9 -2315
- package/dist/client/index.d.cts +80 -16
- package/dist/client/index.d.ts +80 -16
- package/dist/client/index.js +9 -2215
- package/dist/{config-CiJ0PVBB.d.ts → config--Wu1Umhd.d.cts} +64 -26
- package/dist/{config-BSjBdxrZ.d.cts → config-C7eb_IMD.d.ts} +64 -26
- package/dist/consent/index.cjs +1 -0
- package/dist/consent/index.d.cts +33 -0
- package/dist/consent/index.d.ts +33 -0
- package/dist/consent/index.js +1 -0
- package/dist/context-CL3lyuy1.d.cts +159 -0
- package/dist/context-CahAEha8.d.ts +159 -0
- package/dist/copy-DdVFDL01.d.ts +198 -0
- package/dist/copy-UeUJVk8X.d.cts +198 -0
- package/dist/core/index.cjs +13 -3178
- package/dist/core/index.d.cts +164 -29
- package/dist/core/index.d.ts +164 -29
- package/dist/core/index.js +13 -3166
- package/dist/depth-D5HwcvKC.d.cts +533 -0
- package/dist/depth-DvPwPuT_.d.ts +533 -0
- package/dist/entitlementRepository-B7egEdW6.d.ts +43 -0
- package/dist/entitlementRepository-BpJ7tiwl.d.cts +43 -0
- package/dist/{identity-Brl-lDd6.d.cts → identity-C2-08BZW.d.cts} +20 -7
- package/dist/{identity-DK9zORrG.d.ts → identity-CEi9GRFZ.d.ts} +20 -7
- package/dist/{ids-CJ1S6adf.d.cts → ids-B2GAAifq.d.cts} +1 -1
- package/dist/{ids-CJ1S6adf.d.ts → ids-B2GAAifq.d.ts} +1 -1
- package/dist/index.cjs +12 -4494
- package/dist/index.d.cts +30 -121
- package/dist/index.d.ts +30 -121
- package/dist/index.js +12 -4470
- package/dist/models-B-Uh2LTf.d.ts +214 -0
- package/dist/models-D2EUxPZY.d.cts +214 -0
- package/dist/notifications/index.cjs +2 -0
- package/dist/notifications/index.d.cts +17 -0
- package/dist/notifications/index.d.ts +17 -0
- package/dist/notifications/index.js +2 -0
- package/dist/optionalModule-DbJmsq5f.d.cts +21 -0
- package/dist/optionalModule-DbJmsq5f.d.ts +21 -0
- package/dist/pets-DJv2sj2H.d.ts +92 -0
- package/dist/pets-JVCXgRgR.d.cts +92 -0
- package/dist/petsRepository-B_gKbAzJ.d.cts +142 -0
- package/dist/petsRepository-Bk6GDwLs.d.ts +142 -0
- package/dist/photo/index.cjs +1 -2189
- package/dist/photo/index.d.cts +6 -6
- package/dist/photo/index.d.ts +6 -6
- package/dist/photo/index.js +1 -2186
- package/dist/ports-BN6RHF9W.d.cts +48 -0
- package/dist/ports-BN6RHF9W.d.ts +48 -0
- package/dist/ports-BY2ph0_y.d.cts +376 -0
- package/dist/ports-D7YW8qz9.d.ts +376 -0
- package/dist/profile-CSs1wlXT.d.cts +93 -0
- package/dist/profile-CSs1wlXT.d.ts +93 -0
- package/dist/records/depth/index.cjs +2 -0
- package/dist/records/depth/index.d.cts +13 -0
- package/dist/records/depth/index.d.ts +13 -0
- package/dist/records/depth/index.js +2 -0
- package/dist/records/index.cjs +3 -2839
- package/dist/records/index.d.cts +137 -203
- package/dist/records/index.d.ts +137 -203
- package/dist/records/index.js +3 -2833
- package/dist/requestFunnel-BjDpqqvm.d.cts +110 -0
- package/dist/requestFunnel-DFMGcluw.d.ts +110 -0
- package/dist/{resolve-Dq_4_agU.d.ts → resolve-D4Ywz5OS.d.cts} +10 -4
- package/dist/{resolve-Dq_4_agU.d.cts → resolve-D4Ywz5OS.d.ts} +10 -4
- package/dist/{runtime-Bvr8yqXm.d.cts → runtimeTypes-gZEJu-da.d.cts} +104 -132
- package/dist/{runtime-BIYzf9cK.d.ts → runtimeTypes-w5KqBMcs.d.ts} +104 -132
- package/dist/server/events/index.cjs +2 -0
- package/dist/server/events/index.d.cts +550 -0
- package/dist/server/events/index.d.ts +550 -0
- package/dist/server/events/index.js +2 -0
- package/dist/server/index.cjs +2 -533
- package/dist/server/index.d.cts +73 -18
- package/dist/server/index.d.ts +73 -18
- package/dist/server/index.js +2 -530
- package/dist/species-BXAIMh7I.d.cts +9 -0
- package/dist/species-BXAIMh7I.d.ts +9 -0
- package/dist/televet/booking/index.cjs +1 -0
- package/dist/televet/booking/index.d.cts +294 -0
- package/dist/televet/booking/index.d.ts +294 -0
- package/dist/televet/booking/index.js +1 -0
- package/dist/televet/call/index.cjs +1 -0
- package/dist/televet/call/index.d.cts +141 -0
- package/dist/televet/call/index.d.ts +141 -0
- package/dist/televet/call/index.js +1 -0
- package/dist/televet/index.cjs +1 -0
- package/dist/televet/index.d.cts +142 -0
- package/dist/televet/index.d.ts +142 -0
- package/dist/televet/index.js +1 -0
- package/dist/testing/index.cjs +5 -823
- package/dist/testing/index.d.cts +18 -4
- package/dist/testing/index.d.ts +18 -4
- package/dist/testing/index.js +5 -820
- package/dist/testing/rn/index.cjs +1 -449
- package/dist/testing/rn/index.d.cts +18 -29
- package/dist/testing/rn/index.d.ts +18 -29
- package/dist/testing/rn/index.js +1 -444
- package/dist/testing/web/index.cjs +1 -0
- package/dist/testing/web/index.d.cts +132 -0
- package/dist/testing/web/index.d.ts +132 -0
- package/dist/testing/web/index.js +1 -0
- package/dist/timelineRows-C15jxFFH.d.ts +19 -0
- package/dist/timelineRows-odO8g9r2.d.cts +19 -0
- package/dist/typeStyle-CKqVYD6L.d.cts +111 -0
- package/dist/typeStyle-DmoyacDG.d.ts +111 -0
- package/dist/uploadTransport-D0M0T4hN.d.ts +38 -0
- package/dist/uploadTransport-DKJHs3Yj.d.cts +38 -0
- package/dist/useRecordsDepth-C6rjEaLn.d.cts +237 -0
- package/dist/useRecordsDepth-crhBllQK.d.ts +237 -0
- package/dist/useVetVisit-Bc84hWUU.d.cts +187 -0
- package/dist/useVetVisit-CjmMa896.d.ts +187 -0
- package/dist/video/index.cjs +1 -1941
- package/dist/video/index.d.cts +4 -4
- package/dist/video/index.d.ts +4 -4
- package/dist/video/index.js +1 -1938
- package/dist/view-Bxwxp4xD.d.ts +310 -0
- package/dist/view-DyitEO0m.d.cts +310 -0
- package/dist/visitIntent-D7_yVp1I.d.cts +8 -0
- package/dist/visitIntent-D7_yVp1I.d.ts +8 -0
- package/dist/web/consent/index.cjs +1 -0
- package/dist/web/consent/index.d.cts +34 -0
- package/dist/web/consent/index.d.ts +34 -0
- package/dist/web/consent/index.js +1 -0
- package/dist/web/index.cjs +14 -0
- package/dist/web/index.d.cts +218 -0
- package/dist/web/index.d.ts +218 -0
- package/dist/web/index.js +14 -0
- package/dist/web/notifications/index.cjs +2 -0
- package/dist/web/notifications/index.d.cts +213 -0
- package/dist/web/notifications/index.d.ts +213 -0
- package/dist/web/notifications/index.js +2 -0
- package/dist/web/records/depth/index.cjs +2 -0
- package/dist/web/records/depth/index.d.cts +12 -0
- package/dist/web/records/depth/index.d.ts +12 -0
- package/dist/web/records/depth/index.js +2 -0
- package/dist/web/records/index.cjs +4 -0
- package/dist/web/records/index.d.cts +285 -0
- package/dist/web/records/index.d.ts +285 -0
- package/dist/web/records/index.js +4 -0
- package/dist/web/televet/booking/index.cjs +1 -0
- package/dist/web/televet/booking/index.d.cts +349 -0
- package/dist/web/televet/booking/index.d.ts +349 -0
- package/dist/web/televet/booking/index.js +1 -0
- package/dist/web/televet/call/index.cjs +1 -0
- package/dist/web/televet/call/index.d.cts +142 -0
- package/dist/web/televet/call/index.d.ts +142 -0
- package/dist/web/televet/call/index.js +1 -0
- package/dist/web/televet/index.cjs +1 -0
- package/dist/web/televet/index.d.cts +136 -0
- package/dist/web/televet/index.d.ts +136 -0
- package/dist/web/televet/index.js +1 -0
- package/notifications/package.json +8 -0
- package/package.json +266 -10
- package/records/depth/package.json +8 -0
- package/server/events/device-blocked.cjs +15 -0
- package/server/events/package.json +9 -0
- package/televet/booking/package.json +8 -0
- package/televet/call/package.json +8 -0
- package/televet/package.json +8 -0
- package/testing/web/native-blocked.cjs +12 -0
- package/testing/web/package.json +8 -0
- package/web/consent/native-blocked.cjs +12 -0
- package/web/consent/package.json +8 -0
- package/web/native-blocked.cjs +12 -0
- package/web/notifications/native-blocked.cjs +12 -0
- package/web/notifications/package.json +8 -0
- package/web/package.json +8 -0
- package/web/records/depth/native-blocked.cjs +12 -0
- package/web/records/depth/package.json +8 -0
- package/web/records/native-blocked.cjs +12 -0
- package/web/records/package.json +8 -0
- package/web/televet/booking/native-blocked.cjs +12 -0
- package/web/televet/booking/package.json +8 -0
- package/web/televet/call/native-blocked.cjs +12 -0
- package/web/televet/call/package.json +8 -0
- package/web/televet/native-blocked.cjs +12 -0
- package/web/televet/package.json +8 -0
- package/dist/ChatController-CKdBvPj2.d.ts +0 -146
- package/dist/ChatController-CpUMvvZf.d.cts +0 -146
- package/dist/FilePort-BabWrv7I.d.cts +0 -22
- package/dist/FilePort-BabWrv7I.d.ts +0 -22
- package/dist/petsRepository-BEGb97M9.d.cts +0 -326
- package/dist/petsRepository-Bu18r2kK.d.ts +0 -326
- package/dist/requestFunnel-DuUH-kAe.d.cts +0 -28
- package/dist/requestFunnel-dio5OmR9.d.ts +0 -28
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { ReactNode, CSSProperties } from 'react';
|
|
2
|
+
import { T as TelemetryPort } from '../../../TelemetryPort-BDNr00hu.js';
|
|
3
|
+
export { V as VET_CALL_CONSULT_MINUTES, a as VET_CALL_COPY, b as VetCallPhase, i as isSafeRoomUrl, c as isUsableRoomCredential } from '../../../callCopy-DoQKG3-L.js';
|
|
4
|
+
|
|
5
|
+
/** The Daily events the call surface subscribes to. */
|
|
6
|
+
type VetCallEvent = 'joined-meeting' | 'participant-joined' | 'participant-updated' | 'participant-left' | 'left-meeting' | 'error';
|
|
7
|
+
type VetCallHandler = (payload?: unknown) => void;
|
|
8
|
+
/** One participant in the room, narrowed to what the call surface reads. */
|
|
9
|
+
interface VetCallParticipant {
|
|
10
|
+
readonly local?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The Daily Prebuilt frame, narrowed to the six members the call surface calls. Narrow on purpose: the SDK
|
|
14
|
+
* never asks for host powers. `is_owner` is the CLINICIAN's and the server decides it when it mints the
|
|
15
|
+
* token; it starts recording and grants admit/eject, and nothing here requests either.
|
|
16
|
+
*/
|
|
17
|
+
interface VetCallFrame {
|
|
18
|
+
join(options: {
|
|
19
|
+
readonly url: string;
|
|
20
|
+
readonly token: string;
|
|
21
|
+
readonly userName?: string | undefined;
|
|
22
|
+
}): Promise<unknown>;
|
|
23
|
+
leave(): Promise<unknown>;
|
|
24
|
+
destroy(): Promise<unknown>;
|
|
25
|
+
participants(): Record<string, VetCallParticipant>;
|
|
26
|
+
on(event: VetCallEvent, handler: VetCallHandler): unknown;
|
|
27
|
+
off(event: VetCallEvent, handler: VetCallHandler): unknown;
|
|
28
|
+
}
|
|
29
|
+
/** The shape of `@daily-co/daily-js` this package uses, and nothing else. */
|
|
30
|
+
interface EverfurDailyModule {
|
|
31
|
+
createFrame(container: HTMLElement, options?: Record<string, unknown>): VetCallFrame;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The thunk a partner registers. Typically `() => import('@daily-co/daily-js')`. A synchronous return is
|
|
35
|
+
* accepted too, for a partner that already holds the module.
|
|
36
|
+
*/
|
|
37
|
+
type EverfurDailyLoader = () => unknown;
|
|
38
|
+
/** The settled outcome of a guarded load. Mirrors `OptionalModule` from the core ports, and never throws. */
|
|
39
|
+
type EverfurDailyLoad = {
|
|
40
|
+
readonly available: true;
|
|
41
|
+
readonly module: EverfurDailyModule;
|
|
42
|
+
} | {
|
|
43
|
+
readonly available: false;
|
|
44
|
+
readonly module: null;
|
|
45
|
+
readonly reason: string;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* DEVELOPER-FACING, never rendered to a member. It is handed to `onUnavailable` and written to
|
|
49
|
+
* `console.warn` once, so a partner who mounts the call surface without the peer reads what to do instead of
|
|
50
|
+
* watching a blank box. End-user copy is never authored in this repository.
|
|
51
|
+
*/
|
|
52
|
+
declare const EVERFUR_DAILY_SETUP: string;
|
|
53
|
+
/** A present-but-wrong-shape module (a version whose surface drifted) is treated as unavailable, not trusted. */
|
|
54
|
+
declare function isEverfurDailyModule(candidate: unknown): candidate is EverfurDailyModule;
|
|
55
|
+
/**
|
|
56
|
+
* Register the Daily module for the in-page vet call. Call it ONCE, in your app entry, before any Everfur
|
|
57
|
+
* call surface mounts:
|
|
58
|
+
*
|
|
59
|
+
* ```ts
|
|
60
|
+
* import { registerEverfurDaily } from '@everfur/sdk/web/televet/call';
|
|
61
|
+
* registerEverfurDaily(() => import('@daily-co/daily-js'));
|
|
62
|
+
* ```
|
|
63
|
+
*
|
|
64
|
+
* Passing `null` unregisters it, which is what a test does between cases. Registering clears the memo, so a
|
|
65
|
+
* later registration always wins over an earlier failed load.
|
|
66
|
+
*/
|
|
67
|
+
declare function registerEverfurDaily(next: EverfurDailyLoader | null): void;
|
|
68
|
+
/**
|
|
69
|
+
* The guarded load: a missing loader, a throwing or rejecting loader and a wrong-shape module all settle to
|
|
70
|
+
* `{ available: false }`. NEVER throws, never rejects, and never returns a partially usable module.
|
|
71
|
+
*
|
|
72
|
+
* Memoized on the PROMISE, not on its result, so two call surfaces mounting in the same tick share one
|
|
73
|
+
* network fetch of the chunk rather than racing two.
|
|
74
|
+
*/
|
|
75
|
+
declare function loadEverfurDaily(): Promise<EverfurDailyLoad>;
|
|
76
|
+
|
|
77
|
+
/** Why the call surface refused to render. Both values are DEVELOPER-facing, never shown to a member. */
|
|
78
|
+
type VetCallUnavailableReason = 'dailyMissing' | 'roomUnusable';
|
|
79
|
+
interface EverfurVetCallProps {
|
|
80
|
+
/** The `room_url` the server minted for this consult. Must be https; anything else is refused. */
|
|
81
|
+
readonly roomUrl: string;
|
|
82
|
+
/** The short-lived, per-participant join token. NEVER rendered, NEVER logged, NEVER a telemetry prop. */
|
|
83
|
+
readonly token: string;
|
|
84
|
+
/** Called once the member has left, so the host can navigate away. Fires exactly once per mounted call. */
|
|
85
|
+
readonly onLeave: () => void;
|
|
86
|
+
/** Shown in the lobby while the clinician has not joined. Null in production today; never invented. */
|
|
87
|
+
readonly clinicianName?: string | null | undefined;
|
|
88
|
+
/** The pet's display name for the lobby's prep line; absent, the pet-free form is used. */
|
|
89
|
+
readonly petName?: string | null | undefined;
|
|
90
|
+
/** Rendered as the participant name inside the call. Absent, Daily uses its own default. */
|
|
91
|
+
readonly displayName?: string | undefined;
|
|
92
|
+
/**
|
|
93
|
+
* Host/test seam: the Daily module, instead of the one `registerEverfurDaily` registered. A partner with
|
|
94
|
+
* its own module resolution passes it here and calls no register function at all.
|
|
95
|
+
*/
|
|
96
|
+
readonly daily?: EverfurDailyModule | undefined;
|
|
97
|
+
/** Your analytics sink for the two call events. Defaults to a no-op; never receives a credential. */
|
|
98
|
+
readonly telemetry?: TelemetryPort | undefined;
|
|
99
|
+
/**
|
|
100
|
+
* Called instead of rendering when the call cannot run, with a developer-facing explanation.
|
|
101
|
+
* `dailyMissing` means `@daily-co/daily-js` is not registered or is not Daily; `roomUnusable` means the
|
|
102
|
+
* credential failed its floor (not an https room, or an empty token).
|
|
103
|
+
*/
|
|
104
|
+
readonly onUnavailable?: ((reason: VetCallUnavailableReason, detail: string) => void) | undefined;
|
|
105
|
+
/**
|
|
106
|
+
* What to draw when the call cannot run. THE SDK DRAWS NOTHING BY DEFAULT, and that is deliberate: there is
|
|
107
|
+
* no owner-approved member-facing sentence for "this page was built without the video module", and this
|
|
108
|
+
* package does not author user-facing copy. The consumer app's own answer to a missing module is to fall
|
|
109
|
+
* back to the browser, so the intended wiring here is the same:
|
|
110
|
+
*
|
|
111
|
+
* ```tsx
|
|
112
|
+
* <EverfurVetCall ... renderUnavailable={() => <VetVisitButton visitRef={visitRef} intent="join" />} />
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
readonly renderUnavailable?: ((reason: VetCallUnavailableReason, detail: string) => ReactNode) | undefined;
|
|
116
|
+
readonly style?: CSSProperties | undefined;
|
|
117
|
+
/** A class the host may hang its own layout rules on; the SDK sets no classes of its own. */
|
|
118
|
+
readonly className?: string | undefined;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* The member's vet call, in the partner's page.
|
|
122
|
+
*
|
|
123
|
+
* Mount it with a room and a token and it joins; unmount it and the camera and the microphone are released.
|
|
124
|
+
*/
|
|
125
|
+
declare function EverfurVetCall(props: EverfurVetCallProps): ReactNode;
|
|
126
|
+
|
|
127
|
+
interface EverfurVetCallLobbyProps {
|
|
128
|
+
/** The clinician's display name, when the host has one. Null renders the generalised sentence. */
|
|
129
|
+
readonly clinicianName?: string | null | undefined;
|
|
130
|
+
/** The pet's display name, when the host has one. Null renders the generalised prep line. */
|
|
131
|
+
readonly petName?: string | null | undefined;
|
|
132
|
+
/** The consult length the duration line states. Defaults to Everfur's own consult length. */
|
|
133
|
+
readonly consultMinutes?: number | undefined;
|
|
134
|
+
/** The way out of the wait. */
|
|
135
|
+
readonly onLeave: () => void;
|
|
136
|
+
readonly style?: CSSProperties | undefined;
|
|
137
|
+
readonly className?: string | undefined;
|
|
138
|
+
}
|
|
139
|
+
/** The wait, with a way out. */
|
|
140
|
+
declare function EverfurVetCallLobby(props: EverfurVetCallLobbyProps): ReactNode;
|
|
141
|
+
|
|
142
|
+
export { EVERFUR_DAILY_SETUP, type EverfurDailyLoad, type EverfurDailyLoader, type EverfurDailyModule, EverfurVetCall, EverfurVetCallLobby, type EverfurVetCallLobbyProps, type EverfurVetCallProps, TelemetryPort, type VetCallEvent, type VetCallFrame, type VetCallHandler, type VetCallParticipant, type VetCallUnavailableReason, isEverfurDailyModule, loadEverfurDaily, registerEverfurDaily };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {createContext,useMemo,useState,useRef,useCallback,useEffect,useContext}from'react';import {jsxs,jsx,Fragment}from'react/jsx-runtime';var Ve=Object.defineProperty;var n=(e,r)=>Ve(e,"name",{value:r,configurable:true});var ae=Object.freeze({track(){},trackExpectedFailure(){}});function le(e){try{return new URL(e.trim()).protocol==="https:"}catch{return false}}n(le,"isSafeRoomUrl");function I(e,r){return le(e)&&r.trim().length>0}n(I,"isUsableRoomCredential");function ie(e){let r=globalThis.console;try{r?.error?.("[everfur] A host callback threw; the SDK ignored it.",e);}catch{}}n(ie,"reportHostFailure");function Ne(e){return (typeof e=="object"||typeof e=="function")&&e!==null&&typeof e.then=="function"}n(Ne,"isThenable");function A(e,...r){if(typeof e=="function")try{let o=e(...r);return Ne(o)&&Promise.resolve(o).then(void 0,ie),o}catch(o){ie(o);return}}n(A,"callHost");var se=new WeakMap;function Ie(e){if(typeof e!="function")return;let r=se.get(e);if(r!==void 0)return r;let o=n((...t)=>{A(e,...t);},"guarded");return se.set(e,o),o}n(Ie,"guardHost");function de(e,r){let o=null;for(let t of r){let a=e[t];typeof a=="function"&&(o??={...e},o[t]=Ie(a));}return o??e}n(de,"guardHostProps");var O=10,c=Object.freeze({muteCta:"Mute",unmuteCta:"Unmute",cameraOffCta:"Camera off",cameraOnCta:"Camera on",leaveCta:"Leave",lobbyTitleNoName:"Your vet is joining",lobbySubtitle:"Usually under a minute",lobbyPrepLabel:"WHILE YOU WAIT",lobbyPrepNoPet:"Have your pet nearby and somewhere well lit.",lobbyTitle:n(e=>{let r=e?.trim()??"";return r.length>0?`${r} is joining`:c.lobbyTitleNoName},"lobbyTitle"),lobbyPrep:n(e=>{let r=e?.trim()??"";return r.length>0?`Have ${r} nearby and somewhere well lit.`:c.lobbyPrepNoPet},"lobbyPrep"),lobbyDuration:n(e=>`${e} MINUTE VISIT`,"lobbyDuration"),joinFailedReason:"That did not open. Try again."});function j(e){if(e!==null&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let r of Object.keys(e))j(e[r]);}return e}n(j,"deepFreeze");var Oe=Object.freeze({content:0,heading:2,control:1.8,compact:1.5,badge:1.3}),ce={xs:4,sm:8,md:12,lg:16,xl:24,xxl:32},fe={tile:5,xs:6,sm:10,md:14,lg:20,xl:28,pill:500},ue={nano:8,small:9,micro:10,tiny:11,caption:12,bodyTight:13,body:14,subtitle:16,heading:18,verdict:24},ze={tight:1.15,snug:1.3,normal:1.4,relaxed:1.55},He={regular:"400",medium:"500",bold:"700"},je={eyebrow:1,monoWide:.9,headerBrand:-0.42,tight:-0.35},We=0,B="System",D="monospace",Ge=["content","heading","control","compact","badge"];function $e(e){let r={};for(let o of Ge)r[o]=e;return r}n($e,"authoredTierSizes");function ye(){return {family:B,mono:D,fontUrl:null,families:{regular:B,medium:B,bold:B,mono:D,monoMedium:D,monoBold:D},namedFaces:{regular:false,medium:false,bold:false,mono:false,monoMedium:false,monoBold:false},fontUrls:{},size:ue,tierSizes:$e(ue),lineHeight:ze,weight:He,letterSpacing:je,scale:1,maxScale:We,scaleCaps:Oe}}n(ye,"baseType");var me={},z=Object.freeze({standard:Object.freeze([.2,0,0,1]),emphasized:Object.freeze([.2,.8,.2,1]),exit:Object.freeze([.4,0,1,1])});function H(e){return `cubic-bezier(${e.join(", ")})`}n(H,"cssCubicBezier");var pe={duration:{instant:80,fast:140,normal:220,slow:320},spring:{gentle:{damping:18,stiffness:200}},easing:{standard:H(z.standard),emphasized:H(z.emphasized),exit:H(z.exit)},reducedMotion:false},Ye={brand:"#10462E",brandSoft:"rgba(16,70,46,0.10)",brandSofter:"rgba(16,70,46,0.15)",brandBorder:"rgba(16,70,46,0.18)",borderHairlineGreen:"rgba(16,70,46,0.25)",brandBorderStrong:"rgba(16,70,46,0.55)",brandInk:"#10462E",linkInk:"#10462E",surface:"#FFFFFF",surfaceCream:"#FDFBF8",surfaceSubtle:"#EFE9E3",background:"#FFFFFF",borderRingCream:"#D8D2C8",chatGround:"#FFFFFF",composerFill:"#FDFBF8",composerBorder:"rgba(16,70,46,0.75)",shadow:"#0B3421",text:{primary:"#111111",secondary:"#0E462E",muted:"#6E6660",placeholder:"rgba(61,61,61,0.75)",onBrand:"#FFFFFF",metaCool:"#3D3D3D",timestamp:"rgba(61,61,61,0.75)"},primary:"#10462E",onPrimary:"#FFFFFF",accent:"#10462E",onAccent:"#FFFFFF",accentEdge:"#07C168",success:"#07C168",danger:"#B91C1C",errorRed:"#FF1B00",warningStrong:"#A45610",cautionAccent:"#D9821D",riskConcern:"#EFA700",sentiment:{up:"#07C168",neutral:"#FBC558",down:"#FF1B00"},badgeBgPositive:"rgba(7,193,104,0.12)",badgeBgCaution:"rgba(217,130,29,0.14)",badgeBgCritical:"rgba(185,28,28,0.12)",badgeBgNeutral:"rgba(110,102,96,0.12)",bubbleUser:"#10462E",bubbleAssistant:"#FFFFFF",skeleton:"#EFE9E3",scanButtonPink:"#FFC3BC",checkupCardLowRiskBg:"rgba(7,193,104,0.10)",checkupCardConcernBg:"rgba(239,167,0,0.10)"},ge=j({brightness:"light",highContrast:false,meta:{displayName:"Everfur",logoUrl:null,placeholder:null,hidePoweredBy:false},color:Ye,space:ce,radius:fe,type:ye(),motion:pe,slots:me}),Ke={brand:"#6BD39A",brandSoft:"rgba(107,211,154,0.12)",brandSofter:"rgba(107,211,154,0.18)",brandBorder:"rgba(107,211,154,0.22)",borderHairlineGreen:"rgba(107,211,154,0.28)",brandBorderStrong:"rgba(107,211,154,0.55)",brandInk:"#6BD39A",linkInk:"#6BD39A",surface:"#1C1F23",surfaceCream:"#23272C",surfaceSubtle:"#23272C",background:"#15171A",borderRingCream:"#3A3F45",chatGround:"#1C1F23",composerFill:"#23272C",composerBorder:"rgba(107,211,154,0.75)",shadow:"#000000",text:{primary:"#F5F3F0",secondary:"#A9E4C4",muted:"#9A938C",placeholder:"rgba(255,255,255,0.55)",onBrand:"#0E1F17",metaCool:"#C9C9C9",timestamp:"rgba(245,243,240,0.7)"},primary:"#6BD39A",onPrimary:"#0E1F17",accent:"#6BD39A",onAccent:"#0E1F17",accentEdge:"#34D888",success:"#07C168",danger:"#F87171",errorRed:"#FF6B5B",warningStrong:"#F0A35E",cautionAccent:"#D9821D",riskConcern:"#EFA700",sentiment:{up:"#07C168",neutral:"#FBC558",down:"#FF1B00"},badgeBgPositive:"rgba(7,193,104,0.18)",badgeBgCaution:"rgba(217,130,29,0.20)",badgeBgCritical:"rgba(185,28,28,0.22)",badgeBgNeutral:"rgba(255,255,255,0.10)",bubbleUser:"#6BD39A",bubbleAssistant:"#1C1F23",skeleton:"#23272C",scanButtonPink:"#FFC3BC",checkupCardLowRiskBg:"rgba(7,193,104,0.16)",checkupCardConcernBg:"rgba(239,167,0,0.16)"};j({brightness:"dark",highContrast:false,meta:{displayName:"Everfur",logoUrl:null,placeholder:null,hidePoweredBy:false},color:Ke,space:ce,radius:fe,type:ye(),motion:pe,slots:me});var be=Symbol.for("@everfur/sdk#EverfurThemeContext@v1"),ve=globalThis,W=ve[be]??(ve[be]=createContext(ge));W.displayName??="EverfurThemeContext";function F(){return useContext(W)}n(F,"useEverfurTheme");var Ee=Object.freeze({regular:"regular",medium:"medium",bold:"bold",mono:"regular",monoMedium:"medium",monoBold:"bold"});var Te='system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',Ze="System";function Je(e){let r=e.trim();return r.length===0||r===Ze?Te:`${Ce(r)}, ${Te}`}n(Je,"cssFontFamily");function Qe(e){let r=e.trim();return r.length===0||r==="monospace"?"ui-monospace, Menlo, Consolas, monospace":`${Ce(r)}, ui-monospace, Menlo, Consolas, monospace`}n(Qe,"cssMonoFamily");function Ce(e){return `"${e.replace(/[\\"]/g,"\\$&")}"`}n(Ce,"quote");function g(e,r){let o=e.type,t=o.families[r];return {fontFamily:r==="mono"||r==="monoMedium"||r==="monoBold"?Qe(t):Je(t),fontWeight:o.namedFaces[r]?o.weight.regular:o.weight[Ee[r]]}}n(g,"faceCss");var $="[everfur] The in-page vet call needs @daily-co/daily-js, which this app has not registered. Install it and call registerEverfurDaily(() => import('@daily-co/daily-js')) once in your app entry, before any Everfur call surface mounts. Until then, fall back to VetVisitButton, which opens the visit in a new tab.",Y="@daily-co/daily-js",er=`optional peer '${Y}' has no registered loader`,rr=`optional peer '${Y}' is present but failed its shape check`;function K(e){return typeof e=="object"&&e!==null}n(K,"isRecordLike");function nr(e){let r=e;for(let o=0;o<3;o+=1){if(he(r))return r;if(!K(r)||!("default"in r))return null;r=r.default;}return null}n(nr,"normalizeDailyModule");function he(e){return !K(e)&&typeof e!="function"?false:typeof e.createFrame=="function"}n(he,"isEverfurDailyModule");var ke=null,_=null;function G(e){return Object.freeze({available:false,module:null,reason:e})}n(G,"unavailable");function or(e){ke=e,_=null;}n(or,"registerEverfurDaily");function X(){if(_!==null)return _;let e=ke;if(e===null)return Promise.resolve(G(er));let r=(async()=>{let o;try{o=await e();}catch(a){return G(`optional peer '${Y}' is not installed: ${tr(a)}`)}let t=nr(o);return t===null?G(rr):Object.freeze({available:true,module:t})})();return _=r,r}n(X,"loadEverfurDaily");function tr(e){return e instanceof Error?e.message:typeof e=="string"?e:"unknown load error"}n(tr,"describe");function Fe(e){if(!K(e)||!("errorMsg"in e))return null;let r=e.errorMsg;return typeof r=="string"&&r.length>0?r:null}n(Fe,"dailyErrorMessage");function xe(e){return e?Object.keys(e).filter(r=>r!=="local").length:0}n(xe,"remoteParticipantCount");var sr=44,Re=3,dr=420,ur=.35,cr=1,fr=.6;function yr({theme:e}){let r=e.motion.reducedMotion,[o,t]=useState(0);return useEffect(()=>{if(r)return;let a=setInterval(()=>t(l=>(l+1)%Re),dr);return ()=>clearInterval(a)},[r]),jsx("div",{"aria-hidden":"true","data-testid":"everfur-vet-call-lobby-dots",style:{display:"flex",gap:e.space.xs,justifyContent:"center"},children:Array.from({length:Re},(a,l)=>jsx("span",{style:{width:6,height:6,borderRadius:e.radius.pill,backgroundColor:e.color.text.onBrand,opacity:r?fr:l===o?cr:ur,transition:r?"none":`opacity ${e.motion.duration.fast}ms ${e.motion.easing.standard}`}},l))})}n(yr,"WaitingDots");function q(e){let{clinicianName:r,petName:o,consultMinutes:t=10,onLeave:a,style:l,className:s}=e,b=F(),i=useMemo(()=>mr(b),[b]),S=c.lobbyTitle(r),w=c.lobbyPrep(o);return jsxs("section",{className:s,"data-testid":"everfur-vet-call-lobby",style:{...i.root,...l},children:[jsx("div",{style:i.topRow,children:jsx("button",{type:"button",onClick:a,"data-testid":"everfur-vet-call-lobby-leave",style:i.leave,children:c.leaveCta})}),jsxs("div",{style:i.center,children:[jsxs("div",{"aria-hidden":"true","data-testid":"everfur-vet-call-lobby-avatar",style:i.avatar,children:[jsx("span",{style:i.avatarHead}),jsx("span",{style:i.avatarBody})]}),jsxs("div",{"aria-live":"polite",style:i.titleBlock,children:[jsx("p",{"data-testid":"everfur-vet-call-lobby-title",style:i.title,children:S}),jsx("p",{style:i.subtitle,children:c.lobbySubtitle})]}),jsx(yr,{theme:b})]}),jsxs("div",{"data-testid":"everfur-vet-call-lobby-prep",style:i.prepCard,children:[jsx("p",{style:i.prepLabel,children:c.lobbyPrepLabel}),jsx("p",{style:i.prepBody,children:w})]}),jsx("p",{"data-testid":"everfur-vet-call-lobby-duration",style:i.duration,children:c.lobbyDuration(t)})]})}n(q,"EverfurVetCallLobby");function mr(e){let{color:r,space:o,radius:t,type:a}=e,l=r.text.onBrand,s=132;return {root:{boxSizing:"border-box",display:"flex",flexDirection:"column",gap:o.lg,padding:o.lg,borderRadius:t.lg,backgroundColor:r.brand,color:l},topRow:{display:"flex",alignItems:"center"},leave:{minHeight:sr,padding:`0 ${o.md}px`,margin:0,border:0,background:"transparent",color:l,cursor:"pointer",...g(e,"medium"),fontSize:a.size.body},center:{display:"flex",flexDirection:"column",alignItems:"center",gap:o.md},avatar:{position:"relative",width:s,height:s,borderRadius:t.pill,overflow:"hidden",backgroundColor:r.brandSoft,display:"flex",alignItems:"center",justifyContent:"center"},avatarHead:{position:"absolute",top:s*.24,width:s*.28,height:s*.28,borderRadius:t.pill,backgroundColor:l,opacity:.55},avatarBody:{position:"absolute",top:s*.58,width:s*.52,height:s*.34,borderTopLeftRadius:s*.26,borderTopRightRadius:s*.26,backgroundColor:l,opacity:.55},titleBlock:{textAlign:"center"},title:{margin:0,...g(e,"bold"),fontSize:a.size.heading,color:l},subtitle:{margin:`${e.space.xs}px 0 0`,fontSize:a.size.bodyTight,color:l,opacity:.75},prepCard:{display:"flex",flexDirection:"column",gap:o.xs,padding:o.md,borderRadius:t.md,backgroundColor:r.brandSoft},prepLabel:{margin:0,...g(e,"medium"),fontSize:a.size.micro,letterSpacing:a.letterSpacing.eyebrow,color:l,opacity:.75},prepBody:{margin:0,fontSize:a.size.bodyTight,color:l},duration:{margin:0,textAlign:"center",...g(e,"medium"),fontSize:a.size.micro,letterSpacing:a.letterSpacing.eyebrow,color:l,opacity:.75}}}n(mr,"makeLobbyStyles");var br=44,vr="16 / 9",Er="16px",Tr=["participant-joined","participant-updated","participant-left"];function Cr(e){let{roomUrl:r,token:o,onLeave:t,clinicianName:a,petName:l,displayName:s,daily:b,telemetry:i,onUnavailable:S,renderUnavailable:w,style:Be,className:De}=de(e,["onLeave","onUnavailable"]),J=F(),v=useMemo(()=>kr(J),[J]),[P,E]=useState("joining"),[_e,Q]=useState(0),[U,Me]=useState(null),ee=useRef(null),T=useRef(null),re=useRef(false),C=useRef({onLeave:t,onUnavailable:S,daily:b,telemetry:i});C.current={onLeave:t,onUnavailable:S,daily:b,telemetry:i};let h=useCallback(()=>{re.current||(re.current=true,A(C.current.onLeave));},[]);useEffect(()=>{let d=false,y=null,oe=[],V=n((m,p)=>{d||(Me({reason:m,detail:p}),A(C.current.onUnavailable,m,p));},"refuse");if(!I(r,o)){V("roomUnusable","the call needs an https room URL and a non-empty join token");return}return n(async()=>{let m=ee.current;if(!m)return;let p=C.current.daily,k;if(p!==void 0)k=p;else {let u=await X();if(d)return;if(!u.available){hr($),V("dailyMissing",u.reason);return}k=u.module;}if(d)return;let N=C.current.telemetry??ae;try{y=k.createFrame(m,{showLeaveButton:!0,showFullscreenButton:!1,iframeStyle:{width:"100%",height:"100%",border:"0",borderRadius:Er}});}catch(u){V("dailyMissing",`createFrame failed: ${Pe(u)}`);return}T.current=y;let L=n((u,te)=>{oe.push({event:u,handler:te}),y?.on(u,te);},"attach"),Ue=n(()=>{d||y===null||Q(we(y));},"syncParticipants");for(let u of Tr)L(u,Ue);L("joined-meeting",()=>{d||y===null||(E("joined"),Q(we(y)));}),L("left-meeting",()=>{d||(E("left"),h());}),L("error",u=>{d||(E("error"),N.trackExpectedFailure("televet.call.join_failed",{provider:"daily",detail:Fe(u)??"unknown"}));});try{if(await y.join({url:r,token:o,userName:s}),d)return;N.track("televet.call.joined",{provider:"daily"});}catch(u){if(d)return;E("error"),N.trackExpectedFailure("televet.call.join_failed",{provider:"daily",detail:Pe(u)});}},"start")(),()=>{d=true;for(let{event:p,handler:k}of oe)try{y?.off(p,k);}catch{}let m=T.current;T.current=null,m?.destroy().catch(()=>{});}},[r,o,s,h]);let ne=useCallback(()=>{let d=T.current;if(T.current=null,E("left"),!d){h();return}(async()=>{try{await d.leave();}catch{}try{await d.destroy();}catch{}h();})();},[h]);return U!==null?w?jsx(Fragment,{children:w(U.reason,U.detail)}):null:jsxs("div",{className:De,"data-testid":"everfur-vet-call",style:{...v.root,...Be},children:[P==="left"?null:jsx("div",{ref:ee,"data-testid":"everfur-vet-call-frame",style:{...v.frame,...P==="error"?v.frameHidden:null}}),P==="joined"&&_e===0?jsx(q,{clinicianName:a,petName:l,onLeave:ne}):null,P==="error"?jsxs("div",{role:"alert","data-testid":"everfur-vet-call-failed",style:v.failed,children:[jsx("p",{style:v.failedText,children:c.joinFailedReason}),jsx("button",{type:"button",onClick:ne,"data-testid":"everfur-vet-call-failed-leave",style:v.failedLeave,children:c.leaveCta})]}):null]})}n(Cr,"EverfurVetCall");function we(e){try{return xe(e.participants())}catch{return 0}}n(we,"countRemotes");function Pe(e){return e instanceof Error?e.message:typeof e=="string"?e:"unknown error"}n(Pe,"describe");var Le=false;function hr(e){if(Le)return;Le=true;let r=globalThis.console;try{r?.warn?.(e);}catch{}}n(hr,"warnOnce");function kr(e){let{color:r,space:o,radius:t,type:a}=e;return {root:{boxSizing:"border-box",display:"flex",flexDirection:"column",gap:o.md,width:"100%"},frame:{position:"relative",width:"100%",aspectRatio:vr,overflow:"hidden",borderRadius:t.lg,backgroundColor:r.brandInk},frameHidden:{display:"none"},failed:{display:"flex",flexDirection:"column",alignItems:"flex-start",gap:o.md,padding:o.lg,borderRadius:t.md,border:`1px solid ${r.brandBorder}`,backgroundColor:r.surfaceCream,color:r.text.primary},failedText:{margin:0,fontSize:a.size.bodyTight,color:r.text.primary},failedLeave:{minHeight:br,padding:`0 ${o.lg}px`,borderRadius:t.pill,border:`1.5px solid ${r.brand}`,backgroundColor:"transparent",color:r.brand,cursor:"pointer",...g(e,"medium"),fontSize:a.size.body}}}n(kr,"makeCallStyles");export{$ as EVERFUR_DAILY_SETUP,Cr as EverfurVetCall,q as EverfurVetCallLobby,O as VET_CALL_CONSULT_MINUTES,c as VET_CALL_COPY,he as isEverfurDailyModule,le as isSafeRoomUrl,I as isUsableRoomCredential,X as loadEverfurDaily,or as registerEverfurDaily};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
'use strict';var react=require('react'),jsxRuntime=require('react/jsx-runtime');var yr=Object.defineProperty;var n=(e,r)=>yr(e,"name",{value:r,configurable:true});var $=null;function mr(e){$=e;}n(mr,"registerEverfurTelevetFlow");function Q(){return $!==null}n(Q,"hasEverfurTelevetFlow");function X(e){let r=$;if(r===null)return false;try{return r(e),!0}catch(t){return console.warn("[everfur] The in-page vet visit presenter registered with registerEverfurTelevetFlow threw, so this click fell back to the hosted visit in a new tab. The member reached a vet, but your routing did not run: check the destination you registered.",t),false}}n(X,"presentEverfurTelevetFlow");var Z=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(Z.map(e=>e.wireCode));var vr=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"}),Ee=Object.freeze(Z.map(e=>Object.freeze({wireCode:e.wireCode,envelope:e.envelope,retryable:e.retryable,normalized:vr[e.wireCode]}))),br=new Map(Ee.map(e=>[e.envelope+e.wireCode.toUpperCase(),e])),Er=Object.freeze(["http_envelope",...[...new Set(Ee.map(e=>e.envelope))].filter(e=>e!=="http_envelope").sort()]);function N(e,r){if(typeof e!="string")return;let t=e.trim().toUpperCase();if(t.length!==0)for(let o of [r??"http_envelope",...Er]){let i=br.get(o+t);if(i)return i}}n(N,"contractErrorFor");function gr(e){return e.envelope==="sse_frame"?`/errors#sse-${e.wireCode}`:e.envelope==="oauth_error"?`/errors#oauth-${e.wireCode}`:`/errors#${e.wireCode}`}n(gr,"contractDocUrl");function ge(e){return null}n(ge,"publishedDocUrl");var hr=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 he(e){return hr[e]}n(he,"categoryFor");function _e(e){let r=N(e);if(r)return r.normalized;let t=(e??"").trim().toUpperCase(),o=t.replace(/[^A-Z0-9]/g,"");if(o==="AUTHREJECTED")return "authRejected";if(t.startsWith("AUTH"))return "authExpired";switch(o){case "DAILYQUOTAEXCEEDED":case "QUOTAEXCEEDED":return "quotaExceeded";case "RATELIMITED":case "TOOMANYREQUESTS":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(_e,"fromWire");var _r=new Set(["streamTimeout","rateLimited","internalError","upstreamLlmTimeout","streamIncomplete"]);function J(e){return _r.has(e)}n(J,"isAutoRetryable");var Rr=new Set(["serviceUnavailable","conflict","idempotencyInFlight"]);function Re(e){return J(e)||Rr.has(e)}n(Re,"isRetryableCode");var Tr=500,ee=8e3,Te=4;function Ce(e,r=Math.random){let t=Math.max(0,e),o=Math.min(Tr*2**t,ee);return Math.floor(r()*o)}n(Ce,"backoffDelayMs");var Cr=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 re(e){return Cr[e]}n(re,"userFacingError");function we(e,r,t){Object.defineProperty(e,r,{value:t,enumerable:false,writable:false,configurable:false});}n(we,"defineHidden");var wr=/^[a-z][a-z0-9_]{0,63}$/;function F(e,r){let t=N(r?.wireCode,r?.wireEnvelope),o={code:e,category:he(e),retryable:r?.retryable??Re(e),displayMessage:re(e)};if(r?.httpStatus!==void 0&&(o.httpStatus=r.httpStatus),r?.requestId&&(o.requestId=r.requestId),typeof r?.reasonCode=="string"&&wr.test(r.reasonCode)&&(o.reasonCode=r.reasonCode),t);return r?.wireMessage&&we(o,"wireMessage",r.wireMessage),r?.raw!==void 0&&r.raw!==null&&we(o,"raw",r.raw),Object.freeze(o)}n(F,"makeEverfurError");function te(e,r){return Object.freeze(r===void 0?{ok:true,value:e}:{ok:true,value:e,warning:r})}n(te,"ok");function _(e){return Object.freeze({ok:false,error:e})}n(_,"err");var M=class M extends Error{constructor(r,t){super(t),this.name="EverfurConfigError",this.kind=r,Object.setPrototypeOf(this,M.prototype);}};n(M,"EverfurConfigError");var z=M;function Se(e){return Object.freeze({kind:"error",terminal:true,code:e.code,retryable:e.retryable,wireMessage:e.wireMessage,synthesized:e.synthesized,lastEventId:e.lastEventId,serverRequestId:e.serverRequestId??null})}n(Se,"errorFrame");function Fr(e){let r={};return e.mode==="personalized"?r.authorization=`Bearer ${e.token}`:r["x-everfur-partner-key"]=e.publishableKey,e.userRef&&(r["x-everfur-user-ref"]=e.userRef),e.sessionId&&(r["x-everfur-session-id"]=e.sessionId),r}n(Fr,"authHeaders");function j(e,r){return {...e,headers:{...kr(e.headers),...Fr(r)}}}n(j,"withAuthHeaders");function kr(e){if(!e)return {};let r={};for(let[t,o]of Object.entries(e)){let i=t.toLowerCase();i==="authorization"||i==="x-everfur-partner-key"||(r[t]=o);}return r}n(kr,"stripAuthHeaders");async function xe(e,r){if(r.mode==="anonymous")return r.transport.request(j(e,{mode:"anonymous",publishableKey:r.publishableKey,userRef:r.userRef,...r.sessionId?{sessionId:r.sessionId}:{}}));let t;try{t=await r.identity.currentToken();}catch{return _(ne())}let o=await r.transport.request(j(e,{mode:"personalized",token:t,userRef:r.userRef,...r.sessionId?{sessionId:r.sessionId}:{}}));if(o.ok||o.error.httpStatus!==401)return o;let i;try{i=await r.identity.currentToken({forceRefresh:!0});}catch{return _(ne())}let a=await r.transport.request(j(e,{mode:"personalized",token:i,userRef:r.userRef,...r.sessionId?{sessionId:r.sessionId}:{}}));return !a.ok&&a.error.httpStatus===401?_(ne(a.error.httpStatus)):a}n(xe,"authedSend");function ne(e){return F("authRejected",{retryable:false,...e!==void 0?{httpStatus:e}:{}})}n(ne,"authRejectedError");function Fe(e){return F("internalError",{retryable:true,wireMessage:Or(e)})}n(Fe,"networkError");function Or(e){return e instanceof Error?e.message:typeof e=="string"?e:"network request failed"}n(Or,"describeCause");var Vr=3e4,Ir=ee*2,Ar="idempotency-key",Pr=new Set(["POST","PUT","PATCH","DELETE"]),zr=Object.freeze({onEvent(){}}),jr=Object.freeze({setTimeout:n((e,r)=>setTimeout(e,r),"setTimeout"),clearTimeout:n(e=>clearTimeout(e),"clearTimeout"),now:n(()=>Date.now(),"now")});function Dr(e){let r=e.trim().replace(/[^A-Za-z0-9_.:-]/g,"-");return r.length===0?null:`efs_${r}`.slice(0,128)}n(Dr,"seededIdempotencyKey");function Oe(e){let r=e.observer??zr,t=e.timers??jr,o=e.rng??Math.random,i=e.sleep??((y,d)=>Qr(y,t,d)),a=e.maxAttempts??Te,u=e.unaryTimeoutMs??Vr,l=e.newIdempotencyKey??Mr(),s=n(y=>{try{r.onEvent(y);}catch{}},"emit");async function c(y,d,m){let g=m?.maxAttempts,p=Math.max(1,g??a),k=m?.idempotent??Pr.has(d.method),C=m?.idempotencyKey===void 0?null:Dr(m.idempotencyKey),R=k?C??l():null,V=Nr(d,R),x=0;for(;;){let h=n(O=>Object.freeze({call:y,method:d.method,path:d.path,attempt:x,...R?{idempotencyKey:R}:{},...O}),"stamp");s(h({phase:"attempt"}));let I=Gr(u,t),A=$r(I.signal,d.signal),f;try{f=await xe({...V,signal:A.signal},e.auth);}catch(O){f=_(Fe(O));}finally{A.dispose(),I.cancel();}if(f.ok)return s(h({phase:"settled",ok:true,reason:"ok"})),f;let b=f.error,w=Ur(b,x,{maxAttempts:p,rng:o,now:t.now(),aborted:d.signal?.aborted===true,...g!==void 0?{perCallMaxAttempts:g}:{},...e.errorPolicy!==void 0?{policy:e.errorPolicy}:{}}),S={ok:false,code:b.code,reason:w.reason,...b.httpStatus!==void 0?{httpStatus:b.httpStatus}:{},...b.requestId!==void 0?{requestId:b.requestId}:{}};if(!w.retry)return s(h({phase:"settled",...S})),_(b);if(s(h({phase:"retry",...S,delayMs:w.delayMs})),await i(w.delayMs,d.signal),d.signal?.aborted===true)return s(h({phase:"settled",...S,reason:"aborted"})),_(b);x+=1;}}n(c,"send");async function E(y){return j(y,await Kr(e.auth))}n(E,"authorize");async function*v(y,d,m){s(Object.freeze({call:y,phase:"stream.open",method:d.method,path:d.path,attempt:0}));try{yield*e.auth.transport.stream(d,m);}catch{yield Se({code:"internal_error",retryable:true,wireMessage:null,synthesized:true,lastEventId:null,serverRequestId:null});}}return n(v,"stream"),Object.freeze({send:c,authorize:E,stream:v})}n(Oe,"createRequestFunnel");function Nr(e,r){let t={};for(let[o,i]of Object.entries(e.headers??{}))o.toLowerCase()!==Ar&&(t[o]=i);return r!==null&&(t["Idempotency-Key"]=r),{...e,headers:t}}n(Nr,"assembleHeaders");function Mr(){let e=0;return ()=>`efk_${Date.now().toString(36)}_${(e++).toString(36)}_${Math.random().toString(36).slice(2,12)}`}n(Mr,"defaultIdempotencyKeyFactory");var Lr=10;function Ur(e,r,t){if(t.aborted)return {retry:false,reason:"aborted"};let o=Br(e);if(o==="quota")return {retry:false,reason:"daily-quota-exhausted"};if(o!=="burst"&&!J(e.code))return {retry:false,reason:"terminal-code"};let i=o==="burst"?"burst-throttle":"retryable-code";if(n(()=>{if(t.policy===void 0)return false;try{return !t.policy.shouldRetry(e.code,r)}catch{return false}},"policyVetoedRetry")())return {retry:false,reason:"terminal-code"};let u=n(()=>{if(t.policy===void 0)return null;let c;try{c=t.policy.maxAttempts(e.code);}catch{return null}return typeof c!="number"||!Number.isFinite(c)?null:Math.max(1,Math.min(Lr,Math.floor(c)))},"policyCeiling"),l=t.perCallMaxAttempts??u()??t.maxAttempts;if(r+1>=l)return {retry:false,reason:"attempts-exhausted"};let s=qr(e,t.now);return s!==null?s>Ir?{retry:false,reason:"server-reset-beyond-budget"}:{retry:true,reason:i,delayMs:s}:{retry:true,reason:i,delayMs:Ce(r,t.rng)}}n(Ur,"decideRetry");function Br(e){let r=e.code==="unknown"?_e(Yr(e.raw)):e.code;return r==="quotaExceeded"?"quota":r==="rateLimited"||e.httpStatus===429?"burst":null}n(Br,"throttleKind");function qr(e,r){let t=Hr(e.raw);if(t===null)return null;let o=t-r;return o>0?o:0}n(qr,"retryOverrideMs");function Hr(e){for(let r of Ve(e)){let t=r.resets_at,o=Wr(t);if(o!==null)return o}return null}n(Hr,"findResetsAt");function Ve(e){if(!ke(e))return [];let r=[e];for(let t of ["error","detail"]){let o=e[t];ke(o)&&r.push(o);}return r}n(Ve,"candidateScopes");function Wr(e){if(typeof e=="number"&&Number.isFinite(e))return e<1e11?Math.round(e*1e3):Math.round(e);if(typeof e=="string"&&e.trim().length>0){let r=Date.parse(e);return Number.isFinite(r)?r:null}return null}n(Wr,"parseInstantMs");function Yr(e){for(let r of Ve(e)){let t=r.code;if(typeof t=="string"&&t.length>0)return t}return null}n(Yr,"rawWireCode");function ke(e){return typeof e=="object"&&e!==null}n(ke,"isRecord");async function Kr(e){return e.mode==="anonymous"?{mode:"anonymous",publishableKey:e.publishableKey,userRef:e.userRef,...e.sessionId?{sessionId:e.sessionId}:{}}:{mode:"personalized",token:await e.identity.currentToken(),userRef:e.userRef,...e.sessionId?{sessionId:e.sessionId}:{}}}n(Kr,"resolveDeviceAuth");function Gr(e,r){let t=new AbortController,o=r.setTimeout(()=>t.abort(),e);return {signal:t.signal,cancel:n(()=>r.clearTimeout(o),"cancel")}}n(Gr,"boundedSignal");function $r(e,r){let t=n(()=>{},"noop");if(!r)return {signal:e,dispose:t};let o=new AbortController;if(e.aborted||r.aborted)return o.abort(),{signal:o.signal,dispose:t};let i=n(()=>o.abort(),"onAbort");return e.addEventListener("abort",i,{once:true}),r.addEventListener("abort",i,{once:true}),{signal:o.signal,dispose:n(()=>{e.removeEventListener("abort",i),r.removeEventListener("abort",i);},"dispose")}}n($r,"mergeSignals");function Qr(e,r,t){return e<=0||t?.aborted===true?Promise.resolve():new Promise(o=>{let i=r.setTimeout(()=>{t?.removeEventListener("abort",a),o();},e),a=n(()=>{r.clearTimeout(i),o();},"onAbort");t?.addEventListener("abort",a,{once:true});})}n(Qr,"delayAbortable");var L=Object.freeze(["visit","join","summary","messages"]);function U(e){return typeof e=="string"&&L.includes(e)}n(U,"isVetVisitIntent");var Xr="/widget/v1/televet/handoffs",Zr="/widget/v1/televet/availability",Jr="/widget/v1/televet/chat-entry",et=/^[a-z0-9][a-z0-9_-]{0,39}$/,Ne=/^[A-Za-z0-9_-]{22}$/,Ie="everfur_flow",Ae=32,Pe=128,ze=64;function B(e){let r=e.httpStatus;switch(e.code){case "sessionRequired":return "sessionRequired";case "authExpired":case "authRejected":return "authRejected";case "sdkUpdateRequired":return "sdkUpdateRequired";case "validationFailed":return "invalidRequest";case "rateLimited":case "quotaExceeded":return "rateLimited";}return r===void 0?e.code==="internalError"?"network":"unknown":r===429?"rateLimited":r===404?"unavailable":r===403?"accessDenied":r===401?"authRejected":r===400||r===422?"invalidRequest":r>=500?"serverError":"unknown"}n(B,"vetVisitErrorReasonOf");function je(e){return _(F("validationFailed",{retryable:false,wireMessage:e}))}n(je,"invalid");function oe(e){return _(F("internalError",{retryable:false,httpStatus:502,wireMessage:e}))}n(oe,"unusable");function rt(e,r){let t={};e!==void 0&&(t.pet_ref=e);let o=r?.returnTo;if(o!=null){if(typeof o!="string"||!et.test(o))return {ok:false,message:"returnTo must be a registered return destination key"};t.return_to=o;}let i=r?.entry;if(i!=null){if(i!=="chat"||e===void 0)return {ok:false,message:"entry 'chat' needs the pet the chat is about"};t.entry=i;}let a=r?.visitRef,u=r?.intent,l=a!=null;if(l){let s=typeof a=="string"?a.trim():"";if(s.length<1||[...s].length>ze)return {ok:false,message:`visitRef must be 1..${ze} characters`};t.visit_ref=s;}if(u!=null){if(!l)return {ok:false,message:"intent needs the visitRef it opens"};if(!U(u))return {ok:false,message:`intent must be one of ${L.join(", ")}`};t.intent=u;}return {ok:true,body:t}}n(rt,"handoffBody");function tt(e){if(typeof e!="object"||e===null)return null;let{visit_ref:r,intent:t}=e;return typeof r!="string"||r.length===0||!U(t)?null:Object.freeze({visitRef:r,intent:t})}n(tt,"parseVisitEcho");function Me(e){let r=e.funnel??Oe({auth:e.auth,...e.errorPolicy?{errorPolicy:e.errorPolicy}:{}}),t=e.telemetry,o=n(i=>(De(t,"televet.visit.handoff_failed",{reason:B(i)}),_(i)),"failed");return {async createHandoff(i,a){let u;if(i!=null){let p=typeof i=="string"?[...i].length:0;if(p<1||p>Pe)return o(F("validationFailed",{retryable:false,wireMessage:`pet_ref must be 1..${Pe} characters`}));u=i;}let l=rt(u,a);if(!l.ok){let p=je(l.message);return p.ok?p:o(p.error)}let s=l.body,c=await r.send("televet.visit.handoff",{method:"POST",path:Xr,body:s},{idempotent:false,maxAttempts:1});if(!c.ok)return o(c.error);let E=ot(c.value),v=s.return_to!==void 0,y=v?c.value?.flow_id:void 0;if(v&&(typeof y!="string"||!Ne.test(y))){let p=oe("the handoff response carried no usable return flow id");return p.ok?p:o(p.error)}let d=s.visit_ref!==void 0,m=d?tt(c.value?.visit):null;if(d&&m===null){let p=oe("the handoff response did not confirm the visit it opens");return p.ok?p:o(p.error)}let g=E===null?null:Object.freeze({...E,...v?{flowId:y}:{},...m!==null?{visit:m}:{}});return g===null?o(F("internalError",{retryable:false,httpStatus:502,wireMessage:"the handoff response carried no usable visit url"})):(De(t,"televet.visit.handoff_created",{pet_scoped:s.pet_ref!==void 0}),te(g))},async checkAvailability(i){if(typeof i!="string"||i.length>Ae)return je(`state must be at most ${Ae} characters`);let a=await r.send("televet.visit.availability",{method:"POST",path:Zr,body:{state:i}},{idempotent:false,maxAttempts:1});if(!a.ok)return _(a.error);let u=a.value?.available;return typeof u!="boolean"?oe("the availability response carried no usable answer"):te(Object.freeze({available:u}))},async chatEntryOpen(){try{let i=await r.send("televet.visit.chat_entry",{method:"GET",path:Jr},{maxAttempts:1});return i.ok&&i.value?.open===!0}catch{return false}}}}n(Me,"createVetVisitController");function nt(e){if(typeof e!="string")return null;let r=e.indexOf("#"),t=r<0?e:e.slice(0,r),o=t.indexOf("?");if(o<0)return null;let i=t.slice(o+1).split("&").filter(a=>a.startsWith(`${Ie}=`)).map(a=>a.slice(Ie.length+1));return i.length!==1||!Ne.test(i[0]??"")?null:Object.freeze({flowId:i[0]})}n(nt,"parseVetVisitReturn");function ot(e){if(typeof e!="object"||e===null)return null;let{url:r,expires_at:t}=e;return typeof r!="string"||typeof t!="string"||t.length===0||!lt(r)?null:Object.freeze({url:r,expiresAt:t})}n(ot,"parseHandoff");var it=new Set(["localhost","127.0.0.1","[::1]"]),at=/^([A-Za-z][A-Za-z0-9+.-]*):\/\/([^/?#]*)/,st=/[\s\u0000-\u001f\u007f]/;function lt(e){if(st.test(e))return false;let r=at.exec(e);if(r===null)return false;let t=(r[1]??"").toLowerCase(),o=r[2]??"";if(o.length===0||o.includes("@"))return false;let i=o.replace(/:\d+$/,"").toLowerCase(),a=t==="https",u=t==="http"&&it.has(i);if(!a&&!u)return false;let l=e.indexOf("#");if(l<0)return false;let s=e.slice(l);return s.startsWith("#h=")&&s.length>3}n(lt,"isOpenableVisitUrl");function De(e,r,t){if(e)try{e.track(r,t);}catch{}}n(De,"safeTrack");var Le=Symbol.for("@everfur/sdk#EverfurContext@v1"),Ue=globalThis,Be=Ue[Le]??(Ue[Le]=react.createContext(null));Be.displayName??="EverfurContext";function q(){let e=react.useContext(Be);if(e===null)throw new z("not-initialized","Everfur hooks must be called inside <EverfurProvider>. Wrap your tree once, high.");return e}n(q,"useEverfurContext");var ct=Object.freeze({chat:Object.freeze(["chat.message.create"]),records:Object.freeze(["records.upload.create","records.record.read"]),recordsClinic:Object.freeze(["records.clinic.create"]),video:Object.freeze(["video.gait.execute"]),photo:Object.freeze(["photo.checkup.execute"]),animations:Object.freeze(["animations.state.read"]),televet:Object.freeze(["televet.visit.create"])});function ft(e){return ct[e]}n(ft,"requires");function qe(e,r,t){let o=ft(e),i=new Map;for(let l of r)i.set(l.resource,l);if(t?.isPending===true&&o.some(l=>!i.has(l)))return ie({name:e,enabled:false,isPending:true,limits:{}});let a=pt(o,i);return o.filter(l=>i.get(l)?.granted!==true).length===0?ie({name:e,enabled:true,isPending:false,limits:a}):ie({name:e,enabled:false,isPending:false,limits:a,disabled:yt(o,i)})}n(qe,"decideCapability");function pt(e,r){let t={};for(let o of e){let i=r.get(o)?.limits;if(i)for(let[a,u]of Object.entries(i)){let l=t[a];t[a]=l===void 0?u:Math.min(l,u);}}return t}n(pt,"mergeLimits");function yt(e,r){for(let t of e){let o=r.get(t)?.disabled;if(o)return Object.freeze({reason:o.reason,level:o.level,recoverable:o.recoverable})}return Object.freeze({reason:re("accessDenied"),level:"user_entitlement",recoverable:false})}n(yt,"disabledFor");function ie(e){let r={name:e.name,enabled:e.enabled,isPending:e.isPending,limits:Object.freeze({...e.limits})};return e.disabled!==void 0&&(r.disabled=e.disabled),Object.freeze(r)}n(ie,"freezeDecision");function He(e){let{runtime:r}=q(),t=r.entitlements,o=react.useSyncExternalStore(t.subscribe,t.getSnapshot,t.getSnapshot);return react.useMemo(()=>qe(e,o.decisions,{isPending:o.isPending}),[e,o])}n(He,"useCapability");var Ye=Object.freeze({status:"idle",error:null,errorReason:null});function Et(e,r,t){let{usState:o,chat:i,scope:a}=t,u=r&&(o!==null||i),l=`${o??""}|${i?"chat":""}`,[s,c]=react.useState(null);if(react.useEffect(()=>{if(!u)return;let v=true,y=e.current;return c(null),n(async()=>{try{if(i&&!(y.chatEntryOpen&&await y.chatEntryOpen()))return !1;if(o===null)return !0;if(!y.checkAvailability)return !1;let m=await y.checkAvailability(o);return m.ok&&m.value.available}catch{return false}},"ask")().then(m=>{v&&c({key:l,open:m});}),()=>{v=false;}},[u,l,o,i,a,e]),!u)return null;let E=s!==null&&s.key===l;return {open:E&&s.open,pending:!E}}n(Et,"usePreflight");var gt=Object.freeze({status:"opening",error:null,errorReason:null});function Ge(e,r={}){let{runtime:t,userRef:o,scopeEpoch:i}=q(),a=He("televet"),u=a.enabled&&o!==null,l=r.usState??null,s=r.entry==="chat",c=r.petRef??null,E=react.useMemo(()=>{if(r.controller)return r.controller;let{services:f}=t.registry;return Me({auth:f.authFor(o),telemetry:f.telemetry,...f.errorPolicy?{errorPolicy:f.errorPolicy}:{}})},[t,o,i,r.controller]),v=react.useRef(E);v.current=E;let y=react.useMemo(()=>({runtime:t,userRef:o,scopeEpoch:i}),[t,o,i]),d=Et(v,u,{usState:l,chat:s,scope:y}),m=u&&(d===null||d.open)&&(!s||c!==null),g=r.returnTo??null,[p,k]=react.useState(Ye),C=react.useRef(null),R=react.useRef({runtime:t,userRef:o,scopeEpoch:i});R.current={runtime:t,userRef:o,scopeEpoch:i};let V=react.useRef(E);V.current=E;let x=react.useRef(m);x.current=m;let h=react.useCallback((f,b)=>{if(C.current)return C.current;let w=n((T,P)=>(k({status:T==="cancelled"?"idle":"error",error:P,errorReason:T==="cancelled"?null:T}),Object.freeze({opened:false,reason:T,error:P})),"fail");if(!x.current)return Promise.resolve(w("unavailable",null));let S=e.prepare();if(!S.ok)return Promise.resolve(w(S.reason,null));let O=R.current,pe=V.current;k(gt);let K=(async()=>{let T,P={...g!==null?{returnTo:g}:{},...s?{entry:"chat"}:{},...b!==null?{visitRef:b.visitRef}:{},...b!==null&&b.intent!==null&&b.intent!==void 0?{intent:b.intent}:{}},ye=Object.keys(P).length===0?void 0:P,me=f===void 0?c:f;try{T=await(ye===void 0?pe.createHandoff(me):pe.createHandoff(me,ye));}catch{return e.abandon(S.value),w("unknown",null)}let G=R.current;if(G.runtime!==O.runtime||G.userRef!==O.userRef||G.scopeEpoch!==O.scopeEpoch)return e.abandon(S.value),w("cancelled",null);if(!T.ok)return e.abandon(S.value),w(B(T.error),T.error);let ve=await e.finish(S.value,T.value);return ve!==null?w(ve,null):(k(Ye),Object.freeze(T.value.flowId===void 0?{opened:true}:{opened:true,flowId:T.value.flowId}))})().finally(()=>{C.current===K&&(C.current=null);});return C.current=K,K},[e,c,g,s]),I=react.useCallback(f=>h(f,null),[h]),A=react.useCallback((f,b)=>h(void 0,{visitRef:f,intent:b??null}),[h]);return {available:m,isPending:a.isPending||(d?.pending??false),status:p.status,error:p.error,errorReason:p.errorReason,open:I,openVisit:A}}n(Ge,"useVetVisitWith");function $e(e){try{e.closed||e.close();}catch{}}n($e,"closeQuietly");var ht=Object.freeze({prepare(){let e=null;try{e=typeof window>"u"?null:window.open("about:blank","_blank");}catch{e=null;}if(e===null)return {ok:false,reason:"popupBlocked"};try{e.opener=null;}catch{}return {ok:true,value:{tab:e}}},async finish({tab:e},r){if(e.closed)return "cancelled";try{return e.location.replace(r.url),null}catch{return $e(e),"popupBlocked"}},abandon({tab:e}){$e(e);}});function se(e){return Ge(ht,e)}n(se,"useVetVisit");function _t(e,r){if(e===void 0)return {};let t={};return e.backgroundColor!==void 0&&(t.backgroundColor=e.backgroundColor),e.borderColor!==void 0&&(t.borderColor=e.borderColor,t.borderWidth=r??1),e.borderRadius!==void 0&&(t.borderRadius=e.borderRadius),t}n(_t,"slotBox");function Qe(e){return e?.textColor===void 0?{}:{color:e.textColor}}n(Qe,"slotText");function Xe(e,r){let t=_t(e,r),o={};return t.backgroundColor!==void 0&&(o.backgroundColor=t.backgroundColor),t.borderColor!==void 0&&(o.border=`${t.borderWidth??1}px solid ${t.borderColor}`),t.borderRadius!==void 0&&(o.borderRadius=t.borderRadius),o}n(Xe,"slotBoxCss");function Ze(e){let r=globalThis.console;try{r?.error?.("[everfur] A host callback threw; the SDK ignored it.",e);}catch{}}n(Ze,"reportHostFailure");function Rt(e){return (typeof e=="object"||typeof e=="function")&&e!==null&&typeof e.then=="function"}n(Rt,"isThenable");function H(e,...r){if(typeof e=="function")try{let t=e(...r);return Rt(t)&&Promise.resolve(t).then(void 0,Ze),t}catch(t){Ze(t);return}}n(H,"callHost");var Je=Object.freeze({visitButton:"Talk to a vet"});function de(e){if(e!==null&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let r of Object.keys(e))de(e[r]);}return e}n(de,"deepFreeze");var Tt=Object.freeze({content:0,heading:2,control:1.8,compact:1.5,badge:1.3}),rr={xs:4,sm:8,md:12,lg:16,xl:24,xxl:32},tr={tile:5,xs:6,sm:10,md:14,lg:20,xl:28,pill:500},er={nano:8,small:9,micro:10,tiny:11,caption:12,bodyTight:13,body:14,subtitle:16,heading:18,verdict:24},Ct={tight:1.15,snug:1.3,normal:1.4,relaxed:1.55},wt={regular:"400",medium:"500",bold:"700"},St={eyebrow:1,monoWide:.9,headerBrand:-0.42,tight:-0.35},xt=0,W="System",Y="monospace",Ft=["content","heading","control","compact","badge"];function kt(e){let r={};for(let t of Ft)r[t]=e;return r}n(kt,"authoredTierSizes");function nr(){return {family:W,mono:Y,fontUrl:null,families:{regular:W,medium:W,bold:W,mono:Y,monoMedium:Y,monoBold:Y},namedFaces:{regular:false,medium:false,bold:false,mono:false,monoMedium:false,monoBold:false},fontUrls:{},size:er,tierSizes:kt(er),lineHeight:Ct,weight:wt,letterSpacing:St,scale:1,maxScale:xt,scaleCaps:Tt}}n(nr,"baseType");var or={},le=Object.freeze({standard:Object.freeze([.2,0,0,1]),emphasized:Object.freeze([.2,.8,.2,1]),exit:Object.freeze([.4,0,1,1])});function ue(e){return `cubic-bezier(${e.join(", ")})`}n(ue,"cssCubicBezier");var ir={duration:{instant:80,fast:140,normal:220,slow:320},spring:{gentle:{damping:18,stiffness:200}},easing:{standard:ue(le.standard),emphasized:ue(le.emphasized),exit:ue(le.exit)},reducedMotion:false},Ot={brand:"#10462E",brandSoft:"rgba(16,70,46,0.10)",brandSofter:"rgba(16,70,46,0.15)",brandBorder:"rgba(16,70,46,0.18)",borderHairlineGreen:"rgba(16,70,46,0.25)",brandBorderStrong:"rgba(16,70,46,0.55)",brandInk:"#10462E",linkInk:"#10462E",surface:"#FFFFFF",surfaceCream:"#FDFBF8",surfaceSubtle:"#EFE9E3",background:"#FFFFFF",borderRingCream:"#D8D2C8",chatGround:"#FFFFFF",composerFill:"#FDFBF8",composerBorder:"rgba(16,70,46,0.75)",shadow:"#0B3421",text:{primary:"#111111",secondary:"#0E462E",muted:"#6E6660",placeholder:"rgba(61,61,61,0.75)",onBrand:"#FFFFFF",metaCool:"#3D3D3D",timestamp:"rgba(61,61,61,0.75)"},primary:"#10462E",onPrimary:"#FFFFFF",accent:"#10462E",onAccent:"#FFFFFF",accentEdge:"#07C168",success:"#07C168",danger:"#B91C1C",errorRed:"#FF1B00",warningStrong:"#A45610",cautionAccent:"#D9821D",riskConcern:"#EFA700",sentiment:{up:"#07C168",neutral:"#FBC558",down:"#FF1B00"},badgeBgPositive:"rgba(7,193,104,0.12)",badgeBgCaution:"rgba(217,130,29,0.14)",badgeBgCritical:"rgba(185,28,28,0.12)",badgeBgNeutral:"rgba(110,102,96,0.12)",bubbleUser:"#10462E",bubbleAssistant:"#FFFFFF",skeleton:"#EFE9E3",scanButtonPink:"#FFC3BC",checkupCardLowRiskBg:"rgba(7,193,104,0.10)",checkupCardConcernBg:"rgba(239,167,0,0.10)"},ar=de({brightness:"light",highContrast:false,meta:{displayName:"Everfur",logoUrl:null,placeholder:null,hidePoweredBy:false},color:Ot,space:rr,radius:tr,type:nr(),motion:ir,slots:or}),Vt={brand:"#6BD39A",brandSoft:"rgba(107,211,154,0.12)",brandSofter:"rgba(107,211,154,0.18)",brandBorder:"rgba(107,211,154,0.22)",borderHairlineGreen:"rgba(107,211,154,0.28)",brandBorderStrong:"rgba(107,211,154,0.55)",brandInk:"#6BD39A",linkInk:"#6BD39A",surface:"#1C1F23",surfaceCream:"#23272C",surfaceSubtle:"#23272C",background:"#15171A",borderRingCream:"#3A3F45",chatGround:"#1C1F23",composerFill:"#23272C",composerBorder:"rgba(107,211,154,0.75)",shadow:"#000000",text:{primary:"#F5F3F0",secondary:"#A9E4C4",muted:"#9A938C",placeholder:"rgba(255,255,255,0.55)",onBrand:"#0E1F17",metaCool:"#C9C9C9",timestamp:"rgba(245,243,240,0.7)"},primary:"#6BD39A",onPrimary:"#0E1F17",accent:"#6BD39A",onAccent:"#0E1F17",accentEdge:"#34D888",success:"#07C168",danger:"#F87171",errorRed:"#FF6B5B",warningStrong:"#F0A35E",cautionAccent:"#D9821D",riskConcern:"#EFA700",sentiment:{up:"#07C168",neutral:"#FBC558",down:"#FF1B00"},badgeBgPositive:"rgba(7,193,104,0.18)",badgeBgCaution:"rgba(217,130,29,0.20)",badgeBgCritical:"rgba(185,28,28,0.22)",badgeBgNeutral:"rgba(255,255,255,0.10)",bubbleUser:"#6BD39A",bubbleAssistant:"#1C1F23",skeleton:"#23272C",scanButtonPink:"#FFC3BC",checkupCardLowRiskBg:"rgba(7,193,104,0.16)",checkupCardConcernBg:"rgba(239,167,0,0.16)"};de({brightness:"dark",highContrast:false,meta:{displayName:"Everfur",logoUrl:null,placeholder:null,hidePoweredBy:false},color:Vt,space:rr,radius:tr,type:nr(),motion:ir,slots:or});var sr=Symbol.for("@everfur/sdk#EverfurThemeContext@v1"),lr=globalThis,ce=lr[sr]??(lr[sr]=react.createContext(ar));ce.displayName??="EverfurThemeContext";function fe(){return react.useContext(ce)}n(fe,"useEverfurTheme");var ur=Object.freeze({regular:"regular",medium:"medium",bold:"bold",mono:"regular",monoMedium:"medium",monoBold:"bold"});var dr='system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',Pt="System";function zt(e){let r=e.trim();return r.length===0||r===Pt?dr:`${cr(r)}, ${dr}`}n(zt,"cssFontFamily");function jt(e){let r=e.trim();return r.length===0||r==="monospace"?"ui-monospace, Menlo, Consolas, monospace":`${cr(r)}, ui-monospace, Menlo, Consolas, monospace`}n(jt,"cssMonoFamily");function cr(e){return `"${e.replace(/[\\"]/g,"\\$&")}"`}n(cr,"quote");function fr(e,r){let t=e.type,o=t.families[r];return {fontFamily:r==="mono"||r==="monoMedium"||r==="monoBold"?jt(o):zt(o),fontWeight:t.namedFaces[r]?t.weight.regular:t.weight[ur[r]]}}n(fr,"faceCss");var pr=44,Mt=.6;function Lt(e){let{petRef:r,children:t,onOpened:o,onError:i,style:a,className:u,controller:l,returnTo:s,usState:c,entry:E,visitRef:v,intent:y,onStartInApp:d,prefer:m}=e,g=se({...s!==void 0?{returnTo:s}:{},...c!==void 0?{usState:c}:{},...E!==void 0?{entry:E}:{},...r!==void 0?{petRef:r}:{},...l!==void 0?{controller:l}:{}}),p=fe(),k=react.useMemo(()=>Ut(p),[p]),C=react.useRef(false);if(!g.available)return null;let R=g.status==="opening",V=v!=null,x=m==="redirect"||V,h=!x&&d!==void 0,I=!x&&!h&&Q();return jsxRuntime.jsx("button",{type:"button",onClick:n(()=>{if(!(R||C.current)){if(h){H(d);return}I&&X({...r!==void 0?{petRef:r}:{},...c!==void 0?{usState:c}:{}})||(C.current=true,(v==null?g.open():g.openVisit(v,y??null)).then(f=>{f.opened?H(o,f.flowId??null):f.reason!=="cancelled"&&H(i,f.reason,f.error);}).finally(()=>{C.current=false;}));}},"onClick"),"aria-busy":R,"aria-disabled":R,className:u,style:{...k,...R?{opacity:Mt,cursor:"progress"}:null,...a},children:t??Je.visitButton})}n(Lt,"VetVisitButton");function Ut(e){let{color:r,space:t,radius:o,type:i,slots:a}=e;return {boxSizing:"border-box",minHeight:pr,minWidth:pr,display:"inline-flex",alignItems:"center",justifyContent:"center",margin:0,border:0,cursor:"pointer",padding:`${t.sm}px ${t.xl}px`,borderRadius:o.pill,backgroundColor:r.primary,color:r.onPrimary,...fr(e,"medium"),fontSize:i.size.body,...Xe(a.vetVisitButton),...Qe(a.vetVisitButton)}}n(Ut,"buttonStyle");exports.VET_VISIT_INTENTS=L;exports.VetVisitButton=Lt;exports.hasEverfurTelevetFlow=Q;exports.isVetVisitIntent=U;exports.parseVetVisitReturn=nt;exports.presentEverfurTelevetFlow=X;exports.registerEverfurTelevetFlow=mr;exports.useVetVisit=se;exports.vetVisitErrorReasonOf=B;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { P as PetRef } from '../../ids-B2GAAifq.cjs';
|
|
2
|
+
export { B as Brand, _ as __brand } from '../../ids-B2GAAifq.cjs';
|
|
3
|
+
import { U as UseVetVisitOptions, a as UseVetVisitState, V as VetVisitEntry, b as VetVisitErrorReason, c as VetVisitController } from '../../useVetVisit-Bc84hWUU.cjs';
|
|
4
|
+
export { d as VetVisitAvailability, e as VetVisitHandoff, f as VetVisitHandoffOptions, g as VetVisitHandoffVisit, h as VetVisitOpenResult, i as VetVisitReturn, j as VetVisitStatus, p as parseVetVisitReturn, v as vetVisitErrorReasonOf } from '../../useVetVisit-Bc84hWUU.cjs';
|
|
5
|
+
import { ReactNode, CSSProperties } from 'react';
|
|
6
|
+
import { E as EverfurError } from '../../EverfurResult-DN9pL2Ab.cjs';
|
|
7
|
+
export { a as EverfurErrorCategory, b as EverfurErrorCode, c as EverfurResult } from '../../EverfurResult-DN9pL2Ab.cjs';
|
|
8
|
+
import { V as VetVisitIntent } from '../../visitIntent-D7_yVp1I.cjs';
|
|
9
|
+
export { a as VET_VISIT_INTENTS, i as isVetVisitIntent } from '../../visitIntent-D7_yVp1I.cjs';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* What the button hands the host when it opens the in-page visit.
|
|
13
|
+
*
|
|
14
|
+
* Deliberately the scoping the BUTTON was given and nothing more. The host already holds the session, the
|
|
15
|
+
* theme and the router; what it cannot know is which pet and which state this particular button was placed
|
|
16
|
+
* for, so that, and only that, travels. Identical to the RN twin's request, so one host-side presenter
|
|
17
|
+
* satisfies both.
|
|
18
|
+
*/
|
|
19
|
+
interface EverfurTelevetFlowRequest {
|
|
20
|
+
/** The pet this button was scoped to, when it was scoped to one. */
|
|
21
|
+
readonly petRef?: PetRef | null | undefined;
|
|
22
|
+
/** The member's US state, when the host gave one. The booking screens preflight availability with it. */
|
|
23
|
+
readonly usState?: string | null | undefined;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The host's presenter: show the Everfur booking flow. Called on click, and expected to route or present.
|
|
27
|
+
*
|
|
28
|
+
* It returns nothing. The button is not waiting on it and has nothing to do with the result: presenting a
|
|
29
|
+
* screen is the host's business, and a presenter that throws is contained (see `presentEverfurTelevetFlow`)
|
|
30
|
+
* rather than allowed to break the click.
|
|
31
|
+
*/
|
|
32
|
+
type EverfurTelevetFlowPresenter = (request: EverfurTelevetFlowRequest) => void;
|
|
33
|
+
/**
|
|
34
|
+
* Register how this site presents the in-page vet visit. Call it ONCE, in your app entry:
|
|
35
|
+
*
|
|
36
|
+
* ```ts
|
|
37
|
+
* import { registerEverfurTelevetFlow } from '@everfur/sdk/web/televet';
|
|
38
|
+
* registerEverfurTelevetFlow(() => router.push('/vet/book'));
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* From that line on, every `VetVisitButton` on the site opens your screen instead of a new tab, with no other
|
|
42
|
+
* change at any call site. Passing `null` unregisters it, which is what a test does between cases and what a
|
|
43
|
+
* partner does to go back to the hosted visit everywhere at once.
|
|
44
|
+
*/
|
|
45
|
+
declare function registerEverfurTelevetFlow(next: EverfurTelevetFlowPresenter | null): void;
|
|
46
|
+
/** Is an in-page flow registered? The button asks this to choose its destination before it mints anything. */
|
|
47
|
+
declare function hasEverfurTelevetFlow(): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Present the registered flow. Answers whether the visit was HANDED OVER, which is what lets the caller fall
|
|
50
|
+
* through to the hosted handoff rather than leave the member on a screen that never opened.
|
|
51
|
+
*
|
|
52
|
+
* A THROWING PRESENTER IS NOT A DEAD BUTTON. A host router can throw (a route that was renamed, a modal
|
|
53
|
+
* controller that unmounted), and the member clicking the button has no idea any of that happened. So a throw
|
|
54
|
+
* is caught and reported as "not handed over", and the caller then mints and opens the hosted visit: the
|
|
55
|
+
* member reaches a vet either way, which is the floor this whole file is built around.
|
|
56
|
+
*
|
|
57
|
+
* THE THROW IS NOT SWALLOWED. It is re-surfaced to the partner's engineer through the console, because a
|
|
58
|
+
* router that throws on every click is a defect in their site that they need to see. The message is
|
|
59
|
+
* developer-facing and is never rendered: end-user copy is not authored in this repository.
|
|
60
|
+
*
|
|
61
|
+
* ONE COST OF THE FALL-THROUGH, STATED PLAINLY. The hosted path needs the click's own task to open its tab
|
|
62
|
+
* (see useVetVisit.ts), and a presenter that throws has already spent part of that task. The synchronous
|
|
63
|
+
* `window.open` still runs in the same task, so the fall-through keeps the gesture; what it cannot keep is a
|
|
64
|
+
* gesture a presenter consumed by awaiting something. A presenter is documented as synchronous for that
|
|
65
|
+
* reason: it routes, it does not fetch.
|
|
66
|
+
*/
|
|
67
|
+
declare function presentEverfurTelevetFlow(request: EverfurTelevetFlowRequest): boolean;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* The vet visit hook for a web page. Render your own control and call `open()` directly from its click
|
|
71
|
+
* handler; `available` is false (render nothing) unless Everfur grants vet visits to this signed-in user.
|
|
72
|
+
* Requires a signed session: pass `user` with a `getToken` backed by your server's session mint.
|
|
73
|
+
*/
|
|
74
|
+
declare function useVetVisit(opts?: UseVetVisitOptions): UseVetVisitState;
|
|
75
|
+
|
|
76
|
+
interface VetVisitButtonProps {
|
|
77
|
+
/** The partner's pet reference to scope the visit to. Optional. */
|
|
78
|
+
readonly petRef?: PetRef | null | undefined;
|
|
79
|
+
/** The button label. Defaults to Everfur's label. */
|
|
80
|
+
readonly children?: ReactNode;
|
|
81
|
+
/** Called after the visit tab is navigated to Everfur, with the return flow id when `returnTo` was given. */
|
|
82
|
+
readonly onOpened?: ((flowId: string | null) => void) | undefined;
|
|
83
|
+
/** The KEY of a return destination your tenant registered with Everfur; `onOpened` then receives the flow id. */
|
|
84
|
+
readonly returnTo?: string | null | undefined;
|
|
85
|
+
/** The user's US state. When set, the button renders only once Everfur confirms a visit is available there. */
|
|
86
|
+
readonly usState?: string | null | undefined;
|
|
87
|
+
/** `'chat'` for the entry inside Chat: renders only while Everfur has it switched on, and needs `petRef`. */
|
|
88
|
+
readonly entry?: VetVisitEntry | null | undefined;
|
|
89
|
+
/**
|
|
90
|
+
* TV-01. A visit this member already has. The button then OPENS that visit rather than starting a booking:
|
|
91
|
+
* put the `visitRef` a tapped push carries here. Without it the button books, exactly as before.
|
|
92
|
+
*/
|
|
93
|
+
readonly visitRef?: string | null | undefined;
|
|
94
|
+
/** What to open for `visitRef`: `visit` (the default), `join`, `summary` or `messages`. */
|
|
95
|
+
readonly intent?: VetVisitIntent | null | undefined;
|
|
96
|
+
/** Called when the visit could not be opened. `error` is null for a browser-side failure (a blocked tab). */
|
|
97
|
+
readonly onError?: ((reason: VetVisitErrorReason, error: EverfurError | null) => void) | undefined;
|
|
98
|
+
/**
|
|
99
|
+
* Open the IN-PAGE booking flow (`EverfurTelevet`) for THIS button, instead of handing off to the hosted
|
|
100
|
+
* visit.
|
|
101
|
+
*
|
|
102
|
+
* PER-BUTTON, AND MORE SPECIFIC THAN THE REGISTRY. The flow is a component the host mounts, and the SDK
|
|
103
|
+
* owns no router, so the host is the only thing that can say where it lives: which is why this is a
|
|
104
|
+
* callback and not a `mode` flag the button could not honour. Use it for one button that routes somewhere
|
|
105
|
+
* of its own; use `registerEverfurTelevetFlow` for the site-wide default.
|
|
106
|
+
*
|
|
107
|
+
* `visitRef` still wins over it: a click that names an existing visit opens THAT visit, and there is no
|
|
108
|
+
* in-page surface for one yet. Sending an owner into a fresh booking funnel because they followed a
|
|
109
|
+
* reminder for the visit they already have is the wrong screen, loudly.
|
|
110
|
+
*/
|
|
111
|
+
readonly onStartInApp?: (() => void) | undefined;
|
|
112
|
+
/**
|
|
113
|
+
* Which destination a click takes. Defaults to `'in-app'`.
|
|
114
|
+
*
|
|
115
|
+
* `'in-app'` opens the flow this site registered with `registerEverfurTelevetFlow`; with nothing registered
|
|
116
|
+
* there is no flow to open, so the click mints and opens the hosted visit in a new tab exactly as it did
|
|
117
|
+
* before. That is the floor: a site that upgrades and changes nothing keeps a working button, and the
|
|
118
|
+
* member always reaches a vet.
|
|
119
|
+
*
|
|
120
|
+
* `'redirect'` is the explicit opt-in back to the hosted handoff. It ignores the registry entirely, which
|
|
121
|
+
* is what a partner wants for a surface they deliberately keep hosted.
|
|
122
|
+
*
|
|
123
|
+
* `visitRef` still wins over both: a click that names an existing visit opens THAT visit.
|
|
124
|
+
*/
|
|
125
|
+
readonly prefer?: 'in-app' | 'redirect' | undefined;
|
|
126
|
+
/** Merged over the button's own style. */
|
|
127
|
+
readonly style?: CSSProperties | undefined;
|
|
128
|
+
/** A class the host may hang its own layout rules on; the SDK sets no classes of its own. */
|
|
129
|
+
readonly className?: string | undefined;
|
|
130
|
+
/** Host/test seam: inject a controller instead of building one from the provider's session. */
|
|
131
|
+
readonly controller?: VetVisitController | undefined;
|
|
132
|
+
}
|
|
133
|
+
/** Opens the Everfur vet visit, in the partner's own page by default. Renders nothing unless it is granted. */
|
|
134
|
+
declare function VetVisitButton(props: VetVisitButtonProps): ReactNode;
|
|
135
|
+
|
|
136
|
+
export { EverfurError, type EverfurTelevetFlowPresenter, type EverfurTelevetFlowRequest, PetRef, UseVetVisitOptions, UseVetVisitState, VetVisitButton, type VetVisitButtonProps, VetVisitController, VetVisitEntry, VetVisitErrorReason, VetVisitIntent, hasEverfurTelevetFlow, presentEverfurTelevetFlow, registerEverfurTelevetFlow, useVetVisit };
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { P as PetRef } from '../../ids-B2GAAifq.js';
|
|
2
|
+
export { B as Brand, _ as __brand } from '../../ids-B2GAAifq.js';
|
|
3
|
+
import { U as UseVetVisitOptions, a as UseVetVisitState, V as VetVisitEntry, b as VetVisitErrorReason, c as VetVisitController } from '../../useVetVisit-CjmMa896.js';
|
|
4
|
+
export { d as VetVisitAvailability, e as VetVisitHandoff, f as VetVisitHandoffOptions, g as VetVisitHandoffVisit, h as VetVisitOpenResult, i as VetVisitReturn, j as VetVisitStatus, p as parseVetVisitReturn, v as vetVisitErrorReasonOf } from '../../useVetVisit-CjmMa896.js';
|
|
5
|
+
import { ReactNode, CSSProperties } from 'react';
|
|
6
|
+
import { E as EverfurError } from '../../EverfurResult-DN9pL2Ab.js';
|
|
7
|
+
export { a as EverfurErrorCategory, b as EverfurErrorCode, c as EverfurResult } from '../../EverfurResult-DN9pL2Ab.js';
|
|
8
|
+
import { V as VetVisitIntent } from '../../visitIntent-D7_yVp1I.js';
|
|
9
|
+
export { a as VET_VISIT_INTENTS, i as isVetVisitIntent } from '../../visitIntent-D7_yVp1I.js';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* What the button hands the host when it opens the in-page visit.
|
|
13
|
+
*
|
|
14
|
+
* Deliberately the scoping the BUTTON was given and nothing more. The host already holds the session, the
|
|
15
|
+
* theme and the router; what it cannot know is which pet and which state this particular button was placed
|
|
16
|
+
* for, so that, and only that, travels. Identical to the RN twin's request, so one host-side presenter
|
|
17
|
+
* satisfies both.
|
|
18
|
+
*/
|
|
19
|
+
interface EverfurTelevetFlowRequest {
|
|
20
|
+
/** The pet this button was scoped to, when it was scoped to one. */
|
|
21
|
+
readonly petRef?: PetRef | null | undefined;
|
|
22
|
+
/** The member's US state, when the host gave one. The booking screens preflight availability with it. */
|
|
23
|
+
readonly usState?: string | null | undefined;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The host's presenter: show the Everfur booking flow. Called on click, and expected to route or present.
|
|
27
|
+
*
|
|
28
|
+
* It returns nothing. The button is not waiting on it and has nothing to do with the result: presenting a
|
|
29
|
+
* screen is the host's business, and a presenter that throws is contained (see `presentEverfurTelevetFlow`)
|
|
30
|
+
* rather than allowed to break the click.
|
|
31
|
+
*/
|
|
32
|
+
type EverfurTelevetFlowPresenter = (request: EverfurTelevetFlowRequest) => void;
|
|
33
|
+
/**
|
|
34
|
+
* Register how this site presents the in-page vet visit. Call it ONCE, in your app entry:
|
|
35
|
+
*
|
|
36
|
+
* ```ts
|
|
37
|
+
* import { registerEverfurTelevetFlow } from '@everfur/sdk/web/televet';
|
|
38
|
+
* registerEverfurTelevetFlow(() => router.push('/vet/book'));
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* From that line on, every `VetVisitButton` on the site opens your screen instead of a new tab, with no other
|
|
42
|
+
* change at any call site. Passing `null` unregisters it, which is what a test does between cases and what a
|
|
43
|
+
* partner does to go back to the hosted visit everywhere at once.
|
|
44
|
+
*/
|
|
45
|
+
declare function registerEverfurTelevetFlow(next: EverfurTelevetFlowPresenter | null): void;
|
|
46
|
+
/** Is an in-page flow registered? The button asks this to choose its destination before it mints anything. */
|
|
47
|
+
declare function hasEverfurTelevetFlow(): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Present the registered flow. Answers whether the visit was HANDED OVER, which is what lets the caller fall
|
|
50
|
+
* through to the hosted handoff rather than leave the member on a screen that never opened.
|
|
51
|
+
*
|
|
52
|
+
* A THROWING PRESENTER IS NOT A DEAD BUTTON. A host router can throw (a route that was renamed, a modal
|
|
53
|
+
* controller that unmounted), and the member clicking the button has no idea any of that happened. So a throw
|
|
54
|
+
* is caught and reported as "not handed over", and the caller then mints and opens the hosted visit: the
|
|
55
|
+
* member reaches a vet either way, which is the floor this whole file is built around.
|
|
56
|
+
*
|
|
57
|
+
* THE THROW IS NOT SWALLOWED. It is re-surfaced to the partner's engineer through the console, because a
|
|
58
|
+
* router that throws on every click is a defect in their site that they need to see. The message is
|
|
59
|
+
* developer-facing and is never rendered: end-user copy is not authored in this repository.
|
|
60
|
+
*
|
|
61
|
+
* ONE COST OF THE FALL-THROUGH, STATED PLAINLY. The hosted path needs the click's own task to open its tab
|
|
62
|
+
* (see useVetVisit.ts), and a presenter that throws has already spent part of that task. The synchronous
|
|
63
|
+
* `window.open` still runs in the same task, so the fall-through keeps the gesture; what it cannot keep is a
|
|
64
|
+
* gesture a presenter consumed by awaiting something. A presenter is documented as synchronous for that
|
|
65
|
+
* reason: it routes, it does not fetch.
|
|
66
|
+
*/
|
|
67
|
+
declare function presentEverfurTelevetFlow(request: EverfurTelevetFlowRequest): boolean;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* The vet visit hook for a web page. Render your own control and call `open()` directly from its click
|
|
71
|
+
* handler; `available` is false (render nothing) unless Everfur grants vet visits to this signed-in user.
|
|
72
|
+
* Requires a signed session: pass `user` with a `getToken` backed by your server's session mint.
|
|
73
|
+
*/
|
|
74
|
+
declare function useVetVisit(opts?: UseVetVisitOptions): UseVetVisitState;
|
|
75
|
+
|
|
76
|
+
interface VetVisitButtonProps {
|
|
77
|
+
/** The partner's pet reference to scope the visit to. Optional. */
|
|
78
|
+
readonly petRef?: PetRef | null | undefined;
|
|
79
|
+
/** The button label. Defaults to Everfur's label. */
|
|
80
|
+
readonly children?: ReactNode;
|
|
81
|
+
/** Called after the visit tab is navigated to Everfur, with the return flow id when `returnTo` was given. */
|
|
82
|
+
readonly onOpened?: ((flowId: string | null) => void) | undefined;
|
|
83
|
+
/** The KEY of a return destination your tenant registered with Everfur; `onOpened` then receives the flow id. */
|
|
84
|
+
readonly returnTo?: string | null | undefined;
|
|
85
|
+
/** The user's US state. When set, the button renders only once Everfur confirms a visit is available there. */
|
|
86
|
+
readonly usState?: string | null | undefined;
|
|
87
|
+
/** `'chat'` for the entry inside Chat: renders only while Everfur has it switched on, and needs `petRef`. */
|
|
88
|
+
readonly entry?: VetVisitEntry | null | undefined;
|
|
89
|
+
/**
|
|
90
|
+
* TV-01. A visit this member already has. The button then OPENS that visit rather than starting a booking:
|
|
91
|
+
* put the `visitRef` a tapped push carries here. Without it the button books, exactly as before.
|
|
92
|
+
*/
|
|
93
|
+
readonly visitRef?: string | null | undefined;
|
|
94
|
+
/** What to open for `visitRef`: `visit` (the default), `join`, `summary` or `messages`. */
|
|
95
|
+
readonly intent?: VetVisitIntent | null | undefined;
|
|
96
|
+
/** Called when the visit could not be opened. `error` is null for a browser-side failure (a blocked tab). */
|
|
97
|
+
readonly onError?: ((reason: VetVisitErrorReason, error: EverfurError | null) => void) | undefined;
|
|
98
|
+
/**
|
|
99
|
+
* Open the IN-PAGE booking flow (`EverfurTelevet`) for THIS button, instead of handing off to the hosted
|
|
100
|
+
* visit.
|
|
101
|
+
*
|
|
102
|
+
* PER-BUTTON, AND MORE SPECIFIC THAN THE REGISTRY. The flow is a component the host mounts, and the SDK
|
|
103
|
+
* owns no router, so the host is the only thing that can say where it lives: which is why this is a
|
|
104
|
+
* callback and not a `mode` flag the button could not honour. Use it for one button that routes somewhere
|
|
105
|
+
* of its own; use `registerEverfurTelevetFlow` for the site-wide default.
|
|
106
|
+
*
|
|
107
|
+
* `visitRef` still wins over it: a click that names an existing visit opens THAT visit, and there is no
|
|
108
|
+
* in-page surface for one yet. Sending an owner into a fresh booking funnel because they followed a
|
|
109
|
+
* reminder for the visit they already have is the wrong screen, loudly.
|
|
110
|
+
*/
|
|
111
|
+
readonly onStartInApp?: (() => void) | undefined;
|
|
112
|
+
/**
|
|
113
|
+
* Which destination a click takes. Defaults to `'in-app'`.
|
|
114
|
+
*
|
|
115
|
+
* `'in-app'` opens the flow this site registered with `registerEverfurTelevetFlow`; with nothing registered
|
|
116
|
+
* there is no flow to open, so the click mints and opens the hosted visit in a new tab exactly as it did
|
|
117
|
+
* before. That is the floor: a site that upgrades and changes nothing keeps a working button, and the
|
|
118
|
+
* member always reaches a vet.
|
|
119
|
+
*
|
|
120
|
+
* `'redirect'` is the explicit opt-in back to the hosted handoff. It ignores the registry entirely, which
|
|
121
|
+
* is what a partner wants for a surface they deliberately keep hosted.
|
|
122
|
+
*
|
|
123
|
+
* `visitRef` still wins over both: a click that names an existing visit opens THAT visit.
|
|
124
|
+
*/
|
|
125
|
+
readonly prefer?: 'in-app' | 'redirect' | undefined;
|
|
126
|
+
/** Merged over the button's own style. */
|
|
127
|
+
readonly style?: CSSProperties | undefined;
|
|
128
|
+
/** A class the host may hang its own layout rules on; the SDK sets no classes of its own. */
|
|
129
|
+
readonly className?: string | undefined;
|
|
130
|
+
/** Host/test seam: inject a controller instead of building one from the provider's session. */
|
|
131
|
+
readonly controller?: VetVisitController | undefined;
|
|
132
|
+
}
|
|
133
|
+
/** Opens the Everfur vet visit, in the partner's own page by default. Renders nothing unless it is granted. */
|
|
134
|
+
declare function VetVisitButton(props: VetVisitButtonProps): ReactNode;
|
|
135
|
+
|
|
136
|
+
export { EverfurError, type EverfurTelevetFlowPresenter, type EverfurTelevetFlowRequest, PetRef, UseVetVisitOptions, UseVetVisitState, VetVisitButton, type VetVisitButtonProps, VetVisitController, VetVisitEntry, VetVisitErrorReason, VetVisitIntent, hasEverfurTelevetFlow, presentEverfurTelevetFlow, registerEverfurTelevetFlow, useVetVisit };
|