@burdenoff/fe-libs 2026.1007.4 → 2026.1007.6

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 (166) hide show
  1. package/dist/chrome/AutoBreadcrumbs.d.ts.map +1 -1
  2. package/dist/chrome/AutoBreadcrumbs.js +65 -76
  3. package/dist/chrome/Breadcrumb.d.ts.map +1 -1
  4. package/dist/chrome/Breadcrumbs.d.ts.map +1 -1
  5. package/dist/chrome/Breadcrumbs.js +47 -46
  6. package/dist/chrome/ContextSwitcher.js +86 -86
  7. package/dist/chrome/HeaderBar.d.ts.map +1 -1
  8. package/dist/chrome/HeaderBar.js +111 -107
  9. package/dist/chrome/HeaderThemeSwitcher.d.ts.map +1 -1
  10. package/dist/chrome/HeaderThemeSwitcher.js +46 -45
  11. package/dist/chrome/LanguageSwitcher.js +4 -4
  12. package/dist/chrome/MobileTabBar.js +4 -4
  13. package/dist/chrome/PageHeader.d.ts.map +1 -1
  14. package/dist/chrome/PageHeader.js +32 -30
  15. package/dist/chrome/PersonaSurfaceControls.js +8 -8
  16. package/dist/chrome/ProductSideNav.js +6 -6
  17. package/dist/chrome/ProfileSwitcher.d.ts.map +1 -1
  18. package/dist/chrome/ProfileSwitcher.js +89 -88
  19. package/dist/chrome/SideNavigation.js +4 -4
  20. package/dist/chrome/Tabs.d.ts.map +1 -1
  21. package/dist/chrome/Tabs.js +30 -29
  22. package/dist/chrome/breadcrumbLabel.d.ts +10 -0
  23. package/dist/chrome/breadcrumbLabel.d.ts.map +1 -0
  24. package/dist/chrome/breadcrumbLabel.js +31 -0
  25. package/dist/chrome/contextSwitcher/TriggerButton.d.ts.map +1 -1
  26. package/dist/chrome/contextSwitcher/TriggerButton.js +40 -36
  27. package/dist/chrome/notificationCenter/BellButton.d.ts.map +1 -1
  28. package/dist/chrome/notificationCenter/BellButton.js +29 -25
  29. package/dist/chrome/shellLabelManifest.d.ts +27 -0
  30. package/dist/chrome/shellLabelManifest.d.ts.map +1 -0
  31. package/dist/chrome/sideNavigation/SidebarHeader.d.ts.map +1 -1
  32. package/dist/chrome/sideNavigation/SidebarHeader.js +23 -22
  33. package/dist/shared/assistant/api.d.ts +11 -0
  34. package/dist/shared/assistant/api.d.ts.map +1 -1
  35. package/dist/shared/assistant/api.js +6 -2
  36. package/dist/shared/assistant/appControls/languageReply.d.ts +6 -1
  37. package/dist/shared/assistant/appControls/languageReply.d.ts.map +1 -1
  38. package/dist/shared/assistant/conversation.d.ts +14 -0
  39. package/dist/shared/assistant/conversation.d.ts.map +1 -1
  40. package/dist/shared/assistant/createSandboxAssistantTransport.d.ts +8 -1
  41. package/dist/shared/assistant/createSandboxAssistantTransport.d.ts.map +1 -1
  42. package/dist/shared/assistant/createSandboxAssistantTransport.js +70 -51
  43. package/dist/shared/assistant/history/historyMapping.d.ts.map +1 -1
  44. package/dist/shared/assistant/history/historyMapping.js +19 -12
  45. package/dist/shared/assistant/i18nManifest.d.ts +26 -5
  46. package/dist/shared/assistant/i18nManifest.d.ts.map +1 -1
  47. package/dist/shared/assistant/i18nManifest.js +36 -22
  48. package/dist/shared/assistant/index.d.ts +7 -0
  49. package/dist/shared/assistant/index.d.ts.map +1 -1
  50. package/dist/shared/assistant/localUiCommandCopy.d.ts +23 -0
  51. package/dist/shared/assistant/localUiCommandCopy.d.ts.map +1 -1
  52. package/dist/shared/assistant/localUiCommandCopy.js +60 -23
  53. package/dist/shared/assistant/localUiCommands.d.ts +29 -0
  54. package/dist/shared/assistant/localUiCommands.d.ts.map +1 -1
  55. package/dist/shared/assistant/localUiCommands.js +18 -7
  56. package/dist/shared/assistant/productCopy.d.ts +78 -0
  57. package/dist/shared/assistant/productCopy.d.ts.map +1 -0
  58. package/dist/shared/assistant/productCopy.js +45 -0
  59. package/dist/shared/assistant/types.d.ts +19 -8
  60. package/dist/shared/assistant/types.d.ts.map +1 -1
  61. package/dist/shared/assistant/ui/AssistantChatArea.d.ts.map +1 -1
  62. package/dist/shared/assistant/ui/AssistantChatArea.js +1479 -1140
  63. package/dist/shared/assistant/ui/AssistantEmptyState.d.ts.map +1 -1
  64. package/dist/shared/assistant/ui/AssistantEmptyState.js +30 -22
  65. package/dist/shared/assistant/ui/AssistantHeader.d.ts.map +1 -1
  66. package/dist/shared/assistant/ui/AssistantHeader.js +46 -45
  67. package/dist/shared/assistant/ui/AssistantMarkdownRenderer.d.ts +18 -3
  68. package/dist/shared/assistant/ui/AssistantMarkdownRenderer.d.ts.map +1 -1
  69. package/dist/shared/assistant/ui/AssistantMarkdownRenderer.js +1 -1
  70. package/dist/shared/assistant/ui/AssistantMessageItem.d.ts +5 -0
  71. package/dist/shared/assistant/ui/AssistantMessageItem.d.ts.map +1 -1
  72. package/dist/shared/assistant/ui/AssistantMessageItem.js +89 -84
  73. package/dist/shared/assistant/ui/AssistantMessageList.d.ts +5 -0
  74. package/dist/shared/assistant/ui/AssistantMessageList.d.ts.map +1 -1
  75. package/dist/shared/assistant/ui/AssistantMessageList.js +26 -25
  76. package/dist/shared/assistant/ui/AssistantUiOfferLink.d.ts +45 -0
  77. package/dist/shared/assistant/ui/AssistantUiOfferLink.d.ts.map +1 -0
  78. package/dist/shared/assistant/ui/AssistantUiOfferLink.js +56 -0
  79. package/dist/shared/assistant/ui/assistantOverlayState.d.ts +9 -0
  80. package/dist/shared/assistant/ui/assistantOverlayState.d.ts.map +1 -1
  81. package/dist/shared/assistant/ui/assistantOverlayState.js +37 -28
  82. package/dist/shared/assistant/ui/composer/AssistantConnectSourceItem.d.ts.map +1 -1
  83. package/dist/shared/assistant/ui/composer/AssistantConnectSourceItem.js +1 -1
  84. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.d.ts +5 -0
  85. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.d.ts.map +1 -1
  86. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.js +12 -11
  87. package/dist/shared/assistant/ui/voice/VoiceConversationView.d.ts +6 -1
  88. package/dist/shared/assistant/ui/voice/VoiceConversationView.d.ts.map +1 -1
  89. package/dist/shared/assistant/ui/voice/VoiceConversationView.js +7 -7
  90. package/dist/shared/assistant/ui/voice/VoiceTranscriptDrawer.d.ts +6 -1
  91. package/dist/shared/assistant/ui/voice/VoiceTranscriptDrawer.d.ts.map +1 -1
  92. package/dist/shared/assistant/ui/voice/VoiceTranscriptDrawer.js +15 -12
  93. package/dist/shared/assistant/uiActions/actOnResolve.d.ts +108 -0
  94. package/dist/shared/assistant/uiActions/actOnResolve.d.ts.map +1 -0
  95. package/dist/shared/assistant/uiActions/actOnResolve.js +51 -0
  96. package/dist/shared/assistant/uiActions/linkContext.d.ts +29 -0
  97. package/dist/shared/assistant/uiActions/linkContext.d.ts.map +1 -1
  98. package/dist/shared/assistant/uiActions/linkContext.js +37 -10
  99. package/dist/shared/assistant/uiActions/navIntent.d.ts +58 -0
  100. package/dist/shared/assistant/uiActions/navIntent.d.ts.map +1 -0
  101. package/dist/shared/assistant/uiActions/navIntent.js +79 -0
  102. package/dist/shared/assistant/uiActions/navigateAction.d.ts +6 -1
  103. package/dist/shared/assistant/uiActions/navigateAction.d.ts.map +1 -1
  104. package/dist/shared/assistant/uiActions/navigateAction.js +18 -14
  105. package/dist/shared/assistant/uiActions/navigationOutcome.d.ts +16 -2
  106. package/dist/shared/assistant/uiActions/navigationOutcome.d.ts.map +1 -1
  107. package/dist/shared/assistant/uiActions/navigationOutcome.js +6 -2
  108. package/dist/shared/assistant/uiActions/offerYesOnSurface.d.ts +39 -0
  109. package/dist/shared/assistant/uiActions/offerYesOnSurface.d.ts.map +1 -0
  110. package/dist/shared/assistant/uiActions/offerYesOnSurface.js +34 -0
  111. package/dist/shared/assistant/uiActions/uiCatalogue.d.ts +14 -0
  112. package/dist/shared/assistant/uiActions/uiCatalogue.d.ts.map +1 -1
  113. package/dist/shared/assistant/uiActions/uiCatalogue.js +23 -3
  114. package/dist/shared/assistant/uiActions/uiOffers.d.ts +249 -0
  115. package/dist/shared/assistant/uiActions/uiOffers.d.ts.map +1 -0
  116. package/dist/shared/assistant/uiActions/uiOffers.js +195 -0
  117. package/dist/shared/assistant/writeProposals.d.ts +6 -0
  118. package/dist/shared/assistant/writeProposals.d.ts.map +1 -1
  119. package/dist/shared/assistant/writeReplyBinder.d.ts +40 -0
  120. package/dist/shared/assistant/writeReplyBinder.d.ts.map +1 -1
  121. package/dist/shared/assistant/writeReplyBinder.js +100 -83
  122. package/dist/shared/assistant/writeReplySend.d.ts +14 -0
  123. package/dist/shared/assistant/writeReplySend.d.ts.map +1 -1
  124. package/dist/shared/assistant/writeReplySend.js +32 -29
  125. package/dist/shared/components/ContextConversationWidget.js +1 -1
  126. package/dist/shared/events/sinks/RybbitSink.d.ts.map +1 -1
  127. package/dist/shared/events/sinks/RybbitSink.js +66 -69
  128. package/dist/shared/hooks/index.d.ts +2 -0
  129. package/dist/shared/hooks/index.d.ts.map +1 -1
  130. package/dist/shared/navigation/unsavedChanges.d.ts +83 -0
  131. package/dist/shared/navigation/unsavedChanges.d.ts.map +1 -0
  132. package/dist/shared/navigation/unsavedChanges.js +46 -0
  133. package/dist/shared/providers/AppShellProvider.d.ts +17 -0
  134. package/dist/shared/providers/AppShellProvider.d.ts.map +1 -1
  135. package/dist/shared/providers/AppShellProvider.js +188 -180
  136. package/dist/shared/providers/shell/I18nProvider.d.ts +92 -4
  137. package/dist/shared/providers/shell/I18nProvider.d.ts.map +1 -1
  138. package/dist/shared/providers/shell/I18nProvider.js +187 -79
  139. package/dist/shared/providers/shell/ProfileI18nBridge.d.ts +18 -2
  140. package/dist/shared/providers/shell/ProfileI18nBridge.d.ts.map +1 -1
  141. package/dist/shared/providers/shell/ProfileI18nBridge.js +55 -41
  142. package/dist/shared/providers/shell/directionMode.d.ts +25 -0
  143. package/dist/shared/providers/shell/directionMode.d.ts.map +1 -0
  144. package/dist/shared/providers/shell/directionMode.js +34 -0
  145. package/dist/shared/providers/shell/index.d.ts +4 -2
  146. package/dist/shared/providers/shell/index.d.ts.map +1 -1
  147. package/dist/shared/providers/shell/translationLayers.d.ts +30 -0
  148. package/dist/shared/providers/shell/translationLayers.d.ts.map +1 -0
  149. package/dist/shared/providers/shell/translationLayers.js +35 -0
  150. package/dist/shared/providers/shell/translationStore.d.ts +55 -0
  151. package/dist/shared/providers/shell/translationStore.d.ts.map +1 -0
  152. package/dist/shared/providers/shell/translationStore.js +100 -0
  153. package/dist/shared/providers/shell/useShellLabel.d.ts +13 -1
  154. package/dist/shared/providers/shell/useShellLabel.d.ts.map +1 -1
  155. package/dist/shared/providers/shell/useShellLabel.js +10 -9
  156. package/dist/shared-assistant.js +244 -237
  157. package/dist/shared-hooks.js +10 -9
  158. package/dist/shared-providers-shell.js +20 -19
  159. package/dist/shared.js +20 -19
  160. package/dist/ui/boff-ui2.d.ts.map +1 -1
  161. package/dist/ui/cta-overflow-menu.d.ts.map +1 -1
  162. package/dist/ui/cta-overflow-menu.js +20 -18
  163. package/dist/ui/guidance.d.ts +1 -1
  164. package/dist/ui/guidance.d.ts.map +1 -1
  165. package/dist/ui/guidance.js +53 -52
  166. package/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantEmptyState.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantEmptyState.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAEhC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAMtE,UAAU,KAAK;IACb,IAAI,EAAE,aAAa,CAAC;IACpB;;;OAGG;IACH,iBAAiB,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC;IAC1E;;;OAGG;IACH,WAAW,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IACxC;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAAC,KAAK,CA8FzC,CAAC"}
