@burdenoff/fe-libs 2026.906.1 → 2026.906.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantVoiceSession.d.ts","sourceRoot":"","sources":["../../../../../src/shared/assistant/ui/voice/AssistantVoiceSession.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4C,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAI1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAO7D,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,gFAAgF;AAChF,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAElD,UAAU,KAAK;IACb,OAAO,EAAE,oBAAoB,CAAC;IAC9B,iEAAiE;IACjE,KAAK,CAAC,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;IAC3C,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACnC,gEAAgE;IAChE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACpC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC;IACjD,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,iBAAiB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,0EAA0E;IAC1E,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,4DAA4D;IAC5D,YAAY,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC1D,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,mFAAmF;IACnF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,qBAAqB,EAAE,EAAE,CAAC,KAAK,CAoiB3C,CAAC"}
1
+ {"version":3,"file":"AssistantVoiceSession.d.ts","sourceRoot":"","sources":["../../../../../src/shared/assistant/ui/voice/AssistantVoiceSession.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4C,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAI1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAO7D,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,gFAAgF;AAChF,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAElD,UAAU,KAAK;IACb,OAAO,EAAE,oBAAoB,CAAC;IAC9B,iEAAiE;IACjE,KAAK,CAAC,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;IAC3C,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACnC,gEAAgE;IAChE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACpC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC;IACjD,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,iBAAiB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,0EAA0E;IAC1E,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,4DAA4D;IAC5D,YAAY,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC1D,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,mFAAmF;IACnF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,qBAAqB,EAAE,EAAE,CAAC,KAAK,CAuiB3C,CAAC"}
@@ -5,35 +5,35 @@ import { AssistantAttachmentButton as i } from "../composer/AssistantAttachmentB
5
5
  import { AssistantAttachmentChips as ee } from "../composer/AssistantAttachmentChips.js";
6
6
  import { AssistantVoiceOrb as a } from "./AssistantVoiceOrb.js";
7
7
  import { VoiceMiniController as te } from "./VoiceMiniController.js";
8
- import { VoiceStage as o } from "./VoiceStage.js";
9
- import { VoiceTranscriptDrawer as s } from "./VoiceTranscriptDrawer.js";
10
- import { useCallback as ne, useEffect as c, useRef as l, useState as u } from "react";
11
- import { Maximize2 as d, Minimize2 as f, ScrollText as p, X as m } from "lucide-react";
12
- import { jsx as h, jsxs as g } from "react/jsx-runtime";
8
+ import { VoiceStage as ne } from "./VoiceStage.js";
9
+ import { VoiceTranscriptDrawer as o } from "./VoiceTranscriptDrawer.js";
10
+ import { useCallback as re, useEffect as s, useRef as c, useState as l } from "react";
11
+ import { Maximize2 as u, Minimize2 as d, ScrollText as f, X as p } from "lucide-react";
12
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
13
13
  //#region src/shared/assistant/ui/voice/AssistantVoiceSession.tsx
14
- var _ = ({ session: _, turns: b = [], onSaveTranscript: x, onContinueInChat: S, notice: C = null, spoken: w, onInterrupt: T, onToggleMute: E, attachments: D = [], onAttachFiles: O, onRemoveAttachment: re, onRetryAttachment: k, canAttachMore: ie = !0, preparingAttachments: A = 0, spokenChunks: ae = null, onEnd: j, capturing: M = !0, interrupting: N = !1, awaitingEndpoint: P = !1 }) => {
15
- let F = r(), { muted: I, error: L } = _, R = l(null), z = l(null), [B, V] = u("mini"), H = B === "full", U = B === "mini", W = B === "mini" ? "panel" : B === "panel" ? "full" : "mini", [G, K] = u(!1), q = l(!1), J = l(E);
16
- J.current = E;
17
- let oe = ne(() => {
18
- I || q.current || n(_) || (q.current = !0, J.current());
19
- }, [I, _]);
20
- c(() => {
14
+ var g = ({ session: g, turns: y = [], onSaveTranscript: b, onContinueInChat: x, notice: S = null, spoken: C, onInterrupt: w, onToggleMute: T, attachments: E = [], onAttachFiles: D, onRemoveAttachment: O, onRetryAttachment: k, canAttachMore: ie = !0, preparingAttachments: A = 0, spokenChunks: j = null, onEnd: M, capturing: ae = !0, interrupting: N = !1, awaitingEndpoint: P = !1 }) => {
15
+ let F = r(), { muted: I, error: L } = g, R = c(null), z = c(null), [B, V] = l("mini"), H = B === "full", U = B === "mini", W = B === "mini" ? "panel" : B === "panel" ? "full" : "mini", [G, K] = l(!1), q = c(!1), J = c(T);
16
+ J.current = T;
17
+ let oe = re(() => {
18
+ I || q.current || n(g) || (q.current = !0, J.current());
19
+ }, [I, g]);
20
+ s(() => {
21
21
  let e = () => {
22
22
  q.current && (q.current = !1, J.current());
23
23
  };
24
24
  return window.addEventListener("focus", e), () => {
25
25
  window.removeEventListener("focus", e), q.current = !1;
26
26
  };
27
- }, []), c(() => {
27
+ }, []), s(() => {
28
28
  R.current?.focus();
29
- }, []), c(() => {
29
+ }, []), s(() => {
30
30
  let e = (e) => {
31
31
  if (e.key === "Escape") {
32
32
  if (G) {
33
33
  K(!1);
34
34
  return;
35
35
  }
36
- j();
36
+ M();
37
37
  return;
38
38
  }
39
39
  if (e.key !== "Tab" || !H) return;
@@ -44,13 +44,13 @@ var _ = ({ session: _, turns: b = [], onSaveTranscript: x, onContinueInChat: S,
44
44
  };
45
45
  return window.addEventListener("keydown", e), () => window.removeEventListener("keydown", e);
46
46
  }, [
47
- j,
47
+ M,
48
48
  H,
49
49
  G
50
50
  ]);
51
- let Y = C !== null && L === null, X = n(_), Z = t({
52
- snapshot: _,
53
- capturing: M,
51
+ let Y = S !== null && L === null, X = n(g), Z = t({
52
+ snapshot: g,
53
+ capturing: ae,
54
54
  interrupting: N,
55
55
  awaitingEndpoint: P
56
56
  }), Q = (() => {
@@ -66,7 +66,7 @@ var _ = ({ session: _, turns: b = [], onSaveTranscript: x, onContinueInChat: S,
66
66
  default: return Z;
67
67
  }
68
68
  })(), $ = I && Z !== "listening" && Q !== "" ? `${Q} · ${F("voiceSession.muted", "Microphone off")}` : Q;
69
- return /* @__PURE__ */ g("div", {
69
+ return /* @__PURE__ */ h("div", {
70
70
  ref: z,
71
71
  className: `flex flex-col items-center justify-between bg-bg-sunken ${B === "full" ? "fixed inset-x-0 bottom-0 top-14 z-[60] px-6 py-8" : B === "panel" ? "absolute inset-0 z-20 px-4 py-6" : "absolute inset-x-0 bottom-0 z-20 h-[11.25rem] border-t border-border-subtle px-3 py-3 shadow-lg"}`,
72
72
  role: "dialog",
@@ -74,102 +74,103 @@ var _ = ({ session: _, turns: b = [], onSaveTranscript: x, onContinueInChat: S,
74
74
  "aria-label": F("voiceSession.title", "Voice conversation"),
75
75
  "data-testid": "assistant-voice-session",
76
76
  children: [
77
- /* @__PURE__ */ g("button", {
77
+ /* @__PURE__ */ h("button", {
78
78
  ref: R,
79
79
  type: "button",
80
- onClick: j,
80
+ onClick: M,
81
81
  className: `absolute ${H ? "right-6 top-6 h-14 gap-2 px-5 text-base" : U ? "right-2 top-2 size-8" : "right-3 top-3 h-11 gap-2 px-4 text-sm"} flex items-center justify-center rounded-full border border-border-default bg-bg-elevated text-text-secondary hover:bg-bg-sunken transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong`,
82
82
  "aria-label": U ? F("voiceSession.end", "End the voice conversation") : void 0,
83
83
  "data-testid": "assistant-voice-end",
84
- children: [/* @__PURE__ */ h(m, {
84
+ children: [/* @__PURE__ */ m(p, {
85
85
  className: H ? "size-6" : U ? "size-4" : "size-5",
86
86
  "aria-hidden": "true"
87
- }), U ? null : /* @__PURE__ */ h("span", {
87
+ }), U ? null : /* @__PURE__ */ m("span", {
88
88
  className: "max-w-[7rem] truncate whitespace-nowrap font-medium",
89
89
  children: F("voiceSession.endShort", "End")
90
90
  })]
91
91
  }),
92
- /* @__PURE__ */ h("div", {
92
+ /* @__PURE__ */ m("div", {
93
93
  className: `flex flex-col items-center ${U ? "px-3" : `min-h-[1.5rem] ${Y ? H ? "pt-14" : "pt-10" : ""}`}`,
94
- children: Y ? /* @__PURE__ */ h("p", {
94
+ children: Y ? /* @__PURE__ */ m("p", {
95
95
  className: "max-w-xs text-center text-xs text-status-warning",
96
96
  "data-testid": "assistant-voice-notice",
97
- children: v(C, F)
97
+ children: _(S, F)
98
98
  }) : null
99
99
  }),
100
100
  (() => {
101
- let t = /* @__PURE__ */ h(a, {
102
- session: _,
101
+ let t = /* @__PURE__ */ m(a, {
102
+ session: g,
103
103
  compact: U,
104
104
  connecting: Z === "connecting",
105
- onPress: e(Z) ? T : E,
105
+ onPress: e(Z) ? w : T,
106
106
  label: e(Z) ? F("voiceSession.interrupt", "Stop the assistant and speak") : I ? F("voiceSession.unmute", "Turn the microphone on") : F("voiceSession.mute", "Turn the microphone off")
107
- }), n = e(Z) ? w : X || null, r = L === null ? null : y(L, F);
108
- return U ? /* @__PURE__ */ h(te, {
107
+ }), n = e(Z) ? C : X || null, r = L === null ? null : v(L, F);
108
+ return U ? /* @__PURE__ */ m(te, {
109
+ spokenChunks: j,
109
110
  state: Z,
110
111
  caption: n,
111
112
  statusText: $,
112
113
  errorText: r,
113
114
  control: t
114
- }) : /* @__PURE__ */ h(o, {
115
+ }) : /* @__PURE__ */ m(ne, {
115
116
  state: Z,
116
117
  userCaption: X || null,
117
- spokenChunks: ae,
118
- assistantCaption: w,
118
+ spokenChunks: j,
119
+ assistantCaption: C,
119
120
  expanded: H,
120
121
  statusText: $,
121
122
  errorText: r,
122
123
  control: t
123
124
  });
124
125
  })(),
125
- G ? /* @__PURE__ */ h(s, {
126
- turns: b,
126
+ G ? /* @__PURE__ */ m(o, {
127
+ turns: y,
127
128
  onClose: () => K(!1),
128
- onSave: x,
129
- onContinueInChat: S
129
+ onSave: b,
130
+ onContinueInChat: x
130
131
  }) : null,
131
- O ? /* @__PURE__ */ h("div", {
132
+ D ? /* @__PURE__ */ m("div", {
132
133
  className: `absolute ${H ? "left-6 top-6" : U ? "left-11 top-2" : "left-3 top-3"}`,
133
- children: /* @__PURE__ */ h(i, {
134
+ children: /* @__PURE__ */ m(i, {
134
135
  onFiles: (e) => {
135
- O(e), V((e) => e === "mini" ? "panel" : e);
136
+ D(e), V((e) => e === "mini" ? "panel" : e);
136
137
  },
137
138
  onPickerOpen: oe,
138
139
  direction: "down",
139
140
  canAddMore: ie
140
141
  })
141
142
  }) : null,
142
- (D.length > 0 || A > 0) && !U ? /* @__PURE__ */ h("div", {
143
+ (E.length > 0 || A > 0) && !U ? /* @__PURE__ */ m("div", {
143
144
  className: `absolute ${H ? "bottom-24 left-24 right-24" : "bottom-16 left-16 right-16"}`,
144
145
  "data-testid": "assistant-voice-attachments",
145
- children: /* @__PURE__ */ h(ee, {
146
- attachments: D,
147
- onRemove: re ?? (() => void 0),
146
+ children: /* @__PURE__ */ m(ee, {
147
+ attachments: E,
148
+ onRemove: O ?? (() => void 0),
148
149
  onRetry: k ?? (() => void 0),
149
150
  preparingCount: A
150
151
  })
151
152
  }) : null,
152
- /* @__PURE__ */ h("button", {
153
+ /* @__PURE__ */ m("button", {
153
154
  type: "button",
154
155
  onClick: () => K((e) => !e),
155
156
  className: `absolute ${H ? "bottom-6 right-6 size-14" : U ? "right-11 top-2 size-8" : "bottom-3 right-3 size-11"} flex items-center justify-center rounded-full bg-bg-elevated text-text-secondary transition-colors hover:bg-bg-raised hover:text-text-primary focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong`,
156
157
  "aria-pressed": G,
157
158
  "aria-label": F("voiceSession.transcript", "Voice transcript"),
158
159
  "data-testid": "assistant-voice-transcript-toggle",
159
- children: /* @__PURE__ */ h(p, { className: H ? "size-6" : U ? "size-4" : "size-5" })
160
+ children: /* @__PURE__ */ m(f, { className: H ? "size-6" : U ? "size-4" : "size-5" })
160
161
  }),
161
- /* @__PURE__ */ h("button", {
162
+ /* @__PURE__ */ m("button", {
162
163
  type: "button",
163
164
  onClick: () => V(W),
164
165
  className: `absolute ${H ? "bottom-6 left-6 size-14" : U ? "left-2 top-2 size-8" : "bottom-3 left-3 size-11"} flex items-center justify-center rounded-full bg-bg-elevated text-text-secondary transition-colors hover:bg-bg-raised hover:text-text-primary focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong`,
165
166
  "aria-label": W === "panel" ? F("voiceSession.expandPanel", "Show the conversation in the panel") : W === "full" ? F("voiceSession.expand", "Expand the conversation to full screen") : F("voiceSession.collapse", "Shrink to the compact controller"),
166
167
  "data-testid": "assistant-voice-expand",
167
- children: H ? /* @__PURE__ */ h(f, { className: "size-5" }) : /* @__PURE__ */ h(d, { className: U ? "size-4" : "size-5" })
168
+ children: H ? /* @__PURE__ */ m(d, { className: "size-5" }) : /* @__PURE__ */ m(u, { className: U ? "size-4" : "size-5" })
168
169
  })
169
170
  ]
170
171
  });
171
172
  };
172
- function v(e, t) {
173
+ function _(e, t) {
173
174
  switch (e) {
174
175
  case "network": return t("voiceSession.noticeNetwork", "Speech recognition lost its connection. Check your network — it will retry.");
175
176
  case "not-capturing": return t("voiceSession.noticeNotCapturing", "The microphone did not start. Check that this site is allowed to use it, then try again.");
@@ -178,7 +179,7 @@ function v(e, t) {
178
179
  default: return e;
179
180
  }
180
181
  }
181
- function y(e, t) {
182
+ function v(e, t) {
182
183
  switch (e) {
183
184
  case "mic-denied": return t("voiceSession.micDenied", "Microphone access is blocked. Allow it in your browser settings to talk.");
184
185
  case "no-speech-support": return t("voiceSession.noSpeechSupport", "This browser cannot listen. Try a different browser, or type instead.");
@@ -187,4 +188,4 @@ function y(e, t) {
187
188
  }
188
189
  }
189
190
  //#endregion
190
- export { _ as AssistantVoiceSession };
191
+ export { g as AssistantVoiceSession };
@@ -22,6 +22,20 @@ interface Props {
22
22
  state: VoiceStageState;
23
23
  /** Live user transcript, or the assistant's caption while speaking. */
24
24
  caption: string | null;
25
+ /**
26
+ * Per-sentence progress through the spoken reply, when the engine reports it.
27
+ *
28
+ * ★★ Without this the docked strip showed the whole reply as one static
29
+ * block: four acceptance criteria — caption/audio sync, current-sentence
30
+ * emphasis, previous-sentence dimming, and not showing text ahead of the
31
+ * audio — were implemented in `VoiceCaption` and simply unreachable here,
32
+ * because the stage that renders it is only mounted when NOT docked. Docked
33
+ * is the view every session opens in.
34
+ */
35
+ spokenChunks?: {
36
+ chunks: string[];
37
+ index: number;
38
+ } | null;
25
39
  statusText: string;
26
40
  /** Mic / interrupt control — the same orb, in its compact size. */
27
41
  control: ReactNode;
@@ -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,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,CA2EzC,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;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,47 +1,54 @@
1
1
  import { showsAssistantCaption as e, waveformIsActive as t, waveformIsSettled as n } from "../../voice/voiceStageState.js";
2
2
  import { VoiceWaveform as r } from "./VoiceWaveform.js";
3
- import { jsx as i, jsxs as a } from "react/jsx-runtime";
3
+ import { Fragment as i, jsx as a, jsxs as o } from "react/jsx-runtime";
4
4
  //#region src/shared/assistant/ui/voice/VoiceMiniController.tsx
5
- var o = ({ state: o, caption: s, statusText: c, control: l, errorText: u = null }) => {
6
- let d = e(o);
7
- return /* @__PURE__ */ a("div", {
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", {
8
8
  className: "flex min-h-0 w-full flex-1 items-center gap-3 px-4",
9
9
  "data-testid": "assistant-voice-mini",
10
- "data-state": o,
11
- children: [/* @__PURE__ */ a("div", {
10
+ "data-state": s,
11
+ children: [/* @__PURE__ */ o("div", {
12
12
  className: "flex min-w-0 flex-1 flex-col gap-1.5",
13
- children: [/* @__PURE__ */ a("div", {
13
+ children: [/* @__PURE__ */ o("div", {
14
14
  className: "flex items-center gap-2",
15
- children: [/* @__PURE__ */ i(r, {
16
- active: t(o),
17
- settled: n(o),
18
- tone: o === "speaking" ? "speaking" : "listening"
19
- }), /* @__PURE__ */ i("p", {
15
+ children: [/* @__PURE__ */ a(r, {
16
+ active: t(s),
17
+ settled: n(s),
18
+ tone: s === "speaking" ? "speaking" : "listening"
19
+ }), /* @__PURE__ */ a("p", {
20
20
  className: "truncate text-xs text-text-muted",
21
21
  "aria-live": "polite",
22
22
  "data-testid": "assistant-voice-status",
23
- children: c
23
+ children: u
24
24
  })]
25
- }), o === "mic-error" ? /* @__PURE__ */ i("p", {
25
+ }), s === "mic-error" ? /* @__PURE__ */ a("p", {
26
26
  className: "line-clamp-2 text-xs text-status-warning",
27
27
  role: "alert",
28
28
  "data-testid": "assistant-voice-mini-error",
29
- children: u
30
- }) : s ? /* @__PURE__ */ i("p", {
31
- className: ["line-clamp-3 break-words text-left text-sm leading-snug", d ? "font-semibold text-text-primary" : "font-medium text-text-secondary"].join(" "),
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(" "),
32
32
  role: "status",
33
33
  "aria-live": "polite",
34
34
  "data-testid": "assistant-voice-caption",
35
- children: s
36
- }) : /* @__PURE__ */ i("div", {
35
+ children: m ? /* @__PURE__ */ o(i, { children: [m.index > 0 ? /* @__PURE__ */ o("span", {
36
+ className: "text-text-muted transition-colors duration-300",
37
+ children: [m.chunks[m.index - 1], " "]
38
+ }) : null, /* @__PURE__ */ a("span", {
39
+ className: "text-text-primary",
40
+ "data-testid": "assistant-voice-caption-current",
41
+ children: m.chunks[m.index]
42
+ })] }) : c
43
+ }) : /* @__PURE__ */ a("div", {
37
44
  className: "h-9",
38
45
  "aria-hidden": "true"
39
46
  })]
40
- }), /* @__PURE__ */ i("div", {
47
+ }), /* @__PURE__ */ a("div", {
41
48
  className: "shrink-0",
42
- children: l
49
+ children: d
43
50
  })]
44
51
  });
45
52
  };
46
53
  //#endregion
47
- export { o as VoiceMiniController };
54
+ export { s as VoiceMiniController };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/fe-libs",
3
- "version": "2026.906.1",
3
+ "version": "2026.906.2",
4
4
  "description": "Burdenoff frontend primitives and domain libraries",
5
5
  "type": "module",
6
6
  "bin": {