@burdenoff/fe-libs 2026.1029.11 → 2026.1030.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.
Files changed (62) hide show
  1. package/dist/connections/ConnectionDetailsTab.d.ts +4 -1
  2. package/dist/connections/ConnectionDetailsTab.js +18 -15
  3. package/dist/connections/ConnectionDialog.d.ts +8 -2
  4. package/dist/connections/ConnectionDialog.js +18 -17
  5. package/dist/connections/ConnectionDialogPanel.d.ts +3 -1
  6. package/dist/connections/ConnectionDialogPanel.js +141 -135
  7. package/dist/connections/ShareConnectionDialog.d.ts +23 -0
  8. package/dist/connections/ShareConnectionDialog.js +146 -0
  9. package/dist/connections/SharePanels.d.ts +32 -0
  10. package/dist/connections/SharePanels.js +158 -0
  11. package/dist/connections/VisibilityChoice.d.ts +12 -0
  12. package/dist/connections/VisibilityChoice.js +60 -0
  13. package/dist/connections/api.d.ts +12 -1
  14. package/dist/connections/api.js +1 -1
  15. package/dist/connections/connectionFlow.d.ts +6 -1
  16. package/dist/connections/connectionFlow.js +1 -1
  17. package/dist/connections/index.d.ts +4 -1
  18. package/dist/connections/sharingApi.d.ts +28 -0
  19. package/dist/connections/sharingApi.js +215 -0
  20. package/dist/connections/types.d.ts +31 -0
  21. package/dist/connections/useConnectionSharingDraft.d.ts +40 -0
  22. package/dist/connections/useConnectionSharingDraft.js +93 -0
  23. package/dist/connections.js +12 -9
  24. package/dist/shared/assistant/i18nManifest.d.ts +18 -0
  25. package/dist/shared/assistant/i18nManifest.js +18 -0
  26. package/dist/shared/assistant/index.d.ts +4 -0
  27. package/dist/shared/assistant/ui/AIAssistantPanel.d.ts +9 -1
  28. package/dist/shared/assistant/ui/AIAssistantPanel.js +194 -174
  29. package/dist/shared/assistant/ui/AssistantChatArea.d.ts +33 -0
  30. package/dist/shared/assistant/ui/AssistantChatArea.js +1463 -1397
  31. package/dist/shared/assistant/ui/AssistantLanguageMenu.d.ts +9 -1
  32. package/dist/shared/assistant/ui/AssistantLanguageMenu.js +22 -22
  33. package/dist/shared/assistant/ui/AssistantOverlay.d.ts +16 -2
  34. package/dist/shared/assistant/ui/AssistantOverlay.js +219 -200
  35. package/dist/shared/assistant/ui/assistantOverlayState.d.ts +16 -2
  36. package/dist/shared/assistant/ui/assistantOverlayState.js +57 -40
  37. package/dist/shared/assistant/ui/compact/AssistantConversationMenu.js +53 -52
  38. package/dist/shared/assistant/ui/compact/AssistantDiscardDraftDialog.js +3 -4
  39. package/dist/shared/assistant/ui/compact/AssistantLanguagePill.d.ts +29 -0
  40. package/dist/shared/assistant/ui/compact/AssistantLanguagePill.js +98 -0
  41. package/dist/shared/assistant/ui/compact/AssistantVoiceReady.d.ts +31 -0
  42. package/dist/shared/assistant/ui/compact/AssistantVoiceReady.js +41 -0
  43. package/dist/shared/assistant/ui/compact/AssistantWaitingChangeRow.d.ts +6 -0
  44. package/dist/shared/assistant/ui/compact/AssistantWaitingChangeRow.js +5 -5
  45. package/dist/shared/assistant/ui/compact/AssistantWindowHeader.d.ts +22 -5
  46. package/dist/shared/assistant/ui/compact/AssistantWindowHeader.js +45 -31
  47. package/dist/shared/assistant/ui/compact/windowView.d.ts +50 -0
  48. package/dist/shared/assistant/ui/compact/windowView.js +31 -0
  49. package/dist/shared/assistant/ui/composer/AssistantComposer.d.ts +6 -0
  50. package/dist/shared/assistant/ui/composer/AssistantComposer.js +90 -89
  51. package/dist/shared/assistant/ui/composer/AssistantModeMenu.d.ts +6 -0
  52. package/dist/shared/assistant/ui/composer/AssistantModeMenu.js +83 -83
  53. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.d.ts +31 -0
  54. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.js +270 -166
  55. package/dist/shared/assistant/ui/voice/VoiceStage.d.ts +8 -0
  56. package/dist/shared/assistant/ui/voice/VoiceStage.js +10 -10
  57. package/dist/shared/assistant/voice/voiceStartedCue.d.ts +11 -0
  58. package/dist/shared/assistant/voice/voiceStartedCue.js +7 -0
  59. package/dist/shared-assistant.js +266 -262
  60. package/dist/ui/modal-shell.d.ts +6 -1
  61. package/dist/ui/modal-shell.js +7 -6
  62. package/package.json +1 -1
