@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.
Files changed (219) hide show
  1. package/CHANGELOG.md +703 -4
  2. package/README.md +63 -23
  3. package/consent/package.json +8 -0
  4. package/dist/Chat-BZZ-Py5l.d.ts +128 -0
  5. package/dist/Chat-Dq4fffIO.d.cts +128 -0
  6. package/dist/DepthViews-BG3E25MD.d.ts +16 -0
  7. package/dist/DepthViews-B_hIypI6.d.cts +19 -0
  8. package/dist/DepthViews-CL75jyRA.d.cts +16 -0
  9. package/dist/DepthViews-CkYri51q.d.ts +19 -0
  10. package/dist/ErrorPolicyPort-CNf4uQZP.d.cts +22 -0
  11. package/dist/ErrorPolicyPort-CwbfmxzJ.d.ts +22 -0
  12. package/dist/{EverfurResult-D92-uL82.d.cts → EverfurResult-DN9pL2Ab.d.cts} +11 -10
  13. package/dist/{EverfurResult-D92-uL82.d.ts → EverfurResult-DN9pL2Ab.d.ts} +11 -10
  14. package/dist/{PhotoController-BItt5M7u.d.cts → PhotoController-3l7MT9jA.d.cts} +1 -1
  15. package/dist/{PhotoController-D8zMTdcW.d.ts → PhotoController-vzY5bfY_.d.ts} +1 -1
  16. package/dist/animations/index.cjs +1 -1997
  17. package/dist/animations/index.d.cts +35 -35
  18. package/dist/animations/index.d.ts +35 -35
  19. package/dist/animations/index.js +1 -1972
  20. package/dist/attachments-BorG422I.d.cts +146 -0
  21. package/dist/attachments-BrUWQYNK.d.ts +257 -0
  22. package/dist/attachments-D_SECjr1.d.cts +257 -0
  23. package/dist/attachments-DpldrvIW.d.ts +146 -0
  24. package/dist/bookingCopy-CqtDYvCR.d.ts +732 -0
  25. package/dist/bookingCopy-SREvkG19.d.cts +732 -0
  26. package/dist/branding-CsRdeNwK.d.cts +566 -0
  27. package/dist/branding-CsRdeNwK.d.ts +566 -0
  28. package/dist/callCopy-DoQKG3-L.d.cts +40 -0
  29. package/dist/callCopy-DoQKG3-L.d.ts +40 -0
  30. package/dist/casesRepository-DwtZVsbj.d.cts +51 -0
  31. package/dist/casesRepository-v6QczS9N.d.ts +51 -0
  32. package/dist/chat/index.cjs +1 -1170
  33. package/dist/chat/index.d.cts +32 -53
  34. package/dist/chat/index.d.ts +32 -53
  35. package/dist/chat/index.js +1 -1167
  36. package/dist/client/index.cjs +9 -2315
  37. package/dist/client/index.d.cts +80 -16
  38. package/dist/client/index.d.ts +80 -16
  39. package/dist/client/index.js +9 -2215
  40. package/dist/{config-CiJ0PVBB.d.ts → config--Wu1Umhd.d.cts} +64 -26
  41. package/dist/{config-BSjBdxrZ.d.cts → config-C7eb_IMD.d.ts} +64 -26
  42. package/dist/consent/index.cjs +1 -0
  43. package/dist/consent/index.d.cts +33 -0
  44. package/dist/consent/index.d.ts +33 -0
  45. package/dist/consent/index.js +1 -0
  46. package/dist/context-CL3lyuy1.d.cts +159 -0
  47. package/dist/context-CahAEha8.d.ts +159 -0
  48. package/dist/copy-DdVFDL01.d.ts +198 -0
  49. package/dist/copy-UeUJVk8X.d.cts +198 -0
  50. package/dist/core/index.cjs +13 -3178
  51. package/dist/core/index.d.cts +164 -29
  52. package/dist/core/index.d.ts +164 -29
  53. package/dist/core/index.js +13 -3166
  54. package/dist/depth-D5HwcvKC.d.cts +533 -0
  55. package/dist/depth-DvPwPuT_.d.ts +533 -0
  56. package/dist/entitlementRepository-B7egEdW6.d.ts +43 -0
  57. package/dist/entitlementRepository-BpJ7tiwl.d.cts +43 -0
  58. package/dist/{identity-Brl-lDd6.d.cts → identity-C2-08BZW.d.cts} +20 -7
  59. package/dist/{identity-DK9zORrG.d.ts → identity-CEi9GRFZ.d.ts} +20 -7
  60. package/dist/{ids-CJ1S6adf.d.cts → ids-B2GAAifq.d.cts} +1 -1
  61. package/dist/{ids-CJ1S6adf.d.ts → ids-B2GAAifq.d.ts} +1 -1
  62. package/dist/index.cjs +12 -4494
  63. package/dist/index.d.cts +30 -121
  64. package/dist/index.d.ts +30 -121
  65. package/dist/index.js +12 -4470
  66. package/dist/models-B-Uh2LTf.d.ts +214 -0
  67. package/dist/models-D2EUxPZY.d.cts +214 -0
  68. package/dist/notifications/index.cjs +2 -0
  69. package/dist/notifications/index.d.cts +17 -0
  70. package/dist/notifications/index.d.ts +17 -0
  71. package/dist/notifications/index.js +2 -0
  72. package/dist/optionalModule-DbJmsq5f.d.cts +21 -0
  73. package/dist/optionalModule-DbJmsq5f.d.ts +21 -0
  74. package/dist/pets-DJv2sj2H.d.ts +92 -0
  75. package/dist/pets-JVCXgRgR.d.cts +92 -0
  76. package/dist/petsRepository-B_gKbAzJ.d.cts +142 -0
  77. package/dist/petsRepository-Bk6GDwLs.d.ts +142 -0
  78. package/dist/photo/index.cjs +1 -2189
  79. package/dist/photo/index.d.cts +6 -6
  80. package/dist/photo/index.d.ts +6 -6
  81. package/dist/photo/index.js +1 -2186
  82. package/dist/ports-BN6RHF9W.d.cts +48 -0
  83. package/dist/ports-BN6RHF9W.d.ts +48 -0
  84. package/dist/ports-BY2ph0_y.d.cts +376 -0
  85. package/dist/ports-D7YW8qz9.d.ts +376 -0
  86. package/dist/profile-CSs1wlXT.d.cts +93 -0
  87. package/dist/profile-CSs1wlXT.d.ts +93 -0
  88. package/dist/records/depth/index.cjs +2 -0
  89. package/dist/records/depth/index.d.cts +13 -0
  90. package/dist/records/depth/index.d.ts +13 -0
  91. package/dist/records/depth/index.js +2 -0
  92. package/dist/records/index.cjs +3 -2839
  93. package/dist/records/index.d.cts +137 -203
  94. package/dist/records/index.d.ts +137 -203
  95. package/dist/records/index.js +3 -2833
  96. package/dist/requestFunnel-BjDpqqvm.d.cts +110 -0
  97. package/dist/requestFunnel-DFMGcluw.d.ts +110 -0
  98. package/dist/{resolve-Dq_4_agU.d.ts → resolve-D4Ywz5OS.d.cts} +10 -4
  99. package/dist/{resolve-Dq_4_agU.d.cts → resolve-D4Ywz5OS.d.ts} +10 -4
  100. package/dist/{runtime-Bvr8yqXm.d.cts → runtimeTypes-gZEJu-da.d.cts} +104 -132
  101. package/dist/{runtime-BIYzf9cK.d.ts → runtimeTypes-w5KqBMcs.d.ts} +104 -132
  102. package/dist/server/events/index.cjs +2 -0
  103. package/dist/server/events/index.d.cts +550 -0
  104. package/dist/server/events/index.d.ts +550 -0
  105. package/dist/server/events/index.js +2 -0
  106. package/dist/server/index.cjs +2 -533
  107. package/dist/server/index.d.cts +73 -18
  108. package/dist/server/index.d.ts +73 -18
  109. package/dist/server/index.js +2 -530
  110. package/dist/species-BXAIMh7I.d.cts +9 -0
  111. package/dist/species-BXAIMh7I.d.ts +9 -0
  112. package/dist/televet/booking/index.cjs +1 -0
  113. package/dist/televet/booking/index.d.cts +294 -0
  114. package/dist/televet/booking/index.d.ts +294 -0
  115. package/dist/televet/booking/index.js +1 -0
  116. package/dist/televet/call/index.cjs +1 -0
  117. package/dist/televet/call/index.d.cts +141 -0
  118. package/dist/televet/call/index.d.ts +141 -0
  119. package/dist/televet/call/index.js +1 -0
  120. package/dist/televet/index.cjs +1 -0
  121. package/dist/televet/index.d.cts +142 -0
  122. package/dist/televet/index.d.ts +142 -0
  123. package/dist/televet/index.js +1 -0
  124. package/dist/testing/index.cjs +5 -823
  125. package/dist/testing/index.d.cts +18 -4
  126. package/dist/testing/index.d.ts +18 -4
  127. package/dist/testing/index.js +5 -820
  128. package/dist/testing/rn/index.cjs +1 -449
  129. package/dist/testing/rn/index.d.cts +18 -29
  130. package/dist/testing/rn/index.d.ts +18 -29
  131. package/dist/testing/rn/index.js +1 -444
  132. package/dist/testing/web/index.cjs +1 -0
  133. package/dist/testing/web/index.d.cts +132 -0
  134. package/dist/testing/web/index.d.ts +132 -0
  135. package/dist/testing/web/index.js +1 -0
  136. package/dist/timelineRows-C15jxFFH.d.ts +19 -0
  137. package/dist/timelineRows-odO8g9r2.d.cts +19 -0
  138. package/dist/typeStyle-CKqVYD6L.d.cts +111 -0
  139. package/dist/typeStyle-DmoyacDG.d.ts +111 -0
  140. package/dist/uploadTransport-D0M0T4hN.d.ts +38 -0
  141. package/dist/uploadTransport-DKJHs3Yj.d.cts +38 -0
  142. package/dist/useRecordsDepth-C6rjEaLn.d.cts +237 -0
  143. package/dist/useRecordsDepth-crhBllQK.d.ts +237 -0
  144. package/dist/useVetVisit-Bc84hWUU.d.cts +187 -0
  145. package/dist/useVetVisit-CjmMa896.d.ts +187 -0
  146. package/dist/video/index.cjs +1 -1941
  147. package/dist/video/index.d.cts +4 -4
  148. package/dist/video/index.d.ts +4 -4
  149. package/dist/video/index.js +1 -1938
  150. package/dist/view-Bxwxp4xD.d.ts +310 -0
  151. package/dist/view-DyitEO0m.d.cts +310 -0
  152. package/dist/visitIntent-D7_yVp1I.d.cts +8 -0
  153. package/dist/visitIntent-D7_yVp1I.d.ts +8 -0
  154. package/dist/web/consent/index.cjs +1 -0
  155. package/dist/web/consent/index.d.cts +34 -0
  156. package/dist/web/consent/index.d.ts +34 -0
  157. package/dist/web/consent/index.js +1 -0
  158. package/dist/web/index.cjs +14 -0
  159. package/dist/web/index.d.cts +218 -0
  160. package/dist/web/index.d.ts +218 -0
  161. package/dist/web/index.js +14 -0
  162. package/dist/web/notifications/index.cjs +2 -0
  163. package/dist/web/notifications/index.d.cts +213 -0
  164. package/dist/web/notifications/index.d.ts +213 -0
  165. package/dist/web/notifications/index.js +2 -0
  166. package/dist/web/records/depth/index.cjs +2 -0
  167. package/dist/web/records/depth/index.d.cts +12 -0
  168. package/dist/web/records/depth/index.d.ts +12 -0
  169. package/dist/web/records/depth/index.js +2 -0
  170. package/dist/web/records/index.cjs +4 -0
  171. package/dist/web/records/index.d.cts +285 -0
  172. package/dist/web/records/index.d.ts +285 -0
  173. package/dist/web/records/index.js +4 -0
  174. package/dist/web/televet/booking/index.cjs +1 -0
  175. package/dist/web/televet/booking/index.d.cts +349 -0
  176. package/dist/web/televet/booking/index.d.ts +349 -0
  177. package/dist/web/televet/booking/index.js +1 -0
  178. package/dist/web/televet/call/index.cjs +1 -0
  179. package/dist/web/televet/call/index.d.cts +142 -0
  180. package/dist/web/televet/call/index.d.ts +142 -0
  181. package/dist/web/televet/call/index.js +1 -0
  182. package/dist/web/televet/index.cjs +1 -0
  183. package/dist/web/televet/index.d.cts +136 -0
  184. package/dist/web/televet/index.d.ts +136 -0
  185. package/dist/web/televet/index.js +1 -0
  186. package/notifications/package.json +8 -0
  187. package/package.json +266 -10
  188. package/records/depth/package.json +8 -0
  189. package/server/events/device-blocked.cjs +15 -0
  190. package/server/events/package.json +9 -0
  191. package/televet/booking/package.json +8 -0
  192. package/televet/call/package.json +8 -0
  193. package/televet/package.json +8 -0
  194. package/testing/web/native-blocked.cjs +12 -0
  195. package/testing/web/package.json +8 -0
  196. package/web/consent/native-blocked.cjs +12 -0
  197. package/web/consent/package.json +8 -0
  198. package/web/native-blocked.cjs +12 -0
  199. package/web/notifications/native-blocked.cjs +12 -0
  200. package/web/notifications/package.json +8 -0
  201. package/web/package.json +8 -0
  202. package/web/records/depth/native-blocked.cjs +12 -0
  203. package/web/records/depth/package.json +8 -0
  204. package/web/records/native-blocked.cjs +12 -0
  205. package/web/records/package.json +8 -0
  206. package/web/televet/booking/native-blocked.cjs +12 -0
  207. package/web/televet/booking/package.json +8 -0
  208. package/web/televet/call/native-blocked.cjs +12 -0
  209. package/web/televet/call/package.json +8 -0
  210. package/web/televet/native-blocked.cjs +12 -0
  211. package/web/televet/package.json +8 -0
  212. package/dist/ChatController-CKdBvPj2.d.ts +0 -146
  213. package/dist/ChatController-CpUMvvZf.d.cts +0 -146
  214. package/dist/FilePort-BabWrv7I.d.cts +0 -22
  215. package/dist/FilePort-BabWrv7I.d.ts +0 -22
  216. package/dist/petsRepository-BEGb97M9.d.cts +0 -326
  217. package/dist/petsRepository-Bu18r2kK.d.ts +0 -326
  218. package/dist/requestFunnel-DuUH-kAe.d.cts +0 -28
  219. package/dist/requestFunnel-dio5OmR9.d.ts +0 -28
