@burdenoff/fe-libs 2026.908.1 → 2026.909.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/shared/assistant/api.d.ts +21 -0
- package/dist/shared/assistant/api.d.ts.map +1 -1
- package/dist/shared/assistant/api.js +12 -5
- package/dist/shared/assistant/turnState.d.ts +80 -0
- package/dist/shared/assistant/turnState.d.ts.map +1 -1
- package/dist/shared/assistant/turnState.js +26 -1
- package/dist/shared/assistant/ui/AssistantChatArea.d.ts.map +1 -1
- package/dist/shared/assistant/ui/AssistantChatArea.js +354 -314
- package/dist/shared/assistant/ui/AssistantSpeechProvider.d.ts.map +1 -1
- package/dist/shared/assistant/ui/AssistantSpeechProvider.js +151 -154
- package/dist/shared/assistant/voice/speechPlayback.d.ts +32 -0
- package/dist/shared/assistant/voice/speechPlayback.d.ts.map +1 -1
- package/dist/shared/assistant/voice/speechPlayback.js +7 -1
- package/dist/shared-assistant.js +87 -87
- package/package.json +1 -1
|
@@ -2,69 +2,69 @@ import { useI18n as e } from "../../providers/shell/I18nProvider.js";
|
|
|
2
2
|
import { useAuthToken as t } from "../../providers/shell/AuthTokenProvider.js";
|
|
3
3
|
import "../../../shared-providers-shell.js";
|
|
4
4
|
import { describeQuotaError as n } from "../quota.js";
|
|
5
|
-
import {
|
|
6
|
-
import { getAssistantMedia as h, sanitize as
|
|
7
|
-
import { isVoiceTurn as g, voiceMarker as _, voiceSessionIdOf as
|
|
8
|
-
import { buildContinuedFromVoiceNote as
|
|
9
|
-
import { pollDelayMs as
|
|
10
|
-
import { toCaptionText as
|
|
11
|
-
import { resolveAssistantLanguage as
|
|
12
|
-
import { resolveLanguagePair as
|
|
13
|
-
import { findPendingWrite as
|
|
14
|
-
import { useAssistantProduct as
|
|
15
|
-
import { useAssistantTr as
|
|
16
|
-
import { buildPromptParts as
|
|
5
|
+
import { abortAssistantTurn as r, approvePendingWrite as i, createAssistantSandbox as a, createAssistantSession as o, extendAssistantSandboxTTL as s, findExistingSandbox as c, getAssistantArtifacts as l, getAssistantMessages as u, getAssistantSession as d, releaseSupersededAssistantSandboxes as f, sendAssistantPromptAsync as ee, waitForAssistantServiceReady as p, waitForSandboxRunning as m } from "../api.js";
|
|
6
|
+
import { getAssistantMedia as h, sanitize as te } from "../progress.js";
|
|
7
|
+
import { isVoiceTurn as g, voiceMarker as _, voiceSessionIdOf as ne } from "../voice/turnVisibility.js";
|
|
8
|
+
import { buildContinuedFromVoiceNote as v, buildVoiceTranscriptMarkdown as y, voiceTranscriptFilename as re } from "../voice/voiceTranscript.js";
|
|
9
|
+
import { pollDelayMs as ie } from "../voice/assistantPollSchedule.js";
|
|
10
|
+
import { toCaptionText as b } from "../voice/captionText.js";
|
|
11
|
+
import { resolveAssistantLanguage as ae } from "../voice/languages.js";
|
|
12
|
+
import { resolveLanguagePair as oe } from "../voice/languagePair.js";
|
|
13
|
+
import { findPendingWrite as se } from "../pendingWrite.js";
|
|
14
|
+
import { useAssistantProduct as ce } from "../product.js";
|
|
15
|
+
import { useAssistantTr as le } from "../i18n.js";
|
|
16
|
+
import { buildPromptParts as ue, buildPromptWithAttachments as de, countInlineImageCandidates as fe, countInlinedImageParts as pe, getSendableAttachments as me, toMessageAttachment as he } from "../attachments.js";
|
|
17
17
|
import { useAssistantStore as x } from "../store.js";
|
|
18
|
-
import { isTurnInFlight as
|
|
19
|
-
import { parseToolActivity as
|
|
20
|
-
import { useVoiceSession as
|
|
21
|
-
import { getOrganizationId as
|
|
22
|
-
import { createReadinessTracker as
|
|
23
|
-
import { AssistantSpokenTurnsNotice as
|
|
24
|
-
import { VoiceTranscriptDrawer as
|
|
25
|
-
import { downloadFile as
|
|
26
|
-
import { AssistantEmptyState as
|
|
27
|
-
import { AssistantMessageList as
|
|
28
|
-
import { AssistantVoiceSession as
|
|
29
|
-
import { useAssistantApiAccess as
|
|
30
|
-
import { useConversationTurns as
|
|
31
|
-
import { isMultimodalBodyRejection as
|
|
32
|
-
import { dispatchAssistantQuotaExhausted as
|
|
33
|
-
import { useAssistantAttachments as
|
|
34
|
-
import { AssistantComposer as
|
|
35
|
-
import { isProdRuntime as
|
|
36
|
-
import { AssistantApiCallsConsentDialog as
|
|
37
|
-
import { useCallback as S, useEffect as C, useMemo as w, useRef as T, useState as
|
|
38
|
-
import { jsx as E, jsxs as
|
|
18
|
+
import { isTurnInFlight as ge, planAbandonedTurn as _e, planTurnAbort as ve } from "../turnState.js";
|
|
19
|
+
import { parseToolActivity as ye } from "./AssistantToolActivity.js";
|
|
20
|
+
import { useVoiceSession as be } from "./useVoiceSession.js";
|
|
21
|
+
import { getOrganizationId as xe, getWorkspaceId as Se } from "../context.js";
|
|
22
|
+
import { createReadinessTracker as Ce } from "../sandboxReadiness.js";
|
|
23
|
+
import { AssistantSpokenTurnsNotice as we } from "./AssistantSpokenTurnsNotice.js";
|
|
24
|
+
import { VoiceTranscriptDrawer as Te } from "./voice/VoiceTranscriptDrawer.js";
|
|
25
|
+
import { downloadFile as Ee } from "../exportConversation.js";
|
|
26
|
+
import { AssistantEmptyState as De } from "./AssistantEmptyState.js";
|
|
27
|
+
import { AssistantMessageList as Oe } from "./AssistantMessageList.js";
|
|
28
|
+
import { AssistantVoiceSession as ke } from "./voice/AssistantVoiceSession.js";
|
|
29
|
+
import { useAssistantApiAccess as Ae } from "../useAssistantApiAccess.js";
|
|
30
|
+
import { useConversationTurns as je } from "../useConversationTurns.js";
|
|
31
|
+
import { isMultimodalBodyRejection as Me, isRecoverableAssistantError as Ne } from "../transportErrors.js";
|
|
32
|
+
import { dispatchAssistantQuotaExhausted as Pe, notifyAiCreditsUpdated as Fe } from "../aiCredits.js";
|
|
33
|
+
import { useAssistantAttachments as Ie } from "../useAssistantAttachments.js";
|
|
34
|
+
import { AssistantComposer as Le } from "./composer/AssistantComposer.js";
|
|
35
|
+
import { isProdRuntime as Re } from "../env.js";
|
|
36
|
+
import { AssistantApiCallsConsentDialog as ze } from "./AssistantApiCallsConsentDialog.js";
|
|
37
|
+
import { useCallback as S, useEffect as C, useMemo as w, useRef as T, useState as Be } from "react";
|
|
38
|
+
import { jsx as E, jsxs as Ve } from "react/jsx-runtime";
|
|
39
39
|
//#region src/shared/assistant/ui/AssistantChatArea.tsx
|
|
40
|
-
var
|
|
40
|
+
var He = {
|
|
41
41
|
general: 18e4,
|
|
42
42
|
assistant: 18e4,
|
|
43
43
|
"api-calls": 18e4,
|
|
44
44
|
"vibe-plugins": 6e5
|
|
45
|
-
},
|
|
46
|
-
function
|
|
45
|
+
}, Ue = 18e4, We = 600, Ge = 2e4;
|
|
46
|
+
function D() {
|
|
47
47
|
return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
|
|
48
48
|
}
|
|
49
|
-
function
|
|
49
|
+
function O(e) {
|
|
50
50
|
return e.info?.time?.created ?? 0;
|
|
51
51
|
}
|
|
52
|
-
function
|
|
52
|
+
function k(e) {
|
|
53
53
|
return (e ?? []).filter((e) => e.type === "text" && typeof e.text == "string").map((e) => e.text?.trim() ?? "").filter(Boolean).join("\n");
|
|
54
54
|
}
|
|
55
|
-
function
|
|
55
|
+
function A(e) {
|
|
56
56
|
return (e ?? []).filter((e) => e.type === "tool" && e.tool).map((e) => {
|
|
57
57
|
let t = e.state?.status ?? "running", n = e.tool ?? "tool";
|
|
58
58
|
return t === "completed" ? `Completed: ${n}` : t === "failed" ? `Failed: ${n}` : `Running: ${n}`;
|
|
59
59
|
});
|
|
60
60
|
}
|
|
61
|
-
function
|
|
62
|
-
let n = e.filter((e) => e.info?.role === "assistant" &&
|
|
61
|
+
function Ke(e, t) {
|
|
62
|
+
let n = e.filter((e) => e.info?.role === "assistant" && O(e) > t).sort((e, t) => O(e) - O(t));
|
|
63
63
|
if (n.length === 0) return {
|
|
64
64
|
content: "Thinking...",
|
|
65
65
|
done: !1
|
|
66
66
|
};
|
|
67
|
-
let r = n[n.length - 1], i =
|
|
67
|
+
let r = n[n.length - 1], i = k(r.parts), a = h(r.parts), o = A(r.parts), s = se(r.parts), c = [
|
|
68
68
|
i,
|
|
69
69
|
...a,
|
|
70
70
|
...o
|
|
@@ -78,7 +78,7 @@ function Ge(e, t) {
|
|
|
78
78
|
...s ? { pendingWrite: s } : {}
|
|
79
79
|
};
|
|
80
80
|
}
|
|
81
|
-
function
|
|
81
|
+
function qe(e) {
|
|
82
82
|
switch (e) {
|
|
83
83
|
case "provisioning": return "Starting assistant environment...";
|
|
84
84
|
case "connecting": return "Connecting to assistant...";
|
|
@@ -86,424 +86,464 @@ function Ke(e) {
|
|
|
86
86
|
default: return "";
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
|
-
var
|
|
90
|
-
let
|
|
89
|
+
var j = ({ visible: h = !0, writeAccess: se = "unknown" }) => {
|
|
90
|
+
let k = le(), { product: A, modes: j, gatherPageContext: Je, buildPrompt: Ye, reportTokenUsage: Xe } = ce(), { getAccessToken: M, getWorkspaceToken: N, userId: P } = t(), { locale: Ze } = e(), Qe = x((e) => e.assistantLanguage), $e = x((e) => e.replyLanguage), et = w(() => oe(Qe, $e, Ze), [
|
|
91
|
+
Qe,
|
|
91
92
|
$e,
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
]), nt = tt.reply.english, rt = tt.replyIsExplicit, it = tt.reply.code, { conversations: at, activeConversationId: j, mode: M, processingByConversationId: ot, setMode: st, setConversationMode: N, setActiveConversation: ct, createConversation: P, addMessage: F, updateMessage: lt, patchMessage: I, mergeMessageMetadata: ut, setConversationProcessing: L, setBackendSessionId: dt, clearBackendSessionId: ft, setSandbox: R, clearSandbox: pt, acknowledgeApiCalls: mt } = x(), ht = at.find((e) => e.id === j), z = Oe(ht), B = z.all, V = j ? ot[j] : void 0, H = he(V?.status), gt = H ? V?.messageId ?? null : null, _t = V?.status === "error" ? V.messageId : null, { canUseApiCalls: U, loading: vt } = De(ve()), yt = w(() => k.filter((e) => !e.requiresAdmin || U), [k, U]), [bt, xt] = Le(null), [St, W] = Le(!1), Ct = T({}), G = T(be()), wt = T(/* @__PURE__ */ new Set()), K = w(() => k.find((e) => e.id === M), [k, M]);
|
|
93
|
+
Ze
|
|
94
|
+
]), tt = et.reply.english, nt = et.replyIsExplicit, rt = et.reply.code, { conversations: it, activeConversationId: F, mode: I, processingByConversationId: at, setMode: L, setConversationMode: R, setActiveConversation: ot, createConversation: z, addMessage: B, updateMessage: st, patchMessage: V, mergeMessageMetadata: ct, setConversationProcessing: H, clearConversationProcessing: lt, setBackendSessionId: ut, clearBackendSessionId: U, setSandbox: W, clearSandbox: dt, acknowledgeApiCalls: ft } = x(), pt = it.find((e) => e.id === F), G = je(pt), mt = G.all, ht = F ? at[F] : void 0, gt = ge(ht?.status), _t = gt ? ht?.messageId ?? null : null, vt = ht?.status === "error" ? ht.messageId : null, { canUseApiCalls: yt, loading: bt } = Ae(xe()), xt = w(() => j.filter((e) => !e.requiresAdmin || yt), [j, yt]), [St, Ct] = Be(null), [wt, Tt] = Be(!1), Et = T({}), Dt = T(Ce()), Ot = T(/* @__PURE__ */ new Set()), kt = w(() => j.find((e) => e.id === I), [j, I]);
|
|
95
95
|
C(() => {
|
|
96
|
-
|
|
96
|
+
bt || (!kt || kt.requiresAdmin && !yt) && I !== "assistant" && L("assistant");
|
|
97
97
|
}, [
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
98
|
+
I,
|
|
99
|
+
kt,
|
|
100
|
+
yt,
|
|
101
|
+
bt,
|
|
102
|
+
L
|
|
103
103
|
]);
|
|
104
|
-
let
|
|
105
|
-
|
|
106
|
-
}, [
|
|
107
|
-
let
|
|
108
|
-
if (
|
|
104
|
+
let K = S((e, t, n, r) => {
|
|
105
|
+
H(e, n, t, null), r ? st(e, t, r) : st(e, t, qe(n));
|
|
106
|
+
}, [H, st]), At = S(async (e, t, n, r, i) => {
|
|
107
|
+
let s = x.getState().sandboxesByMode[n]?.sandboxId ?? null, l = async (e) => {
|
|
108
|
+
if (Dt.current.isFresh(e)) return !0;
|
|
109
109
|
try {
|
|
110
|
-
return await m(e, r,
|
|
110
|
+
return await m(e, r, i, 3e5), await p(e, r, i, 9e4), Dt.current.markVerified(e), !0;
|
|
111
111
|
} catch {
|
|
112
|
-
return
|
|
112
|
+
return Dt.current.invalidate(e), !1;
|
|
113
113
|
}
|
|
114
114
|
};
|
|
115
|
-
if (
|
|
116
|
-
|
|
117
|
-
let
|
|
118
|
-
|
|
115
|
+
if (s && (W(n, s, "provisioning"), K(e, t, "provisioning", "Reusing assistant environment..."), await l(s) || (W(n, null, "provisioning"), s = null)), !s) {
|
|
116
|
+
K(e, t, "provisioning", "Looking for existing environment...");
|
|
117
|
+
let a = await c(r, A, n, Re(), i);
|
|
118
|
+
a && (W(n, a, "provisioning"), K(e, t, "provisioning", "Reusing assistant environment..."), await l(a) ? s = a : W(n, null, "provisioning"));
|
|
119
119
|
}
|
|
120
|
-
if (!
|
|
121
|
-
if (n === "api-calls" && !
|
|
122
|
-
|
|
120
|
+
if (!s) {
|
|
121
|
+
if (n === "api-calls" && !M()) throw Error("API Calls mode requires an authenticated session. Please sign in again.");
|
|
122
|
+
K(e, t, "provisioning", "Starting assistant environment..."), W(n, null, "provisioning"), await f(r, A, n, Re(), i), s = await a(A, n, r, Re(), We, i), W(n, s, "provisioning"), await m(s, r, i, 3e5), await p(s, r, i, 9e4);
|
|
123
123
|
}
|
|
124
|
-
|
|
125
|
-
let
|
|
126
|
-
if (
|
|
127
|
-
let e = await
|
|
124
|
+
W(n, s, "running");
|
|
125
|
+
let u = x.getState().conversations.find((t) => t.id === e)?.backendSessionId ?? null;
|
|
126
|
+
if (u) try {
|
|
127
|
+
let e = await d(s, r, u, i);
|
|
128
128
|
if (e.mode !== n) throw Error(`Session mode mismatch: expected ${n}, received ${e.mode}`);
|
|
129
129
|
} catch {
|
|
130
|
-
|
|
130
|
+
U(e), u = null;
|
|
131
131
|
}
|
|
132
|
-
return
|
|
133
|
-
sandboxId:
|
|
134
|
-
sessionId:
|
|
132
|
+
return u || (K(e, t, "connecting", "Preparing session..."), u = (await o(s, r, n, i)).sessionId, ut(e, u)), {
|
|
133
|
+
sandboxId: s,
|
|
134
|
+
sessionId: u
|
|
135
135
|
};
|
|
136
136
|
}, [
|
|
137
|
-
|
|
137
|
+
U,
|
|
138
|
+
M,
|
|
138
139
|
A,
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
140
|
+
ut,
|
|
141
|
+
W,
|
|
142
|
+
K
|
|
143
|
+
]), [jt, Mt] = Be(null), Nt = T(/* @__PURE__ */ new Set()), Pt = S(() => {
|
|
144
|
+
let e = x.getState(), t = e.activeConversationId;
|
|
145
|
+
if (!t) return;
|
|
146
|
+
let n = e.processingByConversationId[t], i = ge(n?.status) ? n?.messageId ?? null : null;
|
|
147
|
+
if (!ve({
|
|
148
|
+
interruptedTurnId: i,
|
|
149
|
+
activeTurnId: i,
|
|
150
|
+
alreadyRequested: i ? Nt.current.has(i) : !1
|
|
151
|
+
}).send || !i) return;
|
|
152
|
+
let a = e.sandboxesByMode[e.mode]?.sandboxId, o = Se(), s = e.conversations.find((e) => e.id === t)?.backendSessionId;
|
|
153
|
+
!a || !o || !s || (Nt.current.add(i), r(a, o, s, {
|
|
154
|
+
accessToken: M(),
|
|
155
|
+
workspaceToken: N(),
|
|
156
|
+
userId: P,
|
|
157
|
+
organizationId: xe()
|
|
158
|
+
}));
|
|
159
|
+
}, [
|
|
160
|
+
P,
|
|
161
|
+
M,
|
|
162
|
+
N
|
|
163
|
+
]), Ft = S(async (e) => {
|
|
164
|
+
let t = x.getState(), n = t.sandboxesByMode[t.mode]?.sandboxId, r = Se(), a = t.activeConversationId;
|
|
165
|
+
if (!(!n || !r || !a)) {
|
|
166
|
+
Mt(e);
|
|
147
167
|
try {
|
|
148
|
-
await
|
|
149
|
-
accessToken:
|
|
150
|
-
workspaceToken:
|
|
151
|
-
userId:
|
|
152
|
-
organizationId:
|
|
168
|
+
await i(n, r, e, {
|
|
169
|
+
accessToken: M(),
|
|
170
|
+
workspaceToken: N(),
|
|
171
|
+
userId: P,
|
|
172
|
+
organizationId: xe()
|
|
153
173
|
});
|
|
154
174
|
} catch (e) {
|
|
155
|
-
|
|
156
|
-
id:
|
|
175
|
+
Mt(null), B(a, {
|
|
176
|
+
id: D(),
|
|
157
177
|
role: "system",
|
|
158
178
|
content: e instanceof Error ? e.message : "The change could not be approved.",
|
|
159
179
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
160
180
|
});
|
|
161
181
|
return;
|
|
162
182
|
}
|
|
163
|
-
|
|
183
|
+
Mt(null), J.current(k("pendingWrite.approvedPrompt", "I approved that change — go ahead."));
|
|
164
184
|
}
|
|
165
185
|
}, [
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
]),
|
|
170
|
-
let i = r.voiceSessionId !== void 0, a = x.getState(),
|
|
171
|
-
if (
|
|
172
|
-
let
|
|
173
|
-
if (d ?
|
|
174
|
-
|
|
175
|
-
let
|
|
176
|
-
accessToken:
|
|
177
|
-
workspaceToken:
|
|
178
|
-
userId:
|
|
179
|
-
organizationId:
|
|
180
|
-
},
|
|
181
|
-
id:
|
|
186
|
+
P,
|
|
187
|
+
B,
|
|
188
|
+
k
|
|
189
|
+
]), q = S(async (e, t = [], r = {}) => {
|
|
190
|
+
let i = r.voiceSessionId !== void 0, a = x.getState(), o = a.activeConversationId ?? F;
|
|
191
|
+
if (o && (ge(a.processingByConversationId[o]?.status) || Ot.current.has(o))) return;
|
|
192
|
+
let c = a.mode, d = F, f = d ? x.getState().conversations.find((e) => e.id === d) : void 0;
|
|
193
|
+
if (d ? f && f.mode !== c && (f.messages.length > 0 || f.backendSessionId) ? d = z(void 0, c) : f && f.mode !== c && R(d, c) : d = z(void 0, c), !d) return;
|
|
194
|
+
Et.current[d] = t;
|
|
195
|
+
let p = Se(), m = {
|
|
196
|
+
accessToken: M(),
|
|
197
|
+
workspaceToken: N(),
|
|
198
|
+
userId: P,
|
|
199
|
+
organizationId: xe()
|
|
200
|
+
}, h = {
|
|
201
|
+
id: D(),
|
|
182
202
|
role: "user",
|
|
183
203
|
content: e,
|
|
184
204
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
185
205
|
metadata: {
|
|
186
|
-
...t.length ? { attachments: t.map(
|
|
206
|
+
...t.length ? { attachments: t.map(he) } : {},
|
|
187
207
|
..._(r.voiceSessionId)
|
|
188
208
|
}
|
|
189
209
|
};
|
|
190
|
-
|
|
191
|
-
let
|
|
192
|
-
|
|
193
|
-
id:
|
|
210
|
+
B(d, h);
|
|
211
|
+
let g = D();
|
|
212
|
+
B(d, {
|
|
213
|
+
id: g,
|
|
194
214
|
role: "assistant",
|
|
195
215
|
content: "",
|
|
196
216
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
197
217
|
metadata: {
|
|
198
|
-
lang:
|
|
218
|
+
lang: rt,
|
|
199
219
|
..._(r.voiceSessionId)
|
|
200
220
|
}
|
|
201
|
-
}),
|
|
202
|
-
let
|
|
203
|
-
|
|
221
|
+
}), H(d, "provisioning", g, null);
|
|
222
|
+
let ne = (e, t, n, i, a = rt) => {
|
|
223
|
+
V(d, g, { content: te(e) }), ct(d, g, {
|
|
204
224
|
lang: a,
|
|
205
225
|
...t?.length ? { artifacts: t } : {},
|
|
206
|
-
...t?.length || n || i ? { mode:
|
|
226
|
+
...t?.length || n || i ? { mode: c } : {},
|
|
207
227
|
...n ? { sessionId: n } : {},
|
|
208
228
|
...i ? { sandboxId: i } : {},
|
|
209
229
|
..._(r.voiceSessionId)
|
|
210
230
|
});
|
|
211
|
-
},
|
|
231
|
+
}, v = async (n = 1) => {
|
|
212
232
|
let r = !1;
|
|
213
233
|
try {
|
|
214
|
-
let { sandboxId: n, sessionId: a } = await
|
|
215
|
-
|
|
216
|
-
let
|
|
217
|
-
r =
|
|
234
|
+
let { sandboxId: n, sessionId: a } = await At(d, g, c, p, m), o = (await u(n, p, a, m, { limit: 50 }).catch(() => [])).reduce((e, t) => Math.max(e, O(t)), 0);
|
|
235
|
+
K(d, g, "streaming", "Thinking...");
|
|
236
|
+
let f = de(e, t), h = Ye?.(c, f, tt, nt, i) ?? f, _ = ue(h, t), v = pe(_), y = v > 0, re = Je?.();
|
|
237
|
+
r = fe(t) > v;
|
|
218
238
|
try {
|
|
219
|
-
await
|
|
239
|
+
await ee(n, p, a, h, c, re, m, _?.length ? { parts: _ } : void 0);
|
|
220
240
|
} catch (e) {
|
|
221
|
-
if (!_ || !
|
|
222
|
-
await
|
|
241
|
+
if (!_ || !Me(e)) throw e;
|
|
242
|
+
await ee(n, p, a, h, c, re, m, void 0), r ||= y;
|
|
223
243
|
}
|
|
224
|
-
let b =
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
})
|
|
229
|
-
|
|
230
|
-
|
|
244
|
+
let b = Ke([], o), ae = Date.now() + (He[c] ?? Ue), oe = Date.now(), se = Date.now(), ce = () => _e({
|
|
245
|
+
turnId: g,
|
|
246
|
+
abortRequested: Nt.current.has(g),
|
|
247
|
+
activeTurnId: x.getState().processingByConversationId[d]?.messageId ?? null
|
|
248
|
+
});
|
|
249
|
+
for (; Date.now() < ae;) {
|
|
250
|
+
let e = ce();
|
|
251
|
+
if (e.abandon) {
|
|
252
|
+
e.clearProcessing && lt(d);
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
if (b = Ke(await u(n, p, a, m, {
|
|
256
|
+
limit: 50,
|
|
257
|
+
sinceMs: o
|
|
258
|
+
}), o), V(d, g, { content: te(b.content) }), b.pendingWrite && ct(d, g, { pendingWrite: b.pendingWrite }), b.done) break;
|
|
259
|
+
Date.now() - oe > 3e4 && (await s(n, p, 600, m).catch(() => void 0), oe = Date.now()), await new Promise((e) => setTimeout(e, ie(Date.now() - se)));
|
|
260
|
+
}
|
|
261
|
+
if (!b.done && c !== "vibe-plugins") throw Error("Assistant response timed out while streaming progress");
|
|
262
|
+
let le = c === "vibe-plugins" ? await l(n, p, a, m).then((e) => e).catch(() => []) : void 0;
|
|
231
263
|
if (b.done || (b = {
|
|
232
264
|
...b,
|
|
233
265
|
content: `${b.content}\n\n_Still building in the background — any artifacts below will finish shortly. Re-open this conversation to pick up the completed plugin._`
|
|
234
266
|
}), r && (b = {
|
|
235
267
|
...b,
|
|
236
|
-
content: `${b.content}\n\n${
|
|
237
|
-
}),
|
|
238
|
-
|
|
268
|
+
content: `${b.content}\n\n${k("attachments.imagesNotSent", "_Your photo was too large to include with this message, so the answer above is from the text and the file link only. Try a smaller or more tightly cropped photo._")}`
|
|
269
|
+
}), ne(b.content, le, a, n), b.tokens) {
|
|
270
|
+
V(d, g, { tokens: b.tokens });
|
|
239
271
|
try {
|
|
240
|
-
await
|
|
241
|
-
workspaceId:
|
|
272
|
+
await Xe?.({
|
|
273
|
+
workspaceId: p,
|
|
242
274
|
sessionId: a,
|
|
243
275
|
messageId: b.messageId,
|
|
244
276
|
model: b.model,
|
|
245
277
|
tokens: b.tokens
|
|
246
|
-
}),
|
|
278
|
+
}), Fe(A);
|
|
247
279
|
} catch {}
|
|
248
280
|
}
|
|
249
|
-
|
|
281
|
+
let me = ce();
|
|
282
|
+
if (me.abandon) {
|
|
283
|
+
me.clearProcessing && lt(d);
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
H(d, "complete", g, null);
|
|
250
287
|
} catch (e) {
|
|
251
|
-
if (n === 1 &&
|
|
288
|
+
if (n === 1 && Ne(e)) return U(d), dt(c), v(2);
|
|
252
289
|
throw e;
|
|
253
290
|
}
|
|
254
|
-
},
|
|
255
|
-
|
|
291
|
+
}, y = d;
|
|
292
|
+
Ot.current.add(y);
|
|
256
293
|
try {
|
|
257
|
-
if (!
|
|
258
|
-
await
|
|
294
|
+
if (!p) throw Error("Assistant backend is unavailable without an active workspace context.");
|
|
295
|
+
await v();
|
|
259
296
|
} catch (e) {
|
|
260
|
-
|
|
297
|
+
Dt.current.invalidate(x.getState().sandboxesByMode[c]?.sandboxId ?? null);
|
|
261
298
|
let t = n(e);
|
|
262
299
|
if (t) {
|
|
263
|
-
t.refusal === "exhausted" &&
|
|
300
|
+
t.refusal === "exhausted" && Pe(A, "sandbox");
|
|
264
301
|
let e = [t.quotaName, t.traceId ? `reference ${t.traceId}` : null].filter(Boolean).join(" · "), n = t.refusal === "exhausted" ? "You've reached your sandbox limit on the current plan. Upgrade to start the AI assistant." : "This workspace has no sandbox allowance provisioned, so the AI assistant cannot start. Upgrading will not help — ask an administrator to provision it.";
|
|
265
|
-
|
|
302
|
+
ne(e ? `${n}\n\n${e}` : n, void 0, void 0, void 0, "en"), H(d, "error", g, null);
|
|
266
303
|
return;
|
|
267
304
|
}
|
|
268
305
|
let i = e instanceof Error ? e.message : "Something went wrong";
|
|
269
|
-
|
|
306
|
+
H(d, "error", g, i), V(d, g, { content: `Sorry, an error occurred: ${i}. Please try again.` }), ct(d, g, {
|
|
270
307
|
lang: "en",
|
|
271
308
|
..._(r.voiceSessionId)
|
|
272
309
|
});
|
|
273
310
|
} finally {
|
|
274
|
-
|
|
311
|
+
Ot.current.delete(y);
|
|
275
312
|
}
|
|
276
313
|
}, [
|
|
277
|
-
j,
|
|
278
314
|
F,
|
|
315
|
+
B,
|
|
316
|
+
Ye,
|
|
317
|
+
U,
|
|
318
|
+
dt,
|
|
319
|
+
it,
|
|
320
|
+
z,
|
|
321
|
+
At,
|
|
279
322
|
Je,
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
P,
|
|
284
|
-
Tt,
|
|
285
|
-
qe,
|
|
323
|
+
M,
|
|
324
|
+
N,
|
|
325
|
+
V,
|
|
286
326
|
A,
|
|
287
327
|
Xe,
|
|
288
|
-
I,
|
|
289
|
-
O,
|
|
290
|
-
Ye,
|
|
291
|
-
rt,
|
|
292
|
-
it,
|
|
293
328
|
nt,
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
329
|
+
rt,
|
|
330
|
+
tt,
|
|
331
|
+
ut,
|
|
332
|
+
R,
|
|
333
|
+
H,
|
|
334
|
+
lt,
|
|
335
|
+
k,
|
|
336
|
+
K,
|
|
337
|
+
P
|
|
338
|
+
]), It = S((e) => {
|
|
339
|
+
q(e);
|
|
340
|
+
}, [q]), Lt = S(() => {
|
|
341
|
+
let e = [...G.chat].reverse().find((e) => e.role === "user"), t = F ? Et.current[F] ?? [] : [];
|
|
342
|
+
e && q(e.content, t);
|
|
305
343
|
}, [
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
]),
|
|
344
|
+
mt,
|
|
345
|
+
q,
|
|
346
|
+
F
|
|
347
|
+
]), J = T(q);
|
|
310
348
|
C(() => {
|
|
311
|
-
|
|
312
|
-
}, [
|
|
313
|
-
let
|
|
314
|
-
if (
|
|
315
|
-
for (let e =
|
|
316
|
-
let t =
|
|
349
|
+
J.current = q;
|
|
350
|
+
}, [q]);
|
|
351
|
+
let Rt = w(() => {
|
|
352
|
+
if (gt) return null;
|
|
353
|
+
for (let e = mt.length - 1; e >= 0; --e) {
|
|
354
|
+
let t = mt[e];
|
|
317
355
|
if (t?.role !== "assistant" || !g(t)) continue;
|
|
318
|
-
let n =
|
|
356
|
+
let n = ye(t.content).text.trim();
|
|
319
357
|
return n ? {
|
|
320
358
|
id: t.id,
|
|
321
359
|
text: n
|
|
322
360
|
} : null;
|
|
323
361
|
}
|
|
324
362
|
return null;
|
|
325
|
-
}, [
|
|
363
|
+
}, [mt, gt]), zt = w(() => Rt ? b(Rt.text) : null, [Rt]), Bt = G.chat, Y = w(() => G.voice.filter((e) => e.role === "user" || e.role === "assistant").map((e) => ({
|
|
326
364
|
id: e.id,
|
|
327
365
|
role: e.role,
|
|
328
|
-
text:
|
|
329
|
-
sessionId:
|
|
366
|
+
text: ye(e.content).text.trim(),
|
|
367
|
+
sessionId: ne(e),
|
|
330
368
|
timestamp: e.timestamp
|
|
331
|
-
})).filter((e) => e.text.length > 0), [
|
|
332
|
-
if (
|
|
369
|
+
})).filter((e) => e.text.length > 0), [G.voice]), Vt = S(() => {
|
|
370
|
+
if (Y.length === 0) return;
|
|
333
371
|
let e = /* @__PURE__ */ new Date();
|
|
334
|
-
|
|
335
|
-
title:
|
|
336
|
-
savedAt:
|
|
337
|
-
session:
|
|
338
|
-
earlier:
|
|
339
|
-
you:
|
|
340
|
-
assistant:
|
|
341
|
-
}, e),
|
|
372
|
+
Ee(y(Y, {
|
|
373
|
+
title: k("voiceSession.transcript", "Voice conversation"),
|
|
374
|
+
savedAt: k("voiceSession.savedAt", "Saved"),
|
|
375
|
+
session: k("voiceSession.sessionLabel", "Session"),
|
|
376
|
+
earlier: k("voiceSession.earlierLabel", "Earlier"),
|
|
377
|
+
you: k("voiceSession.speakerYou", "You"),
|
|
378
|
+
assistant: k("voiceSession.speakerAssistant", "Assistant")
|
|
379
|
+
}, e), re(A, e), "text/markdown");
|
|
342
380
|
}, [
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
]),
|
|
347
|
-
|
|
348
|
-
let
|
|
381
|
+
A,
|
|
382
|
+
Y,
|
|
383
|
+
k
|
|
384
|
+
]), X = Ie(), Z = T(X);
|
|
385
|
+
Z.current = X;
|
|
386
|
+
let Q = be({
|
|
349
387
|
onSubmit: S((e, t) => {
|
|
350
388
|
let n = () => {
|
|
351
|
-
let n =
|
|
352
|
-
|
|
389
|
+
let n = Z.current, r = me(n.attachments);
|
|
390
|
+
J.current(e, r, { voiceSessionId: t }), n.clear();
|
|
353
391
|
};
|
|
354
|
-
if (!
|
|
392
|
+
if (!Z.current.isBusy) {
|
|
355
393
|
n();
|
|
356
394
|
return;
|
|
357
395
|
}
|
|
358
396
|
let r = Date.now(), i = window.setInterval(() => {
|
|
359
|
-
|
|
397
|
+
Z.current.isBusy && Date.now() - r < Ge || (window.clearInterval(i), n());
|
|
360
398
|
}, 200);
|
|
361
399
|
}, []),
|
|
362
|
-
latestReply:
|
|
363
|
-
language:
|
|
364
|
-
}),
|
|
400
|
+
latestReply: Rt,
|
|
401
|
+
language: ae(Qe, Ze).tag
|
|
402
|
+
}), Ht = w(() => (pt?.messages ?? []).reduce((e, t) => Math.max(e, t.metadata?.continuedVoiceTurns ?? 0), 0), [pt?.messages]), Ut = Y.length > Ht, Wt = S(() => {
|
|
365
403
|
let e = x.getState().activeConversationId;
|
|
366
|
-
!e ||
|
|
367
|
-
id:
|
|
404
|
+
!e || Y.length === 0 || (B(e, {
|
|
405
|
+
id: D(),
|
|
368
406
|
role: "system",
|
|
369
|
-
content:
|
|
370
|
-
intro:
|
|
371
|
-
nothing:
|
|
372
|
-
more: (e) =>
|
|
407
|
+
content: v(Y.slice(Ht), {
|
|
408
|
+
intro: k("voiceSession.continuedIntro", "Continued from a voice conversation. You asked about:"),
|
|
409
|
+
nothing: k("voiceSession.continuedNothing", "Continued from a voice conversation."),
|
|
410
|
+
more: (e) => k("voiceSession.continuedMore", "…and {{count}} more", { count: e })
|
|
373
411
|
}),
|
|
374
412
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
375
|
-
metadata: { continuedVoiceTurns:
|
|
376
|
-
}),
|
|
413
|
+
metadata: { continuedVoiceTurns: Y.length }
|
|
414
|
+
}), Tt(!1), Q.end());
|
|
377
415
|
}, [
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
]),
|
|
416
|
+
Y,
|
|
417
|
+
Ht,
|
|
418
|
+
B,
|
|
419
|
+
k,
|
|
420
|
+
Q
|
|
421
|
+
]), Gt = T(0);
|
|
384
422
|
C(() => {
|
|
385
|
-
|
|
386
|
-
}, [
|
|
387
|
-
let
|
|
388
|
-
let e =
|
|
389
|
-
|
|
390
|
-
}, [
|
|
423
|
+
Q.active && (Gt.current = Y.length);
|
|
424
|
+
}, [Q.active]);
|
|
425
|
+
let Kt = S(() => {
|
|
426
|
+
let e = Y.length > Gt.current;
|
|
427
|
+
Q.end(), e && Tt(!0);
|
|
428
|
+
}, [Y, Q]);
|
|
391
429
|
C(() => {
|
|
392
|
-
!h &&
|
|
393
|
-
}, [h,
|
|
394
|
-
|
|
395
|
-
}, [
|
|
430
|
+
!h && Q.active && Q.end();
|
|
431
|
+
}, [h, Q]), C(() => {
|
|
432
|
+
Q.active || Z.current.clear();
|
|
433
|
+
}, [Q.active]), C(() => {
|
|
396
434
|
let e = x.getState().consumePendingPrompt();
|
|
397
|
-
return e &&
|
|
435
|
+
return e && J.current(e), x.subscribe((e, t) => {
|
|
398
436
|
if (e.pendingPrompt && e.pendingPrompt !== t.pendingPrompt) {
|
|
399
437
|
let e = x.getState().consumePendingPrompt();
|
|
400
|
-
e &&
|
|
438
|
+
e && J.current(e);
|
|
401
439
|
}
|
|
402
440
|
});
|
|
403
441
|
}, []);
|
|
404
|
-
let
|
|
405
|
-
let t =
|
|
442
|
+
let $ = S((e) => {
|
|
443
|
+
let t = F ? x.getState().conversations.find((e) => e.id === F) : void 0;
|
|
406
444
|
if (t && (t.messages.length > 0 || t.backendSessionId)) {
|
|
407
445
|
if (t.mode !== e) {
|
|
408
446
|
let t = x.getState().conversations.find((t) => t.mode === e && t.messages.length === 0 && !t.backendSessionId && !x.getState().processingByConversationId[t.id]);
|
|
409
|
-
t ?
|
|
447
|
+
t ? ot(t.id) : z(void 0, e);
|
|
410
448
|
}
|
|
411
|
-
} else
|
|
412
|
-
|
|
449
|
+
} else F && R(F, e);
|
|
450
|
+
L(e);
|
|
413
451
|
}, [
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
]),
|
|
420
|
-
if (
|
|
421
|
-
|
|
452
|
+
F,
|
|
453
|
+
z,
|
|
454
|
+
ot,
|
|
455
|
+
R,
|
|
456
|
+
L
|
|
457
|
+
]), qt = S((e) => {
|
|
458
|
+
if (j.find((t) => t.id === e)?.writeCapable && !x.getState().apiCallsAcknowledged) {
|
|
459
|
+
Ct(e);
|
|
422
460
|
return;
|
|
423
461
|
}
|
|
424
|
-
|
|
425
|
-
}, [
|
|
426
|
-
let e =
|
|
427
|
-
|
|
462
|
+
$(e);
|
|
463
|
+
}, [$, j]), Jt = S(() => {
|
|
464
|
+
let e = St;
|
|
465
|
+
Ct(null), ft(), e && $(e);
|
|
428
466
|
}, [
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
]),
|
|
433
|
-
|
|
467
|
+
St,
|
|
468
|
+
ft,
|
|
469
|
+
$
|
|
470
|
+
]), Yt = S(() => {
|
|
471
|
+
Ct(null);
|
|
434
472
|
}, []);
|
|
435
|
-
return /* @__PURE__ */
|
|
473
|
+
return /* @__PURE__ */ Ve("div", {
|
|
436
474
|
className: "relative flex flex-1 flex-col overflow-hidden",
|
|
437
475
|
children: [
|
|
438
|
-
/* @__PURE__ */
|
|
476
|
+
/* @__PURE__ */ Ve("div", {
|
|
439
477
|
className: "contents",
|
|
440
|
-
inert:
|
|
478
|
+
inert: Q.active || void 0,
|
|
441
479
|
children: [
|
|
442
|
-
|
|
443
|
-
count:
|
|
444
|
-
onOpenTranscript: () =>
|
|
480
|
+
Y.length > 0 && !Q.active ? /* @__PURE__ */ E(we, {
|
|
481
|
+
count: Y.length,
|
|
482
|
+
onOpenTranscript: () => Tt(!0)
|
|
445
483
|
}) : null,
|
|
446
|
-
|
|
447
|
-
mode:
|
|
448
|
-
onSuggestionClick:
|
|
484
|
+
Bt.length === 0 ? /* @__PURE__ */ E(De, {
|
|
485
|
+
mode: I,
|
|
486
|
+
onSuggestionClick: It
|
|
449
487
|
}) : /* @__PURE__ */ E("div", {
|
|
450
488
|
className: "flex min-h-0 flex-1 flex-col",
|
|
451
|
-
children: /* @__PURE__ */ E(
|
|
452
|
-
onApprovePendingWrite:
|
|
453
|
-
approvingWriteRef:
|
|
454
|
-
messages:
|
|
455
|
-
streamingMessageId:
|
|
456
|
-
failedMessageId:
|
|
457
|
-
onRetry:
|
|
489
|
+
children: /* @__PURE__ */ E(Oe, {
|
|
490
|
+
onApprovePendingWrite: Ft,
|
|
491
|
+
approvingWriteRef: jt,
|
|
492
|
+
messages: Bt,
|
|
493
|
+
streamingMessageId: _t,
|
|
494
|
+
failedMessageId: vt,
|
|
495
|
+
onRetry: Lt
|
|
458
496
|
})
|
|
459
497
|
}),
|
|
460
|
-
/* @__PURE__ */ E(
|
|
461
|
-
onStartVoiceSession:
|
|
462
|
-
onSend: (e, t) => void
|
|
463
|
-
disabled:
|
|
464
|
-
placeholder:
|
|
465
|
-
mode:
|
|
466
|
-
writeAccessDenied:
|
|
467
|
-
availableModes:
|
|
468
|
-
onModeChange:
|
|
498
|
+
/* @__PURE__ */ E(Le, {
|
|
499
|
+
onStartVoiceSession: Q.available && I !== "api-calls" ? Q.start : void 0,
|
|
500
|
+
onSend: (e, t) => void q(e, t),
|
|
501
|
+
disabled: gt,
|
|
502
|
+
placeholder: I === "api-calls" ? k("chatArea.placeholderActions", "What would you like me to do?") : k("chatArea.placeholderGeneral", "Ask me anything…"),
|
|
503
|
+
mode: I,
|
|
504
|
+
writeAccessDenied: se === "denied" && !!kt?.writeCapable,
|
|
505
|
+
availableModes: xt,
|
|
506
|
+
onModeChange: qt
|
|
469
507
|
})
|
|
470
508
|
]
|
|
471
509
|
}),
|
|
472
|
-
|
|
473
|
-
turns:
|
|
474
|
-
onClose: () =>
|
|
475
|
-
onSave:
|
|
476
|
-
onContinueInChat:
|
|
510
|
+
wt && !Q.active ? /* @__PURE__ */ E(Te, {
|
|
511
|
+
turns: Y,
|
|
512
|
+
onClose: () => Tt(!1),
|
|
513
|
+
onSave: Vt,
|
|
514
|
+
onContinueInChat: Ut ? Wt : void 0,
|
|
477
515
|
closeOnEscape: !0
|
|
478
516
|
}) : null,
|
|
479
|
-
|
|
480
|
-
session:
|
|
481
|
-
notice:
|
|
482
|
-
capturing:
|
|
483
|
-
interrupting:
|
|
484
|
-
awaitingEndpoint:
|
|
485
|
-
turns:
|
|
486
|
-
spokenChunks:
|
|
487
|
-
attachments:
|
|
488
|
-
onAttachFiles:
|
|
489
|
-
onRemoveAttachment:
|
|
490
|
-
onRetryAttachment:
|
|
491
|
-
canAttachMore:
|
|
492
|
-
preparingAttachments:
|
|
493
|
-
onSaveTranscript:
|
|
494
|
-
onContinueInChat:
|
|
495
|
-
onInterrupt:
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
517
|
+
Q.active && /* @__PURE__ */ E(ke, {
|
|
518
|
+
session: Q.session,
|
|
519
|
+
notice: Q.notice,
|
|
520
|
+
capturing: Q.capturing,
|
|
521
|
+
interrupting: Q.interrupting,
|
|
522
|
+
awaitingEndpoint: Q.awaitingEndpoint,
|
|
523
|
+
turns: Y,
|
|
524
|
+
spokenChunks: Q.spokenChunks,
|
|
525
|
+
attachments: X.attachments,
|
|
526
|
+
onAttachFiles: X.addFiles,
|
|
527
|
+
onRemoveAttachment: X.remove,
|
|
528
|
+
onRetryAttachment: X.retry,
|
|
529
|
+
canAttachMore: X.canAddMore,
|
|
530
|
+
preparingAttachments: X.preparingCount,
|
|
531
|
+
onSaveTranscript: Vt,
|
|
532
|
+
onContinueInChat: Wt,
|
|
533
|
+
onInterrupt: () => {
|
|
534
|
+
Q.interrupt(), Pt();
|
|
535
|
+
},
|
|
536
|
+
spoken: zt,
|
|
537
|
+
onToggleMute: Q.toggleMute,
|
|
538
|
+
onEnd: Kt
|
|
499
539
|
}),
|
|
500
|
-
/* @__PURE__ */ E(
|
|
501
|
-
open:
|
|
502
|
-
onConfirm:
|
|
503
|
-
onCancel:
|
|
540
|
+
/* @__PURE__ */ E(ze, {
|
|
541
|
+
open: St !== null,
|
|
542
|
+
onConfirm: Jt,
|
|
543
|
+
onCancel: Yt
|
|
504
544
|
})
|
|
505
545
|
]
|
|
506
546
|
});
|
|
507
547
|
};
|
|
508
548
|
//#endregion
|
|
509
|
-
export {
|
|
549
|
+
export { j as AssistantChatArea };
|