@songsid/agend 2.3.4-beta.5 → 2.3.5-alpha.2
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/README.md +2 -0
- package/README.zh-TW.md +2 -0
- package/THIRD_PARTY_NOTICES.md +53 -0
- package/dist/agent-endpoint.d.ts +5 -1
- package/dist/agent-endpoint.js +12 -2
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/backend/claude-code.d.ts +18 -12
- package/dist/backend/claude-code.js +225 -136
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/codex-package.d.ts +5 -2
- package/dist/backend/codex-package.js +1 -5
- package/dist/backend/codex-package.js.map +1 -1
- package/dist/backend/codex.d.ts +136 -113
- package/dist/backend/codex.js +1271 -1219
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/grok-model-cache.d.ts +7 -0
- package/dist/backend/grok-model-cache.js +65 -0
- package/dist/backend/grok-model-cache.js.map +1 -0
- package/dist/backend/grok.d.ts +2 -0
- package/dist/backend/grok.js +22 -0
- package/dist/backend/grok.js.map +1 -1
- package/dist/backend/native-pane.d.ts +9 -0
- package/dist/backend/native-pane.js +59 -0
- package/dist/backend/native-pane.js.map +1 -0
- package/dist/backend/types.d.ts +7 -0
- package/dist/backend/types.js.map +1 -1
- package/dist/channel/ipc-bridge.d.ts +2 -0
- package/dist/channel/mcp-tools.js +1 -1
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/cli.js +6 -2
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.js +59 -0
- package/dist/config-validator.js.map +1 -1
- package/dist/config.js +16 -0
- package/dist/config.js.map +1 -1
- package/dist/daemon.d.ts +62 -5
- package/dist/daemon.js +760 -240
- package/dist/daemon.js.map +1 -1
- package/dist/delivery-consumed-watch.d.ts +15 -3
- package/dist/delivery-consumed-watch.js +23 -1
- package/dist/delivery-consumed-watch.js.map +1 -1
- package/dist/delivery-outbox.d.ts +5 -0
- package/dist/delivery-outbox.js +32 -4
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/delivery-reconciliation.d.ts +2 -35
- package/dist/delivery-reconciliation.js +2 -156
- package/dist/delivery-reconciliation.js.map +1 -1
- package/dist/fleet-context.d.ts +2 -2
- package/dist/fleet-level-config.d.ts +1 -1
- package/dist/fleet-level-config.js +2 -0
- package/dist/fleet-level-config.js.map +1 -1
- package/dist/fleet-manager.d.ts +125 -2
- package/dist/fleet-manager.js +1157 -27
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-windows-runtime.d.ts +92 -0
- package/dist/fleet-windows-runtime.js +373 -0
- package/dist/fleet-windows-runtime.js.map +1 -0
- package/dist/instance-config-impact.js +4 -0
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +20 -3
- package/dist/instance-lifecycle.js +358 -156
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/local-pane-endpoint.d.ts +46 -0
- package/dist/local-pane-endpoint.js +189 -0
- package/dist/local-pane-endpoint.js.map +1 -0
- package/dist/local-pane-launcher.d.ts +2 -0
- package/dist/local-pane-launcher.js +38 -0
- package/dist/local-pane-launcher.js.map +1 -0
- package/dist/local-pane-stage.ps1 +101 -0
- package/dist/locale.js +34 -0
- package/dist/locale.js.map +1 -1
- package/dist/model-catalog-defaults.d.ts +14 -0
- package/dist/model-catalog-defaults.js +20 -0
- package/dist/model-catalog-defaults.js.map +1 -0
- package/dist/native-agent-admission.d.ts +7 -0
- package/dist/native-agent-admission.js +26 -0
- package/dist/native-agent-admission.js.map +1 -0
- package/dist/native-daemon-client.d.ts +13 -0
- package/dist/native-daemon-client.js +28 -0
- package/dist/native-daemon-client.js.map +1 -0
- package/dist/native-instance-api.d.ts +14 -0
- package/dist/native-instance-api.js +205 -0
- package/dist/native-instance-api.js.map +1 -0
- package/dist/native-instance-input.d.ts +84 -0
- package/dist/native-instance-input.js +54 -0
- package/dist/native-instance-input.js.map +1 -0
- package/dist/native-instance-registry.d.ts +32 -0
- package/dist/native-instance-registry.js +105 -0
- package/dist/native-instance-registry.js.map +1 -0
- package/dist/native-mcp.d.ts +40 -0
- package/dist/native-mcp.js +278 -0
- package/dist/native-mcp.js.map +1 -0
- package/dist/native-model-catalog.d.ts +5 -0
- package/dist/native-model-catalog.js +76 -0
- package/dist/native-model-catalog.js.map +1 -0
- package/dist/native-pane-crash-budget.d.ts +20 -0
- package/dist/native-pane-crash-budget.js +60 -0
- package/dist/native-pane-crash-budget.js.map +1 -0
- package/dist/native-pane-create.d.ts +26 -0
- package/dist/native-pane-create.js +53 -0
- package/dist/native-pane-create.js.map +1 -0
- package/dist/native-pane-lifecycle.d.ts +65 -0
- package/dist/native-pane-lifecycle.js +227 -0
- package/dist/native-pane-lifecycle.js.map +1 -0
- package/dist/native-pane-manager.d.ts +58 -0
- package/dist/native-pane-manager.js +563 -0
- package/dist/native-pane-manager.js.map +1 -0
- package/dist/native-pane-output-log.d.ts +15 -0
- package/dist/native-pane-output-log.js +108 -0
- package/dist/native-pane-output-log.js.map +1 -0
- package/dist/native-pane-reconciliation.d.ts +4 -0
- package/dist/native-pane-reconciliation.js +40 -0
- package/dist/native-pane-reconciliation.js.map +1 -0
- package/dist/native-pane-recovery.d.ts +12 -0
- package/dist/native-pane-recovery.js +10 -0
- package/dist/native-pane-recovery.js.map +1 -0
- package/dist/native-pane-tools.d.ts +2 -0
- package/dist/native-pane-tools.js +14 -0
- package/dist/native-pane-tools.js.map +1 -0
- package/dist/needs-you-hub.d.ts +2 -0
- package/dist/needs-you-hub.js +1 -0
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you.d.ts +12 -1
- package/dist/needs-you.js +8 -1
- package/dist/needs-you.js.map +1 -1
- package/dist/outbound-handlers.d.ts +16 -2
- package/dist/outbound-handlers.js +67 -3
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +38 -0
- package/dist/outbound-schemas.js +12 -0
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/pane-port.d.ts +107 -0
- package/dist/pane-port.js +2 -0
- package/dist/pane-port.js.map +1 -0
- package/dist/runtime-api.d.ts +8 -0
- package/dist/runtime-api.js +96 -0
- package/dist/runtime-api.js.map +1 -0
- package/dist/runtime-assets/@xterm/addon-serialize/LICENSE +21 -0
- package/dist/runtime-assets/@xterm/addon-serialize/lib/addon-serialize.js +2 -0
- package/dist/runtime-assets/@xterm/addon-serialize/lib/addon-serialize.mjs +19 -0
- package/dist/runtime-assets/@xterm/addon-serialize/package.json +29 -0
- package/dist/runtime-assets/@xterm/headless/LICENSE +21 -0
- package/dist/runtime-assets/@xterm/headless/lib-headless/xterm-headless.js +2 -0
- package/dist/runtime-assets/@xterm/headless/lib-headless/xterm-headless.mjs +46 -0
- package/dist/runtime-assets/@xterm/headless/package.json +29 -0
- package/dist/runtime-assets/node-pty/CONPTY-LICENSE +21 -0
- package/dist/runtime-assets/node-pty/CONPTY-NOTICE.md +503 -0
- package/dist/runtime-assets/node-pty/LICENSE +69 -0
- package/dist/runtime-assets/node-pty/lib/conpty_console_list_agent.js +16 -0
- package/dist/runtime-assets/node-pty/lib/eventEmitter2.js +47 -0
- package/dist/runtime-assets/node-pty/lib/index.js +52 -0
- package/dist/runtime-assets/node-pty/lib/interfaces.js +7 -0
- package/dist/runtime-assets/node-pty/lib/shared/conout.js +11 -0
- package/dist/runtime-assets/node-pty/lib/terminal.js +190 -0
- package/dist/runtime-assets/node-pty/lib/types.js +7 -0
- package/dist/runtime-assets/node-pty/lib/unixTerminal.js +346 -0
- package/dist/runtime-assets/node-pty/lib/utils.js +39 -0
- package/dist/runtime-assets/node-pty/lib/windowsConoutConnection.js +125 -0
- package/dist/runtime-assets/node-pty/lib/windowsPtyAgent.js +320 -0
- package/dist/runtime-assets/node-pty/lib/windowsTerminal.js +199 -0
- package/dist/runtime-assets/node-pty/lib/worker/conoutSocketWorker.js +22 -0
- package/dist/runtime-assets/node-pty/package.json +64 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty.node +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
- package/dist/runtime-bundle.d.ts +17 -0
- package/dist/runtime-bundle.js +147 -0
- package/dist/runtime-bundle.js.map +1 -0
- package/dist/runtime-cli.d.ts +2 -0
- package/dist/runtime-cli.js +117 -0
- package/dist/runtime-cli.js.map +1 -0
- package/dist/runtime-client-store.d.ts +49 -0
- package/dist/runtime-client-store.js +292 -0
- package/dist/runtime-client-store.js.map +1 -0
- package/dist/runtime-client.d.ts +100 -0
- package/dist/runtime-client.js +700 -0
- package/dist/runtime-client.js.map +1 -0
- package/dist/runtime-coordinator.d.ts +82 -0
- package/dist/runtime-coordinator.js +864 -0
- package/dist/runtime-coordinator.js.map +1 -0
- package/dist/runtime-pane-assets.d.ts +17 -0
- package/dist/runtime-pane-assets.js +23 -0
- package/dist/runtime-pane-assets.js.map +1 -0
- package/dist/runtime-pane-boot.d.ts +2 -0
- package/dist/runtime-pane-boot.js +24 -0
- package/dist/runtime-pane-boot.js.map +1 -0
- package/dist/runtime-pane-codex-index.d.ts +1 -0
- package/dist/runtime-pane-codex-index.js +47 -0
- package/dist/runtime-pane-codex-index.js.map +1 -0
- package/dist/runtime-pane-config.d.ts +16 -0
- package/dist/runtime-pane-config.js +54 -0
- package/dist/runtime-pane-config.js.map +1 -0
- package/dist/runtime-pane-host.d.ts +43 -0
- package/dist/runtime-pane-host.js +403 -0
- package/dist/runtime-pane-host.js.map +1 -0
- package/dist/runtime-pane-job-owner.d.ts +1 -0
- package/dist/runtime-pane-job-owner.js +29 -0
- package/dist/runtime-pane-job-owner.js.map +1 -0
- package/dist/runtime-pane-job.ps1 +116 -0
- package/dist/runtime-pane-link.d.ts +40 -0
- package/dist/runtime-pane-link.js +246 -0
- package/dist/runtime-pane-link.js.map +1 -0
- package/dist/runtime-pane-mcp-protocol.d.ts +32 -0
- package/dist/runtime-pane-mcp-protocol.js +39 -0
- package/dist/runtime-pane-mcp-protocol.js.map +1 -0
- package/dist/runtime-pane-mcp-relay.d.ts +17 -0
- package/dist/runtime-pane-mcp-relay.js +70 -0
- package/dist/runtime-pane-mcp-relay.js.map +1 -0
- package/dist/runtime-pane-mcp.d.ts +43 -0
- package/dist/runtime-pane-mcp.js +137 -0
- package/dist/runtime-pane-mcp.js.map +1 -0
- package/dist/runtime-pane-native.d.ts +45 -0
- package/dist/runtime-pane-native.js +65 -0
- package/dist/runtime-pane-native.js.map +1 -0
- package/dist/runtime-pane-output.d.ts +19 -0
- package/dist/runtime-pane-output.js +53 -0
- package/dist/runtime-pane-output.js.map +1 -0
- package/dist/runtime-pane-port.d.ts +134 -0
- package/dist/runtime-pane-port.js +537 -0
- package/dist/runtime-pane-port.js.map +1 -0
- package/dist/runtime-pane-private.d.ts +14 -0
- package/dist/runtime-pane-private.js +51 -0
- package/dist/runtime-pane-private.js.map +1 -0
- package/dist/runtime-pane-private.ps1 +14 -0
- package/dist/runtime-pane-process.d.ts +4 -0
- package/dist/runtime-pane-process.js +108 -0
- package/dist/runtime-pane-process.js.map +1 -0
- package/dist/runtime-pane-protocol.d.ts +169 -0
- package/dist/runtime-pane-protocol.js +189 -0
- package/dist/runtime-pane-protocol.js.map +1 -0
- package/dist/runtime-pane-screen.d.ts +19 -0
- package/dist/runtime-pane-screen.js +76 -0
- package/dist/runtime-pane-screen.js.map +1 -0
- package/dist/runtime-pane-service.d.ts +11 -0
- package/dist/runtime-pane-service.js +221 -0
- package/dist/runtime-pane-service.js.map +1 -0
- package/dist/runtime-pane-stdio-protocol.d.ts +54 -0
- package/dist/runtime-pane-stdio-protocol.js +94 -0
- package/dist/runtime-pane-stdio-protocol.js.map +1 -0
- package/dist/runtime-pane-stdio.d.ts +3 -0
- package/dist/runtime-pane-stdio.js +123 -0
- package/dist/runtime-pane-stdio.js.map +1 -0
- package/dist/runtime-pane-store.d.ts +33 -0
- package/dist/runtime-pane-store.js +164 -0
- package/dist/runtime-pane-store.js.map +1 -0
- package/dist/runtime-pane-transcript-protocol.d.ts +43 -0
- package/dist/runtime-pane-transcript-protocol.js +58 -0
- package/dist/runtime-pane-transcript-protocol.js.map +1 -0
- package/dist/runtime-pane-transcript.d.ts +45 -0
- package/dist/runtime-pane-transcript.js +605 -0
- package/dist/runtime-pane-transcript.js.map +1 -0
- package/dist/runtime-pane-worker.d.ts +1 -0
- package/dist/runtime-pane-worker.js +154 -0
- package/dist/runtime-pane-worker.js.map +1 -0
- package/dist/runtime-protocol.d.ts +149 -0
- package/dist/runtime-protocol.js +19 -0
- package/dist/runtime-protocol.js.map +1 -0
- package/dist/runtime-switches.d.ts +79 -0
- package/dist/runtime-switches.js +90 -0
- package/dist/runtime-switches.js.map +1 -0
- package/dist/runtime-transcript-delta-reader.d.ts +23 -0
- package/dist/runtime-transcript-delta-reader.js +74 -0
- package/dist/runtime-transcript-delta-reader.js.map +1 -0
- package/dist/runtime-transcript-source.d.ts +36 -0
- package/dist/runtime-transcript-source.js +189 -0
- package/dist/runtime-transcript-source.js.map +1 -0
- package/dist/runtime-windows-bridge.d.ts +41 -0
- package/dist/runtime-windows-bridge.js +157 -0
- package/dist/runtime-windows-bridge.js.map +1 -0
- package/dist/settings-api.js +58 -0
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-change.js +28 -0
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-confirmation.d.ts +15 -1
- package/dist/settings-confirmation.js +46 -9
- package/dist/settings-confirmation.js.map +1 -1
- package/dist/settings-effect.js +23 -1
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.js +11 -2
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/tmux-control.d.ts +2 -1
- package/dist/tmux-control.js.map +1 -1
- package/dist/tmux-manager.d.ts +2 -1
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tmux-pane-host.d.ts +26 -0
- package/dist/tmux-pane-host.js +25 -0
- package/dist/tmux-pane-host.js.map +1 -0
- package/dist/topic-commands.js +3 -0
- package/dist/topic-commands.js.map +1 -1
- package/dist/transcript-delta-reader.d.ts +1 -1
- package/dist/transcript-delta-reader.js +1 -1
- package/dist/transcript-delta-reader.js.map +1 -1
- package/dist/transcript-monitor.d.ts +3 -0
- package/dist/transcript-monitor.js +22 -46
- package/dist/transcript-monitor.js.map +1 -1
- package/dist/transcript-needles.d.ts +35 -0
- package/dist/transcript-needles.js +158 -0
- package/dist/transcript-needles.js.map +1 -0
- package/dist/transcript-records.d.ts +21 -0
- package/dist/transcript-records.js +140 -0
- package/dist/transcript-records.js.map +1 -0
- package/dist/transcript-sources.d.ts +5 -0
- package/dist/transcript-sources.js +8 -79
- package/dist/transcript-sources.js.map +1 -1
- package/dist/types.d.ts +21 -0
- package/dist/ui/agent-proposals.js +90 -0
- package/dist/ui/agent-runtime.js +106 -0
- package/dist/ui/chat-store.js +13 -2
- package/dist/ui/chat-strings.js +48 -0
- package/dist/ui/cli-picker.js +42 -0
- package/dist/ui/native-instance-settings.js +47 -0
- package/dist/ui/native-pane-recovery.js +45 -0
- package/dist/ui/panel-chat.js +61 -32
- package/dist/ui/panel-details.js +2 -1
- package/dist/ui/panel-fleet.js +99 -18
- package/dist/ui/panel-needs.js +152 -3
- package/dist/ui/panel-runtimes.js +231 -0
- package/dist/ui/panel-settings.js +14 -8
- package/dist/ui/panel-windows-agent.js +86 -0
- package/dist/ui/panel-windows-cli.js +143 -0
- package/dist/ui/provider-marks.js +83 -0
- package/dist/ui/runtime-catalog.js +55 -0
- package/dist/ui/settings-catalog.js +37 -10
- package/dist/ui/settings-confirm.js +3 -1
- package/dist/ui/settings-dialogs.js +14 -5
- package/dist/ui/settings-registry.js +5 -0
- package/dist/ui/settings-strings.js +14 -0
- package/dist/ui/shared/app-i18n.js +2 -2
- package/dist/ui/shared/app-route.js +6 -2
- package/dist/ui/shared/app-shell.js +3 -2
- package/dist/ui/shared/app-store.js +1 -0
- package/dist/ui/shared/app-stream.js +3 -1
- package/dist/ui/shared/app.css +301 -0
- package/dist/ui/shared/app.js +4 -0
- package/dist/ui/shared/header-tools.js +6 -4
- package/dist/ui/shared/instance-nav.js +20 -4
- package/dist/ui/shared/instance-switch.js +4 -3
- package/dist/ui/shared/ui-menu.js +28 -8
- package/dist/ui/shared/view-strings.js +6 -0
- package/dist/ui/windows-agents-nav.js +2 -0
- package/dist/ui/windows-cli-catalog.js +79 -0
- package/dist/update-check.d.ts +8 -2
- package/dist/update-check.js +5 -2
- package/dist/update-check.js.map +1 -1
- package/dist/web-api.d.ts +25 -0
- package/dist/web-api.js +171 -6
- package/dist/web-api.js.map +1 -1
- package/dist/web-chat-history.d.ts +19 -2
- package/dist/web-chat-history.js +72 -3
- package/dist/web-chat-history.js.map +1 -1
- package/dist/web-shell-routes.d.ts +4 -1
- package/dist/web-shell-routes.js +7 -2
- package/dist/web-shell-routes.js.map +1 -1
- package/dist/windows-agents.d.ts +112 -0
- package/dist/windows-agents.js +463 -0
- package/dist/windows-agents.js.map +1 -0
- package/dist/windows-cli-api.d.ts +23 -0
- package/dist/windows-cli-api.js +158 -0
- package/dist/windows-cli-api.js.map +1 -0
- package/dist/windows-cli-providers.d.ts +115 -0
- package/dist/windows-cli-providers.js +429 -0
- package/dist/windows-cli-providers.js.map +1 -0
- package/dist/windows-cli-worker.d.ts +58 -0
- package/dist/windows-cli-worker.js +479 -0
- package/dist/windows-cli-worker.js.map +1 -0
- package/dist/windows-cli.d.ts +115 -0
- package/dist/windows-cli.js +402 -0
- package/dist/windows-cli.js.map +1 -0
- package/dist/windows-native-mcp.d.ts +19 -0
- package/dist/windows-native-mcp.js +143 -0
- package/dist/windows-native-mcp.js.map +1 -0
- package/dist/windows-pane-mcp.d.ts +26 -0
- package/dist/windows-pane-mcp.js +187 -0
- package/dist/windows-pane-mcp.js.map +1 -0
- package/package.json +9 -3
- package/templates/runtime-assets/conpty-LICENSE +21 -0
- package/templates/runtime-assets/conpty-NOTICE.md +503 -0
- package/templates/runtime-assets/local-pane-stage.ps1 +101 -0
- package/templates/runtime-assets/runtime-pane-job.ps1 +116 -0
- package/templates/runtime-assets/runtime-pane-private.ps1 +14 -0
- package/templates/runtime-assets/xterm-LICENSE +21 -0
|
@@ -259,6 +259,11 @@ register("settings", {
|
|
|
259
259
|
backendNotInstalled: "not installed", backendNotSignedIn: "not signed in (use /login)", backendTooOld: "needs {0} or newer", backendUnchecked: "not checked yet",
|
|
260
260
|
modelNotListed: "current — not in this CLI's list", modelOther: "Other…", modelOtherLabel: "Model name", modelOtherPlaceholder: "a model name this CLI accepts",
|
|
261
261
|
modelNone: "— none —", inheritValue: "inherit ({0})", modelCliDefault: "the CLI's own default",
|
|
262
|
+
modelCatalogLoading: "Loading this CLI's models…", modelCatalogFailed: "Could not load models. Keep the default or enter a model name.",
|
|
263
|
+
modelCatalogEmpty: "No model list is available. Use the default or enter a model name.",
|
|
264
|
+
modelCatalogCliList: "Source: CLI model listing.", modelCatalogCliCache: "Source: local CLI model cache.",
|
|
265
|
+
modelCatalogOfficial: "Source: official candidate list. Availability depends on your account and provider.",
|
|
266
|
+
modelCatalogCached: "Source: AgEnD's cached CLI/account model list.", modelCatalogRetry: "Retry", modelCatalogRefresh: "Refresh models",
|
|
262
267
|
readyApply: "Ready to apply",
|
|
263
268
|
copied: "Copied",
|
|
264
269
|
expectedMapping: "expected a mapping",
|
|
@@ -284,6 +289,8 @@ register("settings", {
|
|
|
284
289
|
syncedPublicLink: "On the public link these are read-only: a change here stays in this browser.",
|
|
285
290
|
deviceTitle: "This device only", deviceLead: "The tour, text size, view fit, the sidebar shown or hidden, panel widths and desktop notifications stay on each device.",
|
|
286
291
|
sec_agents: "Agents",
|
|
292
|
+
"sec_windows-cli": "Windows CLI",
|
|
293
|
+
sec_runtimes: "Runtime",
|
|
287
294
|
"sec_agent-defaults": "Agent defaults", sec_chat: "Chat & connections", "sec_web-dashboard": "Web dashboard", sec_access: "Access & security",
|
|
288
295
|
sec_advanced: "Advanced", sec_look: "Look", grp_you: "You", grp_fleet: "Fleet",
|
|
289
296
|
classicDefaultsTitle: "ClassicBot defaults", publicLinkTitle: "Public link & fixed address", webDashboardTitle: "Dashboard features", webSettingsLabel: "Web settings",
|
|
@@ -916,6 +923,11 @@ register("settings", {
|
|
|
916
923
|
backendNotInstalled: "未安裝", backendNotSignedIn: "未登入(請用 /login)", backendTooOld: "需要 {0} 以上版本", backendUnchecked: "尚未檢查",
|
|
917
924
|
modelNotListed: "目前使用中 — 不在這個 CLI 的清單裡", modelOther: "其他…", modelOtherLabel: "模型名稱", modelOtherPlaceholder: "這個 CLI 接受的模型名稱",
|
|
918
925
|
modelNone: "— 無 —", inheritValue: "沿用({0})", modelCliDefault: "CLI 自己的預設",
|
|
926
|
+
modelCatalogLoading: "正在載入這個 CLI 的模型…", modelCatalogFailed: "模型清單載入失敗,可先使用預設或輸入模型名稱。",
|
|
927
|
+
modelCatalogEmpty: "目前沒有可讀取的模型清單,可使用預設或輸入模型名稱。",
|
|
928
|
+
modelCatalogCliList: "來源:CLI 列舉結果。", modelCatalogCliCache: "來源:本機 CLI 模型快取。",
|
|
929
|
+
modelCatalogOfficial: "來源:官方候選清單,實際可用性依帳戶與服務設定。",
|
|
930
|
+
modelCatalogCached: "來源:AgEnD 已快取的 CLI/帳號模型清單。", modelCatalogRetry: "重試", modelCatalogRefresh: "更新模型",
|
|
919
931
|
readyApply: "可套用變更",
|
|
920
932
|
copied: "已複製",
|
|
921
933
|
expectedMapping: "預期為 mapping",
|
|
@@ -941,6 +953,8 @@ register("settings", {
|
|
|
941
953
|
syncedPublicLink: "公開連結只能讀取這些設定:在這裡變更只會留在這個瀏覽器。",
|
|
942
954
|
deviceTitle: "只限這台裝置", deviceLead: "導覽、文字大小、視圖寬度、側欄顯示或隱藏、面板寬度與桌面通知,每台裝置各自保留。",
|
|
943
955
|
sec_agents: "Agent",
|
|
956
|
+
"sec_windows-cli": "Windows CLI",
|
|
957
|
+
sec_runtimes: "Runtime",
|
|
944
958
|
"sec_agent-defaults": "Agent 預設值", sec_chat: "聊天與連線", "sec_web-dashboard": "網頁儀表板", sec_access: "存取與安全",
|
|
945
959
|
sec_advanced: "進階", sec_look: "外觀", grp_you: "你自己", grp_fleet: "整個 Fleet",
|
|
946
960
|
classicDefaultsTitle: "ClassicBot 預設值", publicLinkTitle: "公開連結與固定網址", webDashboardTitle: "儀表板功能", webSettingsLabel: "網頁設定",
|
|
@@ -111,7 +111,7 @@ register("app", {
|
|
|
111
111
|
confirmTitle: "Please confirm", confirmOk: "Continue", cancel: "Cancel",
|
|
112
112
|
sidePanelLeave: "Leave {0} without saving? Your changes there will be lost.", sidePanelDiscard: "Discard changes",
|
|
113
113
|
// The server's own wording (src/locale.ts needs.reason.*), so the web says what Discord says.
|
|
114
|
-
needs_reason_hang: "Not responding", needs_reason_exited: "Exited", needs_reason_assist: "Waiting at its terminal", needs_reason_question: "Asking you a question", needs_reason_permission: "Permission needed", needs_reason_dangerous_command: "Dangerous command waiting", needs_reason_login: "Sign-in needed", needs_reason_dialog: "Waiting at a dialog", needs_reason_terminal_input: "May be waiting for input", needs_reason_auth_paused: "Paused: sign-in needed", needs_reason_backend_signin: "Backend sign-in needed", needs_reason_config_invalid: "Configuration file needs attention", needs_reason_config_fallback: "Running on stored configuration", config_history_edit: "{0}, line {1}, column {2}: {3}. AgEnD is still running on the previous settings. The next restart would use the stored valid copy from {4}. Correct the YAML error; the file has not been changed by AgEnD.", config_history_no_history: "{0}, line {1}, column {2}: {3}. AgEnD is still running on the previous settings. No stored valid copy is available, so the next restart cannot recover automatically. Correct the YAML error before restarting; the file has not been changed by AgEnD.", config_history_fallback: "{0}, line {1}, column {2}: {3}. AgEnD started using the stored valid copy from {4}. Correct the YAML error and reload the settings. The file on disk has not been changed by AgEnD.", needs_reason_crashed: "Crashed", needs_reason_usage_limit: "Usage limit reached · reset time unknown", needs_reason_delivery_uncertain: "Could not confirm delivery", needs_reason_delivery_failed: "Delivery failed", needs_reason_task_review: "Waiting for your confirmation", needs_reason_task_blocked: "Blocked: asks you",
|
|
114
|
+
needs_reason_hang: "Not responding", needs_reason_exited: "Exited", needs_reason_assist: "Waiting at its terminal", needs_reason_question: "Asking you a question", needs_reason_permission: "Permission needed", needs_reason_dangerous_command: "Dangerous command waiting", needs_reason_login: "Sign-in needed", needs_reason_dialog: "Waiting at a dialog", needs_reason_terminal_input: "May be waiting for input", needs_reason_auth_paused: "Paused: sign-in needed", needs_reason_backend_signin: "Backend sign-in needed", needs_reason_config_invalid: "Configuration file needs attention", needs_reason_config_fallback: "Running on stored configuration", config_history_edit: "{0}, line {1}, column {2}: {3}. AgEnD is still running on the previous settings. The next restart would use the stored valid copy from {4}. Correct the YAML error; the file has not been changed by AgEnD.", config_history_no_history: "{0}, line {1}, column {2}: {3}. AgEnD is still running on the previous settings. No stored valid copy is available, so the next restart cannot recover automatically. Correct the YAML error before restarting; the file has not been changed by AgEnD.", config_history_fallback: "{0}, line {1}, column {2}: {3}. AgEnD started using the stored valid copy from {4}. Correct the YAML error and reload the settings. The file on disk has not been changed by AgEnD.", needs_reason_native_pane_hold: "Windows agent needs attention", needs_reason_crashed: "Crashed", needs_reason_usage_limit: "Usage limit reached · reset time unknown", needs_reason_delivery_uncertain: "Could not confirm delivery", needs_reason_delivery_failed: "Delivery failed", needs_reason_task_review: "Waiting for your confirmation", needs_reason_task_blocked: "Blocked: asks you",
|
|
115
115
|
},
|
|
116
116
|
"zh-TW": {
|
|
117
117
|
brand: "AgEnD", fleet: "Fleet", fleetOverview: "Fleet 概覽", view: "檢視", settings: "設定", instances: "Instances", newInstance: "新增 instance", newAgent: "新增 Agent",
|
|
@@ -156,6 +156,6 @@ register("app", {
|
|
|
156
156
|
search: "搜尋", searchTitle: "搜尋聊天、agent 之間的訊息與任務({0})",
|
|
157
157
|
confirmTitle: "請確認", confirmOk: "繼續", cancel: "取消",
|
|
158
158
|
sidePanelLeave: "不儲存就離開「{0}」?你在那裡的修改會遺失。", sidePanelDiscard: "捨棄修改",
|
|
159
|
-
needs_reason_hang: "沒有回應", needs_reason_exited: "已結束", needs_reason_assist: "在終端機上等待", needs_reason_question: "正在問你問題", needs_reason_permission: "需要權限", needs_reason_dangerous_command: "危險指令待確認", needs_reason_login: "需要登入", needs_reason_dialog: "停在對話框", needs_reason_terminal_input: "可能在等輸入", needs_reason_auth_paused: "已暫停:需要登入", needs_reason_backend_signin: "後端需要登入", needs_reason_config_invalid: "設定檔需要處理", needs_reason_config_fallback: "正在使用儲存的設定副本", config_history_edit: "{0} 第 {1} 行、第 {2} 欄:{3}。AgEnD 仍使用先前的設定執行。下次重新啟動會改用 {4} 儲存的有效副本。請修正 YAML 錯誤;AgEnD 未更動此檔案。", config_history_no_history: "{0} 第 {1} 行、第 {2} 欄:{3}。AgEnD 仍使用先前的設定執行。沒有可用的有效副本,下次重新啟動將無法自動恢復。請在重新啟動前修正 YAML 錯誤;AgEnD 未更動此檔案。", config_history_fallback: "{0} 第 {1} 行、第 {2} 欄:{3}。AgEnD 已使用 {4} 儲存的有效副本啟動。請修正 YAML 錯誤並重新載入設定。AgEnD 未更動磁碟上的檔案。", needs_reason_crashed: "已崩潰", needs_reason_usage_limit: "用量已達上限 · 恢復時間未知", needs_reason_delivery_uncertain: "無法確認是否送達", needs_reason_delivery_failed: "傳送失敗", needs_reason_task_review: "等你確認", needs_reason_task_blocked: "卡住,在問你",
|
|
159
|
+
needs_reason_hang: "沒有回應", needs_reason_exited: "已結束", needs_reason_assist: "在終端機上等待", needs_reason_question: "正在問你問題", needs_reason_permission: "需要權限", needs_reason_dangerous_command: "危險指令待確認", needs_reason_login: "需要登入", needs_reason_dialog: "停在對話框", needs_reason_terminal_input: "可能在等輸入", needs_reason_auth_paused: "已暫停:需要登入", needs_reason_backend_signin: "後端需要登入", needs_reason_config_invalid: "設定檔需要處理", needs_reason_config_fallback: "正在使用儲存的設定副本", config_history_edit: "{0} 第 {1} 行、第 {2} 欄:{3}。AgEnD 仍使用先前的設定執行。下次重新啟動會改用 {4} 儲存的有效副本。請修正 YAML 錯誤;AgEnD 未更動此檔案。", config_history_no_history: "{0} 第 {1} 行、第 {2} 欄:{3}。AgEnD 仍使用先前的設定執行。沒有可用的有效副本,下次重新啟動將無法自動恢復。請在重新啟動前修正 YAML 錯誤;AgEnD 未更動此檔案。", config_history_fallback: "{0} 第 {1} 行、第 {2} 欄:{3}。AgEnD 已使用 {4} 儲存的有效副本啟動。請修正 YAML 錯誤並重新載入設定。AgEnD 未更動磁碟上的檔案。", needs_reason_native_pane_hold: "Windows 代理需要處理", needs_reason_crashed: "已崩潰", needs_reason_usage_limit: "用量已達上限 · 恢復時間未知", needs_reason_delivery_uncertain: "無法確認是否送達", needs_reason_delivery_failed: "傳送失敗", needs_reason_task_review: "等你確認", needs_reason_task_blocked: "卡住,在問你",
|
|
160
160
|
},
|
|
161
161
|
});
|
|
@@ -6,11 +6,11 @@ export const FLEET_TABS = ["tasks", "schedules", "teams", "org", "cache", "usage
|
|
|
6
6
|
// #2347: two groups — "You" changes only you or this browser; "Fleet" changes AgEnD for everyone.
|
|
7
7
|
export const SETTINGS_GROUPS = Object.freeze([
|
|
8
8
|
Object.freeze({ id: "you", sections: Object.freeze(["preferences", "look"]) }),
|
|
9
|
-
Object.freeze({ id: "fleet", sections: Object.freeze(["agents", "agent-defaults", "chat", "web-dashboard", "access", "advanced"]) }),
|
|
9
|
+
Object.freeze({ id: "fleet", sections: Object.freeze(["agents", "runtimes", "agent-defaults", "chat", "web-dashboard", "access", "advanced"]) }),
|
|
10
10
|
]);
|
|
11
11
|
export const SETTINGS_SECTIONS = Object.freeze(SETTINGS_GROUPS.flatMap((g) => g.sections));
|
|
12
12
|
/** #2347: the sections' names before the regrouping (links and bookmarks keep working) and where each one went. */
|
|
13
|
-
export const LEGACY_SETTINGS = Object.freeze({ device: "preferences", appearance: "look", general: "agent-defaults", bots: "chat", classic: "chat#classicbot", web: "access" });
|
|
13
|
+
export const LEGACY_SETTINGS = Object.freeze({ device: "preferences", appearance: "look", general: "agent-defaults", bots: "chat", classic: "chat#classicbot", web: "access", "windows-cli":"runtimes" });
|
|
14
14
|
const legacySection = (name) => (Object.prototype.hasOwnProperty.call(LEGACY_SETTINGS, name) ? LEGACY_SETTINGS[name] : null);
|
|
15
15
|
const MAX_INSTANCE_NAME = 128;
|
|
16
16
|
const PATH_SEPARATOR_OR_CONTROL = /[/\\\u0000-\u001f\u007f]/;
|
|
@@ -28,6 +28,9 @@ export function isSafeInstanceName(name) {
|
|
|
28
28
|
*/
|
|
29
29
|
export function parseRoute(pathname) {
|
|
30
30
|
if (pathname === "/ui") return { panel: "chat", instance: null };
|
|
31
|
+
if (pathname === "/ui/windows-cli") return { panel: "settings", section: "runtimes" };
|
|
32
|
+
const windowsAgent = /^\/ui\/windows-agents\/([a-f0-9-]{36})$/i.exec(pathname);
|
|
33
|
+
if (windowsAgent) return { panel: "windows-agent", instance: windowsAgent[1] };
|
|
31
34
|
if (pathname === "/ui/fleet") return { panel: "fleet", tab: "tasks" };
|
|
32
35
|
if (pathname === "/ui/needs") return { panel: "needs" };
|
|
33
36
|
if (pathname === NOTICES_PATH) return { panel: "notices" }; // #2910 D2: a web-only fleet's Notices
|
|
@@ -108,6 +111,7 @@ export function legacySettingsTarget(pathname) {
|
|
|
108
111
|
}
|
|
109
112
|
export function routePath(route) {
|
|
110
113
|
if (!route) return "/ui";
|
|
114
|
+
if (route.panel === "windows-agent") return `/ui/windows-agents/${route.instance}`;
|
|
111
115
|
if (route.panel === "fleet") return fleetPath(route.tab);
|
|
112
116
|
if (route.panel === "settings") return settingsPath(route.section);
|
|
113
117
|
if (route.panel === "needs") return NEEDS_PATH;
|
|
@@ -331,7 +331,8 @@ function Sidebar({ route, onNewInstance, viewOnly }) {
|
|
|
331
331
|
const navLink = (panel, href, icon, label, count = 0, countText = "app.needsCount") => html`<a class=${`side-row${on(panel) ? " active" : ""}`} href=${href}
|
|
332
332
|
aria-current=${on(panel) ? "page" : undefined} aria-label=${count ? `${label} (${t(countText, count)})` : undefined} onClick=${closeDrawer}>
|
|
333
333
|
<${Icon} name=${icon} /><span class="grow">${label}</span>${count ? html`<span class="nav-count" aria-hidden="true">${count}</span>` : null}</a>`;
|
|
334
|
-
|
|
334
|
+
// alpha.2 (M-2300): an agent's request waiting for this web-only fleet's owner counts too (only the owner's page has any).
|
|
335
|
+
const needsCount = (Array.isArray(app.needs) ? app.needs.length : 0) + (Array.isArray(app.proposals) ? app.proposals.length : 0);
|
|
335
336
|
// View-only (an anonymous reader, #1408 §3): View and a way to sign in — nothing that needs a session is rendered.
|
|
336
337
|
if (viewOnly) {
|
|
337
338
|
return html`<aside id="sidebar" class="sidebar" aria-label=${t("app.menu")}>
|
|
@@ -502,7 +503,7 @@ function BottomTabs({ route, viewOnly }) {
|
|
|
502
503
|
// last tab), Settings.
|
|
503
504
|
return html`<nav data-trust="navigation" class="tabs" aria-label=${t("app.menu")}>
|
|
504
505
|
${tab(chatHref, "chat", t("app.chat"), !!open || (!!route && route.panel === "chat"), anyAwaiting)}
|
|
505
|
-
${tab(NEEDS_PATH, "inbox", t("app.needsTab"), route && route.panel === "needs", (app.needs || []).length, t("app.needsCount", (app.needs || []).length))}
|
|
506
|
+
${tab(NEEDS_PATH, "inbox", t("app.needsTab"), route && route.panel === "needs", (app.needs || []).length + (app.proposals || []).length, t("app.needsCount", (app.needs || []).length + (app.proposals || []).length))}
|
|
506
507
|
${tab(fleetEntryPath(route), "fleet", t("app.fleet"), route && route.panel === "fleet")}
|
|
507
508
|
${tab(settingsPath(), "settings", t("app.settings"), route && route.panel === "settings")}
|
|
508
509
|
</nav>`;
|
|
@@ -56,6 +56,7 @@ export function applyStatus(d) {
|
|
|
56
56
|
appStore.set({ ready: true, instances: d.instances, uptime: d.uptime ?? 0, exec, awaiting,
|
|
57
57
|
startup: d.startup?.phase === "starting" ? d.startup : null,
|
|
58
58
|
connections: typeof d.connections === "number" ? d.connections : null,
|
|
59
|
+
windowsCli: d.windows_cli === true,
|
|
59
60
|
// #1665: the host preferences' revision (app-prefs.js re-reads them when it moves).
|
|
60
61
|
prefsRev: typeof d.prefs_rev === "number" ? d.prefs_rev : null,
|
|
61
62
|
// #1629: the agents' themes' revision (app-themes.js re-reads them when it moves).
|
|
@@ -36,11 +36,13 @@
|
|
|
36
36
|
// #1918: traffic — a message between instances moved; delegation — a task opened, or its report closed it (SSE only: the
|
|
37
37
|
// org canvas reads /ui/traffic when it has no stream).
|
|
38
38
|
// #2233: backend_login — a dashboard sign-in started, moved or ended (no details: the page reads its own view).
|
|
39
|
+
// alpha.2 (M-2300): agent_proposals — an agent's Windows request came or was decided (no details: a web-only fleet's
|
|
40
|
+
// owner reads GET /ui/agent-proposals).
|
|
39
41
|
// tasks — the task board changed: the card numbers a write touched (SSE only: the board reads again when it is shown).
|
|
40
42
|
// offices — the stored offices changed ({ rev }; SSE only: the Office view reads /ui/offices again).
|
|
41
43
|
// office_skins — a skin pack was uploaded or deleted ({ rev }; SSE only: the Office view reads /ui/office-skins again).
|
|
42
44
|
// office_acts — the agents' live acts in the Office view changed ({ acts }, #2578; a poll page reads /ui/office-acts).
|
|
43
|
-
const EVENTS = ["status", "message", "agent_reply_live", "delivery", "deliveries", "prompt", "prompts", "prompt_resolved", "activity", "needs", "reply_buttons", "reactions", "steps_tick", "clock", "traffic", "delegation", "backend_login", "tasks", "offices", "office_skins", "office_acts", "office_pack_changes", "notice"];
|
|
45
|
+
const EVENTS = ["status", "message", "agent_reply_live", "delivery", "deliveries", "prompt", "prompts", "prompt_resolved", "activity", "needs", "reply_buttons", "reactions", "steps_tick", "clock", "traffic", "delegation", "backend_login", "tasks", "offices", "office_skins", "office_acts", "office_pack_changes", "agent_proposals", "notice"];
|
|
44
46
|
const MAX_HELD = 1000; // live events held during one catch-up read; more → read again afterwards
|
|
45
47
|
const RETRY_DELAYS = [1000, 2000, 4000]; // after the first failed catch-up read; then it waits for Retry
|
|
46
48
|
const POLL_LIMIT_MS = 10000; // a poll that has not answered by then counts as failed
|
package/dist/ui/shared/app.css
CHANGED
|
@@ -285,6 +285,14 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
285
285
|
.panel-title { flex: 1; min-width: 0; display: flex; align-items: center; gap: var(--s-3); min-height: calc(var(--header-h) - 2 * var(--s-1)); }
|
|
286
286
|
.panel-title h1 { font-size: var(--fs-lg); line-height: var(--lh-lg); font-weight: var(--fw-semibold); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; outline: none; }
|
|
287
287
|
.panel-sub { color: var(--text-2); font-size: var(--fs-sm); white-space: nowrap; }
|
|
288
|
+
/* S-30: on a phone the chat's state and chips (Windows, computer, model…) left the agent's name two letters. There the
|
|
289
|
+
header keeps the name (at least ~10 characters) and the state ("idle", "閒置"); the chips are on the sidebar row and
|
|
290
|
+
in Details. */
|
|
291
|
+
@media (max-width: 479px) {
|
|
292
|
+
.p-chat .panel-title h1 { flex: 0 1 auto; min-width: min(10ch, 45%); }
|
|
293
|
+
.p-chat .panel-sub { flex: 0 0 auto; }
|
|
294
|
+
.p-chat .panel-sub > :not(.status) { display: none; }
|
|
295
|
+
}
|
|
288
296
|
.status { display: inline-flex; align-items: center; gap: 6px; }
|
|
289
297
|
/* #2015: the largest processes, after the host memory chip's text. */
|
|
290
298
|
.host-mem-top { margin-left: var(--s-2); opacity: 0.8; overflow-wrap: anywhere; }
|
|
@@ -425,6 +433,9 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
425
433
|
/* #2072: a model field — the list, and the text box "Other…" opens under it. */
|
|
426
434
|
.model-pick { display: flex; flex-direction: column; gap: var(--s-1); min-width: 0; }
|
|
427
435
|
.model-pick > select, .model-pick > input { width: 100%; }
|
|
436
|
+
.model-catalog-status { display: flex; gap: var(--s-2); align-items: center; justify-content: space-between; }
|
|
437
|
+
.model-catalog-status > .note { line-height: 1.5; }
|
|
438
|
+
.model-catalog-status > button { flex-shrink: 0; }
|
|
428
439
|
.note { font-size: var(--fs-xs); color: var(--text-3); }
|
|
429
440
|
.checks { display: flex; flex-direction: column; gap: var(--s-1); max-height: 180px; overflow-y: auto; }
|
|
430
441
|
.check { display: flex; gap: var(--s-2); align-items: center; font-size: var(--fs-sm); }
|
|
@@ -936,6 +947,8 @@ img.amb-p { object-fit: contain; }
|
|
|
936
947
|
.failed-send { padding: var(--s-2) var(--s-3); border-radius: var(--r-md); font-size: var(--fs-xs); background: var(--danger-bg); border: 1px solid var(--danger-line); display: flex; gap: var(--s-2); align-items: center; flex-wrap: wrap; }
|
|
937
948
|
.failed-send .txt { flex: 1; min-width: 120px; white-space: pre-wrap; overflow-wrap: anywhere; max-height: 4.5em; overflow: hidden; }
|
|
938
949
|
.composer-box { background: var(--surface); border-radius: var(--r-xl); box-shadow: var(--shadow-1); }
|
|
950
|
+
/* S-30: a state note above the composer ("Connection revoked…", "still working") sat flush on the box's edge. */
|
|
951
|
+
.composer-box > .note { margin: 0; padding: var(--s-2) var(--s-3) 0; }
|
|
939
952
|
.composer-box:focus-within { box-shadow: 0 0 0 1px var(--border-strong), var(--shadow-1); }
|
|
940
953
|
.composer { display: flex; align-items: flex-end; gap: var(--s-1); padding: var(--s-2); }
|
|
941
954
|
.composer textarea {
|
|
@@ -2658,3 +2671,291 @@ html.oo-immersive .p-fleet > .panel-body { z-index: 50; }
|
|
|
2658
2671
|
.os-none { margin: 0; }
|
|
2659
2672
|
.os-form .os-err { grid-column: 1 / -1; margin: 0; padding: var(--s-2) var(--s-3); border: 1px solid var(--danger); border-radius: var(--r-sm); }
|
|
2660
2673
|
@media (max-width: 480px) { .os-form { grid-template-columns: 1fr; } }
|
|
2674
|
+
/* Windows CLI preview: local providers, a task composer and a compact execution history. */
|
|
2675
|
+
.p-windows-cli .windows-cli-content { width: 100%; max-width: 1160px; margin: 0 auto; padding: 28px 28px 48px; }
|
|
2676
|
+
.p-windows-cli .windows-cli-intro { display: flex; align-items: center; justify-content: space-between; gap: 20px; margin-bottom: 24px; }
|
|
2677
|
+
.p-windows-cli .windows-cli-eyebrow { display: inline-flex; align-items: center; gap: 6px; color: var(--text-2); font-size: 11px; font-weight: 600; letter-spacing: .06em; }
|
|
2678
|
+
.p-windows-cli .windows-cli-intro h2 { margin-top: 7px; font-size: 26px; font-weight: 600; line-height: 1.3; letter-spacing: -.04em; }
|
|
2679
|
+
.p-windows-cli .windows-cli-intro p { margin-top: 7px; font-size: 13px; color: var(--text-2); line-height: 1.7; }
|
|
2680
|
+
.p-windows-cli .windows-cli-probe { flex-shrink: 0; min-height: 38px; border-radius: 9px; }
|
|
2681
|
+
.p-windows-cli .windows-cli-cards { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; margin-bottom: 24px; }
|
|
2682
|
+
.p-windows-cli .windows-cli-provider { min-width: 0; padding: 20px 20px 0; border: 1px solid var(--border); border-radius: 14px; background: var(--bg); }
|
|
2683
|
+
.p-windows-cli .windows-cli-provider-head { display: flex; align-items: center; gap: 12px; }
|
|
2684
|
+
.p-windows-cli .windows-cli-brand { width: 48px; height: 48px; display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; border-radius: 12px; }
|
|
2685
|
+
.p-windows-cli .brand-openai { color: #fff; background: #141413; }
|
|
2686
|
+
.p-windows-cli .brand-anthropic { color: #141413; background: #f0e9df; }
|
|
2687
|
+
.p-windows-cli .windows-cli-provider-name { flex: 1; min-width: 0; }
|
|
2688
|
+
.p-windows-cli .windows-cli-provider-name > span { font-size: 11px; color: var(--text-2); }
|
|
2689
|
+
.p-windows-cli .windows-cli-provider-name h3 { font-size: 18px; line-height: 1.4; font-weight: 600; letter-spacing: -.025em; }
|
|
2690
|
+
.p-windows-cli .windows-cli-badge { display: inline-flex; align-items: center; flex-shrink: 0; padding: 3px 8px; border-radius: 6px; font-size: 11px; font-weight: 600; }
|
|
2691
|
+
.p-windows-cli .tone-ready { color: var(--ok); }
|
|
2692
|
+
.p-windows-cli .tone-neutral { color: var(--text-2); }
|
|
2693
|
+
.p-windows-cli .tone-failed { color: var(--danger); }
|
|
2694
|
+
.p-windows-cli .tone-working { color: var(--accent); }
|
|
2695
|
+
.p-windows-cli .windows-cli-badge.tone-ready { background: var(--ok-bg); }
|
|
2696
|
+
.p-windows-cli .windows-cli-badge.tone-neutral { background: var(--surface); }
|
|
2697
|
+
.p-windows-cli .windows-cli-provider-status { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 6px 14px; margin: 17px 0 14px; font-size: 12px; }
|
|
2698
|
+
.p-windows-cli .windows-cli-auth, .p-windows-cli .windows-cli-readiness, .p-windows-cli .windows-cli-task-state { display: inline-flex; align-items: center; gap: 7px; }
|
|
2699
|
+
.p-windows-cli .windows-cli-dot { width: 6px; height: 6px; border-radius: 50%; background: currentColor; flex-shrink: 0; }
|
|
2700
|
+
.p-windows-cli .windows-cli-version { color: var(--text-3); font-family: var(--font-mono); font-size: 11px; overflow-wrap: anywhere; }
|
|
2701
|
+
.p-windows-cli .windows-cli-location { border-top: 1px solid var(--border); }
|
|
2702
|
+
.p-windows-cli summary { cursor: pointer; list-style: none; }
|
|
2703
|
+
.p-windows-cli summary::-webkit-details-marker { display: none; }
|
|
2704
|
+
.p-windows-cli .windows-cli-location summary { display: flex; justify-content: space-between; align-items: center; min-height: 37px; color: var(--text-2); font-size: 11px; }
|
|
2705
|
+
.p-windows-cli details[open] > summary > .icon:last-child { transform: rotate(180deg); }
|
|
2706
|
+
.p-windows-cli .windows-cli-path { display: block; white-space: pre-wrap; overflow-wrap: anywhere; font: 11px/1.7 var(--font-mono); color: var(--text-2); }
|
|
2707
|
+
.p-windows-cli .windows-cli-location .windows-cli-path { padding: 0 0 12px; }
|
|
2708
|
+
.p-windows-cli .windows-cli-workbench { display: grid; grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr); align-items: start; gap: 20px; }
|
|
2709
|
+
.p-windows-cli .windows-cli-card { min-width: 0; border: 1px solid var(--border); border-radius: 14px; background: var(--bg); }
|
|
2710
|
+
.p-windows-cli .windows-cli-composer { padding: 22px; }
|
|
2711
|
+
.p-windows-cli .windows-cli-section-head { display: flex; align-items: center; gap: 10px; margin-bottom: 22px; }
|
|
2712
|
+
.p-windows-cli .windows-cli-section-icon { display: flex; align-items: center; justify-content: center; flex-shrink: 0; width: 34px; height: 34px; border-radius: 9px; background: var(--surface); color: var(--text-2); }
|
|
2713
|
+
.p-windows-cli .windows-cli-section-head > div { flex: 1; min-width: 0; }
|
|
2714
|
+
.p-windows-cli .windows-cli-section-head h2 { display: flex; align-items: center; gap: 7px; font-size: 15px; line-height: 1.4; font-weight: 600; letter-spacing: -.02em; }
|
|
2715
|
+
.p-windows-cli .windows-cli-section-head p { margin-top: 4px; color: var(--text-2); font-size: 11px; line-height: 1.6; }
|
|
2716
|
+
.p-windows-cli .windows-cli-field { margin-bottom: 18px; }
|
|
2717
|
+
.p-windows-cli .windows-cli-field > label, .p-windows-cli .windows-cli-access > legend { display: block; margin-bottom: 8px; font-size: 12px; font-weight: 600; }
|
|
2718
|
+
.p-windows-cli .windows-cli-field > input, .p-windows-cli .windows-cli-field > textarea { display: block; width: 100%; max-width: 100%; padding: 10px 12px; border: 1px solid var(--border-strong); border-radius: 8px; background: var(--bg); color: var(--text); font-size: var(--fs-sm); line-height: 1.6; }
|
|
2719
|
+
.p-windows-cli .windows-cli-field > input:focus, .p-windows-cli .windows-cli-field > textarea:focus { border-color: var(--focus); outline: none; box-shadow: 0 0 0 3px var(--accent-dim); }
|
|
2720
|
+
.p-windows-cli .windows-cli-field > textarea { min-height: 120px; resize: vertical; }
|
|
2721
|
+
.p-windows-cli .windows-cli-field .windows-cli-directory { font-family: var(--font-mono); font-size: var(--fs-xs); }
|
|
2722
|
+
.p-windows-cli .windows-cli-field > p { margin-top: 6px; font-size: 11px; line-height: 1.6; color: var(--text-3); }
|
|
2723
|
+
.p-windows-cli .windows-cli-field ::placeholder { color: var(--text-3); }
|
|
2724
|
+
.p-windows-cli .windows-cli-access-options { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
|
|
2725
|
+
.p-windows-cli .windows-cli-access-option { display: flex; align-items: flex-start; gap: 8px; padding: 11px 10px; border: 1px solid var(--border); border-radius: 9px; cursor: pointer; }
|
|
2726
|
+
.p-windows-cli .windows-cli-access-option.selected { background: var(--accent-dim); border-color: var(--focus); }
|
|
2727
|
+
.p-windows-cli .windows-cli-access-option input { margin: 3px 0 0; accent-color: var(--accent); width: 13px; height: 13px; flex-shrink: 0; }
|
|
2728
|
+
.p-windows-cli .windows-cli-access-option strong { display: flex; align-items: center; gap: 5px; font-size: 12px; line-height: 1.6; font-weight: 600; }
|
|
2729
|
+
.p-windows-cli .windows-cli-access-option small { display: block; margin-top: 3px; font-size: 10px; line-height: 1.6; color: var(--text-2); }
|
|
2730
|
+
.p-windows-cli .windows-cli-policy { margin-top: 14px; color: var(--text-2); font-size: 11px; }
|
|
2731
|
+
.p-windows-cli .windows-cli-policy summary { display: flex; align-items: center; gap: 6px; min-height: 28px; }
|
|
2732
|
+
.p-windows-cli .windows-cli-policy p { padding: 4px 0 10px; line-height: 1.8; }
|
|
2733
|
+
.p-windows-cli .windows-cli-submit { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 12px; padding-top: 16px; margin-top: 10px; border-top: 1px solid var(--border); }
|
|
2734
|
+
.p-windows-cli .windows-cli-readiness { font-size: 11px; line-height: 1.6; }
|
|
2735
|
+
.p-windows-cli .windows-cli-submit .btn { min-height: 40px; border-radius: 8px; }
|
|
2736
|
+
.p-windows-cli .windows-cli-limits { display: flex; align-items: center; gap: 5px; margin-top: 10px; color: var(--text-3); font-size: 10px; line-height: 1.6; }
|
|
2737
|
+
.p-windows-cli .windows-cli-history { padding: 22px 20px 0; }
|
|
2738
|
+
.p-windows-cli .windows-cli-history .windows-cli-section-head { margin-bottom: 18px; }
|
|
2739
|
+
.p-windows-cli .windows-cli-history .icon-btn { width: 30px; height: 30px; }
|
|
2740
|
+
.p-windows-cli .windows-cli-count { color: var(--text-2); background: var(--surface); padding: 1px 6px; border-radius: 5px; font-size: 10px; font-weight: 500; }
|
|
2741
|
+
.p-windows-cli .windows-cli-task { margin-top: 10px; border: 1px solid var(--border); border-radius: 9px; overflow: hidden; }
|
|
2742
|
+
.p-windows-cli .windows-cli-task > summary { display: flex; align-items: center; gap: 10px; padding: 12px; font-size: 12px; }
|
|
2743
|
+
.p-windows-cli .windows-cli-task > summary:hover { background: var(--surface); }
|
|
2744
|
+
.p-windows-cli .windows-cli-task-state { flex: 1; font-weight: 600; }
|
|
2745
|
+
.p-windows-cli .windows-cli-task time { font-size: 10px; color: var(--text-3); font-variant-numeric: tabular-nums; }
|
|
2746
|
+
.p-windows-cli .windows-cli-task-cwd { padding: 0 12px 12px; font-size: 10px; }
|
|
2747
|
+
.p-windows-cli .windows-cli-task-detail { padding: 0 12px 12px; }
|
|
2748
|
+
.p-windows-cli .windows-cli-output-label { display: flex; align-items: center; gap: 5px; padding: 9px 10px; border-radius: 6px 6px 0 0; background: var(--code-head); color: var(--text-2); font-size: 10px; }
|
|
2749
|
+
.p-windows-cli .windows-cli-output { padding: 12px; margin: 0; max-height: 320px; overflow: auto; border-radius: 0 0 6px 6px; background: var(--code-bg); white-space: pre-wrap; overflow-wrap: anywhere; font: 11px/1.8 var(--font-mono); }
|
|
2750
|
+
.p-windows-cli .windows-cli-task-detail > .btn { margin-top: 10px; }
|
|
2751
|
+
.p-windows-cli .windows-cli-history-note { margin-top: 18px; padding: 12px 0; border-top: 1px solid var(--border); color: var(--text-3); text-align: center; font-size: 10px; }
|
|
2752
|
+
.p-windows-cli .windows-cli-empty { display: flex; flex-direction: column; align-items: center; padding: 42px 16px; text-align: center; }
|
|
2753
|
+
.p-windows-cli .windows-cli-empty > span { display: grid; place-items: center; width: 58px; height: 58px; border-radius: 16px; background: var(--surface); color: var(--text-3); margin-bottom: 16px; }
|
|
2754
|
+
.p-windows-cli .windows-cli-empty h3 { font-size: 13px; font-weight: 600; }
|
|
2755
|
+
.p-windows-cli .windows-cli-empty p { max-width: 220px; margin-top: 7px; font-size: 12px; line-height: 1.8; color: var(--text-3); }
|
|
2756
|
+
.p-windows-cli .error { white-space: pre-wrap; overflow-wrap: anywhere; color: var(--danger); font-size: 12px; }
|
|
2757
|
+
.p-windows-cli .windows-cli-error { display: flex; align-items: flex-start; gap: 10px; margin-bottom: 20px; padding: 14px; border-radius: 10px; background: var(--danger-bg); }
|
|
2758
|
+
.p-windows-cli .windows-cli-error .icon { margin-top: 2px; }
|
|
2759
|
+
.p-windows-cli .windows-cli-spin { animation: windows-cli-rotate 1.4s linear infinite; }
|
|
2760
|
+
@keyframes windows-cli-rotate { to { transform: rotate(360deg); } }
|
|
2761
|
+
@media (max-width: 1130px) { .p-windows-cli .windows-cli-workbench { grid-template-columns: minmax(0, 1fr); } }
|
|
2762
|
+
@media (max-width: 620px) {
|
|
2763
|
+
.p-windows-cli .windows-cli-content { padding: 20px 16px 32px; }
|
|
2764
|
+
.p-windows-cli .windows-cli-intro { flex-direction: column; align-items: flex-start; gap: 14px; margin-bottom: 20px; }
|
|
2765
|
+
.p-windows-cli .windows-cli-intro h2 { font-size: 23px; }
|
|
2766
|
+
.p-windows-cli .windows-cli-cards { grid-template-columns: minmax(0, 1fr); gap: 12px; margin-bottom: 20px; }
|
|
2767
|
+
.p-windows-cli .windows-cli-provider { padding: 16px 16px 0; }
|
|
2768
|
+
.p-windows-cli .windows-cli-composer, .p-windows-cli .windows-cli-history { padding: 18px 16px; }
|
|
2769
|
+
.p-windows-cli .windows-cli-history { padding-bottom: 0; }
|
|
2770
|
+
.p-windows-cli .windows-cli-field > input, .p-windows-cli .windows-cli-field > textarea { font-size: 16px; }
|
|
2771
|
+
.p-windows-cli .windows-cli-submit { flex-direction: column; align-items: stretch; }
|
|
2772
|
+
.p-windows-cli .windows-cli-access-option { padding: 10px 8px; }
|
|
2773
|
+
.p-windows-cli .windows-cli-access-option strong { font-size: 11px; }
|
|
2774
|
+
}
|
|
2775
|
+
@media (prefers-reduced-motion: reduce) { .p-windows-cli .windows-cli-spin { animation: none; } }
|
|
2776
|
+
.p-windows-cli.windows-cli-settings .windows-cli-content { padding: 0; }
|
|
2777
|
+
.p-settings .col:has(> .windows-cli-settings) { max-width: 1160px; }
|
|
2778
|
+
.p-settings .windows-cli-settings .windows-cli-workbench { grid-template-columns: minmax(0, 1fr); }
|
|
2779
|
+
@media (min-width: 1500px) { .p-settings .windows-cli-settings .windows-cli-workbench { grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr); } }
|
|
2780
|
+
/* Runtime-first agent creation and native Windows conversations. */
|
|
2781
|
+
.agent-runtime-picker > legend, .agent-runtime-fields > legend { font-size: 13px; font-weight: 600; margin-bottom: 12px; }
|
|
2782
|
+
.agent-runtime-picker > div { display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); gap: 10px; }
|
|
2783
|
+
.agent-runtime-choice { display: flex; align-items: center; gap: 9px; padding: 14px 11px; border: 1px solid var(--border); border-radius: 10px; cursor: pointer; }
|
|
2784
|
+
.agent-runtime-choice.selected { border-color: var(--focus); background: var(--accent-dim); }
|
|
2785
|
+
.agent-runtime-choice > input { width: 13px; height: 13px; margin: 0; accent-color: var(--accent); flex-shrink: 0; }
|
|
2786
|
+
.agent-runtime-choice > span { min-width: 0; }
|
|
2787
|
+
.agent-runtime-choice strong { display: block; font-size: 12px; line-height: 1.6; }
|
|
2788
|
+
.agent-runtime-choice small { display: block; margin-top: 3px; color: var(--text-2); font-size: 10px; line-height: 1.6; }
|
|
2789
|
+
.agent-runtime-fields { border-top: 1px solid var(--border); padding-top: 14px; }
|
|
2790
|
+
.agent-draft-assistant { padding: 12px; border: 1px solid var(--border); border-radius: 9px; background: var(--surface); }
|
|
2791
|
+
.agent-draft-assistant > summary { display: flex; align-items: center; gap: 7px; font-size: 12px; font-weight: 600; cursor: pointer; }
|
|
2792
|
+
.agent-draft-assistant > .note { margin: 10px 0; font-size: 11px; }
|
|
2793
|
+
.agent-draft-assistant .btn { margin-top: 10px; }
|
|
2794
|
+
.agent-draft-assistant textarea { resize: vertical; }
|
|
2795
|
+
.windows-agent-nav { flex-shrink: 0; padding: 8px; border-top: 1px solid var(--border); max-height: 25vh; overflow: auto; }
|
|
2796
|
+
.windows-agent-nav h3 { padding: 0 12px 5px; color: var(--text-3); font-size: 11px; font-weight: 500; }
|
|
2797
|
+
.windows-agent-nav svg { flex-shrink: 0; }
|
|
2798
|
+
.p-windows-agent .windows-agent-conversation { max-width: 960px; }
|
|
2799
|
+
.windows-agent-identity { display: flex; align-items: center; gap: 12px; padding: 16px 0; border-bottom: 1px solid var(--border); margin-bottom: 16px; }
|
|
2800
|
+
.windows-agent-identity > span:first-child { display: grid; place-items: center; width: 44px; height: 44px; border-radius: 10px; color: white; background: #141413; flex-shrink: 0; }
|
|
2801
|
+
.windows-agent-identity > div { flex: 1; min-width: 0; }
|
|
2802
|
+
.windows-agent-identity strong { font-size: 13px; }
|
|
2803
|
+
.windows-agent-identity code { display: block; overflow-wrap: anywhere; color: var(--text-2); font: 11px/1.7 var(--font-mono); }
|
|
2804
|
+
.windows-agent-empty { display: flex; flex-direction: column; align-items: center; text-align: center; padding: 60px 12px; color: var(--text-2); }
|
|
2805
|
+
.windows-agent-empty h2 { margin: 18px 0 8px; color: var(--text); font-size: 20px; }
|
|
2806
|
+
.windows-agent-empty p { max-width: 400px; font-size: 13px; line-height: 1.8; }
|
|
2807
|
+
.windows-agent-turn { margin-bottom: 26px; }
|
|
2808
|
+
.windows-agent-human { padding: 14px 18px; margin-left: 15%; border-radius: 12px; background: var(--surface); }
|
|
2809
|
+
.windows-agent-human strong { font-size: 12px; }
|
|
2810
|
+
.windows-agent-human p { white-space: pre-wrap; overflow-wrap: anywhere; margin-top: 6px; }
|
|
2811
|
+
.windows-agent-reply { padding: 20px 0 0; }
|
|
2812
|
+
.windows-agent-reply > strong { display: flex; gap: 8px; align-items: center; font-size: 13px; }
|
|
2813
|
+
.windows-agent-reply pre { margin: 14px 0 7px; white-space: pre-wrap; overflow-wrap: anywhere; font: 13px/1.8 var(--font-mono); }
|
|
2814
|
+
.windows-agent-reply small { color: var(--text-3); font-size: 11px; }
|
|
2815
|
+
.windows-agent-composer { padding: 12px 24px 18px; border-top: 1px solid var(--border); }
|
|
2816
|
+
.windows-agent-composer > div, .windows-agent-composer > p { max-width: 900px; margin-left: auto; margin-right: auto; }
|
|
2817
|
+
.windows-agent-input { padding: 12px; background: var(--surface); border: 1px solid var(--border); border-radius: 12px; }
|
|
2818
|
+
.windows-agent-input > textarea { display: block; width: 100%; border: 0; resize: vertical; padding: 4px; background: transparent; color: var(--text); font-family: var(--font-ui); font-size: var(--fs-md); min-height: 60px; max-height: 180px; }
|
|
2819
|
+
.runtime-settings { max-width: 1080px; }
|
|
2820
|
+
.runtime-heading, .runtime-heading > div:last-child, .runtime-machine > header, .runtime-machine-actions { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
|
|
2821
|
+
.runtime-heading { justify-content: space-between; margin-bottom: 20px; }
|
|
2822
|
+
.runtime-heading h2, .runtime-machine h3 { margin: 0; }
|
|
2823
|
+
.runtime-local, .runtime-machine, .runtime-pairing { padding: 18px; margin: 16px 0; border: 1px solid var(--border); border-radius: 12px; background: var(--surface); }
|
|
2824
|
+
.runtime-local h3 { display: flex; align-items: center; gap: 8px; }
|
|
2825
|
+
/* M-2255: Settings → Runtime's switches. */
|
|
2826
|
+
.runtime-switches { padding: 18px; margin: 16px 0; border: 1px solid var(--border); border-radius: 12px; background: var(--surface); }
|
|
2827
|
+
.runtime-switches > h3 { margin: 0 0 6px; }
|
|
2828
|
+
.runtime-switch { padding: 12px 0; border-bottom: 1px solid var(--border); }
|
|
2829
|
+
.runtime-switch-row { display: flex; align-items: flex-start; gap: 12px; cursor: pointer; }
|
|
2830
|
+
.runtime-switch-row input { flex: none; width: 20px; height: 20px; margin: 2px 0 0; accent-color: var(--accent); }
|
|
2831
|
+
.runtime-switch-row input:disabled { cursor: not-allowed; }
|
|
2832
|
+
.runtime-switch-row > span { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
|
|
2833
|
+
.runtime-switch-row small { color: var(--text-3); font-size: var(--fs-sm); line-height: 1.5; overflow-wrap: anywhere; }
|
|
2834
|
+
.runtime-switch-env, .runtime-switch-pending { display: block; margin: 8px 0 0 32px; font-size: var(--fs-sm); }
|
|
2835
|
+
.runtime-switch-env { color: var(--warn); }
|
|
2836
|
+
.runtime-switches > .note { margin: 12px 0 0; font-size: var(--fs-sm); color: var(--text-3); }
|
|
2837
|
+
.runtime-guide { margin: 10px 0 0 32px; font-size: var(--fs-sm); }
|
|
2838
|
+
.runtime-guide > summary { cursor: pointer; font-weight: 600; padding: 4px 0; }
|
|
2839
|
+
.runtime-guide p { margin: 8px 0; line-height: 1.5; }
|
|
2840
|
+
/* A command wraps only between its words (never inside an address), so all of it is in view, on a phone too. */
|
|
2841
|
+
.runtime-guide pre { margin: 6px 0 10px; padding: 8px 10px; border-radius: 8px; background: var(--bg); overflow-x: auto; white-space: pre-wrap; overflow-wrap: normal; word-break: normal; max-width: 100%; }
|
|
2842
|
+
.runtime-guide-link { display: inline-flex; align-items: center; gap: 4px; color: var(--accent); text-decoration: underline; text-underline-offset: 2px; }
|
|
2843
|
+
.runtime-guide-warn { color: var(--warn); }
|
|
2844
|
+
.runtime-limit { display: flex; flex-direction: column; gap: 8px; padding: 12px 0; border-bottom: 1px solid var(--border); }
|
|
2845
|
+
.runtime-limit label { display: flex; flex-direction: column; gap: 4px; }
|
|
2846
|
+
.runtime-limit small { color: var(--text-3); font-size: var(--fs-sm); line-height: 1.5; }
|
|
2847
|
+
.runtime-limit > div { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
|
|
2848
|
+
.runtime-limit input { width: 6em; font-size: var(--fs-md); }
|
|
2849
|
+
@media (max-width: 600px) { .runtime-guide, .runtime-switch-env, .runtime-switch-pending { margin-left: 0; } }
|
|
2850
|
+
.runtime-machine > header > div { flex: 1; min-width: 140px; }
|
|
2851
|
+
.runtime-machine > header p, .runtime-machine .note { margin: 7px 0; font-size: var(--fs-sm); color: var(--text-3); }
|
|
2852
|
+
.runtime-machine-icon { display: grid; place-items: center; width: 42px; height: 42px; border-radius: 10px; background: var(--bg); }
|
|
2853
|
+
.runtime-status { padding: 4px 10px; border: 1px solid var(--border); border-radius: 20px; font-size: var(--fs-sm); }
|
|
2854
|
+
.runtime-status.is-online { color: var(--ok); }
|
|
2855
|
+
.runtime-status.is-pending { color: var(--warn); }
|
|
2856
|
+
.runtime-status.is-offline, .runtime-status.is-revoked { color: var(--text-3); }
|
|
2857
|
+
.runtime-machine-id { display: block; margin: 8px 0; overflow-wrap: anywhere; }
|
|
2858
|
+
.runtime-cli-list { padding: 0; margin: 14px 0; list-style: none; }
|
|
2859
|
+
.runtime-cli-list li { display: flex; align-items: center; gap: 10px; padding: 10px 0; border-bottom: 1px solid var(--border); }
|
|
2860
|
+
.runtime-cli-list li > span:nth-child(2) { flex: 1; }
|
|
2861
|
+
.runtime-cli-list small { display: block; color: var(--text-3); font-size: var(--fs-sm); }
|
|
2862
|
+
.runtime-machine-actions { margin-top: 14px; }
|
|
2863
|
+
/* S-30: the ZIP step is a button with its hint beside it (wrapping under it on a phone), not text flush against it. */
|
|
2864
|
+
.runtime-bundle-step { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; margin: 12px 0; }
|
|
2865
|
+
.runtime-bundle-step .note { margin: 0; flex: 1 1 220px; }
|
|
2866
|
+
.runtime-pairing label, .runtime-rename label { display: flex; flex-direction: column; gap: 7px; margin: 12px 0; }
|
|
2867
|
+
.runtime-pairing input, .runtime-rename input { width: 100%; min-width: 0; font-family: var(--font-ui); font-size: var(--fs-md); }
|
|
2868
|
+
.runtime-pair-code { letter-spacing: .14em; }
|
|
2869
|
+
.runtime-error { border: 1px solid var(--danger); padding: 12px; border-radius: 10px; overflow-wrap: anywhere; }
|
|
2870
|
+
.runtime-local-diagnostics { margin-top: 22px; }
|
|
2871
|
+
.runtime-local-diagnostics > summary { cursor: pointer; font-weight: 600; padding: 12px 0; }
|
|
2872
|
+
.runtime-remote-targets { display: grid; gap: 8px; margin-top: 16px; }
|
|
2873
|
+
.runtime-remote-targets h4 { margin: 0 0 4px; font-size: var(--fs-md); }
|
|
2874
|
+
.runtime-remote-targets .agent-runtime-choice { min-width: 0; width: 100%; }
|
|
2875
|
+
.runtime-manage-link { display: inline-block; margin-top: 12px; }
|
|
2876
|
+
.inst-machine { display: flex; gap: 5px; overflow: hidden; white-space: nowrap; font-size: var(--fs-xs); color: var(--text-3); }
|
|
2877
|
+
/* S-30: the machine name gives way; "Connection revoked" / "Offline" always stays readable. */
|
|
2878
|
+
.inst-machine-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
|
|
2879
|
+
.inst-machine-status { flex: none; }
|
|
2880
|
+
.inst-machine.offline, .runtime-machine-offline { color: var(--warn); }
|
|
2881
|
+
.runtime-machine-tag { max-width: 180px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
2882
|
+
@media (max-width: 600px) {
|
|
2883
|
+
.runtime-heading > div:last-child { width: 100%; }
|
|
2884
|
+
.runtime-machine, .runtime-pairing, .runtime-local { padding: 14px; }
|
|
2885
|
+
.runtime-cli-list li { flex-wrap: wrap; }
|
|
2886
|
+
.runtime-cli-list li > .note { width: 100%; }
|
|
2887
|
+
}
|
|
2888
|
+
.windows-agent-input > div { display: flex; justify-content: flex-end; gap: 8px; align-items: center; }
|
|
2889
|
+
.windows-agent-composer > .note { margin-top: 8px; font-size: 10px; }
|
|
2890
|
+
.p-windows-agent .error, .agent-draft-assistant .error { color: var(--danger); font-size: 12px; overflow-wrap: anywhere; }
|
|
2891
|
+
.windows-agent-blocked { padding: 16px; background: var(--warn-bg); border-radius: 10px; }
|
|
2892
|
+
.windows-agent-blocked p { margin-bottom: 12px; }
|
|
2893
|
+
@media (max-width: 620px) {
|
|
2894
|
+
.agent-runtime-choice { flex-wrap: wrap; padding: 12px; }
|
|
2895
|
+
.agent-runtime-choice > span { flex-basis: 100%; }
|
|
2896
|
+
.windows-agent-composer { padding: 10px 12px; }
|
|
2897
|
+
.windows-agent-identity { flex-wrap: wrap; }
|
|
2898
|
+
}
|
|
2899
|
+
/* Agent creation wizard: one active stage per screen, with persistent navigation actions. */
|
|
2900
|
+
.agent-create-wizard { display: flex; flex-direction: column; gap: 24px; }
|
|
2901
|
+
/* S-30: the body's top padding scrolled content through above the sticky steps (a phone showed card edges there); a
|
|
2902
|
+
background-coloured copy of the bar, shifted up, covers that strip. */
|
|
2903
|
+
.agent-create-steps { position: sticky; top: 0; z-index: 2; background: var(--bg); box-shadow: 0 calc(-1 * var(--s-5)) 0 var(--bg); display: flex; align-items: center; gap: 8px; padding-bottom: 20px; margin: 0; list-style: none; border-bottom: 1px solid var(--border); }
|
|
2904
|
+
.agent-create-steps > li { display: flex; align-items: center; gap: 7px; color: var(--text-3); font-size: 12px; min-width: 0; }
|
|
2905
|
+
.agent-create-steps > li:not(:last-child)::after { content: ""; width: 28px; height: 1px; background: var(--border); margin: 0 6px; }
|
|
2906
|
+
.agent-create-steps > li.current { color: var(--text); font-weight: 600; }
|
|
2907
|
+
.agent-create-step-number { display: grid; place-items: center; width: 22px; height: 22px; flex-shrink: 0; border: 1px solid var(--border-strong); border-radius: 50%; font-size: 11px; }
|
|
2908
|
+
.agent-create-steps .current .agent-create-step-number { color: var(--on-accent); background: var(--accent-fill); border-color: var(--accent-fill); }
|
|
2909
|
+
.agent-create-steps .complete .agent-create-step-number { color: var(--ok); border-color: var(--ok); background: var(--ok-bg); }
|
|
2910
|
+
.agent-create-stage { display: flex; flex-direction: column; gap: 18px; min-width: 0; }
|
|
2911
|
+
.agent-create-stage > h3 { margin: 0; font-size: 21px; font-weight: 600; line-height: 1.4; letter-spacing: -.025em; }
|
|
2912
|
+
.agent-create-stage > h3:focus { outline: none; }
|
|
2913
|
+
.agent-create-stage > .note { margin-top: -12px; font-size: 12px; line-height: 1.8; }
|
|
2914
|
+
.agent-create-cli { padding: 16px; background: var(--surface); border: 1px solid var(--border); border-radius: 10px; }
|
|
2915
|
+
.agent-create-cli .field { margin: 0; }
|
|
2916
|
+
.agent-create-selection { display: flex; align-items: center; gap: 12px; padding: 12px 14px; border: 1px solid var(--border); border-radius: 10px; background: var(--surface); }
|
|
2917
|
+
.agent-create-selection > div { flex: 1; min-width: 0; }
|
|
2918
|
+
.agent-create-selection strong { display: block; font-size: 12px; }
|
|
2919
|
+
.agent-create-selection span { display: block; color: var(--text-2); font-size: 11px; overflow-wrap: anywhere; }
|
|
2920
|
+
.agent-create-wizard .agent-runtime-fields { padding-top: 0; border-top: 0; }
|
|
2921
|
+
.agent-create-success { align-items: center; text-align: center; padding: 18px 0 8px; }
|
|
2922
|
+
.agent-create-success-icon { display: grid; place-items: center; width: 64px; height: 64px; color: var(--ok); background: var(--ok-bg); border-radius: 50%; }
|
|
2923
|
+
.agent-create-success dl { display: grid; grid-template-columns: max-content minmax(0,1fr); gap: 12px 20px; width: 100%; margin: 0; padding: 18px; border: 1px solid var(--border); border-radius: 10px; text-align: left; font-size: 13px; }
|
|
2924
|
+
.agent-create-success dt { color: var(--text-2); }
|
|
2925
|
+
.agent-create-success dd { margin: 0; overflow-wrap: anywhere; }
|
|
2926
|
+
.agent-create-success code { font-family: var(--font-mono); font-size: 12px; }
|
|
2927
|
+
@media (max-width: 620px) {
|
|
2928
|
+
.agent-create-steps { gap: 6px; }
|
|
2929
|
+
.agent-create-steps > li { gap: 5px; font-size: 11px; }
|
|
2930
|
+
.agent-create-steps > li:not(:last-child)::after { width: 12px; margin: 0 2px; }
|
|
2931
|
+
.agent-create-selection { gap: 8px; padding: 10px; }
|
|
2932
|
+
.agent-create-selection .btn { padding: 0 8px; }
|
|
2933
|
+
.agent-create-stage > h3 { font-size: 20px; }
|
|
2934
|
+
}
|
|
2935
|
+
.cli-picker { width: 100%; min-width: 0; }
|
|
2936
|
+
.cli-picker-trigger { display: flex; align-items: center; gap: 10px; width: 100%; min-height: 40px; padding: 8px 12px; border: 1px solid var(--border-strong); border-radius: var(--r-sm); background: var(--surface); color: var(--text); font: inherit; text-align: left; cursor: pointer; }
|
|
2937
|
+
.cli-picker-trigger:hover:not(:disabled) { border-color: var(--accent); }
|
|
2938
|
+
.cli-picker-trigger:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
|
|
2939
|
+
.cli-picker-trigger:disabled { opacity: .5; cursor: not-allowed; }
|
|
2940
|
+
.cli-product-mark { display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto; line-height: 0; }
|
|
2941
|
+
.cli-product-mark svg, .cli-product-mark img { display: block; flex-shrink: 0; }
|
|
2942
|
+
.cli-picker-value { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
2943
|
+
.cli-picker-chevron { display: inline-flex; color: var(--text-3); }
|
|
2944
|
+
.cli-picker .menu-list { left: 0; right: 0; min-width: 0; max-height: 280px; overflow-y: auto; }
|
|
2945
|
+
.cli-picker .menu-list.menu-up { top: auto; bottom: calc(100% + 6px); }
|
|
2946
|
+
.cli-picker .menu-list.menu-compact { max-height: 180px; }
|
|
2947
|
+
.cli-picker .menu-list.menu-short { max-height: 96px; }
|
|
2948
|
+
.cli-picker .menu-item { padding-top: 8px; padding-bottom: 8px; }
|
|
2949
|
+
.cli-picker .menu-radio > span:last-child { flex: 1; min-width: 0; }
|
|
2950
|
+
.cli-picker-option { display: flex; align-items: center; gap: 10px; min-width: 0; }
|
|
2951
|
+
.cli-picker-copy { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
|
|
2952
|
+
.cli-picker-description { color: var(--text-2); font-size: var(--fs-xs); line-height: 1.4; }
|
|
2953
|
+
.cli-discovery-heading { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 32px; }
|
|
2954
|
+
.cli-discovery-status { display: flex; align-items: flex-start; gap: 12px; padding: 14px; border: 1px solid var(--border); border-radius: var(--r-sm); background: var(--surface); }
|
|
2955
|
+
.cli-discovery-status > .out-spin { flex: 0 0 16px; width: 16px; height: 16px; margin-top: 3px; color: var(--accent); }
|
|
2956
|
+
.cli-discovery-status > div { min-width: 0; }
|
|
2957
|
+
.cli-discovery-status strong { display: block; font-size: var(--fs-sm); line-height: 1.5; }
|
|
2958
|
+
.cli-discovery-status p, .cli-discovery-status small { display: block; color: var(--text-2); font-size: var(--fs-xs); line-height: 1.6; margin: 4px 0 0; overflow-wrap: anywhere; }
|
|
2959
|
+
.cli-discovery-status .btn { margin-top: 10px; }
|
|
2960
|
+
.cli-discovery-status.is-error { border-color: var(--border-strong); }
|
|
2961
|
+
.cli-discovery-status.is-error > svg { flex: 0 0 auto; margin-top: 2px; }
|
package/dist/ui/shared/app.js
CHANGED
|
@@ -85,6 +85,8 @@ if (mode === "full") {
|
|
|
85
85
|
let chatLoads = 0;
|
|
86
86
|
panels.set("chat", { load: () => (chatLoads++ === 0 ? chatBoot : loadChat()).then((m) => m.ChatPanel) });
|
|
87
87
|
if (!guest) {
|
|
88
|
+
const loadWindowsAgent = retryable((a) => import(retryUrl("/ui/js/panel-windows-agent.js", a)));
|
|
89
|
+
panels.set("windows-agent", { load: () => loadWindowsAgent().then((m) => m.WindowsAgentPanel) });
|
|
88
90
|
panels.set("fleet", { load: () => loadFleet().then((m) => m.FleetPanel) });
|
|
89
91
|
panels.set("settings", { load: () => loadSettings().then((m) => m.SettingsPanel) });
|
|
90
92
|
// #2347: the restart banner's Restart now, in any panel — the Settings runner (behind the session) does it.
|
|
@@ -120,6 +122,8 @@ if (mode === "full") {
|
|
|
120
122
|
startNeedsNotifier({ open: (instance) => navigate(chatPath(instance)) });
|
|
121
123
|
// #2233: a backend sign-in running anywhere is shown on every admin page (the module lives behind the session gate).
|
|
122
124
|
import("/ui/js/backend-signin.js").then((m) => m.installSignIn(), () => {});
|
|
125
|
+
// alpha.2 (M-2300): an agent's Windows request waiting for a web-only fleet's owner — counted in Needs you everywhere.
|
|
126
|
+
import("/ui/js/agent-proposals.js").then((m) => m.installProposals(), () => {});
|
|
123
127
|
}
|
|
124
128
|
// #1665: this device's first upload of its own choices (once), then another device's changes at each status frame.
|
|
125
129
|
// A guest's page (#2855) uploads and saves only its own keys (prefsWritable(key)); another device's changes reach it at
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
// Fleet read (#1300: no style attribute). View's terminal multiplies its fitted size by VIEW_SCALE, as its density did.
|
|
8
8
|
import { html, useEffect, useState } from "./app-html.js";
|
|
9
9
|
import { t } from "./app-i18n.js";
|
|
10
|
-
import { createStore, useStore } from "./app-store.js";
|
|
10
|
+
import { appStore, createStore, useStore } from "./app-store.js";
|
|
11
11
|
import { Icon } from "./ui-icons.js";
|
|
12
12
|
import { UsageBody, UsageCompactToggle, UsageDialog } from "./usage-dialog.js";
|
|
13
13
|
|
|
@@ -124,7 +124,9 @@ export function useRailWidth() {
|
|
|
124
124
|
export function UsageRail({ route }) {
|
|
125
125
|
const wide = useRailWidth();
|
|
126
126
|
const { open } = useStore(usageRailStore);
|
|
127
|
-
|
|
127
|
+
const { instances = [] } = useStore(appStore);
|
|
128
|
+
const instance = instances.find(item => item.name === route?.instance);
|
|
129
|
+
if (!wide || !open || !route || !RAIL_PANELS.includes(route.panel) || !usageOffered() || instance?.capabilities?.usage === false) return null;
|
|
128
130
|
return html`<aside data-trust="usage" class="u-rail" aria-label=${t("view.usage.title_plain")}>
|
|
129
131
|
<div class="u-rail-head"><h2>${t("view.usage.title")}</h2><${UsageCompactToggle} />
|
|
130
132
|
<button type="button" class="icon-btn" onClick=${() => setUsageRail(false)} aria-label=${t("app.usageHide")} title=${t("app.usageHide")}><${Icon} name="close" size=${16} /></button></div>
|
|
@@ -154,8 +156,8 @@ export function UsageButton({ navKey }) {
|
|
|
154
156
|
}
|
|
155
157
|
|
|
156
158
|
/** The shared controls, in the one order every page uses. `navKey`: the page's navigation (the usage dialog's owner). */
|
|
157
|
-
export function HeaderTools({ view = false, navKey }) {
|
|
158
|
-
return html`<${TextSizeButton} view=${view}
|
|
159
|
+
export function HeaderTools({ view = false, navKey, usage = true }) {
|
|
160
|
+
return html`<${TextSizeButton} view=${view} />${usage ? html`<${UsageButton} navKey=${navKey} />` : null}`;
|
|
159
161
|
}
|
|
160
162
|
/** Where a page with no control of its own after the shared ones (Log) keeps the room Chat's ⋯ takes: the same box on every tab. */
|
|
161
163
|
export function HeaderSlot() {
|