@ably/ai-transport 0.0.1

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 (118) hide show
  1. package/LICENSE +176 -0
  2. package/README.md +426 -0
  3. package/dist/ably-ai-transport.js +1388 -0
  4. package/dist/ably-ai-transport.js.map +1 -0
  5. package/dist/ably-ai-transport.umd.cjs +2 -0
  6. package/dist/ably-ai-transport.umd.cjs.map +1 -0
  7. package/dist/constants.d.ts +50 -0
  8. package/dist/core/codec/decoder.d.ts +62 -0
  9. package/dist/core/codec/encoder.d.ts +56 -0
  10. package/dist/core/codec/index.d.ts +8 -0
  11. package/dist/core/codec/lifecycle-tracker.d.ts +74 -0
  12. package/dist/core/codec/types.d.ts +188 -0
  13. package/dist/core/transport/client-transport.d.ts +10 -0
  14. package/dist/core/transport/conversation-tree.d.ts +9 -0
  15. package/dist/core/transport/decode-history.d.ts +41 -0
  16. package/dist/core/transport/headers.d.ts +26 -0
  17. package/dist/core/transport/index.d.ts +4 -0
  18. package/dist/core/transport/pipe-stream.d.ts +16 -0
  19. package/dist/core/transport/server-transport.d.ts +7 -0
  20. package/dist/core/transport/stream-router.d.ts +19 -0
  21. package/dist/core/transport/turn-manager.d.ts +34 -0
  22. package/dist/core/transport/types.d.ts +407 -0
  23. package/dist/errors.d.ts +46 -0
  24. package/dist/event-emitter.d.ts +65 -0
  25. package/dist/index.d.ts +11 -0
  26. package/dist/logger.d.ts +103 -0
  27. package/dist/react/ably-ai-transport-react.js +823 -0
  28. package/dist/react/ably-ai-transport-react.js.map +1 -0
  29. package/dist/react/ably-ai-transport-react.umd.cjs +2 -0
  30. package/dist/react/ably-ai-transport-react.umd.cjs.map +1 -0
  31. package/dist/react/index.d.ts +11 -0
  32. package/dist/react/use-ably-messages.d.ts +18 -0
  33. package/dist/react/use-active-turns.d.ts +8 -0
  34. package/dist/react/use-client-transport.d.ts +7 -0
  35. package/dist/react/use-conversation-tree.d.ts +20 -0
  36. package/dist/react/use-edit.d.ts +7 -0
  37. package/dist/react/use-history.d.ts +19 -0
  38. package/dist/react/use-messages.d.ts +7 -0
  39. package/dist/react/use-regenerate.d.ts +7 -0
  40. package/dist/react/use-send.d.ts +7 -0
  41. package/dist/utils.d.ts +127 -0
  42. package/dist/vercel/ably-ai-transport-vercel.js +2331 -0
  43. package/dist/vercel/ably-ai-transport-vercel.js.map +1 -0
  44. package/dist/vercel/ably-ai-transport-vercel.umd.cjs +2 -0
  45. package/dist/vercel/ably-ai-transport-vercel.umd.cjs.map +1 -0
  46. package/dist/vercel/codec/accumulator.d.ts +21 -0
  47. package/dist/vercel/codec/decoder.d.ts +22 -0
  48. package/dist/vercel/codec/encoder.d.ts +41 -0
  49. package/dist/vercel/codec/index.d.ts +22 -0
  50. package/dist/vercel/index.d.ts +3 -0
  51. package/dist/vercel/react/ably-ai-transport-vercel-react.js +2082 -0
  52. package/dist/vercel/react/ably-ai-transport-vercel-react.js.map +1 -0
  53. package/dist/vercel/react/ably-ai-transport-vercel-react.umd.cjs +2 -0
  54. package/dist/vercel/react/ably-ai-transport-vercel-react.umd.cjs.map +1 -0
  55. package/dist/vercel/react/index.d.ts +3 -0
  56. package/dist/vercel/react/use-chat-transport.d.ts +29 -0
  57. package/dist/vercel/react/use-message-sync.d.ts +19 -0
  58. package/dist/vercel/transport/chat-transport.d.ts +118 -0
  59. package/dist/vercel/transport/index.d.ts +36 -0
  60. package/package.json +123 -0
  61. package/react/README.md +3 -0
  62. package/react/index.d.ts +1 -0
  63. package/react/index.js +1 -0
  64. package/react/index.umd.cjs +1 -0
  65. package/src/constants.ts +98 -0
  66. package/src/core/codec/decoder.ts +402 -0
  67. package/src/core/codec/encoder.ts +470 -0
  68. package/src/core/codec/index.ts +28 -0
  69. package/src/core/codec/lifecycle-tracker.ts +140 -0
  70. package/src/core/codec/types.ts +249 -0
  71. package/src/core/transport/client-transport.ts +959 -0
  72. package/src/core/transport/conversation-tree.ts +434 -0
  73. package/src/core/transport/decode-history.ts +337 -0
  74. package/src/core/transport/headers.ts +46 -0
  75. package/src/core/transport/index.ts +34 -0
  76. package/src/core/transport/pipe-stream.ts +95 -0
  77. package/src/core/transport/server-transport.ts +458 -0
  78. package/src/core/transport/stream-router.ts +118 -0
  79. package/src/core/transport/turn-manager.ts +147 -0
  80. package/src/core/transport/types.ts +533 -0
  81. package/src/errors.ts +58 -0
  82. package/src/event-emitter.ts +103 -0
  83. package/src/index.ts +89 -0
  84. package/src/logger.ts +241 -0
  85. package/src/react/index.ts +11 -0
  86. package/src/react/use-ably-messages.ts +37 -0
  87. package/src/react/use-active-turns.ts +61 -0
  88. package/src/react/use-client-transport.ts +37 -0
  89. package/src/react/use-conversation-tree.ts +71 -0
  90. package/src/react/use-edit.ts +24 -0
  91. package/src/react/use-history.ts +111 -0
  92. package/src/react/use-messages.ts +32 -0
  93. package/src/react/use-regenerate.ts +24 -0
  94. package/src/react/use-send.ts +25 -0
  95. package/src/react/vite.config.ts +32 -0
  96. package/src/tsconfig.json +25 -0
  97. package/src/utils.ts +230 -0
  98. package/src/vercel/codec/accumulator.ts +603 -0
  99. package/src/vercel/codec/decoder.ts +615 -0
  100. package/src/vercel/codec/encoder.ts +396 -0
  101. package/src/vercel/codec/index.ts +37 -0
  102. package/src/vercel/index.ts +12 -0
  103. package/src/vercel/react/index.ts +4 -0
  104. package/src/vercel/react/use-chat-transport.ts +60 -0
  105. package/src/vercel/react/use-message-sync.ts +34 -0
  106. package/src/vercel/react/vite.config.ts +33 -0
  107. package/src/vercel/transport/chat-transport.ts +278 -0
  108. package/src/vercel/transport/index.ts +56 -0
  109. package/src/vercel/vite.config.ts +33 -0
  110. package/src/vite.config.ts +31 -0
  111. package/vercel/README.md +3 -0
  112. package/vercel/index.d.ts +1 -0
  113. package/vercel/index.js +1 -0
  114. package/vercel/index.umd.cjs +1 -0
  115. package/vercel/react/README.md +3 -0
  116. package/vercel/react/index.d.ts +1 -0
  117. package/vercel/react/index.js +1 -0
  118. package/vercel/react/index.umd.cjs +1 -0
