@epam/ai-dial-chat-hooks 1.2.0-dev.28 → 1.2.0-dev.282

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 (94) hide show
  1. package/api-error/api-error.js +7 -4
  2. package/attachment/useAttachmentValidation/useAttachmentValidation.js +26 -19
  3. package/attachments.d.ts +10 -4
  4. package/catalog/catalog-derivations.js +1 -1
  5. package/catalog/deployment-id.js +8 -2
  6. package/catalog/map-deployment-limits-to-catalog.js +16 -24
  7. package/catalog/map-deployment-limits-to-input.js +81 -9
  8. package/catalog/map-deployment-to-catalog-item.js +34 -34
  9. package/catalog/map-entity-details-to-catalog.js +7 -0
  10. package/catalog/map-skill-to-catalog-item.js +55 -48
  11. package/catalog/publish.js +6 -5
  12. package/catalog/useApplicationCredentials/useApplicationCredentials.js +39 -0
  13. package/catalog/useCatalogEditNavigation/useCatalogEditNavigation.js +122 -101
  14. package/catalog/usePublishFolders/usePublishFolders.js +1 -1
  15. package/catalog/useSkillDetailsPanelData/useSkillDetailsPanelData.js +39 -39
  16. package/catalog/useSkillItemDetails.js +17 -13
  17. package/catalog.d.ts +139 -34
  18. package/catalog.js +23 -22
  19. package/conversation/conversation-transfer/export-conversation.js +24 -16
  20. package/conversation/conversation-transfer/import-conversation.js +80 -31
  21. package/conversation/conversation-transfer/queue.js +8 -5
  22. package/conversation/create-chat-stream-api.js +85 -49
  23. package/conversation/message-utils.js +44 -2
  24. package/conversation/stage.js +27 -0
  25. package/conversation/useActiveConversationSync/useActiveConversationSync.js +7 -8
  26. package/conversation/useConversationExport/useConversationExport.js +9 -9
  27. package/conversation/useConversationHandlers/useConversationHandlers.js +73 -57
  28. package/conversation/useConversationImport/useConversationImport.js +123 -121
  29. package/conversation/useConversationPanelItems/useConversationPanelItems.js +50 -32
  30. package/conversation/useConversationScroll/useConversationScroll.js +68 -64
  31. package/conversation/useConversationStream/apply-chunk.js +1 -1
  32. package/conversation/useConversationStream/frame-scheduler.js +39 -0
  33. package/conversation/useConversationStream/generation-resume.js +122 -64
  34. package/conversation/useConversationStream/useConversationStream.js +265 -116
  35. package/conversation/useMessageSelectionReply/useMessageSelectionReply.js +189 -0
  36. package/conversation-sources/useConversationSources/useConversationSources.js +31 -24
  37. package/conversation-sources.d.ts +1 -1
  38. package/conversation-transfer.d.ts +2 -1
  39. package/conversation.d.ts +295 -17
  40. package/conversation.js +32 -29
  41. package/file-manager-canvas.d.ts +53 -5
  42. package/file-manager.d.ts +156 -26
  43. package/file-manager.js +25 -23
  44. package/files/attachment-canvas.js +74 -40
  45. package/files/attachment-types.js +14 -13
  46. package/files/dial-file-manager-mapping.util.js +2 -1
  47. package/files/dial-file-manager-path.util.js +23 -1
  48. package/files/dial-file-manager.model.js +23 -19
  49. package/files/dial-file-manager.types.js +3 -3
  50. package/files/useDialFileListing/useDialFileListing.js +139 -127
  51. package/files/useDialFileManager/useDialFileManager.js +132 -128
  52. package/files/useDialFileManagerSections/useDialFileManagerSections.js +155 -0
  53. package/files/useDialFileManagerTabConfig/useDialFileManagerTabConfig.js +20 -19
  54. package/files/useDialFileMutations/useDialFileMutations.js +33 -32
  55. package/files/useDialFileUploadBatch/useDialFileUploadBatch.js +117 -110
  56. package/files/useFileAttachmentPicker/useFileAttachmentPicker.js +49 -0
  57. package/index.d.ts +1178 -112
  58. package/index.js +136 -122
  59. package/mcp-apps/useMcpAppHostAdapter/useMcpAppHostAdapter.js +7 -5
  60. package/mcp-apps/useMcpAppHostContext/useMcpAppHostContext.js +1 -1
  61. package/mcp-apps/useMcpAppTools/useMcpAppTools.js +1 -1
  62. package/mcp-apps/useOpenMcpAppCanvas/useOpenMcpAppCanvas.js +25 -23
  63. package/mcp-apps.d.ts +8 -6
  64. package/oauth/toolset-id.js +5 -3
  65. package/oauth/useToolsetLogin/useToolsetLogin.js +8 -8
  66. package/oauth.d.ts +32 -0
  67. package/oauth.js +9 -9
  68. package/package.json +26 -21
  69. package/scheduled-task/scheduled-task-description.js +81 -0
  70. package/scheduled-task/scheduled-task-preparation.js +24 -0
  71. package/scheduled-task/scheduled-task-trigger.js +74 -71
  72. package/scheduled-task/scheduled-tasks-api-client.js +19 -0
  73. package/scheduled-task/use-scheduled-task-runs.js +194 -0
  74. package/scheduled-task/use-scheduled-tasks.js +93 -0
  75. package/scheduled-tasks.d.ts +197 -3
  76. package/scheduled-tasks.js +7 -2
  77. package/shared/application-schema.js +5 -2
  78. package/shared/cron-day-of-month.js +13 -0
  79. package/skill/skill-archive.js +19 -0
  80. package/skill/skill-types.js +8 -7
  81. package/skill/skill.js +53 -27
  82. package/skill/useSkillArchiveImport/useSkillArchiveImport.js +79 -0
  83. package/skill/useSkillEditorLoad.js +65 -59
  84. package/skill/useSkillEditorSubmit.js +108 -84
  85. package/skill/useSkillFileActions.js +70 -58
  86. package/skill-editor.d.ts +160 -8
  87. package/skill-editor.js +9 -8
  88. package/usage/map-usage-data-to-dashboard.js +66 -0
  89. package/usage/map-user-usage-to-model-limits.js +202 -0
  90. package/usage.d.ts +125 -0
  91. package/usage.js +3 -0
  92. package/usePageFileDrag/usePageFileDrag.js +3 -3
  93. package/utils.d.ts +26 -6
  94. package/utils.js +10 -10
