@everfur/sdk 0.15.1 → 0.16.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 (164) hide show
  1. package/CHANGELOG.md +122 -0
  2. package/dist/{DepthViews.d-BuEWI6Ln.d.ts → DepthViews.d-A7S-XYiI.d.ts} +1 -1
  3. package/dist/{DepthViews.d--1daZblh.d.cts → DepthViews.d-C4TIZDfz.d.cts} +1 -1
  4. package/dist/{DepthViews.d-CKTnEeUo.d.ts → DepthViews.d-CNjaHLAS.d.ts} +1 -1
  5. package/dist/{DepthViews.d-PuBGdAYk.d.cts → DepthViews.d-DapfRz1S.d.cts} +1 -1
  6. package/dist/{RecordsPage.d-CBB8sfoY.d.ts → RecordsPage.d-6WMbieaV.d.ts} +1 -1
  7. package/dist/{RecordsPage.d-Dq5gpQG0.d.cts → RecordsPage.d-B2gLf8RH.d.cts} +1 -1
  8. package/dist/animations/index.d.cts +5 -5
  9. package/dist/animations/index.d.ts +5 -5
  10. package/dist/{Chat.d-BlsnQwCQ.d.ts → appStateLifecycle.d-B7L427MF.d.ts} +64 -141
  11. package/dist/{Chat.d-BO5iJsR2.d.cts → appStateLifecycle.d-CWedOJq4.d.cts} +64 -141
  12. package/dist/{attachments.d-DRHsJkni.d.cts → attachments.d-BARh-PrJ.d.cts} +24 -6
  13. package/dist/{attachments.d-DFP9yvz9.d.ts → attachments.d-CB0R1_vK.d.ts} +24 -6
  14. package/dist/{attachments.d-C2nkIyDB.d.ts → attachments.d-CPgp4_W-.d.ts} +2 -2
  15. package/dist/{attachments.d-DRUC35Ti.d.cts → attachments.d-DeoaCEMD.d.cts} +2 -2
  16. package/dist/{bookingCopy.d-CFL-1Be2.d.ts → bookingCopy.d-BakTjvWw.d.ts} +2 -2
  17. package/dist/{bookingCopy.d-bF_QknDC.d.cts → bookingCopy.d-CVmpuk9C.d.cts} +2 -2
  18. package/dist/{casesRepository.d-C__BnffJ.d.ts → casesRepository.d-CuokarTU.d.ts} +1 -1
  19. package/dist/{casesRepository.d-BMOnT1fg.d.cts → casesRepository.d-DKRLtYb8.d.cts} +1 -1
  20. package/dist/chat/index.cjs +227 -213
  21. package/dist/chat/index.d.cts +11 -9
  22. package/dist/chat/index.d.ts +11 -9
  23. package/dist/chat/index.js +228 -214
  24. package/dist/client/index.cjs +1 -1
  25. package/dist/client/index.d.cts +6 -6
  26. package/dist/client/index.d.ts +6 -6
  27. package/dist/client/index.js +1 -1
  28. package/dist/{clinicBatch.d-D68RYvc3.d.ts → clinicBatch.d-BP_Rpvcy.d.ts} +2 -2
  29. package/dist/{clinicBatch.d-C5deJ4xY.d.cts → clinicBatch.d-BTDdhMQ2.d.cts} +2 -2
  30. package/dist/{config.d-BQgrIDdu.d.cts → config.d-84fNJFv9.d.cts} +1 -1
  31. package/dist/{config.d-XSMThgVj.d.ts → config.d-B4-Mrwq2.d.ts} +1 -1
  32. package/dist/consent/index.d.cts +5 -5
  33. package/dist/consent/index.d.ts +5 -5
  34. package/dist/{context.d-Ba8YyJpk.d.cts → context.d-87MMrNm6.d.cts} +5 -5
  35. package/dist/{context.d-xoh5vmxS.d.ts → context.d-rNGMZH8T.d.ts} +5 -5
  36. package/dist/{copy.d-Cq-s-UUv.d.cts → copy.d-CJOLhJac.d.cts} +2 -2
  37. package/dist/{copy.d-HV9fU5kh.d.ts → copy.d-DbwWriBp.d.ts} +2 -2
  38. package/dist/core/index.cjs +1 -1
  39. package/dist/core/index.d.cts +13 -13
  40. package/dist/core/index.d.ts +13 -13
  41. package/dist/core/index.js +1 -1
  42. package/dist/{depth.d-DYnkz8Re.d.cts → depth.d-CXpPxNSK.d.cts} +2 -2
  43. package/dist/{depth.d-D7kKiYl7.d.ts → depth.d-Dca1T_RH.d.ts} +2 -2
  44. package/dist/{entitlementRepository.d-DmnUZLl_.d.ts → entitlementRepository.d-BBRYTUlp.d.ts} +2 -2
  45. package/dist/{entitlementRepository.d-B_kEPLhz.d.cts → entitlementRepository.d-DBhzBQjZ.d.cts} +2 -2
  46. package/dist/{focus.d-BHm_QtQ9.d.cts → focus.d-BQnOVAql.d.cts} +3 -3
  47. package/dist/{focus.d-CjL6Cj0m.d.ts → focus.d-BZ2sEpbU.d.ts} +3 -3
  48. package/dist/health-plan/index.cjs +134 -131
  49. package/dist/health-plan/index.d.cts +77 -24
  50. package/dist/health-plan/index.d.ts +77 -24
  51. package/dist/health-plan/index.js +134 -131
  52. package/dist/{idempotency.d-BSRK8od4.d.cts → idempotency.d-9wNNohIA.d.cts} +1 -1
  53. package/dist/{idempotency.d-CFc4CCc9.d.ts → idempotency.d-BdB17veP.d.ts} +1 -1
  54. package/dist/{identity.d-Be2Es9Td.d.ts → identity.d-DxNvhj3a.d.ts} +1 -1
  55. package/dist/{identity.d-HbwYQ4-z.d.cts → identity.d-nRZBzkG2.d.cts} +1 -1
  56. package/dist/index.cjs +232 -218
  57. package/dist/index.d.cts +14 -12
  58. package/dist/index.d.ts +14 -12
  59. package/dist/index.js +233 -219
  60. package/dist/{introEvents.d-Dr34KIaD.d.cts → introEvents.d-CQeiUeLn.d.cts} +1 -1
  61. package/dist/{introEvents.d-DflJ6J9H.d.ts → introEvents.d-bkIxpIKr.d.ts} +1 -1
  62. package/dist/notifications/index.d.cts +4 -4
  63. package/dist/notifications/index.d.ts +4 -4
  64. package/dist/{optInView.d-D23o1gtT.d.cts → optInView.d-BbVUUeoG.d.cts} +2 -2
  65. package/dist/{optInView.d-3mbj1mR6.d.ts → optInView.d-DVJcB4Gp.d.ts} +2 -2
  66. package/dist/{parse.d-BERabxHw.d.ts → parse.d-CGeJrcAC.d.ts} +1 -1
  67. package/dist/{parse.d-4lUXdmvY.d.cts → parse.d-Dk0BasyK.d.cts} +1 -1
  68. package/dist/{pets.d-D_ayuqjp.d.ts → pets.d-DBopbeRe.d.ts} +1 -1
  69. package/dist/{pets.d-CHU0UbXt.d.cts → pets.d-DVptPgi0.d.cts} +1 -1
  70. package/dist/{petsRepository.d-DUaAWoTv.d.ts → petsRepository.d-BtuooSOW.d.ts} +1 -1
  71. package/dist/{petsRepository.d-Bwfe8yuR.d.cts → petsRepository.d-Daef7u0o.d.cts} +1 -1
  72. package/dist/{ports.d-DzEJMVRs.d.ts → ports.d-BxCVSbSi.d.ts} +4 -4
  73. package/dist/{ports.d-ClbPRUtx.d.cts → ports.d-CAT70bVD.d.cts} +4 -4
  74. package/dist/records/depth/index.cjs +1 -1
  75. package/dist/records/depth/index.d.cts +9 -9
  76. package/dist/records/depth/index.d.ts +9 -9
  77. package/dist/records/depth/index.js +1 -1
  78. package/dist/records/index.cjs +242 -200
  79. package/dist/records/index.d.cts +169 -73
  80. package/dist/records/index.d.ts +169 -73
  81. package/dist/records/index.js +243 -201
  82. package/dist/{requestFunnel.d-YabU6G-Z.d.ts → requestFunnel.d-Cxt0JqYx.d.ts} +2 -2
  83. package/dist/{requestFunnel.d-JoqddYSx.d.cts → requestFunnel.d-mEu6B-n8.d.cts} +2 -2
  84. package/dist/{runtimeTypes.d-DQTBJAbk.d.ts → runtimeTypes.d-Bkcj_XQy.d.ts} +4 -4
  85. package/dist/{runtimeTypes.d-Cv38YuzP.d.cts → runtimeTypes.d-D_qHJROH.d.cts} +4 -4
  86. package/dist/{screenProps.d-C-AuHoyF.d.cts → screenProps.d-CR1lrpzR.d.cts} +2 -2
  87. package/dist/{screenProps.d-BuJLzFkN.d.ts → screenProps.d-D9n-ancr.d.ts} +2 -2
  88. package/dist/server/events/index.cjs +1 -1
  89. package/dist/server/events/index.d.cts +2 -2
  90. package/dist/server/events/index.d.ts +2 -2
  91. package/dist/server/events/index.js +1 -1
  92. package/dist/server/index.cjs +1 -1
  93. package/dist/server/index.d.cts +3 -3
  94. package/dist/server/index.d.ts +3 -3
  95. package/dist/server/index.js +1 -1
  96. package/dist/shop/index.cjs +16 -16
  97. package/dist/shop/index.d.cts +12 -3
  98. package/dist/shop/index.d.ts +12 -3
  99. package/dist/shop/index.js +16 -16
  100. package/dist/tabs/index.cjs +4 -4
  101. package/dist/tabs/index.d.cts +34 -15
  102. package/dist/tabs/index.d.ts +34 -15
  103. package/dist/tabs/index.js +5 -5
  104. package/dist/{tabsModel.d-BfIQg6yS.d.ts → tabsModel.d-B7QMug1u.d.cts} +1 -17
  105. package/dist/{tabsModel.d-BfIQg6yS.d.cts → tabsModel.d-B7QMug1u.d.ts} +1 -17
  106. package/dist/televet/booking/index.d.cts +6 -6
  107. package/dist/televet/booking/index.d.ts +6 -6
  108. package/dist/testing/index.d.cts +1 -1
  109. package/dist/testing/index.d.ts +1 -1
  110. package/dist/testing/rn/index.cjs +1 -1
  111. package/dist/testing/rn/index.d.cts +7 -7
  112. package/dist/testing/rn/index.d.ts +7 -7
  113. package/dist/testing/rn/index.js +1 -1
  114. package/dist/testing/web/index.d.cts +7 -7
  115. package/dist/testing/web/index.d.ts +7 -7
  116. package/dist/texting/index.cjs +21 -16
  117. package/dist/texting/index.d.cts +5 -5
  118. package/dist/texting/index.d.ts +5 -5
  119. package/dist/texting/index.js +22 -17
  120. package/dist/threadOptions.d-6hfQS1x7.d.cts +55 -0
  121. package/dist/threadOptions.d-6hfQS1x7.d.ts +55 -0
  122. package/dist/threadOptions.d-BEG-LZrC.d.cts +147 -0
  123. package/dist/threadOptions.d-BerQM1Ql.d.ts +147 -0
  124. package/dist/{threadOptions.d-8x_1evAr.d.ts → threadOptions.d-BgBvSIw8.d.ts} +6 -40
  125. package/dist/{threadOptions.d-DBrmOwmb.d.cts → threadOptions.d-P9v7I7va.d.cts} +6 -40
  126. package/dist/{timelineRows.d-B6lLC8Ud.d.cts → timelineRows.d-C04lp_Vj.d.cts} +1 -1
  127. package/dist/{timelineRows.d-Brlkti-G.d.ts → timelineRows.d-_7JemrY-.d.ts} +1 -1
  128. package/dist/{planSignals.d-CON9gTvJ.d.ts → useHealthPlanSubscription.d-CUbHE6eK.d.ts} +81 -3
  129. package/dist/{planSignals.d-Dha2CMDF.d.cts → useHealthPlanSubscription.d-OhLZpn-n.d.cts} +81 -3
  130. package/dist/{usePresentation.d-Bne14SlX.d.ts → usePresentation.d-CBtBx38t.d.ts} +40 -40
  131. package/dist/{usePresentation.d-BcdCIuEU.d.cts → usePresentation.d-YkJeq9mf.d.cts} +40 -40
  132. package/dist/{useRecordsDepth.d-DAa169VY.d.cts → useRecordsDepth.d-FTImzp6T.d.cts} +1 -1
  133. package/dist/{useRecordsDepth.d-Cd6J03o5.d.ts → useRecordsDepth.d-_rqDIvoq.d.ts} +1 -1
  134. package/dist/{view.d-3d5_O7Xk.d.cts → view.d-Dd6AfMvG.d.cts} +3 -3
  135. package/dist/{view.d-DkGM8GNA.d.ts → view.d-gmYinlac.d.ts} +3 -3
  136. package/dist/web/consent/index.d.cts +5 -5
  137. package/dist/web/consent/index.d.ts +5 -5
  138. package/dist/web/health-plan/index.cjs +1 -1
  139. package/dist/web/health-plan/index.d.cts +15 -69
  140. package/dist/web/health-plan/index.d.ts +15 -69
  141. package/dist/web/health-plan/index.js +1 -1
  142. package/dist/web/index.cjs +5 -5
  143. package/dist/web/index.d.cts +26 -43
  144. package/dist/web/index.d.ts +26 -43
  145. package/dist/web/index.js +5 -5
  146. package/dist/web/intro/index.d.cts +6 -6
  147. package/dist/web/intro/index.d.ts +6 -6
  148. package/dist/web/notifications/index.d.cts +3 -3
  149. package/dist/web/notifications/index.d.ts +3 -3
  150. package/dist/web/records/depth/index.d.cts +9 -9
  151. package/dist/web/records/depth/index.d.ts +9 -9
  152. package/dist/web/records/index.d.cts +11 -11
  153. package/dist/web/records/index.d.ts +11 -11
  154. package/dist/web/records-sheet/index.cjs +10 -10
  155. package/dist/web/records-sheet/index.js +10 -10
  156. package/dist/web/shop/index.cjs +11 -11
  157. package/dist/web/shop/index.d.cts +3 -3
  158. package/dist/web/shop/index.d.ts +3 -3
  159. package/dist/web/shop/index.js +11 -11
  160. package/dist/web/televet/booking/index.d.cts +6 -6
  161. package/dist/web/televet/booking/index.d.ts +6 -6
  162. package/dist/web/texting/index.d.cts +5 -5
  163. package/dist/web/texting/index.d.ts +5 -5
  164. package/package.json +6 -2
