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