zidane-ui 9.1.13 → 9.1.16
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.
- package/dist/adapters/index.d.ts +2 -2
- package/dist/adapters/index.js +2 -2
- package/dist/adapters/live.d.ts +29 -3
- package/dist/adapters/live.js +9 -1
- package/dist/adapters/server-composer-host.js +17 -2
- package/dist/adapters/server-extensions-host.d.ts +0 -1
- package/dist/adapters/server-extensions-host.js +4 -15
- package/dist/adapters/server-git-host.js +7 -16
- package/dist/adapters/server-host.js +181 -43
- package/dist/adapters/server-machines-host.d.ts +2 -0
- package/dist/adapters/server-machines-host.js +22 -23
- package/dist/adapters/server-onboarding-host.d.ts +1 -1
- package/dist/adapters/server-onboarding-host.js +3 -4
- package/dist/adapters/server-session-host.js +22 -3
- package/dist/adapters/server-settings-accounts.js +2 -2
- package/dist/adapters/server-settings-host.js +2 -2
- package/dist/adapters/server-settings-performance.js +7 -9
- package/dist/adapters/server-settings-sections.js +13 -14
- package/dist/adapters/server-sidebar-host.js +2 -2
- package/dist/adapters/sse-host.js +68 -3
- package/dist/adapters/sse-protocol.d.ts +12 -2
- package/dist/adapters/sse-protocol.js +4 -2
- package/dist/app/AppHostProvider.js +4 -3
- package/dist/app/ModalProvider.d.ts +13 -3
- package/dist/app/ModalProvider.js +103 -24
- package/dist/app/NoticeStack.d.ts +33 -0
- package/dist/app/NoticeStack.js +90 -0
- package/dist/app/index.d.ts +3 -2
- package/dist/app/index.js +3 -2
- package/dist/chat/SessionFilterMenu.d.ts +1 -1
- package/dist/chat/SessionFilterMenu.js +2 -1
- package/dist/chat/composer/Composer.js +10 -8
- package/dist/chat/composer/ModelChainList.js +17 -8
- package/dist/chat/composer/ModelChainTooltip.js +5 -2
- package/dist/chat/composer/use-draft-target.d.ts +20 -1
- package/dist/chat/composer/use-draft-target.js +121 -5
- package/dist/chat/composer/use-new-session-defaults.d.ts +5 -1
- package/dist/chat/composer/use-new-session-defaults.js +17 -4
- package/dist/chat/headless/chip-labels.d.ts +1 -0
- package/dist/chat/headless/chip-labels.js +1 -0
- package/dist/chat/headless/composer/labels-editor.d.ts +0 -2
- package/dist/chat/headless/composer/labels-editor.js +0 -2
- package/dist/chat/headless/draft-target.d.ts +21 -1
- package/dist/chat/headless/fixture-host.js +17 -2
- package/dist/chat/headless/host.d.ts +3 -3
- package/dist/chat/headless/index.d.ts +9 -9
- package/dist/chat/headless/index.js +2 -2
- package/dist/chat/headless/labels.d.ts +13 -6
- package/dist/chat/headless/labels.js +10 -9
- package/dist/chat/headless/session-list.d.ts +20 -8
- package/dist/chat/headless/session-list.js +1 -0
- package/dist/chat/headless/sidebar/directory.d.ts +56 -14
- package/dist/chat/headless/sidebar/directory.js +149 -70
- package/dist/chat/headless/sidebar/index.d.ts +3 -3
- package/dist/chat/headless/sidebar/index.js +2 -2
- package/dist/chat/headless/sidebar/labels.d.ts +15 -8
- package/dist/chat/headless/sidebar/types.d.ts +3 -1
- package/dist/chat/headless/sidebar/view.d.ts +13 -5
- package/dist/chat/headless/sidebar/view.js +31 -11
- package/dist/chat/headless/streams/actions.d.ts +5 -3
- package/dist/chat/headless/streams/actions.js +3 -2
- package/dist/chat/headless/streams/index.d.ts +3 -3
- package/dist/chat/headless/streams/merge.d.ts +6 -10
- package/dist/chat/headless/streams/merge.js +7 -21
- package/dist/chat/headless/streams/session-streams.d.ts +29 -4
- package/dist/chat/headless/streams/session-streams.js +86 -0
- package/dist/chat/headless/streams/store.d.ts +162 -16
- package/dist/chat/headless/streams/store.js +334 -38
- package/dist/chat/headless/streams/types.d.ts +10 -7
- package/dist/chat/headless/transcript-labels.d.ts +1 -0
- package/dist/chat/interactions/PlanCard.js +10 -3
- package/dist/chat/interactions/QuestionForm.js +7 -3
- package/dist/chat/interactions/card-ui.d.ts +5 -3
- package/dist/chat/interactions/card-ui.js +9 -7
- package/dist/chat/rich-composer/RichComposer.js +1 -7
- package/dist/chat/rich-composer/composer-extensions.d.ts +0 -2
- package/dist/chat/rich-composer/composer-extensions.js +2 -2
- package/dist/chat/rich-composer/use-composer-editor.d.ts +0 -2
- package/dist/chat/rich-composer/use-composer-editor.js +1 -2
- package/dist/chat/sidebar/SessionSidebar.js +5 -5
- package/dist/chat/sidebar/SidebarFilterMenu.js +3 -1
- package/dist/chat/sidebar/SidebarFrame.d.ts +4 -0
- package/dist/chat/sidebar/SidebarFrame.js +27 -9
- package/dist/chat/sidebar/SidebarGroupHeader.js +1 -1
- package/dist/chat/sidebar/SidebarHostProvider.d.ts +8 -5
- package/dist/chat/sidebar/SidebarHostProvider.js +13 -9
- package/dist/chat/sidebar/SidebarToggleButton.js +7 -3
- package/dist/chat/sidebar/index.d.ts +2 -2
- package/dist/chat/sidebar/session-menu.js +4 -4
- package/dist/chat/sidebar/useSaveViewAsSpace.js +2 -2
- package/dist/chat/testing/contract.js +2 -2
- package/dist/chat/transcript/AuthFailureCard.js +11 -8
- package/dist/chat/transcript/BadgeMenu.js +13 -2
- package/dist/chat/transcript/MermaidDiagram.js +7 -3
- package/dist/chat/transcript/fold.d.ts +4 -0
- package/dist/chat/transcript/fold.js +53 -22
- package/dist/chat/transcript/script-input.d.ts +1 -1
- package/dist/chat/transcript/shell-block.js +7 -3
- package/dist/chat/transcript/useStickToBottom.js +12 -0
- package/dist/components/BrowserSignIn.js +23 -21
- package/dist/components/Form.d.ts +6 -4
- package/dist/components/Form.js +16 -8
- package/dist/components/LoadError.d.ts +4 -2
- package/dist/components/LoadError.js +13 -9
- package/dist/components/Notice.d.ts +29 -0
- package/dist/components/Notice.js +63 -0
- package/dist/components/PanelEmpty.d.ts +1 -1
- package/dist/components/PanelEmpty.js +4 -2
- package/dist/components/Restricted.d.ts +1 -1
- package/dist/components/palette/PaletteList.js +8 -1
- package/dist/components/palette/PalettePanel.js +14 -6
- package/dist/core.css +24 -5
- package/dist/dist/{index-Bq87OcGy.d.ts → index-BZM8tu4L.d.ts} +28 -3
- package/dist/dist/index.d.ts +2 -2
- package/dist/dist/{timeout-B5pO5I5a.d.ts → timeout-Cyx3VGPz.d.ts} +1 -1
- package/dist/extensions/ExtensionSettingsPage.js +1 -4
- package/dist/extensions/ExtensionSettingsSection.js +4 -3
- package/dist/extensions/ExtensionSettingsSidebar.js +2 -6
- package/dist/extensions/SettingsWireForm.d.ts +1 -7
- package/dist/extensions/SettingsWireForm.js +7 -5
- package/dist/extensions/headless/fixture-host.d.ts +1 -5
- package/dist/extensions/headless/fixture-host.js +1 -4
- package/dist/extensions/headless/host.d.ts +1 -11
- package/dist/extensions/headless/index.d.ts +3 -3
- package/dist/extensions/headless/index.js +2 -2
- package/dist/extensions/headless/select.d.ts +1 -11
- package/dist/extensions/headless/select.js +1 -18
- package/dist/files/EditorColumn.js +12 -1
- package/dist/files/TreeColumn.js +13 -20
- package/dist/files/useOpenFiles.js +2 -0
- package/dist/git/BranchMenu.js +5 -3
- package/dist/git/ImportRepoDialog.js +18 -9
- package/dist/git/MoveSessionDialog.js +15 -7
- package/dist/git/RemoteFolderPicker.js +34 -16
- package/dist/git/SyncChip.js +17 -17
- package/dist/git/WherePicker.d.ts +16 -1
- package/dist/git/WherePicker.js +80 -36
- package/dist/git/headless/environment.d.ts +33 -3
- package/dist/git/headless/environment.js +33 -5
- package/dist/git/headless/index.d.ts +2 -2
- package/dist/git/headless/index.js +2 -2
- package/dist/git/headless/labels.d.ts +15 -2
- package/dist/git/headless/labels.js +17 -4
- package/dist/git/useEnvironmentChoices.d.ts +3 -1
- package/dist/git/useEnvironmentChoices.js +6 -3
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/labels.d.ts +5 -0
- package/dist/labels.js +5 -0
- package/dist/machines/AddMachineDialog.d.ts +34 -0
- package/dist/machines/AddMachineDialog.js +464 -0
- package/dist/machines/Banners.d.ts +33 -4
- package/dist/machines/Banners.js +64 -3
- package/dist/machines/DaemonMenu.js +27 -4
- package/dist/machines/HostCapabilities.d.ts +1 -3
- package/dist/machines/HostCapabilities.js +24 -45
- package/dist/machines/HostSyncPanel.js +123 -129
- package/dist/machines/HostsSection.d.ts +4 -1
- package/dist/machines/HostsSection.js +30 -7
- package/dist/machines/MachinesExplainer.d.ts +17 -0
- package/dist/machines/MachinesExplainer.js +71 -0
- package/dist/machines/MachinesProvider.d.ts +14 -2
- package/dist/machines/MachinesProvider.js +35 -1
- package/dist/machines/ServerAddedCard.d.ts +31 -0
- package/dist/machines/ServerAddedCard.js +72 -0
- package/dist/machines/ServerCard.js +91 -215
- package/dist/machines/ServerMachinesPanel.d.ts +2 -2
- package/dist/machines/ServerMachinesPanel.js +184 -323
- package/dist/machines/ServerUpdatePanel.js +51 -40
- package/dist/machines/ShareThisComputerForm.d.ts +19 -0
- package/dist/machines/ShareThisComputerForm.js +133 -0
- package/dist/machines/TokensPanel.d.ts +5 -3
- package/dist/machines/TokensPanel.js +98 -78
- package/dist/machines/headless/fixture-host.d.ts +19 -3
- package/dist/machines/headless/fixture-host.js +42 -5
- package/dist/machines/headless/fixtures.js +4 -6
- package/dist/machines/headless/host.d.ts +40 -19
- package/dist/machines/headless/index.d.ts +3 -3
- package/dist/machines/headless/index.js +2 -2
- package/dist/machines/headless/labels.d.ts +63 -20
- package/dist/machines/headless/labels.js +88 -25
- package/dist/machines/headless/messages.js +8 -0
- package/dist/machines/headless/stores.d.ts +9 -2
- package/dist/machines/headless/stores.js +28 -1
- package/dist/machines/index.d.ts +7 -3
- package/dist/machines/index.js +8 -4
- package/dist/machines/testing/contract.d.ts +15 -3
- package/dist/machines/testing/contract.js +68 -14
- package/dist/motion/grow.d.ts +8 -1
- package/dist/motion/grow.js +10 -4
- package/dist/onboarding/demos/index.js +1 -1
- package/dist/onboarding/headless/labels.d.ts +13 -0
- package/dist/onboarding/headless/labels.js +8 -0
- package/dist/onboarding/index.js +3 -3
- package/dist/onboarding/sources/SourceBrowser.js +11 -7
- package/dist/onboarding/steps/ConnectorsStep.js +1 -1
- package/dist/onboarding/steps/ImportStep.js +4 -1
- package/dist/onboarding/steps/ReadyStep.js +9 -2
- package/dist/onboarding/steps/SkillsStep.js +1 -1
- package/dist/onboarding/steps/connect/KeyForm.js +6 -2
- package/dist/onboarding/steps/connect/ProviderPanel.js +6 -2
- package/dist/onboarding/steps/connect/ProviderReady.js +25 -20
- package/dist/onboarding/steps/tasks.js +17 -14
- package/dist/server/sse-handler.js +141 -19
- package/dist/session/ArtifactsPanel.js +39 -17
- package/dist/session/PlanTracker.js +12 -7
- package/dist/session/ProjectHome.js +13 -11
- package/dist/session/RemindersPanel.js +34 -16
- package/dist/session/RunningWorkDialog.js +6 -2
- package/dist/session/SecretsPanel.js +29 -10
- package/dist/session/SessionDetailsDialog.d.ts +1 -1
- package/dist/session/SessionDetailsDialog.js +18 -10
- package/dist/session/SideChat.js +10 -7
- package/dist/session/TurnDetailsDialog.js +19 -5
- package/dist/session/UsagePanel.js +10 -4
- package/dist/session/headless/host.d.ts +2 -0
- package/dist/session/headless/labels.d.ts +19 -1
- package/dist/session/headless/labels.js +15 -1
- package/dist/session/headless/queue.js +2 -1
- package/dist/session/headless/reminder-labels.d.ts +4 -0
- package/dist/session/headless/reminder-labels.js +4 -0
- package/dist/settings/SettingsRestricted.d.ts +1 -1
- package/dist/settings/SettingsRestricted.js +4 -4
- package/dist/settings/SettingsShell.d.ts +7 -0
- package/dist/settings/SettingsShell.js +6 -1
- package/dist/settings/headless/fixture-performance.d.ts +1 -1
- package/dist/settings/headless/host.d.ts +2 -2
- package/dist/settings/headless/labels.d.ts +3 -3
- package/dist/settings/headless/labels.js +3 -3
- package/dist/settings/headless/performance.d.ts +3 -4
- package/dist/settings/headless/search.d.ts +1 -1
- package/dist/settings/index.d.ts +2 -1
- package/dist/settings/index.js +2 -1
- package/dist/settings/sections/editor/EditorSection.js +7 -4
- package/dist/settings/sections/editor/labels.d.ts +1 -0
- package/dist/settings/sections/editor/labels.js +1 -0
- package/dist/settings/sections/environments/EnvironmentsSection.js +19 -12
- package/dist/settings/sections/environments/labels.d.ts +1 -0
- package/dist/settings/sections/environments/labels.js +2 -1
- package/dist/settings/sections/extensions/ExtensionConfigRows.d.ts +1 -3
- package/dist/settings/sections/extensions/ExtensionConfigRows.js +20 -19
- package/dist/settings/sections/extensions/ExtensionOptionsSection.js +2 -1
- package/dist/settings/sections/extensions/options-labels.d.ts +2 -1
- package/dist/settings/sections/extensions/options-labels.js +2 -1
- package/dist/settings/sections/index.d.ts +2 -1
- package/dist/settings/sections/index.js +2 -1
- package/dist/settings/sections/logs/LogsSection.d.ts +2 -2
- package/dist/settings/sections/logs/LogsSection.js +2 -2
- package/dist/settings/sections/mcp/McpSection.d.ts +1 -1
- package/dist/settings/sections/mcp/McpSection.js +12 -6
- package/dist/settings/sections/mcp/McpServerRow.js +20 -13
- package/dist/settings/sections/mcp/labels.d.ts +8 -2
- package/dist/settings/sections/mcp/labels.js +8 -2
- package/dist/settings/sections/models/ModelRows.js +1 -1
- package/dist/settings/sections/models/NewChatPlaceRow.d.ts +26 -0
- package/dist/settings/sections/models/NewChatPlaceRow.js +78 -0
- package/dist/settings/sections/models/SpacesDefaultsSection.js +15 -3
- package/dist/settings/sections/models/labels.d.ts +7 -0
- package/dist/settings/sections/models/labels.js +7 -0
- package/dist/settings/sections/models/model-test.js +7 -4
- package/dist/settings/sections/performance/PerformanceSection.js +16 -6
- package/dist/settings/sections/performance/labels.d.ts +1 -1
- package/dist/settings/sections/performance/labels.js +1 -1
- package/dist/settings/sections/providers/ProvidersSection.d.ts +1 -1
- package/dist/settings/sections/providers/ProvidersSection.js +14 -7
- package/dist/settings/sections/providers/ServerProvidersSection.d.ts +1 -1
- package/dist/settings/sections/providers/ServerProvidersSection.js +11 -5
- package/dist/settings/sections/providers/labels.d.ts +2 -2
- package/dist/settings/sections/providers/labels.js +2 -2
- package/dist/settings/sections/skills/SkillList.js +1 -1
- package/dist/settings/sections/skills/SkillsSection.js +1 -1
- package/dist/settings/testing/performance.contract.js +8 -12
- package/dist/styles.css +32 -3
- package/dist/terminal/HostTerminalSurface.js +15 -5
- package/dist/terminal/TerminalPanel.js +30 -17
- package/dist/terminal/TerminalSurface.js +11 -4
- package/dist/terminal/headless/labels.d.ts +5 -0
- package/dist/terminal/headless/labels.js +5 -0
- package/dist/terminal/headless/store.d.ts +1 -1
- package/dist/terminal/headless/store.js +6 -3
- package/dist/workspace/LayoutBudget.d.ts +5 -1
- package/dist/workspace/LayoutBudget.js +14 -1
- package/dist/workspace/PanelContentView.d.ts +1 -1
- package/dist/workspace/PanelContentView.js +17 -6
- package/dist/workspace/WorkspaceProvider.js +3 -2
- package/dist/workspace/headless/labels.d.ts +1 -0
- package/dist/workspace/headless/labels.js +1 -0
- package/package.json +3 -3
- package/src/styles/motion.css +8 -0
- package/src/styles/primitives.css +7 -0
|
@@ -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
|
|
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
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
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
|
-
|
|
209
|
+
save();
|
|
387
210
|
},
|
|
211
|
+
onKeyDown: escapeCancels(stopEditing),
|
|
388
212
|
children: [
|
|
389
|
-
/* @__PURE__ */ jsx("
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
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-
|
|
396
|
-
children: [/* @__PURE__ */
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
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
|
-
|
|
414
|
-
|
|
415
|
-
|
|
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
|
-
})
|
|
419
|
-
|
|
420
|
-
|
|
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
|
|
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
|