package/CHANGELOG.md CHANGED
@@ -10,6 +10,128 @@ changes that has not been earned by any production integration yet.
10
10
 
11
11
  ## [Unreleased]
12
12
 
13
+ ## [0.16.0] - 2026-10-24
14
+
15
+ This release covers the React Native parity work: the React Native chat, tabs, Health Plan, shop, records and
16
+ texting now follow the web. Web output is unchanged.
17
+
18
+ ### Added
19
+
20
+ - **Chat dictation (React Native).** `registerEverfurDictation(loader)` turns on the composer mic. The loader returns
21
+ the optional peer `expo-speech-recognition` (version 1 or later); without it the mic is not drawn. A registration
22
+ made after the chat mounts is picked up. New export `EverfurDictationLoader`.
23
+ - **Chat opening card and empty header (React Native).** `ask(prompt, card)` and the `initialAskCard` prop show the
24
+ same opening card as the web, and `renderEmptyHeader` draws above an empty thread. New exports
25
+ `EverfurChatOpeningCard` (also from `@everfur/sdk/tabs`), `EverfurChatEmptyHeaderContext` and `ChatFollowUpPolicy`
26
+ (the `followUpPolicy` prop). The opening card takes `styles` (card, icon, kicker, title, body), and
27
+ `answerCards.styles` adds `feedback`, `feedbackChip`, `feedbackChipText`, `followUps`, `followUpsLabel`,
28
+ `followUp`, `followUpText`, `followUpAction` and `followUpActionText`: the web's `classNames` as React Native styles.
29
+ - **Chat foreground re-read (React Native).** `createAppStateLifecycle()` builds a lifecycle from `AppState`.
30
+ - **Health Plan (React Native).** `HealthPlanTopRisk`, `useHealthPlanTopCard` and the top card exports,
31
+ `HealthPlanScrollScope`, `focus.trackingTexts`, `onAvailability`, `onAsk`, `emptyCopy` (`HealthPlanEmptyCopy`),
32
+ `healthPlanPetWords` (`HealthPlanPetPronouns`), and re-exports of the subscription hooks and mappers.
33
+ - **Shop cart storage (React Native).** `EverfurShop` takes `cartStorageKey`. The cart and checkout are kept in the
34
+ `KvPort`.
35
+ - **Records (React Native).** `recordsSheet` and `RECORDS_SHEET_ROW_BUTTON_STYLE`, and the `EverfurRecords` props
36
+ `renderUpcomingCareAction`, `noVet`, `weightUnit`, `onOpenPlan`, `onOpenScreenings`, `onRequestFromClinic`,
37
+ `onNavigate` and `alwaysShowWays`. The sheet takes the `raph` palette, fonts, `topRiskLine` and `stage`, and gains
38
+ the care timeline and the medications, history and weight cards, `RequestDocumentsList`, and pull to refresh.
39
+
40
+ ### Changed
41
+
42
+ - **Chat re-reads in the foreground by default (React Native).** The chat and the tabs re-read the thread when the app
43
+ comes back to the foreground. Pass `lifecycle={null}` to opt out. In the tabs a hidden Ask pane does not re-read.
44
+ - **Chat copy matches the web (React Native).** The footnote is the web footnote, a failed turn uses the web title,
45
+ and the vet chip reads "Book a video visit".
46
+ - **Chat behaviour matches the web (React Native).** `answer_footer` is drawn outside the tabs too. Non-urgent banners
47
+ no longer alert. Past check-ins render as plain rows. New chat sits in the chat header. The WORSE check-in tries the
48
+ vet visit first. `maxPerMessage` defaults to 5. A top card with no `closeLabel` draws no close. One pet with
49
+ `onAddPet` opens the switcher. `onOpenHealthPlan` receives the pet.
50
+ - **Chat look matches the web (React Native).** The texting line puts the name over its bubble and its two answers
51
+ side by side as pills. Footer controls are spaced as on the web, and the cards style draws no footer under the
52
+ member's question. The footnote in the thread is left-aligned at the caption size. The failed-turn notice uses the
53
+ web's cream card and body-face title, and no longer takes the `card` slot.
54
+ - **Records session-required state (React Native).** The sheet, dashboard, requests, request and document screens
55
+ show a session-required state when there is no session. Hosts that mount Records before sign-in now see it.
56
+ The consent screen has one sign-mode toggle and Cancel, and the consent gate is no longer a dead end.
57
+ - **Health Plan and shop (React Native).** `onAvailabilityChange` is deprecated for `onAvailability`. Loading shows a
58
+ skeleton. Buy controls are always drawn and are disabled when unpriced. Order steps are always 4. The weight limit
59
+ is 90 kg. A dev warning shows when the shop is on with no return URL.
60
+ - **Shared types.** The chat opening card, empty header and top card shapes, and the Health Plan top card helpers,
61
+ now live in one shared module for web and React Native. Public type names are unchanged.
62
+
63
+ ### Fixed
64
+
65
+ - **Chat dictation (React Native).** Dictation stops when the conversation changes and when the Ask pane is hidden.
66
+ The draft is not written while dictating. The dictation error line and the feedback failed note are announced on
67
+ iOS and are a live region on Android.
68
+ - **Chat (React Native).** A refused thumb shows the feedback failed note. An empty reasons submit sends nothing.
69
+ Load earlier keeps the reading position.
70
+ - **Health Plan (React Native).** A failed return shows a toast.
71
+ - **Texting (React Native).** The pop-up scrolls, avoids the keyboard and works in both orientations, its text is
72
+ centred, and announcements reach iOS. Buttons are 44 high, the pill edge changes colour on focus, and the opt-in card shows a
73
+ busy state. The entry's placeholders are grey, and focus moves to the code field on the code step.
74
+
75
+ ## [0.15.6] - 2026-10-24
76
+
77
+ ### Fixed
78
+
79
+ - **Shop: an order whose payment failed no longer reads confirmed.** Under "Payment failed" the order page drew the
80
+ status line too ("Confirmed, sending to the pharmacy" for an order waiting to be placed). The line is now left out
81
+ while the payment has failed or still waits for the member. Web and React Native. No new copy.
82
+ - **Shop: Paid with only on a paid order.** The card row showed on unpaid, voided and failed orders. It now shows only
83
+ once the payment is authorized or captured. Web and React Native. No new copy.
84
+ - **Shop: the cart drops the placed lines before the card step opens.** A checkout that needs 3-D Secure left the
85
+ lines in the cart when the in-app browser or the redirect did not hand back. `confirmWithPayerActions` takes a
86
+ `beforePayerAction` hook, and the cart checkout empties the placed lines there. Web and React Native.
87
+
88
+ ## [0.15.5] - 2026-10-24
89
+
90
+ ### Fixed
91
+
92
+ - **Shop: no stale card line on a paid order (React Native).** When the bank's 3-D Secure step finished but the
93
+ in-app browser closed before it handed back, the order page still said the card was not verified although the
94
+ order already held the payment. The order page now drops that line once the order reads authorized or captured
95
+ and has nothing left to pay. No new copy.
96
+
97
+ ## [0.15.4] - 2026-10-24
98
+
99
+ ### Fixed
100
+
101
+ - **Shop: Buy again on an Rx-only order (React Native).** A delivered or ended order that holds only Rx items now
102
+ offers Buy again, which opens the product page (where the prescription is chosen), as the web order page already
103
+ did. A mixed order still puts only its items with no prescription back in the cart.
104
+
105
+ ## [0.15.3] - 2026-10-23
106
+
107
+ ### Fixed
108
+
109
+ - **Shop: the order headline says its status once (web and React Native).** A shipped order with no arrival date
110
+ showed "Shipped" as the headline and again as the line under it. A status line that repeats the headline is no
111
+ longer drawn.
112
+ - **Shop: Buy again only on an order that is over (web and React Native).** Buy again shows on a delivered order and on
113
+ one that ended without arriving (cancelled, not approved, being looked into). An order still on its way (in review,
114
+ being prepared, shipped) no longer offers it.
115
+ - **Shop: no main landmark inside the host's (web).** The cart, orders, order and placed pages drew their own `<main>`
116
+ inside the host page's `<main>`. They now use a plain container; the host page owns the landmark.
117
+
118
+ ## [0.15.2] - 2026-10-23
119
+
120
+ ### Fixed
121
+
122
+ - **Shop: the order pages read again (web and React Native).** An order and the orders list read again behind what is
123
+ drawn, with no loading state, when the app comes back from the background on React Native (`AppState`) and when the
124
+ tab becomes visible again on the web (`visibilitychange`). A burst of signals makes one request, a read already in
125
+ flight is joined, and a failed re-read keeps the page shown. The list does not re-read once older pages are loaded.
126
+ On React Native the order and orders screens also refresh on a pull (`RefreshControl`).
127
+ - **Shop: a refused cancel reads the order again (web and React Native).** When the OMS refuses a cancel (the order
128
+ shipped or was already cancelled), the order is read again so Cancel goes when it no longer applies.
129
+ - **Shop: the refund row counts only refunds that succeeded (web and React Native).** A pending or failed refund no
130
+ longer adds to the amount shown.
131
+ - **Shop: a prescription that cannot be filled right now (web and React Native).** The product page for a prescription
132
+ that is `being_prepared` (an open order is using it) or `too_soon` (filled too recently) now says the pet has a
133
+ prescription with the `rxBeingPrepared` or `rxTooSoon` line, instead of "No prescription on file" with Book a visit.
134
+
13
135
  ## [0.15.1] - 2026-10-23