@@ -1,156 +1,305 @@
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 f, generateUUID as ie } from "@epam/ai-dial-chat-shared";
9
+ import { useCallback as p, useEffect as m, useMemo as ae, useRef as h, useState as g } from "react";
10
+ import { SendCompletionDtoModeEnum as oe } 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 = (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: le, completeGeneration: x }, channel: S, overlay: C, onStopError: w, generationConflictMessage: ue = t, generationPersistenceErrorMessage: T = n, onStreamError: E, batchChunksPerFrame: D = !1 }) => {
17
+ let O = h(E);
18
+ m(() => {
19
+ O.current = E;
20
+ }, [E]);
21
+ let de = h(D);
22
+ m(() => {
23
+ de.current = D;
24
+ }, [D]);
25
+ let [k] = g(re), [A, j] = g(() => /* @__PURE__ */ new Set()), [M, N] = g(null), P = h(null), F = h(null), I = h(/* @__PURE__ */ new Set()), L = h(/* @__PURE__ */ new Map()), R = h(/* @__PURE__ */ new Set()), fe = h(/* @__PURE__ */ new Map()), z = h(!0), B = h(/* @__PURE__ */ new Map()), [V, H] = g(B.current), U = h(/* @__PURE__ */ new Set()), [W, G] = g(U.current);
26
+ m(() => (z.current = !0, () => {
27
+ z.current = !1;
28
+ }), []);
29
+ let K = p((e) => {
30
+ if (!B.current.has(e)) return;
31
+ let t = new Map(B.current);
32
+ t.delete(e), B.current = t, z.current && H(t);
33
+ }, []), q = p((e, t, n) => {
34
+ if (!z.current || !n()) return;
35
+ let r = new Map(B.current);
36
+ r.set(e, {
37
+ retry: t,
38
+ isCurrent: n
39
+ }), B.current = r, H(r);
40
+ }, []), pe = p(async () => {
41
+ if (!o) return;
42
+ let e = B.current.get(s(o));
43
+ if (!(!e || !e.isCurrent() || U.current.has(e))) {
44
+ U.current.add(e), G(new Set(U.current));
45
+ try {
46
+ await e.retry();
47
+ } finally {
48
+ U.current.delete(e), z.current && G(new Set(U.current));
49
+ }
50
+ }
51
+ }, [o]), J = h(o);
52
+ m(() => (J.current = o, () => k.cancelAll()), [o, k]);
53
+ let Y = p((e) => z.current && s(J.current ?? "") === e, []), X = p((e) => {
54
+ K(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
+ }, [K]), Z = p((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, {
65
+ }, []), Q = ae(() => ee({
66
+ transport: b,
67
+ setConversation: v,
68
+ conversationRef: y,
69
+ resumingPathsRef: I,
70
+ bufferedGenerationsRef: L,
71
+ addStreamingPath: X,
72
+ removeStreamingPath: Z,
73
+ isPathDisplayed: Y,
74
+ generationPersistenceErrorMessage: T,
75
+ frameScheduler: D ? k : void 0,
76
+ stoppedGenerationIdsRef: R,
77
+ onReloadError: q,
78
+ onReloadSuccess: K
79
+ }), [
80
+ X,
81
+ Z,
82
+ Y,
83
+ b,
84
+ T,
85
+ D,
86
+ k,
87
+ q,
88
+ K
89
+ ]), me = p((t, n, o, ee, re, p, m = oe.Append, ae = {}) => {
90
+ let h = p ?? ie(), g = s(t);
91
+ k.flush(g), I.current.delete(g), P.current = h, F.current = g, fe.current.set(g, h), N(g);
92
+ let _;
93
+ m === oe.Regenerate ? _ = o : m === oe.Edit && (_ = o - 1);
94
+ let w = () => fe.current.get(g) !== h, E = le(g, h), D = y.current?.messages[o];
95
+ D ? L.current.set(g, {
35
96
  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,
97
+ messageIndex: o,
98
+ message: D
99
+ }) : L.current.delete(g), X(g), C?.notifyGenerationStart?.(), S?.ensureConnected();
100
+ let A = () => {
101
+ w() || Z(g), P.current === h && (P.current = null, F.current = null, N(null)), x(g, h), S?.notifyGenerationSettled?.();
102
+ }, j = () => {
103
+ if (w()) return;
104
+ let e = L.current.get(g);
105
+ !e || e.generationId !== h || (e.message = {
106
+ ...e.message,
107
+ streamErrorMessage: T
108
+ }, O.current?.(new i()), Y(g) && v((t) => {
109
+ if (!t || w() || !Y(g)) return t;
110
+ let n = l(t, e);
111
+ return y.current = n, n;
112
+ }));
113
+ }, M = L.current.get(g), B = () => z.current && !w() && L.current.get(g) === M, V = async () => {
114
+ if (B()) {
115
+ if (!Y(g)) {
116
+ M && L.current.delete(g);
117
+ return;
118
+ }
119
+ try {
120
+ let n = await b.getConversation(e(t));
121
+ if (!B()) return;
122
+ if (K(g), !Y(g)) {
123
+ M && L.current.delete(g);
124
+ return;
125
+ }
126
+ if (u(n) !== -1) {
127
+ Q(t, n, { seedMessage: M?.message });
128
+ return;
129
+ }
130
+ if (M && M.messageIndex === n.messages.length - 1 && d(n) && ne(M.message)) {
131
+ j();
132
+ return;
133
+ }
134
+ M && L.current.delete(g), v(n), y.current = n;
135
+ } catch {
136
+ B() && q(g, V, B);
137
+ }
138
+ }
139
+ }, H = {
140
+ signal: E.signal,
41
141
  onChunk: (e) => {
42
- if (k.current !== h) return;
43
- let t = M.current.get(C);
142
+ if (P.current !== h) return;
143
+ let t = L.current.get(g);
44
144
  if (t?.generationId === h) {
45
- let n = i([t.message], 0, e);
145
+ let n = c([t.message], 0, e);
46
146
  n && (t.message = n[0]);
47
147
  }
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
- };
148
+ if (Y(g)) {
149
+ if (de.current && t?.generationId === h) {
150
+ k.schedule(g, () => {
151
+ let e = L.current.get(g);
152
+ if (P.current !== h || !Y(g) || e?.generationId !== h) return;
153
+ let t = { ...e };
154
+ v((e) => {
155
+ if (!e) return e;
156
+ let n = l(e, t);
157
+ return y.current = n, n;
158
+ });
159
+ });
160
+ return;
59
161
  }
60
- return _.current = r, r;
61
- });
162
+ v((t) => {
163
+ if (!t) return t;
164
+ let n = L.current.get(g), r;
165
+ if (n?.generationId === h) r = l(t, n);
166
+ else {
167
+ let n = c(t.messages, o, e);
168
+ if (!n) return t;
169
+ r = {
170
+ ...t,
171
+ messages: n
172
+ };
173
+ }
174
+ return y.current = r, r;
175
+ });
176
+ }
62
177
  },
63
178
  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 {}
179
+ k.flush(g), A(), R.current.has(h) ? R.current.delete(h) : w() || C?.notifyGenerationEnd?.(), await V();
69
180
  },
70
181
  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;
182
+ if (k.flush(g), O.current?.(e), e instanceof a && !w()) {
183
+ G(e);
184
+ return;
185
+ }
186
+ if (e instanceof r && ae.resumeOnConflict && !w()) {
187
+ pe(e);
188
+ return;
189
+ }
190
+ U(e);
191
+ }
192
+ }, U = (e) => {
193
+ let t = L.current.get(g), n = t?.generationId === h ? t : void 0;
194
+ if (n && (e instanceof i ? n.message = {
195
+ ...n.message,
196
+ streamErrorMessage: T
197
+ } : L.current.delete(g)), A(), w() || !Y(g)) return;
198
+ let r = ce(e, ue, T);
199
+ v((e) => {
200
+ if (!e || w() || !Y(g)) return e;
201
+ let t = n?.generationId === h ? l(e, n) : e, i = {
202
+ ...t,
203
+ messages: t.messages.map((e, t) => t === o ? {
204
+ ...e,
205
+ streamErrorMessage: r
206
+ } : e)
207
+ };
208
+ return y.current = i, i;
209
+ });
210
+ }, W = () => {
211
+ A(), R.current.has(h) ? R.current.delete(h) : w() || C?.notifyGenerationEnd?.();
212
+ }, G = async (n) => {
213
+ I.current.add(g), J(await te(() => b.getConversation(e(t)), w), n, !1);
214
+ }, pe = async (n) => {
215
+ P.current === h && N(null), I.current.add(g), J(await te(() => b.getConversation(e(t)), w, (e) => e.messages.length === o && e.messages.at(-1)?.role === f.User), n, !0);
216
+ }, J = (e, n, r) => {
217
+ if (w()) {
218
+ A();
219
+ return;
220
+ }
221
+ let i = e?.messages[e.messages.length - 1], a = e != null && e.messages.length - 1 === o && i?.role === f.Assistant, s = r && e != null && u(e) !== -1;
222
+ if (!e || !a && !s) {
223
+ I.current.delete(g), U(n);
224
+ return;
225
+ }
226
+ let c = L.current.get(g), l = c?.generationId === h ? c : void 0;
227
+ if (d(e)) {
228
+ Q(t, e, {
229
+ seedMessage: a ? l?.message : void 0,
230
+ skipDedupe: !0,
231
+ onSettled: W
84
232
  });
233
+ return;
85
234
  }
235
+ I.current.delete(g), l && L.current.delete(g), Y(g) && (v(e), y.current = e), W();
86
236
  };