@@ -1,825 +1,7 @@
1
- 'use strict';
1
+ 'use strict';var zod=require('zod');var oe=Object.defineProperty;var n=(e,t)=>oe(e,"name",{value:t,configurable:true});function O(e,t){return Object.freeze(t===void 0?{ok:true,value:e}:{ok:true,value:e,warning:t})}n(O,"ok");function C(e){return Object.freeze({ok:false,error:e})}n(C,"err");var v=class v extends Error{constructor(t,r){super(r),this.name="EverfurConfigError",this.kind=t,Object.setPrototypeOf(this,v.prototype);}};n(v,"EverfurConfigError");var p=v;var ae=["DELETE /widget/v1/me","DELETE /widget/v1/me/devices/{device_id}","POST /widget/v1/me/devices","PUT /widget/v1/me/notification-preferences","DELETE /widget/v1/pets/{pet_ref}","DELETE /widget/v1/records/pets/{pet_ref}/consent","GET /widget/v1/consent","GET /widget/v1/conversations","GET /widget/v1/conversations/{conversation_id}/messages","GET /widget/v1/entitlements","GET /widget/v1/pets","GET /widget/v1/pets/{pet_ref}/cases","POST /widget/v1/pets/{pet_ref}/cases/{case_id}/checkin","POST /widget/v1/conversations/{conversation_id}/read","GET /widget/v1/records/authorization-copy","GET /widget/v1/records/clinics/search","GET /widget/v1/records/clinics/recent","GET /widget/v1/records/pets/{pet_ref}/consent","GET /widget/v1/records/pets/{pet_ref}/documents/{doc_id}/contributions","GET /widget/v1/records/pets/{pet_ref}/record","GET /widget/v1/records/pets/{pet_ref}/timeline","GET /widget/v1/records/pets/{pet_ref}/markers","POST /widget/v1/records/pets/{pet_ref}/everfur_record/share","GET /widget/v1/records/pets/{pet_ref}/everfur_record/shares","DELETE /widget/v1/records/pets/{pet_ref}/everfur_record/shares/{share_id}","GET /widget/v1/records/pets/{pet_ref}/everfur_record/pdf-link","POST /widget/v1/records/pets/{pet_ref}/everfur_record/facts/edit","POST /widget/v1/records/pets/{pet_ref}/everfur_record/facts/remove","GET /widget/v1/records/authorization-signatures","GET /widget/v1/records/request-groups/{request_group_id}","GET /widget/v1/records/requests","GET /widget/v1/records/requests/{request_id}","GET /widget/v1/records/requests/{request_id}/documents","GET /widget/v1/suggested-prompts","PATCH /widget/v1/pets/{pet_ref}","POST /widget/v1/conversations","POST /widget/v1/conversations/{conversation_id}/analyze","POST /widget/v1/conversations/{conversation_id}/classify","POST /widget/v1/conversations/{conversation_id}/messages","POST /widget/v1/messages/{message_id}/feedback","POST /widget/v1/uploads/initiate","POST /widget/v1/pets/{pet_ref}","POST /widget/v1/records/clinic-requests","POST /widget/v1/records/clinic-requests/batch","POST /widget/v1/records/requests","POST /widget/v1/records/requests/{request_id}/clinic-email","POST /widget/v1/records/requests/{request_id}/convert-to-upload","POST /widget/v1/records/requests/{request_id}/retry","POST /widget/v1/records/requests/{request_id}/revoke","POST /widget/v1/records/requests/{request_id}/uploads/complete","POST /widget/v1/records/requests/{request_id}/uploads/initiate","POST /widget/v1/records/sandbox/requests/{request_id}/clinic-reply","POST /widget/v1/records/sandbox/requests/{request_id}/publish-sample","POST /widget/v1/records/signatures/complete","POST /widget/v1/records/signatures/initiate","POST /widget/v1/sessions","POST /widget/v1/televet/handoffs","POST /widget/v1/televet/availability","GET /widget/v1/televet/chat-entry","POST /widget/v1/televet/sandbox/visits","POST /widget/v1/televet/sandbox/visits/{visit_ref}/advance","POST /widget/v1/televet/sandbox/visits/{visit_ref}/simulate","PUT /widget/v1/consent","PUT /widget/v1/records/pets/{pet_ref}/consent"],h=["POST /widget/v1/photo/precheck","POST /widget/v1/photo/analyze","POST /widget/v1/video/analyze","GET /widget/v1/analysis/jobs/{job_id}","GET /widget/v1/pets/{pet_ref}/state","GET /widget/v1/televet/state-policy/{state}","GET /widget/v1/televet/vets","GET /widget/v1/televet/slots","GET /widget/v1/televet/slots/next","POST /widget/v1/televet/slots/{slot_id}/hold","GET /widget/v1/televet/entitlement","GET /widget/v1/televet/cancellation-policy","POST /widget/v1/televet/consults","GET /widget/v1/televet/consults","GET /widget/v1/televet/consults/{consult_id}","POST /widget/v1/televet/consults/{consult_id}/cancel","POST /widget/v1/televet/consults/{consult_id}/reschedule"];function ie(e,t){let r=e.split("/"),[o=""]=t.split("?"),a=o.split("/");return r.length!==a.length?false:r.every((i,l)=>{let s=a[l];return s===void 0?false:i.startsWith("{")&&i.endsWith("}")?s.length>0:i===s})}n(ie,"pathMatches");function k(e,t){let r=n(o=>o.some(a=>{let[i,l]=a.split(" ");return i===void 0||l===void 0?false:i===e.toUpperCase()&&ie(l,t)}),"matches");return r(ae)?"known":r(h)?"absent":"unknown"}n(k,"classifyRoute");var b=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(b.map(e=>e.wireCode));var se=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"}),x=Object.freeze(b.map(e=>Object.freeze({wireCode:e.wireCode,envelope:e.envelope,retryable:e.retryable,normalized:se[e.wireCode]}))),le=new Map(x.map(e=>[e.envelope+e.wireCode.toUpperCase(),e])),de=Object.freeze(["http_envelope",...[...new Set(x.map(e=>e.envelope))].filter(e=>e!=="http_envelope").sort()]);function _(e,t){if(typeof e!="string")return;let r=e.trim().toUpperCase();if(r.length!==0)for(let o of [t??"http_envelope",...de]){let a=le.get(o+r);if(a)return a}}n(_,"contractErrorFor");function ue(e){return e.envelope==="sse_frame"?`/errors#sse-${e.wireCode}`:e.envelope==="oauth_error"?`/errors#oauth-${e.wireCode}`:`/errors#${e.wireCode}`}n(ue,"contractDocUrl");function I(e){return null}n(I,"publishedDocUrl");var ce=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 A(e){return ce[e]}n(A,"categoryFor");function m(e){let t=_(e);if(t)return t.normalized;let r=(e??"").trim().toUpperCase(),o=r.replace(/[^A-Z0-9]/g,"");if(o==="AUTHREJECTED")return "authRejected";if(r.startsWith("AUTH"))return "authExpired";switch(o){case "DAILYQUOTAEXCEEDED":case "QUOTAEXCEEDED":return "quotaExceeded";case "RATELIMITED":case "TOOMANYREQUESTS":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(m,"fromWire");function N(e){return e===401?"authExpired":e===403?"accessDenied":e===404?"conversationNotFound":e===409?"idempotencyConflict":e===421?"unknown":e===429?"rateLimited":e===400||e===422?"unknown":e>=500?"internalError":"unknown"}n(N,"fromHttpStatus");var pe=new Set(["streamTimeout","rateLimited","internalError","upstreamLlmTimeout","streamIncomplete"]);function E(e){return pe.has(e)}n(E,"isAutoRetryable");var fe=new Set(["serviceUnavailable","conflict","idempotencyInFlight"]);function z(e){return E(e)||fe.has(e)}n(z,"isRetryableCode");function L(e){throw new Error(`assertNever: unhandled discriminated-union member ${JSON.stringify(e)}`)}n(L,"assertNever");function P(e,t,r=null){return Object.freeze({kind:"accepted",streamId:e,lastEventId:t,serverRequestId:r,terminal:false})}n(P,"acceptedFrame");function D(e,t=null){return Object.freeze({kind:"heartbeat",lastEventId:e,serverRequestId:t,terminal:false})}n(D,"heartbeatFrame");function j(e,t,r=null){return Object.freeze({kind:"delta",delta:e,lastEventId:t,serverRequestId:r,terminal:false})}n(j,"deltaFrame");function q(e,t=null){return Object.freeze({kind:"done",terminal:true,conversationId:e.conversationId,messageId:e.messageId,title:e.title,followUpQuestions:Object.freeze([...e.followUpQuestions]),citations:Object.freeze([...e.citations]),citationStatus:e.citationStatus,urgencyLevel:e.urgencyLevel,urgencyReason:e.urgencyReason,urgencyProvided:e.urgencyProvided??e.urgencyLevel!==null,resultId:e.resultId,lastEventId:e.lastEventId,serverRequestId:t})}n(q,"doneFrame");function c(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(c,"errorFrame");function U(e,t,r=null){return Object.freeze({kind:"analysisStarted",requestId:e,lastEventId:t,serverRequestId:r,terminal:false})}n(U,"analysisStartedFrame");function M(e,t=null){return Object.freeze({kind:"analysisComplete",terminal:false,resultId:e.resultId,analysisType:e.analysisType,modelVersion:e.modelVersion,confidence:e.confidence,detections:Object.freeze([...e.detections]),interpretation:e.interpretation,lastEventId:e.lastEventId,serverRequestId:t})}n(M,"analysisCompleteFrame");function B(e,t,r=null){return Object.freeze({kind:"unknown",raw:{...e},lastEventId:t,serverRequestId:r,terminal:false})}n(B,"unknownFrame");var G=`
2
2
 
