@epam/ai-dial-chat-hooks 1.2.0-dev.99 → 1.3.0-dev.5

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 (84) hide show
  1. package/api-error/api-error.js +7 -4
  2. package/catalog/catalog-derivations.js +1 -1
  3. package/catalog/deployment-id.js +8 -2
  4. package/catalog/map-deployment-limits-to-catalog.js +16 -24
  5. package/catalog/map-deployment-limits-to-input.js +81 -9
  6. package/catalog/map-deployment-to-catalog-item.js +34 -34
  7. package/catalog/map-entity-details-to-catalog.js +237 -192
  8. package/catalog/map-skill-to-catalog-item.js +61 -54
  9. package/catalog/publish.js +4 -4
  10. package/catalog/useCatalogEditNavigation/useCatalogEditNavigation.js +122 -101
  11. package/catalog/useCatalogItemDetails.js +9 -8
  12. package/catalog/usePublishFolders/usePublishFolders.js +1 -1
  13. package/catalog.d.ts +171 -34
  14. package/catalog.js +23 -23
  15. package/conversation/conversation-transfer/export-conversation.js +24 -16
  16. package/conversation/conversation-transfer/import-conversation.js +80 -31
  17. package/conversation/create-chat-stream-api.js +89 -49
  18. package/conversation/get-model-id-from-conversation-id.js +15 -9
  19. package/conversation/message-utils.js +44 -2
  20. package/conversation/stage.js +6 -2
  21. package/conversation/useActiveConversationSync/useActiveConversationSync.js +7 -8
  22. package/conversation/useConversationExport/useConversationExport.js +9 -9
  23. package/conversation/useConversationHandlers/message-utils.js +8 -5
  24. package/conversation/useConversationHandlers/useConversationHandlers.js +181 -167
  25. package/conversation/useConversationImport/useConversationImport.js +123 -121
  26. package/conversation/useConversationPanelItems/useConversationPanelItems.js +49 -31
  27. package/conversation/useConversationStream/frame-scheduler.js +39 -0
  28. package/conversation/useConversationStream/generation-resume.js +122 -64
  29. package/conversation/useConversationStream/useConversationStream.js +298 -118
  30. package/conversation/useMessageSelectionReply/useMessageSelectionReply.js +189 -0
  31. package/conversation-sources/useConversationSources/useConversationSources.js +31 -24
  32. package/conversation-sources.d.ts +1 -1
  33. package/conversation-transfer.d.ts +2 -1
  34. package/conversation.d.ts +218 -22
  35. package/conversation.js +32 -31
  36. package/file-manager-canvas.d.ts +27 -7
  37. package/file-manager.d.ts +87 -32
  38. package/file-manager.js +25 -24
  39. package/files/attachment-canvas.js +67 -44
  40. package/files/dial-file-manager-copy-move.util.js +9 -8
  41. package/files/dial-file-manager-mapping.util.js +2 -1
  42. package/files/dial-file-manager-path.util.js +24 -2
  43. package/files/dial-file-manager.model.js +23 -19
  44. package/files/dial-file-manager.types.js +3 -3
  45. package/files/file-manager-variant.js +1 -1
  46. package/files/resolve-dial-file-api-path.js +11 -12
  47. package/files/useDialFileListing/useDialFileListing.js +140 -127
  48. package/files/useDialFileManager/useDialFileManager.js +139 -135
  49. package/files/useDialFileManagerSections/useDialFileManagerSections.js +155 -0
  50. package/files/useDialFileManagerTabConfig/useDialFileManagerTabConfig.js +20 -15
  51. package/files/useDialFileMutations/useDialFileMutations.js +65 -60
  52. package/files/useDialFileUploadBatch/useDialFileUploadBatch.js +117 -110
  53. package/files/useFileAttachmentPicker/useFileAttachmentPicker.js +28 -23
  54. package/index.d.ts +643 -128
  55. package/index.js +136 -134
  56. package/mcp-apps/useMcpAppTools/useMcpAppTools.js +1 -1
  57. package/oauth/authorize-url.js +3 -3
  58. package/oauth/toolset-id.js +5 -3
  59. package/oauth/useToolsetLogin/useToolsetLogin.js +8 -8
  60. package/oauth.d.ts +34 -2
  61. package/oauth.js +9 -9
  62. package/package.json +19 -23
  63. package/scheduled-task/scheduled-task-description.js +43 -39
  64. package/scheduled-task/scheduled-task-trigger.js +74 -71
  65. package/scheduled-task/use-scheduled-task-runs.js +162 -50
  66. package/scheduled-task/use-scheduled-tasks.js +52 -48
  67. package/scheduled-tasks.d.ts +27 -6
  68. package/scheduled-tasks.js +2 -2
  69. package/shared/application-schema.js +5 -2
  70. package/shared/cron-day-of-month.js +13 -0
  71. package/skill/skill-archive.js +19 -0
  72. package/skill/skill-types.js +8 -7
  73. package/skill/skill.js +52 -29
  74. package/skill/useSkillArchiveImport/useSkillArchiveImport.js +38 -34
  75. package/skill/useSkillEditorLoad.js +65 -59
  76. package/skill/useSkillEditorSubmit.js +105 -93
  77. package/skill/useSkillFileActions.js +70 -58
  78. package/skill-editor.d.ts +62 -13
  79. package/skill-editor.js +9 -9
  80. package/usage/map-user-usage-to-model-limits.js +137 -95
  81. package/usage.d.ts +8 -3
  82. package/usePageFileDrag/usePageFileDrag.js +3 -3
  83. package/utils.d.ts +26 -6
  84. package/utils.js +10 -10
