@inkeep/agents-ui 0.15.26 → 0.15.28

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 (102) hide show
  1. package/dist/index.cjs +1 -1
  2. package/dist/index.js +166 -174
  3. package/dist/primitives/atoms/dialog.cjs +1 -1
  4. package/dist/primitives/atoms/dialog.js +110 -106
  5. package/dist/primitives/atoms/file-upload.cjs +1 -0
  6. package/dist/primitives/atoms/file-upload.d.ts +35 -0
  7. package/dist/primitives/atoms/file-upload.js +45 -0
  8. package/dist/primitives/atoms/icons/built-in-icons.cjs +1 -1
  9. package/dist/primitives/atoms/icons/built-in-icons.d.ts +8 -1
  10. package/dist/primitives/atoms/icons/built-in-icons.js +86 -79
  11. package/dist/primitives/atoms/icons/collections/pi.cjs +1 -1
  12. package/dist/primitives/atoms/icons/collections/pi.d.ts +6 -0
  13. package/dist/primitives/atoms/icons/collections/pi.js +103 -13
  14. package/dist/primitives/atoms/icons/inkeep-default-icons.cjs +1 -1
  15. package/dist/primitives/atoms/icons/inkeep-default-icons.js +9 -1
  16. package/dist/primitives/components/embedded-chat/file-upload-input.cjs +1 -0
  17. package/dist/primitives/components/embedded-chat/file-upload-input.d.ts +68 -0
  18. package/dist/primitives/components/embedded-chat/file-upload-input.js +328 -0
  19. package/dist/primitives/components/embedded-chat/image-preview-modal.cjs +1 -0
  20. package/dist/primitives/components/embedded-chat/image-preview-modal.d.ts +15 -0
  21. package/dist/primitives/components/embedded-chat/image-preview-modal.js +71 -0
  22. package/dist/primitives/components/embedded-chat/use-inkeep-chat.cjs +3 -3
  23. package/dist/primitives/components/embedded-chat/use-inkeep-chat.d.ts +8 -6
  24. package/dist/primitives/components/embedded-chat/use-inkeep-chat.js +277 -227
  25. package/dist/primitives/components/embedded-chat.cjs +4 -4
  26. package/dist/primitives/components/embedded-chat.d.ts +7 -116
  27. package/dist/primitives/components/embedded-chat.js +1082 -1484
  28. package/dist/primitives/components/embedded-search.d.ts +1 -1
  29. package/dist/primitives/hooks/index.cjs +1 -1
  30. package/dist/primitives/hooks/index.js +15 -14
  31. package/dist/primitives/hooks/use-initial-conversation.cjs +1 -0
  32. package/dist/primitives/hooks/use-initial-conversation.d.ts +16 -0
  33. package/dist/primitives/hooks/use-initial-conversation.js +31 -0
  34. package/dist/primitives/hooks/use-input-notification.cjs +1 -0
  35. package/dist/primitives/hooks/use-input-notification.d.ts +9 -0
  36. package/dist/primitives/hooks/use-input-notification.js +18 -0
  37. package/dist/primitives/hooks/use-scrolling-fades.cjs +1 -1
  38. package/dist/primitives/hooks/use-scrolling-fades.d.ts +1 -0
  39. package/dist/primitives/hooks/use-scrolling-fades.js +21 -5
  40. package/dist/primitives/index.cjs +1 -1
  41. package/dist/primitives/index.js +146 -154
  42. package/dist/primitives/providers/base-events-provider.cjs +1 -1
  43. package/dist/primitives/providers/base-events-provider.js +1 -1
  44. package/dist/primitives/providers/feedback-provider.cjs +1 -1
  45. package/dist/primitives/providers/feedback-provider.js +37 -38
  46. package/dist/primitives/providers/image-preview-provider.cjs +1 -0
  47. package/dist/primitives/providers/image-preview-provider.d.ts +15 -0
  48. package/dist/primitives/providers/image-preview-provider.js +23 -0
  49. package/dist/primitives/providers/index.cjs +1 -1
  50. package/dist/primitives/providers/index.d.ts +0 -3
  51. package/dist/primitives/providers/index.js +54 -63
  52. package/dist/primitives/utils/component-ids.cjs +1 -1
  53. package/dist/primitives/utils/component-ids.d.ts +54 -98
  54. package/dist/primitives/utils/component-ids.js +44 -66
  55. package/dist/primitives/utils/default-settings.cjs +1 -1
  56. package/dist/primitives/utils/default-settings.d.ts +0 -2
  57. package/dist/primitives/utils/default-settings.js +6 -8
  58. package/dist/react/embedded-chat.cjs +1 -1
  59. package/dist/react/embedded-chat.js +283 -287
  60. package/dist/react/index.cjs +1 -1
  61. package/dist/react/index.js +166 -174
  62. package/dist/styled/components/chat-history.cjs +1 -1
  63. package/dist/styled/components/chat-history.d.ts +1 -1
  64. package/dist/styled/components/chat-history.js +31 -29
  65. package/dist/styled/components/embedded-chat/file-upload-input.cjs +1 -0
  66. package/dist/styled/components/embedded-chat/file-upload-input.d.ts +20 -0
  67. package/dist/styled/components/embedded-chat/file-upload-input.js +300 -0
  68. package/dist/styled/components/embedded-chat/image-preview-modal.cjs +1 -0
  69. package/dist/styled/components/embedded-chat/image-preview-modal.d.ts +11 -0
  70. package/dist/styled/components/embedded-chat/image-preview-modal.js +77 -0
  71. package/dist/styled/components/embedded-chat.cjs +1 -1
  72. package/dist/styled/components/embedded-chat.d.ts +4 -50
  73. package/dist/styled/components/embedded-chat.js +567 -1010
  74. package/dist/styled/components/message.cjs +1 -1
  75. package/dist/styled/components/message.js +89 -88
  76. package/dist/styled/components/ui/recipes/citation.d.ts +1 -1
  77. package/dist/styled/components/ui/recipes/index.cjs +1 -1
  78. package/dist/styled/components/ui/recipes/index.d.ts +0 -1
  79. package/dist/styled/components/ui/recipes/index.js +31 -33
  80. package/dist/styled/index.cjs +1 -1
  81. package/dist/styled/index.js +154 -162
  82. package/dist/styled/inkeep.css.cjs +241 -61
  83. package/dist/styled/inkeep.css.js +241 -61
  84. package/dist/types/config/ai.d.ts +8 -10
  85. package/dist/types/icons/built-in.d.ts +1 -1
  86. package/dist/types/icons/custom.d.ts +8 -0
  87. package/dist/types/index.d.ts +0 -1
  88. package/package.json +7 -6
  89. package/dist/primitives/providers/attachment-item-provider.cjs +0 -1
  90. package/dist/primitives/providers/attachment-item-provider.d.ts +0 -9
  91. package/dist/primitives/providers/attachment-item-provider.js +0 -13
  92. package/dist/primitives/providers/attachments-bar-provider.cjs +0 -1
  93. package/dist/primitives/providers/attachments-bar-provider.d.ts +0 -30
  94. package/dist/primitives/providers/attachments-bar-provider.js +0 -57
  95. package/dist/primitives/providers/message-attachments-provider.cjs +0 -1
  96. package/dist/primitives/providers/message-attachments-provider.d.ts +0 -13
  97. package/dist/primitives/providers/message-attachments-provider.js +0 -27
  98. package/dist/primitives/utils/get-message-metadata.d.ts +0 -8
  99. package/dist/styled/components/ui/recipes/attachment.cjs +0 -1
  100. package/dist/styled/components/ui/recipes/attachment.d.ts +0 -4
  101. package/dist/styled/components/ui/recipes/attachment.js +0 -28
  102. package/dist/types/config/settings/workflow.d.ts +0 -86
