zidane-ui 9.1.13 → 9.1.14

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 (309) hide show
  1. package/dist/adapters/index.d.ts +2 -2
  2. package/dist/adapters/index.js +2 -2
  3. package/dist/adapters/live.d.ts +29 -3
  4. package/dist/adapters/live.js +9 -1
  5. package/dist/adapters/server-composer-host.js +17 -2
  6. package/dist/adapters/server-extensions-host.d.ts +0 -1
  7. package/dist/adapters/server-extensions-host.js +5 -16
  8. package/dist/adapters/server-git-host.js +7 -16
  9. package/dist/adapters/server-host.js +181 -43
  10. package/dist/adapters/server-machines-host.d.ts +2 -0
  11. package/dist/adapters/server-machines-host.js +24 -25
  12. package/dist/adapters/server-onboarding-host.d.ts +1 -1
  13. package/dist/adapters/server-onboarding-host.js +3 -4
  14. package/dist/adapters/server-session-host.js +22 -3
  15. package/dist/adapters/server-settings-accounts.js +2 -2
  16. package/dist/adapters/server-settings-host.js +3 -3
  17. package/dist/adapters/server-settings-performance.js +7 -9
  18. package/dist/adapters/server-settings-sections.js +13 -14
  19. package/dist/adapters/server-sidebar-host.js +2 -2
  20. package/dist/adapters/sse-host.js +68 -3
  21. package/dist/adapters/sse-protocol.d.ts +12 -2
  22. package/dist/adapters/sse-protocol.js +4 -2
  23. package/dist/app/AppHostProvider.js +4 -3
  24. package/dist/app/ModalProvider.d.ts +13 -3
  25. package/dist/app/ModalProvider.js +103 -24
  26. package/dist/app/NoticeStack.d.ts +33 -0
  27. package/dist/app/NoticeStack.js +90 -0
  28. package/dist/app/index.d.ts +3 -2
  29. package/dist/app/index.js +3 -2
  30. package/dist/appearance/AppearanceProvider.js +2 -2
  31. package/dist/appearance/headless/index.js +1 -1
  32. package/dist/approvals/headless/index.js +2 -2
  33. package/dist/chat/SessionFilterMenu.d.ts +1 -1
  34. package/dist/chat/SessionFilterMenu.js +2 -1
  35. package/dist/chat/Transcript.js +1 -1
  36. package/dist/chat/composer/Composer.js +9 -6
  37. package/dist/chat/composer/ComposerEditor.js +1 -1
  38. package/dist/chat/composer/ConversationBadges.js +1 -1
  39. package/dist/chat/composer/ModelChainList.js +17 -8
  40. package/dist/chat/composer/ModelChainTooltip.js +5 -2
  41. package/dist/chat/composer/use-composer-stores.js +1 -1
  42. package/dist/chat/composer/use-draft-target.d.ts +20 -1
  43. package/dist/chat/composer/use-draft-target.js +122 -6
  44. package/dist/chat/composer/use-new-session-defaults.d.ts +5 -1
  45. package/dist/chat/composer/use-new-session-defaults.js +17 -4
  46. package/dist/chat/composer/use-run-meter.js +1 -1
  47. package/dist/chat/composer/use-send-prompt.js +1 -1
  48. package/dist/chat/headless/chip-labels.d.ts +1 -0
  49. package/dist/chat/headless/chip-labels.js +1 -0
  50. package/dist/chat/headless/composer/index.js +2 -2
  51. package/dist/chat/headless/draft-target.d.ts +21 -1
  52. package/dist/chat/headless/fixture-host.js +17 -2
  53. package/dist/chat/headless/host.d.ts +3 -3
  54. package/dist/chat/headless/index.d.ts +9 -9
  55. package/dist/chat/headless/index.js +15 -15
  56. package/dist/chat/headless/labels.d.ts +13 -4
  57. package/dist/chat/headless/labels.js +8 -5
  58. package/dist/chat/headless/session-list.d.ts +20 -6
  59. package/dist/chat/headless/session-list.js +1 -0
  60. package/dist/chat/headless/sidebar/directory.d.ts +56 -14
  61. package/dist/chat/headless/sidebar/directory.js +149 -70
  62. package/dist/chat/headless/sidebar/index.d.ts +3 -3
  63. package/dist/chat/headless/sidebar/index.js +3 -3
  64. package/dist/chat/headless/sidebar/labels.d.ts +15 -6
  65. package/dist/chat/headless/sidebar/types.d.ts +3 -1
  66. package/dist/chat/headless/sidebar/view.d.ts +13 -5
  67. package/dist/chat/headless/sidebar/view.js +31 -11
  68. package/dist/chat/headless/streams/actions.d.ts +5 -3
  69. package/dist/chat/headless/streams/actions.js +3 -2
  70. package/dist/chat/headless/streams/index.d.ts +3 -3
  71. package/dist/chat/headless/streams/merge.d.ts +6 -10
  72. package/dist/chat/headless/streams/merge.js +7 -21
  73. package/dist/chat/headless/streams/session-streams.d.ts +29 -4
  74. package/dist/chat/headless/streams/session-streams.js +86 -0
  75. package/dist/chat/headless/streams/store.d.ts +162 -16
  76. package/dist/chat/headless/streams/store.js +334 -38
  77. package/dist/chat/headless/streams/types.d.ts +10 -7
  78. package/dist/chat/headless/transcript-labels.d.ts +1 -0
  79. package/dist/chat/interactions/PlanCard.js +10 -3
  80. package/dist/chat/interactions/QuestionForm.js +7 -3
  81. package/dist/chat/interactions/card-ui.d.ts +5 -3
  82. package/dist/chat/interactions/card-ui.js +9 -7
  83. package/dist/chat/sidebar/SessionSidebar.js +5 -5
  84. package/dist/chat/sidebar/SidebarFilterMenu.js +3 -1
  85. package/dist/chat/sidebar/SidebarFrame.d.ts +4 -0
  86. package/dist/chat/sidebar/SidebarFrame.js +27 -9
  87. package/dist/chat/sidebar/SidebarGroupHeader.js +1 -1
  88. package/dist/chat/sidebar/SidebarHostProvider.d.ts +8 -5
  89. package/dist/chat/sidebar/SidebarHostProvider.js +13 -9
  90. package/dist/chat/sidebar/SidebarToggleButton.js +7 -3
  91. package/dist/chat/sidebar/index.d.ts +2 -2
  92. package/dist/chat/sidebar/session-menu.js +4 -4
  93. package/dist/chat/sidebar/useSaveViewAsSpace.js +2 -2
  94. package/dist/chat/testing/contract.js +2 -2
  95. package/dist/chat/transcript/AuthFailureCard.js +11 -8
  96. package/dist/chat/transcript/BadgeMenu.js +13 -2
  97. package/dist/chat/transcript/MermaidDiagram.js +7 -3
  98. package/dist/chat/transcript/fold.d.ts +4 -0
  99. package/dist/chat/transcript/fold.js +53 -22
  100. package/dist/chat/transcript/script-input.d.ts +1 -1
  101. package/dist/chat/transcript/shell-block.js +8 -4
  102. package/dist/chat/transcript/useStickToBottom.js +12 -0
  103. package/dist/components/BrowserSignIn.js +23 -21
  104. package/dist/components/Form.d.ts +6 -4
  105. package/dist/components/Form.js +16 -8
  106. package/dist/components/LoadError.d.ts +4 -2
  107. package/dist/components/LoadError.js +13 -9
  108. package/dist/components/Notice.d.ts +29 -0
  109. package/dist/components/Notice.js +63 -0
  110. package/dist/components/PanelEmpty.d.ts +1 -1
  111. package/dist/components/PanelEmpty.js +4 -2
  112. package/dist/components/Restricted.d.ts +1 -1
  113. package/dist/components/palette/PaletteList.js +8 -1
  114. package/dist/components/palette/PalettePanel.js +14 -6
  115. package/dist/core.css +24 -5
  116. package/dist/dist/{index-Bq87OcGy.d.ts → index-C6rzc-tt.d.ts} +28 -3
  117. package/dist/dist/index.d.ts +2 -2
  118. package/dist/dist/{timeout-B5pO5I5a.d.ts → timeout-Cz9dRF8Q.d.ts} +1 -1
  119. package/dist/extensions/ExtensionSettingsPage.js +2 -5
  120. package/dist/extensions/ExtensionSettingsSection.js +5 -4
  121. package/dist/extensions/ExtensionSettingsSidebar.js +3 -7
  122. package/dist/extensions/SettingsWireForm.d.ts +1 -7
  123. package/dist/extensions/SettingsWireForm.js +7 -5
  124. package/dist/extensions/headless/fixture-host.d.ts +1 -5
  125. package/dist/extensions/headless/fixture-host.js +2 -5
  126. package/dist/extensions/headless/host.d.ts +1 -11
  127. package/dist/extensions/headless/index.d.ts +3 -3
  128. package/dist/extensions/headless/index.js +6 -6
  129. package/dist/extensions/headless/select.d.ts +1 -11
  130. package/dist/extensions/headless/select.js +1 -18
  131. package/dist/extensions/hooks.js +1 -1
  132. package/dist/files/EditorColumn.js +13 -2
  133. package/dist/files/MediaDiff.js +1 -1
  134. package/dist/files/TreeColumn.js +13 -20
  135. package/dist/files/useEntryActions.js +1 -1
  136. package/dist/files/useOpenFiles.js +3 -1
  137. package/dist/git/BranchMenu.js +6 -4
  138. package/dist/git/ImportRepoDialog.js +18 -9
  139. package/dist/git/MoveSessionDialog.js +16 -8
  140. package/dist/git/RemoteFolderPicker.js +35 -17
  141. package/dist/git/SyncChip.js +17 -17
  142. package/dist/git/WherePicker.d.ts +16 -1
  143. package/dist/git/WherePicker.js +81 -37
  144. package/dist/git/headless/environment.d.ts +33 -3
  145. package/dist/git/headless/environment.js +33 -5
  146. package/dist/git/headless/index.d.ts +2 -2
  147. package/dist/git/headless/index.js +2 -2
  148. package/dist/git/headless/labels.d.ts +15 -2
  149. package/dist/git/headless/labels.js +17 -4
  150. package/dist/git/useEnvironmentChoices.d.ts +3 -1
  151. package/dist/git/useEnvironmentChoices.js +7 -4
  152. package/dist/index.d.ts +2 -1
  153. package/dist/index.js +2 -1
  154. package/dist/keybindings/KeyCommands.js +1 -1
  155. package/dist/keybindings/KeybindingsProvider.js +1 -1
  156. package/dist/keybindings/headless/index.js +2 -2
  157. package/dist/keybindings/headless/overrides.js +1 -1
  158. package/dist/labels.d.ts +5 -0
  159. package/dist/labels.js +5 -0
  160. package/dist/machines/AddMachineDialog.d.ts +34 -0
  161. package/dist/machines/AddMachineDialog.js +464 -0
  162. package/dist/machines/Banners.d.ts +33 -4
  163. package/dist/machines/Banners.js +64 -3
  164. package/dist/machines/DaemonMenu.js +27 -4
  165. package/dist/machines/HostCapabilities.d.ts +1 -3
  166. package/dist/machines/HostCapabilities.js +24 -45
  167. package/dist/machines/HostSyncPanel.js +124 -130
  168. package/dist/machines/HostsSection.d.ts +4 -1
  169. package/dist/machines/HostsSection.js +30 -7
  170. package/dist/machines/MachinesExplainer.d.ts +17 -0
  171. package/dist/machines/MachinesExplainer.js +71 -0
  172. package/dist/machines/MachinesProvider.d.ts +14 -2
  173. package/dist/machines/MachinesProvider.js +35 -1
  174. package/dist/machines/ServerAddedCard.d.ts +31 -0
  175. package/dist/machines/ServerAddedCard.js +72 -0
  176. package/dist/machines/ServerCard.js +91 -215
  177. package/dist/machines/ServerMachinesPanel.d.ts +2 -2
  178. package/dist/machines/ServerMachinesPanel.js +184 -323
  179. package/dist/machines/ServerUpdatePanel.js +51 -40
  180. package/dist/machines/ShareThisComputerForm.d.ts +19 -0
  181. package/dist/machines/ShareThisComputerForm.js +133 -0
  182. package/dist/machines/SyncOutcomeBadge.js +1 -1
  183. package/dist/machines/TokensPanel.d.ts +5 -3
  184. package/dist/machines/TokensPanel.js +98 -78
  185. package/dist/machines/headless/fixture-host.d.ts +19 -3
  186. package/dist/machines/headless/fixture-host.js +43 -6
  187. package/dist/machines/headless/fixtures.js +4 -6
  188. package/dist/machines/headless/host.d.ts +40 -19
  189. package/dist/machines/headless/index.d.ts +3 -3
  190. package/dist/machines/headless/index.js +3 -3
  191. package/dist/machines/headless/labels.d.ts +63 -20
  192. package/dist/machines/headless/labels.js +88 -25
  193. package/dist/machines/headless/messages.js +8 -0
  194. package/dist/machines/headless/stores.d.ts +9 -2
  195. package/dist/machines/headless/stores.js +28 -1
  196. package/dist/machines/index.d.ts +7 -3
  197. package/dist/machines/index.js +8 -4
  198. package/dist/machines/testing/contract.d.ts +15 -3
  199. package/dist/machines/testing/contract.js +68 -14
  200. package/dist/motion/grow.d.ts +8 -1
  201. package/dist/motion/grow.js +10 -4
  202. package/dist/onboarding/headless/labels.d.ts +13 -0
  203. package/dist/onboarding/headless/labels.js +8 -0
  204. package/dist/onboarding/sources/SourceBrowser.js +11 -7
  205. package/dist/onboarding/steps/ImportStep.js +4 -1
  206. package/dist/onboarding/steps/ReadyStep.js +9 -2
  207. package/dist/onboarding/steps/connect/KeyForm.js +6 -2
  208. package/dist/onboarding/steps/connect/ProviderPanel.js +6 -2
  209. package/dist/onboarding/steps/connect/ProviderReady.js +25 -20
  210. package/dist/onboarding/steps/tasks.js +17 -14
  211. package/dist/palette/app-sources.js +1 -1
  212. package/dist/server/sse-handler.js +141 -19
  213. package/dist/session/ArtifactsPanel.js +40 -18
  214. package/dist/session/PlanTracker.js +13 -8
  215. package/dist/session/ProjectHome.js +13 -11
  216. package/dist/session/RemindersPanel.js +35 -17
  217. package/dist/session/RunningWorkDialog.js +6 -2
  218. package/dist/session/SecretsPanel.js +29 -10
  219. package/dist/session/SessionDetailsDialog.d.ts +1 -1
  220. package/dist/session/SessionDetailsDialog.js +18 -10
  221. package/dist/session/SideChat.js +10 -7
  222. package/dist/session/TurnDetailsDialog.js +19 -5
  223. package/dist/session/UsagePanel.js +10 -4
  224. package/dist/session/headless/host.d.ts +2 -0
  225. package/dist/session/headless/index.js +2 -2
  226. package/dist/session/headless/labels.d.ts +19 -1
  227. package/dist/session/headless/labels.js +15 -1
  228. package/dist/session/headless/queue.js +2 -1
  229. package/dist/session/headless/reminder-labels.d.ts +4 -0
  230. package/dist/session/headless/reminder-labels.js +4 -0
  231. package/dist/settings/SettingsRestricted.d.ts +1 -1
  232. package/dist/settings/SettingsRestricted.js +4 -4
  233. package/dist/settings/SettingsShell.d.ts +7 -0
  234. package/dist/settings/SettingsShell.js +6 -1
  235. package/dist/settings/headless/fixture-performance.d.ts +1 -1
  236. package/dist/settings/headless/host.d.ts +2 -2
  237. package/dist/settings/headless/index.js +1 -1
  238. package/dist/settings/headless/labels.d.ts +3 -3
  239. package/dist/settings/headless/labels.js +3 -3
  240. package/dist/settings/headless/performance.d.ts +3 -4
  241. package/dist/settings/headless/search.d.ts +1 -1
  242. package/dist/settings/index.d.ts +2 -1
  243. package/dist/settings/index.js +2 -1
  244. package/dist/settings/sections/appearance/AppearanceSection.js +2 -2
  245. package/dist/settings/sections/claude-import/ClaudeImportDialog.js +1 -1
  246. package/dist/settings/sections/editor/EditorSection.js +8 -5
  247. package/dist/settings/sections/editor/labels.d.ts +1 -0
  248. package/dist/settings/sections/editor/labels.js +1 -0
  249. package/dist/settings/sections/environments/EnvironmentsSection.js +21 -14
  250. package/dist/settings/sections/environments/labels.d.ts +1 -0
  251. package/dist/settings/sections/environments/labels.js +2 -1
  252. package/dist/settings/sections/extensions/ChangeOriginDialog.js +1 -1
  253. package/dist/settings/sections/extensions/CreateExtensionDialog.js +1 -1
  254. package/dist/settings/sections/extensions/ExtensionConfigRows.d.ts +1 -3
  255. package/dist/settings/sections/extensions/ExtensionConfigRows.js +20 -19
  256. package/dist/settings/sections/extensions/ExtensionOptionsSection.js +2 -1
  257. package/dist/settings/sections/extensions/ExtensionsSection.js +1 -1
  258. package/dist/settings/sections/extensions/options-labels.d.ts +2 -1
  259. package/dist/settings/sections/extensions/options-labels.js +2 -1
  260. package/dist/settings/sections/host-catalog/HostCatalogSection.js +1 -1
  261. package/dist/settings/sections/index.d.ts +2 -1
  262. package/dist/settings/sections/index.js +2 -1
  263. package/dist/settings/sections/instructions/InstructionsSection.js +1 -1
  264. package/dist/settings/sections/logs/LogsSection.d.ts +2 -2
  265. package/dist/settings/sections/logs/LogsSection.js +2 -2
  266. package/dist/settings/sections/mcp/McpSection.d.ts +1 -1
  267. package/dist/settings/sections/mcp/McpSection.js +13 -7
  268. package/dist/settings/sections/mcp/McpServerRow.js +21 -14
  269. package/dist/settings/sections/mcp/labels.d.ts +8 -2
  270. package/dist/settings/sections/mcp/labels.js +8 -2
  271. package/dist/settings/sections/models/ModelRows.js +1 -1
  272. package/dist/settings/sections/models/NewChatPlaceRow.d.ts +26 -0
  273. package/dist/settings/sections/models/NewChatPlaceRow.js +78 -0
  274. package/dist/settings/sections/models/SpacesDefaultsSection.js +15 -3
  275. package/dist/settings/sections/models/labels.d.ts +7 -0
  276. package/dist/settings/sections/models/labels.js +7 -0
  277. package/dist/settings/sections/models/model-test.js +7 -4
  278. package/dist/settings/sections/performance/PerformanceSection.js +16 -6
  279. package/dist/settings/sections/performance/labels.d.ts +1 -1
  280. package/dist/settings/sections/performance/labels.js +1 -1
  281. package/dist/settings/sections/providers/ProvidersSection.d.ts +1 -1
  282. package/dist/settings/sections/providers/ProvidersSection.js +15 -8
  283. package/dist/settings/sections/providers/ServerProvidersSection.d.ts +1 -1
  284. package/dist/settings/sections/providers/ServerProvidersSection.js +12 -6
  285. package/dist/settings/sections/providers/labels.d.ts +2 -2
  286. package/dist/settings/sections/providers/labels.js +2 -2
  287. package/dist/settings/sections/shared/catalog.js +1 -1
  288. package/dist/settings/sections/skills/SkillsSection.js +1 -1
  289. package/dist/settings/testing/performance.contract.js +8 -12
  290. package/dist/styles.css +32 -3
  291. package/dist/terminal/HostTerminalSurface.js +17 -7
  292. package/dist/terminal/TerminalPanel.js +30 -17
  293. package/dist/terminal/TerminalSurface.js +11 -4
  294. package/dist/terminal/headless/labels.d.ts +5 -0
  295. package/dist/terminal/headless/labels.js +5 -0
  296. package/dist/terminal/headless/store.d.ts +1 -1
  297. package/dist/terminal/headless/store.js +6 -3
  298. package/dist/workspace/LayoutBudget.d.ts +5 -1
  299. package/dist/workspace/LayoutBudget.js +14 -1
  300. package/dist/workspace/PanelContentView.d.ts +1 -1
  301. package/dist/workspace/PanelContentView.js +17 -6
  302. package/dist/workspace/WorkspaceProvider.js +4 -3
  303. package/dist/workspace/extension-tabs.js +1 -1
  304. package/dist/workspace/headless/index.js +1 -1
  305. package/dist/workspace/headless/labels.d.ts +1 -0
  306. package/dist/workspace/headless/labels.js +1 -0
  307. package/package.json +3 -3
  308. package/src/styles/motion.css +8 -0
  309. package/src/styles/primitives.css +7 -0