87
237
  (async () => {
88
238
  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?.();
239
+ let e = S?.channelId ?? await S?.waitForChannel(se) ?? void 0, t = R.current.has(h);
240
+ if (E.signal.aborted || w() || t) {
241
+ L.current.get(g)?.generationId === h && L.current.delete(g), w() || Z(g), P.current === h && (P.current = null, F.current = null, N(null)), x(g, h), S?.notifyGenerationSettled?.(), t ? R.current.delete(h) : w() || C?.notifyGenerationEnd?.();
92
242
  return;
93
243
  }
94
- v.streamCompletion(C, o, l, F, u, h, f, T, e);
244
+ b.streamCompletion(g, n, ee, H, re, h, m, _, e);
95
245
  } catch (e) {
96
- F.onError(e instanceof Error ? e : Error(String(e)));
246
+ H.onError(e instanceof Error ? e : Error(String(e)));
97
247
  }
98
248
  })();
99
249
  }, [
100
- y,
250
+ le,
251
+ x,
252
+ X,
253
+ Z,
254
+ Y,
255
+ S?.channelId,
256
+ S?.ensureConnected,
257
+ S?.waitForChannel,
258
+ S?.notifyGenerationSettled,
259
+ C,
101
260
  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
261
+ Q,
262
+ ue,
263
+ T,
264
+ k,
265
+ q,
266
+ K
267
+ ]), he = p((e, t) => {
268
+ let n = s(e), r = L.current.get(n);
269
+ return B.current.get(n)?.isCurrent() && r && t.messages.length - 1 >= r.messageIndex && t.messages[r.messageIndex].role === f.Assistant && !d(t) ? (K(n), L.current.delete(n), t) : r ? l(t, r) : t;
270
+ }, [K]), ge = p(() => {
271
+ if (!o) return;
272
+ let e = s(o), t = (F.current === e ? P.current : null) ?? _(y.current);
273
+ if (!t) return;
274
+ R.current.add(t), k.flush(e), C?.notifyStopGenerating?.();
275
+ let n = L.current.get(e)?.message.content;
276
+ b.stopCompletion({
277
+ generationId: t,
278
+ path: e,
279
+ content: n
122
280
  }).catch((e) => {
123
281
  let t = e instanceof Error ? e : Error(String(e));
124
- C?.(t);
125
- }));
282
+ w?.(t);
283
+ });
126
284
  }, [
127
- h,
285
+ o,
286
+ y,
287
+ k,
288
+ w,
128
289
  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);
290
+ b
291
+ ]), _e = p((e, t) => Q(e, t), [Q]), ve = o != null && A.has(s(o)), $ = o == null ? null : s(o), ye = $ != null && (M === $ || ve && _(y.current) != null), be = $ ? V.get($) : void 0, xe = be?.isCurrent() ?? !1;
146
292
  return {
147
- startStream: z,
148
- handleStop: V,
149
- resumeIfAwaitingGeneration: H,
150
- restoreBufferedGeneration: B,
151
- isStreaming: U,
152
- canStopStreaming: W != null && D === W
293
+ hasConversationReloadError: xe,
294
+ isReloadingConversation: !!be && xe && W.has(be),
295
+ retryConversationReload: pe,
296
+ startStream: me,
297
+ handleStop: ge,
298
+ resumeIfAwaitingGeneration: _e,
299
+ restoreBufferedGeneration: he,
300
+ isStreaming: ve,
301
+ canStopStreaming: ye
153
302
  };
154
303
  };
155
304
  //#endregion
156
- export { h as useConversationStream };
305
+ 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 };