zidane-ui 9.1.6 → 9.1.9

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 (224) hide show
  1. package/dist/adapters/run-host.js +17 -20
  2. package/dist/adapters/server-files-host.js +3 -1
  3. package/dist/adapters/server-host.js +18 -11
  4. package/dist/adapters/server-machines-host.js +3 -1
  5. package/dist/adapters/server-session-host.js +2 -1
  6. package/dist/adapters/server-settings-accounts.js +2 -1
  7. package/dist/adapters/server-settings-host.js +3 -3
  8. package/dist/adapters/sse-host.js +9 -7
  9. package/dist/chat/SessionGroupHeader.js +2 -2
  10. package/dist/chat/SessionHostHeader.js +1 -1
  11. package/dist/chat/StatusDot.js +24 -20
  12. package/dist/chat/composer/Composer.d.ts +13 -8
  13. package/dist/chat/composer/Composer.js +14 -10
  14. package/dist/chat/composer/ComposerEditor.js +1 -1
  15. package/dist/chat/composer/HostComposer.d.ts +1 -1
  16. package/dist/chat/composer/HostComposer.js +7 -10
  17. package/dist/chat/composer/RunStatusChip.js +13 -1
  18. package/dist/chat/composer/attachment-ingest.d.ts +4 -1
  19. package/dist/chat/composer/attachment-ingest.js +27 -10
  20. package/dist/chat/composer/composer-bus.d.ts +9 -1
  21. package/dist/chat/composer/composer-bus.js +49 -6
  22. package/dist/chat/composer/index.d.ts +2 -2
  23. package/dist/chat/composer/index.js +2 -2
  24. package/dist/chat/composer/use-draft-target.d.ts +4 -0
  25. package/dist/chat/composer/use-draft-target.js +15 -4
  26. package/dist/chat/composer/use-send-prompt.d.ts +5 -1
  27. package/dist/chat/composer/use-send-prompt.js +2 -12
  28. package/dist/chat/headless/chip-labels.d.ts +2 -0
  29. package/dist/chat/headless/chip-labels.js +3 -1
  30. package/dist/chat/headless/composer/labels-editor.d.ts +2 -0
  31. package/dist/chat/headless/composer/labels-editor.js +2 -0
  32. package/dist/chat/headless/file-chip.d.ts +12 -13
  33. package/dist/chat/headless/file-chip.js +40 -2
  34. package/dist/chat/headless/fixture-host.js +14 -17
  35. package/dist/chat/headless/host.d.ts +24 -6
  36. package/dist/chat/headless/index.d.ts +4 -4
  37. package/dist/chat/headless/index.js +4 -4
  38. package/dist/chat/headless/labels.d.ts +16 -0
  39. package/dist/chat/headless/labels.js +15 -2
  40. package/dist/chat/headless/send-flow.d.ts +21 -4
  41. package/dist/chat/headless/send-flow.js +25 -6
  42. package/dist/chat/headless/session-list.d.ts +11 -0
  43. package/dist/chat/headless/sidebar/index.js +1 -1
  44. package/dist/chat/headless/sidebar/labels.d.ts +12 -1
  45. package/dist/chat/headless/transcript-host.d.ts +8 -1
  46. package/dist/chat/headless/transcript-labels.d.ts +2 -0
  47. package/dist/chat/index.d.ts +3 -3
  48. package/dist/chat/index.js +2 -2
  49. package/dist/chat/interactions/InboxPanel.js +2 -2
  50. package/dist/chat/interactions/QuestionField.js +2 -2
  51. package/dist/chat/rich-composer/RichComposer.d.ts +9 -2
  52. package/dist/chat/rich-composer/RichComposer.js +28 -7
  53. package/dist/chat/rich-composer/composer-extensions.d.ts +2 -0
  54. package/dist/chat/rich-composer/composer-extensions.js +2 -2
  55. package/dist/chat/rich-composer/composer-keys.js +1 -1
  56. package/dist/chat/rich-composer/use-composer-bus.js +2 -1
  57. package/dist/chat/rich-composer/use-composer-editor.d.ts +4 -1
  58. package/dist/chat/rich-composer/use-composer-editor.js +2 -1
  59. package/dist/chat/sidebar/SessionSidebar.js +1 -2
  60. package/dist/chat/sidebar/SidebarSearchRow.js +1 -1
  61. package/dist/chat/sidebar/useSidebarKeyboardNav.d.ts +0 -2
  62. package/dist/chat/sidebar/useSidebarKeyboardNav.js +7 -13
  63. package/dist/chat/testing/contract.d.ts +1 -1
  64. package/dist/chat/testing/contract.js +8 -7
  65. package/dist/chat/transcript/BadgeMenu.d.ts +12 -3
  66. package/dist/chat/transcript/BadgeMenu.js +20 -3
  67. package/dist/chat/transcript/CodemodeScript.js +147 -44
  68. package/dist/chat/transcript/EditDiffBlock.js +1 -4
  69. package/dist/chat/transcript/FileChip.js +60 -14
  70. package/dist/chat/transcript/LiveOutput.js +7 -3
  71. package/dist/chat/transcript/badges.js +2 -2
  72. package/dist/chat/transcript/index.d.ts +2 -2
  73. package/dist/chat/transcript/markdown-context.d.ts +4 -1
  74. package/dist/chat/transcript/rolling.d.ts +12 -0
  75. package/dist/chat/transcript/rolling.js +22 -0
  76. package/dist/chat/transcript/script-input.d.ts +1 -1
  77. package/dist/chat/transcript/shell-block.js +70 -60
  78. package/dist/chat/transcript/tool-row.js +21 -5
  79. package/dist/code/editor/FileTree.d.ts +3 -1
  80. package/dist/code/editor/FileTree.js +29 -1
  81. package/dist/components/Restricted.d.ts +25 -0
  82. package/dist/components/Restricted.js +32 -0
  83. package/dist/components/StepFrame.d.ts +1 -1
  84. package/dist/components/ZidaneMark.d.ts +28 -0
  85. package/dist/components/ZidaneMark.js +114 -0
  86. package/dist/components/palette/PalettePanel.d.ts +7 -1
  87. package/dist/components/palette/PalettePanel.js +37 -11
  88. package/dist/components/zidane-mark.d.ts +52 -0
  89. package/dist/components/zidane-mark.js +94 -0
  90. package/dist/core.css +59 -6
  91. package/dist/dist/{index-DqCio7Nd.d.ts → index-Bq87OcGy.d.ts} +19 -12
  92. package/dist/dist/index.d.ts +1 -1
  93. package/dist/extensions/ExtensionSettingsSection.d.ts +18 -0
  94. package/dist/extensions/ExtensionSettingsSection.js +227 -0
  95. package/dist/extensions/headless/host.d.ts +1 -1
  96. package/dist/extensions/headless/labels.d.ts +41 -1
  97. package/dist/extensions/headless/labels.js +57 -0
  98. package/dist/extensions/headless/select.js +1 -2
  99. package/dist/extensions/index.d.ts +2 -1
  100. package/dist/extensions/index.js +2 -1
  101. package/dist/files/FilesTab.js +2 -0
  102. package/dist/files/TreeColumn.d.ts +5 -1
  103. package/dist/files/TreeColumn.js +6 -0
  104. package/dist/files/headless/fixture-host.js +5 -3
  105. package/dist/files/headless/host.d.ts +24 -6
  106. package/dist/files/headless/index.d.ts +2 -2
  107. package/dist/files/headless/labels.d.ts +1 -0
  108. package/dist/files/headless/labels.js +1 -0
  109. package/dist/files/testing/contract.js +9 -2
  110. package/dist/files/useWorkspace.d.ts +14 -2
  111. package/dist/files/useWorkspace.js +87 -9
  112. package/dist/git/BranchMenu.js +1 -1
  113. package/dist/git/MoveSessionDialog.js +1 -1
  114. package/dist/git/RemoteFolderPicker.js +1 -1
  115. package/dist/git/WherePicker.js +1 -1
  116. package/dist/git/headless/index.js +1 -1
  117. package/dist/git/useEnvironmentChoices.js +1 -1
  118. package/dist/index.d.ts +4 -2
  119. package/dist/index.js +4 -2
  120. package/dist/keybindings/headless/catalog.js +1 -1
  121. package/dist/labels.d.ts +1 -0
  122. package/dist/labels.js +1 -0
  123. package/dist/machines/DaemonMenu.js +1 -1
  124. package/dist/machines/HostCapabilities.d.ts +23 -1
  125. package/dist/machines/HostCapabilities.js +149 -65
  126. package/dist/machines/HostSyncPanel.js +129 -123
  127. package/dist/machines/HostsSection.js +5 -1
  128. package/dist/machines/ServerCard.d.ts +4 -2
  129. package/dist/machines/ServerCard.js +222 -99
  130. package/dist/machines/ServerMachinesPanel.js +16 -13
  131. package/dist/machines/ServerUpdatePanel.js +31 -21
  132. package/dist/machines/TokensPanel.js +75 -53
  133. package/dist/machines/headless/fixture-host.d.ts +5 -0
  134. package/dist/machines/headless/fixture-host.js +13 -4
  135. package/dist/machines/headless/fixtures.js +1 -1
  136. package/dist/machines/headless/host.d.ts +22 -2
  137. package/dist/machines/headless/index.d.ts +2 -2
  138. package/dist/machines/headless/labels.d.ts +22 -1
  139. package/dist/machines/headless/labels.js +22 -2
  140. package/dist/machines/testing/contract.d.ts +3 -1
  141. package/dist/machines/testing/contract.js +9 -0
  142. package/dist/motion/size.d.ts +22 -1
  143. package/dist/motion/size.js +82 -4
  144. package/dist/onboarding/demos/delivery.d.ts +16 -0
  145. package/dist/onboarding/demos/delivery.js +132 -0
  146. package/dist/onboarding/demos/index.d.ts +2 -1
  147. package/dist/onboarding/demos/index.js +2 -1
  148. package/dist/onboarding/headless/labels.d.ts +8 -0
  149. package/dist/onboarding/headless/labels.js +7 -0
  150. package/dist/onboarding/index.d.ts +2 -1
  151. package/dist/onboarding/index.js +2 -1
  152. package/dist/onboarding/steps/ConversationStep.js +46 -4
  153. package/dist/palette/CommandPalette.js +3 -0
  154. package/dist/palette/PaletteDialog.js +7 -3
  155. package/dist/palette/usePaletteController.d.ts +10 -0
  156. package/dist/palette/usePaletteController.js +25 -3
  157. package/dist/server/sse-handler.js +6 -1
  158. package/dist/session/ArtifactsPanel.js +1 -1
  159. package/dist/session/SideChat.js +1 -2
  160. package/dist/session/UsagePanel.js +1 -1
  161. package/dist/session/headless/host.d.ts +3 -1
  162. package/dist/session/headless/index.js +2 -2
  163. package/dist/settings/SettingsRestricted.d.ts +25 -0
  164. package/dist/settings/SettingsRestricted.js +44 -0
  165. package/dist/settings/SettingsRowsPage.js +31 -37
  166. package/dist/settings/headless/catalog.js +7 -6
  167. package/dist/settings/headless/labels.d.ts +4 -2
  168. package/dist/settings/headless/labels.js +4 -2
  169. package/dist/settings/headless/layout.js +1 -1
  170. package/dist/settings/headless/providers.d.ts +2 -0
  171. package/dist/settings/headless/search.d.ts +1 -1
  172. package/dist/settings/index.d.ts +2 -2
  173. package/dist/settings/index.js +2 -2
  174. package/dist/settings/rows.d.ts +51 -8
  175. package/dist/settings/rows.js +81 -26
  176. package/dist/settings/sections/enabled-list/EnabledListSection.js +3 -2
  177. package/dist/settings/sections/environments/EnvironmentsSection.js +4 -3
  178. package/dist/settings/sections/extensions/ExtensionConfigRows.d.ts +2 -2
  179. package/dist/settings/sections/extensions/ExtensionConfigRows.js +22 -25
  180. package/dist/settings/sections/extensions/ExtensionOptionsSection.js +3 -2
  181. package/dist/settings/sections/extensions/options-labels.d.ts +2 -2
  182. package/dist/settings/sections/extensions/options-labels.js +2 -2
  183. package/dist/settings/sections/host-catalog/HostCatalogSection.d.ts +5 -3
  184. package/dist/settings/sections/host-catalog/HostCatalogSection.js +7 -4
  185. package/dist/settings/sections/instructions/InstructionsSection.js +24 -17
  186. package/dist/settings/sections/logs/LogsSection.d.ts +2 -1
  187. package/dist/settings/sections/logs/LogsSection.js +64 -56
  188. package/dist/settings/sections/mcp/McpSection.d.ts +1 -1
  189. package/dist/settings/sections/mcp/McpSection.js +18 -17
  190. package/dist/settings/sections/models/ModelRows.d.ts +3 -3
  191. package/dist/settings/sections/models/ModelRows.js +8 -7
  192. package/dist/settings/sections/performance/PerformanceSection.js +13 -4
  193. package/dist/settings/sections/performance/labels.d.ts +0 -1
  194. package/dist/settings/sections/performance/labels.js +0 -1
  195. package/dist/settings/sections/providers/CredentialSources.js +18 -8
  196. package/dist/settings/sections/providers/ProvidersSection.d.ts +2 -2
  197. package/dist/settings/sections/providers/ProvidersSection.js +20 -17
  198. package/dist/settings/sections/providers/ServerProvidersSection.d.ts +1 -1
  199. package/dist/settings/sections/providers/ServerProvidersSection.js +10 -14
  200. package/dist/settings/sections/shared/catalog.js +3 -2
  201. package/dist/settings/sections/skills/SkillList.js +3 -2
  202. package/dist/settings/testing/accounts-demo.js +1 -0
  203. package/dist/settings/testing/accounts.contract.js +2 -0
  204. package/dist/styles.css +160 -24
  205. package/dist/terminal/HostTerminalSurface.js +1 -1
  206. package/dist/terminal/headless/links.d.ts +19 -1
  207. package/dist/terminal/headless/links.js +26 -2
  208. package/dist/theme/css-vars.js +1 -0
  209. package/dist/theme/derive.d.ts +4 -0
  210. package/dist/theme/derive.js +2 -0
  211. package/dist/workspace/PanelContentView.js +1 -1
  212. package/dist/workspace/PanelHome.d.ts +3 -1
  213. package/dist/workspace/PanelHome.js +4 -3
  214. package/dist/workspace/SidePanel.d.ts +3 -1
  215. package/dist/workspace/SidePanel.js +3 -2
  216. package/dist/workspace/headless/open-target.d.ts +1 -1
  217. package/dist/workspace/headless/open-target.js +2 -2
  218. package/package.json +2 -2
  219. package/src/styles/chat.css +10 -10
  220. package/src/styles/motion.css +37 -0
  221. package/src/styles/primitives.css +11 -3
  222. package/src/styles/sidebar.css +12 -0
  223. package/src/styles/tokens.css +6 -0
  224. package/src/styles/transcript.css +69 -5