@@ -1,17 +1,19 @@
1
1
  import { IconButton } from "../components/IconButton.js";
2
2
  import { buttonClass } from "../components/button.js";
3
+ import { Notice } from "../components/Notice.js";
3
4
  import { Segmented } from "../components/Segmented.js";
4
5
  import { MetaChip } from "../components/Form.js";
6
+ import { errorMessage } from "../components/report-error.js";
5
7
  import { PanelEmpty, PanelLoading } from "../components/PanelEmpty.js";
6
8
  import { PANEL_ROW, PANEL_ROW_HOVER } from "../components/PanelRows.js";
7
9
  import { useMinuteTick } from "../hooks/useMinuteTick.js";
8
10
  import { constant, useReadable } from "../chat/headless/store.js";
9
- import { canKeepSchedule, isScheduleFinished, readReminderWhen, sortSchedules } from "./headless/schedules.js";
10
11
  import { useOptionalChatHost } from "../chat/ChatProvider.js";
11
12
  import { useAllSchedules, useSchedulesStatus, useSessionHost, useSessionSchedules } from "./SessionProvider.js";
12
13
  import { useSessionLabels } from "./useSessionLabels.js";
13
14
  import { OpenSessionContext } from "../chat/transcript/markdown-context.js";
14
- import { BTN_GHOST, BTN_PRIMARY, CardError, INPUT } from "../chat/interactions/card-ui.js";
15
+ import { canKeepSchedule, isScheduleFinished, readReminderWhen, sortSchedules } from "./headless/schedules.js";
16
+ import { BTN_GHOST, BTN_PRIMARY, INPUT } from "../chat/interactions/card-ui.js";
15
17
  import { jsx, jsxs } from "react/jsx-runtime";
