@burdenoff/fe-libs 2026.1024.3 → 2026.1026.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/shared/assistant/avatar/live/LiveAvatarMinutes.d.ts +24 -0
  2. package/dist/shared/assistant/avatar/live/LiveAvatarMinutes.js +161 -0
  3. package/dist/shared/assistant/avatar/live/LiveAvatarStage.js +95 -74
  4. package/dist/shared/assistant/avatar/live/LiveAvatarTabView.d.ts +6 -0
  5. package/dist/shared/assistant/avatar/live/LiveAvatarTabView.js +195 -172
  6. package/dist/shared/assistant/avatar/live/avatarPorts.d.ts +9 -0
  7. package/dist/shared/assistant/avatar/live/avatarSessionClient.d.ts +77 -1
  8. package/dist/shared/assistant/avatar/live/avatarSessionClient.js +193 -72
  9. package/dist/shared/assistant/avatar/live/avatarTransport.d.ts +25 -3
  10. package/dist/shared/assistant/avatar/live/avatarTransport.js +29 -2
  11. package/dist/shared/assistant/avatar/live/createLiveAvatarSeam.d.ts +35 -4
  12. package/dist/shared/assistant/avatar/live/createLiveAvatarSeam.js +136 -79
  13. package/dist/shared/assistant/avatar/live/liveAvatarController.d.ts +79 -3
  14. package/dist/shared/assistant/avatar/live/liveAvatarController.js +424 -245
  15. package/dist/shared/assistant/avatar/live/liveAvatarMinutesView.d.ts +127 -0
  16. package/dist/shared/assistant/avatar/live/liveAvatarMinutesView.js +168 -0
  17. package/dist/shared/assistant/avatar/live/liveAvatarStatus.d.ts +3 -0
  18. package/dist/shared/assistant/avatar/live/liveAvatarStatus.js +11 -7
  19. package/dist/shared/assistant/avatar/live/liveKitAvatarRoom.js +6 -1
  20. package/dist/shared/assistant/avatar/useAvatarCopy.d.ts +127 -2
  21. package/dist/shared/assistant/avatar/useAvatarCopy.js +116 -7
  22. package/dist/shared/assistant/i18nManifest.d.ts +32 -1
  23. package/dist/shared/assistant/i18nManifest.js +55 -24
  24. package/dist/shared/assistant/index.d.ts +2 -0
  25. package/dist/shared/assistant/ui/AssistantChatArea.js +17 -17
  26. package/dist/shared/assistant/ui/AssistantMarkdownRenderer.d.ts +5 -2
  27. package/dist/shared/assistant/ui/assistantLiveAvatarSeam.d.ts +11 -3
  28. package/dist/shared/assistant/ui/avatar/AssistantAvatarTab.js +78 -76
  29. package/dist/shared/assistant/ui/avatar/avatarAskGate.d.ts +2 -0
  30. package/dist/shared/assistant/ui/avatar/avatarAskGate.js +1 -0
  31. package/dist/shared/events/index.d.ts +2 -1
  32. package/dist/shared-assistant.js +227 -225
  33. package/package.json +1 -1
@@ -1,117 +1,119 @@
1
- import { clearReplyRequests as e } from "../../speech/replySpeechRequests.js";
2
- import { useAvatarCopy as t } from "../../avatar/useAvatarCopy.js";
3
- import { ASSISTANT_VOICE_SESSION_ATTR as n } from "../panelOverlays.js";
4
- import { useLiveAvatarHandsFreeGuard as r } from "../assistantLiveAvatarSeam.js";
5
- import { avatarAskBlockerLasts as i } from "./avatarAskGate.js";
6
- import { AvatarTabAskBox as a } from "./AvatarTabAskBox.js";
7
- import { AvatarTabLastExchange as o } from "./AvatarTabLastExchange.js";
8
- import { useAvatarTabExchange as s } from "./avatarTabExchange.js";
9
- import { useEffect as c, useLayoutEffect as l, useRef as u, useState as d } from "react";
10
- import { jsx as f, jsxs as p } from "react/jsx-runtime";
1
+ import { useAssistantNavigate as e } from "../AssistantMarkdownRenderer.js";
2
+ import { clearReplyRequests as t } from "../../speech/replySpeechRequests.js";
3
+ import { useAvatarCopy as n } from "../../avatar/useAvatarCopy.js";
4
+ import { ASSISTANT_VOICE_SESSION_ATTR as r } from "../panelOverlays.js";
5
+ import { useLiveAvatarHandsFreeGuard as i } from "../assistantLiveAvatarSeam.js";
6
+ import { avatarAskBlockerLasts as a } from "./avatarAskGate.js";
7
+ import { AvatarTabAskBox as o } from "./AvatarTabAskBox.js";
8
+ import { AvatarTabLastExchange as s } from "./AvatarTabLastExchange.js";
9
+ import { useAvatarTabExchange as c } from "./avatarTabExchange.js";
10
+ import { useEffect as l, useLayoutEffect as u, useRef as d, useState as f } from "react";
11
+ import { jsx as p, jsxs as m } from "react/jsx-runtime";
11
12
  //#region src/shared/assistant/ui/avatar/AssistantAvatarTab.tsx
