@burdenoff/fe-libs 2026.1006.2 → 2026.1007.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 (52) hide show
  1. package/dist/chrome/ContextSwitcher.d.ts.map +1 -1
  2. package/dist/chrome/ContextSwitcher.js +93 -89
  3. package/dist/chrome/GlobalSearch.d.ts.map +1 -1
  4. package/dist/chrome/GlobalSearch.js +94 -96
  5. package/dist/chrome/NotificationCenter.d.ts.map +1 -1
  6. package/dist/chrome/NotificationCenter.js +62 -62
  7. package/dist/chrome/ShortcutHelpDialog.d.ts.map +1 -1
  8. package/dist/chrome/ShortcutHelpDialog.js +103 -97
  9. package/dist/chrome/notificationCenter/NotificationPanel.d.ts.map +1 -1
  10. package/dist/chrome/notificationCenter/NotificationPanel.js +28 -17
  11. package/dist/chrome/notificationCenter/usePanelChrome.d.ts +0 -1
  12. package/dist/chrome/notificationCenter/usePanelChrome.d.ts.map +1 -1
  13. package/dist/chrome/notificationCenter/usePanelChrome.js +1 -10
  14. package/dist/chrome/shellOverlayLayer.d.ts +42 -0
  15. package/dist/chrome/shellOverlayLayer.d.ts.map +1 -0
  16. package/dist/chrome/shellOverlayLayer.js +4 -0
  17. package/dist/shared/assistant/appControls/languageReply.d.ts +28 -0
  18. package/dist/shared/assistant/appControls/languageReply.d.ts.map +1 -0
  19. package/dist/shared/assistant/appControls/languageReply.js +17 -0
  20. package/dist/shared/assistant/appControls/text.d.ts +7 -1
  21. package/dist/shared/assistant/appControls/text.d.ts.map +1 -1
  22. package/dist/shared/assistant/appControls/text.js +4 -3
  23. package/dist/shared/assistant/conversation.d.ts +2 -0
  24. package/dist/shared/assistant/conversation.d.ts.map +1 -1
  25. package/dist/shared/assistant/displayContent.d.ts.map +1 -1
  26. package/dist/shared/assistant/displayContent.js +14 -11
  27. package/dist/shared/assistant/history/historyMapping.d.ts.map +1 -1
  28. package/dist/shared/assistant/history/historyMapping.js +10 -5
  29. package/dist/shared/assistant/index.d.ts +1 -0
  30. package/dist/shared/assistant/index.d.ts.map +1 -1
  31. package/dist/shared/assistant/ui/AIAssistantPanel.js +8 -8
  32. package/dist/shared/assistant/ui/AssistantChatArea.d.ts.map +1 -1
  33. package/dist/shared/assistant/ui/AssistantChatArea.js +1012 -939
  34. package/dist/shared/assistant/ui/AssistantMessageItem.d.ts.map +1 -1
  35. package/dist/shared/assistant/ui/AssistantMessageItem.js +105 -97
  36. package/dist/shared/assistant/ui/AssistantMoreMenu.d.ts.map +1 -1
  37. package/dist/shared/assistant/ui/AssistantMoreMenu.js +112 -108
  38. package/dist/shared/assistant/ui/composer/AssistantAttachmentButton.d.ts.map +1 -1
  39. package/dist/shared/assistant/ui/composer/AssistantAttachmentButton.js +66 -62
  40. package/dist/shared/assistant/ui/controlConfirmDialog.js +4 -4
  41. package/dist/shared/assistant/ui/useDropdownEscape.d.ts +8 -30
  42. package/dist/shared/assistant/ui/useDropdownEscape.d.ts.map +1 -1
  43. package/dist/shared/assistant/ui/useDropdownEscape.js +6 -20
  44. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.js +7 -7
  45. package/dist/shared/assistant/uiActions/recordNames.d.ts +18 -6
  46. package/dist/shared/assistant/uiActions/recordNames.d.ts.map +1 -1
  47. package/dist/shared/assistant/uiActions/recordNames.js +42 -37
  48. package/dist/shared/components/EscapeLayer.d.ts +15 -0
  49. package/dist/shared/components/EscapeLayer.d.ts.map +1 -0
  50. package/dist/shared/components/EscapeLayer.js +31 -0
  51. package/dist/shared-assistant.js +151 -150
  52. package/package.json +3 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantMessageItem.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantMessageItem.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,EAAE,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAyBnE,OAAO,KAAK,EACV,+BAA+B,EAG/B,OAAO,EACR,MAAM,iBAAiB,CAAC;AAIzB,UAAU,KAAK;IACb,mEAAmE;IACnE,qBAAqB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,6EAA6E;IAC7E,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;OAGG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,+BAA+B,GAAG,IAAI,CAAC;IACpD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,uEAAuE;IACvE,cAAc,CAAC,EAAE,SAAS,CAAC;CAC5B;AAyCD;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,EAAE,EAY5B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,EAAE,CAAC,KAAK,CAyV1C,CAAC"}