16
18
  import { useContext, useEffect, useId, useMemo, useState } from "react";
17
19
  import { describeTime, describeTrigger, scheduleLabel, scheduleTargetSession } from "zidane/chat/pure";
@@ -30,7 +32,6 @@ import { describeTime, describeTrigger, scheduleLabel, scheduleTargetSession } f
30
32
  * Reminders setting is off it says so. The list follows the host's change
31
33
  * signal (`schedules:changed`).
32
34
  */
33
- const errorText = (err) => err instanceof Error ? err.message : String(err);
34
35
  /** The time words follow the clock: the minute tick re-renders, and each render reads it. */
35
36
  const readClock = () => Date.now();
36
37
  /** A quick time pick under the When field. */
@@ -108,7 +109,7 @@ function RemindersPanel({ sessionId, initialScope = "session", onOpenSession, cl
108
109
  });
109
110
  const act = (run) => {
110
111
  setError(null);
111
- run().catch((err) => setError(errorText(err)));
112
+ run().catch((err) => setError(errorMessage(err)));
112
113
  };
113
114
  return /* @__PURE__ */ jsxs("div", {
114
115
  className: root,
@@ -136,10 +137,12 @@ function RemindersPanel({ sessionId, initialScope = "session", onOpenSession, cl
136
137
  }),
137
138
  /* @__PURE__ */ jsxs("div", {
138
139
  className: "flex-1 min-h-0 flex flex-col overflow-y-auto px-3 pt-2 pb-3",
139
- children: [error && /* @__PURE__ */ jsx("div", {
140
- className: "text-xs text-[var(--zg-warn)] mb-2",
141
- role: "alert",
142
- children: error
140
+ children: [error && /* @__PURE__ */ jsx(Notice, {
141
+ tone: "error",
142
+ compact: true,
143
+ detail: error,
144
+ className: "mb-2",
145
+ children: labels.remindersActionFailed
143
146
  }), sorted === null ? /* @__PURE__ */ jsx(PanelLoading, {}) : sorted.length === 0 ? /* @__PURE__ */ jsx(PanelEmpty, {
144
147
  icon: "i-ph-alarm",
145
148
  title: scope === "session" ? labels.remindersEmpty : labels.remindersEmptyAll,
@@ -329,8 +332,10 @@ function ReminderRow({ schedule, sessionId, now, act, openSession }) {
329
332
  now
330
333
  })]
331
334
  }),
332
- !schedule.enabled && schedule.disabledReason && /* @__PURE__ */ jsx("span", {
333
- className: "zg-meta !text-zg-warn",
335
+ !schedule.enabled && schedule.disabledReason && /* @__PURE__ */ jsx(Notice, {
336
+ tone: "warning",
337
+ compact: true,
338
+ className: "self-start",
334
339
  children: labels.reminderOffReason(schedule.disabledReason)
335
340
  }),
336
341
  schedule.expiresAt !== void 0 && schedule.enabled && /* @__PURE__ */ jsx("span", {
@@ -354,7 +359,7 @@ function FireHistory({ id, scheduleId, label, version, load }) {
354
359
  const [error, setError] = useState(null);
355
360
  useEffect(() => {
356
361
  let live = true;
357
- load(scheduleId, 20).then((list) => live && setFires(list), (err) => live && setError(errorText(err)));
362
+ load(scheduleId, 20).then((list) => live && setFires(list), (err) => live && setError(errorMessage(err)));
358
363
  return () => {
359
364
  live = false;
360
365
  };
@@ -367,7 +372,12 @@ function FireHistory({ id, scheduleId, label, version, load }) {
367
372
  return /* @__PURE__ */ jsx("div", {
368
373
  id,
369
374
  className: "ml-[38px] mt-1 pl-3 border-l border-[var(--zg-hairline)]",
370
- children: error ? /* @__PURE__ */ jsx(CardError, { error }) : fires === null ? null : fires.length === 0 ? /* @__PURE__ */ jsx("span", {
375
+ children: error ? /* @__PURE__ */ jsx(Notice, {
376
+ tone: "error",
377
+ compact: true,
378
+ detail: error,
379
+ children: labels.reminderHistoryFailed
380
+ }) : fires === null ? null : fires.length === 0 ? /* @__PURE__ */ jsx("span", {
371
381
  className: "zg-meta",
372
382
  children: labels.reminderNoFires
373
383
  }) : /* @__PURE__ */ jsx("ul", {
@@ -385,9 +395,12 @@ function FireHistory({ id, scheduleId, label, version, load }) {
385
395
  children: labels.reminderFireOutcome(fire.outcome)
386
396
  }),
387
397
  fire.late && /* @__PURE__ */ jsx("span", { children: labels.reminderFireLate }),
388
- fire.error && /* @__PURE__ */ jsx("span", {
389
- className: "truncate",
390
- children: fire.error
398
+ fire.error && /* @__PURE__ */ jsx(Notice, {
399
+ tone: "error",
400
+ compact: true,
401
+ detail: fire.error,
402
+ className: "basis-full",
403
+ children: labels.reminderFireFailed
391
404
  })
392
405
  ]
393
406
  }, fire.id))
@@ -425,7 +438,7 @@ function ReminderForm({ sessionId }) {
425
438
  setWhen("");
426
439
  setText("");
427
440
  } catch (err) {
428
- setError(errorText(err));
441
+ setError(errorMessage(err));
429
442
  } finally {
430
443
  setBusy(false);
431
444
  }
@@ -484,7 +497,12 @@ function ReminderForm({ sessionId }) {
484
497
  children: words
485
498
  }, words))
486
499
  }),
487
- /* @__PURE__ */ jsx(CardError, { error }),
500
+ error && /* @__PURE__ */ jsx(Notice, {
501
+ tone: "error",
502
+ compact: true,
503
+ detail: error,
504
+ children: labels.reminderCreateFailed
505
+ }),
488
506
  /* @__PURE__ */ jsxs("div", {
489
507
  className: "flex items-center gap-2",
490
508
  children: [
@@ -1,6 +1,7 @@
1
1
  import { BTN_LG_SECONDARY, buttonClass } from "../components/button.js";
2
2
  import { EmptyState, Tray } from "../components/Surface.js";
3
3
  import { ErrorNote, MetaChip } from "../components/Form.js";
4
+ import { errorMessage } from "../components/report-error.js";
4
5
  import { useSessionHost, useSessionRunningWork } from "./SessionProvider.js";
5
6
  import { useSessionLabels } from "./useSessionLabels.js";
6
7
  import { ShellFrame } from "./SessionShell.js";
@@ -43,7 +44,7 @@ function RunningWorkDialog({ sessionId, onClose, showTerminal, renderShell, clas
43
44
  await work.cancel(sessionId, id, id === "all" ? "user-cancelled-all" : "user-clicked-cancel");
44
45
  await refresh();
45
46
  } catch (err) {
46
- setError(err.message ?? String(err));
47
+ setError(errorMessage(err));
47
48
  } finally {
48
49
  setBusyId(null);
49
50
  }
@@ -78,7 +79,10 @@ function RunningWorkDialog({ sessionId, onClose, showTerminal, renderShell, clas
78
79
  }),
79
80
  children: /* @__PURE__ */ jsxs("div", {
80
81
  className: "flex flex-col gap-3",
81
- children: [error && /* @__PURE__ */ jsx(ErrorNote, { children: error }), items.length === 0 ? /* @__PURE__ */ jsx(EmptyState, {
82
+ children: [error && /* @__PURE__ */ jsx(ErrorNote, {
83
+ detail: error,
84
+ children: labels.runningWorkCancelFailed
85
+ }), items.length === 0 ? /* @__PURE__ */ jsx(EmptyState, {
82
86
  icon: "i-ph-check-circle",
83
87
  title: labels.runningWorkEmpty
84
88
  }) : /* @__PURE__ */ jsx(Tray, {
@@ -1,10 +1,12 @@
1
1
  import { IconButton } from "../components/IconButton.js";
2
+ import { Notice } from "../components/Notice.js";
3
+ import { errorMessage } from "../components/report-error.js";
2
4
  import { PanelEmpty, PanelLoading } from "../components/PanelEmpty.js";
3
5
  import { PANEL_ROW, PANEL_ROW_HOVER } from "../components/PanelRows.js";
4
6
  import { useMinuteTick } from "../hooks/useMinuteTick.js";
5
7
  import { useSessionHost, useSessionSecrets } from "./SessionProvider.js";
6
8
  import { useSessionLabels } from "./useSessionLabels.js";
7
- import { BTN_GHOST, BTN_PRIMARY, CardError, INPUT } from "../chat/interactions/card-ui.js";
9
+ import { BTN_GHOST, BTN_PRIMARY, INPUT } from "../chat/interactions/card-ui.js";
8
10
  import { secretTimeLeft } from "../chat/headless/secrets.js";
9
11
  import { SecretInput } from "../chat/interactions/SecretInput.js";
10
12
  import { Tutorial } from "../onboarding/tutorials.js";
@@ -50,11 +52,21 @@ function SecretsPanel({ sessionId, className = "", style }) {
50
52
  }), labels.secretsAdd]
51
53
  });
52
54
  useEffect(() => {
53
- refresh?.(sessionId).catch((err) => setError(err.message));
54
- }, [refresh, sessionId]);
55
+ refresh?.(sessionId).catch((err) => setError({
56
+ message: labels.secretsLoadFailed,
57
+ detail: errorMessage(err)
58
+ }));
59
+ }, [
60
+ refresh,
61
+ sessionId,
62
+ labels.secretsLoadFailed
63
+ ]);
55
64
  const onRevoke = revoke ? (name) => {
56
65
  setError(null);
57
- revoke(sessionId, name).catch((err) => setError(err.message));
66
+ revoke(sessionId, name).catch((err) => setError({
67
+ message: labels.secretRevokeFailed,
68
+ detail: errorMessage(err)
69
+ }));
58
70
  } : void 0;
59
71
  return /* @__PURE__ */ jsxs("div", {
60
72
  className: `flex-1 min-h-0 flex flex-col ${className}`,
@@ -63,10 +75,12 @@ function SecretsPanel({ sessionId, className = "", style }) {
63
75
  children: [/* @__PURE__ */ jsxs("div", {
64
76
  className: "flex-1 min-h-0 flex flex-col overflow-y-auto px-3 pt-3 pb-3",
65
77
  children: [
66
- error && /* @__PURE__ */ jsx("div", {
67
- className: "text-xs text-[var(--zg-warn)] mb-2",
68
- role: "alert",
69
- children: error
78
+ error && /* @__PURE__ */ jsx(Notice, {
79
+ tone: "error",
80
+ compact: true,
81
+ detail: error.detail,
82
+ className: "mb-2",
83
+ children: error.message
70
84
  }),
71
85
  entries === null ? /* @__PURE__ */ jsx(PanelLoading, {}) : empty ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(PanelEmpty, {
72
86
  icon: "i-ph-key",
@@ -169,7 +183,7 @@ function AddSecretForm({ sessionId, initialName, saved, onDone }) {
169
183
  value.current = "";
170
184
  onDone();
171
185
  } catch (err) {
172
- setError(err instanceof Error ? err.message : String(err));
186
+ setError(errorMessage(err));
173
187
  setBusy(false);
174
188
  }
175
189
  };
@@ -214,6 +228,12 @@ function AddSecretForm({ sessionId, initialName, saved, onDone }) {
214
228
  },
215
229
  onSubmit: () => void submit()
216
230
  }),
231
+ error && /* @__PURE__ */ jsx(Notice, {
232
+ tone: "error",
233
+ compact: true,
234
+ detail: error,
235
+ children: labels.secretSaveFailed
236
+ }),
217
237
  /* @__PURE__ */ jsxs("div", {
218
238
  className: "flex items-center gap-2 pt-1",
219
239
  children: [
@@ -224,7 +244,6 @@ function AddSecretForm({ sessionId, initialName, saved, onDone }) {
224
244
  disabled: busy,
225
245
  children: labels.secretCancel
226
246
  }),
227
- /* @__PURE__ */ jsx(CardError, { error }),
228
247
  /* @__PURE__ */ jsx("span", { className: "flex-1" }),
229
248
  /* @__PURE__ */ jsx("button", {
230
249
  type: "submit",
@@ -98,7 +98,7 @@ interface SessionDetailsDialogProps {
98
98
  onChanged?: () => Promise<void>;
99
99
  /** The cache report, as the Cache fact. */
100
100
  cache?: ReactNode;
101
- /** Words an error from an action. Default: its message. */
101
+ /** The raw words behind an action's error, shown under Details. Default: its message. */
102
102
  formatError?: (error: unknown) => string;
103
103
  /** Closes the dialog. */
104
104
  onClose: () => void;
@@ -1,7 +1,9 @@
1
1
  import { IconButton } from "../components/IconButton.js";
2
2
  import { BTN_LG_DANGER, BTN_LG_SECONDARY, BTN_LG_SOLID, BTN_SECONDARY } from "../components/button.js";
3
+ import { Notice } from "../components/Notice.js";
3
4
  import { Tray } from "../components/Surface.js";
4
5
  import { INPUT_CLASS, MetaChip } from "../components/Form.js";
6
+ import { errorMessage } from "../components/report-error.js";
5
7
  import { useDisplayPath } from "../hooks/useDisplayPath.js";
6
8
  import { useSessionHost } from "./SessionProvider.js";
7
9
  import { useSessionLabels } from "./useSessionLabels.js";
@@ -33,13 +35,12 @@ const STATUS_DOT = {
33
35
  completed: "bg-[var(--zg-accent-alt)]",
34
36
  error: "bg-[var(--zg-danger)]"
35
37
  };
36
- const messageOf = (err) => err instanceof Error ? err.message : String(err);
37
38
  /**
38
39
  * Renders a session's facts and actions.
39
40
  *
40
41
  * @param props - The `session` facts, the session-list handlers, folder handlers, slots, `onClose`, `renderShell`.
41
42
  */
42
- function SessionDetailsDialog({ session, onRename, confirmDelete, onDelete, spaces = null, spaceId: spaceProp, onMoveToSpace, onRevealFolder, onPickFolder, folderPicker, onChanged, cache, formatError = messageOf, onClose, renderShell, className, style }) {
43
+ function SessionDetailsDialog({ session, onRename, confirmDelete, onDelete, spaces = null, spaceId: spaceProp, onMoveToSpace, onRevealFolder, onPickFolder, folderPicker, onChanged, cache, formatError = errorMessage, onClose, renderShell, className, style }) {
43
44
  const labels = useSessionLabels();
44
45
  const details = useSessionHost().details;
45
46
  const [title, setTitle] = useState(session.title);
@@ -74,7 +75,10 @@ function SessionDetailsDialog({ session, onRename, confirmDelete, onDelete, spac
74
75
  setBusy(kind);
75
76
  await action();
76
77
  } catch (err) {
77
- setError(formatError(err));
78
+ setError({
79
+ message: labels.detailsActionFailed,
80
+ detail: formatError(err)
81
+ });
78
82
  } finally {
79
83
  setBusy(null);
80
84
  }
@@ -115,7 +119,7 @@ function SessionDetailsDialog({ session, onRename, confirmDelete, onDelete, spac
115
119
  });
116
120
  const revealFolder = async () => {
117
121
  setError(null);
118
- if (!await onRevealFolder?.().catch(() => false)) setError(labels.detailsFolderGone(session.cwd));
122
+ if (!await onRevealFolder?.().catch(() => false)) setError({ message: labels.detailsFolderGone(session.cwd) });
119
123
  };
120
124
  const moveToSpace = (next) => run("space", async () => {
121
125
  await onMoveToSpace?.(next);
@@ -130,7 +134,10 @@ function SessionDetailsDialog({ session, onRename, confirmDelete, onDelete, spac
130
134
  await onDelete();
131
135
  onClose();
132
136
  } catch (err) {
133
- setError(messageOf(err));
137
+ setError({
138
+ message: labels.detailsDeleteFailed,
139
+ detail: formatError(err)
140
+ });
134
141
  setBusy(null);
135
142
  }
136
143
  };
@@ -154,11 +161,12 @@ function SessionDetailsDialog({ session, onRename, confirmDelete, onDelete, spac
154
161
  "aria-hidden": true,
155
162
  className: "i-ph-trash text-sm"
156
163
  }), busy === "deleting" ? labels.detailsDeleting : labels.detailsDelete]
157
- }), error && /* @__PURE__ */ jsx("span", {
158
- role: "alert",
159
- className: "min-w-0 line-clamp-2 text-xs text-zg-danger",
160
- title: error,
161
- children: error
164
+ }), error && /* @__PURE__ */ jsx(Notice, {
165
+ tone: "error",
166
+ compact: true,
167
+ detail: error.detail,
168
+ className: "min-w-0 flex-1",
169
+ children: error.message
162
170
  })]
163
171
  }),
164
172
  children: [
@@ -1,3 +1,5 @@
1
+ import { Notice } from "../components/Notice.js";
2
+ import { errorMessage } from "../components/report-error.js";
1
3
  import { PanelEmpty } from "../components/PanelEmpty.js";
2
4
  import { constant, useReadable } from "../chat/headless/store.js";
3
5
  import { useChatHost } from "../chat/ChatProvider.js";
@@ -138,7 +140,7 @@ function SideChat({ parentId, cwd, renderTranscript, renderPickers, requests, cl
138
140
  try {
139
141
  await side.remove(sideId);
140
142
  } catch (err) {
141
- throw new Error(labels.sideResetFailed(err instanceof Error ? err.message : String(err)));
143
+ throw new Error(labels.sideResetFailed(errorMessage(err)));
142
144
  }
143
145
  known.current = Promise.resolve({
144
146
  side: null,
@@ -197,7 +199,7 @@ function SideChat({ parentId, cwd, renderTranscript, renderPickers, requests, cl
197
199
  attachments: []
198
200
  }).catch((err) => {
199
201
  composer.current?.insertText(question);
200
- setRequestError(err instanceof Error ? err.message : String(err));
202
+ setRequestError(errorMessage(err));
201
203
  });
202
204
  };
203
205
  take();
@@ -249,11 +251,12 @@ function SideChat({ parentId, cwd, renderTranscript, renderPickers, requests, cl
249
251
  footer: pick && renderPickers ? renderPickers(pick, ensureSide) : void 0,
250
252
  placeholder: labels.sidePlaceholder,
251
253
  ariaLabel: labels.sideComposerLabel,
252
- below: requestError ? /* @__PURE__ */ jsx("p", {
253
- role: "alert",
254
- className: "m-0 px-4 pt-1.5 pb-0.5 text-zg-label text-zg-danger truncate",
255
- title: requestError,
256
- children: requestError
254
+ below: requestError ? /* @__PURE__ */ jsx(Notice, {
255
+ tone: "error",
256
+ compact: true,
257
+ detail: requestError,
258
+ className: "mx-4 mt-1.5",
259
+ children: labels.sideRequestFailed
257
260
  }) : void 0
258
261
  })
259
262
  })]
@@ -1,6 +1,7 @@
1
1
  import { BTN_LG_SECONDARY, BTN_LG_SOLID } from "../components/button.js";
2
2
  import { CodePanel, Tray } from "../components/Surface.js";
3
3
  import { ErrorNote, MetaChip, TEXTAREA_CLASS } from "../components/Form.js";
4
+ import { errorMessage } from "../components/report-error.js";
4
5
  import { useSessionHost } from "./SessionProvider.js";
5
6
  import { useSessionLabels } from "./useSessionLabels.js";
6
7
  import { ShellFrame } from "./SessionShell.js";
@@ -40,7 +41,10 @@ function TurnDetailsDialog({ sessionId, turnId, running = false, neighbors = nul
40
41
  turns.get(sessionId, turnId).then((result) => {
41
42
  if (!cancelled) setTurn(result ?? null);
42
43
  }).catch((err) => {
43
- if (!cancelled) setError(err.message ?? String(err));
44
+ if (!cancelled) setError({
45
+ message: labels.turnLoadFailed,
46
+ detail: errorMessage(err)
47
+ });
44
48
  });
45
49
  return () => {
46
50
  cancelled = true;
@@ -48,7 +52,8 @@ function TurnDetailsDialog({ sessionId, turnId, running = false, neighbors = nul
48
52
  }, [
49
53
  turns,
50
54
  sessionId,
51
- turnId
55
+ turnId,
56
+ labels.turnLoadFailed
52
57
  ]);
53
58
  const act = async (kind, action) => {
54
59
  setBusy(kind);
@@ -56,7 +61,10 @@ function TurnDetailsDialog({ sessionId, turnId, running = false, neighbors = nul
56
61
  try {
57
62
  await action();
58
63
  } catch (err) {
59
- setError(err.message ?? String(err));
64
+ setError({
65
+ message: labels.turnActionFailed,
66
+ detail: errorMessage(err)
67
+ });
60
68
  } finally {
61
69
  setBusy(null);
62
70
  }
@@ -68,7 +76,10 @@ function TurnDetailsDialog({ sessionId, turnId, running = false, neighbors = nul
68
76
  await navigator.clipboard.writeText(turnAsText(turn));
69
77
  setCopied(true);
70
78
  } catch (err) {
71
- setError(labels.turnCopyFailed(err.message ?? String(err)));
79
+ setError({
80
+ message: labels.turnCopyFailed,
81
+ detail: errorMessage(err)
82
+ });
72
83
  } finally {
73
84
  setBusy(null);
74
85
  }
@@ -173,7 +184,10 @@ function TurnDetailsDialog({ sessionId, turnId, running = false, neighbors = nul
173
184
  children: /* @__PURE__ */ jsxs("div", {
174
185
  className: "flex flex-col gap-4",
175
186
  children: [
176
- error && /* @__PURE__ */ jsx(ErrorNote, { children: error }),
187
+ error && /* @__PURE__ */ jsx(ErrorNote, {
188
+ detail: error.detail,
189
+ children: error.message
190
+ }),
177
191
  /* @__PURE__ */ jsx(Tray, {
178
192
  radius: "lg",
179
193
  className: `grid ${GRID_COLS[actions.length] ?? "grid-cols-4"} gap-1.5 p-1.5 text-xs`,
@@ -1,4 +1,5 @@
1
1
  import { BTN_LG_SECONDARY, BTN_SECONDARY } from "../components/button.js";
2
+ import { Notice } from "../components/Notice.js";
2
3
  import { MetaChip } from "../components/Form.js";
3
4
  import { useSessionLabels } from "./useSessionLabels.js";
4
5
  import { useOptionalConfirm } from "../app/useConfirm.js";
@@ -245,11 +246,16 @@ function ResetsRow({ snapshot, resets, account, onRedeem }) {
245
246
  }, credit.id);
246
247
  })
247
248
  }),
248
- outcome && /* @__PURE__ */ jsx("span", {
249
+ outcome && (outcome.code === "failed" ? /* @__PURE__ */ jsx(Notice, {
250
+ tone: "warning",
251
+ compact: true,
252
+ ...outcome.error ? { detail: outcome.error } : {},
253
+ children: labels.usageResetOutcome(outcome.code)
254
+ }) : /* @__PURE__ */ jsx("span", {
249
255
  role: "status",
250
- className: `text-zg-label ${outcome.code === "failed" ? "text-zg-warn" : "text-[var(--zg-text-muted)]"}`,
251
- children: labels.usageResetOutcome(outcome.code, outcome.error)
252
- })
256
+ className: "text-zg-label text-[var(--zg-text-muted)]",
257
+ children: labels.usageResetOutcome(outcome.code)
258
+ }))
253
259
  ] });
254
260
  }
255
261
  /** One window: its name, the bar, then how much is used and when it resets. */
@@ -16,6 +16,8 @@ interface QueuedMessage {
16
16
  sessionId: string;
17
17
  /** What rides with the text, without the bytes (`queue.attachments` fetches them). */
18
18
  attachments?: readonly QueuedAttachment[];
19
+ /** The sender's id for the message, when it gave one: the host's echo of it carries it (a window binds its row by it). */
20
+ clientMessageId?: string;
19
21
  }
20
22
  /** How the backend delivered a message added to the queue. */
21
23
  type QueueAddDelivery = 'queued' | 'sent' | 'steer';
@@ -1,3 +1,4 @@
1
+ import { DEFAULT_SESSION_LABELS } from "./labels.js";
1
2
  import { createSideRequests, parseSideCommand } from "./side.js";
2
3
  import { createKeyedState } from "./keyed.js";
3
4
  import { countArtifacts, createArtifactsState, groupArtifactRows, plainArtifactRow } from "./artifacts.js";
@@ -6,12 +7,11 @@ import { createRunningWorkState, sameRunningWork } from "./running-work.js";
6
7
  import { canKeepSchedule, createSchedulesState, isScheduleFinished, readReminderWhen, remindersSummary, sortSchedules, upcomingSchedules } from "./schedules.js";
7
8
  import { createPlansState, displayedPlan, inboxPlans, planTally } from "./plans.js";
8
9
  import { createSecretsState, sortSecrets } from "./secrets.js";
9
- import { DEFAULT_SESSION_LABELS } from "./labels.js";
10
10
  import { buildDiffTree, fileOrder, relativeTo, visibleRows } from "./diff-tree.js";
11
11
  import { collectSessionDiffs, fileDiffCounts, groupByPath } from "./session-diffs.js";
12
- import { formatTokens, localDayString } from "./usage-format.js";
13
12
  import { EMPTY_HOME_PREFS, arrangeHomeBlocks, hideHomeBlock, homeBlocksOf, homeRows, moveHomeBlock, parseHomePrefs, placeHomeBlock, setHomeBlockView, setHomeBlockWidth, showHomeBlock } from "./home-layout.js";
14
13
  import { USAGE_RANGES, USAGE_SNAPSHOT_KEY, createProviderUsageState, createUsageSummaryState, isUsageSummary, pickUsageSummary } from "./usage.js";
15
14
  import { attachmentsKey, stagedToWire, wireToStaged } from "./queue-attachments.js";
15
+ import { formatTokens, localDayString } from "./usage-format.js";
16
16
  import { createSessionActions, sessionKeyCommands } from "./session-actions.js";
17
17
  export { DEFAULT_SESSION_LABELS, EMPTY_HOME_PREFS, USAGE_RANGES, USAGE_SNAPSHOT_KEY, arrangeHomeBlocks, attachmentsKey, buildDiffTree, canKeepSchedule, collectSessionDiffs, countArtifacts, createArtifactsState, createKeyedState, createPlansState, createProviderUsageState, createQueueState, createRunningWorkState, createSchedulesState, createSecretsState, createSessionActions, createSideRequests, createUsageSummaryState, displayedPlan, fileDiffCounts, fileOrder, formatTokens, groupArtifactRows, groupByPath, hideHomeBlock, homeBlocksOf, homeRows, inboxPlans, isScheduleFinished, isUsageSummary, localDayString, moveHomeBlock, parseHomePrefs, parseSideCommand, pickUsageSummary, placeHomeBlock, plainArtifactRow, planTally, readReminderWhen, relativeTo, remindersSummary, sameRunningWork, sessionKeyCommands, setHomeBlockView, setHomeBlockWidth, showHomeBlock, sortSchedules, sortSecrets, stagedToWire, toQueuedMessages, upcomingSchedules, visibleRows, wireToStaged };
@@ -29,6 +29,8 @@ declare const DEFAULT_SESSION_LABELS: {
29
29
  remindersCount: (n: number) => string;
30
30
  remindersFinished: string;
31
31
  reminderNew: string;
32
+ reminderCreateFailed: string;
33
+ remindersActionFailed: string;
32
34
  reminderWhenLabel: string;
33
35
  reminderWhenPlaceholder: string;
34
36
  reminderWhenPicks: readonly string[];
@@ -64,6 +66,8 @@ declare const DEFAULT_SESSION_LABELS: {
64
66
  reminderHistoryHide: (label: string) => string;
65
67
  reminderHistoryLabel: (label: string) => string;
66
68
  reminderNoFires: string;
69
+ reminderHistoryFailed: string;
70
+ reminderFireFailed: string;
67
71
  reminderFireOutcome: (outcome: import("zidane/chat").ScheduleFireOutcome) => string;
68
72
  reminderFireLate: string;
69
73
  shellClose: string;
@@ -81,6 +85,9 @@ declare const DEFAULT_SESSION_LABELS: {
81
85
  artifactOpen: (path: string) => string;
82
86
  artifactOnRemote: (machine: string) => string;
83
87
  artifactPathUnavailable: string;
88
+ artifactsLoadFailed: string;
89
+ artifactRemoveFailed: string;
90
+ artifactOpenFailed: string;
84
91
  artifactShowDetails: string;
85
92
  artifactHideDetails: string;
86
93
  diffFiles: (files: number) => string;
@@ -102,6 +109,9 @@ declare const DEFAULT_SESSION_LABELS: {
102
109
  secretReplacesSaved: (name: string) => string;
103
110
  secretSave: string;
104
111
  secretCancel: string;
112
+ secretsLoadFailed: string;
113
+ secretRevokeFailed: string;
114
+ secretSaveFailed: string;
105
115
  queueEmpty: string;
106
116
  queueEmptyHint: string;
107
117
  queueCount: (count: number) => string;
@@ -131,6 +141,7 @@ declare const DEFAULT_SESSION_LABELS: {
131
141
  runningWorkCancelAll: string;
132
142
  runningWorkCancel: string;
133
143
  runningWorkCancelling: string;
144
+ runningWorkCancelFailed: string;
134
145
  runningWorkEmpty: string;
135
146
  runningWorkKind: Record<RunningWorkItem["kind"], string>;
136
147
  runningWorkShowTerminal: string;
@@ -142,7 +153,9 @@ declare const DEFAULT_SESSION_LABELS: {
142
153
  turnCopy: string;
143
154
  turnCopied: string;
144
155
  turnCopyHint: string;
145
- turnCopyFailed: (message: string) => string;
156
+ turnCopyFailed: string;
157
+ turnLoadFailed: string;
158
+ turnActionFailed: string;
146
159
  turnFork: string;
147
160
  turnForkHint: string;
148
161
  turnEdit: string;
@@ -190,6 +203,7 @@ declare const DEFAULT_SESSION_LABELS: {
190
203
  projectHomeHide: string;
191
204
  projectHomeRefresh: string;
192
205
  projectHomeDismiss: string;
206
+ projectHomeStartFailed: string;
193
207
  projectHomeCustomize: string;
194
208
  projectHomeSwitch: string;
195
209
  projectHomeDone: string;
@@ -223,6 +237,8 @@ declare const DEFAULT_SESSION_LABELS: {
223
237
  detailsGenerateHint: string;
224
238
  detailsDelete: string;
225
239
  detailsDeleting: string;
240
+ detailsActionFailed: string;
241
+ detailsDeleteFailed: string;
226
242
  detailsStatus: string;
227
243
  cacheScopeLast: (shown: number, total: number) => string;
228
244
  cacheScopeAll: (total: number) => string;
@@ -301,6 +317,7 @@ declare const DEFAULT_SESSION_LABELS: {
301
317
  stepAgentNote: (note: string) => string;
302
318
  planStopped: (step: number | null, reason: PlanStopReason | undefined) => string;
303
319
  planMaybeInterrupted: string;
320
+ planEditFailed: string;
304
321
  stepCancelledByYou: string;
305
322
  stepDroppedByAgent: string;
306
323
  stepAdded: string;
@@ -327,6 +344,7 @@ declare const DEFAULT_SESSION_LABELS: {
327
344
  sideComposerLabel: string;
328
345
  sideResetDescription: string;
329
346
  sideResetFailed: (reason: string) => string;
347
+ sideRequestFailed: string;
330
348
  sideRefusal: (reason: "no-conversation" | "unavailable" | "no-panel") => "Send a message first. A side chat follows a conversation." | "Side chats work only on this computer's conversations" | "This window has no side panel for side chats";
331
349
  };
332
350
  /** The shape of the session label dictionary. Some values are functions that build a string. */
@@ -35,6 +35,9 @@ const SESSION_SURFACE_LABELS = {
35
35
  artifactOpen: (path) => `Open ${path}`,
36
36
  artifactOnRemote: (machine) => `On ${machine}, not this computer.`,
37
37
  artifactPathUnavailable: "Path unavailable.",
38
+ artifactsLoadFailed: "Couldn't load this session's artifacts.",
39
+ artifactRemoveFailed: "Couldn't remove the artifact.",
40
+ artifactOpenFailed: "Couldn't open it.",
38
41
  artifactShowDetails: "Show details",
39
42
  artifactHideDetails: "Hide details",
40
43
  diffFiles: (files) => files === 1 ? "1 file" : `${files} files`,
@@ -56,6 +59,9 @@ const SESSION_SURFACE_LABELS = {
56
59
  secretReplacesSaved: (name) => `Replaces the saved ${name}.`,
57
60
  secretSave: "Save securely",
58
61
  secretCancel: "Cancel",
62
+ secretsLoadFailed: "Couldn't load the secrets.",
63
+ secretRevokeFailed: "Couldn't revoke the secret.",
64
+ secretSaveFailed: "Couldn't save the secret.",
59
65
  queueEmpty: "Nothing queued",
60
66
  queueEmptyHint: "A message you send while the agent works waits here, then goes out when the run ends.",
61
67
  queueCount: (count) => `${count} queued`,
@@ -82,6 +88,7 @@ const SESSION_SURFACE_LABELS = {
82
88
  runningWorkCancelAll: "Cancel all",
83
89
  runningWorkCancel: "Cancel",
84
90
  runningWorkCancelling: "Cancelling…",
91
+ runningWorkCancelFailed: "Couldn't cancel it.",
85
92
  runningWorkEmpty: "Nothing is running",
86
93
  runningWorkKind: {
87
94
  tool: "Tool call",
@@ -96,7 +103,9 @@ const SESSION_SURFACE_LABELS = {
96
103
  turnCopy: "Copy",
97
104
  turnCopied: "Copied",
98
105
  turnCopyHint: "To clipboard",
99
- turnCopyFailed: (message) => `Copy failed: ${message}`,
106
+ turnCopyFailed: "Couldn't copy the turn.",
107
+ turnLoadFailed: "Couldn't load this turn.",
108
+ turnActionFailed: "Couldn't finish that.",
100
109
  turnFork: "Fork",
101
110
  turnForkHint: "New session from here",
102
111
  turnEdit: "Edit",
@@ -154,6 +163,7 @@ const SESSION_SURFACE_LABELS = {
154
163
  projectHomeHide: "Hide block",
155
164
  projectHomeRefresh: "Refresh",
156
165
  projectHomeDismiss: "Dismiss",
166
+ projectHomeStartFailed: "Couldn't start the session.",
157
167
  projectHomeCustomize: "Customize",
158
168
  projectHomeSwitch: "Switch project",
159
169
  projectHomeDone: "Done",
@@ -187,6 +197,8 @@ const SESSION_SURFACE_LABELS = {
187
197
  detailsGenerateHint: "Generate a title from the conversation",
188
198
  detailsDelete: "Delete session",
189
199
  detailsDeleting: "Deleting…",
200
+ detailsActionFailed: "Couldn't finish that.",
201
+ detailsDeleteFailed: "Couldn't delete the session.",
190
202
  detailsStatus: "Status",
191
203
  cacheScopeLast: (shown, total) => `last ${shown} of ${total} requests`,
192
204
  cacheScopeAll: (total) => `${total} request${total === 1 ? "" : "s"}`,
@@ -309,6 +321,7 @@ const DEFAULT_SESSION_LABELS = {
309
321
  stepAgentNote: (note) => `Agent: ${note}`,
310
322
  planStopped: (step, reason) => `Stopped${step ? ` at step ${step}` : ""}: ${reason ? STOP_REASON[reason] : "stopped"}.`,
311
323
  planMaybeInterrupted: "May have been interrupted: no run is applying it now.",
324
+ planEditFailed: "Couldn't change the plan.",
312
325
  stepCancelledByYou: "cancelled by you",
313
326
  stepDroppedByAgent: "dropped by the agent",
314
327
  stepAdded: "added",
@@ -335,6 +348,7 @@ const DEFAULT_SESSION_LABELS = {
335
348
  sideComposerLabel: "Side chat message",
336
349
  sideResetDescription: "Clear this side chat and start over",
337
350
  sideResetFailed: (reason) => `Couldn't reset this side chat: ${reason}`,
351
+ sideRequestFailed: "Couldn't send your question to the side chat.",
338
352
  sideRefusal: (reason) => reason === "no-conversation" ? "Send a message first. A side chat follows a conversation." : reason === "unavailable" ? "Side chats work only on this computer's conversations" : "This window has no side panel for side chats",
339
353
  ...SESSION_SURFACE_LABELS,
340
354
  ...REMINDER_LABELS
@@ -12,7 +12,8 @@ function toQueuedMessages(sessionId, items) {
12
12
  id: item.id,
13
13
  text: item.text,
14
14
  sessionId,
15
- ...item.attachments?.length ? { attachments: item.attachments } : {}
15
+ ...item.attachments?.length ? { attachments: item.attachments } : {},
16
+ ...item.clientMessageId !== void 0 ? { clientMessageId: item.clientMessageId } : {}
16
17
  }));
17
18
  }
18
19
  function toSummaries(attachments) {