12
- var m = 180;
13
- function h(e, t) {
14
- let [r, i] = d(0);
15
- return l(() => {
13
+ var h = 180;
14
+ function g(e, t) {
15
+ let [n, i] = f(0);
16
+ return u(() => {
16
17
  if (!t) return;
17
- let r = e.current?.parentElement?.querySelector(`[${n}]`);
18
- if (!r) return;
18
+ let n = e.current?.parentElement?.querySelector(`[${r}]`);
19
+ if (!n) return;
19
20
  let a = () => {
20
- let e = typeof r.getBoundingClientRect == "function" ? r.getBoundingClientRect().height : 0;
21
+ let e = typeof n.getBoundingClientRect == "function" ? n.getBoundingClientRect().height : 0;
21
22
  i(Math.round(e));
22
23
  };
23
24
  if (a(), typeof ResizeObserver > "u") return;
24
25
  let o = new ResizeObserver(a);
25
- return o.observe(r), () => o.disconnect();
26
- }, [e, t]), t ? r > 0 ? r : m : 0;
26
+ return o.observe(n), () => o.disconnect();
27
+ }, [e, t]), t ? n > 0 ? n : h : 0;
27
28
  }
28
- function g() {
29
+ function _() {
29
30
  if (typeof document > "u") return !1;
30
31
  let e = document.activeElement;
31
32
  return e === null || e === document.body || !e.isConnected || e.hasAttribute("data-assistant-panel");
32
33
  }
33
- var _ = ({ state: e, restored: n }) => {
34
- let r = t();
35
- return /* @__PURE__ */ f("p", {
34
+ var v = ({ state: e, restored: t }) => {
35
+ let r = n();
36
+ return /* @__PURE__ */ p("p", {
36
37
  className: "sr-only",
37
38
  "aria-live": "polite",
38
39
  "aria-atomic": "true",
39
40
  "data-testid": "assistant-avatar-tab-ask-live",
40
- children: e === "thinking" ? r.askThinking : e === "not-spoken" ? r.askNotSpoken : e === "cut" ? r.askCut : e === "not-heard" ? r.askNotHeard : e === "failed" ? n ? r.askFailed : r.askFailedInChat : ""
41
+ children: e === "thinking" ? r.askThinking : e === "not-spoken" ? r.askNotSpoken : e === "cut" ? r.askCut : e === "not-heard" ? r.askNotHeard : e === "failed" ? t ? r.askFailed : r.askFailedInChat : ""
41
42
  });
42
- }, v = ({ tab: t, id: n, labelledBy: m, leaveHintId: v, shown: y, voice: b, ask: x }) => {
43
- let S = u(null), C = u(null), w = u(null), T = r(), E = h(S, b.live), D = u(null);
44
- l(() => {
45
- let n = (D.current?.setup ?? 0) + 1;
46
- return D.current = {
47
- tab: t,
48
- setup: n
49
- }, t.setOpen(!0), () => {
43
+ }, y = ({ tab: n, id: r, labelledBy: h, leaveHintId: y, shown: b, voice: x, ask: S }) => {
44
+ let C = d(null), w = d(null), T = d(null), E = i(), D = g(C, x.live), O = e(), k = d(null);
45
+ u(() => {
46
+ let e = (k.current?.setup ?? 0) + 1;
47
+ return k.current = {
48
+ tab: n,
49
+ setup: e
50
+ }, n.setOpen(!0), () => {
50
51
  queueMicrotask(() => {
51
- let r = D.current;
52
- r !== null && r.tab === t && r.setup !== n || (t.setOpen(!1), e());
52
+ let r = k.current;
53
+ r !== null && r.tab === n && r.setup !== e || (n.setOpen(!1), t());
53
54
  });
54
55
  };
55
- }, [t]);
56
- let O = u(b.live);
57
- c(() => {
58
- let e = O.current;
59
- O.current = b.live, !(!e || b.live) && g() && w.current?.focus();
60
- }, [b.live]);
61
- let k = s(x?.last ?? null, x?.navigatingReplyId ?? null), A = b.live ? void 0 : x, [j, M] = d(null), N = k?.state === "failed" ? k.exchange.replyId : null, P = k?.question ?? "", F = x?.draft;
56
+ }, [n]);
57
+ let A = d(x.live);
62
58
  l(() => {
63
- if (N === null || F === void 0 || j?.replyId === N) return;
64
- let e = F.get().trim() === "";
65
- e && F.set(P), M({
66
- replyId: N,
59
+ let e = A.current;
60
+ A.current = x.live, !(!e || x.live) && _() && T.current?.focus();
61
+ }, [x.live]);
62
+ let j = c(S?.last ?? null, S?.navigatingReplyId ?? null), M = x.live ? void 0 : S, [N, P] = f(null), F = j?.state === "failed" ? j.exchange.replyId : null, I = j?.question ?? "", L = S?.draft;
63
+ u(() => {
64
+ if (F === null || L === void 0 || N?.replyId === F) return;
65
+ let e = L.get().trim() === "";
66
+ e && L.set(I), P({
67
+ replyId: F,
67
68
  restored: e
68
69
  });
69
70
  }, [
70
- N,
71
- P,
72
71
  F,
73
- j
72
+ I,
73
+ L,
74
+ N
74
75
  ]);
75
- let I = j === null || j.replyId !== N || j.restored;
76
- return /* @__PURE__ */ p("div", {
77
- ref: S,
76
+ let R = N === null || N.replyId !== F || N.restored;
77
+ return /* @__PURE__ */ m("div", {
78
+ ref: C,
78
79
  role: "tabpanel",
79
- id: n,
80
- "aria-labelledby": m,
80
+ id: r,
81
+ "aria-labelledby": h,
81
82
  className: "absolute inset-0 z-[5] flex flex-col bg-bg-surface",
82
83
  "data-testid": "assistant-avatar-tab",
83
84
  children: [
84
- /* @__PURE__ */ p("div", {
85
+ /* @__PURE__ */ m("div", {
85
86
  className: "flex min-h-0 flex-1 flex-col overflow-y-auto px-4 pt-4",
86
87
  style: {
87
- paddingBottom: E + 16,
88
- scrollPaddingBottom: E + 16
88
+ paddingBottom: D + 16,
89
+ scrollPaddingBottom: D + 16
89
90
  },
90
91
  "data-testid": "assistant-avatar-tab-column",
91
- children: [/* @__PURE__ */ f(t.View, {
92
- shown: y,
93
- voice: b,
94
- handsFreeOff: T,
95
- leaveHintId: v,
96
- startVoiceRef: w,
97
- ...x ? { askLine: x.line } : {}
98
- }), A ? /* @__PURE__ */ f(o, {
99
- view: k,
100
- invite: !i(A.blocker),
101
- restored: I,
102
- focusAfterStop: C
103
- }, k?.exchange.replyId ?? "none") : null]
92
+ children: [/* @__PURE__ */ p(n.View, {
93
+ shown: b,
94
+ voice: x,
95
+ handsFreeOff: E,
96
+ leaveHintId: y,
97
+ startVoiceRef: T,
98
+ navigate: O,
99
+ ...S ? { askLine: S.line } : {}
100
+ }), M ? /* @__PURE__ */ p(s, {
101
+ view: j,
102
+ invite: !a(M.blocker),
103
+ restored: R,
104
+ focusAfterStop: w
105
+ }, j?.exchange.replyId ?? "none") : null]
104
106
  }),
105
- A ? /* @__PURE__ */ f(a, {
106
- ask: A,
107
- inputRef: C
107
+ M ? /* @__PURE__ */ p(o, {
108
+ ask: M,
109
+ inputRef: w
108
110
  }) : null,
109
- x ? /* @__PURE__ */ f(_, {
110
- state: k?.state ?? null,
111
- restored: I
111
+ S ? /* @__PURE__ */ p(v, {
112
+ state: j?.state ?? null,
113
+ restored: R
112
114
  }) : null
113
115
  ]
114
116
  });
115
117
  };
116
118
  //#endregion
117
- export { v as AssistantAvatarTab };
119
+ export { y as AssistantAvatarTab };
@@ -17,6 +17,8 @@ export type AvatarAskBlocker =
17
17
  | 'avatar-off'
18
18
  /** The avatar is stopping, near its time limit, or Turn on waits for a time a refusal named (critic m11). */
19
19
  | 'avatar-again'
20
+ /** ★ BOFF-9446: Turn on cannot start the avatar until avatar credits are available (none left for this person). */
21
+ | 'avatar-minutes'
20
22
  /** The avatar is on, but the browser blocks its sound until a tap on its frame (critic m1). */
21
23
  | 'sound'
22
24
  /** The avatar is being started. */
@@ -10,6 +10,7 @@ function n(e) {
10
10
  case "off": return "avatar-off";
11
11
  case "locked":
12
12
  case "ending": return "avatar-again";
13
+ case "no-minutes": return "avatar-minutes";
13
14
  case "sound-blocked": return "sound";
14
15
  case "starting": return "starting";
15
16
  case "ready": break;
@@ -23,7 +23,8 @@ export interface WorkspacesPageViewedPayload {
23
23
  */
24
24
  export interface AssistantLeaveConfirmPayload {
25
25
  decision: 'left' | 'kept';
26
- surface: 'offer' | 'reply-link' | 'connect-source' | 'unknown';
26
+ /** `avatar-minutes` (BOFF-9446): the Avatar tab's way to the plans page, for avatar credits. */
27
+ surface: 'offer' | 'reply-link' | 'connect-source' | 'avatar-minutes' | 'unknown';
27
28
  editorCount: number;
28
29
  editorIds: readonly string[];
29
30
  }