@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.
- package/dist/shared/assistant/conversation.d.ts +12 -0
- package/dist/shared/assistant/conversation.d.ts.map +1 -1
- package/dist/shared/assistant/index.d.ts +1 -0
- package/dist/shared/assistant/index.d.ts.map +1 -1
- package/dist/shared/assistant/ui/AssistantChatArea.d.ts.map +1 -1
- package/dist/shared/assistant/ui/AssistantChatArea.js +154 -142
- package/dist/shared/assistant/ui/AssistantSpeechProvider.d.ts.map +1 -1
- package/dist/shared/assistant/ui/AssistantSpeechProvider.js +100 -88
- package/dist/shared/assistant/ui/useVoiceSession.d.ts.map +1 -1
- package/dist/shared/assistant/ui/useVoiceSession.js +1 -1
- package/dist/shared/assistant/ui/voice/AssistantVoiceSession.d.ts.map +1 -1
- package/dist/shared/assistant/ui/voice/AssistantVoiceSession.js +56 -56
- package/dist/shared/assistant/ui/voice/VoiceCaption.d.ts +6 -0
- package/dist/shared/assistant/ui/voice/VoiceCaption.d.ts.map +1 -1
- package/dist/shared/assistant/ui/voice/VoiceCaption.js +23 -14
- package/dist/shared/assistant/ui/voice/VoiceMiniController.d.ts.map +1 -1
- package/dist/shared/assistant/ui/voice/VoiceMiniController.js +28 -27
- package/dist/shared/assistant/ui/voice/VoiceStage.d.ts.map +1 -1
- package/dist/shared/assistant/ui/voice/VoiceStage.js +1 -0
- package/dist/shared/assistant/ui/voice/VoiceTranscriptDrawer.d.ts +18 -4
- package/dist/shared/assistant/ui/voice/VoiceTranscriptDrawer.d.ts.map +1 -1
- package/dist/shared/assistant/ui/voice/VoiceTranscriptDrawer.js +36 -26
- package/dist/shared/assistant/voice/miniCaptionBudget.d.ts +46 -0
- package/dist/shared/assistant/voice/miniCaptionBudget.d.ts.map +1 -0
- package/dist/shared/assistant/voice/miniCaptionBudget.js +15 -0
- package/dist/shared-assistant.js +69 -68
- package/package.json +1 -1
|
@@ -1,25 +1,34 @@
|
|
|
1
|
-
import {
|
|
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
|
|
4
|
-
let
|
|
5
|
-
return
|
|
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__ */
|
|
15
|
+
children: /* @__PURE__ */ n("p", {
|
|
8
16
|
className: [
|
|
9
17
|
"w-full whitespace-pre-wrap break-words text-left",
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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":
|
|
17
|
-
children:
|
|
18
|
-
className:
|
|
19
|
-
|
|
20
|
-
|
|
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 {
|
|
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;
|
|
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 {
|
|
3
|
-
import {
|
|
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
|
|
6
|
-
let
|
|
7
|
-
return /* @__PURE__ */
|
|
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":
|
|
11
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
14
|
+
children: [/* @__PURE__ */ s("div", {
|
|
14
15
|
className: "flex items-center gap-2",
|
|
15
|
-
children: [/* @__PURE__ */
|
|
16
|
-
active: t(
|
|
17
|
-
settled: n(
|
|
18
|
-
tone:
|
|
19
|
-
}), /* @__PURE__ */
|
|
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:
|
|
24
|
+
children: d
|
|
24
25
|
})]
|
|
25
|
-
}),
|
|
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:
|
|
30
|
-
}) :
|
|
31
|
-
className: ["line-clamp-3 break-words text-left text-sm leading-snug",
|
|
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:
|
|
36
|
+
children: h ? /* @__PURE__ */ s(a, { children: [r(h) ? /* @__PURE__ */ s("span", {
|
|
36
37
|
className: "text-text-muted transition-colors duration-300",
|
|
37
|
-
children: [
|
|
38
|
-
}) : null, /* @__PURE__ */
|
|
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:
|
|
42
|
-
})] }) :
|
|
43
|
-
}) : /* @__PURE__ */
|
|
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__ */
|
|
48
|
+
}), /* @__PURE__ */ o("div", {
|
|
48
49
|
className: "shrink-0",
|
|
49
|
-
children:
|
|
50
|
+
children: f
|
|
50
51
|
})]
|
|
51
52
|
});
|
|
52
53
|
};
|
|
53
54
|
//#endregion
|
|
54
|
-
export {
|
|
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,
|
|
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
|
-
*
|
|
31
|
-
* the user is
|
|
32
|
-
*
|
|
33
|
-
*
|
|
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,
|
|
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 {
|
|
4
|
-
import {
|
|
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
|
|
7
|
-
let
|
|
8
|
-
return
|
|
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":
|
|
21
|
+
"aria-label": m("voiceSession.transcriptTitle", "Voice transcript"),
|
|
12
22
|
"data-testid": "assistant-voice-transcript",
|
|
13
23
|
children: [
|
|
14
|
-
/* @__PURE__ */
|
|
24
|
+
/* @__PURE__ */ c("div", {
|
|
15
25
|
className: "flex items-center justify-between border-b border-border-subtle px-4 py-3",
|
|
16
|
-
children: [/* @__PURE__ */
|
|
26
|
+
children: [/* @__PURE__ */ c("div", {
|
|
17
27
|
className: "min-w-0",
|
|
18
|
-
children: [/* @__PURE__ */
|
|
28
|
+
children: [/* @__PURE__ */ s("h2", {
|
|
19
29
|
className: "text-sm font-semibold text-text-primary",
|
|
20
|
-
children:
|
|
21
|
-
}), /* @__PURE__ */
|
|
30
|
+
children: m("voiceSession.transcript", "Voice conversation")
|
|
31
|
+
}), /* @__PURE__ */ s("p", {
|
|
22
32
|
className: "truncate text-xs text-text-muted",
|
|
23
|
-
children:
|
|
33
|
+
children: m("voiceSession.transcriptHint", "Spoken turns in this conversation — kept out of your typed chat.")
|
|
24
34
|
})]
|
|
25
|
-
}), /* @__PURE__ */
|
|
35
|
+
}), /* @__PURE__ */ s("button", {
|
|
26
36
|
type: "button",
|
|
27
|
-
onClick:
|
|
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":
|
|
39
|
+
"aria-label": m("voiceSession.transcriptClose", "Close the transcript"),
|
|
30
40
|
"data-testid": "assistant-voice-transcript-close",
|
|
31
|
-
children: /* @__PURE__ */
|
|
41
|
+
children: /* @__PURE__ */ s(o, { className: "size-4" })
|
|
32
42
|
})]
|
|
33
43
|
}),
|
|
34
|
-
/* @__PURE__ */
|
|
35
|
-
(
|
|
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: [
|
|
47
|
+
children: [d ? /* @__PURE__ */ c("button", {
|
|
38
48
|
type: "button",
|
|
39
|
-
onClick:
|
|
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
|
|
52
|
+
children: [/* @__PURE__ */ s(a, {
|
|
43
53
|
className: "size-3.5",
|
|
44
54
|
"aria-hidden": "true"
|
|
45
|
-
}),
|
|
46
|
-
}) : null,
|
|
55
|
+
}), m("voiceSession.save", "Save transcript")]
|
|
56
|
+
}) : null, f ? /* @__PURE__ */ c("button", {
|
|
47
57
|
type: "button",
|
|
48
|
-
onClick:
|
|
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: [
|
|
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 {
|
|
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 };
|
package/dist/shared-assistant.js
CHANGED
|
@@ -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 {
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
33
|
-
import {
|
|
34
|
-
import {
|
|
35
|
-
import {
|
|
36
|
-
import {
|
|
37
|
-
import {
|
|
38
|
-
import {
|
|
39
|
-
import {
|
|
40
|
-
import {
|
|
41
|
-
import {
|
|
42
|
-
import {
|
|
43
|
-
import {
|
|
44
|
-
import {
|
|
45
|
-
import {
|
|
46
|
-
import {
|
|
47
|
-
import {
|
|
48
|
-
import {
|
|
49
|
-
import {
|
|
50
|
-
import {
|
|
51
|
-
import {
|
|
52
|
-
import {
|
|
53
|
-
import {
|
|
54
|
-
import {
|
|
55
|
-
import {
|
|
56
|
-
import {
|
|
57
|
-
import {
|
|
58
|
-
import {
|
|
59
|
-
import {
|
|
60
|
-
import {
|
|
61
|
-
import {
|
|
62
|
-
import {
|
|
63
|
-
import {
|
|
64
|
-
import {
|
|
65
|
-
import {
|
|
66
|
-
import {
|
|
67
|
-
import {
|
|
68
|
-
import {
|
|
69
|
-
import {
|
|
70
|
-
import {
|
|
71
|
-
import {
|
|
72
|
-
import {
|
|
73
|
-
import {
|
|
74
|
-
import {
|
|
75
|
-
import {
|
|
76
|
-
import {
|
|
77
|
-
import {
|
|
78
|
-
import {
|
|
79
|
-
import {
|
|
80
|
-
import {
|
|
81
|
-
import {
|
|
82
|
-
import {
|
|
83
|
-
import {
|
|
84
|
-
import {
|
|
85
|
-
import {
|
|
86
|
-
import {
|
|
87
|
-
import {
|
|
88
|
-
import {
|
|
89
|
-
import {
|
|
90
|
-
import {
|
|
91
|
-
import {
|
|
92
|
-
|
|
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 };
|