@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,5 +1,75 @@
1
- import { E as EverfurResult } from '../EverfurResult-D92-uL82.cjs';
2
- import { a as FetchLike } from '../config-BSjBdxrZ.cjs';
1
+ import { c as EverfurResult } from '../EverfurResult-DN9pL2Ab.cjs';
2
+ import { j as FetchLike } from '../config--Wu1Umhd.cjs';
3
+ import { P as PartnerServerClient } from '../pets-JVCXgRgR.cjs';
4
+ export { a as PartnerPet, b as PartnerPetProfile, c as PartnerPetTarget, d as PartnerPetWithProfile, e as deletePartnerPet, g as getPartnerPet, u as updatePartnerPet, f as upsertPartnerPet } from '../pets-JVCXgRgR.cjs';
5
+ export { b as PetActivityLevel, c as PetAllergy, d as PetAllergySeverity, e as PetBirthDatePrecision, f as PetCondition, a as PetHealthProfile, P as PetHealthProfileInput, g as PetIndoorOutdoor, h as PetMedication, i as PetSex } from '../profile-CSs1wlXT.cjs';
6
+ export { C as CanonicalPetSpecies, c as canonicalPetSpecies } from '../species-BXAIMh7I.cjs';
7
+
8
+ /**
9
+ * Validate a partner user_ref at the SDK boundary (server re-validates). SPEC-21 section 1.1.
10
+ *
11
+ * Three checks here mirror server behaviour that is easy to miss, and each one previously let a value
12
+ * through that the server then rejected or silently reinterpreted:
13
+ *
14
+ * - The server does `value = (raw or "").strip()` BEFORE validating, so `" "` reaches it as empty and
15
+ * fails REQUIRED even though it is three characters here.
16
+ * - That same strip means `" alice"`, `"alice "` and `"alice"` all resolve to ONE identity. Silently
17
+ * trimming would hide that; rejecting it tells the partner their two ids are about to collapse into one
18
+ * user's data.
19
+ * - The server uses Python's `str.isprintable()`, which is Unicode-aware. A NBSP, zero-width space or BOM
20
+ * is printable by an ASCII test and NOT printable by that one, so it passed here and 400'd there.
21
+ */
22
+ declare function assertValidUserRef(raw: string): string;
23
+
24
+ /** The consent you collected for this address. `partner_attested` is the one method in this version. */
25
+ interface PartnerMemberEmailConsent {
26
+ /** When the member agreed: an ISO 8601 instant, or a Date. Not in the future (the route allows five minutes of skew). */
27
+ readonly givenAt: string | Date;
28
+ readonly method: 'partner_attested';
29
+ /** The version of your consent text the member agreed to (1 to 64 characters). Never minted by Everfur. */
30
+ readonly version: string;
31
+ }
32
+ interface SetPartnerMemberNotificationProfileInput {
33
+ /** Your stable member id; the session mint's user_ref rule (1 to 128 characters, no '@', printable). */
34
+ readonly userRef: string;
35
+ /** The member's address. Everfur normalises it (trimmed, lowercased) and stores it with its hash; it is never echoed. */
36
+ readonly email: string;
37
+ readonly consent: PartnerMemberEmailConsent;
38
+ }
39
+ /** The consent stamp as Everfur stored it. */
40
+ interface PartnerMemberEmailConsentRecord {
41
+ /** ISO 8601. */
42
+ readonly givenAt: string;
43
+ readonly method: string;
44
+ readonly version: string;
45
+ }
46
+ /** A member's notification profile, MASKED: the address never comes back. */
47
+ interface PartnerMemberNotificationProfile {
48
+ readonly userRef: string;
49
+ /** The stored address in its masked form (`o***@example.com`), or null when none is on file. */
50
+ readonly emailMasked: string | null;
51
+ readonly consent: PartnerMemberEmailConsentRecord | null;
52
+ /** ISO 8601, or null: set by a later verification flow, never by this route. */
53
+ readonly emailVerifiedAt: string | null;
54
+ /** The member's own switches (`PUT /widget/v1/me/notification-preferences` from the SDK). */
55
+ readonly pushEnabled: boolean;
56
+ readonly emailEnabled: boolean;
57
+ /** ISO 8601, or null: set by the one-click unsubscribe link in Everfur's mail, cleared by a new stamp. */
58
+ readonly unsubscribedAt: string | null;
59
+ /** How many of this member's devices are registered for push. */
60
+ readonly activeDevices: number;
61
+ /** ISO 8601. */
62
+ readonly updatedAt: string;
63
+ }
64
+ /**
65
+ * Supply (or replace) a member's email with its consent stamp. Creates the member on first use.
66
+ *
67
+ * Settles to an `EverfurResult` for HTTP and network failures (`validationFailed` with `reasonCode` `consent_required`,
68
+ * `email_invalid` or `consent_invalid`; the not-found error while the routes are dark; `accessDenied` for a restricted
69
+ * key without `pets.profile.update`; `rateLimited`; `serviceUnavailable` mid-erasure). Throws `EverfurConfigError` for
70
+ * a request that can never be accepted: a malformed key, `userRef`, address or consent.
71
+ */
72
+ declare function setPartnerMemberNotificationProfile(client: PartnerServerClient, input: SetPartnerMemberNotificationProfileInput): Promise<EverfurResult<PartnerMemberNotificationProfile>>;
3
73
 