3
- var zod = require('zod');
3
+ `,_e=1048576,me=zod.z.record(zod.z.string(),zod.z.unknown()),Ee=["emergency","schedule_soon","home_care"];async function*f(e,t=null){let r=null,o=n(()=>(r!==null||(r=typeof t=="function"?t():t),r),"requestIdNow"),a=new TextDecoder("utf-8"),i="",l=0,s=false;for await(let u of e){for(i+=a.decode(u,{stream:true});;){let g=i.indexOf(G,l);if(g===-1)break;let ne=i.slice(0,g);i=i.slice(g+G.length),l=0;let y=W(ne,o());if(y!==null&&(y.kind==="delta"&&(s=true),yield y,y.terminal))return}if(l=i.length>0?i.length-1:0,i.length>_e){yield c({code:s?"CHAT_STREAM_INCOMPLETE":"internal_error",retryable:true,wireMessage:null,synthesized:true,lastEventId:null,serverRequestId:o()});return}}if(i+=a.decode(),i.trim().length>0){let u=W(i,o());if(u!==null&&(u.kind==="delta"&&(s=true),yield u,u.terminal))return}yield c({code:s?"CHAT_STREAM_INCOMPLETE":"internal_error",retryable:true,wireMessage:null,synthesized:true,lastEventId:null,serverRequestId:o()});}n(f,"parseSse");function W(e,t){let r=null,o=[];for(let l of e.split(`
4
+ `)){let s=l.replace(/\s+$/,"");s.length===0||s.startsWith(":")||(s.startsWith("id:")?r=s.slice(3).trim():s.startsWith("data:")&&o.push(s.slice(5).replace(/^ /,"")));}if(o.length===0)return null;let a;try{a=JSON.parse(o.join(`
5
+ `));}catch{return null}if(typeof a!="object"||a===null||Array.isArray(a))return null;let i=me.safeParse(a);return i.success?ge(i.data,r,t):null}n(W,"parseBlock");function ge(e,t,r){let o=e.type,a=e.event;if(o==="error"||"error"in e)return c({code:d(e.code)??"unknown",retryable:e.retryable===true,wireMessage:d(e.error),synthesized:false,lastEventId:t,serverRequestId:r});if(o==="done"||e.done===true)return q({conversationId:d(e.conversation_id)??"",messageId:d(e.message_id),title:d(e.title),followUpQuestions:we(e.follow_up_questions),citations:Y(e.citations),citationStatus:d(e.citation_status),urgencyLevel:H(e.urgency_level),urgencyReason:d(e.urgency_reason),urgencyProvided:be(e),resultId:d(e.result_id),lastEventId:t},r);if(o==="accepted"||e.status==="reasoning")return P(d(e.stream_id),t,r);if(o==="heartbeat"||e.heartbeat===true)return D(t,r);if(o==="text.delta"||"delta"in e||"token"in e){let i=d(e.delta)??d(e.token)??"";return j(i,t,r)}return a==="analysis_started"?U(d(e.request_id),t,r):a==="analysis_complete"?M({resultId:d(e.result_id),analysisType:d(e.analysis_type),modelVersion:d(e.model_version),confidence:he(e.confidence),detections:Y(e.detections),interpretation:d(e.interpretation),lastEventId:t},r):B(e,t,r)}n(ge,"frameFromWire");function d(e){return typeof e=="string"?e:null}n(d,"asString");function he(e){return typeof e=="number"&&Number.isFinite(e)?e:null}n(he,"asNumber");function H(e){return typeof e=="string"&&Ee.includes(e)?e:null}n(H,"asUrgency");function be(e){if(!Object.prototype.hasOwnProperty.call(e,"urgency_level"))return false;let t=e.urgency_level;return t===null||H(t)!==null}n(be,"urgencySlotProvided");function we(e){return Array.isArray(e)?e.map(t=>typeof t=="string"?t:String(t)):[]}n(we,"asStringList");function Re(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}n(Re,"isPlainObject");function Y(e){return Array.isArray(e)?e.filter(Re):[]}n(Y,"asMapList");var Se=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 Te(e){return Se[e]}n(Te,"userFacingError");function Q(e,t,r){Object.defineProperty(e,t,{value:r,enumerable:false,writable:false,configurable:false});}n(Q,"defineHidden");var Oe=/^[a-z][a-z0-9_]{0,63}$/;function $(e,t){let r=_(t?.wireCode,t?.wireEnvelope),o={code:e,category:A(e),retryable:t?.retryable??z(e),displayMessage:Te(e)};if(t?.httpStatus!==void 0&&(o.httpStatus=t.httpStatus),t?.requestId&&(o.requestId=t.requestId),typeof t?.reasonCode=="string"&&Oe.test(t.reasonCode)&&(o.reasonCode=t.reasonCode),r);return t?.wireMessage&&Q(o,"wireMessage",t.wireMessage),t?.raw!==void 0&&t.raw!==null&&Q(o,"raw",t.raw),Object.freeze(o)}n($,"makeEverfurError");async function*V(e,t=[]){let r=new TextEncoder().encode(e),o=[...new Set(t)].filter(i=>i>0&&i<r.length).sort((i,l)=>i-l),a=0;for(let i of o)yield r.subarray(a,i),a=i;yield r.subarray(a);}n(V,"bufferedTextByteSource");function J(e,t,r){let o=Ce(t),a=o?m(o):N(e),i=ke(t);return $(a,{httpStatus:e,...Fe(t)?{retryable:true}:{},...r?{requestId:r}:{},...o?{wireCode:o}:{},...K(t)?{reasonCode:K(t)}:{},...i?{wireMessage:i}:{},...t!=null?{raw:t}:{}})}n(J,"errorFromResponse");function K(e){let t=e,r=t?.error?.reason_code??t?.reason_code;return typeof r=="string"&&r.length>0?r:null}n(K,"extractReasonCode");function Ce(e){let t=e,r=t?.error?.code??t?.code;return typeof r=="string"&&r.length>0?r:null}n(Ce,"extractWireCode");function ke(e){let t=e,r=t?.error?.message??t?.message;return typeof r=="string"&&r.length>0?r:null}n(ke,"extractWireMessage");function Fe(e){let t=e;return t?.error?.retryable===true||t?.retryable===true}n(Fe,"extractRetryable");var ee=Object.freeze({accepted:n(e=>JSON.stringify(e?{type:"accepted",stream_id:e}:{type:"accepted"}),"accepted"),heartbeat:n(()=>JSON.stringify({type:"heartbeat"}),"heartbeat"),delta:n(e=>JSON.stringify({type:"text.delta",delta:e}),"delta"),done:n(e=>JSON.stringify({type:"done",...e??{}}),"done"),error:n((e,t=false)=>JSON.stringify({type:"error",code:e,retryable:t}),"error")}),xe=Object.freeze({pets:n(e=>({pets:e.map(t=>({pet_id:"a0000000-0000-4000-8000-000000000001",pet_ref:"pet-A",name:"Rex",species:"dog",breed:"Labrador",age_years:3,weight_kg:20,updated_at:"2026-09-18T10:00:00Z",...t}))}),"pets"),uploadInitiate:n(e=>({upload_id:"b0000000-0000-4000-8000-000000000001",upload_url:"https://uploads.example.test/bucket",upload_fields:{key:"uploads/user-A/chat/photo.jpg","Content-Type":"image/jpeg",policy:"p",signature:"s"},s3_key:"uploads/user-A/chat/photo.jpg",expires_in_seconds:900,purpose:"chat_attachment",max_content_length:10485760,...e??{}}),"uploadInitiate"),feedback:n(e=>({feedback_id:"c0000000-0000-4000-8000-000000000001",feedback_type:"helpful",updated_at:"2026-09-18T10:00:00Z",...e??{}}),"feedback")});function X(e,t){let r=k(e,t);if(r!=="known")throw r==="absent"?new p("invalid-argument",`MockTransport: ${e} ${t} is a route the Everfur backend does NOT serve, so this call returns 404 in production. Scripting a success for it makes a green test that hides a broken integration. Known-absent routes: ${h.join(", ")}. Pass { strictPaths: false } to MockTransport only if you are deliberately testing this shape.`):new p("invalid-argument",`MockTransport: ${e} ${t} is not a known partner-plane route. If the backend has gained it, add it to KNOWN_PARTNER_ROUTES in src/core/testing/knownRoutes.ts. Pass { strictPaths: false } to opt out for this transport.`)}n(X,"assertRouteIsServed");var T=class T{constructor(t={}){this.streamQueue=[];this.requestQueue=[];this.lastRequestScript=new Map;this.openCount=0;this.requests=[];this.streamRequests=[];this.peak=0;this.strictPaths=t.strictPaths??true;}get openStreams(){return this.openCount}get peakOpenStreams(){return this.peak}enqueueStream(...t){return this.streamQueue.push(...t),this}enqueueRequest(...t){return this.requestQueue.push(...t),this}async request(t){this.strictPaths&&X(t.method,t.path);let r={method:t.method,path:t.path,headers:{...t.headers??{}},...t.query===void 0?{}:{query:{...t.query}}},o=t.body===void 0?r:{...r,body:t.body};this.requests.push(o);let a=`${t.method} ${t.path}`,i=this.requestQueue.shift();i!==void 0&&this.lastRequestScript.set(a,i);let l=i??this.lastRequestScript.get(a)??{status:200,body:{}},s=l.status??200;return s===304||s>=400?C(J(s,l.body??null)):O(l.body??{})}stream(t,r){this.strictPaths&&X(t.method,t.path),this.streamRequests.push({path:t.path,authorization:R(t,"authorization"),partnerKey:R(t,"x-everfur-partner-key"),idempotencyKey:R(t,"idempotency-key"),...t.body===void 0?{}:{body:t.body},headers:{...t.headers??{}}});let o=this.streamQueue.shift()??{kind:"sse",blocks:[ee.done()]};return this.openStream(o,r)}async*openStream(t,r){this.openCount+=1,this.openCount>this.peak&&(this.peak=this.openCount);try{yield*this.runScript(t,r);}finally{this.openCount-=1;}}async*runScript(t,r){switch(t.kind){case "httpError":{let o=Ae(t.body)??Le(t.status);yield c({code:o,retryable:ze(t.body)||E(m(o)),wireMessage:Ne(t.body),synthesized:true,lastEventId:null});return}case "network":yield c({code:"INTERNAL_ERROR",retryable:true,wireMessage:"network request failed",synthesized:true,lastEventId:null});return;case "partialByte":yield*f(V(t.body,t.splitAt));return;case "sse":yield*f(Z(t.blocks,t.gapMs??0,r));return;case "drop":yield*f(Z(t.blocks,0,r));return;case "stall":yield*f(Ie(t.preface??[],r));return;default:return L(t)}}};n(T,"MockTransport");var S=T;async function*Z(e,t,r){let o=new TextEncoder,a=true;for(let i of e){if(r.aborted||!a&&t>0&&await re(t,r)==="abort")return;a=false,yield o.encode(te(i));}}n(Z,"sseByteSource");async function*Ie(e,t){let r=new TextEncoder;for(let o of e){if(t.aborted)return;yield r.encode(te(o));}await re(1/0,t);}n(Ie,"stallByteSource");function te(e){return `data: ${e}
4
6
 