@@ -1,156 +1,336 @@
1
1
  import { safeDecodeURI as e } from "../../shared/string-utils.js";
2
- import { DEFAULT_GENERATION_CONFLICT_MESSAGE as t, GenerationConflictError as n } from "../create-chat-stream-api.js";
3
- import { getConversationPath as r } from "./conversation-path.js";
4
- import { applyChunkToMessages as i } from "./apply-chunk.js";
5
- import { restoreBufferedMessage as a } from "./buffered-generation.js";
6
- import { createResumeIfAwaitingGeneration as o } from "./generation-resume.js";
7
- import { generateUUID as s } from "@epam/ai-dial-chat-shared";
8
- import { useCallback as c, useEffect as l, useMemo as u, useRef as d, useState as f } from "react";
9
- import { SendCompletionDtoModeEnum as p } from "@epam/ai-dial-chat-api-client";
2
+ import { DEFAULT_GENERATION_CONFLICT_MESSAGE as t, DEFAULT_GENERATION_PERSISTENCE_ERROR_MESSAGE as n, GenerationConflictError as r, GenerationPersistenceError as i, StreamInterruptedError as a, StreamUpstreamError as o } from "../create-chat-stream-api.js";
3
+ import { getConversationPath as s } from "./conversation-path.js";
4
+ import { applyChunkToMessages as c } from "./apply-chunk.js";
5
+ import { restoreBufferedMessage as l } from "./buffered-generation.js";
6
+ import { createResumeIfAwaitingGeneration as ee, fetchConversationForRecovery as te, findPendingBackgroundMessageIndex as u, hasGeneratedPayload as ne, isAwaitingGenerationResume as d } from "./generation-resume.js";
7
+ import { createFrameScheduler as re } from "./frame-scheduler.js";
8
+ import { MessageRole as ie, generateUUID as ae } from "@epam/ai-dial-chat-shared";
9
+ import { useCallback as f, useEffect as p, useMemo as oe, useRef as m, useState as h } from "react";
10
+ import { SendCompletionDtoModeEnum as g } from "@epam/ai-dial-chat-api-client";
10
11
  //#region src/conversation/useConversationStream/useConversationStream.ts