1
+ {"version":3,"file":"AssistantEmptyState.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantEmptyState.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAEhC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC;AAWxB,UAAU,KAAK;IACb,IAAI,EAAE,aAAa,CAAC;IACpB;;;OAGG;IACH,iBAAiB,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC;IAC1E;;;OAGG;IACH,WAAW,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IACxC;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAAC,KAAK,CAqHzC,CAAC"}
@@ -1,48 +1,56 @@
1
1
  import { resolveModeConfig as e, useAssistantPageLabel as t, useAssistantProduct as n } from "../product.js";
2
2
  import { useAssistantTr as r } from "../i18n.js";
3
- import { hasConnectSource as i, useAssistantConnectSource as a } from "./composer/connectSource.js";
4
- import { AssistantConnectSourceItem as o } from "./composer/AssistantConnectSourceItem.js";
5
- import { Sparkles as s } from "lucide-react";
6
- import { jsx as c, jsxs as l } from "react/jsx-runtime";
3
+ import { AUTO_READ_MODE as i, AUTO_WRITE_MODE as a } from "../autoRouting.js";
4
+ import { assistantPageLabelKey as o, assistantSuggestionKey as s, translateProductCopy as c } from "../productCopy.js";
5
+ import { hasConnectSource as l, useAssistantConnectSource as u } from "./composer/connectSource.js";
6
+ import { AssistantConnectSourceItem as d } from "./composer/AssistantConnectSourceItem.js";
7
+ import { Sparkles as f } from "lucide-react";
8
+ import { jsx as p, jsxs as m } from "react/jsx-runtime";
7
9
  //#region src/shared/assistant/ui/AssistantEmptyState.tsx
