@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
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/** Main-loop-owned local Windows relay. Process death detaches; terminal ownership is never inferred from a PID. */
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { PaneStdioFramer, paneStdioInput, paneStdioOutput, PANE_STDIO_LIMIT } from "./runtime-pane-stdio-protocol.js";
|
|
4
|
+
import { validateRuntimePaneShutdown } from "./runtime-pane-protocol.js";
|
|
5
|
+
export class LocalPaneEndpoint {
|
|
6
|
+
options;
|
|
7
|
+
machineId = "local";
|
|
8
|
+
attachment = randomUUID();
|
|
9
|
+
child;
|
|
10
|
+
connected = false;
|
|
11
|
+
stopped = false;
|
|
12
|
+
mcpPending = 0;
|
|
13
|
+
cleanupOnly = false;
|
|
14
|
+
lastLease = 0;
|
|
15
|
+
pending = new Map();
|
|
16
|
+
listeners = new Set();
|
|
17
|
+
interval;
|
|
18
|
+
hostBootId;
|
|
19
|
+
constructor(options) {
|
|
20
|
+
this.options = options;
|
|
21
|
+
}
|
|
22
|
+
static async open(options) {
|
|
23
|
+
const endpoint = new LocalPaneEndpoint(options);
|
|
24
|
+
options.admit();
|
|
25
|
+
const child = await options.launch();
|
|
26
|
+
endpoint.child = child;
|
|
27
|
+
try {
|
|
28
|
+
options.admit();
|
|
29
|
+
await endpoint.attach(child);
|
|
30
|
+
options.admit();
|
|
31
|
+
return endpoint;
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
endpoint.stop();
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
online() { if (this.stopped || !this.connected || performance.now() - this.lastLease >= 15_000)
|
|
39
|
+
return false; if (this.cleanupOnly)
|
|
40
|
+
return true; try {
|
|
41
|
+
this.options.admit();
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return false;
|
|
46
|
+
} }
|
|
47
|
+
/** Irreversible transport drain: only exact snapshot/close RPC remains; no new helper work or input. */
|
|
48
|
+
beginCleanup() { this.cleanupOnly = true; }
|
|
49
|
+
epoch() { return this.online() ? this.attachment : null; }
|
|
50
|
+
version(provider) { return this.options.version(provider); }
|
|
51
|
+
subscribe(listener) { this.listeners.add(listener); return () => this.listeners.delete(listener); }
|
|
52
|
+
send(value) {
|
|
53
|
+
if (this.stopped || !this.child?.stdin?.writable)
|
|
54
|
+
throw Error("Local pane relay is disconnected");
|
|
55
|
+
const frame = JSON.stringify(paneStdioInput(value)) + "\n";
|
|
56
|
+
if (Buffer.byteLength(frame) > PANE_STDIO_LIMIT + 1 || this.child.stdin.writableLength + Buffer.byteLength(frame) > PANE_STDIO_LIMIT * 2)
|
|
57
|
+
throw Error("Local pane relay backpressure");
|
|
58
|
+
this.child.stdin.write(frame);
|
|
59
|
+
}
|
|
60
|
+
attach(child) {
|
|
61
|
+
return new Promise((resolve, reject) => {
|
|
62
|
+
if (!child.stdin || !child.stdout) {
|
|
63
|
+
reject(Error("Local pane relay streams are unavailable"));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const framer = new PaneStdioFramer();
|
|
67
|
+
let ready = false;
|
|
68
|
+
const timer = setTimeout(() => { reject(Error("Local pane relay startup unconfirmed")); this.stop(); }, 125_000);
|
|
69
|
+
timer.unref();
|
|
70
|
+
const lost = () => { clearTimeout(timer); if (!ready)
|
|
71
|
+
reject(Error("Local pane relay startup unconfirmed")); this.stop(); };
|
|
72
|
+
child.once("error", lost);
|
|
73
|
+
child.once("exit", lost);
|
|
74
|
+
child.stdout?.once("end", lost);
|
|
75
|
+
child.stdout?.once("close", lost);
|
|
76
|
+
child.stdin?.on("error", lost);
|
|
77
|
+
let told = 0;
|
|
78
|
+
child.stderr?.setEncoding?.("utf8");
|
|
79
|
+
child.stderr?.on("data", (part) => { if (told >= 8_192 || !this.options.diagnostic)
|
|
80
|
+
return; const text = String(part).replace(/[\p{Cc}\p{Cf}]+/gu, " ").trim().slice(0, 8_192 - told); told += text.length; if (text)
|
|
81
|
+
try {
|
|
82
|
+
this.options.diagnostic(text);
|
|
83
|
+
}
|
|
84
|
+
catch { /* a diagnostic never affects the relay */ } });
|
|
85
|
+
child.stdout?.on("data", (bytes) => {
|
|
86
|
+
try {
|
|
87
|
+
framer.feed(bytes, raw => {
|
|
88
|
+
const value = paneStdioOutput(raw);
|
|
89
|
+
if (value.epoch !== this.attachment)
|
|
90
|
+
throw Error("Local pane relay epoch differs");
|
|
91
|
+
if (!ready) {
|
|
92
|
+
if (value.type !== "hello")
|
|
93
|
+
throw Error("Local pane relay not ready");
|
|
94
|
+
this.hostBootId = value.hostBootId;
|
|
95
|
+
ready = true;
|
|
96
|
+
clearTimeout(timer);
|
|
97
|
+
this.connected = true;
|
|
98
|
+
this.lastLease = performance.now();
|
|
99
|
+
this.lease();
|
|
100
|
+
this.interval = setInterval(() => this.lease(), 5000);
|
|
101
|
+
this.interval.unref();
|
|
102
|
+
resolve();
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (value.type === "hello")
|
|
106
|
+
throw Error("Duplicate local pane hello");
|
|
107
|
+
if (value.type === "output") {
|
|
108
|
+
for (const listener of this.listeners)
|
|
109
|
+
listener({ type: "pane", machineId: "local", pane: value.snapshot });
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (value.type === "response") {
|
|
113
|
+
const row = this.pending.get(value.id);
|
|
114
|
+
if (!row)
|
|
115
|
+
return;
|
|
116
|
+
this.pending.delete(value.id);
|
|
117
|
+
clearTimeout(row.timer);
|
|
118
|
+
if (value.ok)
|
|
119
|
+
row.resolve(value.result);
|
|
120
|
+
else
|
|
121
|
+
row.reject(Error("Local pane operation unconfirmed; inspect its owned receipt"));
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
if (this.cleanupOnly) {
|
|
125
|
+
this.send({ type: "mcp.result", epoch: this.attachment, id: value.id, ok: false });
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (this.mcpPending >= 32)
|
|
129
|
+
throw Error("Local pane MCP backlog");
|
|
130
|
+
this.mcpPending++;
|
|
131
|
+
const current = () => !this.cleanupOnly && this.online();
|
|
132
|
+
void this.options.mcp(value.body, current).then(result => { if (current())
|
|
133
|
+
this.send({ type: "mcp.result", epoch: this.attachment, id: value.id, ok: true, result }); }, () => { if (current())
|
|
134
|
+
this.send({ type: "mcp.result", epoch: this.attachment, id: value.id, ok: false }); }).catch(() => this.stop()).finally(() => { this.mcpPending--; });
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
lost();
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
try {
|
|
142
|
+
this.send({ type: "init", scope: this.options.scope, epoch: this.attachment, maxAgents: this.options.maxAgents() });
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
clearTimeout(timer);
|
|
146
|
+
reject(error);
|
|
147
|
+
this.stop();
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
lease() { if (this.stopped)
|
|
152
|
+
return; if (!this.online()) {
|
|
153
|
+
this.stop();
|
|
154
|
+
return;
|
|
155
|
+
} this.lastLease = performance.now(); try {
|
|
156
|
+
this.send({ type: "lease", epoch: this.attachment, online: this.online(), maxAgents: this.options.maxAgents() });
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
this.stop();
|
|
160
|
+
} }
|
|
161
|
+
call(request) {
|
|
162
|
+
if (this.cleanupOnly && !["snapshot", "close", "list", "shutdown"].includes(request.action))
|
|
163
|
+
return Promise.reject(Error("Local pane relay only permits owned cleanup"));
|
|
164
|
+
if (!this.online() || this.pending.size >= 64)
|
|
165
|
+
return Promise.reject(Error("Local pane relay unavailable or busy"));
|
|
166
|
+
return new Promise((resolve, reject) => { const id = randomUUID(), timer = setTimeout(() => { this.pending.delete(id); reject(Error("Local pane result unconfirmed; input was not replayed")); }, 125_000); timer.unref(); this.pending.set(id, { resolve, reject, timer }); try {
|
|
167
|
+
this.send({ type: "request", epoch: this.attachment, id, request });
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
clearTimeout(timer);
|
|
171
|
+
this.pending.delete(id);
|
|
172
|
+
reject(error);
|
|
173
|
+
} });
|
|
174
|
+
}
|
|
175
|
+
/** Explicit switch-off only. The host independently refuses while any launch or outcome remains unconfirmed. */
|
|
176
|
+
async shutdownHost() {
|
|
177
|
+
if (!this.cleanupOnly || !this.hostBootId)
|
|
178
|
+
throw Error("Local pane host shutdown lacks a cleanup owner");
|
|
179
|
+
validateRuntimePaneShutdown(await this.call({ action: "shutdown", hostBootId: this.hostBootId }), this.hostBootId);
|
|
180
|
+
}
|
|
181
|
+
/** Only close stdio; never signal a Windows process or close a terminal here. */
|
|
182
|
+
stop() { if (this.stopped)
|
|
183
|
+
return; this.stopped = true; this.connected = false; clearInterval(this.interval); this.child?.stdin?.end(); this.child?.stdout?.destroy(); this.child?.stderr?.destroy(); for (const row of this.pending.values()) {
|
|
184
|
+
clearTimeout(row.timer);
|
|
185
|
+
row.reject(Error("Local pane relay detached; process state is retained"));
|
|
186
|
+
} this.pending.clear(); for (const listener of this.listeners)
|
|
187
|
+
listener({ type: "machine", machineId: "local" }); this.listeners.clear(); }
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=local-pane-endpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-pane-endpoint.js","sourceRoot":"","sources":["../src/local-pane-endpoint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/** Stage only the verified shipped code bundle. Never enumerate a provider home or copy login material. */
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { mkdir, mkdtemp, writeFile, rm } from "node:fs/promises";
|
|
4
|
+
import { dirname, join, win32 } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { promisify } from "node:util";
|
|
7
|
+
import { execFile, spawn } from "./child-process.js";
|
|
8
|
+
import { createRuntimeBundle } from "./runtime-bundle.js";
|
|
9
|
+
import { admitLocalWindowsCli } from "./windows-cli.js";
|
|
10
|
+
import { nativeCliEnvironment, validWindowsDirectory } from "./windows-cli-worker.js";
|
|
11
|
+
const exec = promisify(execFile);
|
|
12
|
+
export const localPaneScope = (home) => createHash("sha256").update(home).digest("hex");
|
|
13
|
+
export async function launchLocalPaneRelay(home, admit = admitLocalWindowsCli) {
|
|
14
|
+
admit();
|
|
15
|
+
if (process.platform !== "linux" && process.platform !== "win32")
|
|
16
|
+
throw Error("Local Windows panes require Windows or WSL");
|
|
17
|
+
const code = dirname(fileURLToPath(import.meta.url)), powershell = process.platform === "win32" ? join(process.env.SystemRoot || "C:\\Windows", "System32", "WindowsPowerShell", "v1.0", "powershell.exe") : "/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe";
|
|
18
|
+
const convert = async (path, direction) => process.platform === "win32" ? path : String((await exec("wslpath", [direction, path], { timeout: 5000, maxBuffer: 8192, encoding: "utf8" })).stdout).trim();
|
|
19
|
+
await mkdir(home, { recursive: true, mode: 0o700 });
|
|
20
|
+
const temporary = await mkdtemp(join(home, "pane-code-"));
|
|
21
|
+
try {
|
|
22
|
+
const bundle = createRuntimeBundle(), archive = join(temporary, "runtime.zip");
|
|
23
|
+
await writeFile(archive, bundle.bytes, { mode: 0o600 });
|
|
24
|
+
const [script, zip] = await Promise.all([convert(join(code, "local-pane-stage.ps1"), "-w"), convert(archive, "-w")]);
|
|
25
|
+
admit();
|
|
26
|
+
const staged = await exec(powershell, ["-NoProfile", "-NonInteractive", "-ExecutionPolicy", "Bypass", "-File", script, "-Archive", zip, "-Sha256", bundle.sha256, "-Scope", localPaneScope(home)], { env: nativeCliEnvironment(), timeout: 120_000, maxBuffer: 8192, encoding: "utf8", windowsHide: true });
|
|
27
|
+
const value = JSON.parse(String(staged.stdout).trim());
|
|
28
|
+
if (!value || Object.keys(value).sort().join(",") !== "node,relay" || !validWindowsDirectory(value.node) || !validWindowsDirectory(value.relay) || win32.basename(value.node).toLowerCase() !== "node.exe" || win32.basename(value.relay) !== "runtime-pane-stdio.js")
|
|
29
|
+
throw Error("Staged Windows pane code could not be verified");
|
|
30
|
+
const node = await convert(value.node, "-u");
|
|
31
|
+
admit();
|
|
32
|
+
return spawn(node, [value.relay], { env: nativeCliEnvironment(), shell: false, windowsHide: true, stdio: ["pipe", "pipe", "pipe"] });
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
await rm(temporary, { recursive: true, force: true });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=local-pane-launcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-pane-launcher.js","sourceRoot":"","sources":["../src/local-pane-launcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
param(
|
|
2
|
+
[Parameter(Mandatory=$true)][string]$Archive,
|
|
3
|
+
[Parameter(Mandatory=$true)][ValidatePattern('^[a-f0-9]{64}$')][string]$Sha256,
|
|
4
|
+
[Parameter(Mandatory=$true)][ValidatePattern('^[a-f0-9]{64}$')][string]$Scope
|
|
5
|
+
)
|
|
6
|
+
$ErrorActionPreference = 'Stop'
|
|
7
|
+
[Console]::OutputEncoding = [Text.UTF8Encoding]::new($false)
|
|
8
|
+
function Real-Directory([string]$Path) {
|
|
9
|
+
$entry = Get-Item -LiteralPath $Path -Force
|
|
10
|
+
if (-not $entry.PSIsContainer -or ($entry.Attributes -band [IO.FileAttributes]::ReparsePoint)) { throw 'Unsafe pane code directory' }
|
|
11
|
+
}
|
|
12
|
+
function Private-Directory([string]$Path) {
|
|
13
|
+
[IO.Directory]::CreateDirectory($Path) | Out-Null
|
|
14
|
+
Real-Directory $Path
|
|
15
|
+
$user = [Security.Principal.WindowsIdentity]::GetCurrent().User
|
|
16
|
+
$acl = [Security.AccessControl.DirectorySecurity]::new()
|
|
17
|
+
$directory = [IO.DirectoryInfo]::new($Path)
|
|
18
|
+
if ($directory.GetAccessControl([Security.AccessControl.AccessControlSections]::Owner).GetOwner([Security.Principal.SecurityIdentifier]).Value -ne $user.Value) { throw 'Pane code directory has a different owner' }
|
|
19
|
+
$acl.SetAccessRuleProtection($true,$false)
|
|
20
|
+
foreach ($sid in @($user,[Security.Principal.SecurityIdentifier]::new('S-1-5-18'))) {
|
|
21
|
+
$acl.AddAccessRule([Security.AccessControl.FileSystemAccessRule]::new($sid,'FullControl','ContainerInherit,ObjectInherit','None','Allow'))
|
|
22
|
+
}
|
|
23
|
+
$directory.SetAccessControl($acl)
|
|
24
|
+
}
|
|
25
|
+
if (-not $env:LOCALAPPDATA -or -not [IO.Path]::IsPathRooted($env:LOCALAPPDATA)) { throw 'Windows local application-data directory is unavailable' }
|
|
26
|
+
$parent = [IO.Path]::GetFullPath($env:LOCALAPPDATA)
|
|
27
|
+
for ($walk = Get-Item -LiteralPath $parent -Force; $walk; $walk = $walk.Parent) { Real-Directory $walk.FullName }
|
|
28
|
+
foreach ($leaf in @('AgEnD','p',$Scope.Substring(0,16),'b')) { $parent = Join-Path $parent $leaf; Private-Directory $parent }
|
|
29
|
+
$destination = Join-Path $parent $Sha256.Substring(0,16)
|
|
30
|
+
$temporary = Join-Path $parent ([Guid]::NewGuid().ToString('N'))
|
|
31
|
+
$archiveEntry = Get-Item -LiteralPath $Archive -Force
|
|
32
|
+
if ($archiveEntry.PSIsContainer -or ($archiveEntry.Attributes -band [IO.FileAttributes]::ReparsePoint) -or $archiveEntry.Length -gt 8388608) { throw 'Unsafe pane code archive' }
|
|
33
|
+
$bytes = [IO.File]::ReadAllBytes($Archive)
|
|
34
|
+
$hash = [Security.Cryptography.SHA256]::Create()
|
|
35
|
+
function Digest([byte[]]$Value) { return [BitConverter]::ToString($hash.ComputeHash($Value)).Replace('-','').ToLowerInvariant() }
|
|
36
|
+
if ((Digest $bytes) -cne $Sha256) { throw 'Pane code archive checksum differs' }
|
|
37
|
+
Add-Type -AssemblyName System.IO.Compression
|
|
38
|
+
$memory = [IO.MemoryStream]::new($bytes,$false)
|
|
39
|
+
$zip = [IO.Compression.ZipArchive]::new($memory,[IO.Compression.ZipArchiveMode]::Read)
|
|
40
|
+
$exists = Test-Path -LiteralPath $destination
|
|
41
|
+
if ($exists) {
|
|
42
|
+
Real-Directory $destination
|
|
43
|
+
$marker = Get-Item -LiteralPath (Join-Path $destination 'bundle.sha256') -Force
|
|
44
|
+
if ($marker.PSIsContainer -or ($marker.Attributes -band [IO.FileAttributes]::ReparsePoint) -or $marker.Length -ne 64 -or [IO.File]::ReadAllText($marker.FullName) -cne $Sha256) { throw 'Staged pane bundle identity differs' }
|
|
45
|
+
} else { Private-Directory $temporary }
|
|
46
|
+
try {
|
|
47
|
+
$seen = [Collections.Generic.HashSet[string]]::new([StringComparer]::OrdinalIgnoreCase)
|
|
48
|
+
$total = 0
|
|
49
|
+
if ($zip.Entries.Count -gt 512) { throw 'Pane code archive has too many entries' }
|
|
50
|
+
foreach ($entry in $zip.Entries) {
|
|
51
|
+
if ($entry.FullName -notmatch '^agend-runtime/[A-Za-z0-9_@./-]+$' -or $entry.FullName.Contains('..') -or $entry.FullName.EndsWith('/') -or -not $seen.Add($entry.FullName) -or $entry.Length -gt 2097152) { throw 'Unsafe pane code archive entry' }
|
|
52
|
+
$total += $entry.Length
|
|
53
|
+
if ($total -gt 8388608) { throw 'Pane code archive is too large' }
|
|
54
|
+
$stream = $entry.Open(); $content = [IO.MemoryStream]::new()
|
|
55
|
+
try { $buffer = [byte[]]::new(65536); while (($count = $stream.Read($buffer,0,$buffer.Length)) -gt 0) { if ($content.Length + $count -gt 2097152) { throw 'Pane code entry exceeded its limit' }; $content.Write($buffer,0,$count) }; $data = $content.ToArray() } finally { $stream.Dispose(); $content.Dispose() }
|
|
56
|
+
$base = if ($exists) { $destination } else { $temporary }
|
|
57
|
+
$file = Join-Path $base $entry.FullName.Replace('/','\')
|
|
58
|
+
if ($exists) {
|
|
59
|
+
for ($walk = Get-Item -LiteralPath ([IO.Path]::GetDirectoryName($file)) -Force; $walk.FullName -ne $base; $walk = $walk.Parent) { Real-Directory $walk.FullName }
|
|
60
|
+
$onDisk = Get-Item -LiteralPath $file -Force
|
|
61
|
+
if ($onDisk.PSIsContainer -or ($onDisk.Attributes -band [IO.FileAttributes]::ReparsePoint) -or $onDisk.Length -ne $data.Length -or (Digest ([IO.File]::ReadAllBytes($file))) -cne (Digest $data)) { throw 'Staged pane code changed; no files were overwritten' }
|
|
62
|
+
} else {
|
|
63
|
+
[IO.Directory]::CreateDirectory([IO.Path]::GetDirectoryName($file)) | Out-Null
|
|
64
|
+
[IO.File]::WriteAllBytes($file,$data)
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (-not $seen.Contains('agend-runtime/dist/runtime-pane-stdio.js')) { throw 'Pane relay module is missing' }
|
|
68
|
+
# Verify the complete tree before executing it: unlisted package.json or JS can change Node resolution.
|
|
69
|
+
$base = if ($exists) { $destination } else { $temporary }
|
|
70
|
+
$allowedDirectories = [Collections.Generic.HashSet[string]]::new([StringComparer]::OrdinalIgnoreCase)
|
|
71
|
+
foreach ($name in $seen) {
|
|
72
|
+
for ($relative = [IO.Path]::GetDirectoryName($name.Replace('/','\')); $relative; $relative = [IO.Path]::GetDirectoryName($relative)) { [void]$allowedDirectories.Add($relative) }
|
|
73
|
+
}
|
|
74
|
+
$pending = [Collections.Generic.Stack[string]]::new(); $pending.Push($base)
|
|
75
|
+
while ($pending.Count -gt 0) {
|
|
76
|
+
$directory = $pending.Pop()
|
|
77
|
+
foreach ($item in Get-ChildItem -LiteralPath $directory -Force) {
|
|
78
|
+
$relative = $item.FullName.Substring($base.Length + 1)
|
|
79
|
+
if ($item.Attributes -band [IO.FileAttributes]::ReparsePoint) { throw 'Staged pane code contains an unexpected link' }
|
|
80
|
+
if ($item.PSIsContainer) {
|
|
81
|
+
if (-not $allowedDirectories.Contains($relative)) { throw 'Staged pane code contains an unexpected directory' }
|
|
82
|
+
$pending.Push($item.FullName)
|
|
83
|
+
} elseif (-not $seen.Contains($relative.Replace('\','/')) -and -not ($exists -and $relative -ceq 'bundle.sha256')) { throw 'Staged pane code contains an unexpected file' }
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (-not $exists) {
|
|
87
|
+
[IO.File]::WriteAllText((Join-Path $temporary 'bundle.sha256'),$Sha256,[Text.Encoding]::ASCII)
|
|
88
|
+
# Antivirus may briefly retain handles to freshly written native prebuilds. Never overwrite a live stage.
|
|
89
|
+
$deadline = [DateTime]::UtcNow.AddSeconds(15)
|
|
90
|
+
for (;;) {
|
|
91
|
+
try { [IO.Directory]::Move($temporary,$destination); break }
|
|
92
|
+
catch { if ((Test-Path -LiteralPath $destination) -or [DateTime]::UtcNow -ge $deadline) { throw 'Pane code staging could not be committed; retry after the pending file operation finishes' }; Start-Sleep -Milliseconds 200 }
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
$relay = Join-Path $destination 'agend-runtime\dist\runtime-pane-stdio.js'
|
|
96
|
+
$node = (Get-Command node.exe -CommandType Application -ErrorAction Stop | Select-Object -First 1).Source
|
|
97
|
+
[Console]::Write((@{relay=$relay;node=$node} | ConvertTo-Json -Compress))
|
|
98
|
+
} finally {
|
|
99
|
+
$zip.Dispose(); $memory.Dispose(); $hash.Dispose()
|
|
100
|
+
if (Test-Path -LiteralPath $temporary) { Remove-Item -LiteralPath $temporary -Recurse -Force }
|
|
101
|
+
}
|
package/dist/locale.js
CHANGED
|
@@ -13,6 +13,20 @@ export function detectLocale(fleetConfig) {
|
|
|
13
13
|
return detectTimezone() === 8 ? "zh-TW" : "en";
|
|
14
14
|
}
|
|
15
15
|
const enMessages = {
|
|
16
|
+
"native_pane.session_unconfirmed": "Windows Claude's saved conversation could not be checked. This agent is stopped; an administrator can start a new conversation.",
|
|
17
|
+
"native_pane.refresh_for_session": "This agent needs a new-conversation decision. Refresh this page to choose Start a new conversation.",
|
|
18
|
+
"native_pane.saved_available": "The saved conversation is available again. Choose Start to resume it.",
|
|
19
|
+
"native_pane.codex_session_unconfirmed": "Windows Codex's saved conversation could not be checked. This agent is stopped; an administrator can start a new conversation.",
|
|
20
|
+
"native_pane.codex_fresh_started": "Windows Codex had no saved conversation for this agent (its first turn never finished), so a new conversation was started.",
|
|
21
|
+
"native_pane.fresh_started": "Windows Claude had no saved conversation for this agent (its first turn never finished), so a new conversation was started.",
|
|
22
|
+
"native_pane.host_upgrade": "The Windows pane host uses an older adapter. Stop its Windows agents, restart Windows, then choose Start. Saved conversations are kept.",
|
|
23
|
+
"native_pane.exit_unconfirmed": "The previous Windows pane exit is unconfirmed. Stop its Windows processes, then use the administrator recovery action. The saved conversation is kept; no input was replayed.",
|
|
24
|
+
"native_pane.no_pin": "The original conversation is not proven; recovery cannot start a fresh conversation.",
|
|
25
|
+
"native_pane.changed": "The held native launch changed; refresh before recovery.",
|
|
26
|
+
"native_pane.authority_expired": "Native recovery authority expired.",
|
|
27
|
+
"native_pane.still_running": "This Windows pane is still running; stop it before recovery.",
|
|
28
|
+
"native_pane.scope": "Native recovery lacks an exact retained host receipt.",
|
|
29
|
+
"native_pane.unavailable": "Persistent pane recovery is unavailable.",
|
|
16
30
|
"setup.admin.cancelled": "Setup cancelled; no admin selected.",
|
|
17
31
|
"setup.discord_admin.connecting": "Connecting to Discord to detect your account…",
|
|
18
32
|
"setup.discord_admin.wait": "Send a message in server {0}, or DM @{1}. Waiting up to 30 seconds…",
|
|
@@ -273,6 +287,7 @@ const enMessages = {
|
|
|
273
287
|
"config_history.history_checksum": "stored checksum mismatch",
|
|
274
288
|
"config_history.history_invalid": "stored copy no longer valid",
|
|
275
289
|
"login.browser_cleanup_failed": "Sign-in cleanup could not be confirmed. Close the AgEnD-owned login process and restart AgEnD before retrying.",
|
|
290
|
+
"needs.reason.native_pane_hold": "Windows agent needs attention",
|
|
276
291
|
"needs.reason.crashed": "Crashed",
|
|
277
292
|
"needs.reason.delivery_uncertain": "Could not confirm delivery",
|
|
278
293
|
"needs.reason.delivery_failed": "Delivery failed",
|
|
@@ -1370,6 +1385,7 @@ const enMessages = {
|
|
|
1370
1385
|
"settings_confirm.source.web_session": "web dashboard",
|
|
1371
1386
|
"settings_confirm.source.public_link": "public link",
|
|
1372
1387
|
"settings_confirm.source.setup_session": "setup",
|
|
1388
|
+
"settings_confirm.source.agent_request": "an agent's request",
|
|
1373
1389
|
"settings_confirm.confirm_button": "Confirm",
|
|
1374
1390
|
"settings_confirm.reject_button": "Reject",
|
|
1375
1391
|
"settings_confirm.no_longer_pending": "Settings confirmation is no longer pending.",
|
|
@@ -1483,9 +1499,24 @@ const enMessages = {
|
|
|
1483
1499
|
"settings_confirm.cli_interactive": "Interactive confirmation required; --yes explicitly confirms the printed diff.",
|
|
1484
1500
|
"settings_confirm.web_verified_label": "{0} (web-verified)",
|
|
1485
1501
|
"settings_confirm.host_operator_label": "This computer's admin",
|
|
1502
|
+
"settings_confirm.web_owner_required": "Only this fleet's owner, signed in on the AgEnD computer itself, can decide an agent's request here.",
|
|
1486
1503
|
"settings_confirm.host_operator": "host operator",
|
|
1487
1504
|
};
|
|
1488
1505
|
const zhTWMessages = {
|
|
1506
|
+
"native_pane.session_unconfirmed": "無法確認 Windows Claude 已儲存的對話。這個代理已停止,管理員可以開始新對話。",
|
|
1507
|
+
"native_pane.refresh_for_session": "這個代理需要由你決定是否開始新對話。請重新整理頁面,再按「開始新對話」。",
|
|
1508
|
+
"native_pane.saved_available": "已儲存的對話現在可以使用了。請選擇「啟動」繼續原對話。",
|
|
1509
|
+
"native_pane.codex_session_unconfirmed": "無法確認 Windows Codex 已儲存的對話。這個代理已停止,管理員可以開始新對話。",
|
|
1510
|
+
"native_pane.codex_fresh_started": "Windows Codex 沒有這個代理已儲存的對話(第一輪還沒完成就中斷),所以開了新對話。",
|
|
1511
|
+
"native_pane.fresh_started": "Windows Claude 沒有這個代理已儲存的對話(第一輪還沒完成就中斷),所以開了新對話。",
|
|
1512
|
+
"native_pane.host_upgrade": "Windows 終端主機仍使用舊版轉接器。請先停止這台電腦的 Windows 代理,重新啟動 Windows,再按「啟動」。已儲存的對話會保留。",
|
|
1513
|
+
"native_pane.exit_unconfirmed": "無法確認上一個 Windows 終端是否已結束。請先停止這個代理的 Windows 程序,再由管理員復原。已儲存的對話會保留,也不會重送舊輸入。",
|
|
1514
|
+
"native_pane.no_pin": "尚無法確認原本的對話;復原不會另開新對話。",
|
|
1515
|
+
"native_pane.changed": "保留的 Windows 終端已變更,請重新整理後再復原。",
|
|
1516
|
+
"native_pane.authority_expired": "Windows 終端復原的授權已失效。",
|
|
1517
|
+
"native_pane.still_running": "這個 Windows 終端仍在執行,請先停止再復原。",
|
|
1518
|
+
"native_pane.scope": "Windows 終端復原缺少身分相符的保留收據。",
|
|
1519
|
+
"native_pane.unavailable": "目前無法復原持續執行的 Windows 終端。",
|
|
1489
1520
|
"setup.admin.cancelled": "設定已取消,未選取管理員。",
|
|
1490
1521
|
"setup.discord_admin.connecting": "正在連線到 Discord,以偵測你的帳號…",
|
|
1491
1522
|
"setup.discord_admin.wait": "請在伺服器 {0} 發一則訊息,或私訊 @{1}。最多等待 30 秒…",
|
|
@@ -1745,6 +1776,7 @@ const zhTWMessages = {
|
|
|
1745
1776
|
"config_history.history_checksum": "儲存副本的校驗碼不符",
|
|
1746
1777
|
"config_history.history_invalid": "儲存的副本已不再有效",
|
|
1747
1778
|
"login.browser_cleanup_failed": "無法確認登入程序已關閉。請先關閉 AgEnD 的登入程序,重新啟動 AgEnD 後再試。",
|
|
1779
|
+
"needs.reason.native_pane_hold": "Windows 代理需要處理",
|
|
1748
1780
|
"needs.reason.crashed": "已崩潰",
|
|
1749
1781
|
"needs.reason.delivery_uncertain": "無法確認是否送達",
|
|
1750
1782
|
"needs.reason.delivery_failed": "傳送失敗",
|
|
@@ -2840,6 +2872,7 @@ const zhTWMessages = {
|
|
|
2840
2872
|
"settings_confirm.source.web_session": "網頁儀表板",
|
|
2841
2873
|
"settings_confirm.source.public_link": "公開連結",
|
|
2842
2874
|
"settings_confirm.source.setup_session": "設定精靈",
|
|
2875
|
+
"settings_confirm.source.agent_request": "代理人的請求",
|
|
2843
2876
|
"settings_confirm.confirm_button": "確認",
|
|
2844
2877
|
"settings_confirm.reject_button": "拒絕",
|
|
2845
2878
|
"settings_confirm.no_longer_pending": "這個設定確認已不在等待中。",
|
|
@@ -2953,6 +2986,7 @@ const zhTWMessages = {
|
|
|
2953
2986
|
"settings_confirm.cli_interactive": "需要互動確認;--yes 表示明確確認上面列出的差異。",
|
|
2954
2987
|
"settings_confirm.web_verified_label": "{0}(網頁驗證)",
|
|
2955
2988
|
"settings_confirm.host_operator_label": "這台電腦的管理者",
|
|
2989
|
+
"settings_confirm.web_owner_required": "只有在 AgEnD 這台電腦上登入的 fleet 擁有者,才能在這裡決定 agent 的請求。",
|
|
2956
2990
|
"settings_confirm.host_operator": "主機操作者",
|
|
2957
2991
|
};
|
|
2958
2992
|
const messages = {
|