11
- var m = 2e4, h = ({ conversationId: h, state: { setConversation: g, conversationRef: _ }, transport: v, generation: { startGeneration: y, completeGeneration: b }, channel: x, overlay: S, onStopError: C, generationConflictMessage: w = t }) => {
12
- let [T, E] = f(() => /* @__PURE__ */ new Set()), [D, O] = f(null), k = d(null), A = d(null), j = d(/* @__PURE__ */ new Set()), M = d(/* @__PURE__ */ new Map()), N = d(/* @__PURE__ */ new Set()), P = d(/* @__PURE__ */ new Map()), F = d(h);
13
- l(() => {
14
- F.current = h;
15
- }, [h]);
16
- let I = c((e) => r(F.current ?? "") === e, []), L = c((e) => {
17
- E((t) => {
12
+ var se = 2e4, ce = 401, le = (e, t, n) => e instanceof i ? n : e instanceof r ? t : e instanceof o ? e.message : "", _ = (e) => {
13
+ if (!e) return;
14
+ let t = u(e);
15
+ return t === -1 ? void 0 : e.messages[t].backgroundGeneration?.generationId;
16
+ }, v = ({ conversationId: o, state: { setConversation: v, conversationRef: y }, transport: b, generation: { startGeneration: ue, completeGeneration: x }, channel: S, overlay: C, onStopError: w, generationConflictMessage: de = t, generationPersistenceErrorMessage: T = n, onStreamError: E, batchChunksPerFrame: D = !1 }) => {
17
+ let O = m(E);
18
+ p(() => {
19
+ O.current = E;
20
+ }, [E]);
21
+ let fe = m(D);
22
+ p(() => {
23
+ fe.current = D;
24
+ }, [D]);
25
+ let [k] = h(re), [A, j] = h(() => /* @__PURE__ */ new Set()), [M, N] = h(() => /* @__PURE__ */ new Set()), P = m(/* @__PURE__ */ new Map()), F = m(/* @__PURE__ */ new Set()), I = m(/* @__PURE__ */ new Map()), L = m(/* @__PURE__ */ new Set()), pe = m(/* @__PURE__ */ new Map()), R = m(!0), z = m(/* @__PURE__ */ new Map()), [B, V] = h(z.current), H = m(/* @__PURE__ */ new Set()), [me, U] = h(H.current);
26
+ p(() => (R.current = !0, () => {
27
+ R.current = !1;
28
+ }), []);
29
+ let W = f((e) => {
30
+ if (!z.current.has(e)) return;
31
+ let t = new Map(z.current);
32
+ t.delete(e), z.current = t, R.current && V(t);
33
+ }, []), G = f((e, t, n) => {
34
+ if (!R.current || !n()) return;
35
+ let r = new Map(z.current);
36
+ r.set(e, {
37
+ retry: t,
38
+ isCurrent: n
39
+ }), z.current = r, V(r);
40
+ }, []), he = f(async () => {
41
+ if (!o) return;
42
+ let e = z.current.get(s(o));
43
+ if (!(!e || !e.isCurrent() || H.current.has(e))) {
44
+ H.current.add(e), U(new Set(H.current));
45
+ try {
46
+ await e.retry();
47
+ } finally {
48
+ H.current.delete(e), R.current && U(new Set(H.current));
49
+ }
50
+ }
51
+ }, [o]), K = m(o);
52
+ p(() => (K.current = o, () => k.cancelAll()), [o, k]);
53
+ let q = f((e) => R.current && s(K.current ?? "") === e, []), J = f((e) => {
54
+ W(e), j((t) => {
18
55
  if (t.has(e)) return t;
19
56
  let n = new Set(t);
20
57
  return n.add(e), n;
21
58
  });
22
- }, []), R = c((e) => {
23
- E((t) => {
59
+ }, [W]), Y = f((e) => {
60
+ j((t) => {
24
61
  if (!t.has(e)) return t;
25
62
  let n = new Set(t);
26
63
  return n.delete(e), n;
27
64
  });
28
- }, []), z = c((t, o, c, l, u, d, f = p.Append) => {
29
- let h = d ?? s(), C = r(t);
30
- k.current = h, A.current = C, P.current.set(C, h), O(C);
31
- let T;
32
- f === p.Regenerate ? T = c : f === p.Edit && (T = c - 1);
33
- let E = () => P.current.get(C) !== h, D = y(C, h), j = _.current?.messages[c];
34
- j ? M.current.set(C, {
35
- generationId: h,
36
- messageIndex: c,
37
- message: j
38
- }) : M.current.delete(C), L(C), S?.notifyGenerationStart?.(), x?.ensureConnected();
39
- let F = {
40
- signal: D.signal,
65
+ }, []), X = f((e, t) => {
66
+ N((n) => {
67
+ if (n.has(e) === t) return n;
68
+ let r = new Set(n);
69
+ return t ? r.add(e) : r.delete(e), r;
70
+ });
71
+ }, []), Z = f((e, t) => {
72
+ P.current.get(e) === t && (P.current.delete(e), X(e, !1));
73
+ }, [X]), Q = oe(() => ee({
74
+ transport: b,
75
+ setConversation: v,
76
+ conversationRef: y,
77
+ resumingPathsRef: F,
78
+ bufferedGenerationsRef: I,
79
+ addStreamingPath: J,
80
+ removeStreamingPath: Y,
81
+ isPathDisplayed: q,
82
+ generationPersistenceErrorMessage: T,
83
+ frameScheduler: D ? k : void 0,
84
+ stoppedGenerationIdsRef: L,
85
+ onReloadError: G,
86
+ onReloadSuccess: W
87
+ }), [
88
+ J,
89
+ Y,
90
+ q,
91
+ b,
92
+ T,
93
+ D,
94
+ k,
95
+ G,
96
+ W
97
+ ]), ge = f((t, n, o, ee, re, f, p = g.Append, oe = {}) => {
98
+ let m = f ?? ae(), h = s(t);
99
+ k.flush(h), F.current.delete(h), P.current.set(h, m), pe.current.set(h, m), X(h, !0);
100
+ let _;
101
+ p === g.Regenerate ? _ = o : p === g.Edit && (_ = o - 1);
102
+ let w = () => pe.current.get(h) !== m, E = ue(h, m), D = y.current?.messages[o];
103
+ D ? I.current.set(h, {
104
+ generationId: m,
105
+ messageIndex: o,
106
+ message: D
107
+ }) : I.current.delete(h), J(h), C?.notifyGenerationStart?.(), S?.ensureConnected();
108
+ let A = () => {
109
+ w() || Y(h), Z(h, m), x(h, m), S?.notifyGenerationSettled?.();
110
+ }, j = () => {
111
+ if (w()) return;
112
+ let e = I.current.get(h);
113
+ !e || e.generationId !== m || (e.message = {
114
+ ...e.message,
115
+ streamErrorMessage: T
116
+ }, O.current?.(new i()), q(h) && v((t) => {
117
+ if (!t || w() || !q(h)) return t;
118
+ let n = l(t, e);
119
+ return y.current = n, n;
120
+ }));
121
+ }, M = I.current.get(h), N = () => R.current && !w() && I.current.get(h) === M, z = async () => {
122
+ if (N()) {
123
+ if (!q(h)) {
124
+ M && I.current.delete(h);
125
+ return;
126
+ }
127
+ try {
128
+ let n = await b.getConversation(e(t));
129
+ if (!N()) return;
130
+ if (W(h), !q(h)) {
131
+ M && I.current.delete(h);
132
+ return;
133
+ }
134
+ if (u(n) !== -1) {
135
+ Q(t, n, { seedMessage: M?.message });
136
+ return;
137
+ }
138
+ if (M && M.messageIndex === n.messages.length - 1 && d(n) && ne(M.message)) {
139
+ j();
140
+ return;
141
+ }
142
+ M && I.current.delete(h), v(n), y.current = n;
143
+ } catch {
144
+ N() && G(h, z, N);
145
+ }
146
+ }
147
+ }, B = {
148
+ signal: E.signal,
41
149
  onChunk: (e) => {
42
- if (k.current !== h) return;
43
- let t = M.current.get(C);
44
- if (t?.generationId === h) {
45
- let n = i([t.message], 0, e);
150
+ if (w()) return;
151
+ let t = I.current.get(h);
152
+ if (t?.generationId === m) {
153
+ let n = c([t.message], 0, e);
46
154
  n && (t.message = n[0]);
47
155
  }
48
- I(C) && g((t) => {
49
- if (!t) return t;
50
- let n = M.current.get(C), r;
51
- if (n?.generationId === h) r = a(t, n);
52
- else {
53
- let n = i(t.messages, c, e);
54
- if (!n) return t;
55
- r = {
56
- ...t,
57
- messages: n
58
- };
156
+ if (q(h)) {
157
+ if (fe.current && t?.generationId === m) {
158
+ k.schedule(h, () => {
159
+ let e = I.current.get(h);
160
+ if (w() || !q(h) || e?.generationId !== m) return;
161
+ let t = { ...e };
162
+ v((e) => {
163
+ if (!e) return e;
164
+ let n = l(e, t);
165
+ return y.current = n, n;
166
+ });
167
+ });
168
+ return;
59
169
  }
60
- return _.current = r, r;
61
- });
170
+ v((t) => {
171
+ if (!t) return t;
172
+ let n = I.current.get(h), r;
173
+ if (n?.generationId === m) r = l(t, n);
174
+ else {
175
+ let n = c(t.messages, o, e);
176
+ if (!n) return t;
177
+ r = {
178
+ ...t,
179
+ messages: n
180
+ };
181
+ }
182
+ return y.current = r, r;
183
+ });
184
+ }
62
185
  },
63
186
  onComplete: async () => {
64
- if (M.current.get(C)?.generationId === h && M.current.delete(C), E() || R(C), k.current === h && (k.current = null, A.current = null, O(null)), b(C, h), x?.notifyGenerationSettled?.(), N.current.has(h) ? N.current.delete(h) : E() || S?.notifyGenerationEnd?.(), !E() && I(C)) try {
65
- let n = await v.getConversation(e(t));
66
- if (E() || !I(C)) return;
67
- g(n), _.current = n;
68
- } catch {}
187
+ k.flush(h), A(), L.current.has(m) ? L.current.delete(m) : w() || C?.notifyGenerationEnd?.(), await z();
69
188
  },
70
189
  onError: (e) => {
71
- let t = M.current.get(C), r = t?.generationId === h ? t : void 0;
72
- if (r && M.current.delete(C), E() || R(C), k.current === h && (k.current = null, A.current = null, O(null)), b(C, h), x?.notifyGenerationSettled?.(), E() || !I(C)) return;
73
- let i = e instanceof n ? w : e.message;
74
- g((e) => {
75
- if (!e) return e;
76
- let t = r?.generationId === h ? a(e, r) : e, n = {
77
- ...t,
78
- messages: t.messages.map((e, t) => t === c ? {
79
- ...e,
80
- streamErrorMessage: i
81
- } : e)
82
- };
83
- return _.current = n, n;
190
+ if (k.flush(h), O.current?.(e), e instanceof a && !w()) {
191
+ he(e);
192
+ return;
193
+ }
194
+ if (e instanceof r && oe.resumeOnConflict && !w()) {
195
+ K(e);
196
+ return;
197
+ }
198
+ V(e);
199
+ }
200
+ }, V = (e) => {
201
+ let t = I.current.get(h), n = t?.generationId === m ? t : void 0;
202
+ if (n && !(e instanceof i) && I.current.delete(h), A(), n && b.saveConversation && e instanceof i && e.status === ce) {
203
+ me(e, n, b.saveConversation.bind(b));
204
+ return;
205
+ }
206
+ H(e, n);
207
+ }, H = (e, t) => {
208
+ if (t && e instanceof i && (t.message = {
209
+ ...t.message,
210
+ streamErrorMessage: T
211
+ }), w() || !q(h)) return;
212
+ let n = le(e, de, T);
213
+ v((e) => {
214
+ if (!e || w() || !q(h)) return e;
215
+ let r = t?.generationId === m ? l(e, t) : e, i = {
216
+ ...r,
217
+ messages: r.messages.map((e, t) => t === o ? {
218
+ ...e,
219
+ streamErrorMessage: n
220
+ } : e)
221
+ };
222
+ return y.current = i, i;
223
+ });
224
+ }, me = async (n, r, i) => {
225
+ let a = () => R.current && !w() && I.current.get(h) === r;
226
+ try {
227
+ let o = await b.getConversation(e(t));
228
+ if (!a()) return;
229
+ if (r.messageIndex !== o.messages.length - 1 || !d(o)) {
230
+ H(n, r);
231
+ return;
232
+ }
233
+ let s = await i(h, l(o, r));
234
+ if (!a() || (I.current.delete(h), !q(h))) return;
235
+ v(s), y.current = s;
236
+ } catch {
237
+ a() && H(n, r);
238
+ }
239
+ }, U = () => {
240
+ A(), L.current.has(m) ? L.current.delete(m) : w() || C?.notifyGenerationEnd?.();
241
+ }, he = async (n) => {
242
+ F.current.add(h), ge(await te(() => b.getConversation(e(t)), w), n, !1);
243
+ }, K = async (n) => {
244
+ P.current.get(h) === m && X(h, !1), F.current.add(h), ge(await te(() => b.getConversation(e(t)), w, (e) => e.messages.length === o && e.messages.at(-1)?.role === ie.User), n, !0);
245
+ }, ge = (e, n, r) => {
246
+ if (w()) {
247
+ A();
248
+ return;
249
+ }
250
+ let i = e?.messages[e.messages.length - 1], a = e != null && e.messages.length - 1 === o && i?.role === ie.Assistant, s = r && e != null && u(e) !== -1;
251
+ if (!e || !a && !s) {
252
+ F.current.delete(h), V(n);
253
+ return;
254
+ }
255
+ let c = I.current.get(h), l = c?.generationId === m ? c : void 0;
256
+ if (d(e)) {
257
+ Q(t, e, {
258
+ seedMessage: a ? l?.message : void 0,
259
+ skipDedupe: !0,
260
+ onSettled: U
84
261
  });
262
+ return;
85
263
  }
264
+ F.current.delete(h), l && I.current.delete(h), q(h) && (v(e), y.current = e), U();
86
265
  };
87
266
  (async () => {
88
267
  try {
89
- let e = x?.channelId ?? await x?.waitForChannel(m) ?? void 0, t = N.current.has(h);
90
- if (D.signal.aborted || E() || t) {
91
- M.current.get(C)?.generationId === h && M.current.delete(C), E() || R(C), k.current === h && (k.current = null, A.current = null, O(null)), b(C, h), x?.notifyGenerationSettled?.(), t ? N.current.delete(h) : E() || S?.notifyGenerationEnd?.();
268
+ let e = S?.channelId ?? await S?.waitForChannel(se) ?? void 0, t = L.current.has(m);
269
+ if (E.signal.aborted || w() || t) {
270
+ I.current.get(h)?.generationId === m && I.current.delete(h), w() || Y(h), Z(h, m), x(h, m), S?.notifyGenerationSettled?.(), t ? L.current.delete(m) : w() || C?.notifyGenerationEnd?.();
92
271
  return;
93
272
  }
94
- v.streamCompletion(C, o, l, F, u, h, f, T, e);
273
+ b.streamCompletion(h, n, ee, B, re, m, p, _, e);
95
274
  } catch (e) {
96
- F.onError(e instanceof Error ? e : Error(String(e)));
275
+ B.onError(e instanceof Error ? e : Error(String(e)));
97
276
  }
98
277
  })();
99
278
  }, [
100
- y,
279
+ ue,
280
+ x,
281
+ J,
282
+ Y,
283
+ X,
284
+ Z,
285
+ q,
286
+ S?.channelId,
287
+ S?.ensureConnected,
288
+ S?.waitForChannel,
289
+ S?.notifyGenerationSettled,
290
+ C,
101
291
  b,
102
- L,
103
- R,
104
- I,
105
- x?.channelId,
106
- x?.ensureConnected,
107
- x?.waitForChannel,
108
- x?.notifyGenerationSettled,
109
- S,
110
- v,
111
- w
112
- ]), B = c((e, t) => {
113
- let n = r(e), i = M.current.get(n);
114
- return i ? a(t, i) : t;
115
- }, []), V = c(() => {
116
- let e = k.current;
117
- if (!e || !h) return;
118
- let t = r(h);
119
- A.current === t && (N.current.add(e), S?.notifyStopGenerating?.(), v.stopCompletion({
120
- generationId: e,
121
- path: t
292
+ Q,
293
+ de,
294
+ T,
295
+ k,
296
+ G,
297
+ W
298
+ ]), _e = f((e, t) => {
299
+ let n = s(e), r = I.current.get(n);
300
+ return z.current.get(n)?.isCurrent() && r && t.messages.length - 1 >= r.messageIndex && t.messages[r.messageIndex].role === ie.Assistant && !d(t) ? (W(n), I.current.delete(n), t) : r ? l(t, r) : t;
301
+ }, [W]), ve = f(() => {
302
+ if (!o) return;
303
+ let e = s(o), t = P.current.get(e) ?? _(y.current);
304
+ if (!t) return;
305
+ L.current.add(t), k.flush(e), C?.notifyStopGenerating?.();
306
+ let n = I.current.get(e)?.message.content;
307
+ b.stopCompletion({
308
+ generationId: t,
309
+ path: e,
310
+ content: n
122
311
  }).catch((e) => {
123
312
  let t = e instanceof Error ? e : Error(String(e));
124
- C?.(t);
125
- }));
313
+ w?.(t);
314
+ });
126
315
  }, [
127
- h,
316
+ o,
317
+ y,
318
+ k,
319
+ w,
128
320
  C,
129
- S,
130
- v
131
- ]), H = u(() => o({
132
- transport: v,
133
- setConversation: g,
134
- conversationRef: _,
135
- resumingPathsRef: j,
136
- bufferedGenerationsRef: M,
137
- addStreamingPath: L,
138
- removeStreamingPath: R,
139
- isPathDisplayed: I
140
- }), [
141
- L,
142
- R,
143
- I,
144
- v
145
- ]), U = h != null && T.has(r(h)), W = h == null ? null : r(h);
321
+ b
322
+ ]), ye = f((e, t) => Q(e, t), [Q]), be = o != null && A.has(s(o)), $ = o == null ? null : s(o), xe = $ != null && (M.has($) || be && _(y.current) != null), Se = $ ? B.get($) : void 0, Ce = Se?.isCurrent() ?? !1;
146
323
  return {
147
- startStream: z,
148
- handleStop: V,
149
- resumeIfAwaitingGeneration: H,
150
- restoreBufferedGeneration: B,
151
- isStreaming: U,
152
- canStopStreaming: W != null && D === W
324
+ hasConversationReloadError: Ce,
325
+ isReloadingConversation: !!Se && Ce && me.has(Se),
326
+ retryConversationReload: he,
327
+ startStream: ge,
328
+ handleStop: ve,
329
+ resumeIfAwaitingGeneration: ye,
330
+ restoreBufferedGeneration: _e,
331
+ isStreaming: be,
332
+ canStopStreaming: xe
153
333
  };
154
334
  };
155
335
  //#endregion
156
- export { h as useConversationStream };
336
+ export { v as useConversationStream };
@@ -0,0 +1,189 @@
1
+ import { useCallback as e, useEffect as t, useLayoutEffect as n, useMemo as r, useRef as i, useState as a } from "react";
2
+ //#region src/conversation/useMessageSelectionReply/useMessageSelectionReply.ts
3
+ var o = "button,input,textarea,select,iframe,[role=\"button\"],[contenteditable=\"true\"],[hidden],[inert],[aria-hidden=\"true\"]", s = [], c = (e, t) => e?.startContainer === t.startContainer && e.startOffset === t.startOffset && e.endContainer === t.endContainer && e.endOffset === t.endOffset, l = (e, t) => {
4
+ let n = window.visualViewport, r = n?.offsetLeft ?? 0, i = n?.offsetTop ?? 0, a = r + (n?.width ?? document.documentElement.clientWidth), o = i + (n?.height ?? document.documentElement.clientHeight);
5
+ for (let e = t; e; e = e.parentElement) {
6
+ let t = getComputedStyle(e);
7
+ if (t.display === "none" || t.visibility === "hidden") return;
8
+ let n = e.getBoundingClientRect();
9
+ /(hidden|clip|auto|scroll)/.test(t.overflowX) && (r = Math.max(r, n.left), a = Math.min(a, n.right)), /(hidden|clip|auto|scroll)/.test(t.overflowY) && (i = Math.max(i, n.top), o = Math.min(o, n.bottom));
10
+ }
11
+ return Array.from(e.getClientRects()).find((e) => e.width > 0 && e.height > 0 && e.left < a && e.right > r && e.top < o && e.bottom > i);
12
+ }, u = ({ conversationId: u, enabled: d, droppedFiles: f, onDroppedFilesConsumed: p }) => {
13
+ let m = i(/* @__PURE__ */ new Set()), h = i(null), g = i(null), _ = i(null), [v, y] = a(null), [b, x] = a({
14
+ conversationId: u,
15
+ files: []
16
+ }), [S, C] = a(), [w, T] = a(0), E = i(/* @__PURE__ */ new WeakSet()), D = i({
17
+ conversationId: u,
18
+ enabled: d
19
+ });
20
+ n(() => {
21
+ D.current = {
22
+ conversationId: u,
23
+ enabled: d
24
+ };
25
+ }, [u, d]);
26
+ let O = e(() => {
27
+ _.current = g.current?.range.cloneRange() ?? null, g.current = null, y(null);
28
+ }, []), k = e((e) => {
29
+ if (e) return m.current.add(e), () => {
30
+ m.current.delete(e), g.current?.body === e && O();
31
+ };
32
+ }, [O]);
33
+ t(() => {
34
+ O(), _.current = null, E.current = /* @__PURE__ */ new WeakSet(), x({
35
+ conversationId: u,
36
+ files: []
37
+ }), T(0), C(void 0);
38
+ }, [u, O]), t(() => {
39
+ if (!d) {
40
+ O(), x({
41
+ conversationId: u,
42
+ files: []
43
+ });
44
+ return;
45
+ }
46
+ let e = 0, t = !1, n = !1, r = !1, i = () => {
47
+ if (e = 0, t || n || r || h.current?.contains(document.activeElement)) return;
48
+ let i = window.getSelection();
49
+ if (!i || i.rangeCount !== 1 || i.isCollapsed || !i.toString().trim()) {
50
+ O();
51
+ return;
52
+ }
53
+ let a = i.getRangeAt(0);
54
+ if (c(_.current, a)) return;
55
+ let s = [...m.current].find((e) => e.contains(a.startContainer) && e.contains(a.endContainer));
56
+ if (!s || !s.isConnected) {
57
+ O();
58
+ return;
59
+ }
60
+ let d = a.cloneContents();
61
+ d.querySelectorAll(o).forEach((e) => e.remove());
62
+ let f = a.commonAncestorContainer;
63
+ if ((f instanceof Element ? f : f.parentElement)?.closest(o) || !d.textContent?.trim()) {
64
+ O();
65
+ return;
66
+ }
67
+ let p = l(a, s);
68
+ if (!p) {
69
+ O();
70
+ return;
71
+ }
72
+ let v = {
73
+ conversationId: u,
74
+ body: s,
75
+ range: a.cloneRange(),
76
+ text: i.toString(),
77
+ rect: p
78
+ };
79
+ g.current = v, y(v);
80
+ }, a = () => {
81
+ e && cancelAnimationFrame(e), e = requestAnimationFrame(i);
82
+ }, s = () => {
83
+ e && cancelAnimationFrame(e), e = requestAnimationFrame(() => {
84
+ e = 0;
85
+ let t = g.current;
86
+ if (!t) return;
87
+ let n = l(t.range, t.body);
88
+ if (!n) O();
89
+ else {
90
+ let e = {
91
+ ...t,
92
+ rect: n
93
+ };
94
+ g.current = e, y(e);
95
+ }
96
+ });
97
+ }, f = (e) => {
98
+ t = h.current?.contains(e.target) ?? !1, n = !t, t || (O(), [...m.current].some((t) => t.contains(e.target)) && (_.current = null));
99
+ }, p = () => {
100
+ n = !1, t || a(), t = !1;
101
+ }, v = () => {
102
+ n = !1, r = !1, t = !1, O();
103
+ let e = window.getSelection();
104
+ _.current = e?.rangeCount ? e.getRangeAt(0).cloneRange() : null;
105
+ }, b = (e) => {
106
+ if (!h.current?.contains(document.activeElement) && (e.shiftKey && [
107
+ "ArrowLeft",
108
+ "ArrowRight",
109
+ "ArrowUp",
110
+ "ArrowDown",
111
+ "Home",
112
+ "End",
113
+ "PageUp",
114
+ "PageDown"
115
+ ].includes(e.key) || (e.ctrlKey || e.metaKey) && e.key.toLowerCase() === "a")) {
116
+ r = !0, O(), _.current = null;
117
+ return;
118
+ }
119
+ if (g.current) {
120
+ if (e.key === "Escape") {
121
+ O();
122
+ return;
123
+ }
124
+ if (e.key === "Tab" && !e.shiftKey && !h.current?.contains(document.activeElement)) {
125
+ let t = h.current?.querySelector("button");
126
+ t && (e.preventDefault(), t.focus());
127
+ }
128
+ }
129
+ }, S = (e) => {
130
+ r && !e.shiftKey && (r = !1), e.key !== "Escape" && e.key !== "Tab" && a();
131
+ }, C = new MutationObserver((e) => {
132
+ let t = g.current;
133
+ t && (!t.body.isConnected || e.some((e) => t.body.contains(e.target))) && O();
134
+ });
135
+ return C.observe(document.body, {
136
+ subtree: !0,
137
+ childList: !0,
138
+ characterData: !0,
139
+ attributes: !0,
140
+ attributeFilter: [
141
+ "class",
142
+ "style",
143
+ "hidden",
144
+ "inert"
145
+ ]
146
+ }), document.addEventListener("selectionchange", a), document.addEventListener("pointerdown", f, !0), document.addEventListener("pointerup", p, !0), document.addEventListener("pointercancel", v, !0), window.addEventListener("blur", v), document.addEventListener("keydown", b), document.addEventListener("keyup", S), document.addEventListener("scroll", s, !0), window.addEventListener("resize", s), window.visualViewport?.addEventListener("resize", s), window.visualViewport?.addEventListener("scroll", s), () => {
147
+ cancelAnimationFrame(e), C.disconnect(), document.removeEventListener("selectionchange", a), document.removeEventListener("pointerdown", f, !0), document.removeEventListener("pointerup", p, !0), document.removeEventListener("pointercancel", v, !0), window.removeEventListener("blur", v), document.removeEventListener("keydown", b), document.removeEventListener("keyup", S), document.removeEventListener("scroll", s, !0), window.removeEventListener("resize", s), window.visualViewport?.removeEventListener("resize", s), window.visualViewport?.removeEventListener("scroll", s);
148
+ };
149
+ }, [
150
+ u,
151
+ O,
152
+ d
153
+ ]);
154
+ let A = e(() => {
155
+ let e = g.current;
156
+ if (!D.current.enabled || !e || e.conversationId !== D.current.conversationId || !e.body.isConnected || !l(e.range, e.body)) return;
157
+ let t = new File([e.text], `reply-${crypto.randomUUID()}.txt`, { type: "text/plain" });
158
+ E.current.add(t), T(0), x((n) => ({
159
+ conversationId: e.conversationId,
160
+ files: [...n.conversationId === e.conversationId ? n.files : [], t]
161
+ })), C((e) => (e ?? 0) + 1), O(), window.getSelection()?.removeAllRanges();
162
+ }, [O]), j = d && b.conversationId === u ? b.files : s, M = r(() => [...f, ...j], [f, j]), N = e(() => {
163
+ f.length && p(), x((e) => ({
164
+ ...e,
165
+ files: e.files.filter((e) => !j.includes(e))
166
+ }));
167
+ }, [
168
+ f,
169
+ p,
170
+ j
171
+ ]), P = e((e) => {
172
+ let t = e.filter((e) => e.file && E.current.has(e.file));
173
+ t.length && (t.forEach((e) => E.current.delete(e.file)), T((e) => e + 1));
174
+ }, []);
175
+ return {
176
+ contentRef: k,
177
+ actionRef: h,
178
+ selection: d && v?.conversationId === u ? v : null,
179
+ onReply: A,
180
+ dismiss: O,
181
+ pendingFiles: M,
182
+ onFilesConsumed: N,
183
+ focusRequestId: S,
184
+ onAttachmentsChange: P,
185
+ addedRevision: w
186
+ };
187
+ };
188
+ //#endregion
189
+ export { u as useMessageSelectionReply };