zidane-ui 9.1.13 → 9.1.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (309) hide show
  1. package/dist/adapters/index.d.ts +2 -2
  2. package/dist/adapters/index.js +2 -2
  3. package/dist/adapters/live.d.ts +29 -3
  4. package/dist/adapters/live.js +9 -1
  5. package/dist/adapters/server-composer-host.js +17 -2
  6. package/dist/adapters/server-extensions-host.d.ts +0 -1
  7. package/dist/adapters/server-extensions-host.js +5 -16
  8. package/dist/adapters/server-git-host.js +7 -16
  9. package/dist/adapters/server-host.js +181 -43
  10. package/dist/adapters/server-machines-host.d.ts +2 -0
  11. package/dist/adapters/server-machines-host.js +24 -25
  12. package/dist/adapters/server-onboarding-host.d.ts +1 -1
  13. package/dist/adapters/server-onboarding-host.js +3 -4
  14. package/dist/adapters/server-session-host.js +22 -3
  15. package/dist/adapters/server-settings-accounts.js +2 -2
  16. package/dist/adapters/server-settings-host.js +3 -3
  17. package/dist/adapters/server-settings-performance.js +7 -9
  18. package/dist/adapters/server-settings-sections.js +13 -14
  19. package/dist/adapters/server-sidebar-host.js +2 -2
  20. package/dist/adapters/sse-host.js +68 -3
  21. package/dist/adapters/sse-protocol.d.ts +12 -2
  22. package/dist/adapters/sse-protocol.js +4 -2
  23. package/dist/app/AppHostProvider.js +4 -3
  24. package/dist/app/ModalProvider.d.ts +13 -3
  25. package/dist/app/ModalProvider.js +103 -24
  26. package/dist/app/NoticeStack.d.ts +33 -0
  27. package/dist/app/NoticeStack.js +90 -0
  28. package/dist/app/index.d.ts +3 -2
  29. package/dist/app/index.js +3 -2
  30. package/dist/appearance/AppearanceProvider.js +2 -2
  31. package/dist/appearance/headless/index.js +1 -1
  32. package/dist/approvals/headless/index.js +2 -2
  33. package/dist/chat/SessionFilterMenu.d.ts +1 -1
  34. package/dist/chat/SessionFilterMenu.js +2 -1
  35. package/dist/chat/Transcript.js +1 -1
  36. package/dist/chat/composer/Composer.js +9 -6
  37. package/dist/chat/composer/ComposerEditor.js +1 -1
  38. package/dist/chat/composer/ConversationBadges.js +1 -1
  39. package/dist/chat/composer/ModelChainList.js +17 -8
  40. package/dist/chat/composer/ModelChainTooltip.js +5 -2
  41. package/dist/chat/composer/use-composer-stores.js +1 -1
  42. package/dist/chat/composer/use-draft-target.d.ts +20 -1
  43. package/dist/chat/composer/use-draft-target.js +122 -6
  44. package/dist/chat/composer/use-new-session-defaults.d.ts +5 -1
  45. package/dist/chat/composer/use-new-session-defaults.js +17 -4
  46. package/dist/chat/composer/use-run-meter.js +1 -1
  47. package/dist/chat/composer/use-send-prompt.js +1 -1
  48. package/dist/chat/headless/chip-labels.d.ts +1 -0
  49. package/dist/chat/headless/chip-labels.js +1 -0
  50. package/dist/chat/headless/composer/index.js +2 -2
  51. package/dist/chat/headless/draft-target.d.ts +21 -1
  52. package/dist/chat/headless/fixture-host.js +17 -2
  53. package/dist/chat/headless/host.d.ts +3 -3
  54. package/dist/chat/headless/index.d.ts +9 -9
  55. package/dist/chat/headless/index.js +15 -15
  56. package/dist/chat/headless/labels.d.ts +13 -4
  57. package/dist/chat/headless/labels.js +8 -5
  58. package/dist/chat/headless/session-list.d.ts +20 -6
  59. package/dist/chat/headless/session-list.js +1 -0
  60. package/dist/chat/headless/sidebar/directory.d.ts +56 -14
  61. package/dist/chat/headless/sidebar/directory.js +149 -70
  62. package/dist/chat/headless/sidebar/index.d.ts +3 -3
  63. package/dist/chat/headless/sidebar/index.js +3 -3
  64. package/dist/chat/headless/sidebar/labels.d.ts +15 -6
  65. package/dist/chat/headless/sidebar/types.d.ts +3 -1
  66. package/dist/chat/headless/sidebar/view.d.ts +13 -5
  67. package/dist/chat/headless/sidebar/view.js +31 -11
  68. package/dist/chat/headless/streams/actions.d.ts +5 -3
  69. package/dist/chat/headless/streams/actions.js +3 -2
  70. package/dist/chat/headless/streams/index.d.ts +3 -3
  71. package/dist/chat/headless/streams/merge.d.ts +6 -10
  72. package/dist/chat/headless/streams/merge.js +7 -21
  73. package/dist/chat/headless/streams/session-streams.d.ts +29 -4
  74. package/dist/chat/headless/streams/session-streams.js +86 -0
  75. package/dist/chat/headless/streams/store.d.ts +162 -16
  76. package/dist/chat/headless/streams/store.js +334 -38
  77. package/dist/chat/headless/streams/types.d.ts +10 -7
  78. package/dist/chat/headless/transcript-labels.d.ts +1 -0
  79. package/dist/chat/interactions/PlanCard.js +10 -3
  80. package/dist/chat/interactions/QuestionForm.js +7 -3
  81. package/dist/chat/interactions/card-ui.d.ts +5 -3
  82. package/dist/chat/interactions/card-ui.js +9 -7
  83. package/dist/chat/sidebar/SessionSidebar.js +5 -5
  84. package/dist/chat/sidebar/SidebarFilterMenu.js +3 -1
  85. package/dist/chat/sidebar/SidebarFrame.d.ts +4 -0
  86. package/dist/chat/sidebar/SidebarFrame.js +27 -9
  87. package/dist/chat/sidebar/SidebarGroupHeader.js +1 -1
  88. package/dist/chat/sidebar/SidebarHostProvider.d.ts +8 -5
  89. package/dist/chat/sidebar/SidebarHostProvider.js +13 -9
  90. package/dist/chat/sidebar/SidebarToggleButton.js +7 -3
  91. package/dist/chat/sidebar/index.d.ts +2 -2
  92. package/dist/chat/sidebar/session-menu.js +4 -4
  93. package/dist/chat/sidebar/useSaveViewAsSpace.js +2 -2
  94. package/dist/chat/testing/contract.js +2 -2
  95. package/dist/chat/transcript/AuthFailureCard.js +11 -8
  96. package/dist/chat/transcript/BadgeMenu.js +13 -2
  97. package/dist/chat/transcript/MermaidDiagram.js +7 -3
  98. package/dist/chat/transcript/fold.d.ts +4 -0
  99. package/dist/chat/transcript/fold.js +53 -22
  100. package/dist/chat/transcript/script-input.d.ts +1 -1
  101. package/dist/chat/transcript/shell-block.js +8 -4
  102. package/dist/chat/transcript/useStickToBottom.js +12 -0
  103. package/dist/components/BrowserSignIn.js +23 -21
  104. package/dist/components/Form.d.ts +6 -4
  105. package/dist/components/Form.js +16 -8
  106. package/dist/components/LoadError.d.ts +4 -2
  107. package/dist/components/LoadError.js +13 -9
  108. package/dist/components/Notice.d.ts +29 -0
  109. package/dist/components/Notice.js +63 -0
  110. package/dist/components/PanelEmpty.d.ts +1 -1
  111. package/dist/components/PanelEmpty.js +4 -2
  112. package/dist/components/Restricted.d.ts +1 -1
  113. package/dist/components/palette/PaletteList.js +8 -1
  114. package/dist/components/palette/PalettePanel.js +14 -6
  115. package/dist/core.css +24 -5
  116. package/dist/dist/{index-Bq87OcGy.d.ts → index-C6rzc-tt.d.ts} +28 -3
  117. package/dist/dist/index.d.ts +2 -2
  118. package/dist/dist/{timeout-B5pO5I5a.d.ts → timeout-Cz9dRF8Q.d.ts} +1 -1
  119. package/dist/extensions/ExtensionSettingsPage.js +2 -5
  120. package/dist/extensions/ExtensionSettingsSection.js +5 -4
  121. package/dist/extensions/ExtensionSettingsSidebar.js +3 -7
  122. package/dist/extensions/SettingsWireForm.d.ts +1 -7
  123. package/dist/extensions/SettingsWireForm.js +7 -5
  124. package/dist/extensions/headless/fixture-host.d.ts +1 -5
  125. package/dist/extensions/headless/fixture-host.js +2 -5
  126. package/dist/extensions/headless/host.d.ts +1 -11
  127. package/dist/extensions/headless/index.d.ts +3 -3
  128. package/dist/extensions/headless/index.js +6 -6
  129. package/dist/extensions/headless/select.d.ts +1 -11
  130. package/dist/extensions/headless/select.js +1 -18
  131. package/dist/extensions/hooks.js +1 -1
  132. package/dist/files/EditorColumn.js +13 -2
  133. package/dist/files/MediaDiff.js +1 -1
  134. package/dist/files/TreeColumn.js +13 -20
  135. package/dist/files/useEntryActions.js +1 -1
  136. package/dist/files/useOpenFiles.js +3 -1
  137. package/dist/git/BranchMenu.js +6 -4
  138. package/dist/git/ImportRepoDialog.js +18 -9
  139. package/dist/git/MoveSessionDialog.js +16 -8
  140. package/dist/git/RemoteFolderPicker.js +35 -17
  141. package/dist/git/SyncChip.js +17 -17
  142. package/dist/git/WherePicker.d.ts +16 -1
  143. package/dist/git/WherePicker.js +81 -37
  144. package/dist/git/headless/environment.d.ts +33 -3
  145. package/dist/git/headless/environment.js +33 -5
  146. package/dist/git/headless/index.d.ts +2 -2
  147. package/dist/git/headless/index.js +2 -2
  148. package/dist/git/headless/labels.d.ts +15 -2
  149. package/dist/git/headless/labels.js +17 -4
  150. package/dist/git/useEnvironmentChoices.d.ts +3 -1
  151. package/dist/git/useEnvironmentChoices.js +7 -4
  152. package/dist/index.d.ts +2 -1
  153. package/dist/index.js +2 -1
  154. package/dist/keybindings/KeyCommands.js +1 -1
  155. package/dist/keybindings/KeybindingsProvider.js +1 -1
  156. package/dist/keybindings/headless/index.js +2 -2
  157. package/dist/keybindings/headless/overrides.js +1 -1
  158. package/dist/labels.d.ts +5 -0
  159. package/dist/labels.js +5 -0
  160. package/dist/machines/AddMachineDialog.d.ts +34 -0
  161. package/dist/machines/AddMachineDialog.js +464 -0
  162. package/dist/machines/Banners.d.ts +33 -4
  163. package/dist/machines/Banners.js +64 -3
  164. package/dist/machines/DaemonMenu.js +27 -4
  165. package/dist/machines/HostCapabilities.d.ts +1 -3
  166. package/dist/machines/HostCapabilities.js +24 -45
  167. package/dist/machines/HostSyncPanel.js +124 -130
  168. package/dist/machines/HostsSection.d.ts +4 -1
  169. package/dist/machines/HostsSection.js +30 -7
  170. package/dist/machines/MachinesExplainer.d.ts +17 -0
  171. package/dist/machines/MachinesExplainer.js +71 -0
  172. package/dist/machines/MachinesProvider.d.ts +14 -2
  173. package/dist/machines/MachinesProvider.js +35 -1
  174. package/dist/machines/ServerAddedCard.d.ts +31 -0
  175. package/dist/machines/ServerAddedCard.js +72 -0
  176. package/dist/machines/ServerCard.js +91 -215
  177. package/dist/machines/ServerMachinesPanel.d.ts +2 -2
  178. package/dist/machines/ServerMachinesPanel.js +184 -323
  179. package/dist/machines/ServerUpdatePanel.js +51 -40
  180. package/dist/machines/ShareThisComputerForm.d.ts +19 -0
  181. package/dist/machines/ShareThisComputerForm.js +133 -0
  182. package/dist/machines/SyncOutcomeBadge.js +1 -1
  183. package/dist/machines/TokensPanel.d.ts +5 -3
  184. package/dist/machines/TokensPanel.js +98 -78
  185. package/dist/machines/headless/fixture-host.d.ts +19 -3
  186. package/dist/machines/headless/fixture-host.js +43 -6
  187. package/dist/machines/headless/fixtures.js +4 -6
  188. package/dist/machines/headless/host.d.ts +40 -19
  189. package/dist/machines/headless/index.d.ts +3 -3
  190. package/dist/machines/headless/index.js +3 -3
  191. package/dist/machines/headless/labels.d.ts +63 -20
  192. package/dist/machines/headless/labels.js +88 -25
  193. package/dist/machines/headless/messages.js +8 -0
  194. package/dist/machines/headless/stores.d.ts +9 -2
  195. package/dist/machines/headless/stores.js +28 -1
  196. package/dist/machines/index.d.ts +7 -3
  197. package/dist/machines/index.js +8 -4
  198. package/dist/machines/testing/contract.d.ts +15 -3
  199. package/dist/machines/testing/contract.js +68 -14
  200. package/dist/motion/grow.d.ts +8 -1
  201. package/dist/motion/grow.js +10 -4
  202. package/dist/onboarding/headless/labels.d.ts +13 -0
  203. package/dist/onboarding/headless/labels.js +8 -0
  204. package/dist/onboarding/sources/SourceBrowser.js +11 -7
  205. package/dist/onboarding/steps/ImportStep.js +4 -1
  206. package/dist/onboarding/steps/ReadyStep.js +9 -2
  207. package/dist/onboarding/steps/connect/KeyForm.js +6 -2
  208. package/dist/onboarding/steps/connect/ProviderPanel.js +6 -2
  209. package/dist/onboarding/steps/connect/ProviderReady.js +25 -20
  210. package/dist/onboarding/steps/tasks.js +17 -14
  211. package/dist/palette/app-sources.js +1 -1
  212. package/dist/server/sse-handler.js +141 -19
  213. package/dist/session/ArtifactsPanel.js +40 -18
  214. package/dist/session/PlanTracker.js +13 -8
  215. package/dist/session/ProjectHome.js +13 -11
  216. package/dist/session/RemindersPanel.js +35 -17
  217. package/dist/session/RunningWorkDialog.js +6 -2
  218. package/dist/session/SecretsPanel.js +29 -10
  219. package/dist/session/SessionDetailsDialog.d.ts +1 -1
  220. package/dist/session/SessionDetailsDialog.js +18 -10
  221. package/dist/session/SideChat.js +10 -7
  222. package/dist/session/TurnDetailsDialog.js +19 -5
  223. package/dist/session/UsagePanel.js +10 -4
  224. package/dist/session/headless/host.d.ts +2 -0
  225. package/dist/session/headless/index.js +2 -2
  226. package/dist/session/headless/labels.d.ts +19 -1
  227. package/dist/session/headless/labels.js +15 -1
  228. package/dist/session/headless/queue.js +2 -1
  229. package/dist/session/headless/reminder-labels.d.ts +4 -0
  230. package/dist/session/headless/reminder-labels.js +4 -0
  231. package/dist/settings/SettingsRestricted.d.ts +1 -1
  232. package/dist/settings/SettingsRestricted.js +4 -4
  233. package/dist/settings/SettingsShell.d.ts +7 -0
  234. package/dist/settings/SettingsShell.js +6 -1
  235. package/dist/settings/headless/fixture-performance.d.ts +1 -1
  236. package/dist/settings/headless/host.d.ts +2 -2
  237. package/dist/settings/headless/index.js +1 -1
  238. package/dist/settings/headless/labels.d.ts +3 -3
  239. package/dist/settings/headless/labels.js +3 -3
  240. package/dist/settings/headless/performance.d.ts +3 -4
  241. package/dist/settings/headless/search.d.ts +1 -1
  242. package/dist/settings/index.d.ts +2 -1
  243. package/dist/settings/index.js +2 -1
  244. package/dist/settings/sections/appearance/AppearanceSection.js +2 -2
  245. package/dist/settings/sections/claude-import/ClaudeImportDialog.js +1 -1
  246. package/dist/settings/sections/editor/EditorSection.js +8 -5
  247. package/dist/settings/sections/editor/labels.d.ts +1 -0
  248. package/dist/settings/sections/editor/labels.js +1 -0
  249. package/dist/settings/sections/environments/EnvironmentsSection.js +21 -14
  250. package/dist/settings/sections/environments/labels.d.ts +1 -0
  251. package/dist/settings/sections/environments/labels.js +2 -1
  252. package/dist/settings/sections/extensions/ChangeOriginDialog.js +1 -1
  253. package/dist/settings/sections/extensions/CreateExtensionDialog.js +1 -1
  254. package/dist/settings/sections/extensions/ExtensionConfigRows.d.ts +1 -3
  255. package/dist/settings/sections/extensions/ExtensionConfigRows.js +20 -19
  256. package/dist/settings/sections/extensions/ExtensionOptionsSection.js +2 -1
  257. package/dist/settings/sections/extensions/ExtensionsSection.js +1 -1
  258. package/dist/settings/sections/extensions/options-labels.d.ts +2 -1
  259. package/dist/settings/sections/extensions/options-labels.js +2 -1
  260. package/dist/settings/sections/host-catalog/HostCatalogSection.js +1 -1
  261. package/dist/settings/sections/index.d.ts +2 -1
  262. package/dist/settings/sections/index.js +2 -1
  263. package/dist/settings/sections/instructions/InstructionsSection.js +1 -1
  264. package/dist/settings/sections/logs/LogsSection.d.ts +2 -2
  265. package/dist/settings/sections/logs/LogsSection.js +2 -2
  266. package/dist/settings/sections/mcp/McpSection.d.ts +1 -1
  267. package/dist/settings/sections/mcp/McpSection.js +13 -7
  268. package/dist/settings/sections/mcp/McpServerRow.js +21 -14
  269. package/dist/settings/sections/mcp/labels.d.ts +8 -2
  270. package/dist/settings/sections/mcp/labels.js +8 -2
  271. package/dist/settings/sections/models/ModelRows.js +1 -1
  272. package/dist/settings/sections/models/NewChatPlaceRow.d.ts +26 -0
  273. package/dist/settings/sections/models/NewChatPlaceRow.js +78 -0
  274. package/dist/settings/sections/models/SpacesDefaultsSection.js +15 -3
  275. package/dist/settings/sections/models/labels.d.ts +7 -0
  276. package/dist/settings/sections/models/labels.js +7 -0
  277. package/dist/settings/sections/models/model-test.js +7 -4
  278. package/dist/settings/sections/performance/PerformanceSection.js +16 -6
  279. package/dist/settings/sections/performance/labels.d.ts +1 -1
  280. package/dist/settings/sections/performance/labels.js +1 -1
  281. package/dist/settings/sections/providers/ProvidersSection.d.ts +1 -1
  282. package/dist/settings/sections/providers/ProvidersSection.js +15 -8
  283. package/dist/settings/sections/providers/ServerProvidersSection.d.ts +1 -1
  284. package/dist/settings/sections/providers/ServerProvidersSection.js +12 -6
  285. package/dist/settings/sections/providers/labels.d.ts +2 -2
  286. package/dist/settings/sections/providers/labels.js +2 -2
  287. package/dist/settings/sections/shared/catalog.js +1 -1
  288. package/dist/settings/sections/skills/SkillsSection.js +1 -1
  289. package/dist/settings/testing/performance.contract.js +8 -12
  290. package/dist/styles.css +32 -3
  291. package/dist/terminal/HostTerminalSurface.js +17 -7
  292. package/dist/terminal/TerminalPanel.js +30 -17
  293. package/dist/terminal/TerminalSurface.js +11 -4
  294. package/dist/terminal/headless/labels.d.ts +5 -0
  295. package/dist/terminal/headless/labels.js +5 -0
  296. package/dist/terminal/headless/store.d.ts +1 -1
  297. package/dist/terminal/headless/store.js +6 -3
  298. package/dist/workspace/LayoutBudget.d.ts +5 -1
  299. package/dist/workspace/LayoutBudget.js +14 -1
  300. package/dist/workspace/PanelContentView.d.ts +1 -1
  301. package/dist/workspace/PanelContentView.js +17 -6
  302. package/dist/workspace/WorkspaceProvider.js +4 -3
  303. package/dist/workspace/extension-tabs.js +1 -1
  304. package/dist/workspace/headless/index.js +1 -1
  305. package/dist/workspace/headless/labels.d.ts +1 -0
  306. package/dist/workspace/headless/labels.js +1 -0
  307. package/package.json +3 -3
  308. package/src/styles/motion.css +8 -0
  309. package/src/styles/primitives.css +7 -0