@@ -1,4 +1,13 @@
1
1
  //#region src/extensions/headless/labels.ts
2
+ const CATALOG_KIND = {
3
+ tools: "tool",
4
+ agents: "agent",
5
+ subagents: "sub-agent",
6
+ models: "model",
7
+ providers: "provider",
8
+ mcp: "MCP server",
9
+ skills: "skill"
10
+ };
2
11
  /** The default English strings of the extensions components. */
3
12
  const DEFAULT_EXTENSIONS_LABELS = {
4
13
  /** A slot item's running arc. */
@@ -29,6 +38,54 @@ const DEFAULT_EXTENSIONS_LABELS = {
29
38
  extensionSettingRunning: "Running",
30
39
  /** A settings page or form with no rows. */
31
40
  extensionSettingsNone: "Nothing to set",
41
+ /** Settings › Extensions' extension host part (`ExtensionSettingsSection`), for assistive tech. */
42
+ extensionSettingsSection: "Extension settings",
43
+ /** Its heading over the values a declarative config entry locks. */
44
+ extensionSettingsLockedHeading: "Set by the config file",
45
+ /** A locked value's tag. */
46
+ extensionSettingsLockedTag: "locked",
47
+ /** Its heading over the catalog items extensions added, changed or hid. */
48
+ extensionSettingsChangesHeading: "Changed by extensions",
49
+ /** Its heading over the integrations. */
50
+ extensionSettingsIntegrationsHeading: "Integrations",
51
+ /** A changed catalog item's kind. */
52
+ extensionCatalogKind: (kind) => CATALOG_KIND[kind],
53
+ /** Who added, changed or hid a catalog item (the TUI's wording). */
54
+ extensionProvenance: (p) => {
55
+ if (p.removed) return `hidden by ${p.removedBy ?? p.changedBy.at(-1) ?? "an extension"}`;
56
+ if (p.origin.kind === "extension" && p.changedBy.length <= 1) return `added by ${p.origin.id ?? p.changedBy[0] ?? "an extension"}`;
57
+ return `modified by ${p.changedBy.join(", ")}`;
58
+ },
59
+ /** An integration with no account connected. */
60
+ extensionIntegrationNotConnected: "Not connected",
61
+ /** An integration with one account connected. */
62
+ extensionIntegrationConnected: "Connected",
63
+ /** An integration with several accounts connected. */
64
+ extensionIntegrationAccountCount: (count) => `${count} accounts`,
65
+ /** The list of an integration's accounts. */
66
+ extensionIntegrationAccounts: (integration) => `${integration} accounts`,
67
+ /** The default account's tag. */
68
+ extensionIntegrationDefault: "Default",
69
+ /** Makes an account the default. */
70
+ extensionIntegrationMakeDefault: "Make default",
71
+ /** Makes an account the default, for assistive tech. */
72
+ extensionIntegrationMakeDefaultLabel: (account) => `Make ${account} the default`,
73
+ /** Removes an account. */
74
+ extensionIntegrationDisconnect: "Disconnect",
75
+ /** Removes an account, for assistive tech. */
76
+ extensionIntegrationDisconnectLabel: (account) => `Disconnect ${account}`,
77
+ /** Connects the first account (an API key method's submit). */
78
+ extensionIntegrationConnect: "Connect",
79
+ /** Connects another account with an API key. */
80
+ extensionIntegrationAddAccount: "Add account",
81
+ /** Connects another account through a method. */
82
+ extensionIntegrationAddAccountWith: (method) => `Add account with ${method}`,
83
+ /** Words a failed integration action. */
84
+ extensionIntegrationError: (error) => {
85
+ if (error.code === "refused") return error.message ?? (error.reason === "locked" ? "Locked by the config file." : "Refused.");
86
+ if (error.code === "unavailable") return "Not available here.";
87
+ return error.message;
88
+ },
32
89
  /** A screen whose id no extension offers (any more). */
33
90
  extensionScreenMissing: "This screen is no longer available",
34
91
  /** Closes a screen. */
@@ -18,8 +18,7 @@ function slotItems(items, at, sessionId, turnId) {
18
18
  }
19
19
  const SCOPE_RANK = {
20
20
  chat: 0,
21
- approve: 1,
22
- admin: 2
21
+ admin: 1
23
22
  };
24
23
  /**
25
24
  * The scope an action needs that this client's token lacks, or `null` when it may run it: the token
@@ -4,6 +4,7 @@ import { ExtensionRenderer, ExtensionRendererProps } from "./ExtensionRenderer.j
4
4
  import { ExtensionScreen, ExtensionScreenProps, useExtensionScreen } from "./ExtensionScreen.js";
5
5
  import { ExtensionSettingsPage, ExtensionSettingsPageProps } from "./ExtensionSettingsPage.js";
6
6
  import { ExtensionSettingsPages, ExtensionSettingsPagesProps } from "./ExtensionSettingsPages.js";
7
+ import { ExtensionSettingsSection, ExtensionSettingsSectionProps } from "./ExtensionSettingsSection.js";
7
8
  import { ExtensionSettingsSections, ExtensionSettingsSectionsOptions, ExtensionSettingsWirePage, ExtensionSettingsWirePageProps, extensionSettingsEntryId, extensionSettingsGroupId, extensionSettingsPageId, useExtensionSettingsSections } from "./ExtensionSettingsSidebar.js";
8
9
  import { ExtensionSlot, ExtensionSlotProps, ExtensionTitlebar, ExtensionTitlebarProps } from "./ExtensionSlot.js";
9
10
  import { ExtensionWebview, ExtensionWebviewProps } from "./ExtensionWebview.js";
@@ -12,4 +13,4 @@ import { SettingsWireActionState, SettingsWireForm, SettingsWireFormProps } from
12
13
  import { ExtensionEffectHandler, ExtensionEffectsOptions, ExtensionInfo, ExtensionSettingsView, KIT_EFFECT_PRIORITY, RpcClient, RpcMethodCaller, UseStoreOptions, useExtension, useExtensionEffects, useExtensionSettings, useRpc, useStore } from "./hooks.js";
13
14
  import { LinkOpenOptions, LinkRouter, LinkRouterSource, LinkSessionScope, LinkSessionScopeProps, RoutedLink, RoutedLinkProps, useLinkRouter } from "./links.js";
14
15
  import { useExtensionsLabels } from "./useExtensionsLabels.js";
15
- export { ExtensionComponent, ExtensionComponentProps, ExtensionComponentsProvider, ExtensionComponentsProviderProps, ExtensionDialogHost, ExtensionDialogHostProps, ExtensionDialogView, ExtensionDialogViewProps, ExtensionEffectHandler, ExtensionEffectsOptions, ExtensionInfo, ExtensionModuleLoader, ExtensionRenderer, ExtensionRendererProps, ExtensionScope, ExtensionScopeProps, ExtensionScreen, ExtensionScreenProps, ExtensionSettingsPage, ExtensionSettingsPageProps, ExtensionSettingsPages, ExtensionSettingsPagesProps, ExtensionSettingsSections, ExtensionSettingsSectionsOptions, ExtensionSettingsView, ExtensionSettingsWirePage, ExtensionSettingsWirePageProps, ExtensionSlot, ExtensionSlotProps, ExtensionTitlebar, ExtensionTitlebarProps, ExtensionWebview, ExtensionWebviewProps, ExtensionsProvider, ExtensionsProviderProps, KIT_EFFECT_PRIORITY, LinkOpenOptions, LinkRouter, LinkRouterSource, LinkSessionScope, LinkSessionScopeProps, RoutedLink, RoutedLinkProps, RpcClient, RpcMethodCaller, SettingsWireActionState, SettingsWireForm, SettingsWireFormProps, UseStoreOptions, extensionSettingsEntryId, extensionSettingsGroupId, extensionSettingsPageId, useCarryExtensionsContext, useExtension, useExtensionEffectRouter, useExtensionEffects, useExtensionExport, useExtensionItems, useExtensionModuleLoader, useExtensionScope, useExtensionScreen, useExtensionSettings, useExtensionSettingsSections, useExtensionsHost, useExtensionsLabels, useLinkRouter, useRpc, useStore };
16
+ export { ExtensionComponent, ExtensionComponentProps, ExtensionComponentsProvider, ExtensionComponentsProviderProps, ExtensionDialogHost, ExtensionDialogHostProps, ExtensionDialogView, ExtensionDialogViewProps, ExtensionEffectHandler, ExtensionEffectsOptions, ExtensionInfo, ExtensionModuleLoader, ExtensionRenderer, ExtensionRendererProps, ExtensionScope, ExtensionScopeProps, ExtensionScreen, ExtensionScreenProps, ExtensionSettingsPage, ExtensionSettingsPageProps, ExtensionSettingsPages, ExtensionSettingsPagesProps, ExtensionSettingsSection, ExtensionSettingsSectionProps, ExtensionSettingsSections, ExtensionSettingsSectionsOptions, ExtensionSettingsView, ExtensionSettingsWirePage, ExtensionSettingsWirePageProps, ExtensionSlot, ExtensionSlotProps, ExtensionTitlebar, ExtensionTitlebarProps, ExtensionWebview, ExtensionWebviewProps, ExtensionsProvider, ExtensionsProviderProps, KIT_EFFECT_PRIORITY, LinkOpenOptions, LinkRouter, LinkRouterSource, LinkSessionScope, LinkSessionScopeProps, RoutedLink, RoutedLinkProps, RpcClient, RpcMethodCaller, SettingsWireActionState, SettingsWireForm, SettingsWireFormProps, UseStoreOptions, extensionSettingsEntryId, extensionSettingsGroupId, extensionSettingsPageId, useCarryExtensionsContext, useExtension, useExtensionEffectRouter, useExtensionEffects, useExtensionExport, useExtensionItems, useExtensionModuleLoader, useExtensionScope, useExtensionScreen, useExtensionSettings, useExtensionSettingsSections, useExtensionsHost, useExtensionsLabels, useLinkRouter, useRpc, useStore };
@@ -11,5 +11,6 @@ import { SettingsWireForm } from "./SettingsWireForm.js";
11
11
  import { ExtensionDialogHost, ExtensionDialogView } from "./ExtensionDialogHost.js";
12
12
  import { ExtensionSettingsPage } from "./ExtensionSettingsPage.js";
13
13
  import { ExtensionSettingsPages } from "./ExtensionSettingsPages.js";
14
+ import { ExtensionSettingsSection } from "./ExtensionSettingsSection.js";
14
15
  import { ExtensionSettingsWirePage, extensionSettingsEntryId, extensionSettingsGroupId, extensionSettingsPageId, useExtensionSettingsSections } from "./ExtensionSettingsSidebar.js";
15
- export { ExtensionComponent, ExtensionComponentsProvider, ExtensionDialogHost, ExtensionDialogView, ExtensionRenderer, ExtensionScope, ExtensionScreen, ExtensionSettingsPage, ExtensionSettingsPages, ExtensionSettingsWirePage, ExtensionSlot, ExtensionTitlebar, ExtensionWebview, ExtensionsProvider, KIT_EFFECT_PRIORITY, LinkSessionScope, RoutedLink, SettingsWireForm, extensionSettingsEntryId, extensionSettingsGroupId, extensionSettingsPageId, useCarryExtensionsContext, useExtension, useExtensionEffectRouter, useExtensionEffects, useExtensionExport, useExtensionItems, useExtensionModuleLoader, useExtensionScope, useExtensionScreen, useExtensionSettings, useExtensionSettingsSections, useExtensionsHost, useExtensionsLabels, useLinkRouter, useRpc, useStore };
16
+ export { ExtensionComponent, ExtensionComponentsProvider, ExtensionDialogHost, ExtensionDialogView, ExtensionRenderer, ExtensionScope, ExtensionScreen, ExtensionSettingsPage, ExtensionSettingsPages, ExtensionSettingsSection, ExtensionSettingsWirePage, ExtensionSlot, ExtensionTitlebar, ExtensionWebview, ExtensionsProvider, KIT_EFFECT_PRIORITY, LinkSessionScope, RoutedLink, SettingsWireForm, extensionSettingsEntryId, extensionSettingsGroupId, extensionSettingsPageId, useCarryExtensionsContext, useExtension, useExtensionEffectRouter, useExtensionEffects, useExtensionExport, useExtensionItems, useExtensionModuleLoader, useExtensionScope, useExtensionScreen, useExtensionSettings, useExtensionSettingsSections, useExtensionsHost, useExtensionsLabels, useLinkRouter, useRpc, useStore };
@@ -283,6 +283,8 @@ function FilesTab({ scope, layout: layoutStore, chat = null, useEdits = useNoEdi
283
283
  width: layout.filesTreeWidth ?? TREE_WIDTH.default,
284
284
  controlRef: treeControl,
285
285
  entries,
286
+ truncated: workspace.truncated,
287
+ onExpandFolder: workspace.openFolder,
286
288
  gitStatus: workspace.status,
287
289
  selectedPath: selected,
288
290
  onSelect: setSelected,
@@ -1,5 +1,5 @@
1
1
  import { FilesTreeSide } from "../appearance/headless/prefs.js";
2
- import { GitStatusEntry, WorkspaceEntry } from "./headless/host.js";
2
+ import { GitStatusEntry, WorkspaceEntry, WorkspaceListing } from "./headless/host.js";
3
3
  import { FileTreeControl, FileTreeEditing } from "../code/editor/FileTree.js";
4
4
  import { FilesLayoutStore } from "./headless/view.js";
5
5
  import { FileActionTarget } from "./file-actions.js";
@@ -21,6 +21,10 @@ interface TreeColumnProps {
21
21
  width: number;
22
22
  controlRef: RefObject<FileTreeControl | null>;
23
23
  entries: WorkspaceEntry[] | null;
24
+ /** The listing was cut: a line under the toolbar says how much shows. */
25
+ truncated?: WorkspaceListing['truncated'] | null;
26
+ /** An ignored folder (one node) was opened: list what is under it. */
27
+ onExpandFolder?: (path: string) => void;
24
28
  gitStatus: GitStatusEntry[];
25
29
  selectedPath: string | null;
26
30
  onSelect: (path: string | null) => void;
@@ -154,6 +154,11 @@ const TreeColumn = memo(function TreeColumn(p) {
154
154
  })
155
155
  ]
156
156
  }),