1
+ {"version":3,"file":"AssistantMessageItem.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantMessageItem.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,EAAE,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAyB3E,OAAO,KAAK,EACV,+BAA+B,EAG/B,OAAO,EACR,MAAM,iBAAiB,CAAC;AAMzB,UAAU,KAAK;IACb,mEAAmE;IACnE,qBAAqB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,6EAA6E;IAC7E,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;OAGG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,+BAA+B,GAAG,IAAI,CAAC;IACpD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,uEAAuE;IACvE,cAAc,CAAC,EAAE,SAAS,CAAC;CAC5B;AAyCD;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,EAAE,EAY5B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,EAAE,CAAC,KAAK,CA2W1C,CAAC"}
@@ -1,108 +1,110 @@
1
- import { useAuthToken as e } from "../../providers/shell/AuthTokenProvider.js";
1
+ import { useI18n as e } from "../../providers/shell/I18nProvider.js";
2
+ import { useAuthToken as t } from "../../providers/shell/AuthTokenProvider.js";
2
3
  import "../../../shared-providers-shell.js";
3
- import { useAssistantStorageFolders as t } from "../product.js";
4
- import { useAssistantTr as n } from "../i18n.js";
5
- import { copyToClipboard as r } from "../clipboard.js";
6
- import { AssistantMarkdownRenderer as i } from "./AssistantMarkdownRenderer.js";
7
- import { downloadAssistantArtifact as a } from "../api.js";
8
- import { getAssistantDisplayContent as o } from "../displayContent.js";
9
- import { AssistantToolActivity as s, parseToolActivity as ee } from "./AssistantToolActivity.js";
4
+ import { useAssistantStorageFolders as n } from "../product.js";
5
+ import { useAssistantTr as r } from "../i18n.js";
6
+ import { copyToClipboard as i } from "../clipboard.js";
7
+ import { AssistantMarkdownRenderer as a } from "./AssistantMarkdownRenderer.js";
8
+ import { downloadAssistantArtifact as o } from "../api.js";
9
+ import { languageConfirmationCopy as s } from "../appControls/languageReply.js";
10
+ import { getAssistantDisplayContent as ee } from "../displayContent.js";
11
+ import { AssistantToolActivity as te, parseToolActivity as ne } from "./AssistantToolActivity.js";
10
12
  import { usePrefersReducedMotion as c } from "./usePrefersReducedMotion.js";
11
- import { AssistantAvatar as te } from "./AssistantAvatar.js";
13
+ import { AssistantAvatar as re } from "./AssistantAvatar.js";
12
14
  import { useAssistantSpeech as l } from "./AssistantSpeechProvider.js";
13
- import { AssistantMessageAttachments as u } from "./AssistantMessageAttachments.js";
14
- import { AssistantPendingWriteCard as d } from "./AssistantPendingWriteCard.js";
15
- import { AssistantSpeakButton as f } from "./AssistantSpeakButton.js";
16
- import { SaveToFilesButton as p } from "../../../storage/SaveToFilesButton.js";
15
+ import { AssistantMessageAttachments as ie } from "./AssistantMessageAttachments.js";
16
+ import { AssistantPendingWriteCard as u } from "./AssistantPendingWriteCard.js";
17
+ import { AssistantSpeakButton as d } from "./AssistantSpeakButton.js";
18
+ import { SaveToFilesButton as f } from "../../../storage/SaveToFilesButton.js";
17
19
  import "../../../storage/index.js";
18
- import { AssistantTurnActivity as m } from "./AssistantTurnActivity.js";
19
- import { useMemo as h, useState as g } from "react";
20
- import { Check as ne, Copy as _, RotateCcw as v } from "lucide-react";
21
- import { Fragment as y, jsx as b, jsxs as x } from "react/jsx-runtime";
20
+ import { AssistantTurnActivity as ae } from "./AssistantTurnActivity.js";
21
+ import { useMemo as p, useRef as oe, useState as m } from "react";
22
+ import { Check as h, Copy as g, RotateCcw as se } from "lucide-react";
23
+ import { Fragment as _, jsx as v, jsxs as y } from "react/jsx-runtime";
22
24
  //#region src/shared/assistant/ui/AssistantMessageItem.tsx