@@ -1,6 +1,6 @@
1
1
  import { SessionPresence } from "./headless/presence.js";
2
2
  import { MachinesLabels } from "./headless/labels.js";
3
- import { MachinesAction, MachinesHost } from "./headless/host.js";
3
+ import { MachineInfo, MachinesAction, MachinesHost } from "./headless/host.js";
4
4
  import { ConfirmOptions } from "../components/ConfirmDialog.js";
5
5
  import { ReactNode } from "react";
6
6
  //#region src/machines/MachinesProvider.d.ts
@@ -23,6 +23,11 @@ interface MachinesProviderProps {
23
23
  * @param props - Provider props: the `host`, optional `labels` and `confirm`, and the `children` to render.
24
24
  */
25
25
  declare function MachinesProvider({ host, labels, confirm, children }: MachinesProviderProps): import("react").JSX.Element;
26
+ /**
27
+ * Wraps a subtree rendered elsewhere (a modal layer, mounted above the providers) in this provider's host,
28
+ * confirm and labels, so it reads what the place that opened it reads.
29
+ */
30
+ declare function useMachinesBridge(): (node: ReactNode) => ReactNode;
26
31
  /** Returns the {@link MachinesHost} from the nearest {@link MachinesProvider}, or an empty host outside one. */
27
32
  declare function useMachinesHost(): MachinesHost;
28
33
  /** Returns how the machines components ask before a destructive action. */
@@ -42,6 +47,13 @@ declare function usePermitted(action: MachinesAction): boolean;
42
47
  * @param enabled - Whether to listen (the app has servers and shows a picker).
43
48
  */
44
49
  declare function useLentServers(enabled: boolean): ReadonlySet<string>;
50
+ /**
51
+ * The machines of each of `hostIds`, by host id, kept current (a machine that joins or leaves shows at once).
52
+ * Empty without the host's `machines`, or when the token cannot list them.
53
+ *
54
+ * @param hostIds - The servers to list.
55
+ */
56
+ declare function useServerMachines(hostIds: readonly string[]): ReadonlyMap<string, readonly MachineInfo[]>;
45
57
  /** The names of the machines last heard online, from every host; empty without the host's `machines`. */
46
58
  declare function useOnlineMachines(): ReadonlySet<string>;
47
59
  /** Every live session's presence, by session id (list-level decisions: ordering, counts); empty without `presence`. */
@@ -53,4 +65,4 @@ declare function usePresenceMap(): ReadonlyMap<string, SessionPresence>;
53
65
  */
54
66
  declare function useSessionPresence(sessionId: string | null): SessionPresence | null;
55
67
  //#endregion
56
- export { MachinesConfirm, MachinesProvider, MachinesProviderProps, useLentServers, useMachinesConfirm, useMachinesHost, useMachinesLabels, useOnlineMachines, usePermitted, usePresenceMap, useSessionPresence };
68
+ export { MachinesConfirm, MachinesProvider, MachinesProviderProps, useLentServers, useMachinesBridge, useMachinesConfirm, useMachinesHost, useMachinesLabels, useOnlineMachines, usePermitted, usePresenceMap, useServerMachines, useSessionPresence };
@@ -3,6 +3,7 @@ import { ConfirmDialog } from "../components/ConfirmDialog.js";
3
3
  import { Overlay } from "../components/Overlay.js";
4
4
  import { constant, useReadable } from "../chat/headless/store.js";
5
5
  import { isPermitted } from "./headless/host.js";
6
+ import { machinesByHost } from "./headless/stores.js";
6
7
  import { DEFAULT_MACHINES_LABELS } from "./headless/labels.js";
7
8
  import { jsx, jsxs } from "react/jsx-runtime";
8
9
  import { createContext, useCallback, useContext, useMemo, useState } from "react";
@@ -71,6 +72,21 @@ function MachinesProvider({ host, labels, confirm, children }) {
71
72
  })
