zidane-ui 9.1.4 → 9.1.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 (251) hide show
  1. package/dist/adapters/server-extensions-host.js +1 -1
  2. package/dist/adapters/server-host.js +2 -1
  3. package/dist/adapters/server-machines-host.js +1 -1
  4. package/dist/adapters/server-session-host.js +87 -13
  5. package/dist/adapters/server-settings-host.js +1 -1
  6. package/dist/appearance/AppearanceProvider.js +2 -2
  7. package/dist/appearance/headless/index.js +1 -1
  8. package/dist/approvals/headless/index.js +2 -2
  9. package/dist/chat/HostTranscript.d.ts +5 -1
  10. package/dist/chat/HostTranscript.js +16 -4
  11. package/dist/chat/RunEstimateChip.d.ts +5 -3
  12. package/dist/chat/RunEstimateChip.js +33 -3
  13. package/dist/chat/Transcript.js +1 -1
  14. package/dist/chat/composer/ConversationBadges.js +16 -10
  15. package/dist/chat/composer/composer-bus.d.ts +2 -2
  16. package/dist/chat/composer/composer-bus.js +2 -2
  17. package/dist/chat/composer/use-composer-stores.js +1 -1
  18. package/dist/chat/composer/use-run-meter.js +1 -1
  19. package/dist/chat/headless/composer/conversation-badges.d.ts +8 -3
  20. package/dist/chat/headless/composer/conversation-badges.js +26 -11
  21. package/dist/chat/headless/composer/index.js +2 -2
  22. package/dist/chat/headless/composer/labels-chrome.d.ts +3 -1
  23. package/dist/chat/headless/composer/labels-chrome.js +3 -1
  24. package/dist/chat/headless/index.d.ts +6 -3
  25. package/dist/chat/headless/index.js +16 -13
  26. package/dist/chat/headless/labels.d.ts +54 -1
  27. package/dist/chat/headless/labels.js +62 -2
  28. package/dist/chat/headless/secrets.d.ts +32 -0
  29. package/dist/chat/headless/secrets.js +43 -0
  30. package/dist/chat/headless/session-list.d.ts +45 -0
  31. package/dist/chat/headless/sidebar/estimates.js +13 -1
  32. package/dist/chat/headless/sidebar/history.d.ts +71 -0
  33. package/dist/chat/headless/sidebar/history.js +174 -0
  34. package/dist/chat/headless/sidebar/index.d.ts +3 -2
  35. package/dist/chat/headless/sidebar/index.js +2 -1
  36. package/dist/chat/headless/sidebar/labels.d.ts +50 -0
  37. package/dist/chat/headless/sidebar/labels.js +1 -0
  38. package/dist/chat/headless/sidebar/query.d.ts +2 -2
  39. package/dist/chat/headless/sidebar/query.js +6 -3
  40. package/dist/chat/headless/sidebar/types.d.ts +7 -1
  41. package/dist/chat/headless/sidebar/view.js +2 -0
  42. package/dist/chat/headless/transcript/auth-failure.d.ts +67 -0
  43. package/dist/chat/headless/transcript/auth-failure.js +87 -0
  44. package/dist/chat/headless/transcript/index.d.ts +2 -1
  45. package/dist/chat/headless/transcript/index.js +2 -1
  46. package/dist/chat/headless/transcript/nesting.d.ts +3 -3
  47. package/dist/chat/headless/transcript/nesting.js +12 -4
  48. package/dist/chat/index.d.ts +4 -2
  49. package/dist/chat/index.js +3 -1
  50. package/dist/chat/interactions/InboxPanel.d.ts +6 -2
  51. package/dist/chat/interactions/InboxPanel.js +82 -44
  52. package/dist/chat/interactions/PlanCard.d.ts +2 -2
  53. package/dist/chat/interactions/PlanCard.js +1 -1
  54. package/dist/chat/interactions/QuestionField.d.ts +8 -3
  55. package/dist/chat/interactions/QuestionField.js +89 -8
  56. package/dist/chat/interactions/QuestionForm.d.ts +3 -1
  57. package/dist/chat/interactions/QuestionForm.js +48 -10
  58. package/dist/chat/interactions/SecretInput.d.ts +32 -0
  59. package/dist/chat/interactions/SecretInput.js +72 -0
  60. package/dist/chat/interactions/card-ui.d.ts +5 -3
  61. package/dist/chat/interactions/card-ui.js +5 -3
  62. package/dist/chat/interactions/index.d.ts +2 -1
  63. package/dist/chat/interactions/index.js +2 -1
  64. package/dist/chat/sidebar/SessionSidebar.js +2 -0
  65. package/dist/chat/sidebar/SidebarFilterMenu.d.ts +7 -2
  66. package/dist/chat/sidebar/SidebarFilterMenu.js +26 -2
  67. package/dist/chat/sidebar/SidebarSessionRow.d.ts +3 -1
  68. package/dist/chat/sidebar/SidebarSessionRow.js +8 -3
  69. package/dist/chat/sidebar/sidebar-live.js +8 -4
  70. package/dist/chat/transcript/AuthFailureCard.d.ts +34 -0
  71. package/dist/chat/transcript/AuthFailureCard.js +358 -0
  72. package/dist/chat/transcript/InteractionToolBody.js +12 -2
  73. package/dist/chat/transcript/actions.d.ts +24 -1
  74. package/dist/chat/transcript/index.d.ts +3 -2
  75. package/dist/chat/transcript/index.js +2 -1
  76. package/dist/chat/transcript/notices.d.ts +2 -1
  77. package/dist/chat/transcript/notices.js +13 -1
  78. package/dist/chat/transcript/script-input.d.ts +1 -1
  79. package/dist/chat/transcript/shell-block.js +1 -1
  80. package/dist/components/HowItWorks.d.ts +8 -1
  81. package/dist/components/HowItWorks.js +2 -2
  82. package/dist/components/RowActionsMenu.d.ts +6 -1
  83. package/dist/components/RowActionsMenu.js +4 -0
  84. package/dist/core.css +24 -0
  85. package/dist/dist/{index-WlE93Q6d.d.ts → index-DqCio7Nd.d.ts} +36 -3
  86. package/dist/dist/index-f-XWIoYo.d.ts +1 -0
  87. package/dist/dist/index.d.ts +6 -0
  88. package/dist/dist/sandbox-B4OW6oNx.d.ts +2 -0
  89. package/dist/dist/timeout-B5pO5I5a.d.ts +30 -0
  90. package/dist/extensions/ExtensionSettingsPage.js +1 -1
  91. package/dist/extensions/ExtensionSettingsSidebar.js +1 -1
  92. package/dist/extensions/headless/fixture-host.js +1 -1
  93. package/dist/extensions/headless/index.js +4 -4
  94. package/dist/extensions/hooks.js +1 -1
  95. package/dist/files/DiffsTab.js +1 -1
  96. package/dist/files/EditorColumn.js +1 -1
  97. package/dist/files/MediaDiff.js +1 -1
  98. package/dist/files/SearchPanel.js +121 -53
  99. package/dist/files/headless/name-match.js +29 -14
  100. package/dist/files/useEntryActions.js +1 -1
  101. package/dist/files/useOpenFiles.js +1 -1
  102. package/dist/git/WherePicker.js +2 -2
  103. package/dist/git/headless/environment.d.ts +6 -1
  104. package/dist/git/headless/environment.js +5 -2
  105. package/dist/git/headless/labels.d.ts +2 -0
  106. package/dist/git/headless/labels.js +2 -0
  107. package/dist/git/index.d.ts +2 -1
  108. package/dist/git/index.js +2 -1
  109. package/dist/git/useStartFromPanel.d.ts +22 -0
  110. package/dist/git/useStartFromPanel.js +91 -0
  111. package/dist/keybindings/KeyCommands.js +1 -1
  112. package/dist/keybindings/KeybindingsProvider.js +1 -1
  113. package/dist/keybindings/headless/catalog.d.ts +1 -1
  114. package/dist/keybindings/headless/catalog.js +14 -2
  115. package/dist/keybindings/headless/index.js +2 -2
  116. package/dist/keybindings/headless/key-scope.d.ts +4 -2
  117. package/dist/keybindings/headless/key-scope.js +17 -2
  118. package/dist/keybindings/headless/overrides.js +1 -1
  119. package/dist/machines/HostSyncPanel.js +1 -1
  120. package/dist/machines/SyncOutcomeBadge.js +1 -1
  121. package/dist/machines/headless/index.js +1 -1
  122. package/dist/onboarding/demos/features.d.ts +9 -1
  123. package/dist/onboarding/demos/features.js +107 -2
  124. package/dist/onboarding/demos/how-it-works.d.ts +5 -1
  125. package/dist/onboarding/demos/how-it-works.js +120 -2
  126. package/dist/onboarding/demos/index.js +1 -1
  127. package/dist/onboarding/headless/labels.d.ts +17 -0
  128. package/dist/onboarding/headless/labels.js +17 -0
  129. package/dist/onboarding/index.js +4 -4
  130. package/dist/onboarding/marks.d.ts +1 -2
  131. package/dist/onboarding/marks.js +4 -12
  132. package/dist/onboarding/steps/ConnectorsStep.js +1 -1
  133. package/dist/onboarding/steps/ReadyStep.js +1 -1
  134. package/dist/onboarding/steps/SkillsStep.js +1 -1
  135. package/dist/onboarding/steps/connect/ProviderPanel.js +1 -1
  136. package/dist/onboarding/tutorials.d.ts +3 -1
  137. package/dist/onboarding/tutorials.js +2 -1
  138. package/dist/palette/app-sources.js +1 -1
  139. package/dist/palette/headless/app-sources.js +10 -0
  140. package/dist/palette/headless/labels.js +2 -0
  141. package/dist/session/ArtifactsPanel.js +1 -1
  142. package/dist/session/PanelAttention.d.ts +14 -6
  143. package/dist/session/PanelAttention.js +35 -24
  144. package/dist/session/PlanTracker.d.ts +54 -0
  145. package/dist/session/PlanTracker.js +413 -0
  146. package/dist/session/ProjectHome.d.ts +15 -2
  147. package/dist/session/ProjectHome.js +158 -85
  148. package/dist/session/RemindersPanel.d.ts +25 -0
  149. package/dist/session/RemindersPanel.js +526 -0
  150. package/dist/session/SecretsPanel.d.ts +19 -0
  151. package/dist/session/SecretsPanel.js +241 -0
  152. package/dist/session/SessionProvider.d.ts +26 -5
  153. package/dist/session/SessionProvider.js +51 -6
  154. package/dist/session/StepStatusIcon.d.ts +24 -0
  155. package/dist/session/StepStatusIcon.js +50 -0
  156. package/dist/session/TodoList.d.ts +4 -3
  157. package/dist/session/TodoList.js +6 -5
  158. package/dist/session/headless/fixture-host.d.ts +32 -22
  159. package/dist/session/headless/fixture-host.js +86 -51
  160. package/dist/session/headless/fixture-plans.d.ts +57 -0
  161. package/dist/session/headless/fixture-plans.js +141 -0
  162. package/dist/session/headless/fixture-schedules.d.ts +49 -0
  163. package/dist/session/headless/fixture-schedules.js +133 -0
  164. package/dist/session/headless/home-layout.d.ts +10 -2
  165. package/dist/session/headless/home-layout.js +7 -2
  166. package/dist/session/headless/host.d.ts +85 -13
  167. package/dist/session/headless/index.d.ts +5 -3
  168. package/dist/session/headless/index.js +5 -3
  169. package/dist/session/headless/labels.d.ts +95 -12
  170. package/dist/session/headless/labels.js +67 -18
  171. package/dist/session/headless/plans.d.ts +53 -0
  172. package/dist/session/headless/plans.js +78 -0
  173. package/dist/session/headless/reminder-labels.d.ts +63 -0
  174. package/dist/session/headless/reminder-labels.js +84 -0
  175. package/dist/session/headless/schedules.d.ts +93 -0
  176. package/dist/session/headless/schedules.js +190 -0
  177. package/dist/session/headless/secrets.d.ts +28 -0
  178. package/dist/session/headless/secrets.js +48 -0
  179. package/dist/session/index.d.ts +7 -5
  180. package/dist/session/index.js +6 -4
  181. package/dist/session/testing/contract.d.ts +18 -5
  182. package/dist/session/testing/contract.js +351 -43
  183. package/dist/session/testing/index.d.ts +4 -2
  184. package/dist/session/testing/index.js +4 -2
  185. package/dist/settings/headless/catalog.js +17 -1
  186. package/dist/settings/headless/index.d.ts +2 -2
  187. package/dist/settings/headless/index.js +3 -3
  188. package/dist/settings/headless/labels.d.ts +0 -2
  189. package/dist/settings/headless/labels.js +0 -2
  190. package/dist/settings/headless/layout.js +7 -1
  191. package/dist/settings/headless/providers.d.ts +17 -1
  192. package/dist/settings/headless/providers.js +19 -1
  193. package/dist/settings/headless/search.d.ts +1 -1
  194. package/dist/settings/rows.d.ts +1 -1
  195. package/dist/settings/rows.js +2 -2
  196. package/dist/settings/sections/appearance/AppearanceSection.js +2 -2
  197. package/dist/settings/sections/claude-import/ClaudeImportDialog.js +1 -1
  198. package/dist/settings/sections/editor/EditorSection.js +1 -1
  199. package/dist/settings/sections/environments/EnvironmentsSection.js +1 -1
  200. package/dist/settings/sections/extensions/ChangeOriginDialog.js +1 -1
  201. package/dist/settings/sections/extensions/CreateExtensionDialog.js +1 -1
  202. package/dist/settings/sections/extensions/ExtensionsSection.js +1 -1
  203. package/dist/settings/sections/host-catalog/HostCatalogSection.js +1 -1
  204. package/dist/settings/sections/instructions/InstructionsSection.js +1 -1
  205. package/dist/settings/sections/keybindings/labels.d.ts +2 -0
  206. package/dist/settings/sections/keybindings/labels.js +2 -0
  207. package/dist/settings/sections/keybindings/rows.js +8 -0
  208. package/dist/settings/sections/mcp/McpSection.js +1 -1
  209. package/dist/settings/sections/mcp/McpServerRow.js +1 -1
  210. package/dist/settings/sections/models/ModelRows.js +2 -2
  211. package/dist/settings/sections/providers/ProvidersSection.js +209 -201
  212. package/dist/settings/sections/providers/ServerProvidersSection.js +1 -1
  213. package/dist/settings/sections/shared/catalog.js +1 -1
  214. package/dist/settings/sections/skills/SkillList.js +1 -1
  215. package/dist/settings/sections/skills/SkillsSection.js +2 -2
  216. package/dist/styles.css +59 -1
  217. package/dist/terminal/HostTerminalSurface.js +2 -2
  218. package/dist/workspace/PanelContentView.d.ts +22 -4
  219. package/dist/workspace/PanelContentView.js +112 -16
  220. package/dist/workspace/PanelGlyph.d.ts +21 -0
  221. package/dist/workspace/PanelGlyph.js +33 -0
  222. package/dist/workspace/PanelHome.js +5 -3
  223. package/dist/workspace/PanelStrip.js +11 -4
  224. package/dist/workspace/PanelToolbar.d.ts +32 -0
  225. package/dist/workspace/PanelToolbar.js +194 -0
  226. package/dist/workspace/WorkspaceProvider.d.ts +3 -1
  227. package/dist/workspace/WorkspaceProvider.js +6 -2
  228. package/dist/workspace/extension-tabs.js +5 -2
  229. package/dist/workspace/headless/host.d.ts +4 -0
  230. package/dist/workspace/headless/index.d.ts +3 -1
  231. package/dist/workspace/headless/index.js +4 -2
  232. package/dist/workspace/headless/labels.d.ts +10 -0
  233. package/dist/workspace/headless/labels.js +11 -1
  234. package/dist/workspace/headless/pages.d.ts +15 -0
  235. package/dist/workspace/headless/pages.js +49 -0
  236. package/dist/workspace/headless/tab-mark.d.ts +14 -0
  237. package/dist/workspace/headless/tab-mark.js +27 -0
  238. package/dist/workspace/headless/view.d.ts +7 -1
  239. package/dist/workspace/index.d.ts +3 -2
  240. package/dist/workspace/index.js +3 -2
  241. package/dist/workspace/testing/index.js +6 -0
  242. package/dist/workspace/workspace-key-commands.js +3 -3
  243. package/package.json +2 -2
  244. package/src/styles/motion.css +13 -0
  245. package/src/styles/onboarding.css +0 -1
  246. package/src/styles/primitives.css +10 -0
  247. package/src/styles/workspace.css +17 -0
  248. package/dist/session/TodosPanel.d.ts +0 -19
  249. package/dist/session/TodosPanel.js +0 -251
  250. package/dist/session/headless/todos.d.ts +0 -22
  251. package/dist/session/headless/todos.js +0 -38