4
74
  interface MintSessionParams {
5
75
  /** env-derived base URL (resolveApiBaseUrl output), no trailing slash. */
@@ -29,20 +99,5 @@ interface SessionMint {
29
99
  * partner backend's helper for a TokenProvider implementation; it is not called on a device.
30
100
  */
31
101
  declare function mintPartnerSession(params: MintSessionParams): Promise<EverfurResult<SessionMint>>;
32
- /**
33
- * Validate a partner user_ref at the SDK boundary (server re-validates). SPEC-21 section 1.1.
34
- *
35
- * Three checks here mirror server behaviour that is easy to miss, and each one previously let a value
36
- * through that the server then rejected or silently reinterpreted:
37
- *
38
- * - The server does `value = (raw or "").strip()` BEFORE validating, so `" "` reaches it as empty and
39
- * fails REQUIRED even though it is three characters here.
40
- * - That same strip means `" alice"`, `"alice "` and `"alice"` all resolve to ONE identity. Silently
41
- * trimming would hide that; rejecting it tells the partner their two ids are about to collapse into one
42
- * user's data.
43
- * - The server uses Python's `str.isprintable()`, which is Unicode-aware. A NBSP, zero-width space or BOM
44
- * is printable by an ASCII test and NOT printable by that one, so it passed here and 400'd there.
45
- */
46
- declare function assertValidUserRef(raw: string): string;
47
102
 
48
- export { type MintSessionParams, type SessionMint, assertValidUserRef, mintPartnerSession };
103
+ export { type MintSessionParams, type PartnerMemberEmailConsent, type PartnerMemberEmailConsentRecord, type PartnerMemberNotificationProfile, PartnerServerClient, type SessionMint, type SetPartnerMemberNotificationProfileInput, assertValidUserRef, mintPartnerSession, setPartnerMemberNotificationProfile };
@@ -1,5 +1,75 @@
1
- import { E as EverfurResult } from '../EverfurResult-D92-uL82.js';
2
- import { a as FetchLike } from '../config-CiJ0PVBB.js';
1
+ import { c as EverfurResult } from '../EverfurResult-DN9pL2Ab.js';
2
+ import { j as FetchLike } from '../config-C7eb_IMD.js';
3
+ import { P as PartnerServerClient } from '../pets-DJv2sj2H.js';
4
+ export { a as PartnerPet, b as PartnerPetProfile, c as PartnerPetTarget, d as PartnerPetWithProfile, e as deletePartnerPet, g as getPartnerPet, u as updatePartnerPet, f as upsertPartnerPet } from '../pets-DJv2sj2H.js';
5
+ export { b as PetActivityLevel, c as PetAllergy, d as PetAllergySeverity, e as PetBirthDatePrecision, f as PetCondition, a as PetHealthProfile, P as PetHealthProfileInput, g as PetIndoorOutdoor, h as PetMedication, i as PetSex } from '../profile-CSs1wlXT.js';
6
+ export { C as CanonicalPetSpecies, c as canonicalPetSpecies } from '../species-BXAIMh7I.js';
7
+
8
+ /**
9
+ * Validate a partner user_ref at the SDK boundary (server re-validates). SPEC-21 section 1.1.
10
+ *
11
+ * Three checks here mirror server behaviour that is easy to miss, and each one previously let a value
12
+ * through that the server then rejected or silently reinterpreted:
13
+ *
14
+ * - The server does `value = (raw or "").strip()` BEFORE validating, so `" "` reaches it as empty and
15
+ * fails REQUIRED even though it is three characters here.
16
+ * - That same strip means `" alice"`, `"alice "` and `"alice"` all resolve to ONE identity. Silently
17
+ * trimming would hide that; rejecting it tells the partner their two ids are about to collapse into one
18
+ * user's data.
19
+ * - The server uses Python's `str.isprintable()`, which is Unicode-aware. A NBSP, zero-width space or BOM
20
+ * is printable by an ASCII test and NOT printable by that one, so it passed here and 400'd there.
21
+ */
22
+ declare function assertValidUserRef(raw: string): string;
23
+
24
+ /** The consent you collected for this address. `partner_attested` is the one method in this version. */
25
+ interface PartnerMemberEmailConsent {
26
+ /** When the member agreed: an ISO 8601 instant, or a Date. Not in the future (the route allows five minutes of skew). */
27
+ readonly givenAt: string | Date;
28
+ readonly method: 'partner_attested';
29
+ /** The version of your consent text the member agreed to (1 to 64 characters). Never minted by Everfur. */
30
+ readonly version: string;
31
+ }
32
+ interface SetPartnerMemberNotificationProfileInput {
33
+ /** Your stable member id; the session mint's user_ref rule (1 to 128 characters, no '@', printable). */
34
+ readonly userRef: string;
35
+ /** The member's address. Everfur normalises it (trimmed, lowercased) and stores it with its hash; it is never echoed. */
36
+ readonly email: string;
37
+ readonly consent: PartnerMemberEmailConsent;
38
+ }
39
+ /** The consent stamp as Everfur stored it. */
40
+ interface PartnerMemberEmailConsentRecord {
41
+ /** ISO 8601. */
42
+ readonly givenAt: string;
43
+ readonly method: string;
44
+ readonly version: string;
45
+ }
46
+ /** A member's notification profile, MASKED: the address never comes back. */
47
+ interface PartnerMemberNotificationProfile {
48
+ readonly userRef: string;
49
+ /** The stored address in its masked form (`o***@example.com`), or null when none is on file. */
50
+ readonly emailMasked: string | null;
51
+ readonly consent: PartnerMemberEmailConsentRecord | null;
52
+ /** ISO 8601, or null: set by a later verification flow, never by this route. */
53
+ readonly emailVerifiedAt: string | null;
54
+ /** The member's own switches (`PUT /widget/v1/me/notification-preferences` from the SDK). */
55
+ readonly pushEnabled: boolean;
56
+ readonly emailEnabled: boolean;
57
+ /** ISO 8601, or null: set by the one-click unsubscribe link in Everfur's mail, cleared by a new stamp. */
58
+ readonly unsubscribedAt: string | null;
59
+ /** How many of this member's devices are registered for push. */
60
+ readonly activeDevices: number;
61
+ /** ISO 8601. */
62
+ readonly updatedAt: string;
63
+ }
64
+ /**
65
+ * Supply (or replace) a member's email with its consent stamp. Creates the member on first use.
66
+ *
67
+ * Settles to an `EverfurResult` for HTTP and network failures (`validationFailed` with `reasonCode` `consent_required`,
68
+ * `email_invalid` or `consent_invalid`; the not-found error while the routes are dark; `accessDenied` for a restricted
69
+ * key without `pets.profile.update`; `rateLimited`; `serviceUnavailable` mid-erasure). Throws `EverfurConfigError` for
70
+ * a request that can never be accepted: a malformed key, `userRef`, address or consent.
71
+ */
72
+ declare function setPartnerMemberNotificationProfile(client: PartnerServerClient, input: SetPartnerMemberNotificationProfileInput): Promise<EverfurResult<PartnerMemberNotificationProfile>>;
3
73
 
4
74
  interface MintSessionParams {
5
75
  /** env-derived base URL (resolveApiBaseUrl output), no trailing slash. */
@@ -29,20 +99,5 @@ interface SessionMint {
29
99
  * partner backend's helper for a TokenProvider implementation; it is not called on a device.
30
100
  */
31
101
  declare function mintPartnerSession(params: MintSessionParams): Promise<EverfurResult<SessionMint>>;
32
- /**
33
- * Validate a partner user_ref at the SDK boundary (server re-validates). SPEC-21 section 1.1.
34
- *
35
- * Three checks here mirror server behaviour that is easy to miss, and each one previously let a value
36
- * through that the server then rejected or silently reinterpreted:
37
- *
38
- * - The server does `value = (raw or "").strip()` BEFORE validating, so `" "` reaches it as empty and
39
- * fails REQUIRED even though it is three characters here.
40
- * - That same strip means `" alice"`, `"alice "` and `"alice"` all resolve to ONE identity. Silently
41
- * trimming would hide that; rejecting it tells the partner their two ids are about to collapse into one
42
- * user's data.
43
- * - The server uses Python's `str.isprintable()`, which is Unicode-aware. A NBSP, zero-width space or BOM
44
- * is printable by an ASCII test and NOT printable by that one, so it passed here and 400'd there.
45
- */
46
- declare function assertValidUserRef(raw: string): string;
47
102
 
48
- export { type MintSessionParams, type SessionMint, assertValidUserRef, mintPartnerSession };
103
+ export { type MintSessionParams, type PartnerMemberEmailConsent, type PartnerMemberEmailConsentRecord, type PartnerMemberNotificationProfile, PartnerServerClient, type SessionMint, type SetPartnerMemberNotificationProfileInput, assertValidUserRef, mintPartnerSession, setPartnerMemberNotificationProfile };