@burdenoff/fe-libs 2026.906.2 → 2026.906.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/dist/shared/assistant/conversation.d.ts +12 -0
  2. package/dist/shared/assistant/conversation.d.ts.map +1 -1
  3. package/dist/shared/assistant/index.d.ts +1 -0
  4. package/dist/shared/assistant/index.d.ts.map +1 -1
  5. package/dist/shared/assistant/ui/AssistantChatArea.d.ts.map +1 -1
  6. package/dist/shared/assistant/ui/AssistantChatArea.js +154 -142
  7. package/dist/shared/assistant/ui/AssistantSpeechProvider.d.ts.map +1 -1
  8. package/dist/shared/assistant/ui/AssistantSpeechProvider.js +100 -88
  9. package/dist/shared/assistant/ui/useVoiceSession.d.ts.map +1 -1
  10. package/dist/shared/assistant/ui/useVoiceSession.js +1 -1
  11. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.d.ts.map +1 -1
  12. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.js +56 -56
  13. package/dist/shared/assistant/ui/voice/VoiceCaption.d.ts +6 -0
  14. package/dist/shared/assistant/ui/voice/VoiceCaption.d.ts.map +1 -1
  15. package/dist/shared/assistant/ui/voice/VoiceCaption.js +23 -14
  16. package/dist/shared/assistant/ui/voice/VoiceMiniController.d.ts.map +1 -1
  17. package/dist/shared/assistant/ui/voice/VoiceMiniController.js +28 -27
  18. package/dist/shared/assistant/ui/voice/VoiceStage.d.ts.map +1 -1
  19. package/dist/shared/assistant/ui/voice/VoiceStage.js +1 -0
  20. package/dist/shared/assistant/ui/voice/VoiceTranscriptDrawer.d.ts +18 -4
  21. package/dist/shared/assistant/ui/voice/VoiceTranscriptDrawer.d.ts.map +1 -1
  22. package/dist/shared/assistant/ui/voice/VoiceTranscriptDrawer.js +36 -26
  23. package/dist/shared/assistant/voice/miniCaptionBudget.d.ts +46 -0
  24. package/dist/shared/assistant/voice/miniCaptionBudget.d.ts.map +1 -0
  25. package/dist/shared/assistant/voice/miniCaptionBudget.js +15 -0
  26. package/dist/shared-assistant.js +69 -68
  27. package/package.json +1 -1
@@ -1,25 +1,34 @@
1
- import { jsx as e, jsxs as t } from "react/jsx-runtime";
1
+ import { useEffect as e, useRef as t } from "react";
2
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
2
3
  //#region src/shared/assistant/ui/voice/VoiceCaption.tsx