@@ -1,124 +1,127 @@
1
1
  "use client";
2
- import { useChat as Qe } from "@ai-sdk/react";
3
- import { DefaultChatTransport as Ve } from "ai";
4
- import { useRef as c, useEffect as I, useState as R, useMemo as Ae, useCallback as P, useImperativeHandle as Ze } from "react";
5
- import { useModal as Xe } from "../modal/modal-provider.js";
6
- import { useOptionalChatBubble as Ye } from "../../providers/chat-bubble-provider.js";
7
- import { useOptionalSidebarChat as et } from "../../providers/sidebar-chat-provider.js";
8
- import { useInkeepConfig as tt } from "../../providers/config-provider.js";
9
- import { useCaptcha as st } from "./use-captcha.js";
10
- import { useMediaQuery as rt } from "../../hooks/use-media-query.js";
11
- import { useAnonymousSession as nt } from "../../hooks/use-anonymous-session.js";
12
- import { useAuthToken as ot } from "../../hooks/use-auth-token.js";
13
- import { useConversationLoader as at } from "../../hooks/use-conversation-loader.js";
14
- import { generateUid as D } from "../../utils/generate-uid.js";
15
- import { useBaseEvents as it } from "../../providers/base-events-provider.js";
16
- import { useChatForm as ct } from "../../providers/chat-form-provider.js";
17
- import { useWidget as lt } from "../../providers/widget-provider.js";
18
- import { useControllableState as ut } from "@radix-ui/react-use-controllable-state";
19
- import { useStreamingEvents as pt } from "../../hooks/use-streaming-events.js";
20
- import { parseAuthError as dt } from "../../hooks/use-inkeep-api-client.js";
21
- function mt(m) {
22
- const f = m.message ?? "";
23
- let s = Number(m.code) || Number(m.statusCode);
2
+ import { useChat as tt } from "@ai-sdk/react";
3
+ import { normalizeFileType as ke } from "./file-upload-input.js";
4
+ import { DefaultChatTransport as st } from "ai";
5
+ import { useRef as l, useEffect as x, useState as D, useMemo as xe, useCallback as $, useImperativeHandle as rt } from "react";
6
+ import { useModal as nt } from "../modal/modal-provider.js";
7
+ import { useOptionalChatBubble as ot } from "../../providers/chat-bubble-provider.js";
8
+ import { useOptionalSidebarChat as at } from "../../providers/sidebar-chat-provider.js";
9
+ import { useInkeepConfig as it } from "../../providers/config-provider.js";
10
+ import { useCaptcha as lt } from "./use-captcha.js";
11
+ import { useMediaQuery as ct } from "../../hooks/use-media-query.js";
12
+ import { useAnonymousSession as ut } from "../../hooks/use-anonymous-session.js";
13
+ import { useAuthToken as pt } from "../../hooks/use-auth-token.js";
14
+ import { useConversationLoader as dt } from "../../hooks/use-conversation-loader.js";
15
+ import { useInitialConversation as ft } from "../../hooks/use-initial-conversation.js";
16
+ import { generateUid as L } from "../../utils/generate-uid.js";
17
+ import { useBaseEvents as mt } from "../../providers/base-events-provider.js";
18
+ import { useChatForm as ht } from "../../providers/chat-form-provider.js";
19
+ import { useWidget as gt } from "../../providers/widget-provider.js";
20
+ import { useControllableState as vt } from "@radix-ui/react-use-controllable-state";
21
+ import { useStreamingEvents as yt } from "../../hooks/use-streaming-events.js";
22
+ import { parseAuthError as bt } from "../../hooks/use-inkeep-api-client.js";
23
+ import { useInputNotification as Ct } from "../../hooks/use-input-notification.js";
24
+ function It(g) {
25
+ const m = g.message ?? "";
26
+ let s = Number(g.code) || Number(g.statusCode);
24
27
  if (Number.isNaN(s))
25
28
  try {
26
- s = Number(JSON.parse(f).status);
29
+ s = Number(JSON.parse(m).status);
27
30
  } catch {
28
31
  }
29
- const u = dt(s, { detail: f });
30
- return u !== null ? u : s === 401 ? "session" : null;
32
+ const p = bt(s, { detail: m });
33
+ return p !== null ? p : s === 401 ? "session" : null;
31
34
  }
32
- const Y = `Hmm..
35
+ const te = `Hmm..
33
36
 
34
- It seems I might be having some issues right now. Please clear the chat and try again.`, _t = () => {
35
- const { baseSettings: m, aiChatSettings: f } = tt(), [s = "", u] = ut({
36
- prop: f.conversationId,
37
- defaultProp: f.conversationId ?? ""
38
- }), ke = Xe(), we = Ye(), Ie = et(), { logEvent: h } = it(), { setConversationId: Re, emitToParent: T } = pt(), ee = c(s);
39
- I(() => {
40
- const e = ee.current;
41
- ee.current = s, e !== s && h({
37
+ It seems I might be having some issues right now. Please clear the chat and try again.`, Kt = () => {
38
+ const { baseSettings: g, aiChatSettings: m } = it(), [s = "", p] = vt({
39
+ prop: m.conversationIdOverride,
40
+ defaultProp: m.conversationIdOverride ?? ""
41
+ }), Me = nt(), Fe = ot(), Ee = at(), { logEvent: v } = mt(), { setConversationId: Ne, emitToParent: M } = yt(), se = l(s);
42
+ x(() => {
43
+ const e = se.current;
44
+ se.current = s, e !== s && v({
42
45
  eventName: "chat_conversation_changed",
43
46
  properties: {
44
47
  conversationId: s,
45
48
  previousConversationId: e
46
49
  }
47
50
  });
48
- }, [s, h]);
49
- const [y, x] = R(""), Te = (e) => x(e.target.value), { shouldBypassCaptcha: te, filters: se, privacyPreferences: xe, userProperties: $ } = m, { authToken: M, isLoading: Me, refreshToken: re } = ot(), ne = !!m.getAuthToken, p = !!M, {
50
- onInputMessageChange: Ee,
51
- filters: oe,
52
- baseUrl: E,
53
- agentUrl: Ne,
54
- context: ae,
55
- headers: ie,
56
- appId: b,
57
- apiKey: g,
58
- files: C
59
- } = f, Oe = ke?.isOpen ?? we?.isOpen ?? Ie?.isOpen ?? !0, { getCaptchaHeader: S, invalidate: l } = st({
60
- baseUrl: E,
61
- shouldBypassCaptcha: te || !!g,
62
- shouldMakeInitialRequest: Oe
63
- }), ce = c(S);
64
- ce.current = S;
65
- const le = Ne || `${E}/run/api/chat`, { sessionToken: B, refreshSession: L } = nt({
66
- baseUrl: E,
67
- appId: b,
51
+ }, [s, v]);
52
+ const [C, F] = D(""), Oe = (e) => F(e.target.value), { shouldBypassCaptcha: re, filters: ne, privacyPreferences: Pe, userProperties: B } = g, { authToken: E, isLoading: _e, refreshToken: oe } = pt(), ae = !!g.getAuthToken, d = !!E, {
53
+ onInputMessageChange: De,
54
+ filters: ie,
55
+ baseUrl: N,
56
+ agentUrl: $e,
57
+ context: le,
58
+ headers: ce,
59
+ appId: I,
60
+ apiKey: y,
61
+ files: w
62
+ } = m, Le = Me?.isOpen ?? Fe?.isOpen ?? Ee?.isOpen ?? !0, { getCaptchaHeader: S, invalidate: c } = lt({
63
+ baseUrl: N,
64
+ shouldBypassCaptcha: re || !!y,
65
+ shouldMakeInitialRequest: Le
66
+ }), ue = l(S);
67
+ ue.current = S;
68
+ const pe = $e || `${N}/run/api/chat`, { sessionToken: U, refreshSession: z } = ut({
69
+ baseUrl: N,
70
+ appId: I,
68
71
  getCaptchaHeader: S,
69
- invalidateCaptcha: l,
70
- optOutAllAnalytics: xe?.optOutAllAnalytics,
71
- enabled: !p && !Me
72
- }), { loadConversation: ue } = at({
73
- baseUrl: E,
74
- appId: b,
75
- authToken: g ?? (p ? M : B),
72
+ invalidateCaptcha: c,
73
+ optOutAllAnalytics: Pe?.optOutAllAnalytics,
74
+ enabled: !d && !_e
75
+ }), de = y ?? (d ? E : U), { loadConversation: fe } = dt({
76
+ baseUrl: N,
77
+ appId: I,
78
+ authToken: de,
76
79
  getCaptchaHeader: S,
77
- invalidateCaptcha: l,
78
- refreshSession: g || p ? void 0 : L
79
- }), [_e, pe] = R(!1), H = c(null);
80
- H.current = B;
81
- const U = c(null);
82
- U.current = M;
83
- const q = c(void 0);
84
- q.current = $ && Object.keys($).length > 0 ? JSON.stringify($) : void 0;
85
- const v = c(0), de = c(null), K = c(null), A = c(void 0), Fe = C?.map((e) => `${e.filename ?? ""}:${e.mediaType}:${e.url.length}:${e.url.slice(0, 64)}:${e.url.slice(-32)}`).join(`
80
+ invalidateCaptcha: c,
81
+ refreshSession: y || d ? void 0 : z
82
+ }), [Be, me] = D(!1), H = l(null);
83
+ H.current = U;
84
+ const q = l(null);
85
+ q.current = E;
86
+ const K = l(void 0);
87
+ K.current = B && Object.keys(B).length > 0 ? JSON.stringify(B) : void 0;
88
+ const b = l(0), he = l(null), J = l(null), A = l(void 0), Ue = w?.map((e) => `${e.filename ?? ""}:${e.mediaType}:${e.url.length}:${e.url.slice(0, 64)}:${e.url.slice(-32)}`).join(`
86
89
  `) ?? "";
87
- I(() => {
88
- A.current = C?.length ? C : void 0;
89
- }, [Fe]);
90
- const me = c(ie);
91
- me.current = ie;
92
- const W = c(void 0);
93
- W.current = se || oe ? JSON.stringify({ ...se, ...oe }) : void 0;
94
- const Pe = (e) => {
90
+ x(() => {
91
+ A.current = w?.length ? w : void 0;
92
+ }, [Ue]);
93
+ const ge = l(ce);
94
+ ge.current = ce;
95
+ const j = l(void 0);
96
+ j.current = ne || ie ? JSON.stringify({ ...ne, ...ie }) : void 0;
97
+ const ze = (e) => {
95
98
  switch (e.code) {
96
99
  case 400:
97
100
  return e.message;
98
101
  case 401:
99
- return ne ? "Authentication failed. Please try again." : Y;
102
+ return ae ? "Authentication failed. Please try again." : te;
100
103
  case 403:
101
- return `There seems to be a configuration error. Please contact ${m.organizationDisplayName ?? "Administrator"}`;
104
+ return `There seems to be a configuration error. Please contact ${g.organizationDisplayName ?? "Administrator"}`;
102
105
  default:
103
- return Y;
106
+ return te;
104
107
  }
105
- }, [De, k] = R([]), [$e, N] = R(null), Be = Ae(
106
- () => new Ve({
107
- api: le,
108
+ }, [O, W] = D([]), He = xe(
109
+ () => new st({
110
+ api: pe,
108
111
  headers: () => {
109
- const e = g ?? U.current ?? H.current;
112
+ const e = y ?? q.current ?? H.current;
110
113
  return {
111
114
  "x-inkeep-client-timezone": Intl.DateTimeFormat().resolvedOptions().timeZone,
112
115
  "x-inkeep-client-timestamp": (/* @__PURE__ */ new Date()).toISOString(),
113
- ...b ? { "x-inkeep-app-id": b } : {},
116
+ ...I ? { "x-inkeep-app-id": I } : {},
114
117
  ...e ? { Authorization: `Bearer ${e}` } : {},
115
- ...W.current ? { "inkeep-filters": W.current } : {},
116
- ...q.current ? { "x-inkeep-user-properties": q.current } : {},
117
- ...me.current
118
+ ...j.current ? { "inkeep-filters": j.current } : {},
119
+ ...K.current ? { "x-inkeep-user-properties": K.current } : {},
120
+ ...ge.current
118
121
  };
119
122
  },
120
123
  prepareSendMessagesRequest: async (e) => {
121
- const r = await ce.current(), t = e.messages[e.messages.length - 1];
124
+ const i = await ue.current(), t = e.messages[e.messages.length - 1];
122
125
  return t || console.warn("[useInkeepChat] prepareSendMessagesRequest called with empty messages array"), {
123
126
  body: {
124
127
  ...e.body,
@@ -129,35 +132,35 @@ It seems I might be having some issues right now. Please clear the chat and try
129
132
  },
130
133
  headers: {
131
134
  ...e.headers,
132
- ...r
135
+ ...i
133
136
  }
134
137
  };
135
138
  },
136
139
  body: {
137
- requestContext: ae
140
+ requestContext: le
138
141
  }
139
142
  }),
140
- [le, ae, b, g]
143
+ [pe, le, I, y]
141
144
  ), {
142
- messages: O,
143
- sendMessage: j,
144
- addToolApprovalResponse: z,
145
- status: fe,
146
- setMessages: d,
145
+ messages: P,
146
+ sendMessage: G,
147
+ addToolApprovalResponse: Q,
148
+ status: ve,
149
+ setMessages: h,
147
150
  stop: _,
148
- error: J
149
- } = Qe({
150
- transport: Be,
151
+ error: V
152
+ } = tt({
153
+ transport: He,
151
154
  onData(e) {
152
- T(e.type, e.data);
155
+ M(e.type, e.data);
153
156
  },
154
157
  async onFinish() {
155
- T("completion", { conversationId: s }), await h({
158
+ M("completion", { conversationId: s }), await v({
156
159
  eventName: "assistant_message_received",
157
160
  properties: {
158
161
  conversationId: s
159
162
  }
160
- }), h({
163
+ }), v({
161
164
  eventName: "assistant_answer_displayed",
162
165
  properties: {
163
166
  conversationId: s
@@ -166,193 +169,240 @@ It seems I might be having some issues right now. Please clear the chat and try
166
169
  },
167
170
  onError(e) {
168
171
  console.error("onError", { code: e.code, message: e.message });
169
- const r = te || g ? null : mt(e);
170
- if (r !== null && v.current < 1) {
171
- v.current++;
172
- const t = K.current, n = de.current;
172
+ const i = re || y ? null : It(e);
173
+ if (i !== null && b.current < 1) {
174
+ b.current++;
175
+ const t = J.current, n = he.current;
173
176
  (async () => {
174
- if (r === "session" && ne) {
175
- const o = await re();
176
- if (!o) throw new Error("Auth token refresh failed");
177
- U.current = o;
178
- } else if (r === "session") {
179
- const o = await L();
180
- o && (H.current = o);
177
+ if (i === "session" && ae) {
178
+ const r = await oe();
179
+ if (!r) throw new Error("Auth token refresh failed");
180
+ q.current = r;
181
+ } else if (i === "session") {
182
+ const r = await z();
183
+ r && (H.current = r);
181
184
  } else
182
- l();
185
+ c();
183
186
  if (t) {
184
- z(t);
187
+ Q(t);
185
188
  return;
186
189
  }
187
- n && (d((o) => {
188
- let i = [...o];
189
- return i.at(-1)?.role === "assistant" && (i = i.slice(0, -1)), i.at(-1)?.role === "user" && (i = i.slice(0, -1)), i;
190
- }), j(
190
+ n && (h((r) => {
191
+ let o = [...r];
192
+ return o.at(-1)?.role === "assistant" && (o = o.slice(0, -1)), o.at(-1)?.role === "user" && (o = o.slice(0, -1)), o;
193
+ }), G(
191
194
  n.files?.length ? { parts: [{ type: "text", text: n.content }, ...n.files] } : { text: n.content },
192
195
  { body: n.body }
193
196
  ));
194
197
  })().catch(() => {
195
- v.current = 0, l(), d((o) => {
196
- const i = [...o], X = i[i.length - 1];
197
- if (!X) return i;
198
- const Se = Y;
199
- return X.role === "user" ? i.push({
200
- id: D(16),
198
+ b.current = 0, c(), h((r) => {
199
+ const o = [...r], f = o[o.length - 1];
200
+ if (!f) return o;
201
+ const u = te;
202
+ return f.role === "user" ? o.push({
203
+ id: L(16),
201
204
  role: "assistant",
202
- parts: [{ type: "text", text: Se }]
203
- }) : X.parts = [{ type: "text", text: Se }], i;
205
+ parts: [{ type: "text", text: u }]
206
+ }) : f.parts = [{ type: "text", text: u }], o;
204
207
  });
205
208
  });
206
209
  return;
207
210
  }
208
- v.current = 0, r !== null && l(), h({
211
+ b.current = 0, i !== null && c(), v({
209
212
  eventName: "chat_error",
210
213
  properties: {
211
214
  conversationId: s,
212
215
  error: e.message
213
216
  }
214
- }), d((t) => {
217
+ }), h((t) => {
215
218
  const n = [...t], a = n[n.length - 1];
216
219
  if (a) {
217
- const o = Pe(e);
220
+ const r = ze(e);
218
221
  a.role === "user" ? n.push({
219
- id: D(16),
222
+ id: L(16),
220
223
  role: "assistant",
221
- parts: [{ type: "text", text: o }]
222
- }) : a.parts = [{ type: "text", text: o }];
224
+ parts: [{ type: "text", text: r }]
225
+ }) : a.parts = [{ type: "text", text: r }];
223
226
  }
224
227
  return n;
225
228
  });
226
229
  }
227
- }), he = c(p);
228
- I(() => {
229
- const e = he.current;
230
- he.current = p, e !== p && (_(), w(null), d([]), u(""), x(""), k([]), N(null), l());
231
- }, [p, _, d, u, l]);
232
- const ge = fe === "submitted", G = fe === "streaming", Le = Ae(() => {
230
+ }), ye = l(d);
231
+ x(() => {
232
+ const e = ye.current;
233
+ ye.current = d, e !== d && (_(), T(null), h([]), p(""), F(""), W([]), c());
234
+ }, [d, _, h, p, c]);
235
+ const be = ve === "submitted", Z = ve === "streaming", qe = xe(() => {
233
236
  const e = (a) => {
234
237
  if (!a || typeof a != "object") return !1;
235
- const o = a;
236
- return typeof o.type == "string" && o.type.startsWith("tool-");
237
- }, t = [...O ?? []].reverse().find((a) => a.role === "assistant");
238
+ const r = a;
239
+ return typeof r.type == "string" && r.type.startsWith("tool-");
240
+ }, t = [...P ?? []].reverse().find((a) => a.role === "assistant");
238
241
  if (!t) return !1;
239
242
  const n = t.parts?.at(-1);
240
- return !(!e(n) || n.state !== "output-available" || !n.approval?.id || G);
241
- }, [O, G]), ve = G || Le, ye = ge || ve, He = O.length === 0, Q = !y.trim() || ye, Ue = rt("(max-width: 768px)"), [qe, w] = R(null);
242
- I(() => {
243
- J && w(J);
244
- }, [J]);
245
- const Ke = () => w(null), be = c(null);
246
- I(() => {
247
- Ee?.(y);
248
- }, [y]);
249
- const We = (e) => {
250
- e.key === "Enter" && !e.shiftKey && !Q && !e.nativeEvent.isComposing && (e.preventDefault(), V());
251
- }, V = async (e = y) => {
252
- if (Q && (!e || e.trim().length === 0)) return;
253
- k([]), x(""), v.current = 0, K.current = null, await h({
243
+ return !(!e(n) || n.state !== "output-available" || !n.approval?.id || Z);
244
+ }, [P, Z]), Ce = Z || qe, Ie = be || Ce, Ke = P.length === 0, X = !C.trim() && O.length === 0 || Ie, Je = ct("(max-width: 768px)"), [je, T] = D(null);
245
+ x(() => {
246
+ V && T(V);
247
+ }, [V]);
248
+ const We = () => T(null), { inputNotification: Ge, showInputNotification: we, clearInputNotification: Qe } = Ct(), Se = l(null);
249
+ x(() => {
250
+ De?.(C);
251
+ }, [C]);
252
+ const Ve = (e) => {
253
+ e.key === "Enter" && !e.shiftKey && !X && !e.nativeEvent.isComposing && (e.preventDefault(), Y());
254
+ }, Y = async (e = C) => {
255
+ if (X && (!e || e.trim().length === 0) && O.length === 0) return;
256
+ const i = O;
257
+ W([]), F(""), b.current = 0, J.current = null, await v({
254
258
  eventName: "user_message_submitted",
255
259
  properties: {
256
260
  conversationId: s
257
261
  }
258
262
  });
259
- let r = s;
260
- r || (r = `conv_${D(16)}`, u(r)), Re(r);
261
- const t = A.current;
262
- A.current = void 0, de.current = {
263
- content: e,
264
- body: { conversationId: r },
265
- files: t
266
- }, j(
267
- t ? { parts: [{ type: "text", text: e }, ...t] } : { text: e },
268
- {
269
- body: { conversationId: r }
263
+ let t = s;
264
+ t || (t = `conv_${L(16)}`, p(t)), Ne(t);
265
+ const n = A.current;
266
+ A.current = void 0;
267
+ let a, r;
268
+ if (n?.length) {
269
+ let o;
270
+ try {
271
+ o = await Promise.all(
272
+ i.map((f) => {
273
+ const u = ke(f);
274
+ return new Promise((et, Re) => {
275
+ const k = new FileReader();
276
+ k.onload = () => {
277
+ if (typeof k.result != "string") {
278
+ Re(new Error(`Failed to read file "${u.name}"`));
279
+ return;
280
+ }
281
+ et({
282
+ type: "file",
283
+ url: k.result,
284
+ mediaType: u.type,
285
+ filename: u.name
286
+ });
287
+ }, k.onerror = () => Re(new Error(`Failed to read file "${u.name}"`)), k.readAsDataURL(u);
288
+ });
289
+ })
290
+ );
291
+ } catch {
292
+ we({
293
+ title: "Failed to attach files",
294
+ message: "Could not read one or more files. Please try again."
295
+ });
296
+ return;
270
297
  }
271
- );
272
- }, je = P(
298
+ r = [...o, ...n], a = e.trim() ? { parts: [{ type: "text", text: e }, ...r] } : { parts: r };
299
+ } else if (i.length > 0) {
300
+ const o = new DataTransfer();
301
+ for (const u of i) o.items.add(ke(u));
302
+ const f = o.files;
303
+ a = e.trim() ? { text: e, files: f } : { files: f };
304
+ } else
305
+ a = { text: e };
306
+ he.current = {
307
+ content: e,
308
+ body: { conversationId: t },
309
+ files: r
310
+ }, G(a, {
311
+ body: { conversationId: t }
312
+ });
313
+ }, Ze = $(
273
314
  (e) => {
274
- v.current = 0, K.current = e, z(e);
315
+ b.current = 0, J.current = e, Q(e);
275
316
  },
276
- [z]
277
- ), Z = P(() => {
317
+ [Q]
318
+ ), ee = $(() => {
278
319
  _().then(() => {
279
- T("aborted", { conversationId: s });
320
+ M("aborted", { conversationId: s });
280
321
  });
281
- }, [_, s, T]), Ce = () => {
282
- Ke(), d([]), u(""), k([]), N(null), l(), A.current = C?.length ? C : void 0, h({
322
+ }, [_, s, M]), Ae = () => {
323
+ We(), h([]), p(""), c(), A.current = w?.length ? w : void 0, v({
283
324
  eventName: "chat_clear_button_clicked",
284
325
  properties: {
285
326
  conversationId: s
286
327
  }
287
328
  });
288
- }, F = P(
289
- (e, r) => {
290
- w(null), d(r), u(e), k([]), N(null), l(), A.current = void 0;
329
+ }, R = $(
330
+ (e, i) => {
331
+ T(null), h(i), p(e), c(), A.current = void 0;
291
332
  },
292
- [d, u, l]
293
- ), ze = P(
294
- async (e, r) => {
295
- Z(), F(e, []), pe(!0);
333
+ [h, p, c]
334
+ ), Te = $(
335
+ async (e, i) => {
336
+ ee(), R(e, []), me(!0);
296
337
  try {
297
- const t = await ue(e, r), n = t?.[t.length - 1], a = t !== null && n?.role === "user" ? [...t, {
298
- id: D(16),
338
+ const t = await fe(e, i);
339
+ if (t === null) return !1;
340
+ const a = t[t.length - 1]?.role === "user" ? [...t, {
341
+ id: L(16),
299
342
  role: "assistant",
300
343
  parts: [{ type: "text", text: "This session was interrupted. Please check back in a few minutes or start a new conversation." }]
301
344
  }] : t;
302
- a !== null && F(e, a);
345
+ return R(e, a), !0;
303
346
  } finally {
304
- r?.aborted || pe(!1);
347
+ i?.aborted || me(!1);
305
348
  }
306
349
  },
307
- [F, ue, Z]
308
- ), { openForm: Je } = ct(), Ge = lt();
309
- return Ze(f.chatFunctionsRef, () => ({
310
- submitMessage: V,
350
+ [R, fe, ee]
351
+ );
352
+ ft({
353
+ conversationId: m.conversationId,
354
+ effectiveAuthToken: de,
355
+ loadAndRestoreSession: Te,
356
+ onLoadFailed: () => R("", [])
357
+ });
358
+ const { openForm: Xe } = ht(), Ye = gt();
359
+ return rt(m.chatFunctionsRef, () => ({
360
+ submitMessage: Y,
311
361
  updateInputMessage(e) {
312
- x(e);
362
+ F(e);
313
363
  },
314
- clearChat: Ce,
364
+ clearChat: Ae,
315
365
  openForm: (e) => {
316
- Ge?.setView("chat"), Je(e, void 0);
366
+ Ye?.setView("chat"), Xe(e, void 0);
317
367
  },
318
368
  focusInput: () => {
319
- be.current?.focus();
369
+ Se.current?.focus();
320
370
  }
321
371
  })), {
322
- messages: O,
323
- sendMessage: j,
324
- addToolApprovalResponse: je,
325
- isLoading: ge,
326
- isStreaming: ve,
327
- isBusy: ye,
328
- error: qe,
329
- setError: w,
330
- isSubmitDisabled: Q,
331
- input: y,
332
- handleInputChange: Te,
333
- handleInputKeyDown: We,
334
- handleSubmit: V,
335
- stop: Z,
336
- clear: Ce,
337
- inputRef: be,
338
- isMobile: Ue,
339
- // Additional state for attachments and workflow
340
- messageAttachments: De,
341
- setMessageAttachments: k,
342
- selectedWorkflow: $e,
343
- setSelectedWorkflow: N,
344
- isNewChat: He,
372
+ messages: P,
373
+ sendMessage: G,
374
+ addToolApprovalResponse: Ze,
375
+ isLoading: be,
376
+ isStreaming: Ce,
377
+ isBusy: Ie,
378
+ error: je,
379
+ setError: T,
380
+ isSubmitDisabled: X,
381
+ input: C,
382
+ handleInputChange: Oe,
383
+ handleInputKeyDown: Ve,
384
+ handleSubmit: Y,
385
+ stop: ee,
386
+ clear: Ae,
387
+ inputRef: Se,
388
+ isMobile: Je,
389
+ files: O,
390
+ setFiles: W,
391
+ isNewChat: Ke,
345
392
  conversationId: s,
346
- restoreSession: F,
347
- loadAndRestoreSession: ze,
348
- isSessionLoading: _e,
349
- authToken: p ? M : B,
350
- refreshSession: p ? re : L,
393
+ restoreSession: R,
394
+ loadAndRestoreSession: Te,
395
+ isSessionLoading: Be,
396
+ authToken: d ? E : U,
397
+ refreshSession: d ? oe : z,
351
398
  getCaptchaHeader: S,
352
- invalidateCaptcha: l
399
+ invalidateCaptcha: c,
400
+ inputNotification: Ge,
401
+ showInputNotification: we,
402
+ clearInputNotification: Qe
353
403
  };
354
404
  };
355
405
  export {
356
- Y as DEFAULT_ERROR_MESSAGE,
357
- _t as useInkeepChat
406
+ te as DEFAULT_ERROR_MESSAGE,
407
+ Kt as useInkeepChat
358
408
  };