@@ -51,11 +51,14 @@ function resolveDraftDescriptor(descriptors, draft) {
51
51
  function resolveDraftEnvironment(descriptors, draft) {
52
52
  const descriptor = resolveDraftDescriptor(descriptors, draft);
53
53
  if (!descriptor || descriptor.kind === "local") return;
54
- const typed = draft?.kind === descriptor.kind ? draft.branch.trim() : "";
54
+ const picked = draft?.kind === descriptor.kind ? draft : null;
55
+ const typed = picked ? picked.branch.trim() : "";
55
56
  const branch = descriptor.takesBranch ? typed || descriptor.suggestedBranch : void 0;
57
+ const checkout = descriptor.takesBranch && typed && picked?.checkout ? picked.checkout : void 0;
56
58
  return {
57
59
  kind: descriptor.kind,
58
- ...branch ? { branch } : {}
60
+ ...branch ? { branch } : {},
61
+ ...checkout ? { checkout } : {}
59
62
  };
60
63
  }
61
64
  /**
@@ -5,6 +5,8 @@ type Checks = NonNullable<GitPullRequest['checks']>;
5
5
  declare const DEFAULT_GIT_LABELS: {
6
6
  /** A host call the host cannot make here. */
7
7
  gitUnavailable: string;
8
+ gitStartNoWorktree: string;
9
+ gitStartCheckedOutElsewhere: (path: string) => string;
8
10
  gitBranchButton: (branch: string) => string;
9
11
  gitBranchDetached: (commit: string) => string;
10
12
  gitBranchSwitch: string;
@@ -9,6 +9,8 @@ const plural = (n, one) => `${n} ${one}${n === 1 ? "" : "s"}`;
9
9
  const DEFAULT_GIT_LABELS = {
10
10
  /** A host call the host cannot make here. */
11
11
  gitUnavailable: "Not available here.",
12
+ gitStartNoWorktree: "Worktrees are not available for this folder.",
13
+ gitStartCheckedOutElsewhere: (path) => `That branch is checked out in ${path}. Open it in a worktree instead.`,
12
14
  gitBranchButton: (branch) => `Branch ${branch}`,
13
15
  gitBranchDetached: (commit) => `Detached at ${commit}`,
14
16
  gitBranchSwitch: "Switch branch",
@@ -8,4 +8,5 @@ import { GIT_BAR_ITEM, SyncChip, SyncChipProps } from "./SyncChip.js";
8
8
  import { WhereMenu, WhereMenuProps, WherePicker, WherePickerProps } from "./WherePicker.js";
9
9
  import { GitBarState, useGitBar } from "./useGitBar.js";
10
10
  import { useEnvironmentChoices } from "./useEnvironmentChoices.js";
11
- export { BranchMenu, BranchMenuProps, BranchMenuWorktree, GIT_BAR_ITEM, GitBar, GitBarBranchMenuProps, GitBarProps, GitBarState, GitProvider, GitProviderProps, ImportRepoDialog, ImportRepoDialogProps, ImportRepoTarget, MoveSessionDialog, MoveSessionDialogProps, RemoteFolderBrowser, RemoteFolderBrowserProps, RemoteFolderPicker, RemoteFolderPickerProps, SyncChip, SyncChipProps, WhereMenu, WhereMenuProps, WherePicker, WherePickerProps, useEnvironmentChoices, useGitBar, useGitHost, useGitLabels, useImportRepo, useMoveSession };
11
+ import { StartFromPanelDraft, StartFromPanelResult, useStartFromPanel } from "./useStartFromPanel.js";
12
+ export { BranchMenu, BranchMenuProps, BranchMenuWorktree, GIT_BAR_ITEM, GitBar, GitBarBranchMenuProps, GitBarProps, GitBarState, GitProvider, GitProviderProps, ImportRepoDialog, ImportRepoDialogProps, ImportRepoTarget, MoveSessionDialog, MoveSessionDialogProps, RemoteFolderBrowser, RemoteFolderBrowserProps, RemoteFolderPicker, RemoteFolderPickerProps, StartFromPanelDraft, StartFromPanelResult, SyncChip, SyncChipProps, WhereMenu, WhereMenuProps, WherePicker, WherePickerProps, useEnvironmentChoices, useGitBar, useGitHost, useGitLabels, useImportRepo, useMoveSession, useStartFromPanel };
package/dist/git/index.js CHANGED
@@ -8,4 +8,5 @@ import { useGitBar } from "./useGitBar.js";
8
8
  import { GitBar } from "./GitBar.js";
9
9
  import { MoveSessionDialog, useMoveSession } from "./MoveSessionDialog.js";
10
10
  import { WhereMenu, WherePicker } from "./WherePicker.js";
11
- export { BranchMenu, GIT_BAR_ITEM, GitBar, GitProvider, ImportRepoDialog, MoveSessionDialog, RemoteFolderBrowser, RemoteFolderPicker, SyncChip, WhereMenu, WherePicker, useEnvironmentChoices, useGitBar, useGitHost, useGitLabels, useImportRepo, useMoveSession };
11
+ import { useStartFromPanel } from "./useStartFromPanel.js";
12
+ export { BranchMenu, GIT_BAR_ITEM, GitBar, GitProvider, ImportRepoDialog, MoveSessionDialog, RemoteFolderBrowser, RemoteFolderPicker, SyncChip, WhereMenu, WherePicker, useEnvironmentChoices, useGitBar, useGitHost, useGitLabels, useImportRepo, useMoveSession, useStartFromPanel };
@@ -0,0 +1,22 @@
1
+ import { DraftTarget } from "../chat/composer/use-draft-target.js";
2
+ import { PanelStartSession } from "zidane/chat/pure";
3
+ //#region src/git/useStartFromPanel.d.ts
4
+ /** What a start answered: done, or why not in words. */
5
+ type StartFromPanelResult = {
6
+ ok: true;
7
+ } | {
8
+ ok: false;
9
+ message: string;
10
+ };
11
+ /** The draft a start sets up. */
12
+ type StartFromPanelDraft = Pick<DraftTarget, 'environment' | 'setEnvironment' | 'environmentChoices'>;
13
+ /**
14
+ * Returns the start for `cwd`'s draft: it sets the draft's environment, switches the folder when asked, replaces
15
+ * the composer's text with the row's prompt and focuses it.
16
+ *
17
+ * @param draft - The new-chat draft on screen.
18
+ * @param cwd - The folder the panel is for.
19
+ */
20
+ declare function useStartFromPanel(draft: StartFromPanelDraft, cwd: string): (start: PanelStartSession) => Promise<StartFromPanelResult>;
21
+ //#endregion
22
+ export { StartFromPanelDraft, StartFromPanelResult, useStartFromPanel };
@@ -0,0 +1,91 @@
1
+ import { gitErrorText } from "./headless/labels.js";
2
+ import { useGitHost, useGitLabels } from "./GitProvider.js";
3
+ import { focusComposer, pushComposerDraft } from "../chat/composer/composer-bus.js";
4
+ import { useCallback } from "react";
5
+ import { parseMachineKind } from "zidane/chat/pure";
6
+ //#region src/git/useStartFromPanel.ts
7
+ /**
8
+ * A panel row's "start a session" (`PanelStartSession`: a pull request's or a ticket's Open in worktree, Switch
9
+ * to branch, Open here) on the new-chat draft on screen: the draft's environment and the composer's text. Nothing
10
+ * is sent: the user reviews the prompt and sends it.
11
+ *
12
+ * - `worktree`: the draft runs in a worktree on the row's branch, checked out as it is
13
+ * (`DraftEnvironment.checkout`): the local branch, `origin`'s, else the pull request's head.
14
+ * - `here`: the folder switches to the pull request or branch first (`GitHost.checkout`, never forced: git's
15
+ * refusal comes back as the result), and the draft runs in the folder itself.
16
+ */
17
+ const isWorktreeKind = (kind) => kind === "worktree" || parseMachineKind(kind)?.base === "worktree";
18
+ const isLocalKind = (kind) => kind === "local" || parseMachineKind(kind)?.base === "local";
19
+ /**
20
+ * The worktree kind to start in: the draft's own when it is one (a machine's), else this computer's. `null`: none
21
+ * offered or available.
22
+ */
23
+ function worktreeKind(draft) {
24
+ const choices = draft.environmentChoices.filter((d) => d.available && isWorktreeKind(d.kind));
25
+ return ((draft.environment && choices.find((d) => d.kind === draft.environment.kind)) ?? choices.find((d) => d.kind === "worktree") ?? null)?.kind ?? null;
26
+ }
27
+ /**
28
+ * Returns the start for `cwd`'s draft: it sets the draft's environment, switches the folder when asked, replaces
29
+ * the composer's text with the row's prompt and focuses it.
30
+ *
31
+ * @param draft - The new-chat draft on screen.
32
+ * @param cwd - The folder the panel is for.
33
+ */
34
+ function useStartFromPanel(draft, cwd) {
35
+ const git = useGitHost();
36
+ const labels = useGitLabels();
37
+ const { environment, environmentChoices, setEnvironment } = draft;
38
+ return useCallback(async (start) => {
39
+ if (start.where === "worktree") {
40
+ const kind = worktreeKind({
41
+ environment,
42
+ environmentChoices,
43
+ setEnvironment
44
+ });
45
+ if (!kind) return {
46
+ ok: false,
47
+ message: labels.gitStartNoWorktree
48
+ };
49
+ const branch = start.branch ?? (start.pullRequest ? `pr-${start.pullRequest}` : "");
50
+ const pick = {
51
+ kind,
52
+ branch,
53
+ ...branch ? { checkout: start.pullRequest ? { pullRequest: start.pullRequest } : {} } : {}
54
+ };
55
+ setEnvironment(pick);
56
+ } else {
57
+ const target = start.pullRequest ? { pullRequest: start.pullRequest } : start.branch ? { branch: start.branch } : null;
58
+ if (target) {
59
+ if (!git?.checkout) return {
60
+ ok: false,
61
+ message: labels.gitUnavailable
62
+ };
63
+ const result = await git.checkout(cwd, target);
64
+ if (!result.ok) return {
65
+ ok: false,
66
+ message: result.worktree ? labels.gitStartCheckedOutElsewhere(result.worktree.path) : gitErrorText(result.error, labels)
67
+ };
68
+ }
69
+ const local = environmentChoices.find((d) => d.available && d.kind === "local") ?? environmentChoices.find((d) => d.available && isLocalKind(d.kind));
70
+ setEnvironment(local ? {
71
+ kind: local.kind,
72
+ branch: ""
73
+ } : null);
74
+ }
75
+ pushComposerDraft({
76
+ text: start.prompt ?? "",
77
+ attachments: []
78
+ });
79
+ focusComposer();
80
+ return { ok: true };
81
+ }, [
82
+ git,
83
+ labels,
84
+ cwd,
85
+ environment,
86
+ environmentChoices,
87
+ setEnvironment
88
+ ]);
89
+ }
90
+ //#endregion
91
+ export { useStartFromPanel };
@@ -1,7 +1,7 @@
1
+ import { createKeyCommandRegistry } from "./headless/commands.js";
1
2
  import { getMergedKeybindings } from "./headless/overrides.js";
2
3
  import { loadOnce } from "./load-once.js";
3
4
  import { bindKeyListeners, useKeybindingsHost } from "./KeybindingsProvider.js";
4
- import { createKeyCommandRegistry } from "./headless/commands.js";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  import { createContext, useContext, useEffect, useLayoutEffect, useRef, useState, useSyncExternalStore } from "react";
7
7
  //#region src/keybindings/KeyCommands.tsx
@@ -1,7 +1,7 @@
1
1
  import { LabelsProvider } from "../labels.js";
2
2
  import { DEFAULT_KEYBINDINGS, KEYBINDING_DEF_BY_ACTION } from "./headless/catalog.js";
3
- import { bindingAllowedIn, keyScopeOf } from "./headless/key-scope.js";
4
3
  import { getMergedKeybindings } from "./headless/overrides.js";
4
+ import { bindingAllowedIn, keyScopeOf } from "./headless/key-scope.js";
5
5
  import { loadOnce } from "./load-once.js";
6
6
  import { matchesBinding } from "./match.js";
7
7
  import { jsx } from "react/jsx-runtime";
@@ -1,7 +1,7 @@
1
1
  import { ParsedBinding, bindingAlternatives, parseBindingSpec, parseBindingSpecs } from "zidane/chat/pure";
2
2
  //#region src/keybindings/headless/catalog.d.ts
3
3
  /** Every action a key binding can fire. */
4
- type KeyAction = 'openSettings' | 'openSessionDetails' | 'openModelPicker' | 'openEffortPicker' | 'openTodos' | 'openArtifacts' | 'openMainSession' | 'openUsagePanel' | 'newSession' | 'openKeybindings' | 'openPalette' | 'cancelToolCall' | 'cycleAgent' | 'enterSelectTurnMode' | 'toggleSidebar' | 'sessionGenerateTitle' | 'sessionCompact' | 'sessionExportMarkdown' | 'sessionExportJson' | 'sessionDelete' | 'sessionCopyId' | 'sessionFavorite' | 'zoomIn' | 'zoomOut' | 'zoomReset' | 'panelNext' | 'panelPrev' | 'tabNext' | 'tabPrev' | 'closeTab' | 'toggleTerminal' | 'newTerminal' | 'annotatePage' | 'splitTabRight' | 'splitTabDown';
4
+ type KeyAction = 'openSettings' | 'openSessionDetails' | 'openModelPicker' | 'openEffortPicker' | 'openTodos' | 'openArtifacts' | 'openMainSession' | 'openUsagePanel' | 'newSession' | 'openKeybindings' | 'openPalette' | 'cancelToolCall' | 'cycleAgent' | 'enterSelectTurnMode' | 'toggleSidebar' | 'navigateBack' | 'navigateForward' | 'sessionGenerateTitle' | 'sessionCompact' | 'sessionExportMarkdown' | 'sessionExportJson' | 'sessionDelete' | 'sessionCopyId' | 'sessionFavorite' | 'zoomIn' | 'zoomOut' | 'zoomReset' | 'panelNext' | 'panelPrev' | 'tabNext' | 'tabPrev' | 'closeTab' | 'toggleTerminal' | 'newTerminal' | 'annotatePage' | 'splitTabRight' | 'splitTabDown';
5
5
  /** One action of the catalog. */
6
6
  interface KeyBindingDef {
7
7
  /** The action. */
@@ -33,8 +33,8 @@ const KEYBINDING_DEFS = [
33
33
  {
34
34
  action: "openTodos",
35
35
  default: "ctrl+t",
36
- label: "todos",
37
- description: "open the active run's todo list (the agent's `todowrite` checkpoints)"
36
+ label: "plan",
37
+ description: "open the Inbox: what waits on you, the plan in progress and the recent ones"
38
38
  },
39
39
  {
40
40
  action: "openArtifacts",
@@ -103,6 +103,18 @@ const KEYBINDING_DEFS = [
103
103
  label: "sidebar",
104
104
  description: "show or hide the chats sidebar"
105
105
  },
106
+ {
107
+ action: "navigateBack",
108
+ default: "cmd+left | cmd+[",
109
+ label: "back",
110
+ description: "go back to the conversation shown before, like a browser"
111
+ },
112
+ {
113
+ action: "navigateForward",
114
+ default: "cmd+right | cmd+]",
115
+ label: "forward",
116
+ description: "go forward again to the conversation you went back from"
117
+ },
106
118
  {
107
119
  action: "sessionGenerateTitle",
108
120
  default: "ctrl+shift+t",
@@ -1,6 +1,6 @@
1
1
  import { DEFAULT_KEYBINDINGS, KEYBINDING_DEFS, KEYBINDING_DEF_BY_ACTION, bindingAlternatives, parseBindingSpec, parseBindingSpecs } from "./catalog.js";
2
- import { KEYSCOPE_ATTR, bindingAllowedIn, isTypingFocused, isTypingTarget, keyScopeOf } from "./key-scope.js";
3
- import { createKeybindingOverrides, filterOverrides, getMergedKeybindings } from "./overrides.js";
4
2
  import { createKeyCommandRegistry } from "./commands.js";
3
+ import { createKeybindingOverrides, filterOverrides, getMergedKeybindings } from "./overrides.js";
4
+ import { KEYSCOPE_ATTR, bindingAllowedIn, isTypingFocused, isTypingTarget, keyScopeOf } from "./key-scope.js";
5
5
  import { DEFAULT_KEYBINDINGS_LABELS } from "./labels.js";
6
6
  export { DEFAULT_KEYBINDINGS, DEFAULT_KEYBINDINGS_LABELS, KEYBINDING_DEFS, KEYBINDING_DEF_BY_ACTION, KEYSCOPE_ATTR, bindingAllowedIn, bindingAlternatives, createKeyCommandRegistry, createKeybindingOverrides, filterOverrides, getMergedKeybindings, isTypingFocused, isTypingTarget, keyScopeOf, parseBindingSpec, parseBindingSpecs };
@@ -25,8 +25,10 @@ declare function isTypingFocused(): boolean;
25
25
  /**
26
26
  * Whether an app-level binding may fire under `scope`. In the editor,
27
27
  * `ctrl+<letter>` without shift belongs to the editor (movement and
28
- * editing chords); everything with shift, meta or a non-letter key is an
29
- * app intent (settings, panels, zoom).
28
+ * editing chords), and so do `cmd+[` / `cmd+]` (indent). In the editor and
29
+ * text fields, an arrow with ⌘ or ⌥ alone (shift or not) moves the caret.
30
+ * Everything else with shift, meta or a non-letter key is an app intent
31
+ * (settings, panels, zoom).
30
32
  *
31
33
  * @param scope - Who owns the press.
32
34
  * @param spec - The binding.
@@ -51,18 +51,33 @@ function isTypingFocused() {
51
51
  }
52
52
  return false;
53
53
  }
54
+ const ARROWS = /* @__PURE__ */ new Set([
55
+ "left",
56
+ "right",
57
+ "up",
58
+ "down"
59
+ ]);
60
+ /** An arrow with ⌘ or ⌥ (not both, no ctrl): a text surface's line, word and document moves. */
61
+ function movesCaret(spec) {
62
+ return ARROWS.has(spec.name) && !spec.ctrl && spec.meta !== spec.alt;
63
+ }
54
64
  /**
55
65
  * Whether an app-level binding may fire under `scope`. In the editor,
56
66
  * `ctrl+<letter>` without shift belongs to the editor (movement and
57
- * editing chords); everything with shift, meta or a non-letter key is an
58
- * app intent (settings, panels, zoom).
67
+ * editing chords), and so do `cmd+[` / `cmd+]` (indent). In the editor and
68
+ * text fields, an arrow with ⌘ or ⌥ alone (shift or not) moves the caret.
69
+ * Everything else with shift, meta or a non-letter key is an app intent
70
+ * (settings, panels, zoom).
59
71
  *
60
72
  * @param scope - Who owns the press.
61
73
  * @param spec - The binding.
62
74
  * @param action - The binding's action (`closeTab` fires everywhere).
63
75
  */
64
76
  function bindingAllowedIn(scope, spec, action) {
77
+ if (scope !== "editor" && scope !== "input") return true;
78
+ if (movesCaret(spec)) return false;
65
79
  if (scope !== "editor") return true;
80
+ if (spec.meta && !spec.ctrl && !spec.alt && !spec.shift && (spec.name === "[" || spec.name === "]")) return false;
66
81
  if (action === "closeTab") return true;
67
82
  return !(spec.ctrl && !spec.shift && !spec.meta && !spec.alt && /^[a-z]$/i.test(spec.name));
68
83
  }
@@ -1,5 +1,5 @@
1
- import { writable } from "../../chat/headless/store.js";
2
1
  import { DEFAULT_KEYBINDINGS } from "./catalog.js";
2
+ import { writable } from "../../chat/headless/store.js";
3
3
  //#region src/keybindings/headless/overrides.ts
4
4
  /**
5
5
  * The overrides model every `KeybindingsHost` shares: read the stored map,
@@ -2,8 +2,8 @@ import { BTN_SECONDARY } from "../components/button.js";
2
2
  import { Checkbox, OpLine, SegmentedRow } from "../components/Form.js";
3
3
  import { constant, useReadable } from "../chat/headless/store.js";
4
4
  import { machinesError } from "./headless/host.js";
5
- import { useMachinesConfirm, useMachinesHost, useMachinesLabels } from "./MachinesProvider.js";
6
5
  import { shortList, syncBlockedReason } from "./headless/sync.js";
6
+ import { useMachinesConfirm, useMachinesHost, useMachinesLabels } from "./MachinesProvider.js";
7
7
  import { useHostCapabilities } from "./HostCapabilities.js";
8
8
  import { SyncAccounts } from "./SyncAccounts.js";
9
9
  import { SyncOutcomeBadge } from "./SyncOutcomeBadge.js";
@@ -1,7 +1,7 @@
1
1
  import { Tooltip } from "../components/Tooltip.js";
2
2
  import { MetaChip } from "../components/Form.js";
3
- import { useMachinesLabels } from "./MachinesProvider.js";
4
3
  import { syncOutcome } from "./headless/sync.js";
4
+ import { useMachinesLabels } from "./MachinesProvider.js";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  //#region src/machines/SyncOutcomeBadge.tsx
7
7
  const MAX_LINES = 12;
@@ -1,8 +1,8 @@
1
1
  import { isMachinesError, isPermitted, machinesError } from "./host.js";
2
- import { DEFAULT_MACHINES_LABELS } from "./labels.js";
3
2
  import { createPresenceStore } from "./presence.js";
4
3
  import { createMachineLists, createOnlineMachines, lazyReadable } from "./stores.js";
5
4
  import { createHostSyncReads, shortList, syncBlockedReason, syncOutcome } from "./sync.js";
5
+ import { DEFAULT_MACHINES_LABELS } from "./labels.js";
6
6
  import { UPDATE_BUSY_STATES, agoText, daemonStatusText, hostCheckMessage, hostCheckOkLine, hostStatusText, hostStatusTone, linkStateText, updateStateLine, uptimeText } from "./messages.js";
7
7
  import { hostOfSettingsFocus, hostSettingsFocus } from "./settings-focus.js";
8
8
  export { DEFAULT_MACHINES_LABELS, UPDATE_BUSY_STATES, agoText, createHostSyncReads, createMachineLists, createOnlineMachines, createPresenceStore, daemonStatusText, hostCheckMessage, hostCheckOkLine, hostOfSettingsFocus, hostSettingsFocus, hostStatusText, hostStatusTone, isMachinesError, isPermitted, lazyReadable, linkStateText, machinesError, shortList, syncBlockedReason, syncOutcome, updateStateLine, uptimeText };
@@ -37,6 +37,10 @@ declare function UsageDemo({ on, className, style }: UsageDemoProps): import("re
37
37
  type DaemonDemoProps = DemoProps;
38
38
  /** Background service: two windows share one running session through the link between them. */
39
39
  declare function DaemonDemo({ on, className, style }: DaemonDemoProps): import("react").JSX.Element;
40
+ /** Props of {@link RemindersDemo}. */
41
+ type RemindersDemoProps = DemoProps;
42
+ /** Reminders: you type `/remind`, its chip counts down to now, and the reminder lands in the session. */
43
+ declare function RemindersDemo({ on, className, style }: RemindersDemoProps): import("react").JSX.Element;
40
44
  /** Props of {@link BrowserDemo}. */
41
45
  type BrowserDemoProps = DemoProps;
42
46
  /** Browser tab: a page at localhost:5173, and the agent's pointer that clicks its button. */
@@ -53,6 +57,10 @@ declare function NotificationsDemo({ on, className, style }: NotificationsDemoPr
53
57
  type ProjectExtensionsDemoProps = DemoProps;
54
58
  /** Project extensions: the .zidane/extensions folder of a project, behind a trust lock. */
55
59
  declare function ProjectExtensionsDemo({ on, className, style }: ProjectExtensionsDemoProps): import("react").JSX.Element;
60
+ /** Props of {@link SecretsDemo}. */
61
+ type SecretsDemoProps = DemoProps;
62
+ /** Secrets: the agent asks for a key in a password field, and the transcript says it was saved, never the value. */
63
+ declare function SecretsDemo({ on, className, style }: SecretsDemoProps): import("react").JSX.Element;
56
64
  /**
57
65
  * Whether a feature has a demo.
58
66
  *
@@ -71,4 +79,4 @@ interface FeatureDemoProps extends DemoProps {
71
79
  */
72
80
  declare function FeatureDemo({ feature, on, className, style }: FeatureDemoProps): import("react").JSX.Element | null;
73
81
  //#endregion
74
- export { AutoTitleDemo, AutoTitleDemoProps, AutocompleteDemo, AutocompleteDemoProps, BrowserDemo, BrowserDemoProps, CodemodeDemo, CodemodeDemoProps, DaemonDemo, DaemonDemoProps, FeatureDemo, FeatureDemoProps, NotificationsDemo, NotificationsDemoProps, ProjectExtensionsDemo, ProjectExtensionsDemoProps, RunEstimatesDemo, RunEstimatesDemoProps, SpacesDemo, SpacesDemoProps, TerminalDemo, TerminalDemoProps, UpdatesDemo, UpdatesDemoProps, UsageDemo, UsageDemoProps, WebSearchDemo, WebSearchDemoProps, hasFeatureDemo };
82
+ export { AutoTitleDemo, AutoTitleDemoProps, AutocompleteDemo, AutocompleteDemoProps, BrowserDemo, BrowserDemoProps, CodemodeDemo, CodemodeDemoProps, DaemonDemo, DaemonDemoProps, FeatureDemo, FeatureDemoProps, NotificationsDemo, NotificationsDemoProps, ProjectExtensionsDemo, ProjectExtensionsDemoProps, RemindersDemo, RemindersDemoProps, RunEstimatesDemo, RunEstimatesDemoProps, SecretsDemo, SecretsDemoProps, SpacesDemo, SpacesDemoProps, TerminalDemo, TerminalDemoProps, UpdatesDemo, UpdatesDemoProps, UsageDemo, UsageDemoProps, WebSearchDemo, WebSearchDemoProps, hasFeatureDemo };
@@ -375,6 +375,61 @@ function DaemonDemo({ on, className, style }) {
375
375
  })
376
376
  });
377
377
  }
378
+ /** Reminders: you type `/remind`, its chip counts down to now, and the reminder lands in the session. */
379
+ function RemindersDemo({ on, className, style }) {
380
+ const labels = useOnboardingLabels();
381
+ return /* @__PURE__ */ jsx(DemoStage, {
382
+ on,
383
+ className,
384
+ style,
385
+ children: /* @__PURE__ */ jsxs("span", {
386
+ className: "flex flex-col items-stretch gap-2 w-full max-w-[300px] min-w-0",
387
+ children: [/* @__PURE__ */ jsxs(MiniWindow, {
388
+ className: "w-full",
389
+ bodyClassName: "px-2.5 pt-0.5 pb-2.5 gap-1.5",
390
+ children: [
391
+ /* @__PURE__ */ jsx(Line, { width: "64%" }),
392
+ /* @__PURE__ */ jsx(Line, { width: "42%" }),
393
+ /* @__PURE__ */ jsxs("span", {
394
+ className: "flex items-center gap-2 pt-0.5 min-w-0",
395
+ children: [/* @__PURE__ */ jsxs(MetaChip, { children: [/* @__PURE__ */ jsx("span", {
396
+ "aria-hidden": true,
397
+ className: "i-ph-alarm"
398
+ }), /* @__PURE__ */ jsxs("span", {
399
+ className: "zg-demo-stack",
400
+ children: [/* @__PURE__ */ jsx("span", {
401
+ className: "zg-loop zg-demo-before",
402
+ children: labels.demoReminderIn
403
+ }), /* @__PURE__ */ jsx("span", {
404
+ className: "zg-loop zg-demo-after text-[var(--zg-accent)]",
405
+ children: labels.demoReminderNow
406
+ })]
407
+ })] }), /* @__PURE__ */ jsx("span", {
408
+ className: "relative flex-1 h-1 rounded-full overflow-hidden zg-demo-track",
409
+ children: /* @__PURE__ */ jsx("span", { className: "zg-loop zg-demo-grow absolute inset-0 rounded-full bg-[var(--zg-accent-dot)]" })
410
+ })]
411
+ }),
412
+ /* @__PURE__ */ jsxs("span", {
413
+ className: "zg-loop zg-demo-after zg-tray self-end flex flex-col gap-0.5 max-w-[85%] px-2 py-1 rounded-zg-md min-w-0",
414
+ children: [/* @__PURE__ */ jsx("span", {
415
+ className: "zg-meta truncate",
416
+ children: labels.demoReminderFrom
417
+ }), /* @__PURE__ */ jsx("span", {
418
+ className: "text-zg-label truncate",
419
+ children: labels.demoReminderText
420
+ })]
421
+ })
422
+ ]
423
+ }), /* @__PURE__ */ jsx(Composer, { children: /* @__PURE__ */ jsxs("span", {
424
+ className: "flex items-center min-w-0 flex-1 text-zg-label whitespace-nowrap overflow-hidden",
425
+ children: [/* @__PURE__ */ jsx("span", {
426
+ className: "zg-loop zg-demo-type-early truncate",
427
+ children: labels.demoReminderTyped
428
+ }), /* @__PURE__ */ jsx(Caret, {})]
429
+ }) })]
430
+ })
431
+ });
432
+ }
378
433
  /** Browser tab: a page at localhost:5173, and the agent's pointer that clicks its button. */
379
434
  function BrowserDemo({ on, className, style }) {
380
435
  const labels = useOnboardingLabels();
@@ -570,6 +625,54 @@ function ProjectExtensionsDemo({ on, className, style }) {
570
625
  })
571
626
  });
572
627
  }