5
- // src/client/errors/EverfurResult.ts
6
- function ok(value, warning) {
7
- return Object.freeze(
8
- { ok: true, value }
9
- );
10
- }
11
- function err(error) {
12
- return Object.freeze({ ok: false, error });
13
- }
14
- var EverfurConfigError = class _EverfurConfigError extends Error {
15
- constructor(kind, message) {
16
- super(message);
17
- this.name = "EverfurConfigError";
18
- this.kind = kind;
19
- Object.setPrototypeOf(this, _EverfurConfigError.prototype);
20
- }
21
- };
22
-
23
- // src/core/testing/knownRoutes.ts
24
- var KNOWN_PARTNER_ROUTES = [
25
- "DELETE /widget/v1/me",
26
- "DELETE /widget/v1/pets/{pet_ref}",
27
- "DELETE /widget/v1/records/pets/{pet_ref}/consent",
28
- "GET /widget/v1/consent",
29
- "GET /widget/v1/conversations",
30
- "GET /widget/v1/conversations/{conversation_id}/messages",
31
- "GET /widget/v1/entitlements",
32
- "GET /widget/v1/pets",
33
- "GET /widget/v1/records/pets/{pet_ref}/consent",
34
- "GET /widget/v1/records/pets/{pet_ref}/record",
35
- "GET /widget/v1/records/requests",
36
- "GET /widget/v1/records/requests/{request_id}",
37
- "GET /widget/v1/suggested-prompts",
38
- "PATCH /widget/v1/pets/{pet_ref}",
39
- "POST /widget/v1/conversations",
40
- "POST /widget/v1/conversations/{conversation_id}/analyze",
41
- "POST /widget/v1/conversations/{conversation_id}/classify",
42
- "POST /widget/v1/conversations/{conversation_id}/messages",
43
- "POST /widget/v1/pets/{pet_ref}",
44
- "POST /widget/v1/records/requests",
45
- "POST /widget/v1/records/requests/{request_id}/uploads/complete",
46
- "POST /widget/v1/records/requests/{request_id}/uploads/initiate",
47
- "POST /widget/v1/sessions",
48
- "PUT /widget/v1/consent",
49
- "PUT /widget/v1/records/pets/{pet_ref}/consent"
50
- ];
51
- var KNOWN_ABSENT_ROUTES = [
52
- "POST /widget/v1/uploads/initiate",
53
- "POST /widget/v1/photo/precheck",
54
- "POST /widget/v1/photo/analyze",
55
- "POST /widget/v1/video/analyze",
56
- "GET /widget/v1/analysis/jobs/{job_id}",
57
- "GET /widget/v1/pets/{pet_ref}/state"
58
- ];
59
- function pathMatches(template, path) {
60
- const templateParts = template.split("/");
61
- const [withoutQuery = ""] = path.split("?");
62
- const pathParts = withoutQuery.split("/");
63
- if (templateParts.length !== pathParts.length) return false;
64
- return templateParts.every((seg, i) => {
65
- const actual = pathParts[i];
66
- if (actual === void 0) return false;
67
- const isWildcard = seg.startsWith("{") && seg.endsWith("}");
68
- return isWildcard ? actual.length > 0 : seg === actual;
69
- });
70
- }
71
- function classifyRoute(method, path) {
72
- const matches = (list) => list.some((entry) => {
73
- const [entryMethod, template] = entry.split(" ");
74
- if (entryMethod === void 0 || template === void 0) return false;
75
- return entryMethod === method.toUpperCase() && pathMatches(template, path);
76
- });
77
- if (matches(KNOWN_PARTNER_ROUTES)) return "known";
78
- if (matches(KNOWN_ABSENT_ROUTES)) return "absent";
79
- return "unknown";
80
- }
81
- var CONTRACT_RETRYABILITY = Object.freeze([
82
- Object.freeze({ wireCode: "AccessDeniedException", envelope: "http_envelope", httpStatus: 403, retryable: false }),
83
- Object.freeze({ wireCode: "AuthorizationException", envelope: "http_envelope", httpStatus: 401, retryable: false }),
84
- Object.freeze({ wireCode: "ConflictException", envelope: "http_envelope", httpStatus: 409, retryable: true }),
85
- Object.freeze({ wireCode: "DAILY_QUOTA_EXCEEDED", envelope: "http_envelope", httpStatus: 429, retryable: true }),
86
- Object.freeze({ wireCode: "IDEMPOTENCY_KEY_IN_FLIGHT", envelope: "http_envelope", httpStatus: 409, retryable: true }),
87
- Object.freeze({ wireCode: "IDEMPOTENCY_KEY_REUSED_DIFFERENT_REQUEST", envelope: "http_envelope", httpStatus: 409, retryable: false }),
88
- Object.freeze({ wireCode: "InternalFailureException", envelope: "http_envelope", httpStatus: 500, retryable: true }),
89
- Object.freeze({ wireCode: "NotImplementedException", envelope: "http_envelope", httpStatus: 501, retryable: false }),
90
- Object.freeze({ wireCode: "PaymentRequiredException", envelope: "http_envelope", httpStatus: 402, retryable: false }),
91
- Object.freeze({ wireCode: "ResourceNotFoundException", envelope: "http_envelope", httpStatus: 404, retryable: false }),
92
- Object.freeze({ wireCode: "ServiceUnavailableException", envelope: "http_envelope", httpStatus: 503, retryable: true }),
93
- Object.freeze({ wireCode: "TIER_UPGRADE_REQUIRED", envelope: "http_envelope", httpStatus: 402, retryable: false }),
94
- Object.freeze({ wireCode: "ThrottlingException", envelope: "http_envelope", httpStatus: 429, retryable: true }),
95
- Object.freeze({ wireCode: "ValidationException", envelope: "http_envelope", httpStatus: 400, retryable: false }),
96
- Object.freeze({ wireCode: "accessDenied", envelope: "http_envelope", httpStatus: 403, retryable: false }),
97
- Object.freeze({ wireCode: "authExpired", envelope: "http_envelope", httpStatus: 401, retryable: true }),
98
- Object.freeze({ wireCode: "internal_error", envelope: "sse_frame", httpStatus: 200, retryable: false }),
99
- Object.freeze({ wireCode: "invalidRequest", envelope: "http_envelope", httpStatus: 400, retryable: false }),
100
- Object.freeze({ wireCode: "not_found", envelope: "sse_frame", httpStatus: 200, retryable: false }),
101
- Object.freeze({ wireCode: "session_required", envelope: "http_envelope", httpStatus: 403, retryable: false }),
102
- Object.freeze({ wireCode: "timeout", envelope: "sse_frame", httpStatus: 200, retryable: true }),
103
- Object.freeze({ wireCode: "unavailable", envelope: "http_envelope", httpStatus: 503, retryable: true })
104
- ]);
105
- Object.freeze(
106
- CONTRACT_RETRYABILITY.map((row) => row.wireCode)
107
- );
108
-
109
- // src/client/errors/contract.ts
110
- var NORMALIZED_FOLD = Object.freeze({
111
- // the default status-mapped envelope
112
- ValidationException: "validationFailed",
113
- AuthorizationException: "authRejected",
114
- PaymentRequiredException: "paymentRequired",
115
- AccessDeniedException: "accessDenied",
116
- ResourceNotFoundException: "resourceNotFound",
117
- ConflictException: "conflict",
118
- ThrottlingException: "rateLimited",
119
- InternalFailureException: "internalError",
120
- NotImplementedException: "notImplemented",
121
- ServiceUnavailableException: "serviceUnavailable",
122
- // dict-detail codes on the widget surface
123
- authExpired: "authExpired",
124
- unavailable: "serviceUnavailable",
125
- session_required: "sessionRequired",
126
- accessDenied: "accessDenied",
127
- invalidRequest: "sdkUpdateRequired",
128
- // typed codes
129
- IDEMPOTENCY_KEY_IN_FLIGHT: "idempotencyInFlight",
130
- IDEMPOTENCY_KEY_REUSED_DIFFERENT_REQUEST: "idempotencyConflict",
131
- DAILY_QUOTA_EXCEEDED: "quotaExceeded",
132
- TIER_UPGRADE_REQUIRED: "paymentRequired",
133
- // SSE error frames
134
- not_found: "conversationNotFound",
135
- timeout: "streamTimeout",
136
- internal_error: "internalError"
137
- });
138
- var CONTRACT_ERROR_ROWS = Object.freeze(
139
- CONTRACT_RETRYABILITY.map(
140
- (generated) => Object.freeze({
141
- wireCode: generated.wireCode,
142
- envelope: generated.envelope,
143
- retryable: generated.retryable,
144
- normalized: NORMALIZED_FOLD[generated.wireCode]
145
- })
146
- )
147
- );
148
- var BY_UPPER = new Map(
149
- CONTRACT_ERROR_ROWS.map((r) => [r.wireCode.toUpperCase(), r])
150
- );
151
- function contractErrorFor(wireCode) {
152
- if (typeof wireCode !== "string") return void 0;
153
- const key = wireCode.trim().toUpperCase();
154
- return key.length > 0 ? BY_UPPER.get(key) : void 0;
155
- }
156
- var CATEGORY_OF = Object.freeze({
157
- // the caller's sign-in state is wrong and a credential change is the remedy
158
- authExpired: "authentication",
159
- authRejected: "authentication",
160
- sessionRequired: "authentication",
161
- // signed in, correctly identified, and still not allowed
162
- accessDenied: "authorization",
163
- // a plan gate, not a permission failure: the remedy is commercial
164
- paymentRequired: "entitlement",
165
- // slow down / come back later
166
- quotaExceeded: "rateLimit",
167
- rateLimited: "rateLimit",
168
- // the request itself was wrong; retrying it unchanged can never succeed
169
- validationFailed: "invalidRequest",
170
- sdkUpdateRequired: "invalidRequest",
171
- // the target is gone, hidden, or was never visible to this caller
172
- conversationNotFound: "notFound",
173
- petNotFound: "notFound",
174
- resourceNotFound: "notFound",
175
- // something else already holds the thing
176
- conflict: "conflict",
177
- idempotencyConflict: "conflict",
178
- idempotencyInFlight: "conflict",
179
- // the pipe, not the request: timeouts, drops, a briefly unreachable dependency
180
- streamTimeout: "connection",
181
- streamIncomplete: "connection",
182
- upstreamLlmTimeout: "connection",
183
- serviceUnavailable: "connection",
184
- // the server admits fault
185
- internalError: "server",
186
- notImplemented: "server",
187
- mediaUploadFailed: "media",
188
- moderationBlocked: "policy",
189
- unknown: "unknown"
190
- });
191
- function categoryFor(code) {
192
- return CATEGORY_OF[code];
193
- }
194
- function fromWire(wire2) {
195
- const contractRow = contractErrorFor(wire2);
196
- if (contractRow) return contractRow.normalized;
197
- const upper = (wire2 ?? "").trim().toUpperCase();
198
- const canonical = upper.replace(/[^A-Z0-9]/g, "");
199
- if (canonical === "AUTHREJECTED") return "authRejected";
200
- if (upper.startsWith("AUTH")) return "authExpired";
201
- switch (canonical) {
202
- case "DAILYQUOTAEXCEEDED":
203
- case "QUOTAEXCEEDED":
204
- return "quotaExceeded";
205
- case "RATELIMITED":
206
- case "TOOMANYREQUESTS":
207
- return "rateLimited";
208
- case "IDEMPOTENCYKEYCONFLICT":
209
- case "IDEMPOTENCYCONFLICT":
210
- return "idempotencyConflict";
211
- case "ACCESSDENIED":
212
- case "FORBIDDEN":
213
- return "accessDenied";
214
- case "NOTFOUND":
215
- case "CONVERSATIONNOTFOUND":
216
- return "conversationNotFound";
217
- case "PETNOTFOUND":
218
- return "petNotFound";
219
- case "TIMEOUT":
220
- case "STREAMTIMEOUT":
221
- return "streamTimeout";
222
- // Analysis-domain deterministic 400s (NON-retryable). Additive per SPEC-00 §3.1 / SPEC-11b §2.6:
223
- // fold to a NON-retried target so the SDK never retries a permanently-failing bad-input request.
224
- // (Comment above the group so the empty fall-through cases stay lint-clean under no-fallthrough.)
225
- case "MEDIAUPLOADFAILED":
226
- case "UNRECOGNIZEDVIDEOFORMAT":
227
- case "FILETOOSMALL":
228
- return "mediaUploadFailed";
229
- case "MODERATIONBLOCKED":
230
- return "moderationBlocked";
231
- case "UPSTREAMLLMTIMEOUT":
232
- return "upstreamLlmTimeout";
233
- case "INTERNALERROR":
234
- case "INTERNALSERVERERROR":
235
- return "internalError";
236
- case "STREAMINCOMPLETE":
237
- case "CHATSTREAMINCOMPLETE":
238
- return "streamIncomplete";
239
- // Deterministic 400s that can only come from an SDK bug -> unknown (NON-retryable). NEVER internalError
240
- // (which IS auto-retried): mapping a bad-input 400 to a retryable code retries a request that never succeeds.
241
- case "INVALIDANALYSISTYPE":
242
- case "INVALIDUPLOADPURPOSE":
243
- return "unknown";
244
- default:
245
- return "unknown";
246
- }
247
- }
248
- function fromHttpStatus(status) {
249
- if (status === 401) return "authExpired";
250
- if (status === 403) return "accessDenied";
251
- if (status === 404) return "conversationNotFound";
252
- if (status === 409) return "idempotencyConflict";
253
- if (status === 421) return "unknown";
254
- if (status === 429) return "rateLimited";
255
- if (status === 400 || status === 422) return "unknown";
256
- if (status >= 500) return "internalError";
257
- return "unknown";
258
- }
259
- var AUTO_RETRYABLE_CODES = /* @__PURE__ */ new Set([
260
- "streamTimeout",
261
- "rateLimited",
262
- "internalError",
263
- "upstreamLlmTimeout",
264
- "streamIncomplete"
265
- ]);
266
- function isAutoRetryable(code) {
267
- return AUTO_RETRYABLE_CODES.has(code);
268
- }
269
- var RETRYABLE_CONTRACT_CODES = /* @__PURE__ */ new Set([
270
- "serviceUnavailable",
271
- "conflict",
272
- "idempotencyInFlight"
273
- ]);
274
- function isRetryableCode(code) {
275
- return isAutoRetryable(code) || RETRYABLE_CONTRACT_CODES.has(code);
276
- }
277
-
278
- // src/client/protocol/frames.ts
279
- function assertNever(x) {
280
- throw new Error(
281
- `assertNever: unhandled discriminated-union member ${JSON.stringify(x)}`
282
- );
283
- }
284
- function acceptedFrame(streamId, lastEventId, serverRequestId = null) {
285
- return Object.freeze({ kind: "accepted", streamId, lastEventId, serverRequestId, terminal: false });
286
- }
287
- function heartbeatFrame(lastEventId, serverRequestId = null) {
288
- return Object.freeze({ kind: "heartbeat", lastEventId, serverRequestId, terminal: false });
289
- }
290
- function deltaFrame(delta, lastEventId, serverRequestId = null) {
291
- return Object.freeze({ kind: "delta", delta, lastEventId, serverRequestId, terminal: false });
292
- }
293
- function doneFrame(fields, serverRequestId = null) {
294
- return Object.freeze({
295
- kind: "done",
296
- terminal: true,
297
- conversationId: fields.conversationId,
298
- messageId: fields.messageId,
299
- title: fields.title,
300
- followUpQuestions: Object.freeze([...fields.followUpQuestions]),
301
- citations: Object.freeze([...fields.citations]),
302
- citationStatus: fields.citationStatus,
303
- urgencyLevel: fields.urgencyLevel,
304
- urgencyReason: fields.urgencyReason,
305
- resultId: fields.resultId,
306
- lastEventId: fields.lastEventId,
307
- serverRequestId
308
- });
309
- }
310
- function errorFrame(fields) {
311
- return Object.freeze({
312
- kind: "error",
313
- terminal: true,
314
- code: fields.code,
315
- retryable: fields.retryable,
316
- wireMessage: fields.wireMessage,
317
- synthesized: fields.synthesized,
318
- lastEventId: fields.lastEventId,
319
- serverRequestId: fields.serverRequestId ?? null
320
- });
321
- }
322
- function analysisStartedFrame(requestId, lastEventId, serverRequestId = null) {
323
- return Object.freeze({
324
- kind: "analysisStarted",
325
- requestId,
326
- lastEventId,
327
- serverRequestId,
328
- terminal: false
329
- });
330
- }
331
- function analysisCompleteFrame(fields, serverRequestId = null) {
332
- return Object.freeze({
333
- kind: "analysisComplete",
334
- terminal: false,
335
- resultId: fields.resultId,
336
- analysisType: fields.analysisType,
337
- modelVersion: fields.modelVersion,
338
- confidence: fields.confidence,
339
- detections: Object.freeze([...fields.detections]),
340
- interpretation: fields.interpretation,
341
- lastEventId: fields.lastEventId,
342
- serverRequestId
343
- });
344
- }
345
- function unknownFrame(raw, lastEventId, serverRequestId = null) {
346
- return Object.freeze({
347
- kind: "unknown",
348
- raw: { ...raw },
349
- lastEventId,
350
- serverRequestId,
351
- terminal: false
352
- });
353
- }
354
- var BLOCK_SEPARATOR = "\n\n";
355
- var MAX_PENDING_BLOCK_CHARS = 1048576;
356
- var wireObjectSchema = zod.z.record(zod.z.string(), zod.z.unknown());
357
- var URGENCY_LEVELS = ["emergency", "schedule_soon", "home_care"];
358
- async function* parseSse(bytes, serverRequestId = null) {
359
- let resolvedRequestId = null;
360
- const requestIdNow = () => {
361
- if (resolvedRequestId !== null) return resolvedRequestId;
362
- resolvedRequestId = typeof serverRequestId === "function" ? serverRequestId() : serverRequestId;
363
- return resolvedRequestId;
364
- };
365
- const decoder = new TextDecoder("utf-8");
366
- let buffer = "";
367
- let scanFrom = 0;
368
- let sawDelta = false;
369
- for await (const chunk of bytes) {
370
- buffer += decoder.decode(chunk, { stream: true });
371
- for (; ; ) {
372
- const sep = buffer.indexOf(BLOCK_SEPARATOR, scanFrom);
373
- if (sep === -1) break;
374
- const block = buffer.slice(0, sep);
375
- buffer = buffer.slice(sep + BLOCK_SEPARATOR.length);
376
- scanFrom = 0;
377
- const frame = parseBlock(block, requestIdNow());
378
- if (frame === null) continue;
379
- if (frame.kind === "delta") sawDelta = true;
380
- yield frame;
381
- if (frame.terminal) return;
382
- }
383
- scanFrom = buffer.length > 0 ? buffer.length - 1 : 0;
384
- if (buffer.length > MAX_PENDING_BLOCK_CHARS) {
385
- yield errorFrame({
386
- code: sawDelta ? "CHAT_STREAM_INCOMPLETE" : "internal_error",
387
- retryable: true,
388
- wireMessage: null,
389
- synthesized: true,
390
- lastEventId: null,
391
- serverRequestId: requestIdNow()
392
- });
393
- return;
394
- }
395
- }
396
- buffer += decoder.decode();
397
- if (buffer.trim().length > 0) {
398
- const frame = parseBlock(buffer, requestIdNow());
399
- if (frame !== null) {
400
- if (frame.kind === "delta") sawDelta = true;
401
- yield frame;
402
- if (frame.terminal) return;
403
- }
404
- }
405
- yield errorFrame({
406
- code: sawDelta ? "CHAT_STREAM_INCOMPLETE" : "internal_error",
407
- retryable: true,
408
- wireMessage: null,
409
- synthesized: true,
410
- lastEventId: null,
411
- serverRequestId: requestIdNow()
412
- });
413
- }
414
- function parseBlock(block, serverRequestId) {
415
- let id = null;
416
- const dataLines = [];
417
- for (const rawLine of block.split("\n")) {
418
- const line = rawLine.replace(/\s+$/, "");
419
- if (line.length === 0 || line.startsWith(":")) continue;
420
- if (line.startsWith("id:")) {
421
- id = line.slice(3).trim();
422
- } else if (line.startsWith("data:")) {
423
- dataLines.push(line.slice(5).replace(/^ /, ""));
424
- }
425
- }
426
- if (dataLines.length === 0) return null;
427
- let decoded;
428
- try {
429
- decoded = JSON.parse(dataLines.join("\n"));
430
- } catch {
431
- return null;
432
- }
433
- if (typeof decoded !== "object" || decoded === null || Array.isArray(decoded)) return null;
434
- const parsed = wireObjectSchema.safeParse(decoded);
435
- if (!parsed.success) return null;
436
- return frameFromWire(parsed.data, id, serverRequestId);
437
- }
438
- function frameFromWire(json, lastEventId, serverRequestId) {
439
- const type = json["type"];
440
- const event = json["event"];
441
- if (type === "error" || "error" in json) {
442
- return errorFrame({
443
- code: asString(json["code"]) ?? "unknown",
444
- retryable: json["retryable"] === true,
445
- wireMessage: asString(json["error"]),
446
- synthesized: false,
447
- lastEventId,
448
- serverRequestId
449
- });
450
- }
451
- if (type === "done" || json["done"] === true) {
452
- return doneFrame({
453
- conversationId: asString(json["conversation_id"]) ?? "",
454
- messageId: asString(json["message_id"]),
455
- title: asString(json["title"]),
456
- followUpQuestions: asStringList(json["follow_up_questions"]),
457
- citations: asMapList(json["citations"]),
458
- citationStatus: asString(json["citation_status"]),
459
- urgencyLevel: asUrgency(json["urgency_level"]),
460
- urgencyReason: asString(json["urgency_reason"]),
461
- resultId: asString(json["result_id"]),
462
- lastEventId
463
- }, serverRequestId);
464
- }
465
- if (type === "accepted" || json["status"] === "reasoning") {
466
- return acceptedFrame(asString(json["stream_id"]), lastEventId, serverRequestId);
467
- }
468
- if (type === "heartbeat" || json["heartbeat"] === true) {
469
- return heartbeatFrame(lastEventId, serverRequestId);
470
- }
471
- if (type === "text.delta" || "delta" in json || "token" in json) {
472
- const delta = asString(json["delta"]) ?? asString(json["token"]) ?? "";
473
- return deltaFrame(delta, lastEventId, serverRequestId);
474
- }
475
- if (event === "analysis_started") {
476
- return analysisStartedFrame(asString(json["request_id"]), lastEventId, serverRequestId);
477
- }
478
- if (event === "analysis_complete") {
479
- return analysisCompleteFrame({
480
- resultId: asString(json["result_id"]),
481
- analysisType: asString(json["analysis_type"]),
482
- modelVersion: asString(json["model_version"]),
483
- confidence: asNumber(json["confidence"]),
484
- detections: asMapList(json["detections"]),
485
- interpretation: asString(json["interpretation"]),
486
- lastEventId
487
- }, serverRequestId);
488
- }
489
- return unknownFrame(json, lastEventId, serverRequestId);
490
- }
491
- function asString(v) {
492
- return typeof v === "string" ? v : null;
493
- }
494
- function asNumber(v) {
495
- return typeof v === "number" && Number.isFinite(v) ? v : null;
496
- }
497
- function asUrgency(v) {
498
- return typeof v === "string" && URGENCY_LEVELS.includes(v) ? v : null;
499
- }
500
- function asStringList(v) {
501
- if (!Array.isArray(v)) return [];
502
- return v.map((e) => typeof e === "string" ? e : String(e));
503
- }
504
- function isPlainObject(v) {
505
- return typeof v === "object" && v !== null && !Array.isArray(v);
506
- }
507
- function asMapList(v) {
508
- if (!Array.isArray(v)) return [];
509
- return v.filter(isPlainObject);
510
- }
511
-
512
- // src/client/errors/EverfurError.ts
513
- var USER_FACING_COPY = Object.freeze({
514
- authExpired: "Please sign in again to continue.",
515
- authRejected: "Please sign in again to continue.",
516
- sessionRequired: "This app needs to be updated to keep using Everfur.",
517
- accessDenied: "This feature isn't available on your account right now.",
518
- paymentRequired: "This is part of a paid plan.",
519
- quotaExceeded: "You have used today's messages. This resets tomorrow.",
520
- rateLimited: "You are sending messages quickly. Try again in a few seconds.",
521
- validationFailed: "Something in that request was not right. Check the details and try again.",
522
- sdkUpdateRequired: "This app needs to be updated to keep using Everfur.",
523
- conflict: "That is already running. Wait for it to finish, then try again.",
524
- idempotencyConflict: "That message was already delivered.",
525
- idempotencyInFlight: "That is still processing. Give it a moment.",
526
- conversationNotFound: "This conversation is no longer available.",
527
- petNotFound: "We could not find that pet. Please pick a pet and try again.",
528
- resourceNotFound: "We could not find that.",
529
- streamTimeout: "The response timed out. Tap retry to try again.",
530
- mediaUploadFailed: "We could not upload that photo. Please attach it again.",
531
- moderationBlocked: "This request cannot be answered here.",
532
- upstreamLlmTimeout: "The response timed out. Tap retry to try again.",
533
- internalError: "We hit a snag on our end. Please try again.",
534
- notImplemented: "That is not available yet.",
535
- serviceUnavailable: "That service is briefly unavailable. Try again shortly.",
536
- streamIncomplete: "The connection dropped mid-answer. Tap retry to continue.",
537
- unknown: "Something went wrong. Please try again."
538
- });
539
- function userFacingError(code) {
540
- return USER_FACING_COPY[code];
541
- }
542
- function defineHidden(target, key, value) {
543
- Object.defineProperty(target, key, {
544
- value,
545
- enumerable: false,
546
- writable: false,
547
- configurable: false
548
- });
549
- }
550
- function makeEverfurError(code, opts) {
551
- contractErrorFor(opts?.wireCode);
552
- const error = {
553
- code,
554
- category: categoryFor(code),
555
- retryable: opts?.retryable ?? isRetryableCode(code),
556
- displayMessage: userFacingError(code)
557
- };
558
- if (opts?.httpStatus !== void 0) error.httpStatus = opts.httpStatus;
559
- if (opts?.requestId) error.requestId = opts.requestId;
560
- if (opts?.wireMessage) defineHidden(error, "wireMessage", opts.wireMessage);
561
- if (opts?.raw !== void 0 && opts.raw !== null) defineHidden(error, "raw", opts.raw);
562
- return Object.freeze(error);
563
- }
564
-
565
- // src/client/transport.ts
566
- async function* bufferedTextByteSource(text, splitAt = []) {
567
- const bytes = new TextEncoder().encode(text);
568
- const points = [...new Set(splitAt)].filter((n) => n > 0 && n < bytes.length).sort((a, b) => a - b);
569
- let start = 0;
570
- for (const point of points) {
571
- yield bytes.subarray(start, point);
572
- start = point;
573
- }
574
- yield bytes.subarray(start);
575
- }
576
- function errorFromResponse(status, body, requestId) {
577
- const wireCode = extractWireCode(body);
578
- const code = wireCode ? fromWire(wireCode) : fromHttpStatus(status);
579
- const wireMessage = extractWireMessage(body);
580
- return makeEverfurError(code, {
581
- httpStatus: status,
582
- ...extractRetryable(body) ? { retryable: true } : {},
583
- ...{},
584
- ...wireCode ? { wireCode } : {},
585
- ...wireMessage ? { wireMessage } : {},
586
- ...body !== null && body !== void 0 ? { raw: body } : {}
587
- });
588
- }
589
- function extractWireCode(body) {
590
- const b = body;
591
- const code = b?.error?.code ?? b?.code;
592
- return typeof code === "string" && code.length > 0 ? code : null;
593
- }
594
- function extractWireMessage(body) {
595
- const b = body;
596
- const message = b?.error?.message ?? b?.message;
597
- return typeof message === "string" && message.length > 0 ? message : null;
598
- }
599
- function extractRetryable(body) {
600
- const b = body;
601
- return b?.error?.retryable === true || b?.retryable === true;
602
- }
603
-
604
- // src/core/testing/MockTransport.ts
605
- var wire = Object.freeze({
606
- accepted: (streamId) => JSON.stringify(streamId ? { type: "accepted", stream_id: streamId } : { type: "accepted" }),
607
- heartbeat: () => JSON.stringify({ type: "heartbeat" }),
608
- delta: (text) => JSON.stringify({ type: "text.delta", delta: text }),
609
- done: (fields) => JSON.stringify({ type: "done", ...fields ?? {} }),
610
- error: (code, retryable = false) => JSON.stringify({ type: "error", code, retryable })
611
- });
612
- function assertRouteIsServed(method, path) {
613
- const verdict = classifyRoute(method, path);
614
- if (verdict === "known") return;
615
- if (verdict === "absent") {
616
- throw new EverfurConfigError(
617
- "invalid-argument",
618
- `MockTransport: ${method} ${path} is a route the Everfur backend does NOT serve, so this call returns 404 in production. Scripting a success for it makes a green test that hides a broken integration. Known-absent routes: ${KNOWN_ABSENT_ROUTES.join(", ")}. Pass { strictPaths: false } to MockTransport only if you are deliberately testing this shape.`
619
- );
620
- }
621
- throw new EverfurConfigError(
622
- "invalid-argument",
623
- `MockTransport: ${method} ${path} is not a known partner-plane route. If the backend has gained it, add it to KNOWN_PARTNER_ROUTES in src/core/testing/knownRoutes.ts. Pass { strictPaths: false } to opt out for this transport.`
624
- );
625
- }
626
- var MockTransport = class {
627
- constructor(options = {}) {
628
- this.streamQueue = [];
629
- this.requestQueue = [];
630
- /** The last script dequeued, replayed once the queue drains. See `request` for why. */
631
- /**
632
- * The last scripted response, KEYED BY ENDPOINT.
633
- *
634
- * It used to be a single field, so a `enqueueRequest({ status: 500 })` scripted for one endpoint kept
635
- * replaying for every OTHER endpoint once the queue drained — the comment below says the fallback means
636
- * "this endpoint is down", and a global field cannot mean that. A fault leaked across endpoints and a
637
- * test could assert an outcome the SDK would never produce.
638
- */
639
- this.lastRequestScript = /* @__PURE__ */ new Map();
640
- this.openCount = 0;
641
- this.requests = [];
642
- this.streamRequests = [];
643
- /** Peak concurrent open streams observed (bulkhead assertions). */
644
- this.peak = 0;
645
- this.strictPaths = options.strictPaths ?? true;
646
- }
647
- /** Live count of streams that have opened but not yet torn down. MUST return to 0 after a cancel. */
648
- get openStreams() {
649
- return this.openCount;
650
- }
651
- get peakOpenStreams() {
652
- return this.peak;
653
- }
654
- enqueueStream(...scripts) {
655
- this.streamQueue.push(...scripts);
656
- return this;
657
- }
658
- enqueueRequest(...scripts) {
659
- this.requestQueue.push(...scripts);
660
- return this;
661
- }
662
- async request(req) {
663
- if (this.strictPaths) assertRouteIsServed(req.method, req.path);
664
- const base = {
665
- method: req.method,
666
- path: req.path,
667
- headers: { ...req.headers ?? {} },
668
- ...req.query === void 0 ? {} : { query: { ...req.query } }
669
- };
670
- const record = req.body === void 0 ? base : { ...base, body: req.body };
671
- this.requests.push(record);
672
- const endpoint = `${req.method} ${req.path}`;
673
- const next = this.requestQueue.shift();
674
- if (next !== void 0) this.lastRequestScript.set(endpoint, next);
675
- const script = next ?? this.lastRequestScript.get(endpoint) ?? { status: 200, body: {} };
676
- const status = script.status ?? 200;
677
- if (status === 304 || status >= 400) {
678
- return err(errorFromResponse(status, script.body ?? null));
679
- }
680
- return ok(script.body ?? {});
681
- }
682
- stream(req, signal) {
683
- if (this.strictPaths) assertRouteIsServed(req.method, req.path);
684
- this.streamRequests.push({
685
- path: req.path,
686
- authorization: header(req, "authorization"),
687
- partnerKey: header(req, "x-everfur-partner-key"),
688
- idempotencyKey: header(req, "idempotency-key"),
689
- ...req.body === void 0 ? {} : { body: req.body },
690
- headers: { ...req.headers ?? {} }
691
- });
692
- const script = this.streamQueue.shift() ?? { kind: "sse", blocks: [wire.done()] };
693
- return this.openStream(script, signal);
694
- }
695
- async *openStream(script, signal) {
696
- this.openCount += 1;
697
- if (this.openCount > this.peak) this.peak = this.openCount;
698
- try {
699
- yield* this.runScript(script, signal);
700
- } finally {
701
- this.openCount -= 1;
702
- }
703
- }
704
- async *runScript(script, signal) {
705
- switch (script.kind) {
706
- case "httpError": {
707
- const wireCode = extractWireCode2(script.body) ?? statusToWireCode(script.status);
708
- yield errorFrame({
709
- code: wireCode,
710
- retryable: extractRetryable2(script.body) || isAutoRetryable(fromWire(wireCode)),
711
- wireMessage: extractWireMessage2(script.body),
712
- synthesized: true,
713
- lastEventId: null
714
- });
715
- return;
716
- }
717
- case "network":
718
- yield errorFrame({
719
- code: "INTERNAL_ERROR",
720
- retryable: true,
721
- wireMessage: "network request failed",
722
- synthesized: true,
723
- lastEventId: null
724
- });
725
- return;
726
- case "partialByte":
727
- yield* parseSse(bufferedTextByteSource(script.body, script.splitAt));
728
- return;
729
- case "sse":
730
- yield* parseSse(sseByteSource(script.blocks, script.gapMs ?? 0, signal));
731
- return;
732
- case "drop":
733
- yield* parseSse(sseByteSource(script.blocks, 0, signal));
734
- return;
735
- case "stall":
736
- yield* parseSse(stallByteSource(script.preface ?? [], signal));
737
- return;
738
- default:
739
- return assertNever(script);
740
- }
741
- }
742
- };
743
- async function* sseByteSource(blocks, gapMs, signal) {
744
- const enc = new TextEncoder();
745
- let first = true;
746
- for (const block of blocks) {
747
- if (signal.aborted) return;
748
- if (!first && gapMs > 0) {
749
- const outcome = await abortableSleep(gapMs, signal);
750
- if (outcome === "abort") return;
751
- }
752
- first = false;
753
- yield enc.encode(toSseBlock(block));
754
- }
755
- }
756
- async function* stallByteSource(preface, signal) {
757
- const enc = new TextEncoder();
758
- for (const block of preface) {
759
- if (signal.aborted) return;
760
- yield enc.encode(toSseBlock(block));
761
- }
762
- await abortableSleep(Infinity, signal);
763
- }
764
- function toSseBlock(payload) {
765
- return `data: ${payload}
766
-
767
- `;
768
- }
769
- function abortableSleep(ms, signal) {
770
- return new Promise((resolve) => {
771
- if (signal.aborted) {
772
- resolve("abort");
773
- return;
774
- }
775
- let handle = null;
776
- const onAbort = () => {
777
- if (handle !== null) clearTimeout(handle);
778
- signal.removeEventListener("abort", onAbort);
779
- resolve("abort");
780
- };
781
- if (Number.isFinite(ms)) {
782
- handle = setTimeout(() => {
783
- signal.removeEventListener("abort", onAbort);
784
- resolve("timeout");
785
- }, ms);
786
- }
787
- signal.addEventListener("abort", onAbort, { once: true });
788
- });
789
- }
790
- function header(req, name) {
791
- const headers = req.headers;
792
- if (!headers) return null;
793
- for (const [key, value] of Object.entries(headers)) {
794
- if (key.toLowerCase() === name) return value;
795
- }
796
- return null;
797
- }
798
- function extractWireCode2(body) {
799
- const b = body;
800
- const code = b?.error?.code ?? b?.code;
801
- return typeof code === "string" && code.length > 0 ? code : null;
802
- }
803
- function extractWireMessage2(body) {
804
- const b = body;
805
- const message = b?.error?.message ?? b?.message;
806
- return typeof message === "string" && message.length > 0 ? message : null;
807
- }
808
- function extractRetryable2(body) {
809
- const b = body;
810
- return b?.error?.retryable === true || b?.retryable === true;
811
- }
812
- function statusToWireCode(status) {
813
- if (status === 401) return "AUTH_EXPIRED";
814
- if (status === 403) return "ACCESS_DENIED";
815
- if (status === 404) return "NOT_FOUND";
816
- if (status === 409) return "IDEMPOTENCY_CONFLICT";
817
- if (status === 421) return "MISDIRECTED_REQUEST";
818
- if (status === 429) return "RATE_LIMITED";
819
- if (status === 400 || status === 422) return "INVALID_REQUEST";
820
- if (status >= 500) return "INTERNAL_ERROR";
821
- return "";
822
- }
823
-
824
- exports.MockTransport = MockTransport;
825
- exports.wire = wire;
7
+ `}n(te,"toSseBlock");function re(e,t){return new Promise(r=>{if(t.aborted){r("abort");return}let o=null,a=n(()=>{o!==null&&clearTimeout(o),t.removeEventListener("abort",a),r("abort");},"onAbort");Number.isFinite(e)&&(o=setTimeout(()=>{t.removeEventListener("abort",a),r("timeout");},e)),t.addEventListener("abort",a,{once:true});})}n(re,"abortableSleep");function R(e,t){let r=e.headers;if(!r)return null;for(let[o,a]of Object.entries(r))if(o.toLowerCase()===t)return a;return null}n(R,"header");function Ae(e){let t=e,r=t?.error?.code??t?.code;return typeof r=="string"&&r.length>0?r:null}n(Ae,"extractWireCode");function Ne(e){let t=e,r=t?.error?.message??t?.message;return typeof r=="string"&&r.length>0?r:null}n(Ne,"extractWireMessage");function ze(e){let t=e;return t?.error?.retryable===true||t?.retryable===true}n(ze,"extractRetryable");function Le(e){return e===401?"AUTH_EXPIRED":e===403?"ACCESS_DENIED":e===404?"NOT_FOUND":e===409?"IDEMPOTENCY_CONFLICT":e===421?"MISDIRECTED_REQUEST":e===429?"RATE_LIMITED":e===400||e===422?"INVALID_REQUEST":e>=500?"INTERNAL_ERROR":""}n(Le,"statusToWireCode");exports.MockTransport=S;exports.bodies=xe;exports.wire=ee;