23
- function S(e) {
25
+ function b(e) {
24
26
  return e.role === "assistant" ? e.metadata : void 0;
25
27
  }
26
- function C(e) {
28
+ function ce(e) {
27
29
  return e?.artifacts ?? [];
28
30
  }
29
- function w(e) {
31
+ function x(e) {
30
32
  return window.atob(e);
31
33
  }
32
- function T(e, t, n) {
33
- let r = w(e), i = new Uint8Array(r.length);
34
+ function S(e, t, n) {
35
+ let r = x(e), i = new Uint8Array(r.length);
34
36
  for (let e = 0; e < r.length; e += 1) i[e] = r.charCodeAt(e);
35
37
  let a = new Blob([i], { type: n }), o = URL.createObjectURL(a), s = document.createElement("a");
36
38
  s.href = o, s.download = t, document.body.appendChild(s), s.click(), document.body.removeChild(s), URL.revokeObjectURL(o);
37
39
  }
38
- var E = () => /* @__PURE__ */ b("span", {
40
+ var C = () => /* @__PURE__ */ v("span", {
39
41
  "aria-hidden": "true",
40
42
  "data-testid": "assistant-streaming-caret",
41
43
  className: "ml-0.5 inline-block h-4 w-1.5 rounded-sm bg-text-secondary align-middle" + (c() ? "" : " motion-safe:animate-pulse")
42
- }), D = ({ onApprovePendingWrite: c, approvingWriteRef: w = null, pendingWriteExpired: D = !1, pendingWriteApproved: re = !1, pendingWriteGoAheadSent: ie = !1, message: O, processing: k, isStreaming: A, isFailed: j, isLastAssistant: M, isNewestAssistant: N, onRetry: P, legacyWriteCardHidden: F = !1, writeProposals: I }) => {
43
- let L = n(), R = t(), { getAccessToken: z, getWorkspaceToken: B } = e(), V = l(), [H, U] = g(null), [W, G] = g(!1), K = O.role === "user", q = h(() => S(O), [O]), J = h(() => C(q), [q]), Y = k === void 0 ? A ? {
44
+ }), w = ({ onApprovePendingWrite: c, approvingWriteRef: x = null, pendingWriteExpired: w = !1, pendingWriteApproved: le = !1, pendingWriteGoAheadSent: ue = !1, message: T, processing: E, isStreaming: D, isFailed: O, isLastAssistant: k, isNewestAssistant: A, onRetry: j, legacyWriteCardHidden: M = !1, writeProposals: N }) => {
45
+ let P = r(), { locale: F } = e(), I = s(T, P), L = I ? I.translated ? F : "en" : T.metadata?.lang, R = I ? `${T.id}:language:${L}` : T.id, z = oe(R), B = n(), { getAccessToken: V, getWorkspaceToken: H } = t(), U = l(), [de, W] = m(null), [fe, G] = m(!1), K = T.role === "user", q = p(() => b(T), [T]), J = p(() => ce(q), [q]), Y = E === void 0 ? D ? {
44
46
  status: "streaming",
45
- messageId: O.id,
46
- updatedAt: O.timestamp
47
- } : null : k, X = o(O, Y, L), { steps: Z, text: Q } = h(() => K ? {
47
+ messageId: T.id,
48
+ updatedAt: T.timestamp
49
+ } : null : E, X = ee(T, Y, P), { steps: Z, text: Q } = p(() => K ? {
48
50
  steps: [],
49
- text: O.content
50
- } : X.kind === "output" ? ee(X.text) : {
51
+ text: T.content
52
+ } : X.kind === "output" ? ne(X.text) : {
51
53
  steps: [],
52
54
  text: ""
53
55
  }, [
54
56
  K,
55
- O.content,
57
+ T.content,
56
58
  X.kind,
57
59
  X.text
58
- ]), ae = () => {
59
- r(Q).then((e) => {
60
+ ]), pe = () => {
61
+ i(Q).then((e) => {
60
62
  e && (G(!0), setTimeout(() => G(!1), 2e3));
61
63
  });
62
- }, oe = async (e) => {
64
+ }, me = async (e) => {
63
65
  if (!q?.sandboxId || !q.sessionId) return;
64
66
  let t = new URLSearchParams(window.location.search).get("workspace") ?? "";
65
67
  if (t) {
66
- U(e.path);
68
+ W(e.path);
67
69
  try {
68
- let n = await a(q.sandboxId, t, q.sessionId, e.path, q.mode, {
69
- accessToken: z(),
70
- workspaceToken: B()
70
+ let n = await o(q.sandboxId, t, q.sessionId, e.path, q.mode, {
71
+ accessToken: V(),
72
+ workspaceToken: H()
71
73
  });
72
- T(n.contentBase64, n.filename, n.mimeType);
74
+ S(n.contentBase64, n.filename, n.mimeType);
73
75
  } finally {
74
- U(null);
76
+ W(null);
75
77
  }
76
78
  }
77
- }, $ = new Date(O.timestamp).toLocaleTimeString([], {
79
+ }, $ = new Date(T.timestamp).toLocaleTimeString([], {
78
80
  hour: "2-digit",
79
81
  minute: "2-digit"
80
82
  });
81
- if (O.role === "system") return /* @__PURE__ */ b("div", {
83
+ if (T.role === "system") return /* @__PURE__ */ v("div", {
82
84
  className: "flex justify-center px-2 py-1",
83
85
  "data-testid": "assistant-message-system",
84
- children: /* @__PURE__ */ b("p", {
86
+ children: /* @__PURE__ */ v("p", {
85
87
  className: "max-w-[90%] whitespace-pre-wrap break-words rounded-lg border border-border-subtle bg-bg-sunken/60 px-3 py-2 text-center text-xs leading-relaxed text-text-muted",
86
- children: O.content
88
+ children: T.content
87
89
  })
88
90
  });
89
91
  if (K) {
90
- let e = O.metadata?.attachments ?? [];
91
- return /* @__PURE__ */ b("div", {
92
+ let e = T.metadata?.attachments ?? [];
93
+ return /* @__PURE__ */ v("div", {
92
94
  className: "flex justify-end",
93
95
  "data-testid": "assistant-message-user",
94
- children: /* @__PURE__ */ x("div", {
96
+ children: /* @__PURE__ */ y("div", {
95
97
  className: "max-w-[85%]",
96
98
  children: [
97
- O.content && /* @__PURE__ */ b("div", {
99
+ T.content && /* @__PURE__ */ v("div", {
98
100
  className: "rounded-2xl rounded-br-md bg-action-primary-bg/12 px-3.5 py-2.5 text-[15px] leading-relaxed text-text-primary",
99
- children: /* @__PURE__ */ b("p", {
101
+ children: /* @__PURE__ */ v("p", {
100
102
  className: "whitespace-pre-wrap",
101
- children: O.content
103
+ children: T.content
102
104
  })
103
105
  }),
104
- /* @__PURE__ */ b(u, { attachments: e }),
105
- /* @__PURE__ */ b("div", {
106
+ /* @__PURE__ */ v(ie, { attachments: e }),
107
+ /* @__PURE__ */ v("div", {
106
108
  className: "mt-1 pr-1 text-right text-[10px] text-text-muted",
107
109
  children: $
108
110
  })
@@ -110,46 +112,46 @@ var E = () => /* @__PURE__ */ b("span", {
110
112
  })
111
113
  });
112
114
  }
113
- return /* @__PURE__ */ x("div", {
115
+ return /* @__PURE__ */ y("div", {
114
116
  className: "flex gap-2.5",
115
117
  "data-testid": "assistant-message-assistant",
116
- children: [/* @__PURE__ */ b(te, { active: A }), /* @__PURE__ */ x("div", {
118
+ children: [/* @__PURE__ */ v(re, { active: D }), /* @__PURE__ */ y("div", {
117
119
  className: "min-w-0 flex-1",
118
120
  children: [
119
- Z.length > 0 && /* @__PURE__ */ b(s, { steps: Z }),
120
- q?.pendingWrite && !F ? /* @__PURE__ */ b(d, {
121
+ Z.length > 0 && /* @__PURE__ */ v(te, { steps: Z }),
122
+ q?.pendingWrite && !M ? /* @__PURE__ */ v(u, {
121
123
  pendingWrite: q.pendingWrite,
122
124
  onApprove: c,
123
- approving: w !== null && w === q.pendingWrite.reference,
124
- expired: D,
125
- approved: re,
126
- goAheadSent: ie,
127
- awaitingTurn: !!A
125
+ approving: x !== null && x === q.pendingWrite.reference,
126
+ expired: w,
127
+ approved: le,
128
+ goAheadSent: ue,
129
+ awaitingTurn: !!D
128
130
  }) : null,
129
- I,
130
- Q && /* @__PURE__ */ b("div", {
131
+ N,
132
+ Q && /* @__PURE__ */ v("div", {
131
133
  className: "text-[15px] leading-relaxed text-text-primary",
132
- children: /* @__PURE__ */ b(i, { content: Q })
134
+ children: /* @__PURE__ */ v(a, { content: Q })
133
135
  }),
134
- X.kind === "working" && /* @__PURE__ */ b(m, { processing: Y }),
135
- X.kind === "stopped" && /* @__PURE__ */ b("p", {
136
+ X.kind === "working" && /* @__PURE__ */ v(ae, { processing: Y }),
137
+ X.kind === "stopped" && /* @__PURE__ */ v("p", {
136
138
  className: "text-[15px] leading-relaxed text-text-secondary",
137
139
  "data-testid": "assistant-turn-stopped",
138
140
  children: X.text
139
141
  }),
140
- A && /* @__PURE__ */ b(E, {}),
141
- J.length > 0 && q?.sandboxId && q.sessionId && /* @__PURE__ */ x("div", {
142
+ D && /* @__PURE__ */ v(C, {}),
143
+ J.length > 0 && q?.sandboxId && q.sessionId && /* @__PURE__ */ y("div", {
142
144
  className: "mt-3 space-y-2 border-t border-border-subtle pt-2",
143
- children: [/* @__PURE__ */ b("p", {
145
+ children: [/* @__PURE__ */ v("p", {
144
146
  className: "text-[10px] font-medium uppercase tracking-wide text-text-muted",
145
- children: L("message.downloads", "Downloads")
146
- }), /* @__PURE__ */ b("div", {
147
+ children: P("message.downloads", "Downloads")
148
+ }), /* @__PURE__ */ v("div", {
147
149
  className: "flex flex-wrap gap-2",
148
150
  children: J.map((e) => {
149
151
  let t = `${e.name}${e.type === "directory" ? ".tar.gz" : ""}`;
150
- return /* @__PURE__ */ b(p, {
152
+ return /* @__PURE__ */ v(f, {
151
153
  label: t,
152
- disabled: H === e.path,
154
+ disabled: de === e.path,
153
155
  testId: `assistant-artifact-${e.name}`,
154
156
  source: {
155
157
  kind: "sandbox-artifact",
@@ -158,53 +160,59 @@ var E = () => /* @__PURE__ */ b("span", {
158
160
  path: e.path,
159
161
  filename: t
160
162
  },
161
- defaultFolderPath: R.artifacts,
162
- onDownload: () => oe(e)
163
+ defaultFolderPath: B.artifacts,
164
+ onDownload: () => me(e)
163
165
  }, e.path);
164
166
  })
165
167
  })]
166
168
  }),
167
- !A && (Q || j || M) && /* @__PURE__ */ x("div", {
169
+ !D && (Q || O || k) && /* @__PURE__ */ y("div", {
168
170
  className: "mt-1.5 flex items-center gap-1",
169
171
  children: [
170
- Q && /* @__PURE__ */ b("button", {
172
+ Q && /* @__PURE__ */ v("button", {
171
173
  type: "button",
172
- onClick: ae,
174
+ onClick: pe,
173
175
  className: "flex items-center gap-1 rounded-md px-1.5 py-1 text-[11px] text-text-muted transition-colors hover:bg-bg-elevated hover:text-text-secondary",
174
- "aria-label": L("message.copy", "Copy message"),
176
+ "aria-label": P("message.copy", "Copy message"),
175
177
  "data-testid": "assistant-message-copy",
176
- children: W ? /* @__PURE__ */ x(y, { children: [/* @__PURE__ */ b(ne, { className: "size-3 text-status-success-text" }), /* @__PURE__ */ b("span", { children: L("message.copied", "Copied") })] }) : /* @__PURE__ */ x(y, { children: [/* @__PURE__ */ b(_, { className: "size-3" }), /* @__PURE__ */ b("span", { children: L("message.copyShort", "Copy") })] })
178
+ children: fe ? /* @__PURE__ */ y(_, { children: [/* @__PURE__ */ v(h, { className: "size-3 text-status-success-text" }), /* @__PURE__ */ v("span", { children: P("message.copied", "Copied") })] }) : /* @__PURE__ */ y(_, { children: [/* @__PURE__ */ v(g, { className: "size-3" }), /* @__PURE__ */ v("span", { children: P("message.copyShort", "Copy") })] })
177
179
  }),
178
- Q && V.isSupported && (() => {
179
- let e = V.blockedFor(O.id) ?? V.disabledReason, t = !!e && !!N, n = t ? `speak-reason-${O.id}` : void 0;
180
- return /* @__PURE__ */ x(y, { children: [/* @__PURE__ */ b(f, {
181
- isSpeaking: V.isSpeaking(O.id),
180
+ Q && U.isSupported && (() => {
181
+ let e = U.blockedFor(R) ?? U.disabledReason, t = U.isSpeaking(T.id) || U.isSpeaking(z.current), n = !!e && !!A, r = n ? `speak-reason-${T.id}` : void 0;
182
+ return /* @__PURE__ */ y(_, { children: [/* @__PURE__ */ v(d, {
183
+ isSpeaking: t,
182
184
  disabled: e !== null,
183
185
  disabledReason: e,
184
- describedById: n,
185
- onClick: () => V.toggle(O.id, Q, q?.lang)
186
- }), t && /* @__PURE__ */ b("span", {
187
- id: n,
186
+ describedById: r,
187
+ onClick: () => {
188
+ if (t) {
189
+ U.stop();
190
+ return;
191
+ }
192
+ z.current = R, U.toggle(R, Q, L);
193
+ }
194
+ }), n && /* @__PURE__ */ v("span", {
195
+ id: r,
188
196
  className: "text-[11px] text-text-muted",
189
197
  "data-testid": "assistant-speak-reason",
190
198
  children: e
191
199
  })] });
192
200
  })(),
193
- (j || M) && P && !O.metadata?.localAction && /* @__PURE__ */ x("button", {
201
+ (O || k) && j && !T.metadata?.localAction && /* @__PURE__ */ y("button", {
194
202
  type: "button",
195
- onClick: P,
196
- className: `flex items-center gap-1 rounded-md px-1.5 py-1 text-[11px] transition-colors hover:bg-bg-elevated ${j ? "text-status-error-text" : "text-text-muted hover:text-text-secondary"}`,
197
- "aria-label": L("message.retry", "Retry"),
203
+ onClick: j,
204
+ className: `flex items-center gap-1 rounded-md px-1.5 py-1 text-[11px] transition-colors hover:bg-bg-elevated ${O ? "text-status-error-text" : "text-text-muted hover:text-text-secondary"}`,
205
+ "aria-label": P("message.retry", "Retry"),
198
206
  "data-testid": "assistant-message-retry",
199
- children: [/* @__PURE__ */ b(v, { className: "size-3" }), /* @__PURE__ */ b("span", { children: L("message.retry", "Retry") })]
207
+ children: [/* @__PURE__ */ v(se, { className: "size-3" }), /* @__PURE__ */ v("span", { children: P("message.retry", "Retry") })]
200
208
  })
201
209
  ]
202
210
  }),
203
- /* @__PURE__ */ x("div", {
211
+ /* @__PURE__ */ y("div", {
204
212
  className: "mt-1 text-[10px] text-text-muted",
205
- children: [$, O.tokens && /* @__PURE__ */ x("span", {
213
+ children: [$, T.tokens && /* @__PURE__ */ y("span", {
206
214
  className: "ml-2",
207
- children: [O.tokens.input + O.tokens.output, " tokens"]
215
+ children: [T.tokens.input + T.tokens.output, " tokens"]
208
216
  })]
209
217
  })
210
218
  ]
@@ -212,4 +220,4 @@ var E = () => /* @__PURE__ */ b("span", {
212
220
  });
213
221
  };
214
222
  //#endregion
215
- export { D as AssistantMessageItem, E as StreamingCaret };
223
+ export { w as AssistantMessageItem, C as StreamingCaret };
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantMoreMenu.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantMoreMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAmB7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,iBAAiB,EAAE,EA4M/B,CAAC"}
1
+ {"version":3,"file":"AssistantMoreMenu.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantMoreMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAa7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,iBAAiB,EAAE,EAuL/B,CAAC"}
@@ -1,127 +1,131 @@
1
- import { useAssistantTr as e } from "../i18n.js";
2
- import { useAssistantStore as t } from "../store.js";
3
- import { useAssistantSpeech as n } from "./AssistantSpeechProvider.js";
4
- import { AssistantLanguageMenu as r } from "./AssistantLanguageMenu.js";
5
- import { useDropdownEscape as i } from "./useDropdownEscape.js";
6
- import { AssistantVoiceSelector as a } from "./composer/AssistantVoiceSelector.js";
7
- import { AssistantVoiceGraceSelector as o } from "./composer/AssistantVoiceGraceSelector.js";
8
- import { AssistantHandsFreeInterruptToggle as s } from "./composer/AssistantHandsFreeInterruptToggle.js";
9
- import { downloadFile as c, exportConversation as l } from "../exportConversation.js";
10
- import { useEffect as u, useRef as d, useState as f } from "react";
11
- import { Check as p, FileJson as m, FileText as h, MoreHorizontal as g, Play as _, Volume2 as v } from "lucide-react";
12
- import { Fragment as y, jsx as b, jsxs as x } from "react/jsx-runtime";
1
+ import { EscapeLayer as e } from "../../components/EscapeLayer.js";
2
+ import { useAssistantTr as t } from "../i18n.js";
3
+ import { useAssistantStore as n } from "../store.js";
4
+ import { useAssistantSpeech as r } from "./AssistantSpeechProvider.js";
5
+ import { AssistantLanguageMenu as i } from "./AssistantLanguageMenu.js";
6
+ import { useDropdownEscape as a } from "./useDropdownEscape.js";
7
+ import { AssistantVoiceSelector as o } from "./composer/AssistantVoiceSelector.js";
8
+ import { AssistantVoiceGraceSelector as s } from "./composer/AssistantVoiceGraceSelector.js";
9
+ import { AssistantHandsFreeInterruptToggle as c } from "./composer/AssistantHandsFreeInterruptToggle.js";
10
+ import { downloadFile as l, exportConversation as u } from "../exportConversation.js";
11
+ import { useEffect as d, useRef as f, useState as p } from "react";
12
+ import { Check as m, FileJson as h, FileText as g, MoreHorizontal as _, Play as v, Volume2 as y } from "lucide-react";
13
+ import { Fragment as b, jsx as x, jsxs as S } from "react/jsx-runtime";
13
14
  //#region src/shared/assistant/ui/AssistantMoreMenu.tsx
14
- var S = () => {
15
- let S = e(), [C, w] = f(!1), T = d(null), E = d(null), { conversations: D, activeConversationId: O, processingByConversationId: k } = t(), A = D.find((e) => e.id === O), j = !!(A && A.messages.length > 0), { isSupported: M, isBlocked: N, disabledReason: P, autoSpeakEnabled: F, setAutoSpeak: I, stop: L, previewVoice: R, activeVoiceName: z } = n(), B = N && !F;
16
- i(C, T, E, () => w(!1)), u(() => {
17
- if (!C) return;
15
+ var C = () => {
16
+ let C = t(), [w, T] = p(!1), E = f(null), D = f(null), { conversations: O, activeConversationId: k, processingByConversationId: A } = n(), j = O.find((e) => e.id === k), M = !!(j && j.messages.length > 0), { isSupported: N, isBlocked: P, disabledReason: F, autoSpeakEnabled: I, setAutoSpeak: L, stop: R, previewVoice: z, activeVoiceName: B } = r(), V = P && !I, H = a(D, () => T(!1));
17
+ d(() => {
18
+ if (!w) return;
18
19
  let e = (e) => {
19
20
  let t = e.target;
20
- T.current?.contains(t) || E.current?.contains(t) || w(!1);
21
+ E.current?.contains(t) || D.current?.contains(t) || T(!1);
21
22
  };
22
23
  return document.addEventListener("mousedown", e), () => {
23
24
  document.removeEventListener("mousedown", e);
24
25
  };
25
- }, [C]);
26
- let V = (e) => {
27
- if (!A) return;
28
- let { content: t, filename: n, mimeType: r } = l(A, e, {
29
- processing: k[A.id],
30
- tr: S
26
+ }, [w]);
27
+ let U = (e) => {
28
+ if (!j) return;
29
+ let { content: t, filename: n, mimeType: r } = u(j, e, {
30
+ processing: A[j.id],
31
+ tr: C
31
32
  });
32
- c(t, n, r), w(!1);
33
- }, H = () => {
34
- F && L(), I(!F);
35
- }, U = S("header.more", "More options");
36
- return /* @__PURE__ */ x("div", {
33
+ l(t, n, r), T(!1);
34
+ }, W = () => {
35
+ I && R(), L(!I);
36
+ }, G = C("header.more", "More options");
37
+ return /* @__PURE__ */ S("div", {
37
38
  className: "relative",
38
- children: [/* @__PURE__ */ b("button", {
39
- ref: E,
39
+ children: [/* @__PURE__ */ x("button", {
40
+ ref: D,
40
41
  type: "button",
41
- onClick: () => w((e) => !e),
42
+ onClick: () => T((e) => !e),
42
43
  className: "rounded p-1 transition-colors hover:bg-bg-elevated",
43
- "aria-label": U,
44
+ "aria-label": G,
44
45
  "aria-haspopup": "menu",
45
- "aria-expanded": C,
46
+ "aria-expanded": w,
46
47
  "data-testid": "assistant-more",
47
- children: /* @__PURE__ */ b(g, { className: "size-4 text-text-secondary" })
48
- }), C ? /* @__PURE__ */ x("div", {
49
- ref: T,
50
- role: "menu",
51
- "aria-label": U,
52
- className: "absolute right-0 top-full z-50 mt-1 min-w-56 overflow-hidden rounded-xl border border-border-default bg-bg-surface py-1 shadow-lg",
53
- "data-testid": "assistant-more-menu",
54
- children: [
55
- M ? /* @__PURE__ */ x("button", {
56
- type: "button",
57
- role: "menuitemcheckbox",
58
- "aria-checked": F,
59
- onClick: H,
60
- disabled: B,
61
- title: B ? P ?? void 0 : void 0,
62
- className: "flex w-full items-center gap-2.5 px-3 py-2 text-left text-xs text-text-primary transition-colors hover:bg-bg-elevated disabled:cursor-not-allowed disabled:text-text-muted disabled:hover:bg-transparent",
63
- "data-testid": "assistant-auto-speak",
64
- children: [
65
- /* @__PURE__ */ b(v, {
66
- className: "size-3.5 flex-shrink-0 text-text-secondary",
67
- "aria-hidden": "true"
68
- }),
69
- /* @__PURE__ */ b("span", {
70
- className: "flex-1",
71
- children: S("header.autoRead", "Auto-read replies")
72
- }),
73
- F ? /* @__PURE__ */ b(p, { className: "size-3.5 flex-shrink-0 text-action-primary-bg" }) : null
74
- ]
75
- }) : null,
76
- /* @__PURE__ */ b(r, {}),
77
- /* @__PURE__ */ x("div", {
78
- className: "flex items-center gap-1 px-3 py-1.5",
79
- "data-testid": "assistant-more-voice",
80
- children: [/* @__PURE__ */ b(a, {}), z ? /* @__PURE__ */ x("button", {
81
- type: "button",
82
- onClick: () => R(z),
83
- className: "flex items-center gap-1 rounded-md px-1.5 py-1 text-[11px] text-text-muted transition-colors hover:bg-bg-elevated hover:text-text-secondary focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong",
84
- "aria-label": S("voice.preview", "Hear this voice"),
85
- "data-testid": "assistant-voice-preview",
86
- children: [/* @__PURE__ */ b(_, {
87
- className: "size-3",
88
- "aria-hidden": "true"
89
- }), S("voice.previewShort", "Preview")]
90
- }) : null]
91
- }),
92
- /* @__PURE__ */ b(o, {}),
93
- /* @__PURE__ */ b(s, {}),
94
- j ? /* @__PURE__ */ x(y, { children: [
95
- /* @__PURE__ */ b("div", {
96
- className: "my-1 border-t border-border-subtle",
97
- role: "separator"
98
- }),
99
- /* @__PURE__ */ x("button", {
48
+ children: /* @__PURE__ */ x(_, { className: "size-4 text-text-secondary" })
49
+ }), w ? /* @__PURE__ */ x(e, {
50
+ ...H,
51
+ children: /* @__PURE__ */ S("div", {
52
+ ref: E,
53
+ role: "menu",
54
+ "aria-label": G,
55
+ className: "absolute right-0 top-full z-50 mt-1 min-w-56 overflow-hidden rounded-xl border border-border-default bg-bg-surface py-1 shadow-lg",
56
+ "data-testid": "assistant-more-menu",
57
+ children: [
58
+ N ? /* @__PURE__ */ S("button", {
100
59
  type: "button",
101
- role: "menuitem",
102
- onClick: () => V("json"),
103
- className: "flex w-full items-center gap-2.5 px-3 py-2 text-left text-xs text-text-primary transition-colors hover:bg-bg-elevated",
104
- "data-testid": "export-json",
105
- children: [/* @__PURE__ */ b(m, {
106
- className: "size-3.5 flex-shrink-0 text-text-secondary",
107
- "aria-hidden": "true"
108
- }), S("export.json", "Export as JSON")]
60
+ role: "menuitemcheckbox",
61
+ "aria-checked": I,
62
+ onClick: W,
63
+ disabled: V,
64
+ title: V ? F ?? void 0 : void 0,
65
+ className: "flex w-full items-center gap-2.5 px-3 py-2 text-left text-xs text-text-primary transition-colors hover:bg-bg-elevated disabled:cursor-not-allowed disabled:text-text-muted disabled:hover:bg-transparent",
66
+ "data-testid": "assistant-auto-speak",
67
+ children: [
68
+ /* @__PURE__ */ x(y, {
69
+ className: "size-3.5 flex-shrink-0 text-text-secondary",
70
+ "aria-hidden": "true"
71
+ }),
72
+ /* @__PURE__ */ x("span", {
73
+ className: "flex-1",
74
+ children: C("header.autoRead", "Auto-read replies")
75
+ }),
76
+ I ? /* @__PURE__ */ x(m, { className: "size-3.5 flex-shrink-0 text-action-primary-bg" }) : null
77
+ ]
78
+ }) : null,
79
+ /* @__PURE__ */ x(i, {}),
80
+ /* @__PURE__ */ S("div", {
81
+ className: "flex items-center gap-1 px-3 py-1.5",
82
+ "data-testid": "assistant-more-voice",
83
+ children: [/* @__PURE__ */ x(o, {}), B ? /* @__PURE__ */ S("button", {
84
+ type: "button",
85
+ onClick: () => z(B),
86
+ className: "flex items-center gap-1 rounded-md px-1.5 py-1 text-[11px] text-text-muted transition-colors hover:bg-bg-elevated hover:text-text-secondary focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong",
87
+ "aria-label": C("voice.preview", "Hear this voice"),
88
+ "data-testid": "assistant-voice-preview",
89
+ children: [/* @__PURE__ */ x(v, {
90
+ className: "size-3",
91
+ "aria-hidden": "true"
92
+ }), C("voice.previewShort", "Preview")]
93
+ }) : null]
109
94
  }),
110
- /* @__PURE__ */ x("button", {
111
- type: "button",
112
- role: "menuitem",
113
- onClick: () => V("markdown"),
114
- className: "flex w-full items-center gap-2.5 px-3 py-2 text-left text-xs text-text-primary transition-colors hover:bg-bg-elevated",
115
- "data-testid": "export-markdown",
116
- children: [/* @__PURE__ */ b(h, {
117
- className: "size-3.5 flex-shrink-0 text-text-secondary",
118
- "aria-hidden": "true"
119
- }), S("export.markdown", "Export as Markdown")]
120
- })
121
- ] }) : null
122
- ]
95
+ /* @__PURE__ */ x(s, {}),
96
+ /* @__PURE__ */ x(c, {}),
97
+ M ? /* @__PURE__ */ S(b, { children: [
98
+ /* @__PURE__ */ x("div", {
99
+ className: "my-1 border-t border-border-subtle",
100
+ role: "separator"
101
+ }),
102
+ /* @__PURE__ */ S("button", {
103
+ type: "button",
104
+ role: "menuitem",
105
+ onClick: () => U("json"),
106
+ className: "flex w-full items-center gap-2.5 px-3 py-2 text-left text-xs text-text-primary transition-colors hover:bg-bg-elevated",
107
+ "data-testid": "export-json",
108
+ children: [/* @__PURE__ */ x(h, {
109
+ className: "size-3.5 flex-shrink-0 text-text-secondary",
110
+ "aria-hidden": "true"
111
+ }), C("export.json", "Export as JSON")]
112
+ }),
113
+ /* @__PURE__ */ S("button", {
114
+ type: "button",
115
+ role: "menuitem",
116
+ onClick: () => U("markdown"),
117
+ className: "flex w-full items-center gap-2.5 px-3 py-2 text-left text-xs text-text-primary transition-colors hover:bg-bg-elevated",
118
+ "data-testid": "export-markdown",
119
+ children: [/* @__PURE__ */ x(g, {
120
+ className: "size-3.5 flex-shrink-0 text-text-secondary",
121
+ "aria-hidden": "true"
122
+ }), C("export.markdown", "Export as Markdown")]
123
+ })
124
+ ] }) : null
125
+ ]
126
+ })
123
127
  }) : null]
124
128
  });
125
129
  };
126
130
  //#endregion
127
- export { S as AssistantMoreMenu };
131
+ export { C as AssistantMoreMenu };
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantAttachmentButton.d.ts","sourceRoot":"","sources":["../../../../../src/shared/assistant/ui/composer/AssistantAttachmentButton.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,EAAE,EACR,MAAM,OAAO,CAAC;AAiBf,UAAU,KAAK;IACb,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1C;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IAC1B,wEAAwE;IACxE,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAoBD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,yBAAyB,EAAE,EAAE,CAAC,KAAK,CAuN/C,CAAC"}
1
+ {"version":3,"file":"AssistantAttachmentButton.d.ts","sourceRoot":"","sources":["../../../../../src/shared/assistant/ui/composer/AssistantAttachmentButton.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,EAAE,EACR,MAAM,OAAO,CAAC;AAef,UAAU,KAAK;IACb,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1C;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IAC1B,wEAAwE;IACxE,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAoBD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,yBAAyB,EAAE,EAAE,CAAC,KAAK,CA2M/C,CAAC"}