@runtypelabs/persona 4.25.0 → 4.26.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 (236) hide show
  1. package/dist/animations/glyph-cycle.d.cts +1 -1
  2. package/dist/animations/glyph-cycle.d.ts +1 -1
  3. package/dist/animations/{types-Db61aI9J.d.cts → types-BwKTZhg9.d.cts} +14 -0
  4. package/dist/animations/{types-Db61aI9J.d.ts → types-BwKTZhg9.d.ts} +14 -0
  5. package/dist/animations/wipe.d.cts +1 -1
  6. package/dist/animations/wipe.d.ts +1 -1
  7. package/dist/animations-extra.d.cts +14 -0
  8. package/dist/animations-extra.d.ts +14 -0
  9. package/dist/approval-ui-QAKWNFNM.js +1 -0
  10. package/dist/approval-ui.cjs +2 -2
  11. package/dist/approval-ui.d.cts +180 -8
  12. package/dist/approval-ui.d.ts +180 -8
  13. package/dist/approval-ui.js +2 -2
  14. package/dist/{artifacts-ui-IGB5YKLO.js → artifacts-ui-NJGMM27I.js} +1 -1
  15. package/dist/artifacts-ui.cjs +4 -4
  16. package/dist/artifacts-ui.d.cts +180 -8
  17. package/dist/artifacts-ui.d.ts +180 -8
  18. package/dist/artifacts-ui.js +5 -5
  19. package/dist/chunk-2ANTRKTV.js +1 -0
  20. package/dist/chunk-4HPTPUC6.js +1 -0
  21. package/dist/chunk-6V3MNEKB.js +1 -0
  22. package/dist/chunk-HGUCGM3K.js +9 -0
  23. package/dist/chunk-IO5VVUKP.js +3 -0
  24. package/dist/chunk-J4J3Y2P2.js +1 -0
  25. package/dist/chunk-K6HKIP5K.js +1 -0
  26. package/dist/chunk-K7NA7G7J.js +1 -0
  27. package/dist/chunk-MXUTS3LB.js +1 -0
  28. package/dist/chunk-PDPVORUF.js +1 -0
  29. package/dist/chunk-QPPJUSZH.js +1 -0
  30. package/dist/chunk-QRKGQPU7.js +1 -0
  31. package/dist/chunk-S6PBWE75.js +1 -0
  32. package/dist/chunk-T7QM7YMF.js +1 -0
  33. package/dist/chunk-TR2H475E.js +1 -0
  34. package/dist/chunk-UPO4GUFC.js +1 -0
  35. package/dist/chunk-ZC66NAIR.js +1 -0
  36. package/dist/client-history-YPEG45Q4.js +1 -0
  37. package/dist/client-history.js +1 -0
  38. package/dist/client-stream-42FOI3EC.js +4 -0
  39. package/dist/client-stream.js +5 -0
  40. package/dist/codegen.cjs +1 -1
  41. package/dist/codegen.js +1 -1
  42. package/dist/context-mentions-E7HJYWO6.js +161 -0
  43. package/dist/{context-mentions-inline-I2RDEBAK.js → context-mentions-inline-QVESLW55.js} +1 -1
  44. package/dist/context-mentions.cjs +7 -7
  45. package/dist/context-mentions.d.cts +180 -8
  46. package/dist/context-mentions.d.ts +180 -8
  47. package/dist/context-mentions.js +8 -8
  48. package/dist/event-stream-view-FOIJHFQO.js +1 -0
  49. package/dist/event-stream-view.cjs +1 -1
  50. package/dist/event-stream-view.d.cts +183 -31
  51. package/dist/event-stream-view.d.ts +183 -31
  52. package/dist/event-stream-view.js +1 -1
  53. package/dist/forms-ui.d.cts +221 -667
  54. package/dist/forms-ui.d.ts +221 -667
  55. package/dist/history-shell-QDQ44PSE.js +3 -0
  56. package/dist/history-shell.js +3 -0
  57. package/dist/{history-view-BD6OXLNA.js → history-view-NCFBI5GR.js} +2 -2
  58. package/dist/history-view.cjs +2 -2
  59. package/dist/history-view.d.cts +35 -1
  60. package/dist/history-view.d.ts +35 -1
  61. package/dist/history-view.js +2 -2
  62. package/dist/index.cjs +80 -74
  63. package/dist/index.cjs.map +1 -1
  64. package/dist/index.d.cts +227 -738
  65. package/dist/index.d.ts +227 -738
  66. package/dist/index.global.js +3 -215
  67. package/dist/index.global.js.map +1 -1
  68. package/dist/index.js +81 -75
  69. package/dist/index.js.map +1 -1
  70. package/dist/install.global.js +1 -1
  71. package/dist/install.global.js.map +1 -1
  72. package/dist/launcher.global.js +3 -67
  73. package/dist/launcher.global.js.map +1 -1
  74. package/dist/markdown-parsers.js +22 -22
  75. package/dist/runtype-tts-entry-NFBVWR7N.js +1 -0
  76. package/dist/runtype-tts.js +1 -1
  77. package/dist/session-actions-ISSKSI66.js +1 -0
  78. package/dist/session-actions.js +1 -0
  79. package/dist/session-reconnect.d.cts +180 -8
  80. package/dist/session-reconnect.d.ts +180 -8
  81. package/dist/smart-dom-reader.cjs +13 -13
  82. package/dist/smart-dom-reader.d.cts +180 -8
  83. package/dist/smart-dom-reader.d.ts +180 -8
  84. package/dist/smart-dom-reader.js +11 -11
  85. package/dist/theme-editor-preview.cjs +116 -98
  86. package/dist/theme-editor-preview.d.cts +182 -8
  87. package/dist/theme-editor-preview.d.ts +182 -8
  88. package/dist/theme-editor-preview.js +49 -54
  89. package/dist/theme-editor.cjs +2 -2
  90. package/dist/theme-editor.d.cts +181 -23
  91. package/dist/theme-editor.d.ts +181 -23
  92. package/dist/theme-editor.js +2 -2
  93. package/dist/theme-reference.d.cts +14 -0
  94. package/dist/theme-reference.d.ts +14 -0
  95. package/dist/ui-extras-entry-WAYFKVNW.js +3 -0
  96. package/dist/ui-extras.js +72 -0
  97. package/dist/voice-runtime-UOQOFAFY.js +17 -0
  98. package/dist/voice-runtime.cjs +17 -1
  99. package/dist/voice-runtime.d.cts +11650 -232
  100. package/dist/voice-runtime.d.ts +11650 -232
  101. package/dist/voice-runtime.js +17 -1
  102. package/dist/voice-worklet-player.cjs +19 -4
  103. package/dist/voice-worklet-player.d.cts +9 -10
  104. package/dist/voice-worklet-player.d.ts +9 -10
  105. package/dist/voice-worklet-player.js +19 -4
  106. package/dist/webmcp-polyfill.js +1 -1
  107. package/dist/webmcp-runtime-V6ZWW3PI.js +6 -0
  108. package/dist/webmcp-runtime.cjs +2 -2
  109. package/dist/webmcp-runtime.d.cts +1 -33
  110. package/dist/webmcp-runtime.d.ts +1 -33
  111. package/dist/webmcp-runtime.js +2 -2
  112. package/dist/widget.css +1 -1
  113. package/package.json +11 -5
  114. package/src/approval-paused-tool-settle.test.ts +221 -0
  115. package/src/client-approve.test.ts +311 -0
  116. package/src/client-history-eager.ts +9 -0
  117. package/src/client-history-loader.ts +23 -0
  118. package/src/client-history.ts +579 -0
  119. package/src/client-resume.ts +177 -0
  120. package/src/client-stream-eager.ts +12 -0
  121. package/src/client-stream-loader.ts +25 -0
  122. package/src/client-stream.ts +1880 -0
  123. package/src/client.test.ts +31 -1
  124. package/src/client.ts +293 -2607
  125. package/src/components/approval-actions.test.ts +27 -0
  126. package/src/components/approval-actions.ts +27 -3
  127. package/src/components/message-bubble.test.ts +19 -0
  128. package/src/components/message-bubble.ts +2 -0
  129. package/src/components/registry.ts +6 -6
  130. package/src/components/tool-bubble.test.ts +9 -0
  131. package/src/components/tool-bubble.ts +1 -0
  132. package/src/history-shell-bundle.test.ts +54 -0
  133. package/src/history-shell-eager.ts +12 -0
  134. package/src/history-shell-loader.ts +27 -0
  135. package/src/history-shell.ts +2362 -0
  136. package/src/history-view-loader.ts +2 -0
  137. package/src/history-view.ts +3 -0
  138. package/src/index-core.ts +6 -0
  139. package/src/index-global.ts +90 -248
  140. package/src/index.ts +13 -0
  141. package/src/install.ts +6 -4
  142. package/src/internal/runtype-history-provider.test.ts +1 -0
  143. package/src/internal/runtype-history-provider.ts +28 -13
  144. package/src/plugins/registry.ts +8 -8
  145. package/src/session-actions-chunk.test.ts +55 -0
  146. package/src/session-actions-eager.ts +11 -0
  147. package/src/session-actions-loader.ts +37 -0
  148. package/src/session-actions.ts +909 -0
  149. package/src/session-history.test.ts +3 -1
  150. package/src/session.ts +852 -1536
  151. package/src/session.voice.test.ts +1170 -5
  152. package/src/styles/widget.css +58 -0
  153. package/src/theme-editor/state.ts +91 -91
  154. package/src/types.ts +198 -5
  155. package/src/ui-ask-user-sheet.ts +382 -0
  156. package/src/ui-extras-eager.ts +10 -0
  157. package/src/ui-extras-entry.ts +9 -0
  158. package/src/ui-extras-loader.ts +26 -0
  159. package/src/ui.artifact-rail-resize.test.ts +2 -1
  160. package/src/ui.ask-user-chunk.test.ts +93 -0
  161. package/src/ui.history-chunk.test.ts +2 -1
  162. package/src/ui.history-config-provider.test.ts +2 -1
  163. package/src/ui.history-confirm-fallback.test.ts +142 -0
  164. package/src/ui.history-controller.test.ts +2 -1
  165. package/src/ui.history-lifecycle.test.ts +2 -1
  166. package/src/ui.history-render-hooks.test.ts +2 -1
  167. package/src/ui.history-shell.test.ts +2 -1
  168. package/src/ui.rail-overlay.test.ts +2 -1
  169. package/src/ui.rail-resize.test.ts +2 -1
  170. package/src/ui.rail-trigger-pending.test.ts +2 -1
  171. package/src/ui.ts +340 -2770
  172. package/src/utils/attachment-manager.ts +67 -67
  173. package/src/utils/constants.ts +3 -0
  174. package/src/utils/context-mention-controller.ts +323 -323
  175. package/src/utils/context-mention-manager.ts +40 -40
  176. package/src/utils/context-mention-orchestrator.ts +28 -0
  177. package/src/utils/event-stream-buffer.ts +50 -50
  178. package/src/utils/event-stream-store.ts +43 -43
  179. package/src/utils/throughput-tracker.ts +34 -34
  180. package/src/utils/virtual-scroller.ts +67 -67
  181. package/src/utils/visitor-store.test.ts +50 -0
  182. package/src/utils/visitor-store.ts +23 -5
  183. package/src/voice/__fixtures__/voice-wire/README.md +1 -0
  184. package/src/voice/__fixtures__/voice-wire/client/cancel.json +3 -0
  185. package/src/voice/__fixtures__/voice-wire/client/context.json +4 -0
  186. package/src/voice/__fixtures__/voice-wire/client/delegation_result.json +6 -0
  187. package/src/voice/__fixtures__/voice-wire/client/delegation_update.json +6 -0
  188. package/src/voice/__fixtures__/voice-wire/client/ping.json +3 -0
  189. package/src/voice/__fixtures__/voice-wire/client/playback_progress.json +5 -0
  190. package/src/voice/__fixtures__/voice-wire/client/start.json +3 -0
  191. package/src/voice/__fixtures__/voice-wire/server/artifact.json +11 -0
  192. package/src/voice/__fixtures__/voice-wire/server/attached.json +4 -0
  193. package/src/voice/__fixtures__/voice-wire/server/audio_clear.json +4 -0
  194. package/src/voice/__fixtures__/voice-wire/server/audio_end.json +3 -0
  195. package/src/voice/__fixtures__/voice-wire/server/delegation_cancelled.json +5 -0
  196. package/src/voice/__fixtures__/voice-wire/server/delegation_completed.json +8 -0
  197. package/src/voice/__fixtures__/voice-wire/server/delegation_started.json +15 -0
  198. package/src/voice/__fixtures__/voice-wire/server/error.json +6 -0
  199. package/src/voice/__fixtures__/voice-wire/server/metrics.json +10 -0
  200. package/src/voice/__fixtures__/voice-wire/server/pong.json +3 -0
  201. package/src/voice/__fixtures__/voice-wire/server/session_config.json +16 -0
  202. package/src/voice/__fixtures__/voice-wire/server/transcript_final.json +7 -0
  203. package/src/voice/__fixtures__/voice-wire/server/transcript_interim.json +4 -0
  204. package/src/voice/__fixtures__/voice-wire/server/transcript_partial.json +6 -0
  205. package/src/voice/__fixtures__/voice-wire/server/transcript_update.json +10 -0
  206. package/src/voice/__fixtures__/voice-wire/server/warning.json +5 -0
  207. package/src/voice/audio-playback-manager.test.ts +57 -0
  208. package/src/voice/audio-playback-manager.ts +120 -98
  209. package/src/voice/browser-voice-provider.ts +37 -37
  210. package/src/voice/fallback-speech-engine.ts +22 -16
  211. package/src/voice/keyed-voice-transcript.ts +314 -0
  212. package/src/voice/mic-state-styles.ts +182 -0
  213. package/src/voice/read-aloud-controller.ts +46 -44
  214. package/src/voice/runtype-speech-engine.ts +35 -33
  215. package/src/voice/runtype-voice-provider.ts +670 -189
  216. package/src/voice/session-voice-wiring.ts +266 -0
  217. package/src/voice/voice-delegation.test.ts +71 -0
  218. package/src/voice/voice-delegation.ts +364 -0
  219. package/src/voice/voice-turn-tracker.ts +6 -6
  220. package/src/voice/voice.test.ts +981 -8
  221. package/src/voice/worklet-playback-engine.test.ts +81 -0
  222. package/src/voice/worklet-playback-engine.ts +21 -3
  223. package/src/voice-runtime-loader.ts +4 -1
  224. package/src/voice-runtime.ts +7 -0
  225. package/src/webmcp-runtime-entry.ts +41 -39
  226. package/dist/approval-ui-3NMYNXBD.js +0 -1
  227. package/dist/chunk-5EIIHQLQ.js +0 -1
  228. package/dist/chunk-7CO4T5KB.js +0 -1
  229. package/dist/chunk-EFJBUH5F.js +0 -1
  230. package/dist/chunk-R2TMIMDI.js +0 -3
  231. package/dist/chunk-UTVLOTWB.js +0 -9
  232. package/dist/context-mentions-45MODWOY.js +0 -161
  233. package/dist/event-stream-view-GL3ADRY2.js +0 -1
  234. package/dist/runtype-tts-entry-UJAEF7NZ.js +0 -1
  235. package/dist/voice-runtime-7DA7MJH4.js +0 -1
  236. package/dist/webmcp-runtime-JI7T4QYF.js +0 -6
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Approval decisions and LOCAL-tool resumes for `AgentWidgetClient`. Only
3
+ * the approval / ask-user-question / WebMCP resolve paths (themselves in the
4
+ * lazy `session-actions` chunk) call these, so the IIFE/CDN build ships them
5
+ * in the lazy `client-stream.js` chunk; the client's public methods keep
6
+ * their signatures and delegate here through a `ClientResumeHost`.
7
+ */
8
+ import type {
9
+ AgentWidgetConfig,
10
+ AgentWidgetHeadersFunction,
11
+ ClientChatRequest,
12
+ ClientSession,
13
+ ClientToolDefinition
14
+ } from "./types";
15
+ import type { WebMcpBridge } from "./webmcp-runtime-entry";
16
+ import { builtInClientToolsForDispatch } from "./ask-user-question-tool";
17
+ import { DEFAULT_CLIENT_API_BASE } from "./utils/constants";
18
+
19
+ export type ClientResumeHost = {
20
+ readonly config: AgentWidgetConfig;
21
+ readonly headers: Record<string, string>;
22
+ readonly getHeaders?: AgentWidgetHeadersFunction;
23
+ readonly debug: boolean;
24
+ clientApiBase(): string;
25
+ getClientApiUrl(endpoint: "init" | "chat" | "resume"): string;
26
+ getWebMcpBridge(): Promise<WebMcpBridge | null>;
27
+ sendWithClientToolsDiff(
28
+ sessionId: string,
29
+ fullClientTools: ClientToolDefinition[] | undefined,
30
+ doFetch: (
31
+ toolFields: Pick<ClientChatRequest, "clientTools" | "clientToolsFingerprint">
32
+ ) => Promise<Response>,
33
+ opts?: { emptyMeansReplace?: boolean }
34
+ ): Promise<{ response: Response; commit: () => void }>;
35
+ initSession(): Promise<ClientSession>;
36
+ readVisitorToken(): Promise<string | null>;
37
+ isClientTokenMode(): boolean;
38
+ };
39
+
40
+ /** See `AgentWidgetClient.resolveApproval`. */
41
+ export async function resolveApproval(
42
+ h: ClientResumeHost,
43
+ approval: { agentId: string; executionId: string; approvalId: string },
44
+ decision: "approved" | "denied"
45
+ ): Promise<Response> {
46
+ let headers: Record<string, string> = {
47
+ 'Content-Type': 'application/json',
48
+ ...h.headers
49
+ };
50
+ if (h.getHeaders) {
51
+ Object.assign(headers, await h.getHeaders());
52
+ }
53
+ const body = {
54
+ executionId: approval.executionId,
55
+ approvalId: approval.approvalId,
56
+ decision,
57
+ streamResponse: true,
58
+ };
59
+ const post = (path: string, extra?: Record<string, unknown>) =>
60
+ fetch(`${h.clientApiBase()}${path}`, {
61
+ method: 'POST',
62
+ headers,
63
+ body: JSON.stringify({ ...extra, ...body }),
64
+ });
65
+ const ownerRoute = `/v1/agents/${approval.agentId}/approve`;
66
+
67
+ if (!h.isClientTokenMode()) return post(ownerRoute);
68
+
69
+ // Same re-validation as `resumeFlow`: an approval can sit for a long time.
70
+ const { sessionId } = await h.initSession();
71
+ const response = await post('/v1/client/approve', { sessionId });
72
+ // A core without the route answers with its generic `Not Found`; an unknown
73
+ // or expired pause 404s with its own error, which the caller surfaces.
74
+ if (response.status === 404) {
75
+ const data = (await response.clone().json().catch(() => null)) as { error?: string } | null;
76
+ if (!data || data.error === 'Not Found') return post(ownerRoute);
77
+ }
78
+ return response;
79
+ }
80
+
81
+ /** See `AgentWidgetClient.resumeFlow`. */
82
+ export async function resumeFlow(
83
+ h: ClientResumeHost,
84
+ executionId: string,
85
+ toolOutputs: Record<string, unknown>,
86
+ options?: { streamResponse?: boolean; signal?: AbortSignal; after?: string }
87
+ ): Promise<Response> {
88
+ const isClientToken = h.isClientTokenMode();
89
+ const url = isClientToken
90
+ ? h.getClientApiUrl('resume')
91
+ : `${h.config.apiUrl?.replace(/\/+$/, '') || DEFAULT_CLIENT_API_BASE}/resume`;
92
+
93
+ // The client-token resume route authenticates the session, not a Bearer
94
+ // key. A WebMCP approval can sit awaiting user input for a long time, so by
95
+ // the time we resume the original session may have expired. Re-validate (and
96
+ // silently re-init if needed) via initSession(): which returns the live
97
+ // session when `new Date() < expiresAt`, else mints a fresh one: instead of
98
+ // trusting the possibly-stale `this.clientSession`. (core#3889; BugBot
99
+ // PR #214 r3367875360.)
100
+ let resumeSessionId: string | undefined;
101
+ let resumeVisitorToken: string | null = null;
102
+ if (isClientToken) {
103
+ const session = await h.initSession();
104
+ resumeSessionId = session.sessionId;
105
+ if (session.durableRecovery?.enabled === true) {
106
+ resumeVisitorToken = await h.readVisitorToken();
107
+ }
108
+ }
109
+
110
+ let headers: Record<string, string> = {
111
+ 'Content-Type': 'application/json',
112
+ ...(resumeVisitorToken ? { 'X-Visitor-Token': resumeVisitorToken } : {}),
113
+ ...h.headers
114
+ };
115
+ if (h.getHeaders) {
116
+ Object.assign(headers, await h.getHeaders());
117
+ }
118
+
119
+ const body: Record<string, unknown> = {
120
+ executionId,
121
+ toolOutputs,
122
+ streamResponse: options?.streamResponse ?? true,
123
+ ...(options?.after ? { after: options.after } : {}),
124
+ };
125
+ // Thread the (refreshed) sessionId through like `/v1/client/chat` does.
126
+ if (resumeSessionId) {
127
+ body.sessionId = resumeSessionId;
128
+ }
129
+
130
+ if (isClientToken && resumeSessionId) {
131
+ // Mid-run WebMCP tool refresh (runtypelabs/core#5361): the paused tool
132
+ // may have navigated the page, so the dispatch-time snapshot the server
133
+ // persisted can be stale. Re-snapshot the registry — the same built-in +
134
+ // bridge composition as the payload builders, so fingerprints computed
135
+ // here and on chat turns describe the same tool space — and ship it via
136
+ // the shared diff-only protocol. `emptyMeansReplace` sends an explicit
137
+ // `clientTools: []` when the registry vanished after a non-empty send,
138
+ // so the server replaces the persisted set instead of keeping it frozen.
139
+ const fullClientTools = [
140
+ ...builtInClientToolsForDispatch(h.config),
141
+ ...((await (await h.getWebMcpBridge())?.snapshotForDispatch()) ?? []),
142
+ ];
143
+ const { response, commit } = await h.sendWithClientToolsDiff(
144
+ resumeSessionId,
145
+ fullClientTools,
146
+ (toolFields) => {
147
+ const resumeRequest = { ...body, ...toolFields };
148
+ if (h.debug) {
149
+ // eslint-disable-next-line no-console
150
+ console.debug("[AgentWidgetClient] client token resume", resumeRequest);
151
+ }
152
+ return fetch(url, {
153
+ method: 'POST',
154
+ headers,
155
+ body: JSON.stringify(resumeRequest),
156
+ signal: options?.signal,
157
+ });
158
+ },
159
+ { emptyMeansReplace: true }
160
+ );
161
+ // The server stores the refreshed registry before running the
162
+ // continuation pipeline, so an OK response means it holds this set under
163
+ // this fingerprint. Mirror chat's commit-on-success discipline: a failed
164
+ // resume must not record a fingerprint the server never stored.
165
+ if (response.ok) {
166
+ commit();
167
+ }
168
+ return response;
169
+ }
170
+
171
+ return fetch(url, {
172
+ method: 'POST',
173
+ headers,
174
+ body: JSON.stringify(body),
175
+ signal: options?.signal,
176
+ });
177
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Eager stream-processor registration for the bundled (ESM / CJS) builds.
3
+ *
4
+ * npm consumers bundle `client-stream.ts` anyway, so providing it up front
5
+ * keeps streaming free of the async chunk hop. Like
6
+ * `markdown-parsers-eager.ts`, this module must NOT be reachable from
7
+ * `index-global.ts`: the IIFE/CDN build fetches the `client-stream.js` chunk.
8
+ */
9
+ import * as clientStream from "./client-stream";
10
+ import { provideClientStream } from "./client-stream-loader";
11
+
12
+ provideClientStream(clientStream);
@@ -0,0 +1,25 @@
1
+ import { createChunkLoader } from "./utils/chunk-loader";
2
+
3
+ /**
4
+ * Loader indirection for the SSE stream processor (`client-stream.ts`). The
5
+ * ESM/CJS fallback imports `./client-stream` directly (inlined by
6
+ * `--splitting false`); the IIFE/CDN build marks it external and registers a
7
+ * loader for the sibling `client-stream.js` chunk (see `index-global.ts`).
8
+ */
9
+ export type ClientStreamModule = typeof import("./client-stream");
10
+
11
+ const { setLoader, load, provide, getSync } = createChunkLoader<ClientStreamModule>({
12
+ fallbackImport: () => import("./client-stream"),
13
+ });
14
+
15
+ /** Override how the chunk is fetched (the IIFE build registers a sibling-URL loader). */
16
+ export const setClientStreamLoader = setLoader;
17
+
18
+ /** Load the stream processor. Memoized; retries after rejection. */
19
+ export const loadClientStream = load;
20
+
21
+ /** Eagerly supply the module (`client-stream-eager.ts`: npm builds and tests). */
22
+ export const provideClientStream = provide;
23
+
24
+ /** Synchronous access once loaded/provided; null before that. */
25
+ export const getClientStreamSync = getSync;