8
- var u = ({ mode: u, onSuggestionClick: d, suggestions: f, explainsAuto: p = !1 }) => {
9
- let m = r(), { modes: h } = n(), g = e(h, u), _ = t(), v = f ?? (g?.suggestions.slice(0, 4) ?? []).map((e) => ({ text: e })), y = i(a());
10
- return /* @__PURE__ */ l("div", {
10
+ var h = ({ mode: h, onSuggestionClick: g, suggestions: _, explainsAuto: v = !1 }) => {
11
+ let y = r(), { modes: b } = n(), x = e(b, h), S = t(), C = (_ ?? (x?.suggestions.slice(0, 4) ?? []).map((e) => ({ text: e }))).map((e) => {
12
+ let t = e.intent === "act" ? a : e.intent === "read" ? i : x?.id ?? h;
13
+ return {
14
+ ...e,
15
+ display: c(y, s(t, e.text), e.text)
16
+ };
17
+ }), w = S ? c(y, o(S), S) : null, T = l(u());
18
+ return /* @__PURE__ */ m("div", {
11
19
  className: "flex flex-1 flex-col items-center justify-center overflow-y-auto px-6 py-8 text-center",
12
20
  children: [
13
- /* @__PURE__ */ c("div", {
21
+ /* @__PURE__ */ p("div", {
14
22
  className: "flex size-12 items-center justify-center rounded-2xl bg-gradient-to-br from-action-primary-bg/25 to-action-primary-bg/5 text-action-primary-bg shadow-sm",
15
- children: /* @__PURE__ */ c(s, { className: "size-6" })
23
+ children: /* @__PURE__ */ p(f, { className: "size-6" })
16
24
  }),
17
- /* @__PURE__ */ c("h2", {
25
+ /* @__PURE__ */ p("h2", {
18
26
  className: "mt-5 text-2xl font-semibold leading-tight tracking-tight text-text-primary",
19
- children: m("empty.title", "How can I help?")
27
+ children: y("empty.title", "How can I help?")
20
28
  }),
21
- /* @__PURE__ */ c("p", {
29
+ /* @__PURE__ */ p("p", {
22
30
  className: "mt-2 max-w-[16rem] text-[13px] leading-relaxed text-text-muted",
23
- children: _ ? m("empty.subtitle", "You're viewing {{page}}. Ask about it, or pick a suggestion below.", { page: _ }) : m("empty.subtitleNoPage", "Ask me anything, or pick a suggestion below.")
31
+ children: w ? y("empty.subtitle", "You're viewing {{page}}. Ask about it, or pick a suggestion below.", { page: w }) : y("empty.subtitleNoPage", "Ask me anything, or pick a suggestion below.")
24
32
  }),
25
- p ? /* @__PURE__ */ c("p", {
33
+ v ? /* @__PURE__ */ p("p", {
26
34
  className: "mt-2 max-w-[18rem] text-[12px] leading-relaxed text-text-muted",
27
35
  "data-testid": "assistant-auto-explainer",
28
- children: m("modeSelector.autoHint", "Answers your questions, and proposes changes for you to approve")
36
+ children: y("modeSelector.autoHint", "Answers your questions, and proposes changes for you to approve")
29
37
  }) : null,
30
- /* @__PURE__ */ c("div", {
38
+ /* @__PURE__ */ p("div", {
31
39
  className: "mt-6 flex flex-wrap items-center justify-center gap-2",
32
- children: v.map((e) => /* @__PURE__ */ c("button", {
40
+ children: C.map((e) => /* @__PURE__ */ p("button", {
33
41
  type: "button",
34
- onClick: () => d(e.text, e.intent),
42
+ onClick: () => g(e.display, e.intent),
35
43
  className: "rounded-full border border-border-subtle bg-bg-surface px-3.5 py-2 text-[13px] leading-tight text-text-primary shadow-sm transition-[color,background-color,border-color,box-shadow] hover:border-action-primary-bg/40 hover:bg-bg-elevated hover:shadow-md",
36
44
  "data-testid": "assistant-suggestion",
37
- children: e.text
45
+ children: e.display
38
46
  }, e.text))
39
47
  }),
40
- y ? /* @__PURE__ */ c("div", {
48
+ T ? /* @__PURE__ */ p("div", {
41
49
  className: "mt-5",
42
- children: /* @__PURE__ */ c(o, { presentation: "action" })
50
+ children: /* @__PURE__ */ p(d, { presentation: "action" })
43
51
  }) : null
44
52
  ]
45
53
  });
46
54
  };
47
55
  //#endregion
48
- export { u as AssistantEmptyState };
56
+ export { h as AssistantEmptyState };
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantHeader.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAehC,UAAU,KAAK;IACb,qEAAqE;IACrE;;;;;;;OAOG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,gFAAgF;IAChF,WAAW,EAAE,OAAO,CAAC;IACrB;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,KAAK,CA+IrC,CAAC"}
1
+ {"version":3,"file":"AssistantHeader.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAgBhC,UAAU,KAAK;IACb,qEAAqE;IACrE;;;;;;;OAOG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,gFAAgF;IAChF,WAAW,EAAE,OAAO,CAAC;IACrB;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,KAAK,CAqJrC,CAAC"}
@@ -1,82 +1,83 @@
1
1
  import { useAssistantTr as e } from "../i18n.js";
2
- import { useAssistantPreview as t } from "../preview/context.js";
3
- import { hasAssistantPreviewSurface as n } from "../preview/types.js";
4
- import { AssistantMoreMenu as r } from "./AssistantMoreMenu.js";
5
- import { Eye as i, History as a, PanelBottom as o, PanelRight as s, Plus as c, Sparkles as l, X as u } from "lucide-react";
6
- import { Fragment as d, jsx as f, jsxs as p } from "react/jsx-runtime";
2
+ import { assistantPageLabelKey as t, translateProductCopy as n } from "../productCopy.js";
3
+ import { useAssistantPreview as r } from "../preview/context.js";
4
+ import { hasAssistantPreviewSurface as i } from "../preview/types.js";
5
+ import { AssistantMoreMenu as a } from "./AssistantMoreMenu.js";
6
+ import { Eye as o, History as s, PanelBottom as c, PanelRight as l, Plus as u, Sparkles as d, X as f } from "lucide-react";
7
+ import { Fragment as p, jsx as m, jsxs as h } from "react/jsx-runtime";
7
8
  //#region src/shared/assistant/ui/AssistantHeader.tsx
8
- var m = ({ contextLabel: m, onNewConversation: h, onOpenHistory: g, historyOpen: _, onTogglePreview: v, previewOpen: y, onClose: b, docked: x, onToggleDock: S }) => {
9
- let C = e(), w = t();
10
- return /* @__PURE__ */ p("div", {
9
+ var g = ({ contextLabel: g, onNewConversation: _, onOpenHistory: v, historyOpen: y, onTogglePreview: b, previewOpen: x, onClose: S, docked: C, onToggleDock: w }) => {
10
+ let T = e(), E = r();
11
+ return /* @__PURE__ */ h("div", {
11
12
  className: "flex items-center gap-2 border-b border-border-default bg-bg-elevated px-3 py-2.5",
12
- children: [/* @__PURE__ */ p("div", {
13
+ children: [/* @__PURE__ */ h("div", {
13
14
  className: "flex min-w-0 flex-1 items-center gap-2",
14
- children: [/* @__PURE__ */ f("span", {
15
+ children: [/* @__PURE__ */ m("span", {
15
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",
16
- children: /* @__PURE__ */ f(l, { className: "size-4" })
17
- }), /* @__PURE__ */ p("span", {
17
+ children: /* @__PURE__ */ m(d, { className: "size-4" })
18
+ }), /* @__PURE__ */ h("span", {
18
19
  className: "min-w-0 flex-1",
19
- children: [/* @__PURE__ */ f("span", {
20
+ children: [/* @__PURE__ */ m("span", {
20
21
  className: "block truncate text-[14px] font-semibold leading-tight text-text-primary",
21
- children: C("header.title", "AI Assistant")
22
- }), /* @__PURE__ */ p("span", {
22
+ children: T("header.title", "AI Assistant")
23
+ }), /* @__PURE__ */ h("span", {
23
24
  className: "block truncate text-[11px] leading-tight text-text-muted",
24
- children: [C("header.ready", "Ready"), m && /* @__PURE__ */ p(d, { children: [/* @__PURE__ */ f("span", {
25
+ children: [T("header.ready", "Ready"), g && /* @__PURE__ */ h(p, { children: [/* @__PURE__ */ m("span", {
25
26
  "aria-hidden": "true",
26
27
  children: " · "
27
- }), C("header.context", "Context: {{page}}", { page: m })] })]
28
+ }), T("header.context", "Context: {{page}}", { page: n(T, t(g), g) })] })]
28
29
  })]
29
30
  })]
30
- }), /* @__PURE__ */ p("div", {
31
+ }), /* @__PURE__ */ h("div", {
31
32
  className: "flex flex-shrink-0 items-center gap-0.5",
32
33
  children: [
33
- /* @__PURE__ */ f("button", {
34
+ /* @__PURE__ */ m("button", {
34
35
  type: "button",
35
- onClick: h,
36
+ onClick: _,
36
37
  className: "rounded-lg p-1.5 text-text-secondary transition-colors hover:bg-bg-sunken hover:text-text-primary",
37
- "aria-label": C("header.newConversation", "New conversation"),
38
+ "aria-label": T("header.newConversation", "New conversation"),
38
39
  "data-testid": "assistant-new-conversation",
39
- children: /* @__PURE__ */ f(c, { className: "size-4" })
40
+ children: /* @__PURE__ */ m(u, { className: "size-4" })
40
41
  }),
41
- /* @__PURE__ */ f("button", {
42
+ /* @__PURE__ */ m("button", {
42
43
  type: "button",
43
- onClick: g,
44
- className: `rounded-lg p-1.5 transition-colors ${_ ? "bg-action-primary-bg/15 text-action-primary-bg" : "text-text-secondary hover:bg-bg-sunken hover:text-text-primary"}`,
45
- "aria-label": C("header.history", "Conversation history"),
46
- "aria-pressed": _,
44
+ onClick: v,
45
+ className: `rounded-lg p-1.5 transition-colors ${y ? "bg-action-primary-bg/15 text-action-primary-bg" : "text-text-secondary hover:bg-bg-sunken hover:text-text-primary"}`,
46
+ "aria-label": T("header.history", "Conversation history"),
47
+ "aria-pressed": y,
47
48
  "data-testid": "assistant-open-history",
48
- children: /* @__PURE__ */ f(a, { className: "size-4" })
49
+ children: /* @__PURE__ */ m(s, { className: "size-4" })
49
50
  }),
50
- n(w) && v && /* @__PURE__ */ f("button", {
51
+ i(E) && b && /* @__PURE__ */ m("button", {
51
52
  type: "button",
52
- onClick: v,
53
- className: `rounded-lg p-1.5 transition-colors ${y ? "bg-action-primary-bg/15 text-action-primary-bg" : "text-text-secondary hover:bg-bg-sunken hover:text-text-primary"}`,
54
- "aria-label": w.label ?? C("header.preview", "Preview"),
55
- "aria-pressed": !!y,
53
+ onClick: b,
54
+ className: `rounded-lg p-1.5 transition-colors ${x ? "bg-action-primary-bg/15 text-action-primary-bg" : "text-text-secondary hover:bg-bg-sunken hover:text-text-primary"}`,
55
+ "aria-label": E.label ?? T("header.preview", "Preview"),
56
+ "aria-pressed": !!x,
56
57
  "data-testid": "assistant-toggle-preview",
57
- children: /* @__PURE__ */ f(i, { className: "size-4" })
58
+ children: /* @__PURE__ */ m(o, { className: "size-4" })
58
59
  }),
59
- /* @__PURE__ */ f(r, {}),
60
- S && /* @__PURE__ */ f("button", {
60
+ /* @__PURE__ */ m(a, {}),
61
+ w && /* @__PURE__ */ m("button", {
61
62
  type: "button",
62
- onClick: S,
63
+ onClick: w,
63
64
  className: "hidden rounded-lg p-1.5 text-text-secondary transition-colors hover:bg-bg-sunken hover:text-text-primary sm:inline-flex",
64
- "aria-label": x ? C("header.float", "Float chat window") : C("header.dock", "Dock to side panel"),
65
- "aria-pressed": x,
65
+ "aria-label": C ? T("header.float", "Float chat window") : T("header.dock", "Dock to side panel"),
66
+ "aria-pressed": C,
66
67
  "data-testid": "assistant-toggle-dock",
67
- children: f(x ? o : s, { className: "size-4" })
68
+ children: m(C ? c : l, { className: "size-4" })
68
69
  }),
69
- /* @__PURE__ */ f("button", {
70
+ /* @__PURE__ */ m("button", {
70
71
  type: "button",
71
- onClick: b,
72
+ onClick: S,
72
73
  className: "rounded-lg p-1.5 text-text-secondary transition-colors hover:bg-bg-sunken hover:text-text-primary",
73
- "aria-label": C("header.close", "Close assistant"),
74
+ "aria-label": T("header.close", "Close assistant"),
74
75
  "data-testid": "assistant-close",
75
- children: /* @__PURE__ */ f(u, { className: "size-4" })
76
+ children: /* @__PURE__ */ m(f, { className: "size-4" })
76
77
  })
77
78
  ]
78
79
  })]
79
80
  });
80
81
  };
81
82
  //#endregion
82
- export { m as AssistantHeader };
83
+ export { g as AssistantHeader };
@@ -1,5 +1,6 @@
1
1
  import { FC, MouseEvent, ReactNode } from 'react';
2
2
  import { assistantRoutePath, assistantUrlTransform, classifyAssistantHref, AssistantLinkKind } from '../uiActions/assistantHref';
3
+ import { NavigationInitiator, UnsavedChange } from '../../navigation/unsavedChanges';
3
4
  interface Props {
4
5
  content: string;
5
6
  }
@@ -18,15 +19,29 @@ export type AssistantNavigateResult =
18
19
  /** A shell-less target: opened in a new tab, which cannot be verified. */
19
20
  | {
20
21
  kind: "new-tab";
21
- } | {
22
+ }
23
+ /**
24
+ * ★ BOFF-8060 (N4): not routed. `unsaved-changes` names what is unsaved, for
25
+ * the "You have unsaved changes in {label}" reply.
26
+ */
27
+ | {
22
28
  kind: "refused";
23
29
  reason: "unsaved-changes" | "not-routable";
30
+ unsaved?: readonly UnsavedChange[];
24
31
  };
32
+ /**
33
+ * ★ BOFF-8060 (N4): who started this navigation. The person's own (a link they
34
+ * clicked in a reply) is at sidebar parity; the assistant's (a typed or spoken
35
+ * command, a "yes", act-on-resolve) is refused while the page holds unsaved
36
+ * changes. A navigator that does not say is treated as the assistant's.
37
+ */
38
+ export type AssistantNavigateInitiator = NavigationInitiator;
25
39
  /**
26
40
  * Route an in-app PATH — `/fields?crop=42#yield`, never a full URL. Supplied by
27
- * the product; absent means "no SPA routing".
41
+ * the product; absent means "no SPA routing". A product navigator may ignore
42
+ * `initiator`; `createAssistantNavigate` reads it.
28
43
  */
29
- export type AssistantNavigate = (path: string) => AssistantNavigateResult | void;
44
+ export type AssistantNavigate = (path: string, initiator?: AssistantNavigateInitiator) => AssistantNavigateResult | void;
30
45
  /**
31
46
  * ★★ The cases where the BROWSER must win, not the router. Losing these is how
32
47
  * "open in new tab", "copy link" and middle-click quietly stop working — the
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantMarkdownRenderer.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantMarkdownRenderer.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EAIL,KAAK,EAAE,EACP,KAAK,UAAU,EACf,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAYf,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,EACrB,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AAEpC,UAAU,KAAK;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAsCD,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,CAAC;AAC5E,YAAY,EAAE,iBAAiB,EAAE,CAAC;AAElC;;;;GAIG;AACH,MAAM,MAAM,uBAAuB;AACjC,6DAA6D;AAC3D;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE;AACpB,0EAA0E;GACxE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,iBAAiB,GAAG,cAAc,CAAA;CAAE,CAAC;AAEpE;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,uBAAuB,GAAG,IAAI,CAAC;AAEjF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,CAAC,iBAAiB,CAAC,GAAG,OAAO,CASjF;AAID;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,EAAE,EAAE,CAAC;IACzC,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,EAAE,SAAS,CAAC;CACrB,CAIA,CAAC;AAEF,wBAAgB,oBAAoB,IAAI,iBAAiB,GAAG,IAAI,CAE/D;AAuTD,eAAO,MAAM,yBAAyB,EAAE,EAAE,CAAC,KAAK,CAiB/C,CAAC"}
1
+ {"version":3,"file":"AssistantMarkdownRenderer.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantMarkdownRenderer.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EAIL,KAAK,EAAE,EACP,KAAK,UAAU,EACf,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAYf,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,EACrB,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACd,MAAM,iCAAiC,CAAC;AAEzC,UAAU,KAAK;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAsCD,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,CAAC;AAC5E,YAAY,EAAE,iBAAiB,EAAE,CAAC;AAElC;;;;GAIG;AACH,MAAM,MAAM,uBAAuB;AACjC,6DAA6D;AAC3D;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE;AACpB,0EAA0E;GACxE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE;AACrB;;;GAGG;GACD;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,iBAAiB,GAAG,cAAc,CAAC;IAC3C,OAAO,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;CACpC,CAAC;AAEN;;;;;GAKG;AACH,MAAM,MAAM,0BAA0B,GAAG,mBAAmB,CAAC;AAE7D;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAC9B,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,0BAA0B,KACnC,uBAAuB,GAAG,IAAI,CAAC;AAEpC;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,CAAC,iBAAiB,CAAC,GAAG,OAAO,CASjF;AAID;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,EAAE,EAAE,CAAC;IACzC,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,EAAE,SAAS,CAAC;CACrB,CAIA,CAAC;AAEF,wBAAgB,oBAAoB,IAAI,iBAAiB,GAAG,IAAI,CAE/D;AAwTD,eAAO,MAAM,yBAAyB,EAAE,EAAE,CAAC,KAAK,CAiB/C,CAAC"}
@@ -34,7 +34,7 @@ var C = "text-action-primary-bg underline-offset-2 hover:underline", w = ({ href
34
34
  className: C,
35
35
  "data-testid": "assistant-markdown-link",
36
36
  onClick: (e) => {
37
- y(e) || (e.preventDefault(), n(i));
37
+ y(e) || (e.preventDefault(), n(i, "person"));
38
38
  },
39
39
  children: t
40
40
  }) : r === "internal" || r === "fragment" ? /* @__PURE__ */ g("a", {
@@ -60,6 +60,11 @@ interface Props {
60
60
  legacyWriteCardHidden?: boolean;
61
61
  /** ★ BOFF-7803 5a (FE7): this reply's write-proposal cards, if any. */
62
62
  writeProposals?: ReactNode;
63
+ /**
64
+ * ★ BOFF-8060 (N3): the page the model offered, as an "Open {page}" link,
65
+ * drawn directly under the reply's text. Absent, nothing is drawn.
66
+ */
67
+ uiOffers?: ReactNode;
63
68
  }
64
69
  /**
65
70
  * Purely decorative "still typing" caret: hidden from assistive tech (the list's
@@ -1 +1 @@
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
+ {"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;IAC3B;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAyCD;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,EAAE,EAY5B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,EAAE,CAAC,KAAK,CA4X1C,CAAC"}
@@ -8,103 +8,107 @@ import { AssistantMarkdownRenderer as a } from "./AssistantMarkdownRenderer.js";
8
8
  import { downloadAssistantArtifact as o } from "../api.js";
9
9
  import { languageConfirmationCopy as s } from "../appControls/languageReply.js";
10
10
  import { getAssistantDisplayContent as ee } from "../displayContent.js";
11
- import { AssistantToolActivity as te, parseToolActivity as ne } from "./AssistantToolActivity.js";
12
- import { usePrefersReducedMotion as c } from "./usePrefersReducedMotion.js";
13
- import { AssistantAvatar as re } from "./AssistantAvatar.js";
14
- import { useAssistantSpeech as l } from "./AssistantSpeechProvider.js";
11
+ import { AssistantToolActivity as te, parseToolActivity as c } from "./AssistantToolActivity.js";
12
+ import { usePrefersReducedMotion as l } from "./usePrefersReducedMotion.js";
13
+ import { AssistantAvatar as ne } from "./AssistantAvatar.js";
14
+ import { useAssistantSpeech as re } from "./AssistantSpeechProvider.js";
15
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";
16
+ import { AssistantPendingWriteCard as ae } from "./AssistantPendingWriteCard.js";
17
+ import { AssistantSpeakButton as oe } from "./AssistantSpeakButton.js";
18
+ import { SaveToFilesButton as u } from "../../../storage/SaveToFilesButton.js";
19
19
  import "../../../storage/index.js";
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";
20
+ import { AssistantTurnActivity as se } from "./AssistantTurnActivity.js";
21
+ import { useMemo as d, useRef as f, useState as p } from "react";
22
+ import { Check as ce, Copy as m, RotateCcw as h } from "lucide-react";
23
+ import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
24
24
  //#region src/shared/assistant/ui/AssistantMessageItem.tsx
25
- function b(e) {
25
+ function le(e) {
26
26
  return e.role === "assistant" ? e.metadata : void 0;
27
27
  }
28
- function ce(e) {
28
+ function y(e) {
29
29
  return e?.artifacts ?? [];
30
30
  }
31
- function x(e) {
31
+ function b(e) {
32
32
  return window.atob(e);
33
33
  }
34
- function S(e, t, n) {
35
- let r = x(e), i = new Uint8Array(r.length);
34
+ function x(e, t, n) {
35
+ let r = b(e), i = new Uint8Array(r.length);
36
36
  for (let e = 0; e < r.length; e += 1) i[e] = r.charCodeAt(e);
37
37
  let a = new Blob([i], { type: n }), o = URL.createObjectURL(a), s = document.createElement("a");
38
38
  s.href = o, s.download = t, document.body.appendChild(s), s.click(), document.body.removeChild(s), URL.revokeObjectURL(o);
39
39
  }
40
- var C = () => /* @__PURE__ */ v("span", {
40
+ var S = () => /* @__PURE__ */ _("span", {
41
41
  "aria-hidden": "true",
42
42
  "data-testid": "assistant-streaming-caret",
43
- className: "ml-0.5 inline-block h-4 w-1.5 rounded-sm bg-text-secondary align-middle" + (c() ? "" : " motion-safe:animate-pulse")
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 ? {
43
+ className: "ml-0.5 inline-block h-4 w-1.5 rounded-sm bg-text-secondary align-middle" + (l() ? "" : " motion-safe:animate-pulse")
44
+ }), C = ({ onApprovePendingWrite: l, approvingWriteRef: b = null, pendingWriteExpired: C = !1, pendingWriteApproved: ue = !1, pendingWriteGoAheadSent: de = !1, message: w, processing: T, isStreaming: E, isFailed: D, isLastAssistant: O, isNewestAssistant: k, onRetry: A, legacyWriteCardHidden: j = !1, writeProposals: M, uiOffers: N }) => {
45
+ let P = r(), { locale: F } = e(), I = s(w, P), L = I ? I.translated ? F : "en" : w.metadata?.lang, R = I ? `${w.id}:language:${L}` : w.id, z = f(R), B = n(), { getAccessToken: V, getWorkspaceToken: fe } = t(), H = re(), [pe, U] = p(null), [W, G] = p(!1), K = w.role === "user", q = d(() => le(w), [w]), J = d(() => y(q), [q]), Y = T === void 0 ? E ? {
46
46
  status: "streaming",
47
- messageId: T.id,
48
- updatedAt: T.timestamp
49
- } : null : E, X = ee(T, Y, P), { steps: Z, text: Q } = p(() => K ? {
47
+ messageId: w.id,
48
+ updatedAt: w.timestamp
49
+ } : null : T, X = ee(w, Y, P), { steps: Z, text: Q } = d(() => K ? {
50
50
  steps: [],
51
- text: T.content
52
- } : X.kind === "output" ? ne(X.text) : {
51
+ text: w.content
52
+ } : X.kind === "output" ? c(X.text) : {
53
53
  steps: [],
54
54
  text: ""
55
55
  }, [
56
56
  K,
57
- T.content,
57
+ w.content,
58
58
  X.kind,
59
59
  X.text
60
- ]), pe = () => {
60
+ ]), me = () => {
61
61
  i(Q).then((e) => {
62
62
  e && (G(!0), setTimeout(() => G(!1), 2e3));
63
63
  });
64
- }, me = async (e) => {
64
+ }, he = async (e) => {
65
65
  if (!q?.sandboxId || !q.sessionId) return;
66
66
  let t = new URLSearchParams(window.location.search).get("workspace") ?? "";
67
67
  if (t) {
68
- W(e.path);
68
+ U(e.path);
69
69
  try {
70
70
  let n = await o(q.sandboxId, t, q.sessionId, e.path, q.mode, {
71
71
  accessToken: V(),
72
- workspaceToken: H()
72
+ workspaceToken: fe()
73
73
  });
74
- S(n.contentBase64, n.filename, n.mimeType);
74
+ x(n.contentBase64, n.filename, n.mimeType);
75
75
  } finally {
76
- W(null);
76
+ U(null);
77
77
  }
78
78
  }
79
- }, $ = new Date(T.timestamp).toLocaleTimeString([], {
79
+ }, $ = new Date(w.timestamp).toLocaleTimeString([], {
80
80
  hour: "2-digit",
81
81
  minute: "2-digit"
82
82
  });
83
- if (T.role === "system") return /* @__PURE__ */ v("div", {
83
+ if (w.role === "system") return /* @__PURE__ */ _("div", {
84
84
  className: "flex justify-center px-2 py-1",
85
85
  "data-testid": "assistant-message-system",
86
- children: /* @__PURE__ */ v("p", {
86
+ children: w.metadata?.localAction?.kind === "navigate" ? /* @__PURE__ */ _("div", {
87
+ className: "max-w-[90%] 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",
88
+ "data-testid": "assistant-message-system-navigation",
89
+ children: /* @__PURE__ */ _(a, { content: w.content })
90
+ }) : /* @__PURE__ */ _("p", {
87
91
  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",
88
- children: T.content
92
+ children: w.content
89
93
  })
90
94
  });
91
95
  if (K) {
92
- let e = T.metadata?.attachments ?? [];
93
- return /* @__PURE__ */ v("div", {
96
+ let e = w.metadata?.attachments ?? [];
97
+ return /* @__PURE__ */ _("div", {
94
98
  className: "flex justify-end",
95
99
  "data-testid": "assistant-message-user",
96
- children: /* @__PURE__ */ y("div", {
100
+ children: /* @__PURE__ */ v("div", {
97
101
  className: "max-w-[85%]",
98
102
  children: [
99
- T.content && /* @__PURE__ */ v("div", {
103
+ w.content && /* @__PURE__ */ _("div", {
100
104
  className: "rounded-2xl rounded-br-md bg-action-primary-bg/12 px-3.5 py-2.5 text-[15px] leading-relaxed text-text-primary",
101
- children: /* @__PURE__ */ v("p", {
105
+ children: /* @__PURE__ */ _("p", {
102
106
  className: "whitespace-pre-wrap",
103
- children: T.content
107
+ children: w.content
104
108
  })
105
109
  }),
106
- /* @__PURE__ */ v(ie, { attachments: e }),
107
- /* @__PURE__ */ v("div", {
110
+ /* @__PURE__ */ _(ie, { attachments: e }),
111
+ /* @__PURE__ */ _("div", {
108
112
  className: "mt-1 pr-1 text-right text-[10px] text-text-muted",
109
113
  children: $
110
114
  })
@@ -112,46 +116,47 @@ var C = () => /* @__PURE__ */ v("span", {
112
116
  })
113
117
  });
114
118
  }
115
- return /* @__PURE__ */ y("div", {
119
+ return /* @__PURE__ */ v("div", {
116
120
  className: "flex gap-2.5",
117
121
  "data-testid": "assistant-message-assistant",
118
- children: [/* @__PURE__ */ v(re, { active: D }), /* @__PURE__ */ y("div", {
122
+ children: [/* @__PURE__ */ _(ne, { active: E }), /* @__PURE__ */ v("div", {
119
123
  className: "min-w-0 flex-1",
120
124
  children: [
121
- Z.length > 0 && /* @__PURE__ */ v(te, { steps: Z }),
122
- q?.pendingWrite && !M ? /* @__PURE__ */ v(u, {
125
+ Z.length > 0 && /* @__PURE__ */ _(te, { steps: Z }),
126
+ q?.pendingWrite && !j ? /* @__PURE__ */ _(ae, {
123
127
  pendingWrite: q.pendingWrite,
124
- onApprove: c,
125
- approving: x !== null && x === q.pendingWrite.reference,
126
- expired: w,
127
- approved: le,
128
- goAheadSent: ue,
129
- awaitingTurn: !!D
128
+ onApprove: l,
129
+ approving: b !== null && b === q.pendingWrite.reference,
130
+ expired: C,
131
+ approved: ue,
132
+ goAheadSent: de,
133
+ awaitingTurn: !!E
130
134
  }) : null,
131
- N,
132
- Q && /* @__PURE__ */ v("div", {
135
+ M,
136
+ Q && /* @__PURE__ */ _("div", {
133
137
  className: "text-[15px] leading-relaxed text-text-primary",
134
- children: /* @__PURE__ */ v(a, { content: Q })
138
+ children: /* @__PURE__ */ _(a, { content: Q })
135
139
  }),
136
- X.kind === "working" && /* @__PURE__ */ v(ae, { processing: Y }),
137
- X.kind === "stopped" && /* @__PURE__ */ v("p", {
140
+ X.kind === "working" && /* @__PURE__ */ _(se, { processing: Y }),
141
+ X.kind === "stopped" && /* @__PURE__ */ _("p", {
138
142
  className: "text-[15px] leading-relaxed text-text-secondary",
139
143
  "data-testid": "assistant-turn-stopped",
140
144
  children: X.text
141
145
  }),
142
- D && /* @__PURE__ */ v(C, {}),
143
- J.length > 0 && q?.sandboxId && q.sessionId && /* @__PURE__ */ y("div", {
146
+ E && /* @__PURE__ */ _(S, {}),
147
+ N,
148
+ J.length > 0 && q?.sandboxId && q.sessionId && /* @__PURE__ */ v("div", {
144
149
  className: "mt-3 space-y-2 border-t border-border-subtle pt-2",
145
- children: [/* @__PURE__ */ v("p", {
150
+ children: [/* @__PURE__ */ _("p", {
146
151
  className: "text-[10px] font-medium uppercase tracking-wide text-text-muted",
147
152
  children: P("message.downloads", "Downloads")
148
- }), /* @__PURE__ */ v("div", {
153
+ }), /* @__PURE__ */ _("div", {
149
154
  className: "flex flex-wrap gap-2",
150
155
  children: J.map((e) => {
151
156
  let t = `${e.name}${e.type === "directory" ? ".tar.gz" : ""}`;
152
- return /* @__PURE__ */ v(f, {
157
+ return /* @__PURE__ */ _(u, {
153
158
  label: t,
154
- disabled: de === e.path,
159
+ disabled: pe === e.path,
155
160
  testId: `assistant-artifact-${e.name}`,
156
161
  source: {
157
162
  kind: "sandbox-artifact",
@@ -161,58 +166,58 @@ var C = () => /* @__PURE__ */ v("span", {
161
166
  filename: t
162
167
  },
163
168
  defaultFolderPath: B.artifacts,
164
- onDownload: () => me(e)
169
+ onDownload: () => he(e)
165
170
  }, e.path);
166
171
  })
167
172
  })]
168
173
  }),
169
- !D && (Q || O || k) && /* @__PURE__ */ y("div", {
174
+ !E && (Q || D || O) && /* @__PURE__ */ v("div", {
170
175
  className: "mt-1.5 flex items-center gap-1",
171
176
  children: [
172
- Q && /* @__PURE__ */ v("button", {
177
+ Q && /* @__PURE__ */ _("button", {
173
178
  type: "button",
174
- onClick: pe,
179
+ onClick: me,
175
180
  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",
176
181
  "aria-label": P("message.copy", "Copy message"),
177
182
  "data-testid": "assistant-message-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") })] })
183
+ children: W ? /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _(ce, { className: "size-3 text-status-success-text" }), /* @__PURE__ */ _("span", { children: P("message.copied", "Copied") })] }) : /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _(m, { className: "size-3" }), /* @__PURE__ */ _("span", { children: P("message.copyShort", "Copy") })] })
179
184
  }),
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, {
185
+ Q && H.isSupported && (() => {
186
+ let e = H.blockedFor(R) ?? H.disabledReason, t = H.isSpeaking(w.id) || H.isSpeaking(z.current), n = !!e && !!k, r = n ? `speak-reason-${w.id}` : void 0;
187
+ return /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _(oe, {
183
188
  isSpeaking: t,
184
189
  disabled: e !== null,
185
190
  disabledReason: e,
186
191
  describedById: r,
187
192
  onClick: () => {
188
193
  if (t) {
189
- U.stop();
194
+ H.stop();
190
195
  return;
191
196
  }
192
- z.current = R, U.toggle(R, Q, L);
197
+ z.current = R, H.toggle(R, Q, L);
193
198
  }
194
- }), n && /* @__PURE__ */ v("span", {
199
+ }), n && /* @__PURE__ */ _("span", {
195
200
  id: r,
196
201
  className: "text-[11px] text-text-muted",
197
202
  "data-testid": "assistant-speak-reason",
198
203
  children: e
199
204
  })] });
200
205
  })(),
201
- (O || k) && j && !T.metadata?.localAction && /* @__PURE__ */ y("button", {
206
+ (D || O) && A && !w.metadata?.localAction && /* @__PURE__ */ v("button", {
202
207
  type: "button",
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"}`,
208
+ onClick: A,
209
+ className: `flex items-center gap-1 rounded-md px-1.5 py-1 text-[11px] transition-colors hover:bg-bg-elevated ${D ? "text-status-error-text" : "text-text-muted hover:text-text-secondary"}`,
205
210
  "aria-label": P("message.retry", "Retry"),
206
211
  "data-testid": "assistant-message-retry",
207
- children: [/* @__PURE__ */ v(se, { className: "size-3" }), /* @__PURE__ */ v("span", { children: P("message.retry", "Retry") })]
212
+ children: [/* @__PURE__ */ _(h, { className: "size-3" }), /* @__PURE__ */ _("span", { children: P("message.retry", "Retry") })]
208
213
  })
209
214
  ]
210
215
  }),
211
- /* @__PURE__ */ y("div", {
216
+ /* @__PURE__ */ v("div", {
212
217
  className: "mt-1 text-[10px] text-text-muted",
213
- children: [$, T.tokens && /* @__PURE__ */ y("span", {
218
+ children: [$, w.tokens && /* @__PURE__ */ v("span", {
214
219
  className: "ml-2",
215
- children: [T.tokens.input + T.tokens.output, " tokens"]
220
+ children: [w.tokens.input + w.tokens.output, " tokens"]
216
221
  })]
217
222
  })
218
223
  ]
@@ -220,4 +225,4 @@ var C = () => /* @__PURE__ */ v("span", {
220
225
  });
221
226
  };
222
227
  //#endregion
223
- export { w as AssistantMessageItem, C as StreamingCaret };
228
+ export { C as AssistantMessageItem, S as StreamingCaret };