@@ -2,8 +2,8 @@ import { useAssistantTr as e } from "../../i18n.js";
2
2
  import { ShieldAlert as t } from "lucide-react";
3
3
  import { jsx as n, jsxs as r } from "react/jsx-runtime";
4
4
  //#region src/shared/assistant/ui/compact/AssistantWaitingChangeRow.tsx
5
- var i = ({ count: i, onReview: a }) => {
6
- let o = e();
5
+ var i = ({ count: i, onReview: a, opensFull: o = !1 }) => {
6
+ let s = e();
7
7
  return /* @__PURE__ */ r("div", {
8
8
  className: "mb-2 flex min-h-11 items-center gap-2 rounded-xl border border-status-warning bg-status-warning/10 px-3 py-1",
9
9
  "data-testid": "assistant-waiting-change",
@@ -17,15 +17,15 @@ var i = ({ count: i, onReview: a }) => {
17
17
  "aria-live": "polite",
18
18
  className: "min-w-0 flex-1 text-sm text-text-primary",
19
19
  "data-testid": "assistant-waiting-change-status",
20
- children: o("waitingChange.status", "{{count}} change(s) waiting for your approval", { count: i })
20
+ children: s("waitingChange.status", "{{count}} change(s) waiting for your approval", { count: i })
21
21
  }),
22
22
  /* @__PURE__ */ n("button", {
23
23
  type: "button",
24
24
  onClick: a,
25
25
  className: "min-h-9 shrink-0 rounded-button px-3 text-sm font-medium text-action-primary-bg transition-colors hover:bg-bg-sunken focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]",
26
- "aria-label": o("waitingChange.reviewLabel", "Review the change waiting for your approval"),
26
+ "aria-label": o ? void 0 : s("waitingChange.reviewLabel", "Review the change waiting for your approval"),
27
27
  "data-testid": "assistant-waiting-change-review",
28
- children: o("waitingChange.review", "Review")
28
+ children: o ? s("waitingChange.reviewInFull", "Review in full assistant") : s("waitingChange.review", "Review")
29
29
  })
30
30
  ]
31
31
  });
@@ -1,19 +1,36 @@
1
1
  import { FC } from 'react';
2
+ import { AssistantWindowView } from '../assistantOverlayState';
2
3
  export interface AssistantWindowHeaderProps {
4
+ /** The view the window shows. */
5
+ view: AssistantWindowView;
6
+ /** Chat or Voice was chosen. Presentation only: a live voice conversation carries on. */
7
+ onSelectView: (view: AssistantWindowView) => void;
8
+ /** A voice conversation is live: Minimize ends it, and the language waits. */
9
+ voiceLive: boolean;
3
10
  /** Switch the same instance to the full assistant. Nothing is re-sent. */
4
11
  onOpenFull: () => void;
5
12
  /** Hide the window and keep everything in it (CW-M). */
6
13
  onMinimize: () => void;
7
14
  }
