@burdenoff/fe-libs 2026.908.2 → 2026.909.2

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.
@@ -1,39 +1,39 @@
1
- import { micIsInterrupt as e, voiceStageState as t } from "../../voice/voiceStageState.js";
2
- import { spokenSoFar as n } from "../../voice/voiceSession.js";
3
- import { useAssistantTr as r } from "../../i18n.js";
4
- import { AssistantAttachmentButton as i } from "../composer/AssistantAttachmentButton.js";
1
+ import { micIsInterrupt as e, showsAssistantCaption as t, voiceStageState as n } from "../../voice/voiceStageState.js";
2
+ import { spokenSoFar as r } from "../../voice/voiceSession.js";
3
+ import { useAssistantTr as i } from "../../i18n.js";
4
+ import { AssistantAttachmentButton as ee } from "../composer/AssistantAttachmentButton.js";
5
5
  import { AssistantAttachmentChips as a } from "../composer/AssistantAttachmentChips.js";
6
- import { AssistantVoiceOrb as o } from "./AssistantVoiceOrb.js";
7
- import { VoiceMiniController as s } from "./VoiceMiniController.js";
8
- import { VoiceStage as c } from "./VoiceStage.js";
9
- import { VoiceTranscriptDrawer as ee } from "./VoiceTranscriptDrawer.js";
10
- import { useCallback as te, useEffect as l, useRef as u, useState as d } from "react";
11
- import { Maximize2 as f, Minimize2 as p, ScrollText as m, X as h } from "lucide-react";
12
- import { jsx as g, jsxs as _ } from "react/jsx-runtime";
6
+ import { AssistantVoiceOrb as te } from "./AssistantVoiceOrb.js";
7
+ import { VoiceMiniController as o } from "./VoiceMiniController.js";
8
+ import { VoiceStage as s } from "./VoiceStage.js";
9
+ import { VoiceTranscriptDrawer as c } from "./VoiceTranscriptDrawer.js";
10
+ import { useCallback as l, useEffect as u, useRef as d, useState as f } from "react";
11
+ import { Maximize2 as ne, Minimize2 as re, ScrollText as p, X as m } from "lucide-react";
12
+ import { jsx as h, jsxs as g } from "react/jsx-runtime";
13
13
  //#region src/shared/assistant/ui/voice/AssistantVoiceSession.tsx
