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