157
+ p.truncated && !p.search && /* @__PURE__ */ jsx("p", {
158
+ className: "zg-meta shrink-0 mx-3 mb-1 truncate",
159
+ title: labels.filesTruncated(p.truncated.shown, p.truncated.total, !!p.truncated.atLeast),
160
+ children: labels.filesTruncated(p.truncated.shown, p.truncated.total, !!p.truncated.atLeast)
161
+ }),
157
162
  p.notice && !p.search && /* @__PURE__ */ jsxs("div", {
158
163
  role: "alert",
159
164
  className: "zg-well shrink-0 flex items-center gap-1.5 h-7 mx-2 mb-1 pl-2 pr-1 text-xs",
@@ -190,6 +195,7 @@ const TreeColumn = memo(function TreeColumn(p) {
190
195
  onOpen: p.onOpen,
191
196
  onContextMenu: p.onContextMenu,
192
197
  openPaths: p.openPaths,
198
+ ...p.onExpandFolder ? { onExpandFolder: p.onExpandFolder } : {},
193
199
  ...p.editing ? { editing: p.editing } : {},
194
200
  className: "flex-1 min-h-0"
195
201
  })
@@ -158,14 +158,16 @@ function createFixtureFilesHost(options = {}) {
158
158
  },
159
159
  emptyDirs: () => emptyDirsOf(files, dirs)
160
160
  },
161
- async list() {
162
- return [...[...files.keys()].map((path) => ({
161
+ async list(_cwd, options) {
162
+ const entries = [...[...files.keys()].map((path) => ({
163
163
  path,
164
164
  kind: "file"
165
165
  })), ...emptyDirsOf(files, dirs).map((path) => ({
166
166
  path: `${path}/`,
167
167
  kind: "dir"
168
- }))].sort((a, b) => a.path.localeCompare(b.path));
168
+ }))];
169
+ const dir = options?.dir?.replace(/\/+$/, "");
170
+ return { entries: (dir ? entries.filter((e) => e.path.startsWith(`${dir}/`)) : entries).sort((a, b) => a.path.localeCompare(b.path)) };
169
171
  },
170
172
  async read(_cwd, path) {
171
173
  const entry = files.get(path);
@@ -7,9 +7,20 @@ interface WorkspaceEntry {
7
7
  path: string;
8
8
  /** A file or a folder. */
9
9
  kind: 'file' | 'dir';
10
- /** Gitignored (only present when listed with `showIgnored`). */
10
+ /** Gitignored (only present when listed with `showIgnored`). An ignored folder is one node: list it with `dir` to open it. */
11
11
  ignored?: boolean;
12
12
  }
13
+ /** A folder's listing: its entries, and whether the host cut it at its cap. */
14
+ interface WorkspaceListing {
15
+ /** The entries. */
16
+ entries: WorkspaceEntry[];
17
+ /** Set when the listing was cut: how many it holds and how many there are (`atLeast`: more than that). */
18
+ truncated?: {
19
+ shown: number;
20
+ total: number;
21
+ atLeast?: boolean;
22
+ };
23
+ }
13
24
  /** The media kinds a browser plays on its own. */
14
25
  type MediaKind = 'image' | 'video' | 'audio' | 'pdf';
15
26
  /** A file the page shows as media, with its MIME type. */
@@ -275,8 +286,11 @@ interface FilesLsp {
275
286
  interface FilesSystem {
276
287
  /** Whether files of `cwd` are on this machine (not a sandbox's or a server's): only those can be opened elsewhere. */
277
288
  isLocal(cwd: string): boolean;
278
- /** Opens an absolute path in the default editor. Resolves false when it could not. */
279
- openPath(path: string): Promise<boolean>;
289
+ /** Opens an absolute path in the default editor, at `at` (1-based) when the editor takes a position. Resolves false when it could not. */
290
+ openPath(path: string, at?: {
291
+ line: number;
292
+ column?: number;
293
+ }): Promise<boolean>;
280
294
  /** Shows an absolute path in the file manager. Resolves false when it could not. */
281
295
  revealPath(path: string): Promise<boolean>;
282
296
  }
@@ -334,10 +348,14 @@ interface FilesEntries {
334
348
  }
335
349
  /** The files host. Every member is optional. */
336
350
  interface FilesHost {
337
- /** The folder's entries (files, and empty folders). Rejects when the folder can't be read. */
351
+ /**
352
+ * The folder's entries (files, and empty folders). `dir`: only what is under that folder (relative to `cwd`, the
353
+ * paths still relative to `cwd`), how an ignored folder opens. Rejects when the folder can't be read.
354
+ */
338
355
  list?(cwd: string, options?: {
339
356
  showIgnored?: boolean;
340
- }): Promise<WorkspaceEntry[]>;
357
+ dir?: string;
358
+ }): Promise<WorkspaceListing>;
341
359
  /** A file, or `null` when it is gone (moved, deleted, outside the folder). */
342
360
  read?(cwd: string, path: string): Promise<WorkspaceFile | null>;
343
361
  /** Writes a file, refused when its version moved past `expectedMtimeMs`. Absent: files are read-only. */
@@ -373,4 +391,4 @@ interface FilesHost {
373
391
  mediaUrl?(source: MediaSource): string;
374
392
  }
375
393
  //#endregion
376
- export { ContentMatch, ContentSearchOptions, ContentSearchResult, Diagnostic, DiagnosticSeverity, DiagnosticsResult, DiagnosticsRunOptions, DroppedItem, FilesDiagnostics, FilesEntries, FilesEntryRefusal, FilesEntryResult, FilesHost, FilesImportResult, FilesLsp, FilesRemoval, FilesScope, FilesSystem, FolderChange, GitStatusEntry, LspCompletionDetail, LspCompletionItem, LspCompletionList, LspDefinition, LspHover, LspLocation, LspRange, LspTextChange, MediaKind, MediaSource, MediaType, TextMatchOptions, WorkspaceEntry, WorkspaceFile, WorkspaceWriteResult };
394
+ export { ContentMatch, ContentSearchOptions, ContentSearchResult, Diagnostic, DiagnosticSeverity, DiagnosticsResult, DiagnosticsRunOptions, DroppedItem, FilesDiagnostics, FilesEntries, FilesEntryRefusal, FilesEntryResult, FilesHost, FilesImportResult, FilesLsp, FilesRemoval, FilesScope, FilesSystem, FolderChange, GitStatusEntry, LspCompletionDetail, LspCompletionItem, LspCompletionList, LspDefinition, LspHover, LspLocation, LspRange, LspTextChange, MediaKind, MediaSource, MediaType, TextMatchOptions, WorkspaceEntry, WorkspaceFile, WorkspaceListing, WorkspaceWriteResult };
@@ -1,8 +1,8 @@
1
1
  import { AutoSurround, DEFAULT_EDITOR, DIAGNOSTICS_TIMEOUT, DiagnosticsMode, DiagnosticsRun, EDITOR_STORAGE_KEY, EditorPrefs, EditorPrefsStorage, EditorState, LSP_IDLE, SaveOn, StorageEditorPrefsOptions, createStorageEditorPrefs, parseEditor } from "./editor-prefs.js";
2
- import { ContentMatch, ContentSearchOptions, ContentSearchResult, Diagnostic, DiagnosticSeverity, DiagnosticsResult, DiagnosticsRunOptions, DroppedItem, FilesDiagnostics, FilesEntries, FilesEntryRefusal, FilesEntryResult, FilesHost, FilesImportResult, FilesLsp, FilesRemoval, FilesScope, FilesSystem, FolderChange, GitStatusEntry, LspCompletionDetail, LspCompletionItem, LspCompletionList, LspDefinition, LspHover, LspLocation, LspRange, LspTextChange, MediaKind, MediaSource, MediaType, TextMatchOptions, WorkspaceEntry, WorkspaceFile, WorkspaceWriteResult } from "./host.js";
2
+ import { ContentMatch, ContentSearchOptions, ContentSearchResult, Diagnostic, DiagnosticSeverity, DiagnosticsResult, DiagnosticsRunOptions, DroppedItem, FilesDiagnostics, FilesEntries, FilesEntryRefusal, FilesEntryResult, FilesHost, FilesImportResult, FilesLsp, FilesRemoval, FilesScope, FilesSystem, FolderChange, GitStatusEntry, LspCompletionDetail, LspCompletionItem, LspCompletionList, LspDefinition, LspHover, LspLocation, LspRange, LspTextChange, MediaKind, MediaSource, MediaType, TextMatchOptions, WorkspaceEntry, WorkspaceFile, WorkspaceListing, WorkspaceWriteResult } from "./host.js";
3
3
  import { DEFAULT_FILES_LAYOUT, FilesChatTarget, FilesKeyScope, FilesLayout, FilesLayoutStore, createMemoryFilesLayout, filesRootOf, filesScopeKey, steppedIndex } from "./view.js";
4
4
  import { DEFAULT_FILES_LABELS, FilesLabels } from "./labels.js";
5
5
  import { EntryClipboard, droppedImportItems, droppedItems, entryRefusalText, hasDroppedFiles, inFolder, isUnder, movedPath, nameOf, parentOf, topLevelPaths } from "./entries.js";
6
6
  import { matchRanges } from "./search.js";
7
7
  import { mediaTypeOfPath } from "./media.js";
8
- export { AutoSurround, ContentMatch, ContentSearchOptions, ContentSearchResult, DEFAULT_EDITOR, DEFAULT_FILES_LABELS, DEFAULT_FILES_LAYOUT, DIAGNOSTICS_TIMEOUT, Diagnostic, DiagnosticSeverity, DiagnosticsMode, DiagnosticsResult, DiagnosticsRun, DiagnosticsRunOptions, DroppedItem, EDITOR_STORAGE_KEY, EditorPrefs, EditorPrefsStorage, EditorState, EntryClipboard, FilesChatTarget, FilesDiagnostics, FilesEntries, FilesEntryRefusal, FilesEntryResult, FilesHost, FilesImportResult, FilesKeyScope, FilesLabels, FilesLayout, FilesLayoutStore, FilesLsp, FilesRemoval, FilesScope, FilesSystem, FolderChange, GitStatusEntry, LSP_IDLE, LspCompletionDetail, LspCompletionItem, LspCompletionList, LspDefinition, LspHover, LspLocation, LspRange, LspTextChange, MediaKind, MediaSource, MediaType, SaveOn, StorageEditorPrefsOptions, TextMatchOptions, WorkspaceEntry, WorkspaceFile, WorkspaceWriteResult, createMemoryFilesLayout, createStorageEditorPrefs, droppedImportItems, droppedItems, entryRefusalText, filesRootOf, filesScopeKey, hasDroppedFiles, inFolder, isUnder, matchRanges, mediaTypeOfPath, movedPath, nameOf, parentOf, parseEditor, steppedIndex, topLevelPaths };
8
+ export { AutoSurround, ContentMatch, ContentSearchOptions, ContentSearchResult, DEFAULT_EDITOR, DEFAULT_FILES_LABELS, DEFAULT_FILES_LAYOUT, DIAGNOSTICS_TIMEOUT, Diagnostic, DiagnosticSeverity, DiagnosticsMode, DiagnosticsResult, DiagnosticsRun, DiagnosticsRunOptions, DroppedItem, EDITOR_STORAGE_KEY, EditorPrefs, EditorPrefsStorage, EditorState, EntryClipboard, FilesChatTarget, FilesDiagnostics, FilesEntries, FilesEntryRefusal, FilesEntryResult, FilesHost, FilesImportResult, FilesKeyScope, FilesLabels, FilesLayout, FilesLayoutStore, FilesLsp, FilesRemoval, FilesScope, FilesSystem, FolderChange, GitStatusEntry, LSP_IDLE, LspCompletionDetail, LspCompletionItem, LspCompletionList, LspDefinition, LspHover, LspLocation, LspRange, LspTextChange, MediaKind, MediaSource, MediaType, SaveOn, StorageEditorPrefsOptions, TextMatchOptions, WorkspaceEntry, WorkspaceFile, WorkspaceListing, WorkspaceWriteResult, createMemoryFilesLayout, createStorageEditorPrefs, droppedImportItems, droppedItems, entryRefusalText, filesRootOf, filesScopeKey, hasDroppedFiles, inFolder, isUnder, matchRanges, mediaTypeOfPath, movedPath, nameOf, parentOf, parseEditor, steppedIndex, topLevelPaths };
@@ -19,6 +19,7 @@ declare const DEFAULT_FILES_LABELS: {
19
19
  filesRefresh: string;
20
20
  filesNoChanged: string;
21
21
  filesEmptyFolder: string;
22
+ filesTruncated: (shown: number, total: number, atLeast: boolean) => string;
22
23
  filesOpenFiles: string;
23
24
  filesPickFile: string;
24
25
  filesNotFound: string;
@@ -20,6 +20,7 @@ const DEFAULT_FILES_LABELS = {
20
20
  filesRefresh: "Refresh",
21
21
  filesNoChanged: "No changed files",
22
22
  filesEmptyFolder: "Empty folder",
23
+ filesTruncated: (shown, total, atLeast) => `Showing ${shown.toLocaleString()} of ${total.toLocaleString()}${atLeast ? "+" : ""}: search to find more`,
23
24
  filesOpenFiles: "Open files",
24
25
  filesPickFile: "Pick a file to view it",
25
26
  filesNotFound: "File not found at this path",
@@ -81,9 +81,16 @@ function describeFilesHostContract(name, makeHarness, capabilities) {
81
81
  });
82
82
  it.skipIf(!has("list"))("lists the folder's files", async () => {
83
83
  const { host } = await setup();
84
- const files = (await host.list(CWD)).filter((e) => e.kind === "file").map((e) => e.path);
84
+ const { entries } = await host.list(CWD);
85
+ const files = entries.filter((e) => e.kind === "file").map((e) => e.path);
85
86
  expect(files.sort()).toEqual(Object.keys(FILES).sort());
86
87
  });
88
+ it.skipIf(!has("list"))("lists one folder with dir, its paths still relative to the root", async () => {
89
+ const { host } = await setup();
90
+ const { entries } = await host.list(CWD, { dir: "src" });
91
+ const files = entries.filter((e) => e.kind === "file").map((e) => e.path);
92
+ expect(files.sort()).toEqual(Object.keys(FILES).filter((p) => p.startsWith("src/")).sort());
93
+ });
87
94
  it.skipIf(!has("read"))("reads a file with its size and version, and null for a missing one", async () => {
88
95
  const { host } = await setup();
89
96
  const file = await host.read(CWD, "src/a.ts");
@@ -149,7 +156,7 @@ function describeFilesHostContract(name, makeHarness, capabilities) {
149
156
  reason: "invalid"
150
157
  });
151
158
  if (has("list")) {
152
- const listed = (await host.list(CWD)).map((e) => e.path);
159
+ const listed = (await host.list(CWD)).entries.map((e) => e.path);
153
160
  expect(listed).toContain("src/new/c.ts");
154
161
  expect(listed).toContain("docs/");
155
162
  }
@@ -1,4 +1,4 @@
1
- import { FilesScope, GitStatusEntry, WorkspaceEntry } from "./headless/host.js";
1
+ import { FilesScope, GitStatusEntry, WorkspaceEntry, WorkspaceListing } from "./headless/host.js";
2
2
  import { SessionEditEvent } from "../session/headless/session-diffs.js";
3
3
  import { SessionEditsHook } from "./tab-hooks.js";
4
4
  //#region src/files/useWorkspace.d.ts
@@ -12,10 +12,22 @@ interface Workspace {
12
12
  refresh: () => Promise<void>;
13
13
  /** Fires after the folder may have changed, debounced (same trigger as `refresh`). */
14
14
  onToolResult: (handler: () => void) => () => void;
15
+ /** The listing was cut at the host's cap: how many rows show of how many. */
16
+ truncated: WorkspaceListing['truncated'] | null;
17
+ /** Lists what is under an ignored folder (relative, no trailing `/`) into `entries`. */
18
+ openFolder: (dir: string) => void;
15
19
  }
16
20
  declare function useWorkspace(scope: FilesScope, showIgnored: boolean,
17
21
  /** The tab is on screen; while hidden a burst only marks the listing stale. */
18
22
  visible: boolean, useEdits: SessionEditsHook): Workspace;
23
+ /**
24
+ * The listing with what each opened folder holds: an opened folder's own node (`dist/`) gives way to its contents,
25
+ * unless it holds nothing.
26
+ *
27
+ * @param listed - The folder's listing (`null`: not read yet).
28
+ * @param opened - What each opened folder holds, by folder (relative, no trailing `/`).
29
+ */
30
+ declare function withOpenedFolders(listed: WorkspaceEntry[] | null, opened: ReadonlyMap<string, readonly WorkspaceEntry[]>): WorkspaceEntry[] | null;
19
31
  /**
20
32
  * Keep files in `changed`, and folders that contain one.
21
33
  *
@@ -24,4 +36,4 @@ visible: boolean, useEdits: SessionEditsHook): Workspace;
24
36
  */
25
37
  declare function filterChanged(entries: readonly WorkspaceEntry[], changed: ReadonlySet<string>): WorkspaceEntry[];
26
38
  //#endregion
27
- export { Workspace, filterChanged, useWorkspace };
39
+ export { Workspace, filterChanged, useWorkspace, withOpenedFolders };
@@ -10,11 +10,20 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
10
10
  * Refreshes after tool results from any session working in the folder and
11
11
  * when the repository moves (`folder-changes`), debounced: a run emitting
12
12
  * ten results in a second costs one listing, not ten.
13
+ *
14
+ * An ignored folder comes as one node; `openFolder` lists what is under it
15
+ * (`FilesHost.list` with `dir`) when the tree opens it, and every refresh
16
+ * lists the opened ones again. `truncated`: the host cut the listing.
13
17
  */
14
18
  const TOOL_RESULT_DEBOUNCE_MS = 400;
19
+ const NO_FOLDERS = /* @__PURE__ */ new Map();
15
20
  function useWorkspace(scope, showIgnored, visible, useEdits) {
16
21
  const host = useFilesHost();
17
- const [entries, setEntries] = useState(null);
22
+ const [listed, setListed] = useState(null);
23
+ const [truncated, setTruncated] = useState(null);
24
+ const [opened, setOpened] = useState(NO_FOLDERS);
25
+ const openedRef = useRef(opened);
26
+ openedRef.current = opened;
18
27
  const [status, setStatus] = useState([]);
19
28
  const cwd = filesRootOf(scope) || null;
20
29
  const edits = useEdits(scope.session ?? null);
@@ -23,26 +32,70 @@ function useWorkspace(scope, showIgnored, visible, useEdits) {
23
32
  const refresh = useCallback(async () => {
24
33
  if (!cwd) return;
25
34
  const mine = ++reads.current;
26
- let list;
35
+ const folders = [...openedRef.current.keys()];
36
+ let listing;
27
37
  let git;
38
+ let inFolders;
28
39
  try {
29
- [list, git] = await Promise.all([host.list ? host.list(cwd, { showIgnored }) : [], host.gitStatus ? host.gitStatus(cwd) : []]);
40
+ [listing, git, inFolders] = await Promise.all([
41
+ host.list ? host.list(cwd, { showIgnored }) : { entries: [] },
42
+ host.gitStatus ? host.gitStatus(cwd) : [],
43
+ Promise.all(folders.map(async (dir) => host.list ? (await host.list(cwd, {
44
+ showIgnored,
45
+ dir
46
+ })).entries : []))
47
+ ]);
30
48
  } catch {
31
- if (mine === reads.current) setEntries((prev) => prev ?? []);
49
+ if (mine === reads.current) setListed((prev) => prev ?? []);
32
50
  return;
33
51
  }
34
52
  if (mine !== reads.current) return;
35
- setEntries((prev) => sameEntries(prev, list) ? prev : list);
53
+ const list = listing.entries;
54
+ setListed((prev) => sameEntries(prev, list) ? prev : list);
55
+ setTruncated((prev) => sameTruncation(prev, listing.truncated) ? prev : listing.truncated ?? null);
36
56
  setStatus((prev) => sameStatus(prev, git) ? prev : git);
57
+ if (folders.length > 0) setOpened((prev) => {
58
+ let changed = false;
59
+ const next = new Map(prev);
60
+ folders.forEach((dir, i) => {
61
+ const fresh = inFolders[i];
62
+ if (sameEntries(prev.get(dir) ?? null, fresh)) return;
63
+ changed = true;
64
+ next.set(dir, fresh);
65
+ });
66
+ return changed ? next : prev;
67
+ });
37
68
  }, [
38
69
  host,
39
70
  cwd,
40
71
  showIgnored
41
72
  ]);
73
+ const generation = useRef(0);
42
74
  useEffect(() => {
43
- setEntries(null);
75
+ generation.current++;
76
+ setListed(null);
77
+ setTruncated(null);
78
+ setOpened(NO_FOLDERS);
79
+ openedRef.current = NO_FOLDERS;
44
80
  refresh();
45
81
  }, [refresh]);
82
+ const openFolder = useCallback((dir) => {
83
+ const list = host.list;
84
+ if (!cwd || !list || openedRef.current.has(dir)) return;
85
+ const mine = generation.current;
86
+ list(cwd, {
87
+ showIgnored,
88
+ dir
89
+ }).then(({ entries: inside }) => {
90
+ if (mine !== generation.current) return;
91
+ setOpened((prev) => prev.has(dir) ? prev : new Map(prev).set(dir, inside));
92
+ }, () => void 0);
93
+ }, [
94
+ host,
95
+ cwd,
96
+ showIgnored
97
+ ]);
98
+ const entries = useMemo(() => withOpenedFolders(listed, opened), [listed, opened]);
46
99
  const onToolResult = useCallback((handler) => {
47
100
  let timer = null;
48
101
  const off = onFolderChange(() => {
@@ -90,16 +143,41 @@ function useWorkspace(scope, showIgnored, visible, useEdits) {
90
143
  changedPaths,
91
144
  edits,
92
145
  refresh,
93
- onToolResult
146
+ onToolResult,
147
+ truncated,
148
+ openFolder
94
149
  }), [
95
150
  entries,
96
151
  status,
97
152
  changedPaths,
98
153
  edits,
99
154
  refresh,
100
- onToolResult
155
+ onToolResult,
156
+ truncated,
157
+ openFolder
101
158
  ]);
102
159
  }
160
+ function sameTruncation(a, b) {
161
+ if (!a || !b) return !a && !b;
162
+ return a.shown === b.shown && a.total === b.total && a.atLeast === b.atLeast;
163
+ }
164
+ /**
165
+ * The listing with what each opened folder holds: an opened folder's own node (`dist/`) gives way to its contents,
166
+ * unless it holds nothing.
167
+ *
168
+ * @param listed - The folder's listing (`null`: not read yet).
169
+ * @param opened - What each opened folder holds, by folder (relative, no trailing `/`).
170
+ */
171
+ function withOpenedFolders(listed, opened) {
172
+ if (!listed || opened.size === 0) return listed;
173
+ const all = [...listed, ...[...opened.values()].flat()];
174
+ const seen = /* @__PURE__ */ new Set();
175
+ return all.filter((e) => {
176
+ if (seen.has(e.path)) return false;
177
+ seen.add(e.path);
178
+ return !(e.kind === "dir" && (opened.get(e.path.replace(/\/$/, ""))?.length ?? 0) > 0);
179
+ });
180
+ }
103
181
  /**
104
182
  * Keep files in `changed`, and folders that contain one.
105
183
  *
@@ -115,4 +193,4 @@ function filterChanged(entries, changed) {
115
193
  });
116
194
  }
117
195
  //#endregion
118
- export { filterChanged, useWorkspace };
196
+ export { filterChanged, useWorkspace, withOpenedFolders };
@@ -3,11 +3,11 @@ import { CopyButton } from "../components/CopyButton.js";
3
3
  import { Tooltip } from "../components/Tooltip.js";
4
4
  import { MenuNote } from "../components/Menu.js";
5
5
  import { FloatingSurface } from "../components/floating/FloatingSurface.js";
6
+ import { environmentKindIcon } from "./headless/environment.js";
6
7
  import { gitErrorText } from "./headless/labels.js";
7
8
  import { useGitHost, useGitLabels } from "./GitProvider.js";
8
9
  import { useLinkRouter } from "../extensions/links.js";
9
10
  import { relativeTime } from "../chat/headless/session-list.js";
10
- import { environmentKindIcon } from "./headless/environment.js";
11
11
  import { ageIsDuration, clockTime, compactCount, readPullRequests, switcherCacheOf, switcherCreates, switcherKey, switcherSections } from "./headless/switcher.js";
12
12
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
13
13
  import { memo, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
@@ -3,10 +3,10 @@ import { Checkbox, MetaChip } from "../components/Form.js";
3
3
  import { MenuNote, MenuRow } from "../components/Menu.js";
4
4
  import { compactPath } from "../path.js";
5
5
  import { useDisplayPath } from "../hooks/useDisplayPath.js";
6
+ import { environmentKindIcon } from "./headless/environment.js";
6
7
  import { gitErrorText } from "./headless/labels.js";
7
8
  import { useGitHost, useGitLabels } from "./GitProvider.js";
8
9
  import { useOptionalModal } from "../app/ModalProvider.js";
9
- import { environmentKindIcon } from "./headless/environment.js";
10
10
  import { RemoteFolderBrowser } from "./RemoteFolderPicker.js";
11
11
  import { leavesWorktree, moveChoices, moveListingCwd } from "./headless/move.js";
12
12
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -1,9 +1,9 @@
1
1
  import { IconButton } from "../components/IconButton.js";
2
2
  import { Menu, MenuNote, MenuRow, MenuSection, MenuSeparator, focusMenuRow } from "../components/Menu.js";
3
3
  import { Popover } from "../components/floating/Popover.js";
4
+ import { folderName } from "./headless/environment.js";
4
5
  import { gitErrorText } from "./headless/labels.js";
5
6
  import { useGitHost, useGitLabels } from "./GitProvider.js";
6
- import { folderName } from "./headless/environment.js";
7
7
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
8
  import { useEffect, useRef, useState } from "react";
9
9
  //#region src/git/RemoteFolderPicker.tsx
@@ -2,10 +2,10 @@ import { Tooltip } from "../components/Tooltip.js";
2
2
  import { MetaChip } from "../components/Form.js";
3
3
  import { MenuNote, MenuRow, MenuSection, MenuSeparator, handleMenuKeyDown } from "../components/Menu.js";
4
4
  import { Popover } from "../components/floating/Popover.js";
5
+ import { environmentBaseKind, environmentKindIcon, machinesOf, resolveDraftDescriptor } from "./headless/environment.js";
5
6
  import { useGitLabels } from "./GitProvider.js";
6
7
  import { hostReachable, hostStatusLabel } from "../chat/headless/hosts.js";
7
8
  import { HostBadge } from "../chat/HostBadge.js";
8
- import { environmentBaseKind, environmentKindIcon, machinesOf, resolveDraftDescriptor } from "./headless/environment.js";
9
9
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
10
10
  import { useRef } from "react";
11
11
  import { isolationLabel, parseMachineKind } from "zidane/chat/pure";
@@ -1,5 +1,5 @@
1
- import { DEFAULT_GIT_LABELS, gitErrorText } from "./labels.js";
2
1
  import { environmentBaseKind, environmentKindIcon, folderName, machinesOf, resolveDraftDescriptor, resolveDraftEnvironment, withMachines } from "./environment.js";
2
+ import { DEFAULT_GIT_LABELS, gitErrorText } from "./labels.js";
3
3
  import { resolveRemoteClone } from "./remote-clone.js";
4
4
  import { SWITCHER_SECTIONS, ageIsDuration, clockTime, compactCount, createSwitcherCache, prMatches, readPullRequests, switcherCacheOf, switcherCreates, switcherKey, switcherSections } from "./switcher.js";
5
5
  import { syncAction, syncSummary, syncTooltip } from "./sync.js";
@@ -1,5 +1,5 @@
1
- import { useGitHost } from "./GitProvider.js";
2
1
  import { withMachines } from "./headless/environment.js";
2
+ import { useGitHost } from "./GitProvider.js";
3
3
  import { useEffect, useState } from "react";
4
4
  //#region src/git/useEnvironmentChoices.ts
5
5
  const NO_DESCRIPTORS = [];
package/dist/index.d.ts CHANGED
@@ -37,6 +37,7 @@ import { PanelEmpty, PanelEmptyProps, PanelLoading, PanelLoadingProps } from "./
37
37
  import { BadgeTone, DiffCounts, DiffCountsProps, PANEL_ROW, PANEL_ROW_HOVER, RowBadge, RowBadgeProps } from "./components/PanelRows.js";
38
38
  import { PreviewWindow, PreviewWindowProps } from "./components/PreviewWindow.js";
39
39
  import { ReorderTabState, ReorderTabs, ReorderTabsProps } from "./components/ReorderTabs.js";
40
+ import { Restricted, RestrictedProps } from "./components/Restricted.js";
40
41
  import { SegmentSpinner, SegmentSpinnerProps } from "./components/SegmentSpinner.js";
41
42
  import { Segmented, SegmentedOption, SegmentedProps } from "./components/Segmented.js";
42
43
  import { StepActions, StepActionsProps, StepFrame, StepFrameProps } from "./components/StepFrame.js";
@@ -47,6 +48,7 @@ import { SwitchGlyph, SwitchGlyphProps } from "./components/SwitchGlyph.js";
47
48
  import { ThemeThumb, ThemeThumbProps } from "./components/ThemeThumb.js";
48
49
  import { ToggleCard, ToggleCardProps } from "./components/ToggleCard.js";
49
50
  import { Tooltip, TooltipProps } from "./components/Tooltip.js";
51
+ import { ZidaneMark, ZidaneMarkProps } from "./components/ZidaneMark.js";
50
52
  import { MAX_REAL_SCALE } from "./components/zoom.js";
51
53
  import { ZoomableImage, ZoomableImageHandle, ZoomableImageProps } from "./components/ZoomableImage.js";
52
54
  import { BTN_DANGER, BTN_DANGER_CONFIRM, BTN_LG_DANGER, BTN_LG_PRIMARY, BTN_LG_SECONDARY, BTN_LG_SOLID, BTN_PRIMARY, BTN_SECONDARY, ButtonVariant, buttonClass } from "./components/button.js";
@@ -71,7 +73,7 @@ import { MotionLevel, useMotionLevel, useReducedMotion } from "./motion/reduced.
71
73
  import { MotionProvider, MotionProviderProps } from "./motion/provider.js";
72
74
  import { RollDirection, RollingText, RollingTextProps, readRollMs, rollCells } from "./motion/roll.js";
73
75
  import { SHIMMER_MS, syncShimmer } from "./motion/shimmer.js";
74
- import { HeldWidth, HeldWidthProps, SmoothWidth, SmoothWidthProps } from "./motion/size.js";
76
+ import { HeldWidth, HeldWidthProps, SmoothHeight, SmoothHeightProps, SmoothWidth, SmoothWidthProps } from "./motion/size.js";
75
77
  import { ApplyMotionOptions, DEFAULT_PANEL_MS, FADE_KEYS, HOVER_MOTION, INSTANT, MENU_FADE_RATIO, MOTIONS, MOTION_NAMES, MotionName, MotionPrefs, REDUCED_FADE, applyMotionVars, cssMotionVars, currentMotionPrefs, currentMotionTransition, currentWithFade, fadeTransition, menuTransition, motionTransition, motionVars, panelMotionVars, useMenuTransition, useMotionPrefs, useMotionTransition, useSprings, useTabExit, useWithFade, withFade } from "./motion/springs.js";
76
78
  import { Crossfade, CrossfadeProps, Presence, PresenceProps, useCadencedValue } from "./motion/swap.js";
77
79
  import { SwapIcon, SwapIconProps } from "./motion/SwapIcon.js";
@@ -84,4 +86,4 @@ import { IconCollection, RuntimeIconsOptions, watchRuntimeIcons } from "./theme/
84
86
  import { themeCssVars, themeStylesheet } from "./theme/stylesheet.js";
85
87
  import { withoutTransitions } from "./theme/without-transitions.js";
86
88
  import { basename, compactPath, formatPathForCwd, splitPath, tildePath, tildeText } from "./path.js";
87
- export { ACCENT_PRESETS, AccentPreset, AddressBar, AddressBarProps, Align, Anchor, Appearance, ApplyMotionOptions, BRAND_MARKS, BTN_DANGER, BTN_DANGER_CONFIRM, BTN_LG_DANGER, BTN_LG_PRIMARY, BTN_LG_SECONDARY, BTN_LG_SOLID, BTN_PRIMARY, BTN_SECONDARY, BUILTIN_THEMES, BadgeTone, BrandMark, BrandMarkData, BrandMarkPath, BrandMarkProps, BrandMarkSize, Breadcrumb, BreadcrumbProps, BrowserSignIn, BrowserSignInProps, BrowserSignInState, ButtonVariant, CONFIRM_TITLE_ID, CONTRAST, Checkbox, CheckboxProps, ChipColors, ChipKind, ChoiceCardOption, ChoiceCards, ChoiceCardsProps, CodeFrame, CodeFrameProps, CodeHighlightProvider, CodeHighlightProviderProps, CodeHighlighter, CodeHighlighterOptions, CodePanel, CodePanelProps, CodeWrapProvider, CodeWrapProviderProps, ConfirmDialog, ConfirmDialogProps, ConfirmOptions, CopyButton, CopyButtonProps, CountBadge, CountBadgeProps, CountTone, Crossfade, CrossfadeProps, CssVarMap, DARK_LUMINANCE_THRESHOLD, DEFAULT_EDITOR_SETTINGS, DEFAULT_LABELS, DEFAULT_PANEL_MS, DEFAULT_THEME, DiffColors, DiffCounts, DiffCountsProps, DismissHandlers, DotColors, EditableTitle, EditableTitleProps, EditorEnvironment, EditorEnvironmentProvider, EditorEnvironmentProviderProps, EditorSettings, EmptyState, EmptyStateProps, ErrorBoundary, ErrorBoundaryProps, ErrorDetails, ErrorDetailsProps, ErrorFallback, ErrorFallbackFrameProps, ErrorFallbackProps, ErrorNote, ErrorNoteProps, ErrorReport, ErrorReportOptions, ErrorReportSink, FADE_KEYS, FIELD_LABEL_CLASS, FORM_CARD_CLASS, FloatingSurface, FloatingSurfaceProps, FormCard, FormCardProps, FormSection, FormSectionProps, Grow, GrowPresence, GrowProps, HOVER_MOTION, HeldWidth, HeldWidthProps, HighlightRequest, HighlightResponse, Highlighted, HighlightedCode, HighlightedCodeProps, HighlightedProps, HostRow, HostRowProps, HoverCard, HoverCardProps, HoverCardTriggerProps, HowItWorks, HowItWorksProps, HowItWorksStep, INPUT_CLASS, INSTANT, IconButton, IconButtonLook, IconButtonProps, IconButtonRenderProps, IconButtonSize, IconCollection, IconToggle, IconToggleProps, KeyCombo, KeyComboProps, Keycap, KeycapProps, KeyedStore, LabelOverrides, Labels, LabelsProvider, LabelsProviderProps, LayerOptions, LightboxItem, LoadError, LoadErrorProps, MAX_REAL_SCALE, MENU_FADE_RATIO, MOTIONS, MOTION_NAMES, MatchedTitle, MatchedTitleProps, MediaNav, type MediaNavProps, Menu, MenuNote, MenuNoteProps, MenuProps, MenuRow, MenuRowProps, MenuRowRenderProps, MenuSection, MenuSectionProps, MenuSeparator, MenuSeparatorProps, MenuSwitch, MenuSwitchProps, Meta, MetaChip, MetaChipProps, MetaProps, MotionLevel, MotionName, MotionPrefs, MotionProvider, MotionProviderProps, NavButton, NavButtonProps, NavRow, NavRowProps, Oklch, OpLine, OpLineProps, Overlay, OverlayProps, PANEL_ROW, PANEL_ROW_HOVER, PUNCTUATION_CODES, PaletteEntry, PaletteIcon, PaletteIconProps, PaletteKeys, PaletteList, PaletteListProps, PaletteNotice, PaletteOption, PaletteOptionProps, PalettePanel, PalettePanelProps, PaletteRow, PaletteRowData, PaletteRowProps, PaletteSection, PanelEmpty, PanelEmptyProps, PanelLoading, PanelLoadingProps, PathDisplay, PathDisplayProvider, PathDisplayProviderProps, PathDisplayScope, PathDisplayScopeProps, Placement, Popover, PopoverProps, PopoverState, PopoverTriggerProps, Presence, type Presence$1 as PresenceHandle, type PresenceOptions, PresenceProps, type PresenceState, PreviewWindow, PreviewWindowProps, REDUCED_FADE, ROW_BUTTON_CLASS, ROW_CLASS, ROW_HOST_CLASS, ROW_TRIGGER_CLASS, Raised, RaisedProps, Rect, ReorderTabState, ReorderTabs, ReorderTabsProps, ResizeDrag, ResizeDragHandleProps, ResizeDragOptions, ResolvedPalette, Rgb, RollDirection, RollingText, RollingTextProps, RowActionItem, RowActionsMenu, RowActionsMenuProps, RowBadge, RowBadgeProps, RowText, RowTextProps, RuntimeIconsOptions, SHIMMER_MS, SectionLabel, SectionLabelProps, SegmentSpinner, SegmentSpinnerProps, Segmented, SegmentedOption, SegmentedProps, SegmentedRow, SegmentedRowProps, Side, SliderRow, SliderRowProps, SmoothWidth, SmoothWidthProps, SphereShading, StepActions, StepActionsProps, StepFrame, StepFrameProps, Stepper, StepperProps, StepperStep, SurfaceLadder, SwapIcon, SwapIconProps, Swatch, SwatchPicker, SwatchPickerProps, Switch, SwitchGlyph, SwitchGlyphProps, SwitchProps, SwitchRow, SwitchRowProps, SyntaxStyles, SyntaxTokenStyle, TEXTAREA_CLASS, TabDragBounds, TabPill, TabPillProps, Theme, ThemeColors, ThemeDiff, ThemeSeed, ThemeSelect, ThemeSurfaces, ThemeThumb, ThemeThumbProps, TitleText, TitleTextProps, ToggleCard, ToggleCardProps, ToggleSwitch, ToggleSwitchProps, Tooltip, TooltipProps, Tray, TrayProps, ZoomableImage, type ZoomableImageHandle, type ZoomableImageProps, _resetKeyboardLayout, anchorNudge, applyMotionVars, basename, beginLayoutAnimation, buttonClass, capChroma, clampWidth, compactPath, configureErrorReports, contrastRatio, contrastToCssVars, createCodeHighlighter, createKeyedStore, cssMotionVars, currentMotionPrefs, currentMotionTransition, currentWithFade, defaultPaletteKeys, defaultShikiTheme, depthToCssVars, derivePalette, ensureContrast, errorMessage, errorStacksShown, extendLabels, fadeTransition, focusMenuRow, formatColor, formatPathForCwd, handleMenuKeyDown, hasBrandMark, iconButtonClass, inferAppearance, installRendererErrorHandlers, isDark, isLayoutAnimating, layoutKeyLabel, luminance, menuTransition, mix, motionTransition, motionVars, moveId, oklch, oklchToRgb, oneOf, paletteToCssVars, paletteVerb, panelMotionVars, parseBoolean, parseColor, placeSurface, presetFor, pulseLayout, readDurationVar, readExitMs, readMenuExitMs, readMotionMs, readPanelMs, readPersisted, readRollMs, readableOn, reportRendererError, resetReportedErrors, resolveTheme, returnFocus, rgbToOklch, rollCells, scrollRootOf, seedFromTheme, shikiThemeFor, splitPath, subscribeLayoutAnimating, syncShimmer, themeCssVars, themeStylesheet, tildePath, tildeText, tintedNeutral, toOklch, transitionState, typesStandIn, useAnchoredPosition, useCadencedValue, useCodeHighlight, useDismiss, useDisplayPath, useDocumentAppearance, useEditorEnvironment, useKeyboardLayout, useKeyedValue, useLabels, useLayer, useLightbox, useMenuTransition, useMinuteTick, useMotionLevel, useMotionPrefs, useMotionTransition, useNearViewport, usePersistedState, usePopover, usePresence, useReducedMotion, useResizeDrag, useRowHint, useScrollLock, useSprings, useStaysMounted, useTabDrag, useTabExit, useWithFade, watchRuntimeIcons, withAlpha, withFade, withLightness, withoutTransitions, writePersisted };
89
+ export { ACCENT_PRESETS, AccentPreset, AddressBar, AddressBarProps, Align, Anchor, Appearance, ApplyMotionOptions, BRAND_MARKS, BTN_DANGER, BTN_DANGER_CONFIRM, BTN_LG_DANGER, BTN_LG_PRIMARY, BTN_LG_SECONDARY, BTN_LG_SOLID, BTN_PRIMARY, BTN_SECONDARY, BUILTIN_THEMES, BadgeTone, BrandMark, BrandMarkData, BrandMarkPath, BrandMarkProps, BrandMarkSize, Breadcrumb, BreadcrumbProps, BrowserSignIn, BrowserSignInProps, BrowserSignInState, ButtonVariant, CONFIRM_TITLE_ID, CONTRAST, Checkbox, CheckboxProps, ChipColors, ChipKind, ChoiceCardOption, ChoiceCards, ChoiceCardsProps, CodeFrame, CodeFrameProps, CodeHighlightProvider, CodeHighlightProviderProps, CodeHighlighter, CodeHighlighterOptions, CodePanel, CodePanelProps, CodeWrapProvider, CodeWrapProviderProps, ConfirmDialog, ConfirmDialogProps, ConfirmOptions, CopyButton, CopyButtonProps, CountBadge, CountBadgeProps, CountTone, Crossfade, CrossfadeProps, CssVarMap, DARK_LUMINANCE_THRESHOLD, DEFAULT_EDITOR_SETTINGS, DEFAULT_LABELS, DEFAULT_PANEL_MS, DEFAULT_THEME, DiffColors, DiffCounts, DiffCountsProps, DismissHandlers, DotColors, EditableTitle, EditableTitleProps, EditorEnvironment, EditorEnvironmentProvider, EditorEnvironmentProviderProps, EditorSettings, EmptyState, EmptyStateProps, ErrorBoundary, ErrorBoundaryProps, ErrorDetails, ErrorDetailsProps, ErrorFallback, ErrorFallbackFrameProps, ErrorFallbackProps, ErrorNote, ErrorNoteProps, ErrorReport, ErrorReportOptions, ErrorReportSink, FADE_KEYS, FIELD_LABEL_CLASS, FORM_CARD_CLASS, FloatingSurface, FloatingSurfaceProps, FormCard, FormCardProps, FormSection, FormSectionProps, Grow, GrowPresence, GrowProps, HOVER_MOTION, HeldWidth, HeldWidthProps, HighlightRequest, HighlightResponse, Highlighted, HighlightedCode, HighlightedCodeProps, HighlightedProps, HostRow, HostRowProps, HoverCard, HoverCardProps, HoverCardTriggerProps, HowItWorks, HowItWorksProps, HowItWorksStep, INPUT_CLASS, INSTANT, IconButton, IconButtonLook, IconButtonProps, IconButtonRenderProps, IconButtonSize, IconCollection, IconToggle, IconToggleProps, KeyCombo, KeyComboProps, Keycap, KeycapProps, KeyedStore, LabelOverrides, Labels, LabelsProvider, LabelsProviderProps, LayerOptions, LightboxItem, LoadError, LoadErrorProps, MAX_REAL_SCALE, MENU_FADE_RATIO, MOTIONS, MOTION_NAMES, MatchedTitle, MatchedTitleProps, MediaNav, type MediaNavProps, Menu, MenuNote, MenuNoteProps, MenuProps, MenuRow, MenuRowProps, MenuRowRenderProps, MenuSection, MenuSectionProps, MenuSeparator, MenuSeparatorProps, MenuSwitch, MenuSwitchProps, Meta, MetaChip, MetaChipProps, MetaProps, MotionLevel, MotionName, MotionPrefs, MotionProvider, MotionProviderProps, NavButton, NavButtonProps, NavRow, NavRowProps, Oklch, OpLine, OpLineProps, Overlay, OverlayProps, PANEL_ROW, PANEL_ROW_HOVER, PUNCTUATION_CODES, PaletteEntry, PaletteIcon, PaletteIconProps, PaletteKeys, PaletteList, PaletteListProps, PaletteNotice, PaletteOption, PaletteOptionProps, PalettePanel, PalettePanelProps, PaletteRow, PaletteRowData, PaletteRowProps, PaletteSection, PanelEmpty, PanelEmptyProps, PanelLoading, PanelLoadingProps, PathDisplay, PathDisplayProvider, PathDisplayProviderProps, PathDisplayScope, PathDisplayScopeProps, Placement, Popover, PopoverProps, PopoverState, PopoverTriggerProps, Presence, type Presence$1 as PresenceHandle, type PresenceOptions, PresenceProps, type PresenceState, PreviewWindow, PreviewWindowProps, REDUCED_FADE, ROW_BUTTON_CLASS, ROW_CLASS, ROW_HOST_CLASS, ROW_TRIGGER_CLASS, Raised, RaisedProps, Rect, ReorderTabState, ReorderTabs, ReorderTabsProps, ResizeDrag, ResizeDragHandleProps, ResizeDragOptions, ResolvedPalette, Restricted, RestrictedProps, Rgb, RollDirection, RollingText, RollingTextProps, RowActionItem, RowActionsMenu, RowActionsMenuProps, RowBadge, RowBadgeProps, RowText, RowTextProps, RuntimeIconsOptions, SHIMMER_MS, SectionLabel, SectionLabelProps, SegmentSpinner, SegmentSpinnerProps, Segmented, SegmentedOption, SegmentedProps, SegmentedRow, SegmentedRowProps, Side, SliderRow, SliderRowProps, SmoothHeight, SmoothHeightProps, SmoothWidth, SmoothWidthProps, SphereShading, StepActions, StepActionsProps, StepFrame, StepFrameProps, Stepper, StepperProps, StepperStep, SurfaceLadder, SwapIcon, SwapIconProps, Swatch, SwatchPicker, SwatchPickerProps, Switch, SwitchGlyph, SwitchGlyphProps, SwitchProps, SwitchRow, SwitchRowProps, SyntaxStyles, SyntaxTokenStyle, TEXTAREA_CLASS, TabDragBounds, TabPill, TabPillProps, Theme, ThemeColors, ThemeDiff, ThemeSeed, ThemeSelect, ThemeSurfaces, ThemeThumb, ThemeThumbProps, TitleText, TitleTextProps, ToggleCard, ToggleCardProps, ToggleSwitch, ToggleSwitchProps, Tooltip, TooltipProps, Tray, TrayProps, ZidaneMark, ZidaneMarkProps, ZoomableImage, type ZoomableImageHandle, type ZoomableImageProps, _resetKeyboardLayout, anchorNudge, applyMotionVars, basename, beginLayoutAnimation, buttonClass, capChroma, clampWidth, compactPath, configureErrorReports, contrastRatio, contrastToCssVars, createCodeHighlighter, createKeyedStore, cssMotionVars, currentMotionPrefs, currentMotionTransition, currentWithFade, defaultPaletteKeys, defaultShikiTheme, depthToCssVars, derivePalette, ensureContrast, errorMessage, errorStacksShown, extendLabels, fadeTransition, focusMenuRow, formatColor, formatPathForCwd, handleMenuKeyDown, hasBrandMark, iconButtonClass, inferAppearance, installRendererErrorHandlers, isDark, isLayoutAnimating, layoutKeyLabel, luminance, menuTransition, mix, motionTransition, motionVars, moveId, oklch, oklchToRgb, oneOf, paletteToCssVars, paletteVerb, panelMotionVars, parseBoolean, parseColor, placeSurface, presetFor, pulseLayout, readDurationVar, readExitMs, readMenuExitMs, readMotionMs, readPanelMs, readPersisted, readRollMs, readableOn, reportRendererError, resetReportedErrors, resolveTheme, returnFocus, rgbToOklch, rollCells, scrollRootOf, seedFromTheme, shikiThemeFor, splitPath, subscribeLayoutAnimating, syncShimmer, themeCssVars, themeStylesheet, tildePath, tildeText, tintedNeutral, toOklch, transitionState, typesStandIn, useAnchoredPosition, useCadencedValue, useCodeHighlight, useDismiss, useDisplayPath, useDocumentAppearance, useEditorEnvironment, useKeyboardLayout, useKeyedValue, useLabels, useLayer, useLightbox, useMenuTransition, useMinuteTick, useMotionLevel, useMotionPrefs, useMotionTransition, useNearViewport, usePersistedState, usePopover, usePresence, useReducedMotion, useResizeDrag, useRowHint, useScrollLock, useSprings, useStaysMounted, useTabDrag, useTabExit, useWithFade, watchRuntimeIcons, withAlpha, withFade, withLightness, withoutTransitions, writePersisted };