@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,823 @@
1
+ import { useCallback as e, useEffect as t, useRef as n, useState as r } from "react";
2
+ import * as i from "ably";
3
+ //#region src/react/use-ably-messages.ts
4
+ var a = (e) => {
5
+ let [n, i] = r(() => e.getAblyMessages());
6
+ return t(() => (i(e.getAblyMessages()), e.on("ably-message", () => {
7
+ i(e.getAblyMessages());
8
+ })), [e]), n;
9
+ }, o = "x-ably-turn-id", s = "x-ably-msg-id", c = "x-ably-turn-client-id", l = "x-ably-role", u = "x-ably-cancel-turn-id", d = "x-ably-cancel-own", f = "x-ably-cancel-all", p = "x-ably-cancel-client-id", m = "x-ably-parent", h = "x-ably-fork-of", g = "x-ably-cancel", _ = "x-ably-turn-start", v = "x-ably-turn-end", y = (e) => {
10
+ let [n, i] = r(() => /* @__PURE__ */ new Map());
11
+ return t(() => {
12
+ if (e) return i(e.getActiveTurnIds()), e.on("turn", (e) => {
13
+ i((t) => {
14
+ let n = new Map(t);
15
+ if (e.type === "x-ably-turn-start") {
16
+ let t = new Set(n.get(e.clientId) ?? []);
17
+ t.add(e.turnId), n.set(e.clientId, t);
18
+ } else {
19
+ let t = n.get(e.clientId);
20
+ t && (t.delete(e.turnId), t.size === 0 ? n.delete(e.clientId) : n.set(e.clientId, new Set(t)));
21
+ }
22
+ return n;
23
+ });
24
+ });
25
+ }, [e]), n;
26
+ }, b = /* @__PURE__ */ function(e) {
27
+ 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;
28
+ }({}), x = (e) => ({
29
+ logAction: (t, n, r) => {
30
+ e.error(n, { detail: r });
31
+ },
32
+ shouldLog: () => !0
33
+ }), S = i.Realtime.EventEmitter, C = class extends S {
34
+ constructor(e) {
35
+ super(x(e));
36
+ }
37
+ }, w = /* @__PURE__ */ function(e) {
38
+ return e.Trace = "trace", e.Debug = "debug", e.Info = "info", e.Warn = "warn", e.Error = "error", e.Silent = "silent", e;
39
+ }({}), T = (e, t, n) => {
40
+ let r = n ? `, context: ${JSON.stringify(n)}` : "", i = `[${(/* @__PURE__ */ new Date()).toISOString()}] ${t.valueOf().toUpperCase()} ably-ai-transport: ${e}${r}`;
41
+ switch (t) {
42
+ case w.Trace:
43
+ case w.Debug:
44
+ console.log(i);
45
+ break;
46
+ case w.Info:
47
+ console.info(i);
48
+ break;
49
+ case w.Warn:
50
+ console.warn(i);
51
+ break;
52
+ case w.Error:
53
+ console.error(i);
54
+ break;
55
+ case w.Silent: break;
56
+ }
57
+ }, E = (e) => new k(e.logHandler ?? T, e.logLevel), D = /* @__PURE__ */ function(e) {
58
+ 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;
59
+ }(D || {}), O = new Map([
60
+ [w.Trace, D.Trace],
61
+ [w.Debug, D.Debug],
62
+ [w.Info, D.Info],
63
+ [w.Warn, D.Warn],
64
+ [w.Error, D.Error],
65
+ [w.Silent, D.Silent]
66
+ ]), k = class e {
67
+ constructor(e, t, n) {
68
+ this._handler = e, this._context = n;
69
+ let r = O.get(t);
70
+ if (r === void 0) throw new i.ErrorInfo(`unable to create logger; invalid log level: ${t}`, b.InvalidArgument, 400);
71
+ this._levelNumber = r;
72
+ }
73
+ trace(e, t) {
74
+ this._write(e, w.Trace, D.Trace, t);
75
+ }
76
+ debug(e, t) {
77
+ this._write(e, w.Debug, D.Debug, t);
78
+ }
79
+ info(e, t) {
80
+ this._write(e, w.Info, D.Info, t);
81
+ }
82
+ warn(e, t) {
83
+ this._write(e, w.Warn, D.Warn, t);
84
+ }
85
+ error(e, t) {
86
+ this._write(e, w.Error, D.Error, t);
87
+ }
88
+ withContext(t) {
89
+ let n = [...O.entries()].find(([, e]) => e === this._levelNumber)?.[0] ?? w.Error;
90
+ return new e(this._handler, n, this._mergeContext(t));
91
+ }
92
+ _write(e, t, n, r) {
93
+ n >= this._levelNumber && this._handler(e, t, this._mergeContext(r));
94
+ }
95
+ _mergeContext(e) {
96
+ return this._context ? e ? {
97
+ ...this._context,
98
+ ...e
99
+ } : this._context : e ?? void 0;
100
+ }
101
+ }, A = (e) => {
102
+ let t = e.extras;
103
+ if (!t || typeof t != "object") return {};
104
+ let n = t.headers;
105
+ return !n || typeof n != "object" ? {} : n;
106
+ }, j = class {
107
+ constructor(e, t) {
108
+ 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;
109
+ }
110
+ _compareNodes(e, t) {
111
+ let n = e.node.serial, r = t.node.serial;
112
+ 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;
113
+ }
114
+ _insertSorted(e) {
115
+ if (e.node.serial === void 0) {
116
+ this._sortedList.push(e);
117
+ return;
118
+ }
119
+ let t = 0, n = this._sortedList.length;
120
+ for (; t < n;) {
121
+ let r = t + n >>> 1, i = this._sortedList[r];
122
+ if (!i) break;
123
+ this._compareNodes(i, e) <= 0 ? t = r + 1 : n = r;
124
+ }
125
+ this._sortedList.splice(t, 0, e);
126
+ }
127
+ _removeSorted(e) {
128
+ let t = this._sortedList.indexOf(e);
129
+ t !== -1 && this._sortedList.splice(t, 1);
130
+ }
131
+ _addToParentIndex(e, t) {
132
+ let n = this._parentIndex.get(e);
133
+ n || (n = /* @__PURE__ */ new Set(), this._parentIndex.set(e, n)), n.add(t);
134
+ }
135
+ _removeFromParentIndex(e, t) {
136
+ let n = this._parentIndex.get(e);
137
+ n && (n.delete(t), n.size === 0 && this._parentIndex.delete(e));
138
+ }
139
+ _getSiblingGroup(e) {
140
+ let t = this._nodeIndex.get(e);
141
+ if (!t) return [];
142
+ let n = t.node, r = new Set([n.msgId]);
143
+ for (; n.forkOf && !r.has(n.forkOf);) {
144
+ let e = this._nodeIndex.get(n.forkOf);
145
+ if (!e || e.node.parentId !== n.parentId) break;
146
+ n = e.node, r.add(n.msgId);
147
+ }
148
+ let i = n.parentId, a = n.msgId, o = [], s = this._parentIndex.get(i);
149
+ if (s) for (let e of s) {
150
+ let t = this._nodeIndex.get(e);
151
+ t && this._isSiblingOf(t.node, a) && o.push(t);
152
+ }
153
+ return o.sort((e, t) => this._compareNodes(e, t)), o.map((e) => e.node);
154
+ }
155
+ _isSiblingOf(e, t) {
156
+ if (e.msgId === t) return !0;
157
+ let n = e, r = new Set([n.msgId]);
158
+ for (; n.forkOf;) {
159
+ if (n.forkOf === t) return !0;
160
+ if (r.has(n.forkOf)) break;
161
+ let e = this._nodeIndex.get(n.forkOf);
162
+ if (!e) break;
163
+ n = e.node, r.add(n.msgId);
164
+ }
165
+ return !1;
166
+ }
167
+ _getGroupRoot(e) {
168
+ let t = this._nodeIndex.get(e);
169
+ if (!t) return e;
170
+ let n = t.node, r = new Set([n.msgId]);
171
+ for (; n.forkOf && !r.has(n.forkOf);) {
172
+ let e = this._nodeIndex.get(n.forkOf);
173
+ if (!e || e.node.parentId !== n.parentId) break;
174
+ n = e.node, r.add(n.msgId);
175
+ }
176
+ return n.msgId;
177
+ }
178
+ flatten() {
179
+ let e = [], t = /* @__PURE__ */ new Set(), n = /* @__PURE__ */ new Map();
180
+ for (let r of this._sortedList) {
181
+ let i = r.node, { msgId: a, parentId: o } = i;
182
+ if (o !== void 0 && !t.has(o)) continue;
183
+ let s = this._getSiblingGroup(a);
184
+ if (s.length > 1) {
185
+ let e = this._getGroupRoot(a), t = n.get(e);
186
+ if (t === void 0) {
187
+ let r = this._selections.get(e) ?? s.length - 1, i = s[Math.max(0, Math.min(r, s.length - 1))];
188
+ if (!i) break;
189
+ t = i.msgId, n.set(e, t);
190
+ }
191
+ if (a !== t) continue;
192
+ }
193
+ t.add(a), e.push(i.message);
194
+ }
195
+ return e;
196
+ }
197
+ getSiblings(e) {
198
+ return this._getSiblingGroup(e).map((e) => e.message);
199
+ }
200
+ hasSiblings(e) {
201
+ return this._getSiblingGroup(e).length > 1;
202
+ }
203
+ getSelectedIndex(e) {
204
+ let t = this._getSiblingGroup(e);
205
+ if (t.length <= 1) return 0;
206
+ let n = this._getGroupRoot(e), r = this._selections.get(n);
207
+ return r === void 0 ? t.length - 1 : Math.max(0, Math.min(r, t.length - 1));
208
+ }
209
+ select(e, t) {
210
+ this._logger.debug("ConversationTree.select();", {
211
+ msgId: e,
212
+ index: t
213
+ });
214
+ let n = this._getSiblingGroup(e);
215
+ if (n.length <= 1) return;
216
+ let r = this._getGroupRoot(e);
217
+ this._selections.set(r, Math.max(0, Math.min(t, n.length - 1)));
218
+ }
219
+ getNode(e) {
220
+ return this._nodeIndex.get(e)?.node;
221
+ }
222
+ getNodeByKey(e) {
223
+ let t = this._codecKeyIndex.get(e);
224
+ if (t) return this._nodeIndex.get(t)?.node;
225
+ }
226
+ getHeaders(e) {
227
+ return this._nodeIndex.get(e)?.node.headers;
228
+ }
229
+ upsert(e, t, n, r) {
230
+ let i = n["x-ably-parent"] ?? void 0, a = n["x-ably-fork-of"] ?? void 0;
231
+ this._codecKeyIndex.set(this._getKey(t), e);
232
+ let o = this._nodeIndex.get(e);
233
+ if (o) {
234
+ o.node.message = t, Object.keys(n).length > 0 && (o.node.headers = { ...n }), r && !o.node.serial && (this._logger.debug("ConversationTree.upsert(); promoting serial", {
235
+ msgId: e,
236
+ serial: r
237
+ }), o.node.serial = r, this._removeSorted(o), this._insertSorted(o));
238
+ return;
239
+ }
240
+ this._logger.trace("ConversationTree.upsert(); inserting new node", {
241
+ msgId: e,
242
+ parentId: i,
243
+ forkOf: a
244
+ });
245
+ let s = {
246
+ node: {
247
+ message: t,
248
+ msgId: e,
249
+ parentId: i,
250
+ forkOf: a,
251
+ headers: { ...n },
252
+ serial: r
253
+ },
254
+ insertSeq: this._seqCounter++
255
+ };
256
+ this._nodeIndex.set(e, s), this._addToParentIndex(i, e), this._insertSorted(s);
257
+ }
258
+ delete(e) {
259
+ let t = this._nodeIndex.get(e);
260
+ if (!t) return;
261
+ this._logger.debug("ConversationTree.delete();", { msgId: e });
262
+ let { node: n } = t, r = this._getKey(n.message);
263
+ 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);
264
+ }
265
+ }, M = (e, t) => new j(e, t), N = (e) => {
266
+ let t = [...e.rawMessages].toReversed(), n = e.codec.createDecoder(), r = /* @__PURE__ */ new Map(), i = e.codec.createAccumulator(), a = 0, c = /* @__PURE__ */ new Map(), l = /* @__PURE__ */ new Map();
267
+ for (let u of t) {
268
+ let t = n.decode(u), d = A(u), f = d[o], p = d[s], m = u.serial;
269
+ if (f) {
270
+ let n = r.get(f);
271
+ if (n || (n = {
272
+ accumulator: e.codec.createAccumulator(),
273
+ firstSeen: a++,
274
+ msgHeaders: /* @__PURE__ */ new Map(),
275
+ msgSerials: /* @__PURE__ */ new Map()
276
+ }, r.set(f, n)), p) {
277
+ let e = n.msgHeaders.get(p);
278
+ e ? Object.keys(d).length > 0 && Object.assign(e, d) : (n.msgHeaders.set(p, { ...d }), m && n.msgSerials.set(p, m));
279
+ }
280
+ n.accumulator.processOutputs(t);
281
+ } else i.processOutputs(t);
282
+ for (let n of t) if (n.kind === "message") {
283
+ let t = e.getMessageKey(n.message), r = c.get(t);
284
+ r ? Object.keys(d).length > 0 && Object.assign(r, d) : (c.set(t, { ...d }), m && l.set(t, m));
285
+ }
286
+ }
287
+ let u = [];
288
+ for (let t of i.completedMessages) {
289
+ let n = e.getMessageKey(t);
290
+ u.push({
291
+ message: t,
292
+ headers: c.get(n) ?? {},
293
+ serial: l.get(n) ?? ""
294
+ });
295
+ }
296
+ let d = [...r.values()].toSorted((e, t) => e.firstSeen - t.firstSeen);
297
+ for (let t of d) {
298
+ let n = /* @__PURE__ */ new Set(), r = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Map();
299
+ for (let a of t.accumulator.completedMessages) {
300
+ let t = e.getMessageKey(a), o = c.get(t);
301
+ if (o) {
302
+ r.set(t, o);
303
+ let e = l.get(t);
304
+ e && i.set(t, e);
305
+ let a = o[s];
306
+ a && n.add(a);
307
+ }
308
+ }
309
+ let a = [...t.msgHeaders.entries()].filter(([e]) => !n.has(e)), o = 0;
310
+ for (let n of t.accumulator.completedMessages) {
311
+ let s = e.getMessageKey(n), c = a[o];
312
+ if (!r.has(s) && c) {
313
+ let [e, n] = c;
314
+ r.set(s, n);
315
+ let a = t.msgSerials.get(e);
316
+ a && i.set(s, a), o++;
317
+ }
318
+ }
319
+ for (let n of t.accumulator.completedMessages) {
320
+ let t = e.getMessageKey(n);
321
+ u.push({
322
+ message: n,
323
+ headers: r.get(t) ?? {},
324
+ serial: i.get(t) ?? ""
325
+ });
326
+ }
327
+ }
328
+ return u.toReversed();
329
+ }, P = async (e, t, n) => {
330
+ e.rawMessages.push(...t.items), e.lastAblyPage = t;
331
+ let r = N(e).length;
332
+ for (; r < e.returnedCount + n && t.hasNext();) {
333
+ e.logger.debug("decodeHistory.fetchUntilLimit(); fetching next page", {
334
+ collected: e.rawMessages.length,
335
+ decoded: r
336
+ });
337
+ let n = await t.next();
338
+ if (!n) break;
339
+ t = n, e.rawMessages.push(...n.items), e.lastAblyPage = n, r = N(e).length;
340
+ }
341
+ }, F = (e, t) => {
342
+ let n = N(e), r = n.slice(e.returnedCount, e.returnedCount + t), i = [...r].toReversed();
343
+ e.returnedCount += r.length;
344
+ let a = n.length > e.returnedCount, o = e.lastAblyPage?.hasNext() ?? !1, s = e.rawMessages.length - e.returnedRawCount > 0 ? e.rawMessages.slice(e.returnedRawCount).toReversed() : [];
345
+ return e.returnedRawCount = e.rawMessages.length, {
346
+ items: i.map((e) => e.message),
347
+ itemHeaders: i.map((e) => e.headers),
348
+ itemSerials: i.map((e) => e.serial),
349
+ rawMessages: s,
350
+ hasNext: () => a || o,
351
+ next: async () => {
352
+ if (a) return F(e, t);
353
+ if (!o || !e.lastAblyPage) return;
354
+ let n = await e.lastAblyPage.next();
355
+ if (n) return await P(e, n, t), F(e, t);
356
+ }
357
+ };
358
+ }, I = async (e, t, n, r) => {
359
+ let i = n?.limit ?? 100, a = {
360
+ codec: t,
361
+ rawMessages: [],
362
+ returnedCount: 0,
363
+ returnedRawCount: 0,
364
+ lastAblyPage: void 0,
365
+ getMessageKey: t.getMessageKey.bind(t),
366
+ logger: r
367
+ };
368
+ r.trace("decodeHistory();", { limit: i });
369
+ let o = i * 10;
370
+ return await e.attach(), await P(a, await e.history({
371
+ untilAttach: !0,
372
+ limit: o
373
+ }), i), F(a, i);
374
+ }, L = (e) => {
375
+ let t = {
376
+ [l]: e.role,
377
+ [o]: e.turnId,
378
+ [s]: e.msgId
379
+ };
380
+ return e.turnClientId !== void 0 && (t[c] = e.turnClientId), e.parent && (t[m] = e.parent), e.forkOf && (t[h] = e.forkOf), t;
381
+ }, R = class {
382
+ constructor(e, t) {
383
+ this._turns = /* @__PURE__ */ new Map(), this._isTerminal = e, this._logger = t;
384
+ }
385
+ createStream(e) {
386
+ this._logger.trace("StreamRouter.createStream();", { turnId: e });
387
+ let t = {}, n = new ReadableStream({ start(e) {
388
+ t.controller = e;
389
+ } });
390
+ if (!t.controller) throw new i.ErrorInfo("unable to create stream; ReadableStream start() was not called synchronously", b.TransportSubscriptionError, 500);
391
+ return this._turns.set(e, {
392
+ controller: t.controller,
393
+ turnId: e
394
+ }), n;
395
+ }
396
+ closeStream(e) {
397
+ let t = this._turns.get(e);
398
+ if (!t) return !1;
399
+ this._logger.debug("StreamRouter.closeStream(); closing stream", { turnId: e });
400
+ try {
401
+ t.controller.close();
402
+ } catch {}
403
+ return this._turns.delete(e), !0;
404
+ }
405
+ route(e, t) {
406
+ let n = this._turns.get(e);
407
+ if (!n) return !1;
408
+ try {
409
+ n.controller.enqueue(t);
410
+ } catch {
411
+ return this._turns.delete(e), !1;
412
+ }
413
+ return this._isTerminal(t) && this.closeStream(e), !0;
414
+ }
415
+ has(e) {
416
+ return this._turns.has(e);
417
+ }
418
+ }, z = (e, t) => new R(e, t), B = () => {}, V = class {
419
+ constructor(e) {
420
+ 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 ?? E({ logLevel: w.Silent })).withContext({ component: "ClientTransport" }), this._emitter = new C(this._logger), this._tree = M(this._codec.getMessageKey.bind(this._codec), this._logger), this._router = z(this._codec.isTerminal.bind(this._codec), this._logger), this._decoder = this._codec.createDecoder(), e.messages) {
421
+ let t;
422
+ for (let n of e.messages) {
423
+ let e = this._codec.getMessageKey(n), r = {};
424
+ t && (r[m] = t), this._tree.upsert(e, n, r), t = e;
425
+ }
426
+ this._emitter.emit("message");
427
+ }
428
+ this._onMessage = (e) => {
429
+ this._handleMessage(e);
430
+ }, this._attachPromise = this._channel.subscribe(this._onMessage);
431
+ }
432
+ _handleMessage(e) {
433
+ if (!this._closed) {
434
+ this._ablyMessages.push(e), this._emitter.emit("ably-message");
435
+ try {
436
+ if (e.name === "x-ably-turn-start") {
437
+ let t = A(e), n = t[o], r = t["x-ably-turn-client-id"] ?? "";
438
+ n && (this._turnClientIds.set(n, r), this._emitter.emit("turn", {
439
+ type: _,
440
+ turnId: n,
441
+ clientId: r
442
+ }));
443
+ return;
444
+ }
445
+ if (e.name === "x-ably-turn-end") {
446
+ let t = A(e), n = t[o], r = t["x-ably-turn-client-id"] ?? "", i = t["x-ably-turn-reason"] ?? "complete";
447
+ if (n) {
448
+ this._router.closeStream(n), this._turnObservers.delete(n), this._turnClientIds.delete(n);
449
+ let e = this._turnMsgIds.get(n);
450
+ if (e) {
451
+ for (let t of e) this._ownMsgIds.delete(t);
452
+ this._turnMsgIds.delete(n);
453
+ }
454
+ this._ownTurnIds.delete(n), this._emitter.emit("turn", {
455
+ type: v,
456
+ turnId: n,
457
+ clientId: r,
458
+ reason: i
459
+ });
460
+ }
461
+ return;
462
+ }
463
+ let t = this._decoder.decode(e), n = A(e), r = e.serial, i = n[o];
464
+ i && this._updateTurnObserverHeaders(i, n, r);
465
+ for (let i of t) i.kind === "message" ? this._handleMessageOutput(i.message, n, r, e.action) : this._handleEventOutput(i, n);
466
+ } catch (e) {
467
+ let t = e instanceof i.ErrorInfo ? e : void 0;
468
+ this._emitter.emit("error", new i.ErrorInfo(`unable to process channel message; ${e instanceof Error ? e.message : String(e)}`, b.TransportSubscriptionError, 500, t));
469
+ }
470
+ }
471
+ }
472
+ _handleMessageOutput(e, t, n, r) {
473
+ let i = t[s];
474
+ if (i && this._ownMsgIds.has(i)) {
475
+ this._upsertAndNotify(e, t, n);
476
+ return;
477
+ }
478
+ r === "message.create" && this._upsertAndNotify(e, t, n);
479
+ }
480
+ _handleEventOutput(e, t) {
481
+ if (e.kind !== "event") return;
482
+ let n = e.event, r = t[o];
483
+ if (r) {
484
+ if (this._router.route(r, n)) {
485
+ this._accumulateAndEmit(r, e), this._codec.isTerminal(n) && this._turnObservers.delete(r);
486
+ return;
487
+ }
488
+ this._ownTurnIds.has(r) && !this._turnObservers.has(r) || (this._accumulateAndEmit(r, e), this._codec.isTerminal(n) && this._turnObservers.delete(r));
489
+ }
490
+ }
491
+ _upsertAndNotify(e, t, n) {
492
+ let r = this._codec.getMessageKey(e), i = t["x-ably-msg-id"] ?? r;
493
+ this._tree.upsert(i, e, t, n), this._emitter.emit("message");
494
+ }
495
+ _updateTurnObserverHeaders(e, t, n) {
496
+ let r = this._turnObservers.get(e);
497
+ r ? (Object.keys(t).length > 0 && Object.assign(r.headers, t), n !== void 0 && (r.serial = n)) : this._turnObservers.set(e, {
498
+ headers: { ...t },
499
+ serial: n,
500
+ accumulator: this._codec.createAccumulator()
501
+ });
502
+ }
503
+ _accumulateAndEmit(e, t) {
504
+ let n = this._turnObservers.get(e);
505
+ if (!n) return;
506
+ n.accumulator.processOutputs([t]);
507
+ let r = n.accumulator.messages;
508
+ if (r.length === 0) return;
509
+ let i;
510
+ try {
511
+ i = structuredClone(r.at(-1));
512
+ } catch {
513
+ i = r.at(-1);
514
+ }
515
+ i && (this._tree.upsert(n.headers["x-ably-msg-id"] ?? this._codec.getMessageKey(i), i, { ...n.headers }, n.serial), this._emitter.emit("message"));
516
+ }
517
+ async _publishCancel(e) {
518
+ this._logger.trace("ClientTransport._publishCancel();", { filter: e });
519
+ let t = {};
520
+ e.turnId ? t[u] = e.turnId : e.own ? t[d] = "true" : e.clientId ? t[p] = e.clientId : e.all && (t[f] = "true"), await this._channel.publish({
521
+ name: g,
522
+ extras: { headers: t }
523
+ });
524
+ }
525
+ _closeMatchingTurnStreams(e) {
526
+ if (e.all) for (let e of this._ownTurnIds) this._router.closeStream(e);
527
+ else if (e.own) for (let e of this._ownTurnIds) this._router.closeStream(e);
528
+ else if (e.clientId) for (let [t, n] of this._turnClientIds) n === e.clientId && this._router.closeStream(t);
529
+ else e.turnId && this._router.closeStream(e.turnId);
530
+ }
531
+ _getMatchingTurnIds(e) {
532
+ let t = /* @__PURE__ */ new Set();
533
+ if (e.all) for (let e of this._turnClientIds.keys()) t.add(e);
534
+ else if (e.own) for (let [e, n] of this._turnClientIds) n === this._clientId && t.add(e);
535
+ else if (e.clientId) for (let [n, r] of this._turnClientIds) r === e.clientId && t.add(n);
536
+ else e.turnId && this._turnClientIds.has(e.turnId) && t.add(e.turnId);
537
+ return t;
538
+ }
539
+ _getMessagesWithHeaders() {
540
+ return this._tree.flatten().map((e) => ({
541
+ message: e,
542
+ headers: this.getMessageHeaders(e)
543
+ }));
544
+ }
545
+ _getHistoryBefore(e) {
546
+ let t = this._getMessagesWithHeaders(), n = t.findIndex((t) => t.headers?.[s] === e);
547
+ return n === -1 ? t : t.slice(0, n);
548
+ }
549
+ _processHistoryPage(e) {
550
+ for (let [t, n] of e.items.entries()) {
551
+ let r = e.itemHeaders?.[t] ?? {}, i = e.itemSerials?.[t], a = this._codec.getMessageKey(n), o = r["x-ably-msg-id"] ?? a;
552
+ this._tree.upsert(o, n, r, i);
553
+ }
554
+ this._emitter.emit("message"), e.rawMessages && e.rawMessages.length > 0 && (this._ablyMessages.unshift(...e.rawMessages), this._emitter.emit("ably-message"));
555
+ }
556
+ async _loadUntilVisible(e, t, n) {
557
+ this._processHistoryPage(e);
558
+ let r = e, i = () => {
559
+ let e = 0;
560
+ for (let t of this._tree.flatten()) n.has(this._codec.getMessageKey(t)) || e++;
561
+ return e;
562
+ };
563
+ for (; i() < t && r.hasNext();) {
564
+ let e = await r.next();
565
+ if (!e) break;
566
+ this._processHistoryPage(e), r = e;
567
+ }
568
+ return {
569
+ newVisible: this._tree.flatten().filter((e) => !n.has(this._codec.getMessageKey(e))),
570
+ lastPage: r
571
+ };
572
+ }
573
+ _releaseWithheld(e) {
574
+ for (let t of e) this._withheldKeys.delete(this._codec.getMessageKey(t));
575
+ e.length > 0 && this._emitter.emit("message");
576
+ }
577
+ async send(e, t) {
578
+ if (this._closed || (await this._attachPromise, this._closed)) throw new i.ErrorInfo("unable to send; transport is closed", b.TransportClosed, 400);
579
+ this._logger.trace("ClientTransport.send();");
580
+ let n = Array.isArray(e) ? e : [e], r = crypto.randomUUID();
581
+ this._ownTurnIds.add(r);
582
+ let a = /* @__PURE__ */ new Set(), o = [], c = this._getMessagesWithHeaders(), u;
583
+ if (t?.parent === void 0 && !t?.forkOf) {
584
+ let e = this._tree.flatten();
585
+ if (e.length > 0) {
586
+ let t = e.at(-1);
587
+ if (t) {
588
+ let e = this._codec.getMessageKey(t);
589
+ u = this._tree.getNodeByKey(e)?.msgId ?? e;
590
+ }
591
+ }
592
+ }
593
+ let d = t?.parent === void 0 ? u : t.parent;
594
+ for (let e of n) {
595
+ let n = crypto.randomUUID();
596
+ this._ownMsgIds.add(n), a.add(n);
597
+ let i = t?.parent === void 0 ? u : t.parent ?? void 0, c = L({
598
+ role: "user",
599
+ turnId: r,
600
+ msgId: n,
601
+ turnClientId: this._clientId,
602
+ parent: i,
603
+ forkOf: t?.forkOf
604
+ });
605
+ this._upsertAndNotify(e, c);
606
+ let d = {
607
+ [s]: n,
608
+ [l]: "user"
609
+ };
610
+ i && (d[m] = i), o.push({
611
+ message: e,
612
+ headers: d
613
+ }), t?.parent === void 0 && !t?.forkOf && (u = n);
614
+ }
615
+ this._turnMsgIds.set(r, a);
616
+ let f = this._router.createStream(r), p = this._headersFn?.() ?? {}, h = {
617
+ ...this._bodyFn?.() ?? {},
618
+ history: c,
619
+ ...t?.body,
620
+ turnId: r,
621
+ clientId: this._clientId,
622
+ messages: o,
623
+ ...t?.forkOf !== void 0 && { forkOf: t.forkOf },
624
+ ...d !== void 0 && { parent: d }
625
+ }, g = {
626
+ ...p,
627
+ ...t?.headers
628
+ };
629
+ return this._fetchFn(this._api, {
630
+ method: "POST",
631
+ headers: {
632
+ "Content-Type": "application/json",
633
+ ...g
634
+ },
635
+ body: JSON.stringify(h),
636
+ ...this._credentials ? { credentials: this._credentials } : {}
637
+ }).then((e) => {
638
+ e.ok || (this._emitter.emit("error", new i.ErrorInfo(`unable to send; HTTP POST to ${this._api} returned ${String(e.status)} ${e.statusText}`, b.TransportSendFailed, e.status)), this._router.closeStream(r));
639
+ }).catch((e) => {
640
+ let t = e instanceof i.ErrorInfo ? e : void 0;
641
+ this._emitter.emit("error", new i.ErrorInfo(`unable to send; HTTP POST to ${this._api} failed: ${e instanceof Error ? e.message : String(e)}`, b.TransportSendFailed, 500, t)), this._router.closeStream(r);
642
+ }), {
643
+ stream: f,
644
+ turnId: r,
645
+ cancel: async () => this.cancel({ turnId: r })
646
+ };
647
+ }
648
+ async regenerate(e, t) {
649
+ this._logger.trace("ClientTransport.regenerate();", { messageId: e });
650
+ let n = this._tree.getNode(e)?.parentId;
651
+ return this.send([], {
652
+ ...t,
653
+ body: {
654
+ history: this._getHistoryBefore(e),
655
+ ...t?.body
656
+ },
657
+ forkOf: e,
658
+ parent: n
659
+ });
660
+ }
661
+ async edit(e, t, n) {
662
+ this._logger.trace("ClientTransport.edit();", { messageId: e });
663
+ let r = this._tree.getNode(e)?.parentId;
664
+ return this.send(t, {
665
+ ...n,
666
+ body: {
667
+ history: this._getHistoryBefore(e),
668
+ ...n?.body
669
+ },
670
+ forkOf: e,
671
+ parent: r
672
+ });
673
+ }
674
+ async cancel(e) {
675
+ if (this._closed) return;
676
+ let t = e ?? { own: !0 };
677
+ this._logger.debug("ClientTransport.cancel();", { filter: t }), await this._publishCancel(t), this._closeMatchingTurnStreams(t);
678
+ }
679
+ async waitForTurn(e) {
680
+ if (this._closed) return;
681
+ let t = e ?? { own: !0 }, n = this._getMatchingTurnIds(t);
682
+ if (n.size !== 0) return this._logger.debug("ClientTransport.waitForTurn();", { turnIds: [...n] }), new Promise((e) => {
683
+ let t = (r) => {
684
+ r.type === "x-ably-turn-end" && (n.delete(r.turnId), n.size === 0 && (this._emitter.off("turn", t), e()));
685
+ };
686
+ this._emitter.on("turn", t);
687
+ });
688
+ }
689
+ on(e, t) {
690
+ if (this._closed) return B;
691
+ let n = t;
692
+ return this._emitter.on(e, n), () => {
693
+ this._emitter.off(e, n);
694
+ };
695
+ }
696
+ getTree() {
697
+ return this._tree;
698
+ }
699
+ getActiveTurnIds() {
700
+ let e = /* @__PURE__ */ new Map();
701
+ for (let [t, n] of this._turnClientIds) {
702
+ let r = e.get(n);
703
+ r || (r = /* @__PURE__ */ new Set(), e.set(n, r)), r.add(t);
704
+ }
705
+ return e;
706
+ }
707
+ getMessageHeaders(e) {
708
+ let t = this._codec.getMessageKey(e);
709
+ return this._tree.getNodeByKey(t)?.headers;
710
+ }
711
+ getMessages() {
712
+ return this._withheldKeys.size === 0 ? this._tree.flatten() : this._tree.flatten().filter((e) => !this._withheldKeys.has(this._codec.getMessageKey(e)));
713
+ }
714
+ getMessagesWithHeaders() {
715
+ return this._getMessagesWithHeaders();
716
+ }
717
+ getAblyMessages() {
718
+ return [...this._ablyMessages];
719
+ }
720
+ async history(e) {
721
+ if (this._closed) throw new i.ErrorInfo("unable to load history; transport is closed", b.TransportClosed, 400);
722
+ this._logger.trace("ClientTransport.history();", { limit: e?.limit });
723
+ let t = e?.limit ?? 100, n = new Set(this._tree.flatten().map((e) => this._codec.getMessageKey(e))), r = await I(this._channel, this._codec, e, this._logger), a = await this._loadUntilVisible(r, t, n);
724
+ r = a.lastPage;
725
+ let o = a.newVisible;
726
+ for (let e of o) this._withheldKeys.add(this._codec.getMessageKey(e));
727
+ let s = o.slice(-t), c = o.slice(0, -t);
728
+ this._releaseWithheld(s);
729
+ let l = (e) => ({
730
+ items: e,
731
+ hasNext: () => c.length > 0 || r.hasNext(),
732
+ next: async () => {
733
+ if (c.length > 0) {
734
+ let e = c.splice(-t, t);
735
+ return this._releaseWithheld(e), l(e);
736
+ }
737
+ if (!r.hasNext()) return;
738
+ let e = await r.next();
739
+ if (!e) return;
740
+ let i = new Set(n);
741
+ for (let e of this._tree.flatten()) i.add(this._codec.getMessageKey(e));
742
+ let a = await this._loadUntilVisible(e, t, i);
743
+ r = a.lastPage;
744
+ let o = a.newVisible;
745
+ for (let e of o) this._withheldKeys.add(this._codec.getMessageKey(e));
746
+ let s = o.splice(-t, t);
747
+ if (c.push(...o), this._releaseWithheld(s), s.length !== 0) return l(s);
748
+ }
749
+ });
750
+ return l(s);
751
+ }
752
+ async close(e) {
753
+ if (!this._closed) {
754
+ if (this._closed = !0, this._logger.info("ClientTransport.close();"), e?.cancel) {
755
+ try {
756
+ await this._publishCancel(e.cancel);
757
+ } catch {}
758
+ this._closeMatchingTurnStreams(e.cancel);
759
+ }
760
+ this._channel.unsubscribe(this._onMessage);
761
+ for (let e of this._ownTurnIds) this._router.closeStream(e);
762
+ 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;
763
+ }
764
+ }
765
+ }, H = (e) => new V(e), U = (e) => {
766
+ let t = n(null);
767
+ return t.current === null && (t.current = H(e)), t.current;
768
+ }, W = (n) => {
769
+ let [i, a] = r(() => n.getMessages());
770
+ return t(() => (a(n.getMessages()), n.on("message", () => {
771
+ a(n.getMessages());
772
+ })), [n]), {
773
+ messages: i,
774
+ getSiblings: e((e) => n.getTree().getSiblings(e), [n]),
775
+ hasSiblings: e((e) => n.getTree().hasSiblings(e), [n]),
776
+ getSelectedIndex: e((e) => n.getTree().getSelectedIndex(e), [n]),
777
+ selectSibling: e((e, t) => {
778
+ n.getTree().select(e, t), a(n.getMessages());
779
+ }, [n])
780
+ };
781
+ }, G = (t) => e(async (e, n, r) => t.edit(e, n, r), [t]), K = (i, a) => {
782
+ let [o, s] = r(!1), [c, l] = r(!1), u = n(!1), d = n(null), f = n(i);
783
+ f.current = i;
784
+ let p = e(async (e) => {
785
+ if (!(!f.current || u.current)) {
786
+ u.current = !0, l(!0);
787
+ try {
788
+ let t = await f.current.history(e);
789
+ d.current = t, s(t.hasNext());
790
+ } finally {
791
+ u.current = !1, l(!1);
792
+ }
793
+ }
794
+ }, []), m = e(async () => {
795
+ let e = d.current;
796
+ if (!(!e || !e.hasNext() || u.current || !f.current)) {
797
+ u.current = !0, l(!0);
798
+ try {
799
+ let t = await e.next();
800
+ t ? (d.current = t, s(t.hasNext())) : s(!1);
801
+ } finally {
802
+ u.current = !1, l(!1);
803
+ }
804
+ }
805
+ }, []), h = a != null, g = n(!1), _ = n(a);
806
+ return _.current = a, t(() => {
807
+ !h || g.current || !f.current || (g.current = !0, p(_.current ?? void 0));
808
+ }, [h, p]), {
809
+ hasNext: o,
810
+ loading: c,
811
+ load: p,
812
+ next: m
813
+ };
814
+ }, q = (e) => {
815
+ let [n, i] = r(() => e.getMessages());
816
+ return t(() => (i(e.getMessages()), e.on("message", () => {
817
+ i(e.getMessages());
818
+ })), [e]), n;
819
+ }, J = (t) => e(async (e, n) => t.regenerate(e, n), [t]), Y = (t) => e(async (e, n) => t.send(e, n), [t]);
820
+ //#endregion
821
+ export { a as useAblyMessages, y as useActiveTurns, U as useClientTransport, W as useConversationTree, G as useEdit, K as useHistory, q as useMessages, J as useRegenerate, Y as useSend };
822
+
823
+ //# sourceMappingURL=ably-ai-transport-react.js.map