8
15
  /**
9
- * The Quick assistant window's slim header (BOFF-10178, Slice 3):
10
- * `[✦] Quick assistant ………… [Open full assistant] [Minimize]`.
16
+ * The Quick assistant window's header strip (BOFF-10178 Slice 3, BOFF-10180
17
+ * Slice 5):
18
+ *
19
+ * `[Chat | Voice] [文A English ▾] ………… [Open full assistant] [Minimize]`
20
+ *
21
+ * Four controls, 40 px each (C2). The pilot name is the panel's accessible name,
22
+ * so the strip spends its width on the controls.
23
+ *
24
+ * ★ The view toggle is a two-option segmented control with `aria-pressed`: each
25
+ * option names the view it SHOWS, and the one showing is pressed. It is
26
+ * presentation only: it starts nothing and ends nothing.
11
27
  *
12
28
  * ★ No Close (CW-M): the window is hidden, never closed, so a draft, its
13
29
  * attachments and the conversation stay exactly where they are. Closing is the
14
- * full panel's. The view toggle, language pill and voice cue are Slice 5.
30
+ * full panel's. While voice is live Minimize says it ENDS voice (VD): the hidden
31
+ * window keeps everything but the microphone, and nothing listens in the
32
+ * background.
15
33
  *
16
- * ★ Both controls keep one NAME each (WCAG 2.5.3): the tooltip is the same
17
- * words.
34
+ * ★ Every control keeps one NAME (WCAG 2.5.3): the tooltip is the same words.
18
35
  */
19
36
  export declare const AssistantWindowHeader: FC<AssistantWindowHeaderProps>;
@@ -1,48 +1,62 @@
1
1
  import { useAssistantTr as e } from "../../i18n.js";
2
- import { Minus as t, PanelRight as n, Sparkles as r } from "lucide-react";
3
- import { jsx as i, jsxs as a } from "react/jsx-runtime";
2
+ import { AssistantLanguagePill as t } from "./AssistantLanguagePill.js";
3
+ import { AudioLines as n, MessageSquare as r, Minus as i, PanelRight as a } from "lucide-react";
4
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
4
5
  //#region src/shared/assistant/ui/compact/AssistantWindowHeader.tsx