14
136
 
15
137
  This patch changes packaging and documentation for the Everfur SDK License version 2.1, and carries the Records,
@@ -1,6 +1,6 @@
1
1
  /*! @everfur/sdk. Copyright (c) 2026 Strand Health Inc. dba Everfur. All rights reserved. Use is subject to the Everfur SDK License: https://docs.everfur.com/license */
2
2
  import { CSSProperties, ReactNode } from 'react';
3
- import { c as RecordsScreenBaseProps } from './screenProps.d-BuJLzFkN.js';
3
+ import { c as RecordsScreenBaseProps } from './screenProps.d-D9n-ancr.js';
4
4
 
5
5
  interface EverfurRecordsDepthProps extends Pick<RecordsScreenBaseProps, 'petRef' | 'petName' | 'onNavigate' | 'onBack'> {
6
6
  readonly style?: CSSProperties;
@@ -1,6 +1,6 @@
1
1
  /*! @everfur/sdk. Copyright (c) 2026 Strand Health Inc. dba Everfur. All rights reserved. Use is subject to the Everfur SDK License: https://docs.everfur.com/license */
2
2
  import { CSSProperties, ReactNode } from 'react';
3
- import { c as RecordsScreenBaseProps } from './screenProps.d-C-AuHoyF.cjs';
3
+ import { c as RecordsScreenBaseProps } from './screenProps.d-CR1lrpzR.cjs';
4
4
 
5
5
  interface EverfurRecordsDepthProps extends Pick<RecordsScreenBaseProps, 'petRef' | 'petName' | 'onNavigate' | 'onBack'> {
6
6
  readonly style?: CSSProperties;
@@ -1,7 +1,7 @@
1
1
  /*! @everfur/sdk. Copyright (c) 2026 Strand Health Inc. dba Everfur. All rights reserved. Use is subject to the Everfur SDK License: https://docs.everfur.com/license */
2
2
  import { ReactNode } from 'react';
3
3
  import { StyleProp, ViewStyle } from 'react-native';
4
- import { c as RecordsScreenBaseProps } from './screenProps.d-BuJLzFkN.js';
4
+ import { c as RecordsScreenBaseProps } from './screenProps.d-D9n-ancr.js';
5
5
 
6
6
  interface EverfurRecordsDepthProps extends Pick<RecordsScreenBaseProps, 'petRef' | 'petName' | 'onNavigate' | 'onBack'> {
7
7
  readonly style?: StyleProp<ViewStyle>;
@@ -1,7 +1,7 @@
1
1
  /*! @everfur/sdk. Copyright (c) 2026 Strand Health Inc. dba Everfur. All rights reserved. Use is subject to the Everfur SDK License: https://docs.everfur.com/license */
2
2
  import { ReactNode } from 'react';
3
3
  import { StyleProp, ViewStyle } from 'react-native';
4
- import { c as RecordsScreenBaseProps } from './screenProps.d-C-AuHoyF.cjs';
4
+ import { c as RecordsScreenBaseProps } from './screenProps.d-CR1lrpzR.cjs';
5
5
 
6
6
  interface EverfurRecordsDepthProps extends Pick<RecordsScreenBaseProps, 'petRef' | 'petName' | 'onNavigate' | 'onBack'> {
7
7
  readonly style?: StyleProp<ViewStyle>;
@@ -3,7 +3,7 @@ import { CSSProperties, ReactNode } from 'react';
3
3
  import { R as RecordsClinicController, C as CaptureRecordsSignature } from './clinicRequestProps.d-CjsMg_OD.js';
4
4
  import { R as RecordsController } from './useRecords.d-DWk61a4c.js';
5
5
  import { c as RecordForwardItem } from './models.d-DOwnr8fi.js';
6
- import { c as RecordsScreenBaseProps } from './screenProps.d-BuJLzFkN.js';
6
+ import { c as RecordsScreenBaseProps } from './screenProps.d-D9n-ancr.js';
7
7
  import { E as EverfurRecordsSheet } from './sheetSeam.d-B09jf4YC.js';
8
8
 
9
9
  interface EverfurRecordsPageProps extends RecordsScreenBaseProps {
@@ -3,7 +3,7 @@ import { CSSProperties, ReactNode } from 'react';
3
3
  import { R as RecordsClinicController, C as CaptureRecordsSignature } from './clinicRequestProps.d-1dCtouGA.cjs';
4
4
  import { R as RecordsController } from './useRecords.d-BYNX01El.cjs';
5
5
  import { c as RecordForwardItem } from './models.d-BSqvbTE1.cjs';
6
- import { c as RecordsScreenBaseProps } from './screenProps.d-C-AuHoyF.cjs';
6
+ import { c as RecordsScreenBaseProps } from './screenProps.d-CR1lrpzR.cjs';
7
7
  import { E as EverfurRecordsSheet } from './sheetSeam.d-BBuEIVsa.cjs';
8
8
 
9
9
  interface EverfurRecordsPageProps extends RecordsScreenBaseProps {
@@ -2,8 +2,8 @@
2
2
  import { ReactNode } from 'react';
3
3
  import { StyleProp, ViewStyle } from 'react-native';
4
4
  import { E as EverfurResult } from '../EverfurResult.d-BFH-3s6E.cjs';
5
- import { A as AuthContext } from '../identity.d-HbwYQ4-z.cjs';
6
- export { I as IdentityProvider, n as newSessionId } from '../identity.d-HbwYQ4-z.cjs';
5
+ import { A as AuthContext } from '../identity.d-nRZBzkG2.cjs';
6
+ export { I as IdentityProvider, n as newSessionId } from '../identity.d-nRZBzkG2.cjs';
7
7
  import { P as PetRef } from '../ids.d-B2GAAifq.cjs';
8
8
  export { B as Brand, U as UserRef, _ as __brand } from '../ids.d-B2GAAifq.cjs';
9
9
  import { z } from 'zod';
@@ -14,7 +14,7 @@ import { E as EverfurError } from '../EverfurError.d-8NHtlgzA.cjs';
14
14
  export { a as EverfurErrorCategory, b as EverfurErrorCode } from '../EverfurError.d-8NHtlgzA.cjs';
15
15
  import { D as DisabledLevel, a as CapabilityDecision } from '../resolve.d-CoQWUy1Y.cjs';
16
16
  export { b as CapabilityDisabled, C as CapabilityName } from '../resolve.d-CoQWUy1Y.cjs';
17
- export { A as AcceptedFrame, a as AnalysisCompleteFrame, b as AnalysisStartedFrame, D as DeltaFrame, c as DoneFrame, E as ErrorFrame, d as EverfurRequest, e as EverfurRequestBase, F as Frame, f as FrameBase, g as FrameKind, H as HeartbeatFrame, h as HttpMethod, M as MultipartBody, T as TransportPort, U as UnknownFrame, i as UrgencyLevel } from '../config.d-BQgrIDdu.cjs';
17
+ export { A as AcceptedFrame, a as AnalysisCompleteFrame, b as AnalysisStartedFrame, D as DeltaFrame, c as DoneFrame, E as ErrorFrame, d as EverfurRequest, e as EverfurRequestBase, F as Frame, f as FrameBase, g as FrameKind, H as HeartbeatFrame, h as HttpMethod, M as MultipartBody, T as TransportPort, U as UnknownFrame, i as UrgencyLevel } from '../config.d-84fNJFv9.cjs';
18
18
 
19
19
  /**
20
20
  * The full /state payload. `degraded` + `cache_epoch` + `cache_key` are additive fields an older backend
@@ -134,7 +134,7 @@ declare const petStateResponseWireSchema: z.ZodObject<{
134
134
  degraded: z.ZodDefault<z.ZodBoolean>;
135
135
  cache_epoch: z.ZodDefault<z.ZodNumber>;
136
136
  }, "strip", z.ZodTypeAny, {
137
- category: "idle" | "health" | "attention" | "moment" | "activity" | "mood";
137
+ category: "idle" | "mood" | "health" | "attention" | "moment" | "activity";
138
138
  idle: "bundled";
139
139
  tiers: {
140
140
  image?: {
@@ -165,7 +165,7 @@ declare const petStateResponseWireSchema: z.ZodObject<{
165
165
  degraded: boolean;
166
166
  cache_epoch: number;
167
167
  }, {
168
- category: "idle" | "health" | "attention" | "moment" | "activity" | "mood";
168
+ category: "idle" | "mood" | "health" | "attention" | "moment" | "activity";
169
169
  ttl_seconds: number;
170
170
  idle?: "bundled" | undefined;
171
171
  tiers?: {
@@ -2,8 +2,8 @@
2
2
  import { ReactNode } from 'react';
3
3
  import { StyleProp, ViewStyle } from 'react-native';
4
4
  import { E as EverfurResult } from '../EverfurResult.d-D_-254ZY.js';
5
- import { A as AuthContext } from '../identity.d-Be2Es9Td.js';
6
- export { I as IdentityProvider, n as newSessionId } from '../identity.d-Be2Es9Td.js';
5
+ import { A as AuthContext } from '../identity.d-DxNvhj3a.js';
6
+ export { I as IdentityProvider, n as newSessionId } from '../identity.d-DxNvhj3a.js';
7
7
  import { P as PetRef } from '../ids.d-B2GAAifq.js';
8
8
  export { B as Brand, U as UserRef, _ as __brand } from '../ids.d-B2GAAifq.js';
9
9
  import { z } from 'zod';
@@ -14,7 +14,7 @@ import { E as EverfurError } from '../EverfurError.d-8NHtlgzA.js';
14
14
  export { a as EverfurErrorCategory, b as EverfurErrorCode } from '../EverfurError.d-8NHtlgzA.js';
15
15
  import { D as DisabledLevel, a as CapabilityDecision } from '../resolve.d-CoQWUy1Y.js';
16
16
  export { b as CapabilityDisabled, C as CapabilityName } from '../resolve.d-CoQWUy1Y.js';
17
- export { A as AcceptedFrame, a as AnalysisCompleteFrame, b as AnalysisStartedFrame, D as DeltaFrame, c as DoneFrame, E as ErrorFrame, d as EverfurRequest, e as EverfurRequestBase, F as Frame, f as FrameBase, g as FrameKind, H as HeartbeatFrame, h as HttpMethod, M as MultipartBody, T as TransportPort, U as UnknownFrame, i as UrgencyLevel } from '../config.d-XSMThgVj.js';
17
+ export { A as AcceptedFrame, a as AnalysisCompleteFrame, b as AnalysisStartedFrame, D as DeltaFrame, c as DoneFrame, E as ErrorFrame, d as EverfurRequest, e as EverfurRequestBase, F as Frame, f as FrameBase, g as FrameKind, H as HeartbeatFrame, h as HttpMethod, M as MultipartBody, T as TransportPort, U as UnknownFrame, i as UrgencyLevel } from '../config.d-B4-Mrwq2.js';
18
18
 
19
19
  /**
20
20
  * The full /state payload. `degraded` + `cache_epoch` + `cache_key` are additive fields an older backend
@@ -134,7 +134,7 @@ declare const petStateResponseWireSchema: z.ZodObject<{
134
134
  degraded: z.ZodDefault<z.ZodBoolean>;
135
135
  cache_epoch: z.ZodDefault<z.ZodNumber>;
136
136
  }, "strip", z.ZodTypeAny, {
137
- category: "idle" | "health" | "attention" | "moment" | "activity" | "mood";
137
+ category: "idle" | "mood" | "health" | "attention" | "moment" | "activity";
138
138
  idle: "bundled";
139
139
  tiers: {
140
140
  image?: {
@@ -165,7 +165,7 @@ declare const petStateResponseWireSchema: z.ZodObject<{
165
165
  degraded: boolean;
166
166
  cache_epoch: number;
167
167
  }, {
168
- category: "idle" | "health" | "attention" | "moment" | "activity" | "mood";
168
+ category: "idle" | "mood" | "health" | "attention" | "moment" | "activity";
169
169
  ttl_seconds: number;
170
170
  idle?: "bundled" | undefined;
171
171
  tiers?: {
@@ -3,143 +3,18 @@ import { ReactNode } from 'react';
3
3
  import { StyleProp, ViewStyle } from 'react-native';
4
4
  import { P as PetRef, C as ConversationId } from './ids.d-B2GAAifq.js';
5
5
  import { i as EverfurPresentationInput } from './presentation.d-vy8kTGfR.js';
6
- import { a as ChatCheckinTarget } from './ports.d-DzEJMVRs.js';
7
- import { W as WidgetPet, P as PetProfileInput } from './petsRepository.d-DUaAWoTv.js';
6
+ import { a as ChatCheckinTarget } from './ports.d-BxCVSbSi.js';
7
+ import { W as WidgetPet, P as PetProfileInput } from './petsRepository.d-BtuooSOW.js';
8
8
  import { E as EverfurStarterPrompt } from './quickPrompts.d-NM_81Jc1.js';
9
9
  import { L as LifecyclePort } from './LifecyclePort.d-Cr1p33a7.js';
10
- import { U as UrgencyDisplayLevel, E as EverfurChatDraftStore } from './attachments.d-DFP9yvz9.js';
10
+ import { U as UrgencyDisplayLevel, E as EverfurChatDraftStore, b as ChatFollowUpPolicy } from './attachments.d-CB0R1_vK.js';
11
11
  import { F as FileHandle } from './ports.d-BX4f4UsB.js';
12
+ import { g as EverfurChatOpeningCard, a as EverfurChatAnswerCards, f as EverfurChatHistorySheet, e as EverfurChatHistoryBar, c as EverfurChatEmptyState } from './threadOptions.d-BerQM1Ql.js';
13
+ import { a as EverfurChatEmptyHeaderContext, b as EverfurChatTopCard } from './threadOptions.d-6hfQS1x7.js';
12
14
 
13
15
  /** Where a picked image comes from: the host's photo library, or its camera. */
14
16
  type AttachmentSource = 'photo' | 'camera';
15
17
 
16
- /**
17
- * The history bar: a "Chats" control with the member's thread count that opens the history, and a "New chat"
18
- * control. For a surface that hides the SDK header and still wants the member's past chats.
19
- */
20
- interface EverfurChatHistoryBar {
21
- /** The history control's words ("Chats"). */
22
- readonly chats: string;
23
- /** The new-chat control's words ("New chat"). */
24
- readonly newChat: string;
25
- /** Draw the two icons your way. */
26
- readonly renderIcon?: (icon: 'history' | 'edit') => ReactNode;
27
- /** Your own control after "Chats". Absent, nothing is drawn. */
28
- readonly extra?: ReactNode;
29
- }
30
- /** The empty thread's own title and chip fills. Absent, the empty state is Everfur's own. */
31
- interface EverfurChatEmptyState {
32
- /** The title over the starter chips, in place of "What can we help {pet} with today?". */
33
- readonly title?: string;
34
- /**
35
- * Fills for the chips that bring none of their own, taken in turn (the first chip the first fill, and round
36
- * again). Each is a fill and its ink. Absent, Raph's v3 cycle on a light theme; empty, the theme's paint.
37
- */
38
- readonly chipTints?: readonly {
39
- readonly tint: string;
40
- readonly ink?: string;
41
- }[];
42
- }
43
- /** One card under an answer in the cards answer style: a record, a stat, or a link to one of your screens. */
44
- interface EverfurChatAnswerCard {
45
- /** Stable key within the answer. */
46
- readonly key: string;
47
- readonly title: string;
48
- /** The small line under the title. */
49
- readonly meta?: string;
50
- /** A status pill. */
51
- readonly pill?: {
52
- readonly label: string;
53
- readonly tone?: string;
54
- };
55
- /** A stat card's value: drawn in place of the pill and the chevron. */
56
- readonly value?: {
57
- readonly amount: string;
58
- readonly unit?: string;
59
- };
60
- /** The tile at the start: an icon of yours, or an https image. */
61
- readonly tile?: {
62
- readonly icon?: ReactNode;
63
- readonly imageUrl?: string;
64
- readonly tone?: string;
65
- };
66
- readonly variant?: string;
67
- /** Given, the card is a button that calls this. Absent, a static card. */
68
- readonly onPress?: () => void;
69
- /** A card of your own, drawn in the card's place. If it throws, the slot draws nothing. */
70
- readonly render?: () => ReactNode;
71
- }
72
- /** What `answerCards.cards` receives: the settled answer's text and the question it answered. */
73
- interface EverfurChatAnswerContext {
74
- readonly answer: string;
75
- readonly question: string | null;
76
- /** The answer's message id, stable for the life of the thread. */
77
- readonly messageId: string;
78
- }
79
- /** The cards answer style's content (used while presentation `chatAnswerStyle` is `cards`). The words are yours. */
80
- interface EverfurChatAnswerCards {
81
- /** The line over each answer (an icon and your words). Absent, the assistant's name line. */
82
- readonly byline?: {
83
- readonly label: string;
84
- readonly icon?: ReactNode;
85
- };
86
- /** Your cards under a settled answer. A throw draws none. */
87
- readonly cards?: (context: EverfurChatAnswerContext) => readonly EverfurChatAnswerCard[];
88
- /** Two feedback chips in place of the footer's thumbs, mapped to thumbs up and thumbs down. */
89
- readonly feedback?: {
90
- readonly helpful: string;
91
- readonly notHelpful: string;
92
- };
93
- /** Your own rows at the top of the follow-ups, for the answer it receives. */
94
- readonly followUpActions?: (context: EverfurChatAnswerContext) => readonly EverfurChatFollowUpAction[];
95
- /** Draw the chevron your way. Absent, Everfur's glyph. */
96
- readonly renderIcon?: (icon: 'chevron') => ReactNode;
97
- }
98
- /** A row of yours at the top of the follow-ups under an answer. */
99
- interface EverfurChatFollowUpAction {
100
- readonly key: string;
101
- readonly label: string;
102
- readonly icon?: ReactNode;
103
- readonly onPress: () => void;
104
- }
105
- /**
106
- * The card at the top of the empty thread (presentation `chatTopCard: "focus"`): one finding, in your words, with
107
- * an action of yours and a question it can ask in the thread. Its close control folds it into a pill.
108
- */
109
- interface EverfurChatTopCard {
110
- /** The small heading ("Her focus"). */
111
- readonly kicker: string;
112
- /** A source badge ("<your brand> results"). */
113
- readonly badge?: string;
114
- readonly title: string;
115
- /** The finding: a bold lead and the rest of the sentence. */
116
- readonly lead?: string;
117
- readonly body?: string;
118
- /** Your action ("See her Health Plan"). */
119
- readonly action?: {
120
- readonly label: string;
121
- readonly onPress: () => void;
122
- };
123
- /** A question the card asks in this thread. */
124
- readonly ask?: {
125
- readonly label: string;
126
- readonly prompt: string;
127
- };
128
- /** The close control's accessible name. Absent, the shared `Close`. */
129
- readonly closeLabel?: string;
130
- /** The pill's words while the card is closed (defaults to `kicker`). */
131
- readonly pill?: string;
132
- /** Draw the close glyph your way. */
133
- readonly renderIcon?: (icon: 'close') => ReactNode;
134
- }
135
- /** The history bottom sheet (presentation `chatHistoryStyle: "sheet"`). */
136
- interface EverfurChatHistorySheet {
137
- /** The sheet's small title ("Chats with Ask <your brand>"). Absent, Everfur's history heading. */
138
- readonly title?: string;
139
- /** Draw the icons your way. */
140
- readonly renderIcon?: (icon: 'close' | 'chat' | 'edit') => ReactNode;
141
- }
142
-
143
18
  /**
144
19
  * The host's image picker for chat attachments. The SDK depends on no picker or camera module: open your own
145
20
  * (for example `expo-image-picker`'s `launchImageLibraryAsync({ mediaTypes: ['images'] })`, or your camera
@@ -155,7 +30,7 @@ interface EverfurChatAttachments {
155
30
  readonly pick: (source: AttachmentSource) => Promise<FileHandle | readonly FileHandle[] | null>;
156
31
  /** The sources to offer, one popover tile each; default `['photo']`. */
157
32
  readonly sources?: readonly AttachmentSource[];
158
- /** Images per message; default 1 (the app's composer), at most 5 (the server's cap). */
33
+ /** Images per message; default 5, the web composer's and the server's cap. */
159
34
  readonly maxPerMessage?: number;
160
35
  }
161
36
 
@@ -235,10 +110,12 @@ interface EverfurChatProps {
235
110
  * Your app's lifecycle signals. Everfur has no socket and no polling here, so a message the platform
236
111
  * writes into the thread (a follow-up check-in, a reminder) is not visible until something re-reads it.
237
112
  * Tell Everfur when your app comes back to the foreground, when connectivity returns and when a push
238
- * announced a change, and the thread and the unread dot catch up on that signal alone. Without this, chat
239
- * refreshes only when the user does something.
113
+ * announced a change, and the thread and the unread dot catch up on that signal alone. Absent, Everfur uses
114
+ * React Native's own signal (AppState returning to `active` from the background; see `createAppStateLifecycle`).
115
+ * Pass your own port to add connectivity or a push announcement, or `null` to turn the re-read off, in which
116
+ * case chat refreshes only when the user does something.
240
117
  */
241
- readonly lifecycle?: LifecyclePort;
118
+ readonly lifecycle?: LifecyclePort | null;
242
119
  /**
243
120
  * Your own storage for an unsent draft. Given, what the user typed and did not send survives leaving this
244
121
  * screen; absent, the draft lives in memory for as long as the surface is mounted and nowhere else.
@@ -290,19 +167,47 @@ interface EverfurChatProps {
290
167
  /**
291
168
  * The layout settings (Raph v3): the answer style, the history style, the top card, the composer style and
292
169
  * placeholder, the history bar's place, the general banner, the send button, the follow-up count and the upload
293
- * control. Each also comes from your console (render_hints.branding.presentation); a field you set here wins
294
- * unless the console locks it. `attachments` counts as your explicit `chatComposerUpload: true`. The microphone
295
- * setting (`chatComposerMic`) has no control on this surface. `topCard`, `answerCards` and `historySheet` are
296
- * content only and never switch a layout on by themselves.
170
+ * control, and the microphone (`chatComposerMic`). Each also comes from your console
171
+ * (render_hints.branding.presentation); a field you set here wins unless the console locks it. `attachments` counts
172
+ * as your explicit `chatComposerUpload: true`, `dictation` as your `chatComposerMic` and `followUpPolicy` as your
173
+ * follow-up count. `topCard`, `answerCards` and `historySheet` are content only and never switch a layout on by
174
+ * themselves.
297
175
  */
298
176
  readonly presentation?: EverfurPresentationInput;
177
+ /**
178
+ * Voice dictation on the composer (the device's own speech recognizer, no Everfur service). On by default; the
179
+ * control appears only when your app has the optional `expo-speech-recognition` module installed and the device
180
+ * has a recognizer. `false` is the kill switch.
181
+ */
182
+ readonly dictation?: boolean;
183
+ /**
184
+ * Your own content for the top of the empty thread, above its title and starter chips (for example a card of the
185
+ * pet's top findings). Rendered only while the thread is empty; if it throws, the empty state draws as usual.
186
+ * Absent, the empty state is Everfur's own. It receives `{ ask }`: a row of your card can ask its question in
187
+ * this thread directly, with no screen in between.
188
+ */
189
+ readonly renderEmptyHeader?: (context: EverfurChatEmptyHeaderContext) => ReactNode;
190
+ /**
191
+ * Your rule for the follow-ups under a reply: how many (exactly, with `fill`), which backend prompts to drop
192
+ * (`exclude`, for example visit or booking prompts you do not offer), your own prompts to top up with, and a
193
+ * visible `label` over them. Absent, at most three of the backend's, as before.
194
+ */
195
+ readonly followUpPolicy?: ChatFollowUpPolicy;
196
+ /**
197
+ * The card a notification-opened thread starts with: drawn in place of the first bubble while that bubble is
198
+ * `initialAsk`. Pair it with `initialAsk` (the notification's question). Absent, the bubble draws as usual.
199
+ */
200
+ readonly initialAskCard?: EverfurChatOpeningCard;
299
201
  /**
300
202
  * The focus card's content (drawn while `chatTopCard` resolves to `focus`). Absent, the card is built from the
301
203
  * pet's Health Plan page focus; no page, no focus, a refused read or a page still loading draws no card.
302
204
  */
303
205
  readonly topCard?: EverfurChatTopCard;
304
- /** Opens the pet's Health Plan (your tab or screen): the plan-built focus card's `See her Health Plan` button. */
305
- readonly onOpenHealthPlan?: () => void;
206
+ /**
207
+ * Opens the pet's Health Plan (your tab or screen), called with the pet (the chat's `petRef`, else the provider's
208
+ * active pet): the plan-built focus card's `See her Health Plan` button.
209
+ */
210
+ readonly onOpenHealthPlan?: (petRef: PetRef | null) => void;
306
211
  /** The cards answer style's content (used while `chatAnswerStyle` resolves to `cards`). */
307
212
  readonly answerCards?: EverfurChatAnswerCards;
308
213
  /** The history sheet's title and icons (used while `chatHistoryStyle` resolves to `sheet`). */
@@ -335,4 +240,22 @@ interface EverfurChatProps {
335
240
  */
336
241
  declare function EverfurChat(props: EverfurChatProps): ReactNode;
337
242
 
338
- export { type AttachmentSource as A, EverfurChat as E, type RenderVetAction as R, type EverfurChatAnswerCard as a, type EverfurChatAnswerCards as b, type EverfurChatAnswerContext as c, type EverfurChatAttachments as d, type EverfurChatEmptyState as e, type EverfurChatFollowUpAction as f, type EverfurChatHistoryBar as g, type EverfurChatHistorySheet as h, type EverfurChatProps as i, type EverfurChatTopCard as j };
243
+ /** The host's loader: a thunk that requires the expo-speech-recognition module and returns it. */
244
+ type EverfurDictationLoader = () => unknown;
245
+ /**
246
+ * Turns on the chat composer's microphone on React Native: register the optional `expo-speech-recognition` module's
247
+ * loader once, in your app entry.
248
+ *
249
+ * Pass a thunk that requires the expo-speech-recognition module and returns it; the chat docs ("Dictation") show the
250
+ * exact line.
251
+ *
252
+ * Without it, or where the module has no native side (Expo Go, an older binary), the composer draws no microphone.
253
+ * Passing `null` unregisters it. Registering clears the memo, so a later registration always wins, and a composer
254
+ * already on screen re-reads it (best practice is still to register before the first chat renders).
255
+ */
256
+ declare function registerEverfurDictation(next: EverfurDictationLoader | null): void;
257
+
258
+ /** The app's foreground edge for EverfurChat: AppState going from `background` back to `active`. */
259
+ declare function createAppStateLifecycle(): LifecyclePort;
260
+
261
+ export { type AttachmentSource as A, EverfurChat as E, type RenderVetAction as R, type EverfurChatAttachments as a, type EverfurChatProps as b, type EverfurDictationLoader as c, createAppStateLifecycle as d, registerEverfurDictation as r };