72
73
  });
73
74
  }
75
+ /**
76
+ * Wraps a subtree rendered elsewhere (a modal layer, mounted above the providers) in this provider's host,
77
+ * confirm and labels, so it reads what the place that opened it reads.
78
+ */
79
+ function useMachinesBridge() {
80
+ const value = useContext(MachinesContext);
81
+ const labels = useMachinesLabels();
82
+ return useCallback((node) => /* @__PURE__ */ jsx(MachinesContext.Provider, {
83
+ value,
84
+ children: /* @__PURE__ */ jsx(LabelsProvider, {
85
+ labels,
86
+ children: node
87
+ })
88
+ }), [value, labels]);
89
+ }
74
90
  /** Returns the {@link MachinesHost} from the nearest {@link MachinesProvider}, or an empty host outside one. */
75
91
  function useMachinesHost() {
76
92
  return useContext(MachinesContext).host;
@@ -111,6 +127,24 @@ function useLentServers(enabled) {
111
127
  const value = useReadable(enabled && links ? links.state : NO_LINKS);
112
128
  return useMemo(() => value ? lentServerMachines(value) : NO_NAMES, [value]);
113
129
  }
130
+ const NO_SERVER_MACHINES = constant(/* @__PURE__ */ new Map());
131
+ /**
132
+ * The machines of each of `hostIds`, by host id, kept current (a machine that joins or leaves shows at once).
133
+ * Empty without the host's `machines`, or when the token cannot list them.
134
+ *
135
+ * @param hostIds - The servers to list.
136
+ */
137
+ function useServerMachines(hostIds) {
138
+ const machines = useMachinesHost().machines;
139
+ const canList = usePermitted("machines.list");
140
+ const key = hostIds.join("\n");
141
+ const store = useMemo(() => machines && canList && key ? machinesByHost(key.split("\n").map((hostId) => [hostId, machines.list(hostId).state])) : NO_SERVER_MACHINES, [
142
+ machines,
143
+ canList,
144
+ key
145
+ ]);
146
+ return useReadable(store);
147
+ }
114
148
  /** The names of the machines last heard online, from every host; empty without the host's `machines`. */
115
149
  function useOnlineMachines() {
116
150
  const machines = useMachinesHost().machines;
@@ -134,4 +168,4 @@ function useSessionPresence(sessionId) {
134
168
  return useReadable(presence && sessionId ? presence.session(sessionId) : NO_PRESENCE);
135
169
  }
136
170
  //#endregion
137
- export { MachinesProvider, useLentServers, useMachinesConfirm, useMachinesHost, useMachinesLabels, useOnlineMachines, usePermitted, usePresenceMap, useSessionPresence };
171
+ export { MachinesProvider, useLentServers, useMachinesBridge, useMachinesConfirm, useMachinesHost, useMachinesLabels, useOnlineMachines, usePermitted, usePresenceMap, useServerMachines, useSessionPresence };
@@ -0,0 +1,31 @@
1
+ import { HostSummary } from "./headless/host.js";
2
+ import { CSSProperties } from "react";
3
+ //#region src/machines/ServerAddedCard.d.ts
4
+ /** Where new chats start, as the app holds it: which server they start on, and how to change it. */
5
+ interface NewChatsServer {
6
+ /** The server new chats start on now; `null`: this computer (or a place not on a server). */
7
+ hostId: string | null;
8
+ /** Makes `host` where new chats start (`on`), or puts them back on this computer. */
9
+ set: (host: HostSummary, on: boolean) => void;
10
+ }
11
+ /** Props for {@link ServerAddedCard}. */
12
+ interface ServerAddedCardProps {
13
+ /** The server just added. */
14
+ host: HostSummary;
15
+ /** Where new chats start. Absent: no switch. */
16
+ newChats?: NewChatsServer;
17
+ /** Closes the card. */
18
+ onDone: () => void;
19
+ /** Extra classes on the root. */
20
+ className?: string;
21
+ /** Inline styles on the root. */
22
+ style?: CSSProperties;
23
+ }
24
+ /**
25
+ * Renders what to do with a server just added.
26
+ *
27
+ * @param props - The server, where new chats start, and Done.
28
+ */
29
+ declare function ServerAddedCard({ host, newChats, onDone, className, style }: ServerAddedCardProps): import("react").JSX.Element;
30
+ //#endregion
31
+ export { NewChatsServer, ServerAddedCard, ServerAddedCardProps };
@@ -0,0 +1,72 @@
1
+ import { BTN_SECONDARY } from "../components/button.js";
2
+ import { Tray } from "../components/Surface.js";
3
+ import { SwitchRow } from "../components/Form.js";
4
+ import { useMachinesHost, useMachinesLabels } from "./MachinesProvider.js";
5
+ import { useAddMachine } from "./AddMachineDialog.js";
6
+ import { MachinesExplainer } from "./MachinesExplainer.js";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ //#region src/machines/ServerAddedCard.tsx
9
+ /**
10
+ * Renders what to do with a server just added.
11
+ *
12
+ * @param props - The server, where new chats start, and Done.
13
+ */
14
+ function ServerAddedCard({ host, newChats, onDone, className = "", style }) {
15
+ const labels = useMachinesLabels();
16
+ const { links } = useMachinesHost();
17
+ const openAdd = useAddMachine();
18
+ const canShare = Boolean(openAdd && links?.shareStart);
19
+ const onNewChats = newChats?.hostId === host.id;
20
+ return /* @__PURE__ */ jsxs(Tray, {
21
+ radius: "xl",
22
+ className: `p-4 space-y-3 ${className}`.trimEnd(),
23
+ style,
24
+ "data-testid": "server-added",
25
+ children: [
26
+ /* @__PURE__ */ jsxs("div", {
27
+ className: "space-y-1",
28
+ children: [/* @__PURE__ */ jsx("div", {
29
+ className: "text-sm font-medium text-[var(--zg-text)]",
30
+ children: labels.machinesAddedTitle(host.name)
31
+ }), /* @__PURE__ */ jsx(MachinesExplainer, { className: "pt-2" })]
32
+ }),
33
+ /* @__PURE__ */ jsxs("div", {
34
+ className: "space-y-1",
35
+ children: [newChats && /* @__PURE__ */ jsx(SwitchRow, {
36
+ label: labels.machinesAddedNewChats(host.name),
37
+ description: labels.machinesAddedNewChatsHint,
38
+ on: onNewChats,
39
+ onToggle: () => newChats.set(host, !onNewChats)
40
+ }), canShare && /* @__PURE__ */ jsxs("div", {
41
+ className: "flex items-center gap-3 px-1 py-1.5",
42
+ children: [/* @__PURE__ */ jsxs("div", {
43
+ className: "flex-1 min-w-0",
44
+ children: [/* @__PURE__ */ jsx("div", {
45
+ className: "text-sm text-[var(--zg-text)]",
46
+ children: labels.machinesAddedShare(host.name)
47
+ }), /* @__PURE__ */ jsx("div", {
48
+ className: "text-xs text-[var(--zg-text-muted)]",
49
+ children: labels.machinesAddedShareHint
50
+ })]
51
+ }), /* @__PURE__ */ jsx("button", {
52
+ type: "button",
53
+ className: BTN_SECONDARY,
54
+ onClick: () => openAdd?.(host.id, { tab: "this" }),
55
+ children: labels.machinesShareOpen
56
+ })]
57
+ })]
58
+ }),
59
+ /* @__PURE__ */ jsx("div", {
60
+ className: "flex justify-end",
61
+ children: /* @__PURE__ */ jsx("button", {
62
+ type: "button",
63
+ className: BTN_SECONDARY,
64
+ onClick: onDone,
65
+ children: labels.machinesInviteDone
66
+ })
67
+ })
68
+ ]
69
+ });
70
+ }
71
+ //#endregion
72
+ export { ServerAddedCard };
@@ -1,6 +1,5 @@
1
1
  import { IconButton } from "../components/IconButton.js";
2
2
  import { BTN_PRIMARY, BTN_SECONDARY } from "../components/button.js";
3
- import { CopyButton } from "../components/CopyButton.js";
4
3
  import { FormCard, INPUT_CLASS, MetaChip, OpLine } from "../components/Form.js";
5
4
  import { RowActionsMenu } from "../components/RowActionsMenu.js";
6
5
  import { machinesError } from "./headless/host.js";
@@ -19,13 +18,6 @@ import { useEffect, useRef, useState } from "react";
19
18
  * a new URL keeps the saved token and is saved once the same server answers
20
19
  * there) and Remove (asks first). What an action answers shows under the
21
20
  * card, as does the last connect's error.
22
- *
23
- * A chip says what this app's token may do there. With a chat token, Get
24
- * admin shows the server's own command for an admin token (its binary, user
25
- * and data dir, from the hello) and, where the app can save one
26
- * (`addHost`), a field to paste it: the saved server keeps its URL and
27
- * reconnects with it. Without `addHost` (the web app's own server) the
28
- * command is the pairing one.
29
21
  */
30
22
  /** The desktop app's `hosts:*` limits, mirrored so a field can't take more than it accepts. */
31
23
  const HOST_NAME_MAX = 200;
@@ -92,9 +84,8 @@ function ServerCard({ host, saved = host, onChanged, badge, confirm, now, classN
92
84
  const [busy, setBusy] = useState(null);
93
85
  const [line, setLine] = useState(null);
94
86
  const [menuOpen, setMenuOpen] = useState(false);
95
- const [getAdmin, setGetAdmin] = useState(false);
96
87
  const menuButtonRef = useRef(null);
97
- const { testHost, renameHost, setHostUrl, removeHost, addHost } = machines;
88
+ const { testHost, renameHost, setHostUrl, removeHost } = machines;
98
89
  const changed = async () => {
99
90
  await onChanged?.();
100
91
  };
@@ -205,221 +196,106 @@ function ServerCard({ host, saved = host, onChanged, badge, confirm, now, classN
205
196
  "data-testid": `host-${host.id}`,
206
197
  ...className ? { className } : {},
207
198
  ...style ? { style } : {},
208
- children: [
209
- /* @__PURE__ */ jsxs("div", {
210
- className: "flex items-start gap-3 px-4 py-3.5",
211
- children: [/* @__PURE__ */ jsx("span", {
212
- "aria-hidden": true,
213
- className: HOST_CARD_ICON_CLASS,
214
- children: /* @__PURE__ */ jsx("span", { className: "i-ph-hard-drives" })
215
- }), editing ? /* @__PURE__ */ jsxs("form", {
216
- className: "flex-1 flex items-center gap-2",
217
- onSubmit: (event) => {
218
- event.preventDefault();
219
- save();
220
- },
221
- onKeyDown: escapeCancels(stopEditing),
222
- children: [
223
- /* @__PURE__ */ jsx("input", {
224
- "aria-label": editing === "name" ? labels.machinesHostName : labels.machinesServerUrl,
225
- className: INPUT_CLASS,
226
- value: draft,
227
- maxLength: editing === "name" ? 200 : HOST_URL_MAX,
228
- autoFocus: true,
229
- spellCheck: false,
230
- onChange: (event) => setDraft(event.target.value)
231
- }),
232
- /* @__PURE__ */ jsx("button", {
233
- type: "submit",
234
- className: BTN_PRIMARY,
235
- disabled: busy !== null || !draft.trim(),
236
- children: busy && editing === "url" ? busy : labels.machinesSave
237
- }),
238
- /* @__PURE__ */ jsx("button", {
239
- type: "button",
240
- className: BTN_SECONDARY,
241
- onClick: stopEditing,
242
- children: labels.machinesCancel
243
- })
244
- ]
245
- }) : /* @__PURE__ */ jsxs("div", {
246
- className: "flex-1 min-w-0 flex flex-col gap-2.5",
247
- children: [
248
- /* @__PURE__ */ jsxs("div", {
249
- className: "flex flex-wrap items-center gap-3 min-h-7",
250
- children: [/* @__PURE__ */ jsxs("span", {
251
- className: "flex-1 basis-40 min-w-0 inline-flex items-center gap-2",
252
- children: [
253
- /* @__PURE__ */ jsx("span", {
254
- className: "truncate text-sm font-medium text-[var(--zg-text)]",
255
- children: host.name
256
- }),
257
- /* @__PURE__ */ jsx(HostStatusDot, { host }),
258
- host.status !== "connected" && /* @__PURE__ */ jsx(MetaChip, {
259
- tone: hostStatusTone(host),
260
- children: hostStatusText(host, labels)
261
- }),
262
- host.scope && /* @__PURE__ */ jsx(MetaChip, { children: labels.machinesAccess(host.scope) }),
263
- badge
264
- ]
265
- }), (testHost || menuItems.length > 0 || host.scope === "chat") && /* @__PURE__ */ jsxs("span", {
266
- className: "flex items-center gap-1 shrink-0",
267
- children: [
268
- host.scope === "chat" && /* @__PURE__ */ jsx("button", {
269
- type: "button",
270
- className: BTN_SECONDARY,
271
- "aria-expanded": getAdmin,
272
- onClick: () => setGetAdmin((open) => !open),
273
- children: labels.machinesGetAdmin
274
- }),
275
- testHost && /* @__PURE__ */ jsx("button", {
276
- type: "button",
277
- className: BTN_SECONDARY,
278
- onClick: () => void test(),
279
- disabled: busy !== null,
280
- children: busy === labels.machinesTesting ? labels.machinesTesting : labels.machinesTest
281
- }),
282
- menuItems.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(IconButton, {
283
- ref: menuButtonRef,
284
- icon: "i-ph-dots-three",
285
- label: labels.machinesHostActions(host.name),
286
- "aria-haspopup": "menu",
287
- "aria-expanded": menuOpen,
288
- active: menuOpen,
289
- disabled: busy !== null,
290
- onClick: () => setMenuOpen((open) => !open)
291
- }), /* @__PURE__ */ jsx(RowActionsMenu, {
292
- open: menuOpen,
293
- anchorRef: menuButtonRef,
294
- onClose: () => setMenuOpen(false),
295
- items: menuItems
296
- })] })
297
- ]
298
- })]
299
- }),
300
- host.url && /* @__PURE__ */ jsx(CopyText, {
301
- text: host.url,
302
- field: true
303
- }),
304
- facts.length > 0 && /* @__PURE__ */ jsx("div", {
305
- className: "flex flex-wrap items-center gap-1.5",
306
- children: facts.map((fact) => /* @__PURE__ */ jsx(MetaChip, { children: fact }, fact))
307
- })
308
- ]
309
- })]
310
- }),
311
- getAdmin && host.scope === "chat" && /* @__PURE__ */ jsx(GetAdmin, {
312
- host,
313
- ...addHost && host.url ? { save: (token) => addHost({
314
- url: host.url,
315
- token,
316
- name: host.name
317
- }) } : {},
318
- onSaved: async () => {
319
- setGetAdmin(false);
320
- setLine({
321
- kind: "notice",
322
- text: labels.machinesGetAdminSaved
323
- });
324
- await changed();
325
- }
326
- }),
327
- (line || host.error && host.status !== "connected") && /* @__PURE__ */ jsxs("div", {
328
- className: "pl-14 pr-4 pb-3.5 space-y-2",
329
- children: [line && /* @__PURE__ */ jsx(OpLine, {
330
- kind: line.kind,
331
- children: line.text
332
- }), !line && host.error && host.status !== "connected" && /* @__PURE__ */ jsx(OpLine, {
333
- kind: "error",
334
- children: host.error
335
- })]
336
- })
337
- ]
338
- });
339
- }
340
- /** The server's command for an admin token, and a field to use the token it prints (when the app can save one). */
341
- function GetAdmin({ host, save, onSaved }) {
342
- const labels = useMachinesLabels();
343
- const [token, setToken] = useState("");
344
- const [busy, setBusy] = useState(false);
345
- const [error, setError] = useState(null);
346
- const command = save ? host.adminCommands?.token ?? "zidane server token create --name <device> --scope admin" : host.adminCommands?.pair ?? "zidane server pair --scope admin";
347
- const submit = async () => {
348
- if (!save) return;
349
- setBusy(true);
350
- setError(null);
351
- const result = await save(token.trim()).catch((err) => ({
352
- ok: false,
353
- error: "unknown",
354
- message: labels.machinesError(machinesError("update", err))
355
- }));
356
- setBusy(false);
357
- if (!result.ok) {
358
- setError(hostCheckMessage(result, labels));
359
- return;
360
- }
361
- setToken("");
362
- await onSaved();
363
- };
364
- return /* @__PURE__ */ jsxs("div", {
365
- className: "pl-14 pr-4 pb-3.5 space-y-2",
366
- "data-testid": `get-admin-${host.id}`,
367
- children: [
368
- /* @__PURE__ */ jsx("p", {
369
- className: "m-0 text-xs text-[var(--zg-text-muted)]",
370
- children: labels.machinesGetAdminRun
371
- }),
372
- /* @__PURE__ */ jsxs("div", {
373
- className: "zg-well flex items-center gap-2 rounded-zg-md px-2.5 py-1.5",
374
- children: [/* @__PURE__ */ jsx("code", {
375
- className: "flex-1 min-w-0 break-all font-mono text-xs text-[var(--zg-text)]",
376
- children: command
377
- }), /* @__PURE__ */ jsx(CopyButton, {
378
- text: command,
379
- label: labels.machinesGetAdminCopy
380
- })]
381
- }),
382
- save ? /* @__PURE__ */ jsxs("form", {
383
- className: "space-y-2",
199
+ children: [/* @__PURE__ */ jsxs("div", {
200
+ className: "flex items-start gap-3 px-4 py-3.5",
201
+ children: [/* @__PURE__ */ jsx("span", {
202
+ "aria-hidden": true,
203
+ className: HOST_CARD_ICON_CLASS,
204
+ children: /* @__PURE__ */ jsx("span", { className: "i-ph-hard-drives" })
205
+ }), editing ? /* @__PURE__ */ jsxs("form", {
206
+ className: "flex-1 flex items-center gap-2",
384
207
  onSubmit: (event) => {
385
208
  event.preventDefault();
386
- submit();
209
+ save();
387
210
  },
211
+ onKeyDown: escapeCancels(stopEditing),
388
212
  children: [
389
- /* @__PURE__ */ jsx("label", {
390
- className: "block text-xs text-[var(--zg-text-muted)]",
391
- htmlFor: `get-admin-token-${host.id}`,
392
- children: labels.machinesGetAdminToken
213
+ /* @__PURE__ */ jsx("input", {
214
+ "aria-label": editing === "name" ? labels.machinesHostName : labels.machinesServerUrl,
215
+ className: INPUT_CLASS,
216
+ value: draft,
217
+ maxLength: editing === "name" ? 200 : HOST_URL_MAX,
218
+ autoFocus: true,
219
+ spellCheck: false,
220
+ onChange: (event) => setDraft(event.target.value)
393
221
  }),
222
+ /* @__PURE__ */ jsx("button", {
223
+ type: "submit",
224
+ className: BTN_PRIMARY,
225
+ disabled: busy !== null || !draft.trim(),
226
+ children: busy && editing === "url" ? busy : labels.machinesSave
227
+ }),
228
+ /* @__PURE__ */ jsx("button", {
229
+ type: "button",
230
+ className: BTN_SECONDARY,
231
+ onClick: stopEditing,
232
+ children: labels.machinesCancel
233
+ })
234
+ ]
235
+ }) : /* @__PURE__ */ jsxs("div", {
236
+ className: "flex-1 min-w-0 flex flex-col gap-2.5",
237
+ children: [
394
238
  /* @__PURE__ */ jsxs("div", {
395
- className: "flex items-center gap-2",
396
- children: [/* @__PURE__ */ jsx("input", {
397
- id: `get-admin-token-${host.id}`,
398
- "aria-label": labels.machinesGetAdminTokenField,
399
- className: INPUT_CLASS,
400
- type: "password",
401
- autoComplete: "off",
402
- spellCheck: false,
403
- value: token,
404
- maxLength: HOST_TOKEN_MAX,
405
- onChange: (event) => setToken(event.target.value)
406
- }), /* @__PURE__ */ jsx("button", {
407
- type: "submit",
408
- className: BTN_PRIMARY,
409
- disabled: busy || !token.trim(),
410
- children: busy ? labels.machinesGetAdminSaving : labels.machinesGetAdminSave
239
+ className: "flex flex-wrap items-center gap-3 min-h-7",
240
+ children: [/* @__PURE__ */ jsxs("span", {
241
+ className: "flex-1 basis-40 min-w-0 inline-flex items-center gap-2",
242
+ children: [
243
+ /* @__PURE__ */ jsx("span", {
244
+ className: "truncate text-sm font-medium text-[var(--zg-text)]",
245
+ children: host.name
246
+ }),
247
+ /* @__PURE__ */ jsx(HostStatusDot, { host }),
248
+ host.status !== "connected" && /* @__PURE__ */ jsx(MetaChip, {
249
+ tone: hostStatusTone(host),
250
+ children: hostStatusText(host, labels)
251
+ }),
252
+ badge
253
+ ]
254
+ }), (testHost || menuItems.length > 0) && /* @__PURE__ */ jsxs("span", {
255
+ className: "flex items-center gap-1 shrink-0",
256
+ children: [testHost && /* @__PURE__ */ jsx("button", {
257
+ type: "button",
258
+ className: BTN_SECONDARY,
259
+ onClick: () => void test(),
260
+ disabled: busy !== null,
261
+ children: busy === labels.machinesTesting ? labels.machinesTesting : labels.machinesTest
262
+ }), menuItems.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(IconButton, {
263
+ ref: menuButtonRef,
264
+ icon: "i-ph-dots-three",
265
+ label: labels.machinesHostActions(host.name),
266
+ "aria-haspopup": "menu",
267
+ "aria-expanded": menuOpen,
268
+ active: menuOpen,
269
+ disabled: busy !== null,
270
+ onClick: () => setMenuOpen((open) => !open)
271
+ }), /* @__PURE__ */ jsx(RowActionsMenu, {
272
+ open: menuOpen,
273
+ anchorRef: menuButtonRef,
274
+ onClose: () => setMenuOpen(false),
275
+ items: menuItems
276
+ })] })]
411
277
  })]
412
278
  }),
413
- error && /* @__PURE__ */ jsx(OpLine, {
414
- kind: "error",
415
- children: error
279
+ host.url && /* @__PURE__ */ jsx(CopyText, {
280
+ text: host.url,
281
+ field: true
282
+ }),
283
+ facts.length > 0 && /* @__PURE__ */ jsx("div", {
284
+ className: "flex flex-wrap items-center gap-1.5",
285
+ children: facts.map((fact) => /* @__PURE__ */ jsx(MetaChip, { children: fact }, fact))
416
286
  })
417
287
  ]
418
- }) : /* @__PURE__ */ jsx("p", {
419
- className: "m-0 text-xs text-[var(--zg-text-muted)]",
420
- children: labels.machinesGetAdminPairNext
421
- })
422
- ]
288
+ })]
289
+ }), (line || host.error && host.status !== "connected") && /* @__PURE__ */ jsxs("div", {
290
+ className: "pl-14 pr-4 pb-3.5 space-y-2",
291
+ children: [line && /* @__PURE__ */ jsx(OpLine, {
292
+ kind: line.kind,
293
+ children: line.text
294
+ }), !line && host.error && host.status !== "connected" && /* @__PURE__ */ jsx(OpLine, {
295
+ kind: "error",
296
+ children: host.error
297
+ })]
298
+ })]
423
299
  });
424
300
  }
425
301
  //#endregion
@@ -16,9 +16,9 @@ interface ServerMachinesPanelProps {
16
16
  style?: CSSProperties;
17
17
  }
18
18
  /**
19
- * Renders a server's machine links and machines.
19
+ * Renders a server's machine links, where work runs on it, and Add a machine.
20
20
  *
21
- * @param props - The server, `confirm`, `className` and `style`.
21
+ * @param props - The server, `confirm`, `now`, `className` and `style`.
22
22
  */
23
23
  declare function ServerMachinesPanel({ host, confirm, now, className, style }: ServerMachinesPanelProps): import("react").JSX.Element;
24
24
  //#endregion