5
- var o = "flex size-10 shrink-0 items-center justify-center rounded-button transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]", s = "text-text-secondary hover:bg-bg-sunken hover:text-text-primary", c = ({ onOpenFull: c, onMinimize: l }) => {
6
- let u = e(), d = u("window.openFull", "Open full assistant"), f = u("window.minimize", "Minimize");
7
- return /* @__PURE__ */ a("div", {
8
- className: "flex min-h-14 items-center gap-0.5 border-b border-border-default px-3 py-2",
6
+ var c = "flex size-10 shrink-0 items-center justify-center rounded-button transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]", l = "text-text-secondary hover:bg-bg-sunken hover:text-text-primary", u = ({ view: u, onSelectView: d, voiceLive: f, onOpenFull: p, onMinimize: m }) => {
7
+ let h = e(), g = h("window.openFull", "Open full assistant"), _ = f ? h("window.minimizeEndsVoice", "Minimize (ends voice)") : h("window.minimize", "Minimize"), v = h("window.viewChat", "Chat"), y = h("window.viewVoice", "Voice"), b = (e, t, n) => {
8
+ let r = u === e;
9
+ return /* @__PURE__ */ o("button", {
10
+ type: "button",
11
+ onClick: () => d(e),
12
+ className: `flex size-10 shrink-0 items-center justify-center rounded-full transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] ${r ? "bg-[var(--color-accent-soft)] text-action-primary-bg" : "text-text-secondary hover:bg-bg-sunken hover:text-text-primary"}`,
13
+ "aria-pressed": r,
14
+ "aria-label": t,
15
+ title: t,
16
+ "data-testid": `assistant-window-view-${e}`,
17
+ children: n
18
+ });
19
+ };
20
+ return /* @__PURE__ */ s("div", {
21
+ className: "flex min-h-14 items-center gap-1 border-b border-border-default px-2 py-2",
9
22
  "data-testid": "assistant-window-header",
10
23
  "data-presentation": "compact",
11
24
  "data-surface": "window",
12
25
  children: [
13
- /* @__PURE__ */ a("div", {
14
- className: "flex min-w-0 flex-1 items-center gap-3",
15
- children: [/* @__PURE__ */ i("span", {
16
- className: "flex size-7 flex-shrink-0 items-center justify-center rounded-lg bg-gradient-to-br from-action-primary-bg/25 to-action-primary-bg/5 text-action-primary-bg",
17
- children: /* @__PURE__ */ i(r, {
18
- className: "size-4",
19
- "aria-hidden": "true"
20
- })
21
- }), /* @__PURE__ */ i("span", {
22
- className: "block min-w-0 flex-1 truncate text-base font-semibold leading-tight text-text-primary",
23
- children: u("window.title", "Quick assistant")
24
- })]
26
+ /* @__PURE__ */ s("div", {
27
+ role: "group",
28
+ "aria-label": h("window.view", "View"),
29
+ className: "flex shrink-0 items-center rounded-full border border-border-default",
30
+ "data-testid": "assistant-window-view",
31
+ children: [b("chat", v, /* @__PURE__ */ o(r, {
32
+ className: "size-5",
33
+ "aria-hidden": "true"
34
+ })), b("voice", y, /* @__PURE__ */ o(n, {
35
+ className: "size-5",
36
+ "aria-hidden": "true"
37
+ }))]
25
38
  }),
26
- /* @__PURE__ */ i("button", {
39
+ /* @__PURE__ */ o(t, { voiceLive: f }),
40
+ /* @__PURE__ */ o("button", {
27
41
  type: "button",
28
- onClick: c,
29
- className: `${o} ${s}`,
30
- "aria-label": d,
31
- title: d,
42
+ onClick: () => p(),
43
+ className: `${c} ${l}`,
44
+ "aria-label": g,
45
+ title: g,
32
46
  "data-testid": "assistant-open-full",
33
- children: /* @__PURE__ */ i(n, {
47
+ children: /* @__PURE__ */ o(a, {
34
48
  className: "size-5",
35
49
  "aria-hidden": "true"
36
50
  })
37
51
  }),
38
- /* @__PURE__ */ i("button", {
52
+ /* @__PURE__ */ o("button", {
39
53
  type: "button",
40
- onClick: l,
41
- className: `${o} ${s}`,
42
- "aria-label": f,
43
- title: f,
54
+ onClick: m,
55
+ className: `${c} ${l}`,
56
+ "aria-label": _,
57
+ title: _,
44
58
  "data-testid": "assistant-minimize",
45
- children: /* @__PURE__ */ i(t, {
59
+ children: /* @__PURE__ */ o(i, {
46
60
  className: "size-5",
47
61
  "aria-hidden": "true"
48
62
  })
@@ -51,4 +65,4 @@ var o = "flex size-10 shrink-0 items-center justify-center rounded-button transi
51
65
  });
52
66
  };
53
67
  //#endregion
54
- export { c as AssistantWindowHeader };
68
+ export { u as AssistantWindowHeader };
@@ -0,0 +1,50 @@
1
+ import { isAssistantWindowView, AssistantWindowView } from '../assistantOverlayState';
2
+ export { isAssistantWindowView, type AssistantWindowView };
3
+ /**
4
+ * CW-V: the view the window shows.
5
+ *
6
+ * - Not live: the LAST USED view; the first time (nothing stored) Voice where
7
+ * voice is available here, else Chat.
8
+ * - Live: the voice view, which is where a conversation that has just started is
9
+ * (starting it from the Chat view moves the window to it), unless the person
10
+ * stepped to Chat since. That step is NOT the last-used view: it lasts as long
11
+ * as the conversation does.
12
+ */
13
+ export declare function resolveWindowView(input: {
14
+ /** The last-used view the overlay remembers, or null when none was ever chosen. */
15
+ stored: AssistantWindowView | null;
16
+ /** Voice can start here (speech works and the mode takes it). */
17
+ voiceAvailable: boolean;
18
+ /** A voice session is live. */
19
+ voiceLive: boolean;
20
+ /** The view the person chose during the live conversation. */
21
+ liveView: AssistantWindowView;
22
+ }): AssistantWindowView;
23
+ /** What the chat area tells the panel about voice in the window. */
24
+ export interface WindowVoiceState {
25
+ /** Voice can start here: `voiceSession.available` and the active mode takes it. */
26
+ available: boolean;
27
+ /** A session is live. */
28
+ live: boolean;
29
+ }
30
+ /** Until the chat area reports: not available, not live. */
31
+ export declare const WINDOW_VOICE_IDLE: WindowVoiceState;
32
+ /**
33
+ * The window's view and how a person changes it. A choice made while voice is
34
+ * live is the live conversation's alone; any other choice is remembered
35
+ * (`onRemember`, the overlay's storage). Each new conversation starts on Voice.
36
+ *
37
+ * ★ The state is adjusted DURING render, conditional on the flag it follows, so
38
+ * no frame shows the wrong view.
39
+ */
40
+ export declare function useAssistantWindowView(args: {
41
+ stored: AssistantWindowView | null;
42
+ onRemember: ((view: AssistantWindowView) => void) | undefined;
43
+ voice: WindowVoiceState;
44
+ }): {
45
+ view: AssistantWindowView;
46
+ /** The person chose a view in the header. */
47
+ select: (view: AssistantWindowView) => void;
48
+ /** The view is where the person IS now (Continue in chat): remembered, never a live-only choice. */
49
+ remember: (view: AssistantWindowView) => void;
50
+ };
@@ -0,0 +1,31 @@
1
+ import "../assistantOverlayState.js";
2
+ import { useCallback as e, useState as t } from "react";
3
+ //#region src/shared/assistant/ui/compact/windowView.ts
4
+ function n(e) {
5
+ return e.voiceLive ? e.liveView : e.stored ?? (e.voiceAvailable ? "voice" : "chat");
6
+ }
7
+ var r = {
8
+ available: !1,
9
+ live: !1
10
+ };
11
+ function i(r) {
12
+ let { stored: i, onRemember: a, voice: o } = r, [s, c] = t("voice"), [l, u] = t(null), [d, f] = t(o.live);
13
+ d !== o.live && (f(o.live), o.live && c("voice"));
14
+ let p = n({
15
+ stored: l ?? i,
16
+ voiceAvailable: o.available,
17
+ voiceLive: o.live,
18
+ liveView: s
19
+ }), m = o.live, h = e((e) => {
20
+ u(e), a?.(e);
21
+ }, [a]);
22
+ return {
23
+ view: p,
24
+ select: e((e) => {
25
+ m ? c(e) : h(e);
26
+ }, [m, h]),
27
+ remember: h
28
+ };
29
+ }
30
+ //#endregion
31
+ export { r as WINDOW_VOICE_IDLE, n as resolveWindowView, i as useAssistantWindowView };
@@ -115,6 +115,12 @@ interface Props {
115
115
  * "change waiting" row. Classic never draws it.
116
116
  */
117
117
  aboveCard?: ReactNode;
118
+ /**
119
+ * BOFF-10180 (compact only): show the mode as a read-only label, not a menu. The
120
+ * Quick assistant window names the mode it is in and leaves changing it to the
121
+ * full panel (DESIGN §3.3). Absent: the Mode menu.
122
+ */
123
+ modeReadOnly?: boolean;
118
124
  }
119
125
  /** A local draft snapshot; no files are uploaded by observing it. */
120
126
  export interface AssistantComposerDraft {