14
- var v = ({ session: v, turns: b = [], onSaveTranscript: x, onContinueInChat: S, notice: C = null, spoken: w, onInterrupt: T, onToggleMute: E, attachments: D = [], onAttachFiles: O, onRemoveAttachment: k, onRetryAttachment: re, canAttachMore: ie = !0, preparingAttachments: A = 0, spokenChunks: j = null, onEnd: M, capturing: ae = !0, interrupting: N = !1, awaitingEndpoint: P = !1 }) => {
15
- let F = r(), { muted: I, error: L } = v, R = u(null), z = u(null), [B, V] = d("mini"), H = B === "full", U = B === "mini", W = B === "mini" ? "panel" : B === "panel" ? "full" : "mini", [G, K] = d(!1), q = u(!1), J = u(E);
16
- J.current = E;
17
- let oe = te(() => {
18
- I || q.current || n(v) || (q.current = !0, J.current());
19
- }, [I, v]);
20
- l(() => {
14
+ var _ = ({ session: _, turns: b = [], onSaveTranscript: ie, onContinueInChat: ae, notice: x = null, spoken: S, onInterrupt: oe, onToggleMute: C, attachments: w = [], onAttachFiles: T, onRemoveAttachment: E, onRetryAttachment: D, canAttachMore: O = !0, preparingAttachments: k = 0, spokenChunks: A = null, onEnd: j, capturing: M = !0, interrupting: N = !1, awaitingEndpoint: P = !1 }) => {
15
+ let F = i(), { muted: I, error: L } = _, R = d(null), z = d(null), [B, V] = f("mini"), H = B === "full", U = B === "mini", W = B === "mini" ? "panel" : B === "panel" ? "full" : "mini", [G, K] = f(!1), q = d(!1), J = d(C);
16
+ J.current = C;
17
+ let se = l(() => {
18
+ I || q.current || r(_) || (q.current = !0, J.current());
19
+ }, [I, _]);
20
+ u(() => {
21
21
  let e = () => {
22
22
  q.current && (q.current = !1, J.current());
23
23
  };
24
24
  return window.addEventListener("focus", e), () => {
25
25
  window.removeEventListener("focus", e), q.current = !1;
26
26
  };
27
- }, []), l(() => {
27
+ }, []), u(() => {
28
28
  R.current?.focus();
29
- }, []), l(() => {
29
+ }, []), u(() => {
30
30
  let e = (e) => {
31
31
  if (e.key === "Escape") {
32
32
  if (G) {
33
33
  K(!1);
34
34
  return;
35
35
  }
36
- M();
36
+ j();
37
37
  return;
38
38
  }
39
39
  if (e.key !== "Tab" || !H) return;
@@ -44,13 +44,13 @@ var v = ({ session: v, turns: b = [], onSaveTranscript: x, onContinueInChat: S,
44
44
  };
45
45
  return window.addEventListener("keydown", e), () => window.removeEventListener("keydown", e);
46
46
  }, [
47
- M,
47
+ j,
48
48
  H,
49
49
  G
50
50
  ]);
51
- let Y = C !== null && L === null, X = n(v), Z = t({
52
- snapshot: v,
53
- capturing: ae,
51
+ let Y = x !== null && L === null, X = r(_), Z = n({
52
+ snapshot: _,
53
+ capturing: M,
54
54
  interrupting: N,
55
55
  awaitingEndpoint: P
56
56
  }), Q = (() => {
@@ -66,7 +66,7 @@ var v = ({ session: v, turns: b = [], onSaveTranscript: x, onContinueInChat: S,
66
66
  default: return Z;
67
67
  }
68
68
  })(), $ = I && Z !== "listening" && Q !== "" ? `${Q} · ${F("voiceSession.muted", "Microphone off")}` : Q;
69
- return /* @__PURE__ */ _("div", {
69
+ return /* @__PURE__ */ g("div", {
70
70
  ref: z,
71
71
  className: `flex flex-col items-center justify-between bg-bg-sunken ${B === "full" ? "fixed inset-x-0 bottom-0 top-14 z-[60] px-6 py-8" : B === "panel" ? "absolute inset-0 z-20 px-4 py-6" : "absolute inset-x-0 bottom-0 z-20 h-[11.25rem] border-t border-border-subtle px-3 py-3 shadow-lg"}`,
72
72
  role: "dialog",
@@ -74,103 +74,103 @@ var v = ({ session: v, turns: b = [], onSaveTranscript: x, onContinueInChat: S,
74
74
  "aria-label": F("voiceSession.title", "Voice conversation"),
75
75
  "data-testid": "assistant-voice-session",
76
76
  children: [
77
- /* @__PURE__ */ _("button", {
77
+ /* @__PURE__ */ g("button", {
78
78
  ref: R,
79
79
  type: "button",
80
- onClick: M,
80
+ onClick: j,
81
81
  className: `absolute ${H ? "right-6 top-6 h-14 gap-2 px-5 text-base" : U ? "right-12 top-2 h-8 gap-1.5 px-2.5 text-xs" : "right-3 top-3 h-11 gap-2 px-4 text-sm"} flex items-center justify-center rounded-full border border-border-default bg-bg-elevated text-text-secondary hover:bg-bg-sunken transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong`,
82
82
  title: F("voiceSession.end", "End the voice conversation"),
83
83
  "data-testid": "assistant-voice-end",
84
- children: [/* @__PURE__ */ g(h, {
84
+ children: [/* @__PURE__ */ h(m, {
85
85
  className: H ? "size-6" : U ? "size-4" : "size-5",
86
86
  "aria-hidden": "true"
87
- }), /* @__PURE__ */ g("span", {
87
+ }), /* @__PURE__ */ h("span", {
88
88
  className: `truncate whitespace-nowrap font-medium ${U ? "max-w-[3.5rem] text-xs" : "max-w-[7rem]"}`,
89
89
  children: F("voiceSession.endShort", "End")
90
90
  })]
91
91
  }),
92
- /* @__PURE__ */ g("div", {
92
+ /* @__PURE__ */ h("div", {
93
93
  className: `flex flex-col items-center ${U ? "px-3" : `min-h-[1.5rem] ${Y ? H ? "pt-14" : "pt-10" : ""}`}`,
94
- children: Y ? /* @__PURE__ */ g("p", {
94
+ children: Y ? /* @__PURE__ */ h("p", {
95
95
  className: "max-w-xs text-center text-xs text-status-warning",
96
96
  "data-testid": "assistant-voice-notice",
97
- children: ne(C, F)
97
+ children: v(x, F)
98
98
  }) : null
99
99
  }),
100
100
  (() => {
101
- let t = /* @__PURE__ */ g(o, {
102
- session: v,
101
+ let n = /* @__PURE__ */ h(te, {
102
+ session: _,
103
103
  compact: U,
104
104
  connecting: Z === "connecting",
105
- onPress: e(Z) ? T : E,
105
+ onPress: e(Z) ? oe : C,
106
106
  label: e(Z) ? F("voiceSession.interrupt", "Stop the assistant and speak") : I ? F("voiceSession.unmute", "Turn the microphone on") : F("voiceSession.mute", "Turn the microphone off")
107
- }), n = e(Z) ? w : X || null, r = L === null ? null : y(L, F);
108
- return U ? /* @__PURE__ */ g(s, {
109
- spokenChunks: j,
107
+ }), r = t(Z) ? S : X || null, i = L === null ? null : y(L, F);
108
+ return U ? /* @__PURE__ */ h(o, {
109
+ spokenChunks: A,
110
110
  state: Z,
111
- caption: n,
111
+ caption: r,
112
112
  statusText: $,
113
- errorText: r,
114
- control: t
115
- }) : /* @__PURE__ */ g(c, {
113
+ errorText: i,
114
+ control: n
115
+ }) : /* @__PURE__ */ h(s, {
116
116
  state: Z,
117
117
  userCaption: X || null,
118
- spokenChunks: j,
119
- assistantCaption: w,
118
+ spokenChunks: A,
119
+ assistantCaption: S,
120
120
  expanded: H,
121
121
  statusText: $,
122
- errorText: r,
123
- control: t
122
+ errorText: i,
123
+ control: n
124
124
  });
125
125
  })(),
126
- G ? /* @__PURE__ */ g(ee, {
126
+ G ? /* @__PURE__ */ h(c, {
127
127
  turns: b,
128
128
  onClose: () => K(!1),
129
- onSave: x,
130
- onContinueInChat: S
129
+ onSave: ie,
130
+ onContinueInChat: ae
131
131
  }) : null,
132
- O ? /* @__PURE__ */ g("div", {
132
+ T ? /* @__PURE__ */ h("div", {
133
133
  className: `absolute ${H ? "left-6 top-6" : U ? "left-11 top-2" : "left-3 top-3"}`,
134
- children: /* @__PURE__ */ g(i, {
134
+ children: /* @__PURE__ */ h(ee, {
135
135
  onFiles: (e) => {
136
- O(e), V((e) => e === "mini" ? "panel" : e);
136
+ T(e), V((e) => e === "mini" ? "panel" : e);
137
137
  },
138
- onPickerOpen: oe,
138
+ onPickerOpen: se,
139
139
  direction: "down",
140
- canAddMore: ie
140
+ canAddMore: O
141
141
  })
142
142
  }) : null,
143
- (D.length > 0 || A > 0) && !U ? /* @__PURE__ */ g("div", {
143
+ (w.length > 0 || k > 0) && !U ? /* @__PURE__ */ h("div", {
144
144
  className: `absolute ${H ? "bottom-24 left-24 right-24" : "bottom-16 left-16 right-16"}`,
145
145
  "data-testid": "assistant-voice-attachments",
146
- children: /* @__PURE__ */ g(a, {
147
- attachments: D,
148
- onRemove: k ?? (() => void 0),
149
- onRetry: re ?? (() => void 0),
150
- preparingCount: A
146
+ children: /* @__PURE__ */ h(a, {
147
+ attachments: w,
148
+ onRemove: E ?? (() => void 0),
149
+ onRetry: D ?? (() => void 0),
150
+ preparingCount: k
151
151
  })
152
152
  }) : null,
153
- /* @__PURE__ */ g("button", {
153
+ /* @__PURE__ */ h("button", {
154
154
  type: "button",
155
155
  onClick: () => K((e) => !e),
156
156
  className: `absolute ${H ? "bottom-6 right-6 size-14" : U ? "right-2 top-2 size-8" : "bottom-3 right-3 size-11"} flex items-center justify-center rounded-full bg-bg-elevated text-text-secondary transition-colors hover:bg-bg-raised hover:text-text-primary focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong`,
157
157
  "aria-pressed": G,
158
158
  "aria-label": F("voiceSession.transcript", "Voice transcript"),
159
159
  "data-testid": "assistant-voice-transcript-toggle",
160
- children: /* @__PURE__ */ g(m, { className: H ? "size-6" : U ? "size-4" : "size-5" })
160
+ children: /* @__PURE__ */ h(p, { className: H ? "size-6" : U ? "size-4" : "size-5" })
161
161
  }),
162
- /* @__PURE__ */ g("button", {
162
+ /* @__PURE__ */ h("button", {
163
163
  type: "button",
164
164
  onClick: () => V(W),
165
165
  className: `absolute ${H ? "bottom-6 left-6 size-14" : U ? "left-2 top-2 size-8" : "bottom-3 left-3 size-11"} flex items-center justify-center rounded-full bg-bg-elevated text-text-secondary transition-colors hover:bg-bg-raised hover:text-text-primary focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong`,
166
166
  "aria-label": W === "panel" ? F("voiceSession.expandPanel", "Show the conversation in the panel") : W === "full" ? F("voiceSession.expand", "Expand the conversation to full screen") : F("voiceSession.collapse", "Shrink to the compact controller"),
167
167
  "data-testid": "assistant-voice-expand",
168
- children: H ? /* @__PURE__ */ g(p, { className: "size-5" }) : /* @__PURE__ */ g(f, { className: U ? "size-4" : "size-5" })
168
+ children: H ? /* @__PURE__ */ h(re, { className: "size-5" }) : /* @__PURE__ */ h(ne, { className: U ? "size-4" : "size-5" })
169
169
  })
170
170
  ]
171
171
  });
172
172
  };
173
- function ne(e, t) {
173
+ function v(e, t) {
174
174
  switch (e) {
175
175
  case "network": return t("voiceSession.noticeNetwork", "Speech recognition lost its connection. Check your network — it will retry.");
176
176
  case "not-capturing": return t("voiceSession.noticeNotCapturing", "The microphone did not start. Check that this site is allowed to use it, then try again.");
@@ -188,4 +188,4 @@ function y(e, t) {
188
188
  }
189
189
  }
190
190
  //#endregion
191
- export { v as AssistantVoiceSession };
191
+ export { _ as AssistantVoiceSession };
@@ -64,4 +64,36 @@ export declare function isSpeakingMessage(state: SpeechPlaybackState, messageId:
64
64
  * utterances rather than a single one.
65
65
  */
66
66
  export declare function requiresCancel(state: SpeechPlaybackState): boolean;
67
+ /**
68
+ * The chunk progress that may be PUBLISHED right now.
69
+ *
70
+ * ★★ Progress OUTLIVES the utterance that produced it. Nothing clears
71
+ * `spokenProgress` — not `stop`, not `finished`, not `failed`, not a
72
+ * conversation switch — so after any playback ends the provider still holds
73
+ * that reply's chunks with `index >= 0`. Both caption surfaces take their
74
+ * synced branch on the STAGE alone (`spokenChunks.index >= 0`), with no message
75
+ * identity anywhere, so the next reply that does not itself speak is captioned
76
+ * with the PREVIOUS answer.
77
+ *
78
+ * That is the stale-output defect in the correction flow: interrupt Q1, ask a
79
+ * correction, and if the correction errors — or has no installed voice for its
80
+ * language, or no speakable text — the cancelled answer is what appears under
81
+ * "Speaking…". The user reads the words they just cancelled.
82
+ *
83
+ * ★ The identity was always available on both sides and simply never compared:
84
+ * `spokenProgress.requestId` and the speaking state's `requestId`. Gating on it
85
+ * means progress can never outlive its own utterance — which closes the
86
+ * interrupt, the natural end, the engine failure and the conversation switch in
87
+ * ONE place, because all four reduce to `IDLE_PLAYBACK`. Clearing progress
88
+ * inside `stop()` would close only the first of them, which is why this is a
89
+ * predicate rather than a reset.
90
+ */
91
+ export declare function publishedChunks(state: SpeechPlaybackState, progress: {
92
+ requestId: number;
93
+ chunks: string[];
94
+ index: number;
95
+ } | null): {
96
+ chunks: string[];
97
+ index: number;
98
+ } | null;
67
99
  //# sourceMappingURL=speechPlayback.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"speechPlayback.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/voice/speechPlayback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3B;IACE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEN,MAAM,MAAM,oBAAoB;AAC9B,6DAA6D;AAC3D;IACE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AACH,8EAA8E;GAC5E;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AACH,iFAAiF;GAC/E;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAC3B,qDAAqD;GACnD;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AAC3D,2DAA2D;GACzD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5D,eAAO,MAAM,aAAa,EAAE,mBAAwC,CAAC;AAErE,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,mBAAmB,EAC1B,MAAM,EAAE,oBAAoB,GAC3B,mBAAmB,CAgCrB;AAED,iFAAiF;AACjF,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,mBAAmB,EAC1B,SAAS,EAAE,MAAM,GAChB,OAAO,CAET;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAElE"}
1
+ {"version":3,"file":"speechPlayback.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/voice/speechPlayback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3B;IACE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEN,MAAM,MAAM,oBAAoB;AAC9B,6DAA6D;AAC3D;IACE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AACH,8EAA8E;GAC5E;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AACH,iFAAiF;GAC/E;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAC3B,qDAAqD;GACnD;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AAC3D,2DAA2D;GACzD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5D,eAAO,MAAM,aAAa,EAAE,mBAAwC,CAAC;AAErE,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,mBAAmB,EAC1B,MAAM,EAAE,oBAAoB,GAC3B,mBAAmB,CAgCrB;AAED,iFAAiF;AACjF,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,mBAAmB,EAC1B,SAAS,EAAE,MAAM,GAChB,OAAO,CAET;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAElE;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,mBAAmB,EAC1B,QAAQ,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GACtE;IAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAS5C"}
@@ -24,5 +24,11 @@ function n(e, t) {
24
24
  function r(e) {
25
25
  return e.status === "speaking";
26
26
  }
27
+ function i(e, t) {
28
+ return !t || e.status !== "speaking" || e.requestId !== t.requestId ? null : {
29
+ chunks: t.chunks,
30
+ index: t.index
31
+ };
32
+ }
27
33
  //#endregion
28
- export { e as IDLE_PLAYBACK, n as isSpeakingMessage, r as requiresCancel, t as speechPlaybackReducer };
34
+ export { e as IDLE_PLAYBACK, n as isSpeakingMessage, i as publishedChunks, r as requiresCancel, t as speechPlaybackReducer };
@@ -1 +1 @@
1
- {"version":3,"file":"voiceSession.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/voice/voiceSession.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,8EAA8E;AAC9E,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC;AAEzF,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,iBAAiB,CAAC;IACzB,8DAA8D;IAC9D,KAAK,EAAE,OAAO,CAAC;IACf,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACjC;AAED;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG,mBAAmB,GAAG,kBAAkB,GAAG,YAAY,CAAC;AAExF,MAAM,MAAM,iBAAiB;AAC3B,uEAAuE;AACrE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE;AACxD,6CAA6C;GAC3C;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE;AAClC,wEAAwE;GACtE;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,iBAAiB,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC;AAEpB;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,iBAAiB,OAAO,CAAC;AAEtC;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,4EAA4E;AAC5E,wBAAgB,WAAW,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,CAElE;AAqCD,wBAAgB,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAY7E;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAClC,KAAK,EAAE,iBAAiB,EACxB,eAAe,EAAE,MAAM,GAAG,IAAI,GAC7B;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAItC;AAED,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,oBAAoB,CAMzD,CAAC;AAEH;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,oBAAoB,EAC9B,KAAK,EAAE,iBAAiB,EACxB,UAAU,GAAE,MAAM,GAAG,IAAW,GAC/B,oBAAoB,CAmFtB;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAKnE;AAED,gFAAgF;AAChF,wBAAgB,OAAO,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,CAatG"}
1
+ {"version":3,"file":"voiceSession.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/voice/voiceSession.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,8EAA8E;AAC9E,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC;AAEzF,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,iBAAiB,CAAC;IACzB,8DAA8D;IAC9D,KAAK,EAAE,OAAO,CAAC;IACf,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACjC;AAED;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG,mBAAmB,GAAG,kBAAkB,GAAG,YAAY,CAAC;AAExF,MAAM,MAAM,iBAAiB;AAC3B,uEAAuE;AACrE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE;AACxD,6CAA6C;GAC3C;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE;AAClC,wEAAwE;GACtE;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,iBAAiB,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC;AAEpB;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,iBAAiB,OAAO,CAAC;AAEtC;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,4EAA4E;AAC5E,wBAAgB,WAAW,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,CAElE;AAqCD,wBAAgB,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAY7E;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAClC,KAAK,EAAE,iBAAiB,EACxB,eAAe,EAAE,MAAM,GAAG,IAAI,GAC7B;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAItC;AAED,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,oBAAoB,CAMzD,CAAC;AAEH;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,oBAAoB,EAC9B,KAAK,EAAE,iBAAiB,EACxB,UAAU,GAAE,MAAM,GAAG,IAAW,GAC/B,oBAAoB,CA6FtB;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAKnE;AAED,gFAAgF;AAChF,wBAAgB,OAAO,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,CAatG"}
@@ -60,7 +60,7 @@ function d(e, t, n = null) {
60
60
  interim: ""
61
61
  } : {}
62
62
  };
63
- case "interrupt": return e.phase === "speaking" ? {
63
+ case "interrupt": return e.phase === "speaking" || e.phase === "thinking" ? {
64
64
  ...e,
65
65
  phase: "listening",
66
66
  pending: "",
@@ -25,7 +25,22 @@ export declare function voiceStageState({ snapshot, capturing, interrupting, awa
25
25
  export declare function showsUserCaption(state: VoiceStageState): boolean;
26
26
  /** Does this stage show the assistant's caption? */
27
27
  export declare function showsAssistantCaption(state: VoiceStageState): boolean;
28
- /** Is the microphone control an INTERRUPT rather than a mute toggle? */
28
+ /**
29
+ * Is the microphone control an INTERRUPT rather than a mute toggle?
30
+ *
31
+ * ★★ `thinking` too, as of the cancellation work. It used to be `speaking`
32
+ * only, which meant the orb was inert for the whole time the model was
33
+ * generating — the user could only stop an answer that had already finished,
34
+ * which is not really interrupting. Everything that makes stopping a running
35
+ * turn safe now ships: the sandbox `/abort` route (verified in prod),
36
+ * `planTurnAbort` so a late abort cannot kill a newer turn, `planAbandonedTurn`
37
+ * so the cancelled turn's own loop stops, and `publishedChunks` so its caption
38
+ * cannot survive it. Those guards existed for an action the UI did not allow.
39
+ *
40
+ * ★ This is NOT the same question as "does this stage show the assistant's
41
+ * caption" — use `showsAssistantCaption` for that. The two coincided while both
42
+ * meant `speaking`, and one call site was reading this one to pick a caption.
43
+ */
29
44
  export declare function micIsInterrupt(state: VoiceStageState): boolean;
30
45
  /**
31
46
  * Does this stage show a LIVE waveform?
@@ -1 +1 @@
1
- {"version":3,"file":"voiceStageState.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/voice/voiceStageState.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,MAAM,MAAM,eAAe,GACzB,YAAY,GAAG,WAAW,GAAG,gBAAgB,GAAG,UAAU,GAAG,UAAU,GAAG,cAAc,GAAG,WAAW,GAAG,OAAO,CAAC;AAEnH,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,kEAAkE;IAClE,SAAS,EAAE,OAAO,CAAC;IACnB,oFAAoF;IACpF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,SAAS,EACT,YAAoB,EACpB,gBAAwB,GACzB,EAAE,WAAW,GAAG,eAAe,CAwB/B;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAKhE;AAED,oDAAoD;AACpD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAErE;AAED,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAE9D;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAEhE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAEjE"}
1
+ {"version":3,"file":"voiceStageState.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/voice/voiceStageState.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,MAAM,MAAM,eAAe,GACzB,YAAY,GAAG,WAAW,GAAG,gBAAgB,GAAG,UAAU,GAAG,UAAU,GAAG,cAAc,GAAG,WAAW,GAAG,OAAO,CAAC;AAEnH,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,kEAAkE;IAClE,SAAS,EAAE,OAAO,CAAC;IACnB,oFAAoF;IACpF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,SAAS,EACT,YAAoB,EACpB,gBAAwB,GACzB,EAAE,WAAW,GAAG,eAAe,CAwB/B;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAKhE;AAED,oDAAoD;AACpD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAErE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAE9D;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAEhE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAEjE"}
@@ -9,7 +9,7 @@ function n(e) {
9
9
  return e === "speaking";
10
10
  }
11
11
  function r(e) {
12
- return e === "speaking";
12
+ return e === "speaking" || e === "thinking";
13
13
  }
14
14
  function i(e) {
15
15
  return e === "listening" || e === "endpoint-grace" || e === "speaking";
@@ -32,62 +32,62 @@ import { AssistantProductProvider as qt, resolveModeConfig as Jt, useAssistantPa
32
32
  import { AssistantI18nProvider as $t, assistantTranslationKey as en, useAssistantI18nNamespace as tn, useAssistantTr as nn } from "./shared/assistant/i18n.js";
33
33
  import { SPOKEN_LABEL_LANGUAGES as rn, speechLabelsFor as an } from "./shared/assistant/voice/speechLabels.js";
34
34
  import { detectScriptLocale as on, resolveSpeechLocale as sn } from "./shared/assistant/voice/replyLanguage.js";
35
- import { IDLE_PLAYBACK as cn, isSpeakingMessage as ln, requiresCancel as un, speechPlaybackReducer as dn } from "./shared/assistant/voice/speechPlayback.js";
36
- import { MAX_INLINE_IMAGE_BASE64_BYTES as fn, MAX_REQUEST_BODY_BYTES as pn } from "./shared/assistant/gatewayLimits.js";
37
- import { BOILERPLATE_PAGE_SHARE as mn, MAX_BOILERPLATE_LINE_CHARS as hn, MAX_EXTRACTED_CHARS as gn, MAX_PDF_PAGES_SCANNED as _n, MIN_PAGE_TEXT_CHARS as vn, MIN_TEXT_PAGE_SHARE as yn, columnLetterToIndex as bn, decodeXmlEntities as xn, docxXmlToText as Sn, fitPdfPages as Cn, formatPageRanges as wn, isMostlyImagePages as Tn, joinSheets as En, pageMarker as Dn, parseSharedStrings as On, parseWorkbookSheets as kn, pdfTextItemsToPage as An, sheetXmlToRows as jn, summarisePageText as Mn, truncatePagesForInline as Nn } from "./shared/assistant/documentText.js";
38
- import { ATTACHMENT_ACCEPT as Pn, AttachmentRejectedError as Fn, INLINE_IMAGE_MAX_DIM as In, INLINE_IMAGE_QUALITY as Ln, MAX_ATTACHMENTS as Rn, MAX_FILE_BYTES as zn, MAX_INLINE_CHARS_PER_FILE as Bn, MAX_INLINE_CHARS_TOTAL as Vn, MAX_INLINE_IMAGE_BASE64_CHARS as Hn, MAX_INLINE_IMAGE_PARTS as Un, MAX_INLINE_TURN_BODY_BYTES as Wn, MAX_TURN_BODY_BYTES as Gn, PROMPT_ENVELOPE_RESERVE_BYTES as Kn, TURN_BODY_HEADROOM_BYTES as qn, buildAttachmentPromptBlock as Jn, buildPromptParts as Yn, buildPromptWithAttachments as Xn, classifyAttachment as Zn, countInlineImageCandidates as Qn, countInlinedImageParts as $n, detectDocumentFormat as er, estimateTurnBodyBytes as tr, formatBytes as nr, getAttachmentSendBlocker as rr, getExtension as ir, getSendableAttachments as ar, hasAttachmentWorkInFlight as or, parseDataUrl as sr, toMessageAttachment as cr, truncateForInline as lr, validateFile as ur } from "./shared/assistant/attachments.js";
39
- import { useAssistantStore as dr } from "./shared/assistant/store.js";
40
- import { isTurnInFlight as fr, planTurnAbort as pr } from "./shared/assistant/turnState.js";
41
- import { AssistantToolActivity as mr, parseToolActivity as hr } from "./shared/assistant/ui/AssistantToolActivity.js";
42
- import { AssistantSpeechProvider as gr, useAssistantSpeech as _r } from "./shared/assistant/ui/AssistantSpeechProvider.js";
43
- import { useVoiceSession as vr } from "./shared/assistant/ui/useVoiceSession.js";
44
- import { copyToClipboard as yr } from "./shared/assistant/clipboard.js";
45
- import { getActorId as br, getOrganizationId as xr, getWorkspaceId as Sr } from "./shared/assistant/context.js";
46
- import { ATTACHMENT_SOURCES as Cr, availableAttachmentSources as wr, deviceHasCamera as Tr } from "./shared/assistant/attachmentSources.js";
47
- import { SANDBOX_READY_TTL_MS as Er, createReadinessTracker as Dr, isRecentlyVerified as Or } from "./shared/assistant/sandboxReadiness.js";
48
- import { AssistantAutoSpeakToggle as kr } from "./shared/assistant/ui/AssistantAutoSpeakToggle.js";
49
- import { AssistantMarkdownImage as Ar, imageHostLabel as jr, isRemoteImageSrc as Mr } from "./shared/assistant/ui/AssistantMarkdownImage.js";
50
- import { AssistantMarkdownRenderer as Nr, assistantUrlTransform as Pr } from "./shared/assistant/ui/AssistantMarkdownRenderer.js";
51
- import { AssistantMessageAttachments as Fr } from "./shared/assistant/ui/AssistantMessageAttachments.js";
52
- import { AssistantPendingWriteCard as Ir } from "./shared/assistant/ui/AssistantPendingWriteCard.js";
53
- import { AssistantLanguageMenu as Lr } from "./shared/assistant/ui/AssistantLanguageMenu.js";
54
- import { AssistantReplyLanguageSelector as Rr } from "./shared/assistant/ui/AssistantReplyLanguageSelector.js";
55
- import { AssistantSpeakButton as zr } from "./shared/assistant/ui/AssistantSpeakButton.js";
56
- import { AssistantSpokenTurnsNotice as Br } from "./shared/assistant/ui/AssistantSpokenTurnsNotice.js";
57
- import { AssistantAttachmentButton as Vr } from "./shared/assistant/ui/composer/AssistantAttachmentButton.js";
58
- import { AssistantAttachmentChips as Hr } from "./shared/assistant/ui/composer/AssistantAttachmentChips.js";
59
- import { AssistantLanguageSelector as Ur, FOLLOW_APP_LOCALE as Wr } from "./shared/assistant/ui/composer/AssistantLanguageSelector.js";
60
- import { ASSISTANT_MODE_META as Gr, AssistantModeSelector as Kr, nextModeIndex as qr } from "./shared/assistant/ui/composer/AssistantModeSelector.js";
61
- import { AssistantVoiceButton as Jr } from "./shared/assistant/ui/composer/AssistantVoiceButton.js";
62
- import { AUTO_VOICE as Yr, AssistantVoiceSelector as Xr } from "./shared/assistant/ui/composer/AssistantVoiceSelector.js";
63
- import { AssistantVoiceOrb as Zr } from "./shared/assistant/ui/voice/AssistantVoiceOrb.js";
64
- import { AssistantVoiceSessionButton as Qr } from "./shared/assistant/ui/voice/AssistantVoiceSessionButton.js";
65
- import { CAPTION_SCROLL_ATTR as $r, VoiceCaption as ei } from "./shared/assistant/ui/voice/VoiceCaption.js";
66
- import { VoiceConversationView as ti } from "./shared/assistant/ui/voice/VoiceConversationView.js";
67
- import { VoiceWaveform as ni } from "./shared/assistant/ui/voice/VoiceWaveform.js";
68
- import { VoiceMiniController as ri } from "./shared/assistant/ui/voice/VoiceMiniController.js";
69
- import { VoiceStage as ii } from "./shared/assistant/ui/voice/VoiceStage.js";
70
- import { VoiceTranscriptDrawer as ai } from "./shared/assistant/ui/voice/VoiceTranscriptDrawer.js";
71
- import { downloadFile as oi, exportConversation as si } from "./shared/assistant/exportConversation.js";
72
- import { AssistantMoreMenu as ci } from "./shared/assistant/ui/AssistantMoreMenu.js";
73
- import { AssistantHeader as li } from "./shared/assistant/ui/AssistantHeader.js";
74
- import { AssistantConversationList as ui } from "./shared/assistant/ui/AssistantConversationList.js";
75
- import { AssistantEmptyState as di } from "./shared/assistant/ui/AssistantEmptyState.js";
76
- import { AssistantMessageItem as fi } from "./shared/assistant/ui/AssistantMessageItem.js";
77
- import { AssistantMessageList as pi } from "./shared/assistant/ui/AssistantMessageList.js";
78
- import { AssistantVoiceSession as mi } from "./shared/assistant/ui/voice/AssistantVoiceSession.js";
79
- import { useAssistantApiAccess as hi } from "./shared/assistant/useAssistantApiAccess.js";
80
- import { useConversationTurns as gi } from "./shared/assistant/useConversationTurns.js";
81
- import { isMultimodalBodyRejection as _i, isRecoverableAssistantError as vi } from "./shared/assistant/transportErrors.js";
82
- import { aiCreditsUpdatedEventName as yi, dispatchAssistantQuotaExhausted as bi, notifyAiCreditsUpdated as xi } from "./shared/assistant/aiCredits.js";
83
- import { useWorkspaceWriteAccess as Si } from "./shared/assistant/useWorkspaceWriteAccess.js";
84
- import { extractDocumentText as Ci } from "./shared/assistant/documentExtract.js";
85
- import { useAssistantAttachments as wi } from "./shared/assistant/useAssistantAttachments.js";
86
- import { AssistantComposer as Ti } from "./shared/assistant/ui/composer/AssistantComposer.js";
87
- import { isProdRuntime as Ei } from "./shared/assistant/env.js";
88
- import { useAssistantHeartbeat as Di } from "./shared/assistant/useAssistantHeartbeat.js";
89
- import { useAssistantKeyboardShortcuts as Oi } from "./shared/assistant/useAssistantKeyboardShortcuts.js";
90
- import { AssistantApiCallsConsentDialog as ki } from "./shared/assistant/ui/AssistantApiCallsConsentDialog.js";
91
- import { AssistantChatArea as Ai } from "./shared/assistant/ui/AssistantChatArea.js";
92
- import { AIAssistantPanel as ji } from "./shared/assistant/ui/AIAssistantPanel.js";
93
- export { ji as AIAssistantPanel, g as ASSISTANT_API_AUTH_STRATEGY, zt as ASSISTANT_LANGUAGES, Gr as ASSISTANT_MODE_META, Pn as ATTACHMENT_ACCEPT, Cr as ATTACHMENT_SOURCES, Yr as AUTO_VOICE, ki as AssistantApiCallsConsentDialog, Vr as AssistantAttachmentButton, Hr as AssistantAttachmentChips, kr as AssistantAutoSpeakToggle, Ai as AssistantChatArea, Ti as AssistantComposer, ui as AssistantConversationList, di as AssistantEmptyState, li as AssistantHeader, $t as AssistantI18nProvider, Lr as AssistantLanguageMenu, Ur as AssistantLanguageSelector, Ar as AssistantMarkdownImage, Nr as AssistantMarkdownRenderer, Fr as AssistantMessageAttachments, fi as AssistantMessageItem, pi as AssistantMessageList, Kr as AssistantModeSelector, ci as AssistantMoreMenu, Ir as AssistantPendingWriteCard, qt as AssistantProductProvider, Rr as AssistantReplyLanguageSelector, X as AssistantRuntimeManager, zr as AssistantSpeakButton, gr as AssistantSpeechProvider, Br as AssistantSpokenTurnsNotice, mr as AssistantToolActivity, Jr as AssistantVoiceButton, Zr as AssistantVoiceOrb, Xr as AssistantVoiceSelector, mi as AssistantVoiceSession, Qr as AssistantVoiceSessionButton, Fn as AttachmentRejectedError, mn as BOILERPLATE_PAGE_SHARE, $r as CAPTION_SCROLL_ATTR, s as CHECK_AI_CREDITS, c as CREATE_SANDBOX, vt as DEFAULT_SPEAKABLE_LABELS, Bt as DEFAULT_SPEECH_RATE, Ge as ENDPOINT_GRACE_MS, l as EXTEND_SANDBOX_TTL, Wr as FOLLOW_APP_LOCALE, u as GET_ACTIVE_SANDBOXES, d as GET_SANDBOX, xe as HOSTED_TTS_MAX_CHARS, _e as HOSTED_TTS_TIER, ve as HOSTED_VOICES, cn as IDLE_PLAYBACK, Ke as INITIAL_SESSION, In as INLINE_IMAGE_MAX_DIM, Ln as INLINE_IMAGE_QUALITY, qe as INTERRUPT_MAX_MS, Je as INTERRUPT_MIN_MS, Rn as MAX_ATTACHMENTS, hn as MAX_BOILERPLATE_LINE_CHARS, gn as MAX_EXTRACTED_CHARS, zn as MAX_FILE_BYTES, Bn as MAX_INLINE_CHARS_PER_FILE, Vn as MAX_INLINE_CHARS_TOTAL, fn as MAX_INLINE_IMAGE_BASE64_BYTES, Hn as MAX_INLINE_IMAGE_BASE64_CHARS, Un as MAX_INLINE_IMAGE_PARTS, Wn as MAX_INLINE_TURN_BODY_BYTES, _n as MAX_PDF_PAGES_SCANNED, pn as MAX_REQUEST_BODY_BYTES, yt as MAX_SPEAKABLE_CHARS, bt as MAX_SPOKEN_TABLE_ROWS, Gn as MAX_TURN_BODY_BYTES, At as MINI_CAPTION_BUDGET, vn as MIN_PAGE_TEXT_CHARS, yn as MIN_TEXT_PAGE_SHARE, Mt as POLL_FAST_MS, Nt as POLL_FAST_UNTIL_MS, Pt as POLL_SLOW_MS, Ft as POLL_STEADY_MS, It as POLL_STEADY_UNTIL_MS, Ot as PREVIEW_LANGUAGES, Kn as PROMPT_ENVELOPE_RESERVE_BYTES, f as PROXY_SANDBOX_REQUEST, p as REPORT_AI_TOKEN_USAGE, Er as SANDBOX_READY_TTL_MS, Ye as SILENCE_SUBMIT_MS, Se as SPEAKING_RATE_MAX, Ce as SPEAKING_RATE_MAX_STREAMING, we as SPEAKING_RATE_MAX_SYNC, Te as SPEAKING_RATE_MIN, xt as SPEECH_CHUNK_CHARS, St as SPEECH_CHUNK_CJK_CHARS, rt as SPEECH_LANG, rn as SPOKEN_LABEL_LANGUAGES, m as STOP_ASSISTANT_SANDBOX, qn as TURN_BODY_HEADROOM_BYTES, it as VOICE_LIST_TIMEOUT_MS, ei as VoiceCaption, ti as VoiceConversationView, ri as VoiceMiniController, ii as VoiceStage, ai as VoiceTranscriptDrawer, ni as VoiceWaveform, h as WAIT_FOR_SANDBOX_RUNNING, E as abortAssistantTurn, yi as aiCreditsUpdatedEventName, D as approvePendingWrite, en as assistantTranslationKey, Pr as assistantUrlTransform, wr as availableAttachmentSources, Ee as base64ToBytes, ge as browserSpeechEngine, O as buildAssistantSandboxEnv, Jn as buildAttachmentPromptBlock, ht as buildContinuedFromVoiceNote, Z as buildProgress, Yn as buildPromptParts, k as buildPromptRequestBody, Xn as buildPromptWithAttachments, De as buildRequest, a as buildSandboxContextInput, gt as buildVoiceTranscriptMarkdown, le as chatTurns, A as checkAssistantAiCredits, Ct as chunkForSpeech, Zn as classifyAttachment, Oe as classifyHttpFailure, t as classifyQuotaError, bn as columnLetterToIndex, Pe as configureSpeechEngine, wt as containsCjk, yr as copyToClipboard, Qn as countInlineImageCandidates, $n as countInlinedImageParts, j as createAssistantSandbox, M as createAssistantSession, Me as createHostedTtsEngine, Dr as createReadinessTracker, Ne as createRoutingSpeechEngine, se as createSandboxAssistantTransport, Fe as createSpeechEngines, ke as decodeAudioResponse, xn as decodeXmlEntities, n as describeQuotaError, er as detectDocumentFormat, on as detectScriptLocale, Tr as deviceHasCamera, bi as dispatchAssistantQuotaExhausted, Sn as docxXmlToText, N as downloadAssistantArtifact, oi as downloadFile, tr as estimateTurnBodyBytes, o as executeSandboxGraphQL, si as exportConversation, P as extendAssistantSandboxTTL, Ci as extractDocumentText, Vt as findAssistantLanguage, F as findExistingSandbox, Gt as findPendingWrite, Cn as fitPdfPages, nr as formatBytes, wn as formatPageRanges, br as getActorId, I as getAssistantArtifacts, Q as getAssistantMedia, L as getAssistantMessages, R as getAssistantSession, z as getAssistantStreamAccess, $ as getAssistantText, rr as getAttachmentSendBlocker, S as getCapability, ir as getExtension, _ as getImageForMode, v as getImageTagForMode, xr as getOrganizationId, ee as getRawMessageCreatedAt, y as getResourcesForMode, b as getSandboxImageRegistry, ar as getSendableAttachments, Ie as getSpeechEngine, te as getToolProgress, Sr as getWorkspaceId, ue as groupBySession, de as groupConsecutiveBySession, or as hasAttachmentWorkInFlight, ye as hostedLocaleFor, be as hostedSupportsLanguage, jr as imageHostLabel, Xe as isCapturing, Ze as isEcho, Tn as isMostlyImagePages, _i as isMultimodalBodyRejection, Ei as isProdRuntime, r as isQuotaExhaustedError, ne as isReapedSandboxConnectionError, Or as isRecentlyVerified, re as isRecoverable, vi as isRecoverableAssistantError, Mr as isRemoteImageSrc, ln as isSpeakingMessage, at as isSpeechBlocked, Qe as isSubmittable, fr as isTurnInFlight, C as isUnknownFieldError, fe as isVoiceTurn, En as joinSheets, ot as languageDisplayName, ie as mapSessionToHistory, w as markSupported, T as markUnsupported, ae as mergeMessagesById, ze as micIsInterrupt, B as modeRequiresConfirmWrites, qr as nextModeIndex, st as normalizeLangTag, xi as notifyAiCreditsUpdated, $e as orbMode, Dn as pageMarker, Kt as parseConfirmationRefusal, sr as parseDataUrl, On as parseSharedStrings, hr as parseToolActivity, kn as parseWorkbookSheets, An as pdfTextItemsToPage, et as planReplyConsumption, pr as planTurnAbort, Lt as pollDelayMs, ct as primaryLanguageSubtag, i as quotaExhaustedEventName, Le as readSpeechEngineConfig, V as releaseSupersededAssistantSandboxes, Ut as replyFollowsInput, H as reportAssistantAiTokenUsage, un as requiresCancel, Re as resetSpeechEngine, Ht as resolveAssistantLanguage, Wt as resolveLanguagePair, Jt as resolveModeConfig, x as resolveSandboxAssistantMode, sn as resolveSpeechLocale, oe as sanitize, U as selectExistingAssistantSandbox, W as selectSupersededAssistantSandboxes, lt as selectVoiceForLocale, G as sendAssistantPromptAsync, K as sendHeartbeat, jn as sheetXmlToRows, Ae as shouldDisableEngine, jt as showPreviousChunk, Be as showsAssistantCaption, Ve as showsUserCaption, Tt as speakableEmail, ut as speechGate, an as speechLabelsFor, dt as speechLangForLocale, dn as speechPlaybackReducer, je as splitForVendor, Et as splitTableRow, tt as spokenSoFar, q as stopReapedAssistantSandbox, Mn as summarisePageText, Rt as toCaptionText, cr as toMessageAttachment, Dt as toSpeakableText, lr as truncateForInline, Nn as truncatePagesForInline, hi as useAssistantApiAccess, wi as useAssistantAttachments, Di as useAssistantHeartbeat, tn as useAssistantI18nNamespace, Oi as useAssistantKeyboardShortcuts, Yt as useAssistantPageLabel, Xt as useAssistantProduct, Zt as useAssistantProductOrNull, _r as useAssistantSpeech, Qt as useAssistantStorageFolders, dr as useAssistantStore, nn as useAssistantTr, gi as useConversationTurns, ce as useSandboxAssistantTransport, e as useVoiceInput, vr as useVoiceSession, Si as useWorkspaceWriteAccess, ur as validateFile, ft as voiceAvailability, pe as voiceMarker, kt as voicePreviewText, pt as voiceQualityRank, me as voiceSessionIdOf, nt as voiceSessionReducer, He as voiceStageState, _t as voiceTranscriptFilename, he as voiceTurnsOnly, mt as voicesForLocale, J as waitForAssistantServiceReady, Y as waitForSandboxRunning, Ue as waveformIsActive, We as waveformIsSettled };
35
+ import { IDLE_PLAYBACK as cn, isSpeakingMessage as ln, publishedChunks as un, requiresCancel as dn, speechPlaybackReducer as fn } from "./shared/assistant/voice/speechPlayback.js";
36
+ import { MAX_INLINE_IMAGE_BASE64_BYTES as pn, MAX_REQUEST_BODY_BYTES as mn } from "./shared/assistant/gatewayLimits.js";
37
+ import { BOILERPLATE_PAGE_SHARE as hn, MAX_BOILERPLATE_LINE_CHARS as gn, MAX_EXTRACTED_CHARS as _n, MAX_PDF_PAGES_SCANNED as vn, MIN_PAGE_TEXT_CHARS as yn, MIN_TEXT_PAGE_SHARE as bn, columnLetterToIndex as xn, decodeXmlEntities as Sn, docxXmlToText as Cn, fitPdfPages as wn, formatPageRanges as Tn, isMostlyImagePages as En, joinSheets as Dn, pageMarker as On, parseSharedStrings as kn, parseWorkbookSheets as An, pdfTextItemsToPage as jn, sheetXmlToRows as Mn, summarisePageText as Nn, truncatePagesForInline as Pn } from "./shared/assistant/documentText.js";
38
+ import { ATTACHMENT_ACCEPT as Fn, AttachmentRejectedError as In, INLINE_IMAGE_MAX_DIM as Ln, INLINE_IMAGE_QUALITY as Rn, MAX_ATTACHMENTS as zn, MAX_FILE_BYTES as Bn, MAX_INLINE_CHARS_PER_FILE as Vn, MAX_INLINE_CHARS_TOTAL as Hn, MAX_INLINE_IMAGE_BASE64_CHARS as Un, MAX_INLINE_IMAGE_PARTS as Wn, MAX_INLINE_TURN_BODY_BYTES as Gn, MAX_TURN_BODY_BYTES as Kn, PROMPT_ENVELOPE_RESERVE_BYTES as qn, TURN_BODY_HEADROOM_BYTES as Jn, buildAttachmentPromptBlock as Yn, buildPromptParts as Xn, buildPromptWithAttachments as Zn, classifyAttachment as Qn, countInlineImageCandidates as $n, countInlinedImageParts as er, detectDocumentFormat as tr, estimateTurnBodyBytes as nr, formatBytes as rr, getAttachmentSendBlocker as ir, getExtension as ar, getSendableAttachments as or, hasAttachmentWorkInFlight as sr, parseDataUrl as cr, toMessageAttachment as lr, truncateForInline as ur, validateFile as dr } from "./shared/assistant/attachments.js";
39
+ import { useAssistantStore as fr } from "./shared/assistant/store.js";
40
+ import { isTurnInFlight as pr, planAbandonedTurn as mr, planTurnAbort as hr } from "./shared/assistant/turnState.js";
41
+ import { AssistantToolActivity as gr, parseToolActivity as _r } from "./shared/assistant/ui/AssistantToolActivity.js";
42
+ import { AssistantSpeechProvider as vr, useAssistantSpeech as yr } from "./shared/assistant/ui/AssistantSpeechProvider.js";
43
+ import { useVoiceSession as br } from "./shared/assistant/ui/useVoiceSession.js";
44
+ import { copyToClipboard as xr } from "./shared/assistant/clipboard.js";
45
+ import { getActorId as Sr, getOrganizationId as Cr, getWorkspaceId as wr } from "./shared/assistant/context.js";
46
+ import { ATTACHMENT_SOURCES as Tr, availableAttachmentSources as Er, deviceHasCamera as Dr } from "./shared/assistant/attachmentSources.js";
47
+ import { SANDBOX_READY_TTL_MS as Or, createReadinessTracker as kr, isRecentlyVerified as Ar } from "./shared/assistant/sandboxReadiness.js";
48
+ import { AssistantAutoSpeakToggle as jr } from "./shared/assistant/ui/AssistantAutoSpeakToggle.js";
49
+ import { AssistantMarkdownImage as Mr, imageHostLabel as Nr, isRemoteImageSrc as Pr } from "./shared/assistant/ui/AssistantMarkdownImage.js";
50
+ import { AssistantMarkdownRenderer as Fr, assistantUrlTransform as Ir } from "./shared/assistant/ui/AssistantMarkdownRenderer.js";
51
+ import { AssistantMessageAttachments as Lr } from "./shared/assistant/ui/AssistantMessageAttachments.js";
52
+ import { AssistantPendingWriteCard as Rr } from "./shared/assistant/ui/AssistantPendingWriteCard.js";
53
+ import { AssistantLanguageMenu as zr } from "./shared/assistant/ui/AssistantLanguageMenu.js";
54
+ import { AssistantReplyLanguageSelector as Br } from "./shared/assistant/ui/AssistantReplyLanguageSelector.js";
55
+ import { AssistantSpeakButton as Vr } from "./shared/assistant/ui/AssistantSpeakButton.js";
56
+ import { AssistantSpokenTurnsNotice as Hr } from "./shared/assistant/ui/AssistantSpokenTurnsNotice.js";
57
+ import { AssistantAttachmentButton as Ur } from "./shared/assistant/ui/composer/AssistantAttachmentButton.js";
58
+ import { AssistantAttachmentChips as Wr } from "./shared/assistant/ui/composer/AssistantAttachmentChips.js";
59
+ import { AssistantLanguageSelector as Gr, FOLLOW_APP_LOCALE as Kr } from "./shared/assistant/ui/composer/AssistantLanguageSelector.js";
60
+ import { ASSISTANT_MODE_META as qr, AssistantModeSelector as Jr, nextModeIndex as Yr } from "./shared/assistant/ui/composer/AssistantModeSelector.js";
61
+ import { AssistantVoiceButton as Xr } from "./shared/assistant/ui/composer/AssistantVoiceButton.js";
62
+ import { AUTO_VOICE as Zr, AssistantVoiceSelector as Qr } from "./shared/assistant/ui/composer/AssistantVoiceSelector.js";
63
+ import { AssistantVoiceOrb as $r } from "./shared/assistant/ui/voice/AssistantVoiceOrb.js";
64
+ import { AssistantVoiceSessionButton as ei } from "./shared/assistant/ui/voice/AssistantVoiceSessionButton.js";
65
+ import { CAPTION_SCROLL_ATTR as ti, VoiceCaption as ni } from "./shared/assistant/ui/voice/VoiceCaption.js";
66
+ import { VoiceConversationView as ri } from "./shared/assistant/ui/voice/VoiceConversationView.js";
67
+ import { VoiceWaveform as ii } from "./shared/assistant/ui/voice/VoiceWaveform.js";
68
+ import { VoiceMiniController as ai } from "./shared/assistant/ui/voice/VoiceMiniController.js";
69
+ import { VoiceStage as oi } from "./shared/assistant/ui/voice/VoiceStage.js";
70
+ import { VoiceTranscriptDrawer as si } from "./shared/assistant/ui/voice/VoiceTranscriptDrawer.js";
71
+ import { downloadFile as ci, exportConversation as li } from "./shared/assistant/exportConversation.js";
72
+ import { AssistantMoreMenu as ui } from "./shared/assistant/ui/AssistantMoreMenu.js";
73
+ import { AssistantHeader as di } from "./shared/assistant/ui/AssistantHeader.js";
74
+ import { AssistantConversationList as fi } from "./shared/assistant/ui/AssistantConversationList.js";
75
+ import { AssistantEmptyState as pi } from "./shared/assistant/ui/AssistantEmptyState.js";
76
+ import { AssistantMessageItem as mi } from "./shared/assistant/ui/AssistantMessageItem.js";
77
+ import { AssistantMessageList as hi } from "./shared/assistant/ui/AssistantMessageList.js";
78
+ import { AssistantVoiceSession as gi } from "./shared/assistant/ui/voice/AssistantVoiceSession.js";
79
+ import { useAssistantApiAccess as _i } from "./shared/assistant/useAssistantApiAccess.js";
80
+ import { useConversationTurns as vi } from "./shared/assistant/useConversationTurns.js";
81
+ import { isMultimodalBodyRejection as yi, isRecoverableAssistantError as bi } from "./shared/assistant/transportErrors.js";
82
+ import { aiCreditsUpdatedEventName as xi, dispatchAssistantQuotaExhausted as Si, notifyAiCreditsUpdated as Ci } from "./shared/assistant/aiCredits.js";
83
+ import { useWorkspaceWriteAccess as wi } from "./shared/assistant/useWorkspaceWriteAccess.js";
84
+ import { extractDocumentText as Ti } from "./shared/assistant/documentExtract.js";
85
+ import { useAssistantAttachments as Ei } from "./shared/assistant/useAssistantAttachments.js";
86
+ import { AssistantComposer as Di } from "./shared/assistant/ui/composer/AssistantComposer.js";
87
+ import { isProdRuntime as Oi } from "./shared/assistant/env.js";
88
+ import { useAssistantHeartbeat as ki } from "./shared/assistant/useAssistantHeartbeat.js";
89
+ import { useAssistantKeyboardShortcuts as Ai } from "./shared/assistant/useAssistantKeyboardShortcuts.js";
90
+ import { AssistantApiCallsConsentDialog as ji } from "./shared/assistant/ui/AssistantApiCallsConsentDialog.js";
91
+ import { AssistantChatArea as Mi } from "./shared/assistant/ui/AssistantChatArea.js";
92
+ import { AIAssistantPanel as Ni } from "./shared/assistant/ui/AIAssistantPanel.js";
93
+ export { Ni as AIAssistantPanel, g as ASSISTANT_API_AUTH_STRATEGY, zt as ASSISTANT_LANGUAGES, qr as ASSISTANT_MODE_META, Fn as ATTACHMENT_ACCEPT, Tr as ATTACHMENT_SOURCES, Zr as AUTO_VOICE, ji as AssistantApiCallsConsentDialog, Ur as AssistantAttachmentButton, Wr as AssistantAttachmentChips, jr as AssistantAutoSpeakToggle, Mi as AssistantChatArea, Di as AssistantComposer, fi as AssistantConversationList, pi as AssistantEmptyState, di as AssistantHeader, $t as AssistantI18nProvider, zr as AssistantLanguageMenu, Gr as AssistantLanguageSelector, Mr as AssistantMarkdownImage, Fr as AssistantMarkdownRenderer, Lr as AssistantMessageAttachments, mi as AssistantMessageItem, hi as AssistantMessageList, Jr as AssistantModeSelector, ui as AssistantMoreMenu, Rr as AssistantPendingWriteCard, qt as AssistantProductProvider, Br as AssistantReplyLanguageSelector, X as AssistantRuntimeManager, Vr as AssistantSpeakButton, vr as AssistantSpeechProvider, Hr as AssistantSpokenTurnsNotice, gr as AssistantToolActivity, Xr as AssistantVoiceButton, $r as AssistantVoiceOrb, Qr as AssistantVoiceSelector, gi as AssistantVoiceSession, ei as AssistantVoiceSessionButton, In as AttachmentRejectedError, hn as BOILERPLATE_PAGE_SHARE, ti as CAPTION_SCROLL_ATTR, s as CHECK_AI_CREDITS, c as CREATE_SANDBOX, vt as DEFAULT_SPEAKABLE_LABELS, Bt as DEFAULT_SPEECH_RATE, Ge as ENDPOINT_GRACE_MS, l as EXTEND_SANDBOX_TTL, Kr as FOLLOW_APP_LOCALE, u as GET_ACTIVE_SANDBOXES, d as GET_SANDBOX, xe as HOSTED_TTS_MAX_CHARS, _e as HOSTED_TTS_TIER, ve as HOSTED_VOICES, cn as IDLE_PLAYBACK, Ke as INITIAL_SESSION, Ln as INLINE_IMAGE_MAX_DIM, Rn as INLINE_IMAGE_QUALITY, qe as INTERRUPT_MAX_MS, Je as INTERRUPT_MIN_MS, zn as MAX_ATTACHMENTS, gn as MAX_BOILERPLATE_LINE_CHARS, _n as MAX_EXTRACTED_CHARS, Bn as MAX_FILE_BYTES, Vn as MAX_INLINE_CHARS_PER_FILE, Hn as MAX_INLINE_CHARS_TOTAL, pn as MAX_INLINE_IMAGE_BASE64_BYTES, Un as MAX_INLINE_IMAGE_BASE64_CHARS, Wn as MAX_INLINE_IMAGE_PARTS, Gn as MAX_INLINE_TURN_BODY_BYTES, vn as MAX_PDF_PAGES_SCANNED, mn as MAX_REQUEST_BODY_BYTES, yt as MAX_SPEAKABLE_CHARS, bt as MAX_SPOKEN_TABLE_ROWS, Kn as MAX_TURN_BODY_BYTES, At as MINI_CAPTION_BUDGET, yn as MIN_PAGE_TEXT_CHARS, bn as MIN_TEXT_PAGE_SHARE, Mt as POLL_FAST_MS, Nt as POLL_FAST_UNTIL_MS, Pt as POLL_SLOW_MS, Ft as POLL_STEADY_MS, It as POLL_STEADY_UNTIL_MS, Ot as PREVIEW_LANGUAGES, qn as PROMPT_ENVELOPE_RESERVE_BYTES, f as PROXY_SANDBOX_REQUEST, p as REPORT_AI_TOKEN_USAGE, Or as SANDBOX_READY_TTL_MS, Ye as SILENCE_SUBMIT_MS, Se as SPEAKING_RATE_MAX, Ce as SPEAKING_RATE_MAX_STREAMING, we as SPEAKING_RATE_MAX_SYNC, Te as SPEAKING_RATE_MIN, xt as SPEECH_CHUNK_CHARS, St as SPEECH_CHUNK_CJK_CHARS, rt as SPEECH_LANG, rn as SPOKEN_LABEL_LANGUAGES, m as STOP_ASSISTANT_SANDBOX, Jn as TURN_BODY_HEADROOM_BYTES, it as VOICE_LIST_TIMEOUT_MS, ni as VoiceCaption, ri as VoiceConversationView, ai as VoiceMiniController, oi as VoiceStage, si as VoiceTranscriptDrawer, ii as VoiceWaveform, h as WAIT_FOR_SANDBOX_RUNNING, E as abortAssistantTurn, xi as aiCreditsUpdatedEventName, D as approvePendingWrite, en as assistantTranslationKey, Ir as assistantUrlTransform, Er as availableAttachmentSources, Ee as base64ToBytes, ge as browserSpeechEngine, O as buildAssistantSandboxEnv, Yn as buildAttachmentPromptBlock, ht as buildContinuedFromVoiceNote, Z as buildProgress, Xn as buildPromptParts, k as buildPromptRequestBody, Zn as buildPromptWithAttachments, De as buildRequest, a as buildSandboxContextInput, gt as buildVoiceTranscriptMarkdown, le as chatTurns, A as checkAssistantAiCredits, Ct as chunkForSpeech, Qn as classifyAttachment, Oe as classifyHttpFailure, t as classifyQuotaError, xn as columnLetterToIndex, Pe as configureSpeechEngine, wt as containsCjk, xr as copyToClipboard, $n as countInlineImageCandidates, er as countInlinedImageParts, j as createAssistantSandbox, M as createAssistantSession, Me as createHostedTtsEngine, kr as createReadinessTracker, Ne as createRoutingSpeechEngine, se as createSandboxAssistantTransport, Fe as createSpeechEngines, ke as decodeAudioResponse, Sn as decodeXmlEntities, n as describeQuotaError, tr as detectDocumentFormat, on as detectScriptLocale, Dr as deviceHasCamera, Si as dispatchAssistantQuotaExhausted, Cn as docxXmlToText, N as downloadAssistantArtifact, ci as downloadFile, nr as estimateTurnBodyBytes, o as executeSandboxGraphQL, li as exportConversation, P as extendAssistantSandboxTTL, Ti as extractDocumentText, Vt as findAssistantLanguage, F as findExistingSandbox, Gt as findPendingWrite, wn as fitPdfPages, rr as formatBytes, Tn as formatPageRanges, Sr as getActorId, I as getAssistantArtifacts, Q as getAssistantMedia, L as getAssistantMessages, R as getAssistantSession, z as getAssistantStreamAccess, $ as getAssistantText, ir as getAttachmentSendBlocker, S as getCapability, ar as getExtension, _ as getImageForMode, v as getImageTagForMode, Cr as getOrganizationId, ee as getRawMessageCreatedAt, y as getResourcesForMode, b as getSandboxImageRegistry, or as getSendableAttachments, Ie as getSpeechEngine, te as getToolProgress, wr as getWorkspaceId, ue as groupBySession, de as groupConsecutiveBySession, sr as hasAttachmentWorkInFlight, ye as hostedLocaleFor, be as hostedSupportsLanguage, Nr as imageHostLabel, Xe as isCapturing, Ze as isEcho, En as isMostlyImagePages, yi as isMultimodalBodyRejection, Oi as isProdRuntime, r as isQuotaExhaustedError, ne as isReapedSandboxConnectionError, Ar as isRecentlyVerified, re as isRecoverable, bi as isRecoverableAssistantError, Pr as isRemoteImageSrc, ln as isSpeakingMessage, at as isSpeechBlocked, Qe as isSubmittable, pr as isTurnInFlight, C as isUnknownFieldError, fe as isVoiceTurn, Dn as joinSheets, ot as languageDisplayName, ie as mapSessionToHistory, w as markSupported, T as markUnsupported, ae as mergeMessagesById, ze as micIsInterrupt, B as modeRequiresConfirmWrites, Yr as nextModeIndex, st as normalizeLangTag, Ci as notifyAiCreditsUpdated, $e as orbMode, On as pageMarker, Kt as parseConfirmationRefusal, cr as parseDataUrl, kn as parseSharedStrings, _r as parseToolActivity, An as parseWorkbookSheets, jn as pdfTextItemsToPage, mr as planAbandonedTurn, et as planReplyConsumption, hr as planTurnAbort, Lt as pollDelayMs, ct as primaryLanguageSubtag, un as publishedChunks, i as quotaExhaustedEventName, Le as readSpeechEngineConfig, V as releaseSupersededAssistantSandboxes, Ut as replyFollowsInput, H as reportAssistantAiTokenUsage, dn as requiresCancel, Re as resetSpeechEngine, Ht as resolveAssistantLanguage, Wt as resolveLanguagePair, Jt as resolveModeConfig, x as resolveSandboxAssistantMode, sn as resolveSpeechLocale, oe as sanitize, U as selectExistingAssistantSandbox, W as selectSupersededAssistantSandboxes, lt as selectVoiceForLocale, G as sendAssistantPromptAsync, K as sendHeartbeat, Mn as sheetXmlToRows, Ae as shouldDisableEngine, jt as showPreviousChunk, Be as showsAssistantCaption, Ve as showsUserCaption, Tt as speakableEmail, ut as speechGate, an as speechLabelsFor, dt as speechLangForLocale, fn as speechPlaybackReducer, je as splitForVendor, Et as splitTableRow, tt as spokenSoFar, q as stopReapedAssistantSandbox, Nn as summarisePageText, Rt as toCaptionText, lr as toMessageAttachment, Dt as toSpeakableText, ur as truncateForInline, Pn as truncatePagesForInline, _i as useAssistantApiAccess, Ei as useAssistantAttachments, ki as useAssistantHeartbeat, tn as useAssistantI18nNamespace, Ai as useAssistantKeyboardShortcuts, Yt as useAssistantPageLabel, Xt as useAssistantProduct, Zt as useAssistantProductOrNull, yr as useAssistantSpeech, Qt as useAssistantStorageFolders, fr as useAssistantStore, nn as useAssistantTr, vi as useConversationTurns, ce as useSandboxAssistantTransport, e as useVoiceInput, br as useVoiceSession, wi as useWorkspaceWriteAccess, dr as validateFile, ft as voiceAvailability, pe as voiceMarker, kt as voicePreviewText, pt as voiceQualityRank, me as voiceSessionIdOf, nt as voiceSessionReducer, He as voiceStageState, _t as voiceTranscriptFilename, he as voiceTurnsOnly, mt as voicesForLocale, J as waitForAssistantServiceReady, Y as waitForSandboxRunning, Ue as waveformIsActive, We as waveformIsSettled };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/fe-libs",
3
- "version": "2026.908.2",
3
+ "version": "2026.909.2",
4
4
  "description": "Burdenoff frontend primitives and domain libraries",
5
5
  "type": "module",
6
6
  "bin": {