@@ -0,0 +1,2331 @@
1
+ import * as e from "ably";
2
+ import { isDataUIPart as t } from "ai";
3
+ //#region src/constants.ts
4
+ var n = "x-ably-stream", r = "x-ably-status", i = "x-ably-stream-id", a = "x-ably-turn-id", o = "x-ably-msg-id", s = "x-ably-turn-client-id", c = "x-ably-role", l = "x-ably-cancel-turn-id", u = "x-ably-cancel-own", d = "x-ably-cancel-all", f = "x-ably-cancel-client-id", p = "x-ably-parent", m = "x-ably-fork-of", h = "x-ably-turn-reason", g = "x-ably-cancel", _ = "x-ably-turn-start", v = "x-ably-turn-end", y = "x-domain-", b = (e) => {
5
+ let t = e.extras;
6
+ if (!t || typeof t != "object") return {};
7
+ let n = t.headers;
8
+ return !n || typeof n != "object" ? {} : n;
9
+ }, ee = (e) => {
10
+ if (e !== void 0) try {
11
+ return JSON.parse(e);
12
+ } catch {
13
+ return;
14
+ }
15
+ }, x = (e, t) => ({
16
+ ...e,
17
+ ...t
18
+ }), te = (e) => {
19
+ if (e !== void 0) return e === "true";
20
+ }, S = (e, t) => e[y + t], C = (e) => {
21
+ let t = {};
22
+ for (let n in e) Object.prototype.hasOwnProperty.call(e, n) && e[n] !== void 0 && (t[n] = e[n]);
23
+ return t;
24
+ }, ne = (e) => ({
25
+ str: (t) => S(e, t),
26
+ strOr: (t, n) => S(e, t) ?? n,
27
+ bool: (t) => te(S(e, t)),
28
+ json: (t) => ee(S(e, t))
29
+ }), w = () => {
30
+ let e = {}, t = {
31
+ str: (n, r) => (r !== void 0 && (e[y + n] = r), t),
32
+ bool: (n, r) => (r !== void 0 && (e[y + n] = String(r)), t),
33
+ json: (n, r) => (r != null && (e[y + n] = JSON.stringify(r)), t),
34
+ build: () => e
35
+ };
36
+ return t;
37
+ }, T = (e) => C({
38
+ type: "dynamic-tool",
39
+ toolCallId: e.toolCallId,
40
+ toolName: e.toolName,
41
+ title: e.title,
42
+ providerExecuted: e.providerExecuted
43
+ }), E = class {
44
+ constructor(e) {
45
+ this._activeIndex = /* @__PURE__ */ new Map(), this._partType = e;
46
+ }
47
+ start(e, t, n) {
48
+ this._activeIndex.set(e, t.parts.length), t.parts.push({
49
+ type: this._partType,
50
+ text: ""
51
+ }), n.set(e, "streaming");
52
+ }
53
+ delta(e, t, n) {
54
+ let r = this._activeIndex.get(e);
55
+ if (r === void 0) return;
56
+ let i = t.parts[r];
57
+ i?.type === this._partType && (i.text += n);
58
+ }
59
+ end(e, t) {
60
+ t.set(e, "finished"), this._activeIndex.delete(e);
61
+ }
62
+ reset() {
63
+ this._activeIndex = /* @__PURE__ */ new Map();
64
+ }
65
+ }, D = class {
66
+ constructor() {
67
+ this._messageList = [], this._activeMessages = /* @__PURE__ */ new Map();
68
+ }
69
+ get messages() {
70
+ return this._messageList;
71
+ }
72
+ get completedMessages() {
73
+ let e = /* @__PURE__ */ new Set();
74
+ for (let t of this._activeMessages.values()) e.add(t.message);
75
+ return this._messageList.filter((t) => !e.has(t));
76
+ }
77
+ get hasActiveStream() {
78
+ for (let e of this._activeMessages.values()) for (let t of e.streamStatus.values()) if (t === "streaming") return !0;
79
+ return !1;
80
+ }
81
+ processOutputs(e) {
82
+ for (let t of e) t.kind === "message" ? this._messageList.push(t.message) : t.messageId !== void 0 && this._processEvent(t.event, t.messageId);
83
+ }
84
+ updateMessage(e) {
85
+ let t = this._messageList.findIndex((t) => t.id === e.id);
86
+ t !== -1 && (this._messageList[t] = e);
87
+ }
88
+ _ensureActiveMessage(e) {
89
+ let t = this._activeMessages.get(e);
90
+ if (t) return t;
91
+ let n = {
92
+ message: {
93
+ id: e,
94
+ role: "assistant",
95
+ parts: []
96
+ },
97
+ textStreams: new E("text"),
98
+ reasoningStreams: new E("reasoning"),
99
+ toolTrackers: {},
100
+ streamStatus: /* @__PURE__ */ new Map()
101
+ };
102
+ return this._activeMessages.set(e, n), this._messageList.push(n.message), n;
103
+ }
104
+ _getToolPart(e, t) {
105
+ let n = t.toolTrackers[e];
106
+ if (!n) return;
107
+ let r = t.message.parts[n.partIndex];
108
+ if (r?.type === "dynamic-tool") return {
109
+ tracker: n,
110
+ part: r
111
+ };
112
+ }
113
+ _processEvent(e, t) {
114
+ switch (e.type) {
115
+ case "start":
116
+ case "start-step":
117
+ case "finish-step":
118
+ case "finish":
119
+ case "abort":
120
+ case "error":
121
+ case "message-metadata":
122
+ this._processLifecycle(e, t);
123
+ break;
124
+ case "text-start":
125
+ case "text-delta":
126
+ case "text-end":
127
+ case "reasoning-start":
128
+ case "reasoning-delta":
129
+ case "reasoning-end":
130
+ this._processTextOrReasoning(e, t);
131
+ break;
132
+ case "tool-input-start":
133
+ case "tool-input-delta":
134
+ case "tool-input-available":
135
+ case "tool-input-error":
136
+ this._processToolInput(e, t);
137
+ break;
138
+ case "tool-output-available":
139
+ case "tool-output-error":
140
+ case "tool-output-denied":
141
+ case "tool-approval-request":
142
+ this._processToolOutput(e, t);
143
+ break;
144
+ case "file":
145
+ case "source-url":
146
+ case "source-document":
147
+ this._processContentPart(e, t);
148
+ break;
149
+ default:
150
+ if (e.type.startsWith("data-")) {
151
+ if (e.transient) break;
152
+ let n = this._ensureActiveMessage(t), r = C({
153
+ type: e.type,
154
+ id: e.id,
155
+ data: e.data
156
+ });
157
+ if (e.id !== void 0) {
158
+ let t = n.message.parts.findIndex((t) => t.type === e.type && "id" in t && t.id === e.id);
159
+ if (t !== -1) {
160
+ n.message.parts[t] = r;
161
+ break;
162
+ }
163
+ }
164
+ n.message.parts.push(r);
165
+ }
166
+ break;
167
+ }
168
+ }
169
+ _processLifecycle(e, t) {
170
+ switch (e.type) {
171
+ case "start": {
172
+ let n = this._ensureActiveMessage(t);
173
+ e.messageId && (n.message.id = e.messageId), e.messageMetadata !== void 0 && (n.message.metadata = e.messageMetadata);
174
+ break;
175
+ }
176
+ case "start-step":
177
+ this._ensureActiveMessage(t).message.parts.push({ type: "step-start" });
178
+ break;
179
+ case "finish-step": {
180
+ let e = this._activeMessages.get(t);
181
+ e && (e.textStreams.reset(), e.reasoningStreams.reset());
182
+ break;
183
+ }
184
+ case "finish": {
185
+ let n = this._activeMessages.get(t);
186
+ n && e.messageMetadata !== void 0 && (n.message.metadata = e.messageMetadata), this._activeMessages.delete(t);
187
+ break;
188
+ }
189
+ case "abort": {
190
+ let e = this._activeMessages.get(t);
191
+ if (e) for (let [t, n] of e.streamStatus) n === "streaming" && e.streamStatus.set(t, "aborted");
192
+ this._activeMessages.delete(t);
193
+ break;
194
+ }
195
+ case "error": break;
196
+ case "message-metadata": {
197
+ let n = this._activeMessages.get(t);
198
+ n && e.messageMetadata !== void 0 && (n.message.metadata = e.messageMetadata);
199
+ break;
200
+ }
201
+ }
202
+ }
203
+ _processTextOrReasoning(e, t) {
204
+ let n = this._ensureActiveMessage(t);
205
+ switch (e.type) {
206
+ case "text-start":
207
+ n.textStreams.start(e.id, n.message, n.streamStatus);
208
+ break;
209
+ case "text-delta":
210
+ n.textStreams.delta(e.id, n.message, e.delta);
211
+ break;
212
+ case "text-end":
213
+ n.textStreams.end(e.id, n.streamStatus);
214
+ break;
215
+ case "reasoning-start":
216
+ n.reasoningStreams.start(e.id, n.message, n.streamStatus);
217
+ break;
218
+ case "reasoning-delta":
219
+ n.reasoningStreams.delta(e.id, n.message, e.delta);
220
+ break;
221
+ case "reasoning-end":
222
+ n.reasoningStreams.end(e.id, n.streamStatus);
223
+ break;
224
+ }
225
+ }
226
+ _processToolInput(e, t) {
227
+ switch (e.type) {
228
+ case "tool-input-start": {
229
+ let n = this._ensureActiveMessage(t), r = n.message.parts.length;
230
+ n.message.parts.push({
231
+ ...T(e),
232
+ state: "input-streaming",
233
+ input: void 0
234
+ }), n.toolTrackers[e.toolCallId] = {
235
+ partIndex: r,
236
+ inputText: ""
237
+ }, n.streamStatus.set(e.toolCallId, "streaming");
238
+ break;
239
+ }
240
+ case "tool-input-delta": {
241
+ let n = this._ensureActiveMessage(t), r = n.toolTrackers[e.toolCallId];
242
+ if (!r) break;
243
+ r.inputText += e.inputTextDelta;
244
+ let i;
245
+ try {
246
+ i = JSON.parse(r.inputText);
247
+ } catch {
248
+ i = void 0;
249
+ }
250
+ let a = this._getToolPart(e.toolCallId, n);
251
+ if (!a) break;
252
+ n.message.parts[a.tracker.partIndex] = {
253
+ ...T(a.part),
254
+ state: "input-streaming",
255
+ input: i
256
+ };
257
+ break;
258
+ }
259
+ case "tool-input-available": {
260
+ let n = this._ensureActiveMessage(t), r = this._getToolPart(e.toolCallId, n);
261
+ if (!r) break;
262
+ n.message.parts[r.tracker.partIndex] = {
263
+ ...T(r.part),
264
+ state: "input-available",
265
+ input: e.input
266
+ }, n.streamStatus.set(e.toolCallId, "finished");
267
+ break;
268
+ }
269
+ case "tool-input-error": {
270
+ let n = this._ensureActiveMessage(t), r = this._getToolPart(e.toolCallId, n);
271
+ if (r) n.message.parts[r.tracker.partIndex] = {
272
+ ...T(r.part),
273
+ state: "output-error",
274
+ input: e.input,
275
+ errorText: e.errorText
276
+ };
277
+ else {
278
+ let t = n.message.parts.length;
279
+ n.message.parts.push({
280
+ ...T(e),
281
+ state: "output-error",
282
+ input: e.input,
283
+ errorText: e.errorText
284
+ }), n.toolTrackers[e.toolCallId] = {
285
+ partIndex: t,
286
+ inputText: ""
287
+ };
288
+ }
289
+ n.streamStatus.set(e.toolCallId, "finished");
290
+ break;
291
+ }
292
+ }
293
+ }
294
+ _processToolOutput(e, t) {
295
+ let n = this._ensureActiveMessage(t), r = this._getToolPart(e.toolCallId, n);
296
+ if (r) switch (e.type) {
297
+ case "tool-output-available":
298
+ n.message.parts[r.tracker.partIndex] = C({
299
+ ...T(r.part),
300
+ state: "output-available",
301
+ input: r.part.input,
302
+ output: e.output,
303
+ preliminary: e.preliminary
304
+ });
305
+ break;
306
+ case "tool-output-error":
307
+ n.message.parts[r.tracker.partIndex] = {
308
+ ...T(r.part),
309
+ state: "output-error",
310
+ input: r.part.input,
311
+ errorText: e.errorText
312
+ };
313
+ break;
314
+ case "tool-output-denied":
315
+ n.message.parts[r.tracker.partIndex] = {
316
+ ...T(r.part),
317
+ state: "output-denied",
318
+ input: r.part.input,
319
+ approval: {
320
+ id: "",
321
+ approved: !1
322
+ }
323
+ };
324
+ break;
325
+ case "tool-approval-request":
326
+ n.message.parts[r.tracker.partIndex] = {
327
+ ...T(r.part),
328
+ state: "approval-requested",
329
+ input: r.part.input,
330
+ approval: { id: e.approvalId }
331
+ };
332
+ break;
333
+ }
334
+ }
335
+ _processContentPart(e, t) {
336
+ let n = this._ensureActiveMessage(t);
337
+ switch (e.type) {
338
+ case "file":
339
+ n.message.parts.push({
340
+ type: "file",
341
+ mediaType: e.mediaType,
342
+ url: e.url
343
+ });
344
+ break;
345
+ case "source-url":
346
+ n.message.parts.push(C({
347
+ type: "source-url",
348
+ sourceId: e.sourceId,
349
+ url: e.url,
350
+ title: e.title
351
+ }));
352
+ break;
353
+ case "source-document":
354
+ n.message.parts.push(C({
355
+ type: "source-document",
356
+ sourceId: e.sourceId,
357
+ mediaType: e.mediaType,
358
+ title: e.title,
359
+ filename: e.filename
360
+ }));
361
+ break;
362
+ }
363
+ }
364
+ }, re = () => new D(), ie = (e) => [{
365
+ kind: "event",
366
+ event: e
367
+ }], ae = class {
368
+ constructor(e, t = {}) {
369
+ this._serialState = /* @__PURE__ */ new Map(), this._hooks = e, this._onStreamUpdate = t.onStreamUpdate, this._onStreamDelete = t.onStreamDelete, this._logger = t.logger?.withContext({ component: "DecoderCore" });
370
+ }
371
+ decode(e) {
372
+ let t = e.action;
373
+ this._logger?.trace("DefaultDecoderCore.decode();", {
374
+ action: t,
375
+ serial: e.serial,
376
+ name: e.name
377
+ });
378
+ let n;
379
+ switch (t) {
380
+ case "message.create": {
381
+ let t = this._toPayload(e);
382
+ n = t.headers?.["x-ably-stream"] === "true" ? this._decodeStreamedCreate(t, e.serial) : this._hooks.decodeDiscrete(t);
383
+ break;
384
+ }
385
+ case "message.append":
386
+ n = this._decodeAppend(e);
387
+ break;
388
+ case "message.update":
389
+ n = this._decodeUpdate(e);
390
+ break;
391
+ case "message.delete":
392
+ n = this._decodeDelete(e);
393
+ break;
394
+ default: return [];
395
+ }
396
+ let r = b(e)[o];
397
+ if (r) for (let e of n) e.kind === "event" && (e.messageId = r);
398
+ return n;
399
+ }
400
+ _toPayload(e) {
401
+ return {
402
+ name: e.name ?? "",
403
+ data: e.data,
404
+ headers: b(e)
405
+ };
406
+ }
407
+ _stringData(e) {
408
+ return typeof e.data == "string" ? e.data : "";
409
+ }
410
+ _invokeOnStreamUpdate(e) {
411
+ if (this._onStreamUpdate) try {
412
+ this._onStreamUpdate(e);
413
+ } catch (e) {
414
+ this._logger?.error("DefaultDecoderCore._invokeOnStreamUpdate(); callback threw", { error: e });
415
+ }
416
+ }
417
+ _invokeOnStreamDelete(e, t) {
418
+ if (this._onStreamDelete) try {
419
+ this._onStreamDelete(e, t);
420
+ } catch (e) {
421
+ this._logger?.error("DefaultDecoderCore._invokeOnStreamDelete(); callback threw", { error: e });
422
+ }
423
+ }
424
+ _decodeStreamedCreate(e, t) {
425
+ if (!t) return [];
426
+ let n = e.headers?.["x-ably-stream-id"] ?? "", r = e.headers ?? {}, i = {
427
+ name: e.name,
428
+ streamId: n,
429
+ accumulated: "",
430
+ headers: { ...r },
431
+ closed: !1
432
+ };
433
+ return this._serialState.set(t, i), this._logger?.debug("DefaultDecoderCore._decodeStreamedCreate(); new stream", {
434
+ name: e.name,
435
+ streamId: n,
436
+ serial: t
437
+ }), this._hooks.buildStartEvents(i);
438
+ }
439
+ _decodeAppend(e) {
440
+ let t = e.serial;
441
+ if (!t) return [];
442
+ let n = this._serialState.get(t);
443
+ if (!n) return this._decodeUpdate(e);
444
+ let i = b(e), a = typeof e.data == "string" ? e.data : "", o = i[r], s = [];
445
+ return a.length > 0 && (n.accumulated += a, s.push(...this._hooks.buildDeltaEvents(n, a))), o === "finished" && !n.closed ? (n.closed = !0, s.push(...this._hooks.buildEndEvents(n, i)), this._logger?.debug("DefaultDecoderCore._decodeAppend(); stream finished", { streamId: n.streamId })) : o === "aborted" && !n.closed && (n.closed = !0, this._logger?.debug("DefaultDecoderCore._decodeAppend(); stream aborted", { streamId: n.streamId })), s;
446
+ }
447
+ _decodeUpdate(e) {
448
+ let t = e.serial;
449
+ if (!t) return [];
450
+ let i = this._toPayload(e), a = i.headers ?? {}, o = a[n] === "true", s = a[r], c = this._serialState.get(t);
451
+ if (!c) return this._decodeFirstContact(i, o, s, t);
452
+ let l = this._stringData(e);
453
+ if (l.startsWith(c.accumulated)) {
454
+ let e = l.slice(c.accumulated.length), t = [];
455
+ return e.length > 0 && (c.accumulated = l, t.push(...this._hooks.buildDeltaEvents(c, e))), s === "finished" && !c.closed ? (c.closed = !0, t.push(...this._hooks.buildEndEvents(c, a))) : s === "aborted" && !c.closed && (c.closed = !0), t;
456
+ }
457
+ return c.accumulated = l, c.headers = { ...a }, this._invokeOnStreamUpdate(c), [];
458
+ }
459
+ _decodeFirstContact(e, t, n, r) {
460
+ if (!t) return this._hooks.decodeDiscrete(e);
461
+ let i = e.headers?.["x-ably-stream-id"] ?? "", a = e.headers ?? {}, o = typeof e.data == "string" ? e.data : "";
462
+ this._logger?.debug("DefaultDecoderCore._decodeFirstContact(); first-contact stream", {
463
+ name: e.name,
464
+ streamId: i,
465
+ serial: r
466
+ });
467
+ let s = {
468
+ name: e.name,
469
+ streamId: i,
470
+ accumulated: o,
471
+ headers: { ...a },
472
+ closed: n === "finished" || n === "aborted"
473
+ };
474
+ this._serialState.set(r, s);
475
+ let c = this._hooks.buildStartEvents(s);
476
+ return o.length > 0 && c.push(...this._hooks.buildDeltaEvents(s, o)), n === "finished" && c.push(...this._hooks.buildEndEvents(s, a)), c;
477
+ }
478
+ _decodeDelete(e) {
479
+ let t = e.serial;
480
+ if (!t) return [];
481
+ let n = this._serialState.get(t);
482
+ return this._invokeOnStreamDelete(t, n), n && (n.accumulated = "", n.closed = !0), this._logger?.debug("DefaultDecoderCore._decodeDelete();", { serial: t }), [];
483
+ }
484
+ }, oe = (e, t = {}) => new ae(e, t), se = class {
485
+ constructor(e) {
486
+ this._emitted = /* @__PURE__ */ new Map(), this._phases = e;
487
+ }
488
+ ensurePhases(e, t) {
489
+ let n = this._getOrCreate(e), r = [];
490
+ for (let e of this._phases) n.has(e.key) || (n.add(e.key), r.push(...e.build(t)));
491
+ return r;
492
+ }
493
+ markEmitted(e, t) {
494
+ this._getOrCreate(e).add(t);
495
+ }
496
+ resetPhase(e, t) {
497
+ this._emitted.get(e)?.delete(t);
498
+ }
499
+ clearScope(e) {
500
+ this._emitted.delete(e);
501
+ }
502
+ _getOrCreate(e) {
503
+ let t = this._emitted.get(e);
504
+ return t || (t = /* @__PURE__ */ new Set(), this._emitted.set(e, t)), t;
505
+ }
506
+ }, ce = (e) => new se(e), O = (e) => {
507
+ let t = ne(e);
508
+ return {
509
+ ...t,
510
+ providerMetadata: () => t.json("providerMetadata")
511
+ };
512
+ }, k = (e) => ie(e), le = (e, t) => e === "stop" || e === "length" || e === "content-filter" || e === "tool-calls" || e === "error" || e === "other" ? e : t, A = (e) => e.startsWith("data-"), ue = (e) => {
513
+ if (e) try {
514
+ return JSON.parse(e);
515
+ } catch {
516
+ return e;
517
+ }
518
+ }, j = (e) => {
519
+ let t = O(e.headers);
520
+ switch (e.name) {
521
+ case "text": return C({
522
+ type: "text-start",
523
+ id: e.streamId,
524
+ providerMetadata: t.providerMetadata()
525
+ });
526
+ case "reasoning": return C({
527
+ type: "reasoning-start",
528
+ id: e.streamId,
529
+ providerMetadata: t.providerMetadata()
530
+ });
531
+ case "tool-input": return C({
532
+ type: "tool-input-start",
533
+ toolCallId: e.streamId,
534
+ toolName: t.strOr("toolName", ""),
535
+ dynamic: t.bool("dynamic"),
536
+ title: t.str("title"),
537
+ providerExecuted: t.bool("providerExecuted"),
538
+ providerMetadata: t.providerMetadata()
539
+ });
540
+ default: return {
541
+ type: "text-start",
542
+ id: e.streamId
543
+ };
544
+ }
545
+ }, M = (e, t) => {
546
+ switch (e.name) {
547
+ case "text": return {
548
+ type: "text-delta",
549
+ id: e.streamId,
550
+ delta: t
551
+ };
552
+ case "reasoning": return {
553
+ type: "reasoning-delta",
554
+ id: e.streamId,
555
+ delta: t
556
+ };
557
+ case "tool-input": return {
558
+ type: "tool-input-delta",
559
+ toolCallId: e.streamId,
560
+ inputTextDelta: t
561
+ };
562
+ default: return {
563
+ type: "text-delta",
564
+ id: e.streamId,
565
+ delta: t
566
+ };
567
+ }
568
+ }, N = (e, t) => {
569
+ let n = O(t);
570
+ switch (e.name) {
571
+ case "text": return C({
572
+ type: "text-end",
573
+ id: e.streamId,
574
+ providerMetadata: n.providerMetadata()
575
+ });
576
+ case "reasoning": return C({
577
+ type: "reasoning-end",
578
+ id: e.streamId,
579
+ providerMetadata: n.providerMetadata()
580
+ });
581
+ case "tool-input": return C({
582
+ type: "tool-input-available",
583
+ toolCallId: e.streamId,
584
+ toolName: n.strOr("toolName", O(e.headers).strOr("toolName", "")),
585
+ input: ue(e.accumulated),
586
+ providerMetadata: n.providerMetadata()
587
+ });
588
+ default: return {
589
+ type: "text-end",
590
+ id: e.streamId
591
+ };
592
+ }
593
+ }, P = () => ce([{
594
+ key: "start",
595
+ build: (e) => [C({
596
+ type: "start",
597
+ messageId: e.messageId
598
+ })]
599
+ }, {
600
+ key: "start-step",
601
+ build: () => [{ type: "start-step" }]
602
+ }]), F = (e, t, n) => e.ensurePhases(t, n).map((e) => ({
603
+ kind: "event",
604
+ event: e
605
+ })), I = (e, t, n) => (n.markEmitted(t, "start"), k(C({
606
+ type: "start",
607
+ messageId: e.str("messageId"),
608
+ messageMetadata: e.json("messageMetadata")
609
+ }))), L = (e, t) => (t.markEmitted(e, "start-step"), k({ type: "start-step" })), R = (e, t) => (t.resetPhase(e, "start-step"), k({ type: "finish-step" })), z = (e, t, n) => (n.clearScope(t), k(C({
610
+ type: "finish",
611
+ finishReason: le(e.str("finishReason"), "stop"),
612
+ messageMetadata: e.json("messageMetadata")
613
+ }))), B = (e) => k({
614
+ type: "error",
615
+ errorText: typeof e == "string" ? e : ""
616
+ }), V = (e, t, n) => (n.clearScope(t), k(C({
617
+ type: "abort",
618
+ reason: typeof e == "string" && e ? e : void 0
619
+ }))), H = (e) => k({
620
+ type: "message-metadata",
621
+ messageMetadata: e.json("messageMetadata")
622
+ }), U = (e, t) => k(C({
623
+ type: "file",
624
+ url: typeof t == "string" ? t : "",
625
+ mediaType: e.strOr("mediaType", ""),
626
+ providerMetadata: e.providerMetadata()
627
+ })), de = (e, t) => k(C({
628
+ type: "source-url",
629
+ sourceId: e.strOr("sourceId", ""),
630
+ url: typeof t == "string" ? t : "",
631
+ title: e.str("title"),
632
+ providerMetadata: e.providerMetadata()
633
+ })), fe = (e) => k(C({
634
+ type: "source-document",
635
+ sourceId: e.strOr("sourceId", ""),
636
+ mediaType: e.strOr("mediaType", ""),
637
+ title: e.strOr("title", ""),
638
+ filename: e.str("filename"),
639
+ providerMetadata: e.providerMetadata()
640
+ })), pe = (e, t) => {
641
+ let n = t;
642
+ return k(C({
643
+ type: "tool-input-error",
644
+ toolCallId: e.strOr("toolCallId", ""),
645
+ toolName: e.strOr("toolName", ""),
646
+ errorText: n?.errorText ?? "",
647
+ input: n?.input,
648
+ dynamic: e.bool("dynamic"),
649
+ title: e.str("title"),
650
+ providerExecuted: e.bool("providerExecuted"),
651
+ providerMetadata: e.providerMetadata()
652
+ }));
653
+ }, me = (e, t) => {
654
+ let n = t;
655
+ return k(C({
656
+ type: "tool-output-available",
657
+ toolCallId: e.strOr("toolCallId", ""),
658
+ output: n?.output,
659
+ dynamic: e.bool("dynamic"),
660
+ providerExecuted: e.bool("providerExecuted"),
661
+ preliminary: e.bool("preliminary")
662
+ }));
663
+ }, he = (e, t) => {
664
+ let n = t;
665
+ return k(C({
666
+ type: "tool-output-error",
667
+ toolCallId: e.strOr("toolCallId", ""),
668
+ errorText: n?.errorText ?? "",
669
+ dynamic: e.bool("dynamic"),
670
+ providerExecuted: e.bool("providerExecuted")
671
+ }));
672
+ }, ge = (e) => k({
673
+ type: "tool-approval-request",
674
+ toolCallId: e.strOr("toolCallId", ""),
675
+ approvalId: e.strOr("approvalId", "")
676
+ }), _e = (e) => k({
677
+ type: "tool-output-denied",
678
+ toolCallId: e.strOr("toolCallId", "")
679
+ }), ve = (e, t, n) => k(C({
680
+ type: e,
681
+ data: n,
682
+ id: t.str("id"),
683
+ transient: t.bool("transient")
684
+ })), ye = (e, t, n, r) => {
685
+ let i = F(r, n, { messageId: e.str("messageId") });
686
+ return i.push({
687
+ kind: "event",
688
+ event: C({
689
+ type: "tool-input-start",
690
+ toolCallId: e.strOr("toolCallId", ""),
691
+ toolName: e.strOr("toolName", ""),
692
+ dynamic: e.bool("dynamic"),
693
+ title: e.str("title"),
694
+ providerExecuted: e.bool("providerExecuted"),
695
+ providerMetadata: e.providerMetadata()
696
+ })
697
+ }, {
698
+ kind: "event",
699
+ event: C({
700
+ type: "tool-input-available",
701
+ toolCallId: e.strOr("toolCallId", ""),
702
+ toolName: e.strOr("toolName", ""),
703
+ input: t,
704
+ providerMetadata: e.providerMetadata()
705
+ })
706
+ }), i;
707
+ }, be = (e) => {
708
+ let t = e.headers ?? {}, n = O(t), r = t["x-ably-role"] ?? "user", i = n.str("messageId") ?? "", a;
709
+ switch (e.name) {
710
+ case "text":
711
+ a = {
712
+ type: "text",
713
+ text: typeof e.data == "string" ? e.data : ""
714
+ };
715
+ break;
716
+ case "file":
717
+ a = {
718
+ type: "file",
719
+ mediaType: n.strOr("mediaType", ""),
720
+ url: typeof e.data == "string" ? e.data : ""
721
+ };
722
+ break;
723
+ default:
724
+ A(e.name) && (a = C({
725
+ type: e.name,
726
+ id: n.str("id"),
727
+ data: e.data
728
+ }));
729
+ break;
730
+ }
731
+ return a ? [{
732
+ kind: "message",
733
+ message: {
734
+ id: i,
735
+ role: r,
736
+ parts: [a]
737
+ }
738
+ }] : [];
739
+ }, xe = (e, t) => (e === "text" || e === "file" || A(e)) && "x-ably-role" in t, Se = (e, t) => {
740
+ let n = e.headers ?? {}, r = O(n), i = n["x-ably-turn-id"] ?? "";
741
+ if (xe(e.name, n)) return be(e);
742
+ if (e.name === "tool-input") return ye(r, e.data, i, t);
743
+ switch (e.name) {
744
+ case "start": return I(r, i, t);
745
+ case "start-step": return L(i, t);
746
+ case "finish-step": return R(i, t);
747
+ case "finish": return z(r, i, t);
748
+ case "error": return B(e.data);
749
+ case "abort": return V(e.data, i, t);
750
+ case "message-metadata": return H(r);
751
+ case "file": return U(r, e.data);
752
+ case "source-url": return de(r, e.data);
753
+ case "source-document": return fe(r);
754
+ case "tool-input-error": return pe(r, e.data);
755
+ case "tool-output-available": return me(r, e.data);
756
+ case "tool-output-error": return he(r, e.data);
757
+ case "tool-approval-request": return ge(r);
758
+ case "tool-output-denied": return _e(r);
759
+ default: return A(e.name) ? ve(e.name, r, e.data) : [];
760
+ }
761
+ }, Ce = (e) => ({
762
+ buildStartEvents: (t) => {
763
+ let n = F(e, t.headers["x-ably-turn-id"] ?? "", { messageId: O(t.headers).str("messageId") });
764
+ return n.push({
765
+ kind: "event",
766
+ event: j(t)
767
+ }), n;
768
+ },
769
+ buildDeltaEvents: (e, t) => k(M(e, t)),
770
+ buildEndEvents: (e, t) => k(N(e, t)),
771
+ decodeDiscrete: (t) => Se(t, e)
772
+ }), we = class {
773
+ constructor(e = {}) {
774
+ this._core = oe(Ce(P()), e);
775
+ }
776
+ decode(e) {
777
+ return this._core.decode(e);
778
+ }
779
+ }, Te = (e = {}) => new we(e), W = /* @__PURE__ */ function(e) {
780
+ return e[e.BadRequest = 4e4] = "BadRequest", e[e.InvalidArgument = 40003] = "InvalidArgument", e[e.EncoderRecoveryFailed = 104e3] = "EncoderRecoveryFailed", e[e.TransportSubscriptionError = 104001] = "TransportSubscriptionError", e[e.CancelListenerError = 104002] = "CancelListenerError", e[e.TurnLifecycleError = 104003] = "TurnLifecycleError", e[e.TransportClosed = 104004] = "TransportClosed", e[e.TransportSendFailed = 104005] = "TransportSendFailed", e;
781
+ }({}), Ee = (e, t) => e.code === t, De = class {
782
+ constructor(e, t = {}) {
783
+ this._trackers = /* @__PURE__ */ new Map(), this._pending = [], this._closed = !1, this._writer = e, this._defaultClientId = t.clientId, this._defaultExtras = t.extras, this._onMessageHook = t.onMessage ?? (() => {}), this._logger = t.logger?.withContext({ component: "EncoderCore" });
784
+ }
785
+ async publishDiscrete(e, t) {
786
+ this._assertNotClosed(), this._logger?.trace("DefaultEncoderCore.publishDiscrete();", { name: e.name });
787
+ let n = this._buildDiscreteMessage(e, t);
788
+ return this._writer.publish(n);
789
+ }
790
+ async publishDiscreteBatch(e, t) {
791
+ this._assertNotClosed(), this._logger?.trace("DefaultEncoderCore.publishDiscreteBatch();", { count: e.length });
792
+ let n = e.map((e) => this._buildDiscreteMessage(e, t));
793
+ return this._writer.publish(n);
794
+ }
795
+ async startStream(t, a, o) {
796
+ this._assertNotClosed(), this._logger?.trace("DefaultEncoderCore.startStream();", {
797
+ name: a.name,
798
+ streamId: t
799
+ });
800
+ let s = this._buildHeaders(a.headers ?? {}, o);
801
+ s[n] = "true", s[r] = "streaming", s[i] = t;
802
+ let c = this._resolveClientId(o), l = {
803
+ name: a.name,
804
+ data: a.data,
805
+ extras: { headers: s },
806
+ ...c ? { clientId: c } : {}
807
+ };
808
+ this._invokeOnMessage(l);
809
+ let u = (await this._writer.publish(l)).serials[0];
810
+ if (!u) throw new e.ErrorInfo(`unable to start stream; no serial returned for stream '${a.name}' (streamId: ${t})`, W.BadRequest, 400);
811
+ this._trackers.set(t, {
812
+ serial: u,
813
+ name: a.name,
814
+ streamId: t,
815
+ accumulated: a.data,
816
+ persistentHeaders: s,
817
+ aborted: !1
818
+ }), this._logger?.debug("DefaultEncoderCore.startStream(); stream started", {
819
+ name: a.name,
820
+ streamId: t,
821
+ serial: u
822
+ });
823
+ }
824
+ appendStream(t, n) {
825
+ this._assertNotClosed();
826
+ let r = this._trackers.get(t);
827
+ if (!r) throw new e.ErrorInfo(`unable to append to stream; no active stream for streamId '${t}'`, W.InvalidArgument, 400);
828
+ r.accumulated += n;
829
+ let i = {
830
+ serial: r.serial,
831
+ data: n,
832
+ extras: { headers: { ...r.persistentHeaders } }
833
+ };
834
+ this._invokeOnMessage(i);
835
+ let a = this._writer.appendMessage(i);
836
+ this._pending.push({
837
+ promise: a,
838
+ streamId: t
839
+ });
840
+ }
841
+ async closeStream(t, n) {
842
+ this._assertNotClosed(), this._logger?.trace("DefaultEncoderCore.closeStream();", { streamId: t });
843
+ let i = this._trackers.get(t);
844
+ if (!i) throw new e.ErrorInfo(`unable to close stream; no active stream for streamId '${t}'`, W.InvalidArgument, 400);
845
+ i.accumulated += n.data;
846
+ let a = this._buildClosingHeaders(i, n.headers ?? {});
847
+ a[r] = "finished";
848
+ let o = {
849
+ serial: i.serial,
850
+ data: n.data,
851
+ extras: { headers: a }
852
+ };
853
+ this._invokeOnMessage(o);
854
+ let s = this._writer.appendMessage(o);
855
+ this._pending.push({
856
+ promise: s,
857
+ streamId: t
858
+ }), await this._flushPending(), this._logger?.debug("DefaultEncoderCore.closeStream(); stream closed", { streamId: t });
859
+ }
860
+ async abortStream(t, n) {
861
+ this._assertNotClosed(), this._logger?.trace("DefaultEncoderCore.abortStream();", { streamId: t });
862
+ let i = this._trackers.get(t);
863
+ if (!i) throw new e.ErrorInfo(`unable to abort stream; no active stream for streamId '${t}'`, W.InvalidArgument, 400);
864
+ i.aborted = !0;
865
+ let a = this._buildClosingHeaders(i, {}, n);
866
+ a[r] = "aborted";
867
+ let o = {
868
+ serial: i.serial,
869
+ data: "",
870
+ extras: { headers: a }
871
+ };
872
+ this._invokeOnMessage(o);
873
+ let s = this._writer.appendMessage(o);
874
+ this._pending.push({
875
+ promise: s,
876
+ streamId: t
877
+ }), await this._flushPending(), this._logger?.debug("DefaultEncoderCore.abortStream(); stream aborted", { streamId: t });
878
+ }
879
+ async abortAllStreams(e) {
880
+ this._assertNotClosed(), this._logger?.trace("DefaultEncoderCore.abortAllStreams();", { streamCount: this._trackers.size });
881
+ for (let t of this._trackers.values()) {
882
+ t.aborted = !0;
883
+ let n = this._buildClosingHeaders(t, {}, e);
884
+ n[r] = "aborted";
885
+ let i = {
886
+ serial: t.serial,
887
+ data: "",
888
+ extras: { headers: n }
889
+ };
890
+ this._invokeOnMessage(i);
891
+ let a = this._writer.appendMessage(i);
892
+ this._pending.push({
893
+ promise: a,
894
+ streamId: t.streamId
895
+ });
896
+ }
897
+ await this._flushPending();
898
+ }
899
+ async _flushPending() {
900
+ if (this._flushPromise) return this._flushPromise;
901
+ let e = this._pending;
902
+ if (this._pending = [], e.length !== 0) {
903
+ this._logger?.trace("DefaultEncoderCore._flushPending();", { count: e.length }), this._flushPromise = this._doFlush(e);
904
+ try {
905
+ await this._flushPromise;
906
+ } finally {
907
+ this._flushPromise = void 0;
908
+ }
909
+ }
910
+ }
911
+ async _doFlush(t) {
912
+ let n = await Promise.allSettled(t.map(async (e) => e.promise)), i = /* @__PURE__ */ new Set();
913
+ for (let [e, r] of n.entries()) {
914
+ let n = t[e];
915
+ n && r.status === "rejected" && i.add(n.streamId);
916
+ }
917
+ if (i.size === 0) {
918
+ this._logger?.debug("DefaultEncoderCore._flushPending(); all appends succeeded");
919
+ return;
920
+ }
921
+ this._logger?.warn("DefaultEncoderCore._flushPending(); recovering failed appends", { failedStreams: [...i] });
922
+ let a = [];
923
+ for (let e of i) {
924
+ let t = this._trackers.get(e);
925
+ if (!t) continue;
926
+ let n = t.aborted ? "aborted" : "finished", i = {
927
+ serial: t.serial,
928
+ data: t.accumulated,
929
+ extras: { headers: {
930
+ ...t.persistentHeaders,
931
+ [r]: n
932
+ } }
933
+ };
934
+ try {
935
+ await this._writer.updateMessage(i);
936
+ } catch (t) {
937
+ a.push({
938
+ streamId: e,
939
+ error: t
940
+ });
941
+ }
942
+ }
943
+ if (a.length > 0) {
944
+ let t = a.map((e) => e.streamId).join(", ");
945
+ throw this._logger?.error("DefaultEncoderCore._flushPending(); recovery failed", { failedStreams: t }), new e.ErrorInfo(`unable to flush pending appends; recovery failed for stream(s): ${t}`, W.EncoderRecoveryFailed, 500);
946
+ }
947
+ }
948
+ async close() {
949
+ if (!this._closed) {
950
+ this._logger?.trace("DefaultEncoderCore.close();"), this._closed = !0;
951
+ try {
952
+ await this._flushPending();
953
+ } finally {
954
+ this._trackers.clear();
955
+ }
956
+ this._logger?.debug("DefaultEncoderCore.close(); encoder closed");
957
+ }
958
+ }
959
+ _invokeOnMessage(e) {
960
+ try {
961
+ this._onMessageHook(e);
962
+ } catch (e) {
963
+ this._logger?.error("DefaultEncoderCore._invokeOnMessage(); hook threw", { error: e });
964
+ }
965
+ }
966
+ _assertNotClosed() {
967
+ if (this._closed) throw new e.ErrorInfo("unable to write to encoder; encoder has been closed", W.InvalidArgument, 400);
968
+ }
969
+ _resolveClientId(e) {
970
+ return e?.clientId ?? this._defaultClientId;
971
+ }
972
+ _buildHeaders(e, t) {
973
+ let n = {
974
+ ...x(this._defaultExtras?.headers, t?.extras?.headers),
975
+ ...e
976
+ };
977
+ return t?.messageId !== void 0 && (n[o] = t.messageId), n;
978
+ }
979
+ _buildDiscreteMessage(e, t) {
980
+ let r = this._buildHeaders(e.headers ?? {}, t);
981
+ r[n] = "false";
982
+ let i = this._resolveClientId(t), a = {
983
+ name: e.name,
984
+ data: e.data,
985
+ extras: {
986
+ headers: r,
987
+ ...e.ephemeral ? { ephemeral: !0 } : {}
988
+ },
989
+ ...i ? { clientId: i } : {}
990
+ };
991
+ return this._invokeOnMessage(a), a;
992
+ }
993
+ _buildClosingHeaders(e, t, n) {
994
+ let r = { ...e.persistentHeaders }, i = x(this._defaultExtras?.headers, n?.extras?.headers);
995
+ return Object.assign(r, i), Object.assign(r, t), r;
996
+ }
997
+ }, Oe = (e, t = {}) => new De(e, t), ke = class {
998
+ constructor(e, t = {}) {
999
+ this._aborted = !1, this._core = Oe(e, t);
1000
+ }
1001
+ async appendEvent(t, n) {
1002
+ switch (t.type) {
1003
+ case "text-start": {
1004
+ let e = w().str("id", t.id).json("providerMetadata", t.providerMetadata).build();
1005
+ await this._core.startStream(t.id, {
1006
+ name: "text",
1007
+ data: "",
1008
+ headers: e
1009
+ }, n);
1010
+ break;
1011
+ }
1012
+ case "reasoning-start": {
1013
+ let e = w().str("id", t.id).json("providerMetadata", t.providerMetadata).build();
1014
+ await this._core.startStream(t.id, {
1015
+ name: "reasoning",
1016
+ data: "",
1017
+ headers: e
1018
+ }, n);
1019
+ break;
1020
+ }
1021
+ case "tool-input-start": {
1022
+ let e = w().str("toolCallId", t.toolCallId).str("toolName", t.toolName).bool("dynamic", t.dynamic).str("title", t.title).bool("providerExecuted", t.providerExecuted).json("providerMetadata", t.providerMetadata).build();
1023
+ await this._core.startStream(t.toolCallId, {
1024
+ name: "tool-input",
1025
+ data: "",
1026
+ headers: e
1027
+ }, n);
1028
+ break;
1029
+ }
1030
+ case "text-delta":
1031
+ this._core.appendStream(t.id, t.delta);
1032
+ break;
1033
+ case "reasoning-delta":
1034
+ this._core.appendStream(t.id, t.delta);
1035
+ break;
1036
+ case "tool-input-delta":
1037
+ this._core.appendStream(t.toolCallId, t.inputTextDelta);
1038
+ break;
1039
+ case "text-end": {
1040
+ let e = w().str("id", t.id).json("providerMetadata", t.providerMetadata).build();
1041
+ await this._core.closeStream(t.id, {
1042
+ name: "text",
1043
+ data: "",
1044
+ headers: e
1045
+ });
1046
+ break;
1047
+ }
1048
+ case "reasoning-end": {
1049
+ let e = w().str("id", t.id).json("providerMetadata", t.providerMetadata).build();
1050
+ await this._core.closeStream(t.id, {
1051
+ name: "reasoning",
1052
+ data: "",
1053
+ headers: e
1054
+ });
1055
+ break;
1056
+ }
1057
+ case "tool-input-available":
1058
+ try {
1059
+ let e = w().str("toolCallId", t.toolCallId).str("toolName", t.toolName).json("providerMetadata", t.providerMetadata).build();
1060
+ await this._core.closeStream(t.toolCallId, {
1061
+ name: "tool-input",
1062
+ data: "",
1063
+ headers: e
1064
+ });
1065
+ } catch (n) {
1066
+ if (!(n instanceof e.ErrorInfo && Ee(n, W.InvalidArgument))) throw n;
1067
+ let r = w().str("toolCallId", t.toolCallId).str("toolName", t.toolName).bool("dynamic", t.dynamic).str("title", t.title).bool("providerExecuted", t.providerExecuted).json("providerMetadata", t.providerMetadata).build();
1068
+ await this._core.publishDiscrete({
1069
+ name: "tool-input",
1070
+ data: t.input,
1071
+ headers: r
1072
+ });
1073
+ }
1074
+ break;
1075
+ case "start": {
1076
+ let e = w().str("messageId", t.messageId).json("messageMetadata", t.messageMetadata).build();
1077
+ await this._core.publishDiscrete({
1078
+ name: "start",
1079
+ data: "",
1080
+ headers: e
1081
+ }, n);
1082
+ break;
1083
+ }
1084
+ case "start-step":
1085
+ await this._core.publishDiscrete({
1086
+ name: "start-step",
1087
+ data: ""
1088
+ }, n);
1089
+ break;
1090
+ case "finish-step":
1091
+ await this._core.publishDiscrete({
1092
+ name: "finish-step",
1093
+ data: ""
1094
+ }, n);
1095
+ break;
1096
+ case "finish": {
1097
+ let e = w().str("finishReason", t.finishReason).json("messageMetadata", t.messageMetadata).build();
1098
+ await this._core.publishDiscrete({
1099
+ name: "finish",
1100
+ data: "",
1101
+ headers: e
1102
+ }, n);
1103
+ break;
1104
+ }
1105
+ case "error":
1106
+ await this._core.publishDiscrete({
1107
+ name: "error",
1108
+ data: t.errorText
1109
+ }, n);
1110
+ break;
1111
+ case "abort":
1112
+ this._aborted = !0, await this._core.abortAllStreams(n), await this._core.publishDiscrete({
1113
+ name: "abort",
1114
+ data: t.reason ?? "",
1115
+ headers: { [r]: "aborted" }
1116
+ }, n);
1117
+ break;
1118
+ case "tool-input-error": {
1119
+ let e = w().str("toolCallId", t.toolCallId).str("toolName", t.toolName).bool("dynamic", t.dynamic).str("title", t.title).bool("providerExecuted", t.providerExecuted).json("providerMetadata", t.providerMetadata).build();
1120
+ await this._core.publishDiscrete({
1121
+ name: "tool-input-error",
1122
+ data: {
1123
+ errorText: t.errorText,
1124
+ input: t.input
1125
+ },
1126
+ headers: e
1127
+ });
1128
+ break;
1129
+ }
1130
+ case "tool-output-available": {
1131
+ let e = w().str("toolCallId", t.toolCallId).bool("dynamic", t.dynamic).bool("providerExecuted", t.providerExecuted).bool("preliminary", t.preliminary).build();
1132
+ await this._core.publishDiscrete({
1133
+ name: "tool-output-available",
1134
+ data: { output: t.output },
1135
+ headers: e
1136
+ });
1137
+ break;
1138
+ }
1139
+ case "tool-output-error": {
1140
+ let e = w().str("toolCallId", t.toolCallId).bool("dynamic", t.dynamic).bool("providerExecuted", t.providerExecuted).build();
1141
+ await this._core.publishDiscrete({
1142
+ name: "tool-output-error",
1143
+ data: { errorText: t.errorText },
1144
+ headers: e
1145
+ });
1146
+ break;
1147
+ }
1148
+ case "tool-approval-request": {
1149
+ let e = w().str("toolCallId", t.toolCallId).str("approvalId", t.approvalId).build();
1150
+ await this._core.publishDiscrete({
1151
+ name: "tool-approval-request",
1152
+ data: "",
1153
+ headers: e
1154
+ }, n);
1155
+ break;
1156
+ }
1157
+ case "tool-output-denied": {
1158
+ let e = w().str("toolCallId", t.toolCallId).build();
1159
+ await this._core.publishDiscrete({
1160
+ name: "tool-output-denied",
1161
+ data: "",
1162
+ headers: e
1163
+ }, n);
1164
+ break;
1165
+ }
1166
+ case "file": {
1167
+ let e = w().str("mediaType", t.mediaType).json("providerMetadata", t.providerMetadata).build();
1168
+ await this._core.publishDiscrete({
1169
+ name: "file",
1170
+ data: t.url,
1171
+ headers: e
1172
+ }, n);
1173
+ break;
1174
+ }
1175
+ case "source-url": {
1176
+ let e = w().str("sourceId", t.sourceId).str("title", t.title).json("providerMetadata", t.providerMetadata).build();
1177
+ await this._core.publishDiscrete({
1178
+ name: "source-url",
1179
+ data: t.url,
1180
+ headers: e
1181
+ }, n);
1182
+ break;
1183
+ }
1184
+ case "source-document": {
1185
+ let e = w().str("sourceId", t.sourceId).str("mediaType", t.mediaType).str("title", t.title).str("filename", t.filename).json("providerMetadata", t.providerMetadata).build();
1186
+ await this._core.publishDiscrete({
1187
+ name: "source-document",
1188
+ data: "",
1189
+ headers: e
1190
+ }, n);
1191
+ break;
1192
+ }
1193
+ case "message-metadata": {
1194
+ let e = w().json("messageMetadata", t.messageMetadata).build();
1195
+ await this._core.publishDiscrete({
1196
+ name: "message-metadata",
1197
+ data: "",
1198
+ headers: e
1199
+ }, n);
1200
+ break;
1201
+ }
1202
+ default:
1203
+ if (t.type.startsWith("data-")) {
1204
+ let e = w().str("id", t.id).bool("transient", t.transient).build(), r = t.transient === !0;
1205
+ await this._core.publishDiscrete({
1206
+ name: t.type,
1207
+ data: t.data,
1208
+ headers: e,
1209
+ ephemeral: r
1210
+ }, n);
1211
+ }
1212
+ break;
1213
+ }
1214
+ }
1215
+ async writeEvent(t, n) {
1216
+ if (!t.type.startsWith("data-")) throw new e.ErrorInfo(`unable to write event; only data-* chunk types are supported, got '${t.type}'`, W.InvalidArgument, 400);
1217
+ let r = w().str("id", "id" in t ? t.id : void 0).bool("transient", "transient" in t ? t.transient : void 0).build(), i = "transient" in t && t.transient === !0;
1218
+ return this._core.publishDiscrete({
1219
+ name: t.type,
1220
+ data: "data" in t ? t.data : void 0,
1221
+ headers: r,
1222
+ ephemeral: i
1223
+ }, n);
1224
+ }
1225
+ async writeMessages(e, t) {
1226
+ let n = e.flatMap((e) => Ae(e));
1227
+ return this._core.publishDiscreteBatch(n, t);
1228
+ }
1229
+ async abort(e) {
1230
+ this._aborted || (this._aborted = !0, await this._core.abortAllStreams(), await this._core.publishDiscrete({
1231
+ name: "abort",
1232
+ data: e ?? "",
1233
+ headers: { [r]: "aborted" }
1234
+ }));
1235
+ }
1236
+ async close() {
1237
+ await this._core.close();
1238
+ }
1239
+ }, Ae = (e) => {
1240
+ let n = e.id, r = [];
1241
+ for (let i of e.parts) switch (i.type) {
1242
+ case "text":
1243
+ r.push({
1244
+ name: "text",
1245
+ data: i.text,
1246
+ headers: w().str("messageId", n).build()
1247
+ });
1248
+ break;
1249
+ case "file":
1250
+ r.push({
1251
+ name: "file",
1252
+ data: i.url,
1253
+ headers: w().str("messageId", n).str("mediaType", i.mediaType).build()
1254
+ });
1255
+ break;
1256
+ default:
1257
+ t(i) && r.push({
1258
+ name: i.type,
1259
+ data: i.data,
1260
+ headers: w().str("messageId", n).str("id", i.id).build()
1261
+ });
1262
+ break;
1263
+ }
1264
+ return r.length === 0 && r.push({
1265
+ name: "text",
1266
+ data: "",
1267
+ headers: w().str("messageId", n).build()
1268
+ }), r;
1269
+ }, G = {
1270
+ createEncoder: (e, t = {}) => new ke(e, t),
1271
+ createDecoder: Te,
1272
+ createAccumulator: re,
1273
+ getMessageKey: (e) => e.id,
1274
+ isTerminal: (e) => e.type === "finish" || e.type === "error" || e.type === "abort"
1275
+ }, je = (t, n) => ({
1276
+ sendMessages: async (r) => {
1277
+ let { messages: i, abortSignal: a, trigger: o, messageId: s } = r, c, l;
1278
+ if (o === "regenerate-message") c = [], l = i;
1279
+ else {
1280
+ if (i.length === 0) throw new e.ErrorInfo("unable to send messages; messages array is empty for submit-message trigger", W.InvalidArgument, 400);
1281
+ c = [i.at(-1)], l = i.slice(0, -1);
1282
+ }
1283
+ let u, d;
1284
+ if (o === "regenerate-message" && s) {
1285
+ u = s;
1286
+ let e = t.getTree().getNodeByKey(s);
1287
+ e && (u = e.msgId, d = e.parentId);
1288
+ }
1289
+ let f, p;
1290
+ if (n?.prepareSendMessagesRequest) {
1291
+ let e = n.prepareSendMessagesRequest({
1292
+ id: r.chatId,
1293
+ trigger: o,
1294
+ messageId: s,
1295
+ history: l,
1296
+ messages: c,
1297
+ forkOf: u,
1298
+ parent: d
1299
+ });
1300
+ f = e.body ?? {}, p = e.headers;
1301
+ } else f = {
1302
+ history: l.map((e) => ({
1303
+ message: e,
1304
+ headers: t.getMessageHeaders(e)
1305
+ })),
1306
+ id: r.chatId,
1307
+ trigger: o,
1308
+ ...s !== void 0 && { messageId: s },
1309
+ ...u !== void 0 && { forkOf: u },
1310
+ ...d !== void 0 && { parent: d }
1311
+ }, p = void 0;
1312
+ let m = {
1313
+ body: f,
1314
+ headers: p
1315
+ };
1316
+ u !== void 0 && (m.forkOf = u), d !== void 0 && (m.parent = d);
1317
+ let h = await t.send(c, m);
1318
+ a && a.addEventListener("abort", () => void t.cancel({ all: !0 }), { once: !0 });
1319
+ let { readable: g, writable: _ } = new TransformStream(), v = _.getWriter();
1320
+ return h.stream.pipeTo(new WritableStream({
1321
+ close: () => {
1322
+ v.close().catch(() => {});
1323
+ },
1324
+ abort: () => {
1325
+ v.close().catch(() => {});
1326
+ }
1327
+ })).catch(() => {
1328
+ v.close().catch(() => {});
1329
+ }), g;
1330
+ },
1331
+ reconnectToStream: () => Promise.resolve(null),
1332
+ close: async (e) => t.close(e)
1333
+ }), Me = (e) => ({
1334
+ logAction: (t, n, r) => {
1335
+ e.error(n, { detail: r });
1336
+ },
1337
+ shouldLog: () => !0
1338
+ }), Ne = e.Realtime.EventEmitter, Pe = class extends Ne {
1339
+ constructor(e) {
1340
+ super(Me(e));
1341
+ }
1342
+ }, K = /* @__PURE__ */ function(e) {
1343
+ return e.Trace = "trace", e.Debug = "debug", e.Info = "info", e.Warn = "warn", e.Error = "error", e.Silent = "silent", e;
1344
+ }({}), Fe = (e, t, n) => {
1345
+ let r = n ? `, context: ${JSON.stringify(n)}` : "", i = `[${(/* @__PURE__ */ new Date()).toISOString()}] ${t.valueOf().toUpperCase()} ably-ai-transport: ${e}${r}`;
1346
+ switch (t) {
1347
+ case K.Trace:
1348
+ case K.Debug:
1349
+ console.log(i);
1350
+ break;
1351
+ case K.Info:
1352
+ console.info(i);
1353
+ break;
1354
+ case K.Warn:
1355
+ console.warn(i);
1356
+ break;
1357
+ case K.Error:
1358
+ console.error(i);
1359
+ break;
1360
+ case K.Silent: break;
1361
+ }
1362
+ }, Ie = (e) => new Le(e.logHandler ?? Fe, e.logLevel), q = /* @__PURE__ */ function(e) {
1363
+ return e[e.Trace = 0] = "Trace", e[e.Debug = 1] = "Debug", e[e.Info = 2] = "Info", e[e.Warn = 3] = "Warn", e[e.Error = 4] = "Error", e[e.Silent = 5] = "Silent", e;
1364
+ }(q || {}), J = new Map([
1365
+ [K.Trace, q.Trace],
1366
+ [K.Debug, q.Debug],
1367
+ [K.Info, q.Info],
1368
+ [K.Warn, q.Warn],
1369
+ [K.Error, q.Error],
1370
+ [K.Silent, q.Silent]
1371
+ ]), Le = class t {
1372
+ constructor(t, n, r) {
1373
+ this._handler = t, this._context = r;
1374
+ let i = J.get(n);
1375
+ if (i === void 0) throw new e.ErrorInfo(`unable to create logger; invalid log level: ${n}`, W.InvalidArgument, 400);
1376
+ this._levelNumber = i;
1377
+ }
1378
+ trace(e, t) {
1379
+ this._write(e, K.Trace, q.Trace, t);
1380
+ }
1381
+ debug(e, t) {
1382
+ this._write(e, K.Debug, q.Debug, t);
1383
+ }
1384
+ info(e, t) {
1385
+ this._write(e, K.Info, q.Info, t);
1386
+ }
1387
+ warn(e, t) {
1388
+ this._write(e, K.Warn, q.Warn, t);
1389
+ }
1390
+ error(e, t) {
1391
+ this._write(e, K.Error, q.Error, t);
1392
+ }
1393
+ withContext(e) {
1394
+ let n = [...J.entries()].find(([, e]) => e === this._levelNumber)?.[0] ?? K.Error;
1395
+ return new t(this._handler, n, this._mergeContext(e));
1396
+ }
1397
+ _write(e, t, n, r) {
1398
+ n >= this._levelNumber && this._handler(e, t, this._mergeContext(r));
1399
+ }
1400
+ _mergeContext(e) {
1401
+ return this._context ? e ? {
1402
+ ...this._context,
1403
+ ...e
1404
+ } : this._context : e ?? void 0;
1405
+ }
1406
+ }, Re = class {
1407
+ constructor(e, t) {
1408
+ this._nodeIndex = /* @__PURE__ */ new Map(), this._codecKeyIndex = /* @__PURE__ */ new Map(), this._sortedList = [], this._parentIndex = /* @__PURE__ */ new Map(), this._selections = /* @__PURE__ */ new Map(), this._seqCounter = 0, this._getKey = e, this._logger = t;
1409
+ }
1410
+ _compareNodes(e, t) {
1411
+ let n = e.node.serial, r = t.node.serial;
1412
+ return n === void 0 && r === void 0 ? e.insertSeq - t.insertSeq : n === void 0 ? 1 : r === void 0 || n < r ? -1 : n > r ? 1 : e.insertSeq - t.insertSeq;
1413
+ }
1414
+ _insertSorted(e) {
1415
+ if (e.node.serial === void 0) {
1416
+ this._sortedList.push(e);
1417
+ return;
1418
+ }
1419
+ let t = 0, n = this._sortedList.length;
1420
+ for (; t < n;) {
1421
+ let r = t + n >>> 1, i = this._sortedList[r];
1422
+ if (!i) break;
1423
+ this._compareNodes(i, e) <= 0 ? t = r + 1 : n = r;
1424
+ }
1425
+ this._sortedList.splice(t, 0, e);
1426
+ }
1427
+ _removeSorted(e) {
1428
+ let t = this._sortedList.indexOf(e);
1429
+ t !== -1 && this._sortedList.splice(t, 1);
1430
+ }
1431
+ _addToParentIndex(e, t) {
1432
+ let n = this._parentIndex.get(e);
1433
+ n || (n = /* @__PURE__ */ new Set(), this._parentIndex.set(e, n)), n.add(t);
1434
+ }
1435
+ _removeFromParentIndex(e, t) {
1436
+ let n = this._parentIndex.get(e);
1437
+ n && (n.delete(t), n.size === 0 && this._parentIndex.delete(e));
1438
+ }
1439
+ _getSiblingGroup(e) {
1440
+ let t = this._nodeIndex.get(e);
1441
+ if (!t) return [];
1442
+ let n = t.node, r = new Set([n.msgId]);
1443
+ for (; n.forkOf && !r.has(n.forkOf);) {
1444
+ let e = this._nodeIndex.get(n.forkOf);
1445
+ if (!e || e.node.parentId !== n.parentId) break;
1446
+ n = e.node, r.add(n.msgId);
1447
+ }
1448
+ let i = n.parentId, a = n.msgId, o = [], s = this._parentIndex.get(i);
1449
+ if (s) for (let e of s) {
1450
+ let t = this._nodeIndex.get(e);
1451
+ t && this._isSiblingOf(t.node, a) && o.push(t);
1452
+ }
1453
+ return o.sort((e, t) => this._compareNodes(e, t)), o.map((e) => e.node);
1454
+ }
1455
+ _isSiblingOf(e, t) {
1456
+ if (e.msgId === t) return !0;
1457
+ let n = e, r = new Set([n.msgId]);
1458
+ for (; n.forkOf;) {
1459
+ if (n.forkOf === t) return !0;
1460
+ if (r.has(n.forkOf)) break;
1461
+ let e = this._nodeIndex.get(n.forkOf);
1462
+ if (!e) break;
1463
+ n = e.node, r.add(n.msgId);
1464
+ }
1465
+ return !1;
1466
+ }
1467
+ _getGroupRoot(e) {
1468
+ let t = this._nodeIndex.get(e);
1469
+ if (!t) return e;
1470
+ let n = t.node, r = new Set([n.msgId]);
1471
+ for (; n.forkOf && !r.has(n.forkOf);) {
1472
+ let e = this._nodeIndex.get(n.forkOf);
1473
+ if (!e || e.node.parentId !== n.parentId) break;
1474
+ n = e.node, r.add(n.msgId);
1475
+ }
1476
+ return n.msgId;
1477
+ }
1478
+ flatten() {
1479
+ let e = [], t = /* @__PURE__ */ new Set(), n = /* @__PURE__ */ new Map();
1480
+ for (let r of this._sortedList) {
1481
+ let i = r.node, { msgId: a, parentId: o } = i;
1482
+ if (o !== void 0 && !t.has(o)) continue;
1483
+ let s = this._getSiblingGroup(a);
1484
+ if (s.length > 1) {
1485
+ let e = this._getGroupRoot(a), t = n.get(e);
1486
+ if (t === void 0) {
1487
+ let r = this._selections.get(e) ?? s.length - 1, i = s[Math.max(0, Math.min(r, s.length - 1))];
1488
+ if (!i) break;
1489
+ t = i.msgId, n.set(e, t);
1490
+ }
1491
+ if (a !== t) continue;
1492
+ }
1493
+ t.add(a), e.push(i.message);
1494
+ }
1495
+ return e;
1496
+ }
1497
+ getSiblings(e) {
1498
+ return this._getSiblingGroup(e).map((e) => e.message);
1499
+ }
1500
+ hasSiblings(e) {
1501
+ return this._getSiblingGroup(e).length > 1;
1502
+ }
1503
+ getSelectedIndex(e) {
1504
+ let t = this._getSiblingGroup(e);
1505
+ if (t.length <= 1) return 0;
1506
+ let n = this._getGroupRoot(e), r = this._selections.get(n);
1507
+ return r === void 0 ? t.length - 1 : Math.max(0, Math.min(r, t.length - 1));
1508
+ }
1509
+ select(e, t) {
1510
+ this._logger.debug("ConversationTree.select();", {
1511
+ msgId: e,
1512
+ index: t
1513
+ });
1514
+ let n = this._getSiblingGroup(e);
1515
+ if (n.length <= 1) return;
1516
+ let r = this._getGroupRoot(e);
1517
+ this._selections.set(r, Math.max(0, Math.min(t, n.length - 1)));
1518
+ }
1519
+ getNode(e) {
1520
+ return this._nodeIndex.get(e)?.node;
1521
+ }
1522
+ getNodeByKey(e) {
1523
+ let t = this._codecKeyIndex.get(e);
1524
+ if (t) return this._nodeIndex.get(t)?.node;
1525
+ }
1526
+ getHeaders(e) {
1527
+ return this._nodeIndex.get(e)?.node.headers;
1528
+ }
1529
+ upsert(e, t, n, r) {
1530
+ let i = n["x-ably-parent"] ?? void 0, a = n["x-ably-fork-of"] ?? void 0;
1531
+ this._codecKeyIndex.set(this._getKey(t), e);
1532
+ let o = this._nodeIndex.get(e);
1533
+ if (o) {
1534
+ o.node.message = t, Object.keys(n).length > 0 && (o.node.headers = { ...n }), r && !o.node.serial && (this._logger.debug("ConversationTree.upsert(); promoting serial", {
1535
+ msgId: e,
1536
+ serial: r
1537
+ }), o.node.serial = r, this._removeSorted(o), this._insertSorted(o));
1538
+ return;
1539
+ }
1540
+ this._logger.trace("ConversationTree.upsert(); inserting new node", {
1541
+ msgId: e,
1542
+ parentId: i,
1543
+ forkOf: a
1544
+ });
1545
+ let s = {
1546
+ node: {
1547
+ message: t,
1548
+ msgId: e,
1549
+ parentId: i,
1550
+ forkOf: a,
1551
+ headers: { ...n },
1552
+ serial: r
1553
+ },
1554
+ insertSeq: this._seqCounter++
1555
+ };
1556
+ this._nodeIndex.set(e, s), this._addToParentIndex(i, e), this._insertSorted(s);
1557
+ }
1558
+ delete(e) {
1559
+ let t = this._nodeIndex.get(e);
1560
+ if (!t) return;
1561
+ this._logger.debug("ConversationTree.delete();", { msgId: e });
1562
+ let { node: n } = t, r = this._getKey(n.message);
1563
+ this._codecKeyIndex.get(r) === e && this._codecKeyIndex.delete(r), this._removeFromParentIndex(n.parentId, e), this._removeSorted(t), this._nodeIndex.delete(e), this._selections.delete(e);
1564
+ }
1565
+ }, ze = (e, t) => new Re(e, t), Y = (e) => {
1566
+ let t = [...e.rawMessages].toReversed(), n = e.codec.createDecoder(), r = /* @__PURE__ */ new Map(), i = e.codec.createAccumulator(), s = 0, c = /* @__PURE__ */ new Map(), l = /* @__PURE__ */ new Map();
1567
+ for (let u of t) {
1568
+ let t = n.decode(u), d = b(u), f = d[a], p = d[o], m = u.serial;
1569
+ if (f) {
1570
+ let n = r.get(f);
1571
+ if (n || (n = {
1572
+ accumulator: e.codec.createAccumulator(),
1573
+ firstSeen: s++,
1574
+ msgHeaders: /* @__PURE__ */ new Map(),
1575
+ msgSerials: /* @__PURE__ */ new Map()
1576
+ }, r.set(f, n)), p) {
1577
+ let e = n.msgHeaders.get(p);
1578
+ e ? Object.keys(d).length > 0 && Object.assign(e, d) : (n.msgHeaders.set(p, { ...d }), m && n.msgSerials.set(p, m));
1579
+ }
1580
+ n.accumulator.processOutputs(t);
1581
+ } else i.processOutputs(t);
1582
+ for (let n of t) if (n.kind === "message") {
1583
+ let t = e.getMessageKey(n.message), r = c.get(t);
1584
+ r ? Object.keys(d).length > 0 && Object.assign(r, d) : (c.set(t, { ...d }), m && l.set(t, m));
1585
+ }
1586
+ }
1587
+ let u = [];
1588
+ for (let t of i.completedMessages) {
1589
+ let n = e.getMessageKey(t);
1590
+ u.push({
1591
+ message: t,
1592
+ headers: c.get(n) ?? {},
1593
+ serial: l.get(n) ?? ""
1594
+ });
1595
+ }
1596
+ let d = [...r.values()].toSorted((e, t) => e.firstSeen - t.firstSeen);
1597
+ for (let t of d) {
1598
+ let n = /* @__PURE__ */ new Set(), r = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Map();
1599
+ for (let a of t.accumulator.completedMessages) {
1600
+ let t = e.getMessageKey(a), s = c.get(t);
1601
+ if (s) {
1602
+ r.set(t, s);
1603
+ let e = l.get(t);
1604
+ e && i.set(t, e);
1605
+ let a = s[o];
1606
+ a && n.add(a);
1607
+ }
1608
+ }
1609
+ let a = [...t.msgHeaders.entries()].filter(([e]) => !n.has(e)), s = 0;
1610
+ for (let n of t.accumulator.completedMessages) {
1611
+ let o = e.getMessageKey(n), c = a[s];
1612
+ if (!r.has(o) && c) {
1613
+ let [e, n] = c;
1614
+ r.set(o, n);
1615
+ let a = t.msgSerials.get(e);
1616
+ a && i.set(o, a), s++;
1617
+ }
1618
+ }
1619
+ for (let n of t.accumulator.completedMessages) {
1620
+ let t = e.getMessageKey(n);
1621
+ u.push({
1622
+ message: n,
1623
+ headers: r.get(t) ?? {},
1624
+ serial: i.get(t) ?? ""
1625
+ });
1626
+ }
1627
+ }
1628
+ return u.toReversed();
1629
+ }, X = async (e, t, n) => {
1630
+ e.rawMessages.push(...t.items), e.lastAblyPage = t;
1631
+ let r = Y(e).length;
1632
+ for (; r < e.returnedCount + n && t.hasNext();) {
1633
+ e.logger.debug("decodeHistory.fetchUntilLimit(); fetching next page", {
1634
+ collected: e.rawMessages.length,
1635
+ decoded: r
1636
+ });
1637
+ let n = await t.next();
1638
+ if (!n) break;
1639
+ t = n, e.rawMessages.push(...n.items), e.lastAblyPage = n, r = Y(e).length;
1640
+ }
1641
+ }, Z = (e, t) => {
1642
+ let n = Y(e), r = n.slice(e.returnedCount, e.returnedCount + t), i = [...r].toReversed();
1643
+ e.returnedCount += r.length;
1644
+ let a = n.length > e.returnedCount, o = e.lastAblyPage?.hasNext() ?? !1, s = e.rawMessages.length - e.returnedRawCount > 0 ? e.rawMessages.slice(e.returnedRawCount).toReversed() : [];
1645
+ return e.returnedRawCount = e.rawMessages.length, {
1646
+ items: i.map((e) => e.message),
1647
+ itemHeaders: i.map((e) => e.headers),
1648
+ itemSerials: i.map((e) => e.serial),
1649
+ rawMessages: s,
1650
+ hasNext: () => a || o,
1651
+ next: async () => {
1652
+ if (a) return Z(e, t);
1653
+ if (!o || !e.lastAblyPage) return;
1654
+ let n = await e.lastAblyPage.next();
1655
+ if (n) return await X(e, n, t), Z(e, t);
1656
+ }
1657
+ };
1658
+ }, Be = async (e, t, n, r) => {
1659
+ let i = n?.limit ?? 100, a = {
1660
+ codec: t,
1661
+ rawMessages: [],
1662
+ returnedCount: 0,
1663
+ returnedRawCount: 0,
1664
+ lastAblyPage: void 0,
1665
+ getMessageKey: t.getMessageKey.bind(t),
1666
+ logger: r
1667
+ };
1668
+ r.trace("decodeHistory();", { limit: i });
1669
+ let o = i * 10;
1670
+ return await e.attach(), await X(a, await e.history({
1671
+ untilAttach: !0,
1672
+ limit: o
1673
+ }), i), Z(a, i);
1674
+ }, Q = (e) => {
1675
+ let t = {
1676
+ [c]: e.role,
1677
+ [a]: e.turnId,
1678
+ [o]: e.msgId
1679
+ };
1680
+ return e.turnClientId !== void 0 && (t[s] = e.turnClientId), e.parent && (t[p] = e.parent), e.forkOf && (t[m] = e.forkOf), t;
1681
+ }, Ve = class {
1682
+ constructor(e, t) {
1683
+ this._turns = /* @__PURE__ */ new Map(), this._isTerminal = e, this._logger = t;
1684
+ }
1685
+ createStream(t) {
1686
+ this._logger.trace("StreamRouter.createStream();", { turnId: t });
1687
+ let n = {}, r = new ReadableStream({ start(e) {
1688
+ n.controller = e;
1689
+ } });
1690
+ if (!n.controller) throw new e.ErrorInfo("unable to create stream; ReadableStream start() was not called synchronously", W.TransportSubscriptionError, 500);
1691
+ return this._turns.set(t, {
1692
+ controller: n.controller,
1693
+ turnId: t
1694
+ }), r;
1695
+ }
1696
+ closeStream(e) {
1697
+ let t = this._turns.get(e);
1698
+ if (!t) return !1;
1699
+ this._logger.debug("StreamRouter.closeStream(); closing stream", { turnId: e });
1700
+ try {
1701
+ t.controller.close();
1702
+ } catch {}
1703
+ return this._turns.delete(e), !0;
1704
+ }
1705
+ route(e, t) {
1706
+ let n = this._turns.get(e);
1707
+ if (!n) return !1;
1708
+ try {
1709
+ n.controller.enqueue(t);
1710
+ } catch {
1711
+ return this._turns.delete(e), !1;
1712
+ }
1713
+ return this._isTerminal(t) && this.closeStream(e), !0;
1714
+ }
1715
+ has(e) {
1716
+ return this._turns.has(e);
1717
+ }
1718
+ }, He = (e, t) => new Ve(e, t), Ue = () => {}, We = class {
1719
+ constructor(e) {
1720
+ if (this._ownMsgIds = /* @__PURE__ */ new Set(), this._ownTurnIds = /* @__PURE__ */ new Set(), this._turnClientIds = /* @__PURE__ */ new Map(), this._turnMsgIds = /* @__PURE__ */ new Map(), this._turnObservers = /* @__PURE__ */ new Map(), this._ablyMessages = [], this._withheldKeys = /* @__PURE__ */ new Set(), this._closed = !1, this._channel = e.channel, this._codec = e.codec, this._clientId = e.clientId, this._api = e.api ?? "/api/chat", this._credentials = e.credentials, this._headersFn = typeof e.headers == "function" ? e.headers : e.headers ? () => e.headers : void 0, this._bodyFn = typeof e.body == "function" ? e.body : e.body ? () => e.body : void 0, this._fetchFn = e.fetch ?? globalThis.fetch.bind(globalThis), this._logger = (e.logger ?? Ie({ logLevel: K.Silent })).withContext({ component: "ClientTransport" }), this._emitter = new Pe(this._logger), this._tree = ze(this._codec.getMessageKey.bind(this._codec), this._logger), this._router = He(this._codec.isTerminal.bind(this._codec), this._logger), this._decoder = this._codec.createDecoder(), e.messages) {
1721
+ let t;
1722
+ for (let n of e.messages) {
1723
+ let e = this._codec.getMessageKey(n), r = {};
1724
+ t && (r[p] = t), this._tree.upsert(e, n, r), t = e;
1725
+ }
1726
+ this._emitter.emit("message");
1727
+ }
1728
+ this._onMessage = (e) => {
1729
+ this._handleMessage(e);
1730
+ }, this._attachPromise = this._channel.subscribe(this._onMessage);
1731
+ }
1732
+ _handleMessage(t) {
1733
+ if (!this._closed) {
1734
+ this._ablyMessages.push(t), this._emitter.emit("ably-message");
1735
+ try {
1736
+ if (t.name === "x-ably-turn-start") {
1737
+ let e = b(t), n = e[a], r = e["x-ably-turn-client-id"] ?? "";
1738
+ n && (this._turnClientIds.set(n, r), this._emitter.emit("turn", {
1739
+ type: _,
1740
+ turnId: n,
1741
+ clientId: r
1742
+ }));
1743
+ return;
1744
+ }
1745
+ if (t.name === "x-ably-turn-end") {
1746
+ let e = b(t), n = e[a], r = e["x-ably-turn-client-id"] ?? "", i = e["x-ably-turn-reason"] ?? "complete";
1747
+ if (n) {
1748
+ this._router.closeStream(n), this._turnObservers.delete(n), this._turnClientIds.delete(n);
1749
+ let e = this._turnMsgIds.get(n);
1750
+ if (e) {
1751
+ for (let t of e) this._ownMsgIds.delete(t);
1752
+ this._turnMsgIds.delete(n);
1753
+ }
1754
+ this._ownTurnIds.delete(n), this._emitter.emit("turn", {
1755
+ type: v,
1756
+ turnId: n,
1757
+ clientId: r,
1758
+ reason: i
1759
+ });
1760
+ }
1761
+ return;
1762
+ }
1763
+ let e = this._decoder.decode(t), n = b(t), r = t.serial, i = n[a];
1764
+ i && this._updateTurnObserverHeaders(i, n, r);
1765
+ for (let i of e) i.kind === "message" ? this._handleMessageOutput(i.message, n, r, t.action) : this._handleEventOutput(i, n);
1766
+ } catch (t) {
1767
+ let n = t instanceof e.ErrorInfo ? t : void 0;
1768
+ this._emitter.emit("error", new e.ErrorInfo(`unable to process channel message; ${t instanceof Error ? t.message : String(t)}`, W.TransportSubscriptionError, 500, n));
1769
+ }
1770
+ }
1771
+ }
1772
+ _handleMessageOutput(e, t, n, r) {
1773
+ let i = t[o];
1774
+ if (i && this._ownMsgIds.has(i)) {
1775
+ this._upsertAndNotify(e, t, n);
1776
+ return;
1777
+ }
1778
+ r === "message.create" && this._upsertAndNotify(e, t, n);
1779
+ }
1780
+ _handleEventOutput(e, t) {
1781
+ if (e.kind !== "event") return;
1782
+ let n = e.event, r = t[a];
1783
+ if (r) {
1784
+ if (this._router.route(r, n)) {
1785
+ this._accumulateAndEmit(r, e), this._codec.isTerminal(n) && this._turnObservers.delete(r);
1786
+ return;
1787
+ }
1788
+ this._ownTurnIds.has(r) && !this._turnObservers.has(r) || (this._accumulateAndEmit(r, e), this._codec.isTerminal(n) && this._turnObservers.delete(r));
1789
+ }
1790
+ }
1791
+ _upsertAndNotify(e, t, n) {
1792
+ let r = this._codec.getMessageKey(e), i = t["x-ably-msg-id"] ?? r;
1793
+ this._tree.upsert(i, e, t, n), this._emitter.emit("message");
1794
+ }
1795
+ _updateTurnObserverHeaders(e, t, n) {
1796
+ let r = this._turnObservers.get(e);
1797
+ r ? (Object.keys(t).length > 0 && Object.assign(r.headers, t), n !== void 0 && (r.serial = n)) : this._turnObservers.set(e, {
1798
+ headers: { ...t },
1799
+ serial: n,
1800
+ accumulator: this._codec.createAccumulator()
1801
+ });
1802
+ }
1803
+ _accumulateAndEmit(e, t) {
1804
+ let n = this._turnObservers.get(e);
1805
+ if (!n) return;
1806
+ n.accumulator.processOutputs([t]);
1807
+ let r = n.accumulator.messages;
1808
+ if (r.length === 0) return;
1809
+ let i;
1810
+ try {
1811
+ i = structuredClone(r.at(-1));
1812
+ } catch {
1813
+ i = r.at(-1);
1814
+ }
1815
+ i && (this._tree.upsert(n.headers["x-ably-msg-id"] ?? this._codec.getMessageKey(i), i, { ...n.headers }, n.serial), this._emitter.emit("message"));
1816
+ }
1817
+ async _publishCancel(e) {
1818
+ this._logger.trace("ClientTransport._publishCancel();", { filter: e });
1819
+ let t = {};
1820
+ e.turnId ? t[l] = e.turnId : e.own ? t[u] = "true" : e.clientId ? t[f] = e.clientId : e.all && (t[d] = "true"), await this._channel.publish({
1821
+ name: g,
1822
+ extras: { headers: t }
1823
+ });
1824
+ }
1825
+ _closeMatchingTurnStreams(e) {
1826
+ if (e.all) for (let e of this._ownTurnIds) this._router.closeStream(e);
1827
+ else if (e.own) for (let e of this._ownTurnIds) this._router.closeStream(e);
1828
+ else if (e.clientId) for (let [t, n] of this._turnClientIds) n === e.clientId && this._router.closeStream(t);
1829
+ else e.turnId && this._router.closeStream(e.turnId);
1830
+ }
1831
+ _getMatchingTurnIds(e) {
1832
+ let t = /* @__PURE__ */ new Set();
1833
+ if (e.all) for (let e of this._turnClientIds.keys()) t.add(e);
1834
+ else if (e.own) for (let [e, n] of this._turnClientIds) n === this._clientId && t.add(e);
1835
+ else if (e.clientId) for (let [n, r] of this._turnClientIds) r === e.clientId && t.add(n);
1836
+ else e.turnId && this._turnClientIds.has(e.turnId) && t.add(e.turnId);
1837
+ return t;
1838
+ }
1839
+ _getMessagesWithHeaders() {
1840
+ return this._tree.flatten().map((e) => ({
1841
+ message: e,
1842
+ headers: this.getMessageHeaders(e)
1843
+ }));
1844
+ }
1845
+ _getHistoryBefore(e) {
1846
+ let t = this._getMessagesWithHeaders(), n = t.findIndex((t) => t.headers?.[o] === e);
1847
+ return n === -1 ? t : t.slice(0, n);
1848
+ }
1849
+ _processHistoryPage(e) {
1850
+ for (let [t, n] of e.items.entries()) {
1851
+ let r = e.itemHeaders?.[t] ?? {}, i = e.itemSerials?.[t], a = this._codec.getMessageKey(n), o = r["x-ably-msg-id"] ?? a;
1852
+ this._tree.upsert(o, n, r, i);
1853
+ }
1854
+ this._emitter.emit("message"), e.rawMessages && e.rawMessages.length > 0 && (this._ablyMessages.unshift(...e.rawMessages), this._emitter.emit("ably-message"));
1855
+ }
1856
+ async _loadUntilVisible(e, t, n) {
1857
+ this._processHistoryPage(e);
1858
+ let r = e, i = () => {
1859
+ let e = 0;
1860
+ for (let t of this._tree.flatten()) n.has(this._codec.getMessageKey(t)) || e++;
1861
+ return e;
1862
+ };
1863
+ for (; i() < t && r.hasNext();) {
1864
+ let e = await r.next();
1865
+ if (!e) break;
1866
+ this._processHistoryPage(e), r = e;
1867
+ }
1868
+ return {
1869
+ newVisible: this._tree.flatten().filter((e) => !n.has(this._codec.getMessageKey(e))),
1870
+ lastPage: r
1871
+ };
1872
+ }
1873
+ _releaseWithheld(e) {
1874
+ for (let t of e) this._withheldKeys.delete(this._codec.getMessageKey(t));
1875
+ e.length > 0 && this._emitter.emit("message");
1876
+ }
1877
+ async send(t, n) {
1878
+ if (this._closed || (await this._attachPromise, this._closed)) throw new e.ErrorInfo("unable to send; transport is closed", W.TransportClosed, 400);
1879
+ this._logger.trace("ClientTransport.send();");
1880
+ let r = Array.isArray(t) ? t : [t], i = crypto.randomUUID();
1881
+ this._ownTurnIds.add(i);
1882
+ let a = /* @__PURE__ */ new Set(), s = [], l = this._getMessagesWithHeaders(), u;
1883
+ if (n?.parent === void 0 && !n?.forkOf) {
1884
+ let e = this._tree.flatten();
1885
+ if (e.length > 0) {
1886
+ let t = e.at(-1);
1887
+ if (t) {
1888
+ let e = this._codec.getMessageKey(t);
1889
+ u = this._tree.getNodeByKey(e)?.msgId ?? e;
1890
+ }
1891
+ }
1892
+ }
1893
+ let d = n?.parent === void 0 ? u : n.parent;
1894
+ for (let e of r) {
1895
+ let t = crypto.randomUUID();
1896
+ this._ownMsgIds.add(t), a.add(t);
1897
+ let r = n?.parent === void 0 ? u : n.parent ?? void 0, l = Q({
1898
+ role: "user",
1899
+ turnId: i,
1900
+ msgId: t,
1901
+ turnClientId: this._clientId,
1902
+ parent: r,
1903
+ forkOf: n?.forkOf
1904
+ });
1905
+ this._upsertAndNotify(e, l);
1906
+ let d = {
1907
+ [o]: t,
1908
+ [c]: "user"
1909
+ };
1910
+ r && (d[p] = r), s.push({
1911
+ message: e,
1912
+ headers: d
1913
+ }), n?.parent === void 0 && !n?.forkOf && (u = t);
1914
+ }
1915
+ this._turnMsgIds.set(i, a);
1916
+ let f = this._router.createStream(i), m = this._headersFn?.() ?? {}, h = {
1917
+ ...this._bodyFn?.() ?? {},
1918
+ history: l,
1919
+ ...n?.body,
1920
+ turnId: i,
1921
+ clientId: this._clientId,
1922
+ messages: s,
1923
+ ...n?.forkOf !== void 0 && { forkOf: n.forkOf },
1924
+ ...d !== void 0 && { parent: d }
1925
+ }, g = {
1926
+ ...m,
1927
+ ...n?.headers
1928
+ };
1929
+ return this._fetchFn(this._api, {
1930
+ method: "POST",
1931
+ headers: {
1932
+ "Content-Type": "application/json",
1933
+ ...g
1934
+ },
1935
+ body: JSON.stringify(h),
1936
+ ...this._credentials ? { credentials: this._credentials } : {}
1937
+ }).then((t) => {
1938
+ t.ok || (this._emitter.emit("error", new e.ErrorInfo(`unable to send; HTTP POST to ${this._api} returned ${String(t.status)} ${t.statusText}`, W.TransportSendFailed, t.status)), this._router.closeStream(i));
1939
+ }).catch((t) => {
1940
+ let n = t instanceof e.ErrorInfo ? t : void 0;
1941
+ this._emitter.emit("error", new e.ErrorInfo(`unable to send; HTTP POST to ${this._api} failed: ${t instanceof Error ? t.message : String(t)}`, W.TransportSendFailed, 500, n)), this._router.closeStream(i);
1942
+ }), {
1943
+ stream: f,
1944
+ turnId: i,
1945
+ cancel: async () => this.cancel({ turnId: i })
1946
+ };
1947
+ }
1948
+ async regenerate(e, t) {
1949
+ this._logger.trace("ClientTransport.regenerate();", { messageId: e });
1950
+ let n = this._tree.getNode(e)?.parentId;
1951
+ return this.send([], {
1952
+ ...t,
1953
+ body: {
1954
+ history: this._getHistoryBefore(e),
1955
+ ...t?.body
1956
+ },
1957
+ forkOf: e,
1958
+ parent: n
1959
+ });
1960
+ }
1961
+ async edit(e, t, n) {
1962
+ this._logger.trace("ClientTransport.edit();", { messageId: e });
1963
+ let r = this._tree.getNode(e)?.parentId;
1964
+ return this.send(t, {
1965
+ ...n,
1966
+ body: {
1967
+ history: this._getHistoryBefore(e),
1968
+ ...n?.body
1969
+ },
1970
+ forkOf: e,
1971
+ parent: r
1972
+ });
1973
+ }
1974
+ async cancel(e) {
1975
+ if (this._closed) return;
1976
+ let t = e ?? { own: !0 };
1977
+ this._logger.debug("ClientTransport.cancel();", { filter: t }), await this._publishCancel(t), this._closeMatchingTurnStreams(t);
1978
+ }
1979
+ async waitForTurn(e) {
1980
+ if (this._closed) return;
1981
+ let t = e ?? { own: !0 }, n = this._getMatchingTurnIds(t);
1982
+ if (n.size !== 0) return this._logger.debug("ClientTransport.waitForTurn();", { turnIds: [...n] }), new Promise((e) => {
1983
+ let t = (r) => {
1984
+ r.type === "x-ably-turn-end" && (n.delete(r.turnId), n.size === 0 && (this._emitter.off("turn", t), e()));
1985
+ };
1986
+ this._emitter.on("turn", t);
1987
+ });
1988
+ }
1989
+ on(e, t) {
1990
+ if (this._closed) return Ue;
1991
+ let n = t;
1992
+ return this._emitter.on(e, n), () => {
1993
+ this._emitter.off(e, n);
1994
+ };
1995
+ }
1996
+ getTree() {
1997
+ return this._tree;
1998
+ }
1999
+ getActiveTurnIds() {
2000
+ let e = /* @__PURE__ */ new Map();
2001
+ for (let [t, n] of this._turnClientIds) {
2002
+ let r = e.get(n);
2003
+ r || (r = /* @__PURE__ */ new Set(), e.set(n, r)), r.add(t);
2004
+ }
2005
+ return e;
2006
+ }
2007
+ getMessageHeaders(e) {
2008
+ let t = this._codec.getMessageKey(e);
2009
+ return this._tree.getNodeByKey(t)?.headers;
2010
+ }
2011
+ getMessages() {
2012
+ return this._withheldKeys.size === 0 ? this._tree.flatten() : this._tree.flatten().filter((e) => !this._withheldKeys.has(this._codec.getMessageKey(e)));
2013
+ }
2014
+ getMessagesWithHeaders() {
2015
+ return this._getMessagesWithHeaders();
2016
+ }
2017
+ getAblyMessages() {
2018
+ return [...this._ablyMessages];
2019
+ }
2020
+ async history(t) {
2021
+ if (this._closed) throw new e.ErrorInfo("unable to load history; transport is closed", W.TransportClosed, 400);
2022
+ this._logger.trace("ClientTransport.history();", { limit: t?.limit });
2023
+ let n = t?.limit ?? 100, r = new Set(this._tree.flatten().map((e) => this._codec.getMessageKey(e))), i = await Be(this._channel, this._codec, t, this._logger), a = await this._loadUntilVisible(i, n, r);
2024
+ i = a.lastPage;
2025
+ let o = a.newVisible;
2026
+ for (let e of o) this._withheldKeys.add(this._codec.getMessageKey(e));
2027
+ let s = o.slice(-n), c = o.slice(0, -n);
2028
+ this._releaseWithheld(s);
2029
+ let l = (e) => ({
2030
+ items: e,
2031
+ hasNext: () => c.length > 0 || i.hasNext(),
2032
+ next: async () => {
2033
+ if (c.length > 0) {
2034
+ let e = c.splice(-n, n);
2035
+ return this._releaseWithheld(e), l(e);
2036
+ }
2037
+ if (!i.hasNext()) return;
2038
+ let e = await i.next();
2039
+ if (!e) return;
2040
+ let t = new Set(r);
2041
+ for (let e of this._tree.flatten()) t.add(this._codec.getMessageKey(e));
2042
+ let a = await this._loadUntilVisible(e, n, t);
2043
+ i = a.lastPage;
2044
+ let o = a.newVisible;
2045
+ for (let e of o) this._withheldKeys.add(this._codec.getMessageKey(e));
2046
+ let s = o.splice(-n, n);
2047
+ if (c.push(...o), this._releaseWithheld(s), s.length !== 0) return l(s);
2048
+ }
2049
+ });
2050
+ return l(s);
2051
+ }
2052
+ async close(e) {
2053
+ if (!this._closed) {
2054
+ if (this._closed = !0, this._logger.info("ClientTransport.close();"), e?.cancel) {
2055
+ try {
2056
+ await this._publishCancel(e.cancel);
2057
+ } catch {}
2058
+ this._closeMatchingTurnStreams(e.cancel);
2059
+ }
2060
+ this._channel.unsubscribe(this._onMessage);
2061
+ for (let e of this._ownTurnIds) this._router.closeStream(e);
2062
+ this._turnObservers.clear(), this._emitter.off(), this._ownTurnIds.clear(), this._ownMsgIds.clear(), this._turnMsgIds.clear(), this._turnClientIds.clear(), this._withheldKeys.clear(), this._ablyMessages.length = 0;
2063
+ }
2064
+ }
2065
+ }, $ = (e) => new We(e), Ge = async (e, t, n, r, i) => {
2066
+ i?.trace("pipeStream();");
2067
+ let a = e.getReader(), o, s = n ? new Promise((e) => {
2068
+ if (n.aborted) {
2069
+ e();
2070
+ return;
2071
+ }
2072
+ o = () => {
2073
+ e();
2074
+ }, n.addEventListener("abort", o, { once: !0 });
2075
+ }) : new Promise(() => {}), c = "complete";
2076
+ try {
2077
+ for (;;) {
2078
+ let e = await Promise.race([a.read(), s.then(() => "aborted")]);
2079
+ if (e === "aborted") {
2080
+ c = "cancelled", i?.debug("pipeStream(); stream cancelled by abort signal"), r && await r(async (e) => t.appendEvent(e)), await t.abort("cancelled");
2081
+ break;
2082
+ }
2083
+ let { done: n, value: o } = e;
2084
+ if (n) {
2085
+ await t.close(), i?.debug("pipeStream(); stream completed");
2086
+ break;
2087
+ }
2088
+ await t.appendEvent(o);
2089
+ }
2090
+ } catch (e) {
2091
+ c = "error";
2092
+ let n = e instanceof Error ? e.message : String(e);
2093
+ i?.error("pipeStream(); stream error", { error: n });
2094
+ try {
2095
+ await t.close();
2096
+ } catch {}
2097
+ } finally {
2098
+ o && n?.removeEventListener("abort", o), a.releaseLock();
2099
+ }
2100
+ return { reason: c };
2101
+ }, Ke = class {
2102
+ constructor(e, t) {
2103
+ this._activeTurns = /* @__PURE__ */ new Map(), this._channel = e, this._logger = t?.withContext({ component: "TurnManager" });
2104
+ }
2105
+ async startTurn(e, t, n) {
2106
+ this._logger?.trace("DefaultTurnManager.startTurn();", {
2107
+ turnId: e,
2108
+ clientId: t
2109
+ });
2110
+ let r = n ?? new AbortController(), i = t ?? "";
2111
+ return this._activeTurns.set(e, {
2112
+ controller: r,
2113
+ clientId: i
2114
+ }), await this._channel.publish({
2115
+ name: _,
2116
+ extras: { headers: {
2117
+ [a]: e,
2118
+ [s]: i
2119
+ } }
2120
+ }), this._logger?.debug("DefaultTurnManager.startTurn(); turn started", { turnId: e }), r.signal;
2121
+ }
2122
+ async endTurn(e, t) {
2123
+ this._logger?.trace("DefaultTurnManager.endTurn();", {
2124
+ turnId: e,
2125
+ reason: t
2126
+ });
2127
+ let n = this._activeTurns.get(e)?.clientId ?? "";
2128
+ await this._channel.publish({
2129
+ name: v,
2130
+ extras: { headers: {
2131
+ [a]: e,
2132
+ [s]: n,
2133
+ [h]: t
2134
+ } }
2135
+ }), this._activeTurns.delete(e), this._logger?.debug("DefaultTurnManager.endTurn(); turn ended", {
2136
+ turnId: e,
2137
+ reason: t
2138
+ });
2139
+ }
2140
+ getSignal(e) {
2141
+ return this._activeTurns.get(e)?.controller.signal;
2142
+ }
2143
+ getClientId(e) {
2144
+ return this._activeTurns.get(e)?.clientId;
2145
+ }
2146
+ abort(e) {
2147
+ this._logger?.debug("DefaultTurnManager.abort();", { turnId: e }), this._activeTurns.get(e)?.controller.abort();
2148
+ }
2149
+ getActiveTurnIds() {
2150
+ return [...this._activeTurns.keys()];
2151
+ }
2152
+ close() {
2153
+ this._logger?.trace("DefaultTurnManager.close();", { activeTurns: this._activeTurns.size });
2154
+ for (let e of this._activeTurns.values()) e.controller.abort();
2155
+ this._activeTurns.clear();
2156
+ }
2157
+ }, qe = (e, t) => new Ke(e, t), Je = class {
2158
+ constructor(t) {
2159
+ this._registeredTurns = /* @__PURE__ */ new Map(), this._channel = t.channel, this._codec = t.codec, this._logger = t.logger?.withContext({ component: "ServerTransport" }), this._onError = t.onError, this._turnManager = qe(this._channel, this._logger), this._channelListener = (e) => {
2160
+ this._handleChannelMessage(e);
2161
+ }, this._attachPromise = this._channel.subscribe(g, this._channelListener).then(() => {}, (t) => {
2162
+ let n = new e.ErrorInfo(`unable to subscribe to cancel messages; ${t instanceof Error ? t.message : String(t)}`, W.TransportSubscriptionError, 500, t instanceof e.ErrorInfo ? t : void 0);
2163
+ this._logger?.error("DefaultServerTransport(); subscribe failed"), this._onError?.(n);
2164
+ }), this._logger?.debug("DefaultServerTransport(); transport created");
2165
+ }
2166
+ newTurn(e) {
2167
+ return this._logger?.trace("DefaultServerTransport.newTurn();", { turnId: e.turnId }), this._createTurn(e);
2168
+ }
2169
+ close() {
2170
+ this._logger?.trace("DefaultServerTransport.close();"), this._channel.unsubscribe(g, this._channelListener);
2171
+ for (let e of this._registeredTurns.values()) e.controller.abort();
2172
+ this._registeredTurns.clear(), this._turnManager.close(), this._logger?.debug("DefaultServerTransport.close(); transport closed");
2173
+ }
2174
+ _resolveFilter(e, t) {
2175
+ let n = [...this._registeredTurns.keys()];
2176
+ return e.all ? n : e.own && t ? n.filter((e) => this._registeredTurns.get(e)?.clientId === t) : e.clientId ? n.filter((t) => this._registeredTurns.get(t)?.clientId === e.clientId) : e.turnId && this._registeredTurns.has(e.turnId) ? [e.turnId] : [];
2177
+ }
2178
+ async _handleCancelMessage(t) {
2179
+ let n = b(t), r = {};
2180
+ n["x-ably-cancel-turn-id"] ? r.turnId = n[l] : n["x-ably-cancel-own"] === "true" ? r.own = !0 : n["x-ably-cancel-client-id"] ? r.clientId = n[f] : n["x-ably-cancel-all"] === "true" && (r.all = !0);
2181
+ let i = this._resolveFilter(r, t.clientId);
2182
+ if (i.length === 0) return;
2183
+ this._logger?.debug("DefaultServerTransport._handleCancelMessage(); matched turns", {
2184
+ matchedTurnIds: i,
2185
+ filter: r
2186
+ });
2187
+ let a = /* @__PURE__ */ new Map();
2188
+ for (let e of i) {
2189
+ let t = this._registeredTurns.get(e);
2190
+ a.set(e, t?.clientId ?? "");
2191
+ }
2192
+ let o = {
2193
+ message: t,
2194
+ filter: r,
2195
+ matchedTurnIds: i,
2196
+ turnOwners: a
2197
+ };
2198
+ for (let t of i) {
2199
+ let n = this._registeredTurns.get(t);
2200
+ if (n) try {
2201
+ if (n.onCancel && !await n.onCancel(o)) {
2202
+ this._logger?.debug("DefaultServerTransport._handleCancelMessage(); cancel rejected by onCancel", { turnId: t });
2203
+ continue;
2204
+ }
2205
+ n.controller.abort(), this._logger?.debug("DefaultServerTransport._handleCancelMessage(); turn aborted", { turnId: t });
2206
+ } catch (r) {
2207
+ let i = new e.ErrorInfo(`unable to process cancel for turn ${t}; onCancel handler threw: ${r instanceof Error ? r.message : String(r)}`, W.CancelListenerError, 500, r instanceof e.ErrorInfo ? r : void 0);
2208
+ this._logger?.error("DefaultServerTransport._handleCancelMessage(); onCancel threw", { turnId: t }), (n.onError ?? this._onError)?.(i);
2209
+ }
2210
+ }
2211
+ }
2212
+ _handleChannelMessage(t) {
2213
+ try {
2214
+ t.name === "x-ably-cancel" && this._handleCancelMessage(t).catch((t) => {
2215
+ let n = new e.ErrorInfo(`unable to route cancel message; ${t instanceof Error ? t.message : String(t)}`, W.CancelListenerError, 500, t instanceof e.ErrorInfo ? t : void 0);
2216
+ this._logger?.error("DefaultServerTransport._handleChannelMessage(); cancel routing error"), this._onError?.(n);
2217
+ });
2218
+ } catch (t) {
2219
+ let n = new e.ErrorInfo(`unable to process channel message; ${t instanceof Error ? t.message : String(t)}`, W.TransportSubscriptionError, 500, t instanceof e.ErrorInfo ? t : void 0);
2220
+ this._logger?.error("DefaultServerTransport._handleChannelMessage(); subscription error"), this._onError?.(n);
2221
+ }
2222
+ }
2223
+ _createTurn(t) {
2224
+ let { turnId: n, clientId: r, onMessage: i, onAbort: a, onCancel: o, onError: s, parent: c, forkOf: l } = t, u = new AbortController(), d = !1, f = !1, p = {
2225
+ turnId: n,
2226
+ clientId: r ?? "",
2227
+ controller: u,
2228
+ onCancel: o,
2229
+ onError: s
2230
+ };
2231
+ this._registeredTurns.set(n, p);
2232
+ let m = this._logger, h = this._turnManager, g = this._attachPromise, _ = this._codec, v = this._channel, y = this._registeredTurns;
2233
+ return {
2234
+ get turnId() {
2235
+ return n;
2236
+ },
2237
+ get abortSignal() {
2238
+ return u.signal;
2239
+ },
2240
+ start: async () => {
2241
+ if (m?.trace("Turn.start();", { turnId: n }), u.signal.aborted) throw new e.ErrorInfo(`unable to start turn; turn ${n} was cancelled before start()`, W.InvalidArgument, 400);
2242
+ if (!d) {
2243
+ d = !0;
2244
+ try {
2245
+ await h.startTurn(n, r, u);
2246
+ } catch (t) {
2247
+ let r = new e.ErrorInfo(`unable to publish turn-start for turn ${n}; ${t instanceof Error ? t.message : String(t)}`, W.TurnLifecycleError, 500, t instanceof e.ErrorInfo ? t : void 0);
2248
+ throw m?.error("Turn.start(); failed to publish turn-start", { turnId: n }), s?.(r), r;
2249
+ }
2250
+ m?.debug("Turn.start(); turn started", { turnId: n });
2251
+ }
2252
+ },
2253
+ addMessages: async (t, r) => {
2254
+ if (m?.trace("Turn.addMessages();", {
2255
+ turnId: n,
2256
+ count: t.length
2257
+ }), !d) throw new e.ErrorInfo(`unable to add messages; start() must be called before addMessages() (turn ${n})`, W.InvalidArgument, 400);
2258
+ await g;
2259
+ let a = [];
2260
+ for (let e of t) {
2261
+ let t = crypto.randomUUID(), o = x(Q({
2262
+ role: "user",
2263
+ turnId: n,
2264
+ msgId: t,
2265
+ turnClientId: r?.clientId,
2266
+ parent: r?.parent === void 0 ? c ?? void 0 : r.parent ?? void 0,
2267
+ forkOf: r?.forkOf ?? l
2268
+ }), e.headers);
2269
+ await _.createEncoder(v, {
2270
+ extras: { headers: o },
2271
+ onMessage: i
2272
+ }).writeMessages([e.message], r?.clientId ? { clientId: r.clientId } : void 0), a.push(o["x-ably-msg-id"] ?? t);
2273
+ }
2274
+ return m?.debug("Turn.addMessages(); messages published", {
2275
+ turnId: n,
2276
+ count: t.length
2277
+ }), { msgIds: a };
2278
+ },
2279
+ streamResponse: async (t, r) => {
2280
+ if (m?.trace("Turn.streamResponse();", { turnId: n }), !d) throw new e.ErrorInfo(`unable to stream response; start() must be called before streamResponse() (turn ${n})`, W.InvalidArgument, 400);
2281
+ await g;
2282
+ let o = h.getSignal(n), s = h.getClientId(n), u = r?.parent === void 0 ? c ?? void 0 : r.parent ?? void 0, f = Q({
2283
+ role: "assistant",
2284
+ turnId: n,
2285
+ msgId: crypto.randomUUID(),
2286
+ turnClientId: s,
2287
+ parent: u,
2288
+ forkOf: r?.forkOf ?? l
2289
+ }), p = await Ge(t, _.createEncoder(v, {
2290
+ extras: { headers: f },
2291
+ onMessage: i
2292
+ }), o, a, m);
2293
+ return m?.debug("Turn.streamResponse(); stream finished", {
2294
+ turnId: n,
2295
+ reason: p.reason
2296
+ }), p;
2297
+ },
2298
+ end: async (t) => {
2299
+ if (m?.trace("Turn.end();", {
2300
+ turnId: n,
2301
+ reason: t
2302
+ }), !d) throw new e.ErrorInfo(`unable to end turn; start() must be called before end() (turn ${n})`, W.InvalidArgument, 400);
2303
+ if (!f) {
2304
+ f = !0;
2305
+ try {
2306
+ await h.endTurn(n, t);
2307
+ } catch (t) {
2308
+ let r = new e.ErrorInfo(`unable to publish turn-end for turn ${n}; ${t instanceof Error ? t.message : String(t)}`, W.TurnLifecycleError, 500, t instanceof e.ErrorInfo ? t : void 0);
2309
+ throw m?.error("Turn.end(); failed to publish turn-end", { turnId: n }), s?.(r), r;
2310
+ } finally {
2311
+ y.delete(n);
2312
+ }
2313
+ m?.debug("Turn.end(); turn ended", {
2314
+ turnId: n,
2315
+ reason: t
2316
+ });
2317
+ }
2318
+ }
2319
+ };
2320
+ }
2321
+ }, Ye = (e) => new Je(e), Xe = (e) => $({
2322
+ ...e,
2323
+ codec: G
2324
+ }), Ze = (e) => Ye({
2325
+ ...e,
2326
+ codec: G
2327
+ });
2328
+ //#endregion
2329
+ export { G as UIMessageCodec, je as createChatTransport, Xe as createClientTransport, Ze as createServerTransport };
2330
+
2331
+ //# sourceMappingURL=ably-ai-transport-vercel.js.map