3
- var n = ({ text: n, role: r, expanded: i, spokenChunks: a = null, testId: o }) => {
4
- let s = r === "assistant", c = s && a && a.index >= 0 ? a : null;
5
- return /* @__PURE__ */ e("div", {
4
+ var i = "data-caption-scroll", a = ({ text: a, role: o, expanded: s, spokenChunks: c = null, testId: l }) => {
5
+ let u = t(null), d = o === "assistant", f = d && c && c.index >= 0 ? c : null, p = d && c !== null && c.index < 0;
6
+ return e(() => {
7
+ let e = u.current;
8
+ if (!e) return;
9
+ let t = e.closest(`[${i}]`);
10
+ if (!t) return;
11
+ let n = e.offsetTop - t.offsetTop, r = n + e.offsetHeight;
12
+ r > t.scrollTop + t.clientHeight ? t.scrollTop = r - t.clientHeight : n < t.scrollTop && (t.scrollTop = n);
13
+ }, [f?.index]), /* @__PURE__ */ n("div", {
6
14
  className: "flex w-full justify-center",
7
- children: /* @__PURE__ */ e("p", {
15
+ children: /* @__PURE__ */ n("p", {
8
16
  className: [
9
17
  "w-full whitespace-pre-wrap break-words text-left",
10
- i ? "max-w-[45rem]" : "max-w-md",
11
- s ? "font-semibold text-text-primary" : "font-medium text-text-secondary",
12
- i ? s ? "text-[clamp(1.625rem,2.5vw,2.25rem)] leading-[1.5]" : "text-[clamp(1.125rem,1.8vw,1.375rem)] leading-[1.5]" : s ? "text-lg leading-relaxed" : "text-base leading-relaxed"
18
+ s ? "max-w-[45rem]" : "max-w-md",
19
+ d ? "font-semibold text-text-primary" : "font-medium text-text-secondary",
20
+ d ? s ? "text-[clamp(1.625rem,2.5vw,2.25rem)] leading-[1.5]" : "text-[clamp(1.625rem,2vw,2rem)] leading-[1.5]" : s ? "text-[clamp(1.125rem,1.8vw,1.375rem)] leading-[1.5]" : "text-base leading-relaxed"
13
21
  ].join(" "),
14
22
  role: "status",
15
23
  "aria-live": "polite",
16
- "data-testid": o,
17
- children: c ? c.chunks.slice(0, c.index + 1).map((e, n) => /* @__PURE__ */ t("span", {
18
- className: n === c.index ? "text-text-primary" : "text-text-muted transition-colors duration-300",
19
- children: [n > 0 ? " " : "", e]
20
- }, n)) : n
24
+ "data-testid": l,
25
+ children: f ? f.chunks.slice(0, f.index + 1).map((e, t) => /* @__PURE__ */ r("span", {
26
+ className: t === f.index ? "text-text-primary" : "text-text-muted transition-colors duration-300",
27
+ ref: t === f.index ? u : void 0,
28
+ children: [t > 0 ? " " : "", e]
29
+ }, t)) : p ? null : a
21
30
  })
22
31
  });
23
32
  };
24
33
  //#endregion
25
- export { n as VoiceCaption };
34
+ export { i as CAPTION_SCROLL_ATTR, a as VoiceCaption };
@@ -1 +1 @@
1
- {"version":3,"file":"VoiceMiniController.d.ts","sourceRoot":"","sources":["../../../../../src/shared/assistant/ui/voice/VoiceMiniController.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE3C,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,6BAA6B,CAAC;AAErC;;;;;;;;;;;;;;;;;GAiBG;AAEH,UAAU,KAAK;IACb,KAAK,EAAE,eAAe,CAAC;IACvB,uEAAuE;IACvE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,OAAO,EAAE,SAAS,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAAC,KAAK,CAgHzC,CAAC"}
1
+ {"version":3,"file":"VoiceMiniController.d.ts","sourceRoot":"","sources":["../../../../../src/shared/assistant/ui/voice/VoiceMiniController.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAG3C,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,6BAA6B,CAAC;AAErC;;;;;;;;;;;;;;;;;GAiBG;AAEH,UAAU,KAAK;IACb,KAAK,EAAE,eAAe,CAAC;IACvB,uEAAuE;IACvE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,OAAO,EAAE,SAAS,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAAC,KAAK,CAgHzC,CAAC"}
@@ -1,54 +1,55 @@
1
1
  import { showsAssistantCaption as e, waveformIsActive as t, waveformIsSettled as n } from "../../voice/voiceStageState.js";
2
- import { VoiceWaveform as r } from "./VoiceWaveform.js";
3
- import { Fragment as i, jsx as a, jsxs as o } from "react/jsx-runtime";
2
+ import { showPreviousChunk as r } from "../../voice/miniCaptionBudget.js";
3
+ import { VoiceWaveform as i } from "./VoiceWaveform.js";
4
+ import { Fragment as a, jsx as o, jsxs as s } from "react/jsx-runtime";
4
5
  //#region src/shared/assistant/ui/voice/VoiceMiniController.tsx
5
- var s = ({ state: s, caption: c, spokenChunks: l = null, statusText: u, control: d, errorText: f = null }) => {
6
- let p = e(s), m = p && l && l.index >= 0 ? l : null;
7
- return /* @__PURE__ */ o("div", {
6
+ var c = ({ state: c, caption: l, spokenChunks: u = null, statusText: d, control: f, errorText: p = null }) => {
7
+ let m = e(c), h = m && u && u.index >= 0 ? u : null;
8
+ return /* @__PURE__ */ s("div", {
8
9
  className: "flex min-h-0 w-full flex-1 items-center gap-3 px-4",
9
10
  "data-testid": "assistant-voice-mini",
10
- "data-state": s,
11
- children: [/* @__PURE__ */ o("div", {
11
+ "data-state": c,
12
+ children: [/* @__PURE__ */ s("div", {
12
13
  className: "flex min-w-0 flex-1 flex-col gap-1.5",
13
- children: [/* @__PURE__ */ o("div", {
14
+ children: [/* @__PURE__ */ s("div", {
14
15
  className: "flex items-center gap-2",
15
- children: [/* @__PURE__ */ a(r, {
16
- active: t(s),
17
- settled: n(s),
18
- tone: s === "speaking" ? "speaking" : "listening"
19
- }), /* @__PURE__ */ a("p", {
16
+ children: [/* @__PURE__ */ o(i, {
17
+ active: t(c),
18
+ settled: n(c),
19
+ tone: c === "speaking" ? "speaking" : "listening"
20
+ }), /* @__PURE__ */ o("p", {
20
21
  className: "truncate text-xs text-text-muted",
21
22
  "aria-live": "polite",
22
23
  "data-testid": "assistant-voice-status",
23
- children: u
24
+ children: d
24
25
  })]
25
- }), s === "mic-error" ? /* @__PURE__ */ a("p", {
26
+ }), c === "mic-error" ? /* @__PURE__ */ o("p", {
26
27
  className: "line-clamp-2 text-xs text-status-warning",
27
28
  role: "alert",
28
29
  "data-testid": "assistant-voice-mini-error",
29
- children: f
30
- }) : c ? /* @__PURE__ */ a("p", {
31
- className: ["line-clamp-3 break-words text-left text-sm leading-snug", p ? "font-semibold text-text-primary" : "font-medium text-text-secondary"].join(" "),
30
+ children: p
31
+ }) : l ? /* @__PURE__ */ o("p", {
32
+ className: ["line-clamp-3 break-words text-left text-sm leading-snug", m ? "font-semibold text-text-primary" : "font-medium text-text-secondary"].join(" "),
32
33
  role: "status",
33
34
  "aria-live": "polite",
34
35
  "data-testid": "assistant-voice-caption",
35
- children: m ? /* @__PURE__ */ o(i, { children: [m.index > 0 ? /* @__PURE__ */ o("span", {
36
+ children: h ? /* @__PURE__ */ s(a, { children: [r(h) ? /* @__PURE__ */ s("span", {
36
37
  className: "text-text-muted transition-colors duration-300",
37
- children: [m.chunks[m.index - 1], " "]
38
- }) : null, /* @__PURE__ */ a("span", {
38
+ children: [h.chunks[h.index - 1], " "]
39
+ }) : null, /* @__PURE__ */ o("span", {
39
40
  className: "text-text-primary",
40
41
  "data-testid": "assistant-voice-caption-current",
41
- children: m.chunks[m.index]
42
- })] }) : c
43
- }) : /* @__PURE__ */ a("div", {
42
+ children: h.chunks[h.index]
43
+ })] }) : l
44
+ }) : /* @__PURE__ */ o("div", {
44
45
  className: "h-9",
45
46
  "aria-hidden": "true"
46
47
  })]
47
- }), /* @__PURE__ */ a("div", {
48
+ }), /* @__PURE__ */ o("div", {
48
49
  className: "shrink-0",
49
- children: d
50
+ children: f
50
51
  })]
51
52
  });
52
53
  };
53
54
  //#endregion
54
- export { s as VoiceMiniController };
55
+ export { c as VoiceMiniController };
@@ -1 +1 @@
1
- {"version":3,"file":"VoiceStage.d.ts","sourceRoot":"","sources":["../../../../../src/shared/assistant/ui/voice/VoiceStage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAG3C,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,6BAA6B,CAAC;AAErC;;;;;;;;;;;;;;;;;GAiBG;AAEH,UAAU,KAAK;IACb,KAAK,EAAE,eAAe,CAAC;IACvB,mDAAmD;IACnD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,oCAAoC;IACpC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,OAAO,EAAE,SAAS,CAAC;IACnB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,+EAA+E;IAC/E,YAAY,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC3D;AAED,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,KAAK,CA4HhC,CAAC"}
1
+ {"version":3,"file":"VoiceStage.d.ts","sourceRoot":"","sources":["../../../../../src/shared/assistant/ui/voice/VoiceStage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAG3C,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,6BAA6B,CAAC;AAErC;;;;;;;;;;;;;;;;;GAiBG;AAEH,UAAU,KAAK;IACb,KAAK,EAAE,eAAe,CAAC;IACvB,mDAAmD;IACnD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,oCAAoC;IACpC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,OAAO,EAAE,SAAS,CAAC;IACnB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,+EAA+E;IAC/E,YAAY,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC3D;AAED,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,KAAK,CAiIhC,CAAC"}
@@ -39,6 +39,7 @@ var l = ({ state: l, userCaption: u, assistantCaption: d, expanded: f, statusTex
39
39
  })
40
40
  }), _ ? /* @__PURE__ */ s("div", {
41
41
  className: f ? "mb-12 max-h-[46vh] w-full overflow-y-auto" : "mb-6 max-h-[38vh] w-full overflow-y-auto",
42
+ "data-caption-scroll": "",
42
43
  children: /* @__PURE__ */ s(i, {
43
44
  text: _,
44
45
  role: e(l) ? "assistant" : "user",
@@ -27,12 +27,26 @@ interface Props {
27
27
  /**
28
28
  * Leave a note of this exchange in the typed thread and carry on there.
29
29
  *
30
- * Supplied only DURING a live session, where "continue in chat" is a move
31
- * the user is making. Opened from the chat panel afterwards they are already
32
- * in chat, and a button offering to take them there would be a no-op with a
33
- * confident label.
30
+ * ★★ Offered on BOTH mounts. This said "only DURING a live session opened
31
+ * from the chat panel the user is already in chat, so the button would be a
32
+ * no-op with a confident label". That reads it as navigation; it is not. It
33
+ * WRITES the note summarising what was asked aloud, and ending the session is
34
+ * the side effect. Withheld here, the trace was obtainable only while the
35
+ * session was still live.
36
+ *
37
+ * ★ Undefined once every turn has already been carried over, so the note
38
+ * cannot be appended twice from a drawer the user can reopen.
34
39
  */
35
40
  onContinueInChat?: () => void;
41
+ /**
42
+ * ★★ Close on Escape. Set on the POST-SESSION mount only.
43
+ *
44
+ * During a live session `AssistantVoiceSession` owns Escape and closes this
45
+ * drawer itself; two handlers would race for one key. But ending a session
46
+ * with Escape hands back this drawer with that component unmounted, so
47
+ * nothing was listening and the gesture that opened it could not close it.
48
+ */
49
+ closeOnEscape?: boolean;
36
50
  }
37
51
  export declare const VoiceTranscriptDrawer: FC<Props>;
38
52
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"VoiceTranscriptDrawer.d.ts","sourceRoot":"","sources":["../../../../../src/shared/assistant/ui/voice/VoiceTranscriptDrawer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAIhC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEtE;;;;;;;;;;;;;;;;;;GAkBG;AAEH,UAAU,KAAK;IACb,KAAK,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;IAC1C,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAED,eAAO,MAAM,qBAAqB,EAAE,EAAE,CAAC,KAAK,CAsF3C,CAAC"}
1
+ {"version":3,"file":"VoiceTranscriptDrawer.d.ts","sourceRoot":"","sources":["../../../../../src/shared/assistant/ui/voice/VoiceTranscriptDrawer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAInD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEtE;;;;;;;;;;;;;;;;;;GAkBG;AAEH,UAAU,KAAK;IACb,KAAK,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;IAC1C,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB;;;;;;;;;;;;OAYG;IACH,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,eAAO,MAAM,qBAAqB,EAAE,EAAE,CAAC,KAAK,CAqI3C,CAAC"}
@@ -1,54 +1,64 @@
1
1
  import { useAssistantTr as e } from "../../i18n.js";
2
2
  import { VoiceConversationView as t } from "./VoiceConversationView.js";
3
- import { ArrowRight as n, Download as r, X as i } from "lucide-react";
4
- import { jsx as a, jsxs as o } from "react/jsx-runtime";
3
+ import { useEffect as n, useRef as r } from "react";
4
+ import { ArrowRight as i, Download as a, X as o } from "lucide-react";
5
+ import { jsx as s, jsxs as c } from "react/jsx-runtime";
5
6
  //#region src/shared/assistant/ui/voice/VoiceTranscriptDrawer.tsx
6
- var s = ({ turns: s, onClose: c, onSave: l, onContinueInChat: u }) => {
7
- let d = e();
8
- return /* @__PURE__ */ o("div", {
7
+ var l = ({ turns: l, onClose: u, onSave: d, onContinueInChat: f, closeOnEscape: p = !1 }) => {
8
+ let m = e(), h = r(null);
9
+ return n(() => {
10
+ if (!p) return;
11
+ let e = (e) => {
12
+ if (e.key !== "Escape" || document.querySelector("[role=\"alertdialog\"]")) return;
13
+ let t = h.current?.closest("[data-testid=\"ai-assistant-panel\"]"), n = document.activeElement;
14
+ !t || !n || !t.contains(n) || (e.preventDefault(), e.stopPropagation(), u());
15
+ };
16
+ return document.addEventListener("keydown", e, !0), () => document.removeEventListener("keydown", e, !0);
17
+ }, [p, u]), /* @__PURE__ */ c("div", {
18
+ ref: h,
9
19
  className: "absolute inset-0 z-30 flex flex-col bg-bg-sunken/95 backdrop-blur-sm",
10
20
  role: "dialog",
11
- "aria-label": d("voiceSession.transcriptTitle", "Voice transcript"),
21
+ "aria-label": m("voiceSession.transcriptTitle", "Voice transcript"),
12
22
  "data-testid": "assistant-voice-transcript",
13
23
  children: [
14
- /* @__PURE__ */ o("div", {
24
+ /* @__PURE__ */ c("div", {
15
25
  className: "flex items-center justify-between border-b border-border-subtle px-4 py-3",
16
- children: [/* @__PURE__ */ o("div", {
26
+ children: [/* @__PURE__ */ c("div", {
17
27
  className: "min-w-0",
18
- children: [/* @__PURE__ */ a("h2", {
28
+ children: [/* @__PURE__ */ s("h2", {
19
29
  className: "text-sm font-semibold text-text-primary",
20
- children: d("voiceSession.transcript", "Voice conversation")
21
- }), /* @__PURE__ */ a("p", {
30
+ children: m("voiceSession.transcript", "Voice conversation")
31
+ }), /* @__PURE__ */ s("p", {
22
32
  className: "truncate text-xs text-text-muted",
23
- children: d("voiceSession.transcriptHint", "Spoken turns in this conversation — kept out of your typed chat.")
33
+ children: m("voiceSession.transcriptHint", "Spoken turns in this conversation — kept out of your typed chat.")
24
34
  })]
25
- }), /* @__PURE__ */ a("button", {
35
+ }), /* @__PURE__ */ s("button", {
26
36
  type: "button",
27
- onClick: c,
37
+ onClick: u,
28
38
  className: "flex size-8 items-center justify-center rounded-full 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",
29
- "aria-label": d("voiceSession.transcriptClose", "Close the transcript"),
39
+ "aria-label": m("voiceSession.transcriptClose", "Close the transcript"),
30
40
  "data-testid": "assistant-voice-transcript-close",
31
- children: /* @__PURE__ */ a(i, { className: "size-4" })
41
+ children: /* @__PURE__ */ s(o, { className: "size-4" })
32
42
  })]
33
43
  }),
34
- /* @__PURE__ */ a(t, { turns: s }),
35
- (l || u) && s.length > 0 ? /* @__PURE__ */ o("div", {
44
+ /* @__PURE__ */ s(t, { turns: l }),
45
+ (d || f) && l.length > 0 ? /* @__PURE__ */ c("div", {
36
46
  className: "flex items-center justify-end gap-2 border-t border-border-subtle px-4 py-3",
37
- children: [l ? /* @__PURE__ */ o("button", {
47
+ children: [d ? /* @__PURE__ */ c("button", {
38
48
  type: "button",
39
- onClick: l,
49
+ onClick: d,
40
50
  className: "flex items-center gap-1.5 rounded-lg border border-border-default px-3 py-1.5 text-xs text-text-secondary transition-colors hover:bg-bg-elevated hover:text-text-primary focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong",
41
51
  "data-testid": "assistant-voice-save-transcript",
42
- children: [/* @__PURE__ */ a(r, {
52
+ children: [/* @__PURE__ */ s(a, {
43
53
  className: "size-3.5",
44
54
  "aria-hidden": "true"
45
- }), d("voiceSession.save", "Save transcript")]
46
- }) : null, u ? /* @__PURE__ */ o("button", {
55
+ }), m("voiceSession.save", "Save transcript")]
56
+ }) : null, f ? /* @__PURE__ */ c("button", {
47
57
  type: "button",
48
- onClick: u,
58
+ onClick: f,
49
59
  className: "flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-3 py-1.5 text-xs font-medium text-action-primary-fg transition-opacity hover:opacity-90 focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong",
50
60
  "data-testid": "assistant-voice-continue-in-chat",
51
- children: [d("voiceSession.continueInChat", "Continue in chat"), /* @__PURE__ */ a(n, {
61
+ children: [m("voiceSession.continueInChat", "Continue in chat"), /* @__PURE__ */ s(i, {
52
62
  className: "size-3.5",
53
63
  "aria-hidden": "true"
54
64
  })]
@@ -58,4 +68,4 @@ var s = ({ turns: s, onClose: c, onSave: l, onContinueInChat: u }) => {
58
68
  });
59
69
  };
60
70
  //#endregion
61
- export { s as VoiceTranscriptDrawer };
71
+ export { l as VoiceTranscriptDrawer };
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Does the docked strip have room for the previously-spoken chunk?
3
+ *
4
+ * ★★ Lives here, not in `VoiceMiniController`, so it can be tested by CALLING
5
+ * it. The mini caption's other invariants are pinned by reading the component's
6
+ * source as text, which is all that is available for JSX — but this is a pure
7
+ * decision about lengths, and a real test that feeds it real chunk sizes is
8
+ * worth more than a grep for its name.
9
+ */
10
+ /**
11
+ * Roughly how many characters survive the strip's three-line clamp.
12
+ *
13
+ * ★★ Derived, not guessed — and the first version of this got it wrong in a
14
+ * way worth recording. It estimated ~75 characters of capacity and then set
15
+ * the budget to 160, so an 80+80 pair passed: the previous chunk is rendered
16
+ * FIRST, so it consumed the whole clamp and hid the sentence being spoken.
17
+ * The number contradicted the reasoning printed directly above it, and it
18
+ * re-admitted the exact bug this module exists to prevent.
19
+ *
20
+ * The arithmetic, at the docked panel width both products ship (440px):
21
+ * 440 − px-3 (24) − px-4 (32) − gap-3 (12) − orb w-40 (160) ≈ 212px
22
+ * and on a 320px phone the same subtraction leaves ≈ 92px. At `text-sm`
23
+ * (14px, ~7px average advance) that is ~30 and ~13 characters a line, so the
24
+ * three-line clamp holds roughly 90 and 40 characters respectively.
25
+ *
26
+ * The budget is the NARROWEST of those, not an average — 70 was the second
27
+ * wrong answer here. A single constant cannot be right for both widths, and
28
+ * the promise being kept is "the sentence being spoken is never dropped". Only
29
+ * fitting the smallest layout keeps it everywhere; sizing for the docked
30
+ * desktop case means a 40+30 pair passes and then clips the current chunk on a
31
+ * phone, which is the whole defect again in a narrower window.
32
+ *
33
+ * Erring small costs a little unused room on wide panels. Erring large costs
34
+ * the feature on small ones. Those are not symmetric.
35
+ *
36
+ * The consequence is deliberate: with chunks running to `SPEECH_CHUNK_CHARS` =
37
+ * 180, context will often NOT be shown — the honest answer, because there is
38
+ * often no room. "When there is room" has to mean something for the promise to
39
+ * hold at all.
40
+ */
41
+ export declare const MINI_CAPTION_BUDGET = 40;
42
+ export declare const showPreviousChunk: (synced: {
43
+ chunks: string[];
44
+ index: number;
45
+ }) => boolean;
46
+ //# sourceMappingURL=miniCaptionBudget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"miniCaptionBudget.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/voice/miniCaptionBudget.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAmDtC,eAAO,MAAM,iBAAiB,GAAI,QAAQ;IACxC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,KAAG,OAOH,CAAC"}
@@ -0,0 +1,15 @@
1
+ //#region src/shared/assistant/voice/miniCaptionBudget.ts
2
+ var e = 40, t = (e) => {
3
+ let t = 0;
4
+ for (let n of e) {
5
+ let e = n.codePointAt(0) ?? 0;
6
+ t += e > 591 && !(e >= 880 && e <= 1279) ? 1.5 : 1;
7
+ }
8
+ return t;
9
+ }, n = (e) => {
10
+ if (e.index <= 0) return !1;
11
+ let n = e.chunks[e.index] ?? "", r = e.chunks[e.index - 1] ?? "";
12
+ return t(n) + t(r) <= 40;
13
+ };
14
+ //#endregion
15
+ export { e as MINI_CAPTION_BUDGET, n as showPreviousChunk };
@@ -22,71 +22,72 @@ import { SPEECH_LANG as Qe, VOICE_LIST_TIMEOUT_MS as $e, isSpeechBlocked as et,
22
22
  import { buildContinuedFromVoiceNote as ut, buildVoiceTranscriptMarkdown as dt, voiceTranscriptFilename as ft } from "./shared/assistant/voice/voiceTranscript.js";
23
23
  import { DEFAULT_SPEAKABLE_LABELS as pt, MAX_SPEAKABLE_CHARS as mt, MAX_SPOKEN_TABLE_ROWS as ht, SPEECH_CHUNK_CHARS as gt, SPEECH_CHUNK_CJK_CHARS as _t, chunkForSpeech as vt, containsCjk as yt, speakableEmail as bt, splitTableRow as xt, toSpeakableText as St } from "./shared/assistant/voice/speakableText.js";
24
24
  import { PREVIEW_LANGUAGES as Ct, voicePreviewText as wt } from "./shared/assistant/voice/voicePreview.js";
25
- import { POLL_FAST_MS as Tt, POLL_FAST_UNTIL_MS as Et, POLL_SLOW_MS as Dt, POLL_STEADY_MS as Ot, POLL_STEADY_UNTIL_MS as kt, pollDelayMs as At } from "./shared/assistant/voice/assistantPollSchedule.js";
26
- import { toCaptionText as jt } from "./shared/assistant/voice/captionText.js";
27
- import { ASSISTANT_LANGUAGES as Mt, DEFAULT_SPEECH_RATE as Nt, findAssistantLanguage as Pt, resolveAssistantLanguage as Ft } from "./shared/assistant/voice/languages.js";
28
- import { replyFollowsInput as It, resolveLanguagePair as Lt } from "./shared/assistant/voice/languagePair.js";
29
- import { findPendingWrite as Rt, parseConfirmationRefusal as zt } from "./shared/assistant/pendingWrite.js";
30
- import { AssistantProductProvider as Bt, resolveModeConfig as Vt, useAssistantPageLabel as Ht, useAssistantProduct as Ut, useAssistantProductOrNull as Wt, useAssistantStorageFolders as Gt } from "./shared/assistant/product.js";
31
- import { AssistantI18nProvider as Kt, assistantTranslationKey as qt, useAssistantI18nNamespace as Jt, useAssistantTr as Yt } from "./shared/assistant/i18n.js";
32
- import { SPOKEN_LABEL_LANGUAGES as Xt, speechLabelsFor as Zt } from "./shared/assistant/voice/speechLabels.js";
33
- import { detectScriptLocale as Qt, resolveSpeechLocale as $t } from "./shared/assistant/voice/replyLanguage.js";
34
- import { IDLE_PLAYBACK as en, isSpeakingMessage as tn, requiresCancel as nn, speechPlaybackReducer as rn } from "./shared/assistant/voice/speechPlayback.js";
35
- import { MAX_INLINE_IMAGE_BASE64_BYTES as an, MAX_REQUEST_BODY_BYTES as on } from "./shared/assistant/gatewayLimits.js";
36
- import { BOILERPLATE_PAGE_SHARE as sn, MAX_BOILERPLATE_LINE_CHARS as cn, MAX_EXTRACTED_CHARS as ln, MAX_PDF_PAGES_SCANNED as un, MIN_PAGE_TEXT_CHARS as dn, MIN_TEXT_PAGE_SHARE as fn, columnLetterToIndex as pn, decodeXmlEntities as mn, docxXmlToText as hn, fitPdfPages as gn, formatPageRanges as _n, isMostlyImagePages as vn, joinSheets as yn, pageMarker as bn, parseSharedStrings as xn, parseWorkbookSheets as Sn, pdfTextItemsToPage as Cn, sheetXmlToRows as wn, summarisePageText as Tn, truncatePagesForInline as En } from "./shared/assistant/documentText.js";
37
- import { ATTACHMENT_ACCEPT as Dn, AttachmentRejectedError as On, INLINE_IMAGE_MAX_DIM as kn, INLINE_IMAGE_QUALITY as An, MAX_ATTACHMENTS as jn, MAX_FILE_BYTES as Mn, MAX_INLINE_CHARS_PER_FILE as Nn, MAX_INLINE_CHARS_TOTAL as Pn, MAX_INLINE_IMAGE_BASE64_CHARS as Fn, MAX_INLINE_IMAGE_PARTS as In, MAX_INLINE_TURN_BODY_BYTES as Ln, MAX_TURN_BODY_BYTES as Rn, PROMPT_ENVELOPE_RESERVE_BYTES as zn, TURN_BODY_HEADROOM_BYTES as Bn, buildAttachmentPromptBlock as Vn, buildPromptParts as Hn, buildPromptWithAttachments as Un, classifyAttachment as Wn, countInlineImageCandidates as Gn, countInlinedImageParts as Kn, detectDocumentFormat as qn, estimateTurnBodyBytes as Jn, formatBytes as Yn, getAttachmentSendBlocker as Xn, getExtension as Zn, getSendableAttachments as Qn, hasAttachmentWorkInFlight as $n, parseDataUrl as er, toMessageAttachment as tr, truncateForInline as nr, validateFile as rr } from "./shared/assistant/attachments.js";
38
- import { useAssistantStore as ir } from "./shared/assistant/store.js";
39
- import { isTurnInFlight as ar } from "./shared/assistant/turnState.js";
40
- import { AssistantToolActivity as or, parseToolActivity as sr } from "./shared/assistant/ui/AssistantToolActivity.js";
41
- import { AssistantSpeechProvider as cr, useAssistantSpeech as lr } from "./shared/assistant/ui/AssistantSpeechProvider.js";
42
- import { useVoiceSession as ur } from "./shared/assistant/ui/useVoiceSession.js";
43
- import { copyToClipboard as dr } from "./shared/assistant/clipboard.js";
44
- import { getActorId as fr, getOrganizationId as pr, getWorkspaceId as mr } from "./shared/assistant/context.js";
45
- import { ATTACHMENT_SOURCES as hr, availableAttachmentSources as gr, deviceHasCamera as _r } from "./shared/assistant/attachmentSources.js";
46
- import { SANDBOX_READY_TTL_MS as vr, createReadinessTracker as yr, isRecentlyVerified as br } from "./shared/assistant/sandboxReadiness.js";
47
- import { AssistantAutoSpeakToggle as xr } from "./shared/assistant/ui/AssistantAutoSpeakToggle.js";
48
- import { AssistantMarkdownImage as Sr, imageHostLabel as Cr, isRemoteImageSrc as wr } from "./shared/assistant/ui/AssistantMarkdownImage.js";
49
- import { AssistantMarkdownRenderer as Tr, assistantUrlTransform as Er } from "./shared/assistant/ui/AssistantMarkdownRenderer.js";
50
- import { AssistantMessageAttachments as Dr } from "./shared/assistant/ui/AssistantMessageAttachments.js";
51
- import { AssistantPendingWriteCard as Or } from "./shared/assistant/ui/AssistantPendingWriteCard.js";
52
- import { AssistantLanguageMenu as kr } from "./shared/assistant/ui/AssistantLanguageMenu.js";
53
- import { AssistantReplyLanguageSelector as Ar } from "./shared/assistant/ui/AssistantReplyLanguageSelector.js";
54
- import { AssistantSpeakButton as jr } from "./shared/assistant/ui/AssistantSpeakButton.js";
55
- import { AssistantSpokenTurnsNotice as Mr } from "./shared/assistant/ui/AssistantSpokenTurnsNotice.js";
56
- import { AssistantAttachmentButton as Nr } from "./shared/assistant/ui/composer/AssistantAttachmentButton.js";
57
- import { AssistantAttachmentChips as Pr } from "./shared/assistant/ui/composer/AssistantAttachmentChips.js";
58
- import { AssistantLanguageSelector as Fr, FOLLOW_APP_LOCALE as Ir } from "./shared/assistant/ui/composer/AssistantLanguageSelector.js";
59
- import { ASSISTANT_MODE_META as Lr, AssistantModeSelector as Rr, nextModeIndex as zr } from "./shared/assistant/ui/composer/AssistantModeSelector.js";
60
- import { AssistantVoiceButton as Br } from "./shared/assistant/ui/composer/AssistantVoiceButton.js";
61
- import { AUTO_VOICE as Vr, AssistantVoiceSelector as Hr } from "./shared/assistant/ui/composer/AssistantVoiceSelector.js";
62
- import { AssistantVoiceOrb as Ur } from "./shared/assistant/ui/voice/AssistantVoiceOrb.js";
63
- import { AssistantVoiceSessionButton as Wr } from "./shared/assistant/ui/voice/AssistantVoiceSessionButton.js";
64
- import { VoiceCaption as Gr } from "./shared/assistant/ui/voice/VoiceCaption.js";
65
- import { VoiceConversationView as Kr } from "./shared/assistant/ui/voice/VoiceConversationView.js";
66
- import { VoiceWaveform as qr } from "./shared/assistant/ui/voice/VoiceWaveform.js";
67
- import { VoiceMiniController as Jr } from "./shared/assistant/ui/voice/VoiceMiniController.js";
68
- import { VoiceStage as Yr } from "./shared/assistant/ui/voice/VoiceStage.js";
69
- import { VoiceTranscriptDrawer as Xr } from "./shared/assistant/ui/voice/VoiceTranscriptDrawer.js";
70
- import { downloadFile as Zr, exportConversation as Qr } from "./shared/assistant/exportConversation.js";
71
- import { AssistantMoreMenu as $r } from "./shared/assistant/ui/AssistantMoreMenu.js";
72
- import { AssistantHeader as ei } from "./shared/assistant/ui/AssistantHeader.js";
73
- import { AssistantConversationList as ti } from "./shared/assistant/ui/AssistantConversationList.js";
74
- import { AssistantEmptyState as ni } from "./shared/assistant/ui/AssistantEmptyState.js";
75
- import { AssistantMessageItem as ri } from "./shared/assistant/ui/AssistantMessageItem.js";
76
- import { AssistantMessageList as ii } from "./shared/assistant/ui/AssistantMessageList.js";
77
- import { AssistantVoiceSession as ai } from "./shared/assistant/ui/voice/AssistantVoiceSession.js";
78
- import { useAssistantApiAccess as oi } from "./shared/assistant/useAssistantApiAccess.js";
79
- import { useConversationTurns as si } from "./shared/assistant/useConversationTurns.js";
80
- import { isMultimodalBodyRejection as ci, isRecoverableAssistantError as li } from "./shared/assistant/transportErrors.js";
81
- import { aiCreditsUpdatedEventName as ui, dispatchAssistantQuotaExhausted as di, notifyAiCreditsUpdated as fi } from "./shared/assistant/aiCredits.js";
82
- import { useWorkspaceWriteAccess as pi } from "./shared/assistant/useWorkspaceWriteAccess.js";
83
- import { extractDocumentText as mi } from "./shared/assistant/documentExtract.js";
84
- import { useAssistantAttachments as hi } from "./shared/assistant/useAssistantAttachments.js";
85
- import { AssistantComposer as gi } from "./shared/assistant/ui/composer/AssistantComposer.js";
86
- import { isProdRuntime as _i } from "./shared/assistant/env.js";
87
- import { useAssistantHeartbeat as vi } from "./shared/assistant/useAssistantHeartbeat.js";
88
- import { useAssistantKeyboardShortcuts as yi } from "./shared/assistant/useAssistantKeyboardShortcuts.js";
89
- import { AssistantApiCallsConsentDialog as bi } from "./shared/assistant/ui/AssistantApiCallsConsentDialog.js";
90
- import { AssistantChatArea as xi } from "./shared/assistant/ui/AssistantChatArea.js";
91
- import { AIAssistantPanel as Si } from "./shared/assistant/ui/AIAssistantPanel.js";
92
- export { Si as AIAssistantPanel, h as ASSISTANT_API_AUTH_STRATEGY, Mt as ASSISTANT_LANGUAGES, Lr as ASSISTANT_MODE_META, Dn as ATTACHMENT_ACCEPT, hr as ATTACHMENT_SOURCES, Vr as AUTO_VOICE, bi as AssistantApiCallsConsentDialog, Nr as AssistantAttachmentButton, Pr as AssistantAttachmentChips, xr as AssistantAutoSpeakToggle, xi as AssistantChatArea, gi as AssistantComposer, ti as AssistantConversationList, ni as AssistantEmptyState, ei as AssistantHeader, Kt as AssistantI18nProvider, kr as AssistantLanguageMenu, Fr as AssistantLanguageSelector, Sr as AssistantMarkdownImage, Tr as AssistantMarkdownRenderer, Dr as AssistantMessageAttachments, ri as AssistantMessageItem, ii as AssistantMessageList, Rr as AssistantModeSelector, $r as AssistantMoreMenu, Or as AssistantPendingWriteCard, Bt as AssistantProductProvider, Ar as AssistantReplyLanguageSelector, G as AssistantRuntimeManager, jr as AssistantSpeakButton, cr as AssistantSpeechProvider, Mr as AssistantSpokenTurnsNotice, or as AssistantToolActivity, Br as AssistantVoiceButton, Ur as AssistantVoiceOrb, Hr as AssistantVoiceSelector, ai as AssistantVoiceSession, Wr as AssistantVoiceSessionButton, On as AttachmentRejectedError, sn as BOILERPLATE_PAGE_SHARE, o as CHECK_AI_CREDITS, s as CREATE_SANDBOX, pt as DEFAULT_SPEAKABLE_LABELS, Nt as DEFAULT_SPEECH_RATE, Be as ENDPOINT_GRACE_MS, c as EXTEND_SANDBOX_TTL, Ir as FOLLOW_APP_LOCALE, l as GET_ACTIVE_SANDBOXES, u as GET_SANDBOX, ge as HOSTED_TTS_MAX_CHARS, fe as HOSTED_TTS_TIER, pe as HOSTED_VOICES, en as IDLE_PLAYBACK, Ve as INITIAL_SESSION, kn as INLINE_IMAGE_MAX_DIM, An as INLINE_IMAGE_QUALITY, He as INTERRUPT_MAX_MS, Ue as INTERRUPT_MIN_MS, jn as MAX_ATTACHMENTS, cn as MAX_BOILERPLATE_LINE_CHARS, ln as MAX_EXTRACTED_CHARS, Mn as MAX_FILE_BYTES, Nn as MAX_INLINE_CHARS_PER_FILE, Pn as MAX_INLINE_CHARS_TOTAL, an as MAX_INLINE_IMAGE_BASE64_BYTES, Fn as MAX_INLINE_IMAGE_BASE64_CHARS, In as MAX_INLINE_IMAGE_PARTS, Ln as MAX_INLINE_TURN_BODY_BYTES, un as MAX_PDF_PAGES_SCANNED, on as MAX_REQUEST_BODY_BYTES, mt as MAX_SPEAKABLE_CHARS, ht as MAX_SPOKEN_TABLE_ROWS, Rn as MAX_TURN_BODY_BYTES, dn as MIN_PAGE_TEXT_CHARS, fn as MIN_TEXT_PAGE_SHARE, Tt as POLL_FAST_MS, Et as POLL_FAST_UNTIL_MS, Dt as POLL_SLOW_MS, Ot as POLL_STEADY_MS, kt as POLL_STEADY_UNTIL_MS, Ct as PREVIEW_LANGUAGES, zn as PROMPT_ENVELOPE_RESERVE_BYTES, d as PROXY_SANDBOX_REQUEST, f as REPORT_AI_TOKEN_USAGE, vr as SANDBOX_READY_TTL_MS, We as SILENCE_SUBMIT_MS, _e as SPEAKING_RATE_MAX, ve as SPEAKING_RATE_MAX_STREAMING, ye as SPEAKING_RATE_MAX_SYNC, be as SPEAKING_RATE_MIN, gt as SPEECH_CHUNK_CHARS, _t as SPEECH_CHUNK_CJK_CHARS, Qe as SPEECH_LANG, Xt as SPOKEN_LABEL_LANGUAGES, p as STOP_ASSISTANT_SANDBOX, Bn as TURN_BODY_HEADROOM_BYTES, $e as VOICE_LIST_TIMEOUT_MS, Gr as VoiceCaption, Kr as VoiceConversationView, Jr as VoiceMiniController, Yr as VoiceStage, Xr as VoiceTranscriptDrawer, qr as VoiceWaveform, m as WAIT_FOR_SANDBOX_RUNNING, ui as aiCreditsUpdatedEventName, qt as assistantTranslationKey, Er as assistantUrlTransform, gr as availableAttachmentSources, xe as base64ToBytes, de as browserSpeechEngine, T as buildAssistantSandboxEnv, Vn as buildAttachmentPromptBlock, ut as buildContinuedFromVoiceNote, K as buildProgress, Hn as buildPromptParts, E as buildPromptRequestBody, Un as buildPromptWithAttachments, Se as buildRequest, i as buildSandboxContextInput, dt as buildVoiceTranscriptMarkdown, ie as chatTurns, D as checkAssistantAiCredits, vt as chunkForSpeech, Wn as classifyAttachment, Ce as classifyHttpFailure, t as classifyQuotaError, pn as columnLetterToIndex, ke as configureSpeechEngine, yt as containsCjk, dr as copyToClipboard, Gn as countInlineImageCandidates, Kn as countInlinedImageParts, O as createAssistantSandbox, k as createAssistantSession, De as createHostedTtsEngine, yr as createReadinessTracker, Oe as createRoutingSpeechEngine, ne as createSandboxAssistantTransport, Ae as createSpeechEngines, we as decodeAudioResponse, mn as decodeXmlEntities, qn as detectDocumentFormat, Qt as detectScriptLocale, _r as deviceHasCamera, di as dispatchAssistantQuotaExhausted, hn as docxXmlToText, A as downloadAssistantArtifact, Zr as downloadFile, Jn as estimateTurnBodyBytes, a as executeSandboxGraphQL, Qr as exportConversation, j as extendAssistantSandboxTTL, mi as extractDocumentText, Pt as findAssistantLanguage, M as findExistingSandbox, Rt as findPendingWrite, gn as fitPdfPages, Yn as formatBytes, _n as formatPageRanges, fr as getActorId, N as getAssistantArtifacts, q as getAssistantMedia, P as getAssistantMessages, F as getAssistantSession, I as getAssistantStreamAccess, J as getAssistantText, Xn as getAttachmentSendBlocker, x as getCapability, Zn as getExtension, g as getImageForMode, _ as getImageTagForMode, pr as getOrganizationId, Y as getRawMessageCreatedAt, v as getResourcesForMode, y as getSandboxImageRegistry, Qn as getSendableAttachments, je as getSpeechEngine, X as getToolProgress, mr as getWorkspaceId, ae as groupBySession, oe as groupConsecutiveBySession, $n as hasAttachmentWorkInFlight, me as hostedLocaleFor, he as hostedSupportsLanguage, Cr as imageHostLabel, Ge as isCapturing, Ke as isEcho, vn as isMostlyImagePages, ci as isMultimodalBodyRejection, _i as isProdRuntime, n as isQuotaExhaustedError, Z as isReapedSandboxConnectionError, br as isRecentlyVerified, Q as isRecoverable, li as isRecoverableAssistantError, wr as isRemoteImageSrc, tn as isSpeakingMessage, et as isSpeechBlocked, qe as isSubmittable, ar as isTurnInFlight, S as isUnknownFieldError, se as isVoiceTurn, yn as joinSheets, tt as languageDisplayName, $ as mapSessionToHistory, C as markSupported, w as markUnsupported, ee as mergeMessagesById, Pe as micIsInterrupt, L as modeRequiresConfirmWrites, zr as nextModeIndex, nt as normalizeLangTag, fi as notifyAiCreditsUpdated, Je as orbMode, bn as pageMarker, zt as parseConfirmationRefusal, er as parseDataUrl, xn as parseSharedStrings, sr as parseToolActivity, Sn as parseWorkbookSheets, Cn as pdfTextItemsToPage, Ye as planReplyConsumption, At as pollDelayMs, rt as primaryLanguageSubtag, r as quotaExhaustedEventName, Me as readSpeechEngineConfig, It as replyFollowsInput, R as reportAssistantAiTokenUsage, nn as requiresCancel, Ne as resetSpeechEngine, Ft as resolveAssistantLanguage, Lt as resolveLanguagePair, Vt as resolveModeConfig, b as resolveSandboxAssistantMode, $t as resolveSpeechLocale, te as sanitize, z as selectExistingAssistantSandbox, it as selectVoiceForLocale, B as sendAssistantPromptAsync, V as sendHeartbeat, wn as sheetXmlToRows, Te as shouldDisableEngine, Fe as showsAssistantCaption, Ie as showsUserCaption, bt as speakableEmail, at as speechGate, Zt as speechLabelsFor, ot as speechLangForLocale, rn as speechPlaybackReducer, Ee as splitForVendor, xt as splitTableRow, Xe as spokenSoFar, H as stopReapedAssistantSandbox, Tn as summarisePageText, jt as toCaptionText, tr as toMessageAttachment, St as toSpeakableText, nr as truncateForInline, En as truncatePagesForInline, oi as useAssistantApiAccess, hi as useAssistantAttachments, vi as useAssistantHeartbeat, Jt as useAssistantI18nNamespace, yi as useAssistantKeyboardShortcuts, Ht as useAssistantPageLabel, Ut as useAssistantProduct, Wt as useAssistantProductOrNull, lr as useAssistantSpeech, Gt as useAssistantStorageFolders, ir as useAssistantStore, Yt as useAssistantTr, si as useConversationTurns, re as useSandboxAssistantTransport, e as useVoiceInput, ur as useVoiceSession, pi as useWorkspaceWriteAccess, rr as validateFile, st as voiceAvailability, ce as voiceMarker, wt as voicePreviewText, ct as voiceQualityRank, le as voiceSessionIdOf, Ze as voiceSessionReducer, Le as voiceStageState, ft as voiceTranscriptFilename, ue as voiceTurnsOnly, lt as voicesForLocale, U as waitForAssistantServiceReady, W as waitForSandboxRunning, Re as waveformIsActive, ze as waveformIsSettled };
25
+ import { MINI_CAPTION_BUDGET as Tt, showPreviousChunk as Et } from "./shared/assistant/voice/miniCaptionBudget.js";
26
+ import { POLL_FAST_MS as Dt, POLL_FAST_UNTIL_MS as Ot, POLL_SLOW_MS as kt, POLL_STEADY_MS as At, POLL_STEADY_UNTIL_MS as jt, pollDelayMs as Mt } from "./shared/assistant/voice/assistantPollSchedule.js";
27
+ import { toCaptionText as Nt } from "./shared/assistant/voice/captionText.js";
28
+ import { ASSISTANT_LANGUAGES as Pt, DEFAULT_SPEECH_RATE as Ft, findAssistantLanguage as It, resolveAssistantLanguage as Lt } from "./shared/assistant/voice/languages.js";
29
+ import { replyFollowsInput as Rt, resolveLanguagePair as zt } from "./shared/assistant/voice/languagePair.js";
30
+ import { findPendingWrite as Bt, parseConfirmationRefusal as Vt } from "./shared/assistant/pendingWrite.js";
31
+ import { AssistantProductProvider as Ht, resolveModeConfig as Ut, useAssistantPageLabel as Wt, useAssistantProduct as Gt, useAssistantProductOrNull as Kt, useAssistantStorageFolders as qt } from "./shared/assistant/product.js";
32
+ import { AssistantI18nProvider as Jt, assistantTranslationKey as Yt, useAssistantI18nNamespace as Xt, useAssistantTr as Zt } from "./shared/assistant/i18n.js";
33
+ import { SPOKEN_LABEL_LANGUAGES as Qt, speechLabelsFor as $t } from "./shared/assistant/voice/speechLabels.js";
34
+ import { detectScriptLocale as en, resolveSpeechLocale as tn } from "./shared/assistant/voice/replyLanguage.js";
35
+ import { IDLE_PLAYBACK as nn, isSpeakingMessage as rn, requiresCancel as an, speechPlaybackReducer as on } from "./shared/assistant/voice/speechPlayback.js";
36
+ import { MAX_INLINE_IMAGE_BASE64_BYTES as sn, MAX_REQUEST_BODY_BYTES as cn } from "./shared/assistant/gatewayLimits.js";
37
+ import { BOILERPLATE_PAGE_SHARE as ln, MAX_BOILERPLATE_LINE_CHARS as un, MAX_EXTRACTED_CHARS as dn, MAX_PDF_PAGES_SCANNED as fn, MIN_PAGE_TEXT_CHARS as pn, MIN_TEXT_PAGE_SHARE as mn, columnLetterToIndex as hn, decodeXmlEntities as gn, docxXmlToText as _n, fitPdfPages as vn, formatPageRanges as yn, isMostlyImagePages as bn, joinSheets as xn, pageMarker as Sn, parseSharedStrings as Cn, parseWorkbookSheets as wn, pdfTextItemsToPage as Tn, sheetXmlToRows as En, summarisePageText as Dn, truncatePagesForInline as On } from "./shared/assistant/documentText.js";
38
+ import { ATTACHMENT_ACCEPT as kn, AttachmentRejectedError as An, INLINE_IMAGE_MAX_DIM as jn, INLINE_IMAGE_QUALITY as Mn, MAX_ATTACHMENTS as Nn, MAX_FILE_BYTES as Pn, MAX_INLINE_CHARS_PER_FILE as Fn, MAX_INLINE_CHARS_TOTAL as In, MAX_INLINE_IMAGE_BASE64_CHARS as Ln, MAX_INLINE_IMAGE_PARTS as Rn, MAX_INLINE_TURN_BODY_BYTES as zn, MAX_TURN_BODY_BYTES as Bn, PROMPT_ENVELOPE_RESERVE_BYTES as Vn, TURN_BODY_HEADROOM_BYTES as Hn, buildAttachmentPromptBlock as Un, buildPromptParts as Wn, buildPromptWithAttachments as Gn, classifyAttachment as Kn, countInlineImageCandidates as qn, countInlinedImageParts as Jn, detectDocumentFormat as Yn, estimateTurnBodyBytes as Xn, formatBytes as Zn, getAttachmentSendBlocker as Qn, getExtension as $n, getSendableAttachments as er, hasAttachmentWorkInFlight as tr, parseDataUrl as nr, toMessageAttachment as rr, truncateForInline as ir, validateFile as ar } from "./shared/assistant/attachments.js";
39
+ import { useAssistantStore as or } from "./shared/assistant/store.js";
40
+ import { isTurnInFlight as sr } from "./shared/assistant/turnState.js";
41
+ import { AssistantToolActivity as cr, parseToolActivity as lr } from "./shared/assistant/ui/AssistantToolActivity.js";
42
+ import { AssistantSpeechProvider as ur, useAssistantSpeech as dr } from "./shared/assistant/ui/AssistantSpeechProvider.js";
43
+ import { useVoiceSession as fr } from "./shared/assistant/ui/useVoiceSession.js";
44
+ import { copyToClipboard as pr } from "./shared/assistant/clipboard.js";
45
+ import { getActorId as mr, getOrganizationId as hr, getWorkspaceId as gr } from "./shared/assistant/context.js";
46
+ import { ATTACHMENT_SOURCES as _r, availableAttachmentSources as vr, deviceHasCamera as yr } from "./shared/assistant/attachmentSources.js";
47
+ import { SANDBOX_READY_TTL_MS as br, createReadinessTracker as xr, isRecentlyVerified as Sr } from "./shared/assistant/sandboxReadiness.js";
48
+ import { AssistantAutoSpeakToggle as Cr } from "./shared/assistant/ui/AssistantAutoSpeakToggle.js";
49
+ import { AssistantMarkdownImage as wr, imageHostLabel as Tr, isRemoteImageSrc as Er } from "./shared/assistant/ui/AssistantMarkdownImage.js";
50
+ import { AssistantMarkdownRenderer as Dr, assistantUrlTransform as Or } from "./shared/assistant/ui/AssistantMarkdownRenderer.js";
51
+ import { AssistantMessageAttachments as kr } from "./shared/assistant/ui/AssistantMessageAttachments.js";
52
+ import { AssistantPendingWriteCard as Ar } from "./shared/assistant/ui/AssistantPendingWriteCard.js";
53
+ import { AssistantLanguageMenu as jr } from "./shared/assistant/ui/AssistantLanguageMenu.js";
54
+ import { AssistantReplyLanguageSelector as Mr } from "./shared/assistant/ui/AssistantReplyLanguageSelector.js";
55
+ import { AssistantSpeakButton as Nr } from "./shared/assistant/ui/AssistantSpeakButton.js";
56
+ import { AssistantSpokenTurnsNotice as Pr } from "./shared/assistant/ui/AssistantSpokenTurnsNotice.js";
57
+ import { AssistantAttachmentButton as Fr } from "./shared/assistant/ui/composer/AssistantAttachmentButton.js";
58
+ import { AssistantAttachmentChips as Ir } from "./shared/assistant/ui/composer/AssistantAttachmentChips.js";
59
+ import { AssistantLanguageSelector as Lr, FOLLOW_APP_LOCALE as Rr } from "./shared/assistant/ui/composer/AssistantLanguageSelector.js";
60
+ import { ASSISTANT_MODE_META as zr, AssistantModeSelector as Br, nextModeIndex as Vr } from "./shared/assistant/ui/composer/AssistantModeSelector.js";
61
+ import { AssistantVoiceButton as Hr } from "./shared/assistant/ui/composer/AssistantVoiceButton.js";
62
+ import { AUTO_VOICE as Ur, AssistantVoiceSelector as Wr } from "./shared/assistant/ui/composer/AssistantVoiceSelector.js";
63
+ import { AssistantVoiceOrb as Gr } from "./shared/assistant/ui/voice/AssistantVoiceOrb.js";
64
+ import { AssistantVoiceSessionButton as Kr } from "./shared/assistant/ui/voice/AssistantVoiceSessionButton.js";
65
+ import { CAPTION_SCROLL_ATTR as qr, VoiceCaption as Jr } from "./shared/assistant/ui/voice/VoiceCaption.js";
66
+ import { VoiceConversationView as Yr } from "./shared/assistant/ui/voice/VoiceConversationView.js";
67
+ import { VoiceWaveform as Xr } from "./shared/assistant/ui/voice/VoiceWaveform.js";
68
+ import { VoiceMiniController as Zr } from "./shared/assistant/ui/voice/VoiceMiniController.js";
69
+ import { VoiceStage as Qr } from "./shared/assistant/ui/voice/VoiceStage.js";
70
+ import { VoiceTranscriptDrawer as $r } from "./shared/assistant/ui/voice/VoiceTranscriptDrawer.js";
71
+ import { downloadFile as ei, exportConversation as ti } from "./shared/assistant/exportConversation.js";
72
+ import { AssistantMoreMenu as ni } from "./shared/assistant/ui/AssistantMoreMenu.js";
73
+ import { AssistantHeader as ri } from "./shared/assistant/ui/AssistantHeader.js";
74
+ import { AssistantConversationList as ii } from "./shared/assistant/ui/AssistantConversationList.js";
75
+ import { AssistantEmptyState as ai } from "./shared/assistant/ui/AssistantEmptyState.js";
76
+ import { AssistantMessageItem as oi } from "./shared/assistant/ui/AssistantMessageItem.js";
77
+ import { AssistantMessageList as si } from "./shared/assistant/ui/AssistantMessageList.js";
78
+ import { AssistantVoiceSession as ci } from "./shared/assistant/ui/voice/AssistantVoiceSession.js";
79
+ import { useAssistantApiAccess as li } from "./shared/assistant/useAssistantApiAccess.js";
80
+ import { useConversationTurns as ui } from "./shared/assistant/useConversationTurns.js";
81
+ import { isMultimodalBodyRejection as di, isRecoverableAssistantError as fi } from "./shared/assistant/transportErrors.js";
82
+ import { aiCreditsUpdatedEventName as pi, dispatchAssistantQuotaExhausted as mi, notifyAiCreditsUpdated as hi } from "./shared/assistant/aiCredits.js";
83
+ import { useWorkspaceWriteAccess as gi } from "./shared/assistant/useWorkspaceWriteAccess.js";
84
+ import { extractDocumentText as _i } from "./shared/assistant/documentExtract.js";
85
+ import { useAssistantAttachments as vi } from "./shared/assistant/useAssistantAttachments.js";
86
+ import { AssistantComposer as yi } from "./shared/assistant/ui/composer/AssistantComposer.js";
87
+ import { isProdRuntime as bi } from "./shared/assistant/env.js";
88
+ import { useAssistantHeartbeat as xi } from "./shared/assistant/useAssistantHeartbeat.js";
89
+ import { useAssistantKeyboardShortcuts as Si } from "./shared/assistant/useAssistantKeyboardShortcuts.js";
90
+ import { AssistantApiCallsConsentDialog as Ci } from "./shared/assistant/ui/AssistantApiCallsConsentDialog.js";
91
+ import { AssistantChatArea as wi } from "./shared/assistant/ui/AssistantChatArea.js";
92
+ import { AIAssistantPanel as Ti } from "./shared/assistant/ui/AIAssistantPanel.js";
93
+ export { Ti as AIAssistantPanel, h as ASSISTANT_API_AUTH_STRATEGY, Pt as ASSISTANT_LANGUAGES, zr as ASSISTANT_MODE_META, kn as ATTACHMENT_ACCEPT, _r as ATTACHMENT_SOURCES, Ur as AUTO_VOICE, Ci as AssistantApiCallsConsentDialog, Fr as AssistantAttachmentButton, Ir as AssistantAttachmentChips, Cr as AssistantAutoSpeakToggle, wi as AssistantChatArea, yi as AssistantComposer, ii as AssistantConversationList, ai as AssistantEmptyState, ri as AssistantHeader, Jt as AssistantI18nProvider, jr as AssistantLanguageMenu, Lr as AssistantLanguageSelector, wr as AssistantMarkdownImage, Dr as AssistantMarkdownRenderer, kr as AssistantMessageAttachments, oi as AssistantMessageItem, si as AssistantMessageList, Br as AssistantModeSelector, ni as AssistantMoreMenu, Ar as AssistantPendingWriteCard, Ht as AssistantProductProvider, Mr as AssistantReplyLanguageSelector, G as AssistantRuntimeManager, Nr as AssistantSpeakButton, ur as AssistantSpeechProvider, Pr as AssistantSpokenTurnsNotice, cr as AssistantToolActivity, Hr as AssistantVoiceButton, Gr as AssistantVoiceOrb, Wr as AssistantVoiceSelector, ci as AssistantVoiceSession, Kr as AssistantVoiceSessionButton, An as AttachmentRejectedError, ln as BOILERPLATE_PAGE_SHARE, qr as CAPTION_SCROLL_ATTR, o as CHECK_AI_CREDITS, s as CREATE_SANDBOX, pt as DEFAULT_SPEAKABLE_LABELS, Ft as DEFAULT_SPEECH_RATE, Be as ENDPOINT_GRACE_MS, c as EXTEND_SANDBOX_TTL, Rr as FOLLOW_APP_LOCALE, l as GET_ACTIVE_SANDBOXES, u as GET_SANDBOX, ge as HOSTED_TTS_MAX_CHARS, fe as HOSTED_TTS_TIER, pe as HOSTED_VOICES, nn as IDLE_PLAYBACK, Ve as INITIAL_SESSION, jn as INLINE_IMAGE_MAX_DIM, Mn as INLINE_IMAGE_QUALITY, He as INTERRUPT_MAX_MS, Ue as INTERRUPT_MIN_MS, Nn as MAX_ATTACHMENTS, un as MAX_BOILERPLATE_LINE_CHARS, dn as MAX_EXTRACTED_CHARS, Pn as MAX_FILE_BYTES, Fn as MAX_INLINE_CHARS_PER_FILE, In as MAX_INLINE_CHARS_TOTAL, sn as MAX_INLINE_IMAGE_BASE64_BYTES, Ln as MAX_INLINE_IMAGE_BASE64_CHARS, Rn as MAX_INLINE_IMAGE_PARTS, zn as MAX_INLINE_TURN_BODY_BYTES, fn as MAX_PDF_PAGES_SCANNED, cn as MAX_REQUEST_BODY_BYTES, mt as MAX_SPEAKABLE_CHARS, ht as MAX_SPOKEN_TABLE_ROWS, Bn as MAX_TURN_BODY_BYTES, Tt as MINI_CAPTION_BUDGET, pn as MIN_PAGE_TEXT_CHARS, mn as MIN_TEXT_PAGE_SHARE, Dt as POLL_FAST_MS, Ot as POLL_FAST_UNTIL_MS, kt as POLL_SLOW_MS, At as POLL_STEADY_MS, jt as POLL_STEADY_UNTIL_MS, Ct as PREVIEW_LANGUAGES, Vn as PROMPT_ENVELOPE_RESERVE_BYTES, d as PROXY_SANDBOX_REQUEST, f as REPORT_AI_TOKEN_USAGE, br as SANDBOX_READY_TTL_MS, We as SILENCE_SUBMIT_MS, _e as SPEAKING_RATE_MAX, ve as SPEAKING_RATE_MAX_STREAMING, ye as SPEAKING_RATE_MAX_SYNC, be as SPEAKING_RATE_MIN, gt as SPEECH_CHUNK_CHARS, _t as SPEECH_CHUNK_CJK_CHARS, Qe as SPEECH_LANG, Qt as SPOKEN_LABEL_LANGUAGES, p as STOP_ASSISTANT_SANDBOX, Hn as TURN_BODY_HEADROOM_BYTES, $e as VOICE_LIST_TIMEOUT_MS, Jr as VoiceCaption, Yr as VoiceConversationView, Zr as VoiceMiniController, Qr as VoiceStage, $r as VoiceTranscriptDrawer, Xr as VoiceWaveform, m as WAIT_FOR_SANDBOX_RUNNING, pi as aiCreditsUpdatedEventName, Yt as assistantTranslationKey, Or as assistantUrlTransform, vr as availableAttachmentSources, xe as base64ToBytes, de as browserSpeechEngine, T as buildAssistantSandboxEnv, Un as buildAttachmentPromptBlock, ut as buildContinuedFromVoiceNote, K as buildProgress, Wn as buildPromptParts, E as buildPromptRequestBody, Gn as buildPromptWithAttachments, Se as buildRequest, i as buildSandboxContextInput, dt as buildVoiceTranscriptMarkdown, ie as chatTurns, D as checkAssistantAiCredits, vt as chunkForSpeech, Kn as classifyAttachment, Ce as classifyHttpFailure, t as classifyQuotaError, hn as columnLetterToIndex, ke as configureSpeechEngine, yt as containsCjk, pr as copyToClipboard, qn as countInlineImageCandidates, Jn as countInlinedImageParts, O as createAssistantSandbox, k as createAssistantSession, De as createHostedTtsEngine, xr as createReadinessTracker, Oe as createRoutingSpeechEngine, ne as createSandboxAssistantTransport, Ae as createSpeechEngines, we as decodeAudioResponse, gn as decodeXmlEntities, Yn as detectDocumentFormat, en as detectScriptLocale, yr as deviceHasCamera, mi as dispatchAssistantQuotaExhausted, _n as docxXmlToText, A as downloadAssistantArtifact, ei as downloadFile, Xn as estimateTurnBodyBytes, a as executeSandboxGraphQL, ti as exportConversation, j as extendAssistantSandboxTTL, _i as extractDocumentText, It as findAssistantLanguage, M as findExistingSandbox, Bt as findPendingWrite, vn as fitPdfPages, Zn as formatBytes, yn as formatPageRanges, mr as getActorId, N as getAssistantArtifacts, q as getAssistantMedia, P as getAssistantMessages, F as getAssistantSession, I as getAssistantStreamAccess, J as getAssistantText, Qn as getAttachmentSendBlocker, x as getCapability, $n as getExtension, g as getImageForMode, _ as getImageTagForMode, hr as getOrganizationId, Y as getRawMessageCreatedAt, v as getResourcesForMode, y as getSandboxImageRegistry, er as getSendableAttachments, je as getSpeechEngine, X as getToolProgress, gr as getWorkspaceId, ae as groupBySession, oe as groupConsecutiveBySession, tr as hasAttachmentWorkInFlight, me as hostedLocaleFor, he as hostedSupportsLanguage, Tr as imageHostLabel, Ge as isCapturing, Ke as isEcho, bn as isMostlyImagePages, di as isMultimodalBodyRejection, bi as isProdRuntime, n as isQuotaExhaustedError, Z as isReapedSandboxConnectionError, Sr as isRecentlyVerified, Q as isRecoverable, fi as isRecoverableAssistantError, Er as isRemoteImageSrc, rn as isSpeakingMessage, et as isSpeechBlocked, qe as isSubmittable, sr as isTurnInFlight, S as isUnknownFieldError, se as isVoiceTurn, xn as joinSheets, tt as languageDisplayName, $ as mapSessionToHistory, C as markSupported, w as markUnsupported, ee as mergeMessagesById, Pe as micIsInterrupt, L as modeRequiresConfirmWrites, Vr as nextModeIndex, nt as normalizeLangTag, hi as notifyAiCreditsUpdated, Je as orbMode, Sn as pageMarker, Vt as parseConfirmationRefusal, nr as parseDataUrl, Cn as parseSharedStrings, lr as parseToolActivity, wn as parseWorkbookSheets, Tn as pdfTextItemsToPage, Ye as planReplyConsumption, Mt as pollDelayMs, rt as primaryLanguageSubtag, r as quotaExhaustedEventName, Me as readSpeechEngineConfig, Rt as replyFollowsInput, R as reportAssistantAiTokenUsage, an as requiresCancel, Ne as resetSpeechEngine, Lt as resolveAssistantLanguage, zt as resolveLanguagePair, Ut as resolveModeConfig, b as resolveSandboxAssistantMode, tn as resolveSpeechLocale, te as sanitize, z as selectExistingAssistantSandbox, it as selectVoiceForLocale, B as sendAssistantPromptAsync, V as sendHeartbeat, En as sheetXmlToRows, Te as shouldDisableEngine, Et as showPreviousChunk, Fe as showsAssistantCaption, Ie as showsUserCaption, bt as speakableEmail, at as speechGate, $t as speechLabelsFor, ot as speechLangForLocale, on as speechPlaybackReducer, Ee as splitForVendor, xt as splitTableRow, Xe as spokenSoFar, H as stopReapedAssistantSandbox, Dn as summarisePageText, Nt as toCaptionText, rr as toMessageAttachment, St as toSpeakableText, ir as truncateForInline, On as truncatePagesForInline, li as useAssistantApiAccess, vi as useAssistantAttachments, xi as useAssistantHeartbeat, Xt as useAssistantI18nNamespace, Si as useAssistantKeyboardShortcuts, Wt as useAssistantPageLabel, Gt as useAssistantProduct, Kt as useAssistantProductOrNull, dr as useAssistantSpeech, qt as useAssistantStorageFolders, or as useAssistantStore, Zt as useAssistantTr, ui as useConversationTurns, re as useSandboxAssistantTransport, e as useVoiceInput, fr as useVoiceSession, gi as useWorkspaceWriteAccess, ar as validateFile, st as voiceAvailability, ce as voiceMarker, wt as voicePreviewText, ct as voiceQualityRank, le as voiceSessionIdOf, Ze as voiceSessionReducer, Le as voiceStageState, ft as voiceTranscriptFilename, ue as voiceTurnsOnly, lt as voicesForLocale, U as waitForAssistantServiceReady, W as waitForSandboxRunning, Re as waveformIsActive, ze as waveformIsSettled };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/fe-libs",
3
- "version": "2026.906.2",
3
+ "version": "2026.906.4",
4
4
  "description": "Burdenoff frontend primitives and domain libraries",
5
5
  "type": "module",
6
6
  "bin": {