628
+ /** Secrets: the agent asks for a key in a password field, and the transcript says it was saved, never the value. */
629
+ function SecretsDemo({ on, className, style }) {
630
+ const labels = useOnboardingLabels();
631
+ return /* @__PURE__ */ jsx(DemoStage, {
632
+ on,
633
+ className,
634
+ style,
635
+ children: /* @__PURE__ */ jsxs(MiniWindow, {
636
+ className: "w-full max-w-[280px]",
637
+ bodyClassName: "px-3 pt-1 pb-2.5 gap-1.5",
638
+ children: [
639
+ /* @__PURE__ */ jsx("span", {
640
+ className: "truncate text-zg-label",
641
+ children: labels.demoSecretPrompt
642
+ }),
643
+ /* @__PURE__ */ jsxs("span", {
644
+ className: "zg-well flex items-center gap-1.5 h-6 px-2 rounded-zg-md min-w-0",
645
+ children: [/* @__PURE__ */ jsx("span", {
646
+ "aria-hidden": true,
647
+ className: "i-ph-lock-simple text-zg-label text-[var(--zg-text-muted)] shrink-0"
648
+ }), /* @__PURE__ */ jsx("span", {
649
+ className: "zg-loop zg-demo-type-early truncate font-mono text-zg-badge text-[var(--zg-text)]",
650
+ children: labels.demoSecretDots
651
+ })]
652
+ }),
653
+ /* @__PURE__ */ jsxs("span", {
654
+ className: "flex items-center gap-2 pt-0.5 min-w-0",
655
+ children: [/* @__PURE__ */ jsx("span", {
656
+ className: `${buttonClass({
657
+ variant: "solid",
658
+ size: "xs"
659
+ })} zg-loop zg-demo-press`,
660
+ children: labels.demoSecretSave
661
+ }), /* @__PURE__ */ jsx("span", {
662
+ className: "zg-loop zg-demo-after ml-auto min-w-0",
663
+ children: /* @__PURE__ */ jsxs(MetaChip, {
664
+ tone: "success",
665
+ children: [/* @__PURE__ */ jsx("span", {
666
+ "aria-hidden": true,
667
+ className: "i-ph-shield-check"
668
+ }), labels.demoSecretSaved]
669
+ })
670
+ })]
671
+ })
672
+ ]
673
+ })
674
+ });
675
+ }
573
676
  const DEMOS = {
574
677
  codemode: CodemodeDemo,
575
678
  webSearch: WebSearchDemo,
@@ -580,10 +683,12 @@ const DEMOS = {
580
683
  checkForUpdates: UpdatesDemo,
581
684
  subscriptionUsage: UsageDemo,
582
685
  useDaemon: DaemonDemo,
686
+ schedules: RemindersDemo,
583
687
  browser: BrowserDemo,
584
688
  terminal: TerminalDemo,
585
689
  notifications: NotificationsDemo,
586
- loadProjectExtensions: ProjectExtensionsDemo
690
+ loadProjectExtensions: ProjectExtensionsDemo,
691
+ secrets: SecretsDemo
587
692
  };
588
693
  /**
589
694
  * Whether a feature has a demo.
@@ -607,4 +712,4 @@ function FeatureDemo({ feature, on, className, style }) {
607
712
  }) : null;
608
713
  }
609
714
  //#endregion
610
- export { AutoTitleDemo, AutocompleteDemo, BrowserDemo, CodemodeDemo, DaemonDemo, FeatureDemo, NotificationsDemo, ProjectExtensionsDemo, RunEstimatesDemo, SpacesDemo, TerminalDemo, UpdatesDemo, UsageDemo, WebSearchDemo, hasFeatureDemo };
715
+ export { AutoTitleDemo, AutocompleteDemo, BrowserDemo, CodemodeDemo, DaemonDemo, FeatureDemo, NotificationsDemo, ProjectExtensionsDemo, RemindersDemo, RunEstimatesDemo, SecretsDemo, SpacesDemo, TerminalDemo, UpdatesDemo, UsageDemo, WebSearchDemo, hasFeatureDemo };
@@ -34,7 +34,11 @@ declare function AccountsScene({ step, className, style }: AccountsSceneProps):
34
34
  type HostsSceneProps = SceneProps;
35
35
  /** Hosts: zidane-server starts on a machine, prints a device token, then this app runs its sessions there. */
36
36
  declare function HostsScene({ step, className, style }: HostsSceneProps): import("react").JSX.Element;
37
+ /** Props of {@link SecretsScene}. */
38
+ type SecretsSceneProps = SceneProps;
39
+ /** Secrets: a password field the agent asks with, the private file that keeps the key, then a command whose output hides it. */
40
+ declare function SecretsScene({ step, className, style }: SecretsSceneProps): import("react").JSX.Element;
37
41
  /** The scene of each tutorial. */
38
42
  declare const TUTORIAL_SCENES: Readonly<Record<TutorialTopic, ComponentType<SceneProps>>>;
39
43
  //#endregion
40
- export { AccountsScene, AccountsSceneProps, ConnectorsScene, ConnectorsSceneProps, EnvironmentsScene, EnvironmentsSceneProps, ExtensionsScene, ExtensionsSceneProps, FilesScene, FilesSceneProps, HostsScene, HostsSceneProps, InstructionsScene, InstructionsSceneProps, SkillsScene, SkillsSceneProps, TUTORIAL_SCENES };
44
+ export { AccountsScene, AccountsSceneProps, ConnectorsScene, ConnectorsSceneProps, EnvironmentsScene, EnvironmentsSceneProps, ExtensionsScene, ExtensionsSceneProps, FilesScene, FilesSceneProps, HostsScene, HostsSceneProps, InstructionsScene, InstructionsSceneProps, SecretsScene, SecretsSceneProps, SkillsScene, SkillsSceneProps, TUTORIAL_SCENES };