@songsid/agend 2.3.4-beta.7 → 2.3.5-alpha.3
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/auth-api.d.ts +21 -0
- package/dist/auth-api.js +89 -2
- package/dist/auth-api.js.map +1 -1
- package/dist/authority/web-authority.d.ts +12 -2
- package/dist/authority/web-authority.js +25 -4
- package/dist/authority/web-authority.js.map +1 -1
- package/dist/backend/claude-code.d.ts +15 -12
- package/dist/backend/claude-code.js +152 -133
- 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 +1281 -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 +3 -0
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.js +71 -1
- 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 +67 -5
- package/dist/daemon.js +823 -266
- 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 +238 -3
- package/dist/fleet-manager.js +1826 -104
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-windows-runtime.d.ts +92 -0
- package/dist/fleet-windows-runtime.js +380 -0
- package/dist/fleet-windows-runtime.js.map +1 -0
- package/dist/general-binding.d.ts +85 -0
- package/dist/general-binding.js +298 -0
- package/dist/general-binding.js.map +1 -0
- package/dist/general-host-owner.d.ts +8 -0
- package/dist/general-host-owner.js +26 -0
- package/dist/general-host-owner.js.map +1 -0
- package/dist/general-instance.d.ts +7 -0
- package/dist/general-instance.js +20 -3
- package/dist/general-instance.js.map +1 -1
- package/dist/general-role.d.ts +5 -0
- package/dist/general-role.js +26 -0
- package/dist/general-role.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 +21 -3
- package/dist/instance-lifecycle.js +378 -162
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/instructions.d.ts +2 -0
- package/dist/instructions.js +6 -0
- package/dist/instructions.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 +85 -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 +230 -0
- package/dist/native-pane-lifecycle.js.map +1 -0
- package/dist/native-pane-manager.d.ts +59 -0
- package/dist/native-pane-manager.js +584 -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 +2 -1
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you.d.ts +19 -1
- package/dist/needs-you.js +12 -2
- 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 +118 -0
- package/dist/pane-port.js +2 -0
- package/dist/pane-port.js.map +1 -0
- package/dist/public-web-gateway.js +9 -0
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/public-web-link.d.ts +5 -0
- package/dist/public-web-link.js +4 -0
- package/dist/public-web-link.js.map +1 -1
- package/dist/quickstart-api.js +9 -5
- package/dist/quickstart-api.js.map +1 -1
- package/dist/quickstart.d.ts +1 -0
- package/dist/quickstart.js +4 -1
- package/dist/quickstart.js.map +1 -1
- 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 +150 -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-general-protocol.d.ts +22 -0
- package/dist/runtime-general-protocol.js +57 -0
- package/dist/runtime-general-protocol.js.map +1 -0
- package/dist/runtime-general-workspace.d.ts +17 -0
- package/dist/runtime-general-workspace.js +213 -0
- package/dist/runtime-general-workspace.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 +44 -0
- package/dist/runtime-pane-host.js +424 -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 +51 -0
- package/dist/runtime-pane-mcp.js +150 -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 +139 -0
- package/dist/runtime-pane-port.js +558 -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 +172 -0
- package/dist/runtime-pane-protocol.js +195 -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.d.ts +5 -0
- package/dist/settings-api.js +95 -1
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-baseline.d.ts +1 -0
- package/dist/settings-baseline.js +1 -1
- package/dist/settings-baseline.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 +16 -1
- package/dist/settings-confirmation.js +47 -9
- package/dist/settings-confirmation.js.map +1 -1
- package/dist/settings-effect.d.ts +4 -0
- package/dist/settings-effect.js +58 -1
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.d.ts +1 -0
- package/dist/settings-http-confirmation.js +15 -2
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/settings-request-capability.d.ts +2 -0
- package/dist/settings-request-capability.js +4 -0
- package/dist/settings-request-capability.js.map +1 -1
- package/dist/settings-route-lifetime.d.ts +14 -0
- package/dist/settings-route-lifetime.js +48 -0
- package/dist/settings-route-lifetime.js.map +1 -0
- package/dist/settings-transaction.d.ts +4 -0
- package/dist/settings-transaction.js +9 -0
- package/dist/settings-transaction.js.map +1 -1
- package/dist/setup-form.js +6 -3
- package/dist/setup-form.js.map +1 -1
- package/dist/setup-i18n.js +3 -0
- package/dist/setup-i18n.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/tool-permissions.js +2 -1
- package/dist/tool-permissions.js.map +1 -1
- 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 +23 -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/general-location.js +71 -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 +63 -32
- package/dist/ui/panel-details.js +2 -1
- package/dist/ui/panel-fleet.js +99 -18
- package/dist/ui/panel-needs.js +154 -3
- package/dist/ui/panel-runtimes.js +231 -0
- package/dist/ui/panel-settings.js +19 -9
- 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 +22 -7
- package/dist/ui/settings-model.js +2 -1
- package/dist/ui/settings-outside.js +176 -0
- package/dist/ui/settings-registry.js +6 -0
- package/dist/ui/settings-strings.js +16 -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 +33 -7
- package/dist/ui/shared/instance-switch.js +4 -3
- package/dist/ui/shared/qrcode.module.js +2237 -0
- package/dist/ui/shared/signin.js +39 -5
- package/dist/ui/shared/ui-menu.js +28 -8
- package/dist/ui/shared/vendor/qrcode-generator.LICENSE +27 -0
- package/dist/ui/shared/vendor/vendor.json +19 -2
- package/dist/ui/shared/view-strings.js +8 -0
- package/dist/ui/windows-agents-nav.js +2 -0
- package/dist/ui/windows-cli-catalog.js +79 -0
- package/dist/web-api.d.ts +37 -0
- package/dist/web-api.js +248 -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-only-fleet.d.ts +20 -0
- package/dist/web-only-fleet.js +21 -0
- package/dist/web-only-fleet.js.map +1 -1
- package/dist/web-remote-access.d.ts +152 -0
- package/dist/web-remote-access.js +368 -0
- package/dist/web-remote-access.js.map +1 -0
- package/dist/web-session.d.ts +7 -0
- package/dist/web-session.js +2 -0
- package/dist/web-session.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 +124 -0
- package/dist/windows-agents.js +487 -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,116 @@
|
|
|
1
|
+
param(
|
|
2
|
+
[Parameter(Mandatory=$true)][string]$NodePath,
|
|
3
|
+
[Parameter(Mandatory=$true)][string]$WorkerPath,
|
|
4
|
+
[Parameter(Mandatory=$true)][string]$StateDirectory,
|
|
5
|
+
[Parameter(Mandatory=$true)][string]$LaunchId,
|
|
6
|
+
[Parameter(Mandatory=$true)][string]$PaneId,
|
|
7
|
+
[Parameter(Mandatory=$true)][string]$AgentId,
|
|
8
|
+
[Parameter(Mandatory=$true)][int]$OwnerPid,
|
|
9
|
+
[Parameter(Mandatory=$true)][int]$ReceiptPid
|
|
10
|
+
)
|
|
11
|
+
$ErrorActionPreference = 'Stop'
|
|
12
|
+
# Built-in Windows APIs only. The helper receives no stdin until its process HANDLE is assigned to the job.
|
|
13
|
+
# https://learn.microsoft.com/windows/win32/procthread/job-objects
|
|
14
|
+
Add-Type -ReferencedAssemblies System.Web.Extensions -TypeDefinition @'
|
|
15
|
+
using System;
|
|
16
|
+
using System.IO;
|
|
17
|
+
using System.Text;
|
|
18
|
+
using System.Diagnostics;
|
|
19
|
+
using System.Threading;
|
|
20
|
+
using System.Threading.Tasks;
|
|
21
|
+
using System.Collections.Generic;
|
|
22
|
+
using System.Runtime.InteropServices;
|
|
23
|
+
using System.Web.Script.Serialization;
|
|
24
|
+
public static class AgendPaneJob {
|
|
25
|
+
[StructLayout(LayoutKind.Sequential)] struct Limits {
|
|
26
|
+
public long ProcessTime,JobTime; public uint Flags; public UIntPtr MinWorking,MaxWorking;
|
|
27
|
+
public uint ProcessLimit; public UIntPtr Affinity; public uint Priority,Scheduling;
|
|
28
|
+
}
|
|
29
|
+
[StructLayout(LayoutKind.Sequential)] struct Io { public ulong A,B,C,D,E,F; }
|
|
30
|
+
[StructLayout(LayoutKind.Sequential)] struct Extended { public Limits Basic; public Io Io; public UIntPtr ProcessMemory,JobMemory,PeakProcess,PeakJob; }
|
|
31
|
+
[StructLayout(LayoutKind.Sequential)] struct Accounting { public long A,B,C,D; public uint Faults,Total,Active,Terminated; }
|
|
32
|
+
[DllImport("kernel32.dll",CharSet=CharSet.Unicode,SetLastError=true)] static extern IntPtr CreateJobObject(IntPtr security,string name);
|
|
33
|
+
[DllImport("kernel32.dll",SetLastError=true)] static extern bool SetInformationJobObject(IntPtr job,int kind,ref Extended value,uint size);
|
|
34
|
+
[DllImport("kernel32.dll",SetLastError=true)] static extern bool QueryInformationJobObject(IntPtr job,int kind,ref Accounting value,uint size,IntPtr length);
|
|
35
|
+
[DllImport("kernel32.dll",SetLastError=true)] static extern bool AssignProcessToJobObject(IntPtr job,IntPtr process);
|
|
36
|
+
[DllImport("kernel32.dll",SetLastError=true)] static extern bool TerminateJobObject(IntPtr job,uint code);
|
|
37
|
+
[DllImport("kernel32.dll")] static extern bool CloseHandle(IntPtr handle);
|
|
38
|
+
static string Quote(string value) {
|
|
39
|
+
var result=new StringBuilder("\"");int slashes=0;
|
|
40
|
+
foreach(char c in value) { if(c=='\\'){slashes++;continue;} if(c=='\"')result.Append('\\',slashes*2+1);else result.Append('\\',slashes);result.Append(c);slashes=0; }
|
|
41
|
+
result.Append('\\',slashes*2);return result.Append('"').ToString();
|
|
42
|
+
}
|
|
43
|
+
static void Check(bool ok) { if(!ok)throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error()); }
|
|
44
|
+
static uint Active(IntPtr job) { var value=new Accounting();Check(QueryInformationJobObject(job,1,ref value,(uint)Marshal.SizeOf(value),IntPtr.Zero));return value.Active; }
|
|
45
|
+
static void Receipt(string directory,string launch,string pane,string agent,int receiptPid,long code) {
|
|
46
|
+
Guid parsed; if(!Guid.TryParse(launch,out parsed)||!Guid.TryParse(pane,out parsed)||!Guid.TryParse(agent,out parsed))throw new InvalidOperationException();
|
|
47
|
+
var json=new JavaScriptSerializer().Serialize(new {version=1,launchId=launch,paneId=pane,agentId=agent,pid=receiptPid,code=code});
|
|
48
|
+
string exits=Path.Combine(directory,"exits");Directory.CreateDirectory(exits);
|
|
49
|
+
string file=Path.Combine(exits,launch+".json"),temp=file+"."+Guid.NewGuid().ToString("N")+".tmp";
|
|
50
|
+
byte[] bytes=new UTF8Encoding(false).GetBytes(json);
|
|
51
|
+
using(var stream=new FileStream(temp,FileMode.CreateNew,FileAccess.Write,FileShare.None)){stream.Write(bytes,0,bytes.Length);stream.Flush(true);}
|
|
52
|
+
for(int attempt=0;;attempt++){
|
|
53
|
+
try{File.Move(temp,file);break;}
|
|
54
|
+
catch(IOException){if(attempt>=4)throw;Thread.Sleep(10*(attempt+1));}
|
|
55
|
+
catch(UnauthorizedAccessException){if(attempt>=4)throw;Thread.Sleep(10*(attempt+1));}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
public static int Run(string node,string worker,string directory,string launch,string pane,string agent,int ownerPid,int receiptPid) {
|
|
59
|
+
IntPtr job=IntPtr.Zero;Process child=null,owner=null;bool assigned=false;string phase="create";
|
|
60
|
+
var clock=Stopwatch.StartNew();long closeAt=-1,cliCode=1;
|
|
61
|
+
var output=new StreamWriter(Console.OpenStandardOutput(),new UTF8Encoding(false)){AutoFlush=true};
|
|
62
|
+
var outputLock=new object();bool outputOpen=true;
|
|
63
|
+
Action<string> write=line=>{lock(outputLock){if(!outputOpen)return;try{output.WriteLine(line);}catch(IOException){outputOpen=false;}catch(ObjectDisposedException){outputOpen=false;}}};
|
|
64
|
+
try {
|
|
65
|
+
owner=Process.GetProcessById(ownerPid);var ownerHandle=owner.Handle;
|
|
66
|
+
if(owner.HasExited)throw new InvalidOperationException();
|
|
67
|
+
job=CreateJobObject(IntPtr.Zero,null);Check(job!=IntPtr.Zero);
|
|
68
|
+
var limits=new Extended();limits.Basic.Flags=0x2000; // KILL_ON_JOB_CLOSE; breakaway is deliberately not enabled.
|
|
69
|
+
Check(SetInformationJobObject(job,9,ref limits,(uint)Marshal.SizeOf(limits)));
|
|
70
|
+
phase="start-helper";
|
|
71
|
+
var start=new ProcessStartInfo(node,Quote(worker)){UseShellExecute=false,CreateNoWindow=true,RedirectStandardInput=true,RedirectStandardOutput=true,RedirectStandardError=true,
|
|
72
|
+
StandardOutputEncoding=new UTF8Encoding(false),StandardErrorEncoding=new UTF8Encoding(false)};
|
|
73
|
+
child=Process.Start(start);
|
|
74
|
+
phase="assign";Check(AssignProcessToJobObject(job,child.Handle));assigned=true;
|
|
75
|
+
// No provider can launch before this assignment: runtime-pane-worker waits for its first stdin command.
|
|
76
|
+
var inputWriter=new StreamWriter(child.StandardInput.BaseStream,new UTF8Encoding(false)){AutoFlush=true};
|
|
77
|
+
var input=Task.Factory.StartNew(()=>{
|
|
78
|
+
try { using(var reader=new StreamReader(Console.OpenStandardInput(),new UTF8Encoding(false))){string line;
|
|
79
|
+
while((line=reader.ReadLine())!=null){
|
|
80
|
+
if(line.Length>256*1024)break;
|
|
81
|
+
try {var value=new JavaScriptSerializer().Deserialize<Dictionary<string,object>>(line);if(value.ContainsKey("type")&&(string)value["type"]=="close")Interlocked.CompareExchange(ref closeAt,clock.ElapsedMilliseconds,-1);}catch{}
|
|
82
|
+
inputWriter.WriteLine(line);
|
|
83
|
+
}
|
|
84
|
+
}}catch{}finally{Interlocked.CompareExchange(ref closeAt,clock.ElapsedMilliseconds,-1);try{inputWriter.Close();}catch{}}
|
|
85
|
+
},TaskCreationOptions.LongRunning);
|
|
86
|
+
var stdout=Task.Factory.StartNew(()=>{string line;while((line=child.StandardOutput.ReadLine())!=null){
|
|
87
|
+
try {var value=new JavaScriptSerializer().Deserialize<Dictionary<string,object>>(line);
|
|
88
|
+
string type=value.ContainsKey("type")?value["type"] as string:null;
|
|
89
|
+
if(type=="tree.exit")continue; // Only this job owner can attest whole-tree exit.
|
|
90
|
+
if(type=="exit"&&value.ContainsKey("code"))cliCode=Convert.ToInt64(value["code"]);
|
|
91
|
+
}catch{}write(line);
|
|
92
|
+
}},TaskCreationOptions.LongRunning);
|
|
93
|
+
var stderr=Task.Factory.StartNew(()=>{child.StandardError.ReadToEnd();},TaskCreationOptions.LongRunning);
|
|
94
|
+
phase="running";
|
|
95
|
+
while(!child.WaitForExit(50)){long requested=Interlocked.Read(ref closeAt);if(owner.HasExited||(requested>=0&&clock.ElapsedMilliseconds-requested>=5000)){Check(TerminateJobObject(job,1));break;}}
|
|
96
|
+
phase="helper-exit";if(!child.WaitForExit(10000))throw new TimeoutException();
|
|
97
|
+
if(!stdout.Wait(10000))throw new TimeoutException();stderr.Wait(1000);
|
|
98
|
+
child.Dispose();child=null;
|
|
99
|
+
// A CLI may have left a background descendant. Retire only members of this exact owned job.
|
|
100
|
+
phase="tree-exit";if(Active(job)>0)Check(TerminateJobObject(job,1));
|
|
101
|
+
long deadline=clock.ElapsedMilliseconds+10000;while(Active(job)!=0){if(clock.ElapsedMilliseconds>deadline)throw new TimeoutException();Thread.Sleep(20);}
|
|
102
|
+
phase="receipt";Receipt(directory,launch,pane,agent,receiptPid,cliCode);
|
|
103
|
+
write(new JavaScriptSerializer().Serialize(new {type="tree.exit",code=cliCode}));
|
|
104
|
+
return 0;
|
|
105
|
+
} catch(Exception error) {
|
|
106
|
+
int code=error is System.ComponentModel.Win32Exception?((System.ComponentModel.Win32Exception)error).NativeErrorCode:0;
|
|
107
|
+
try{string exits=Path.Combine(directory,"exits");Directory.CreateDirectory(exits);File.WriteAllText(Path.Combine(exits,launch+".error.json"),new JavaScriptSerializer().Serialize(new {launchId=launch,paneId=pane,agentId=agent,stage=phase,code=code}),new UTF8Encoding(false));}catch{}
|
|
108
|
+
Console.Error.WriteLine("Windows pane ownership helper failed at "+phase+" (win32 "+code+"); process outcome is unconfirmed.");
|
|
109
|
+
// A direct child handle is safe even if job assignment failed. No discovered PID is ever signalled.
|
|
110
|
+
if(child!=null&&!assigned){try{child.Kill();child.WaitForExit(10000);}catch{}}
|
|
111
|
+
return 1;
|
|
112
|
+
} finally { if(job!=IntPtr.Zero)CloseHandle(job);if(child!=null)child.Dispose();if(owner!=null)owner.Dispose(); }
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
'@
|
|
116
|
+
exit [AgendPaneJob]::Run($NodePath,$WorkerPath,$StateDirectory,$LaunchId,$PaneId,$AgentId,$OwnerPid,$ReceiptPid)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type PaneHostDescriptor } from "./runtime-pane-private.js";
|
|
2
|
+
import { type RuntimePaneSnapshot } from "./runtime-pane-protocol.js";
|
|
3
|
+
import { type PaneMcpBody } from "./runtime-pane-mcp-protocol.js";
|
|
4
|
+
export interface PaneLinkOptions {
|
|
5
|
+
directory: string;
|
|
6
|
+
server: string;
|
|
7
|
+
machineId: string;
|
|
8
|
+
online(): boolean;
|
|
9
|
+
maxAgents(): number;
|
|
10
|
+
epoch?(): string;
|
|
11
|
+
output?(snapshot: RuntimePaneSnapshot): void;
|
|
12
|
+
/** Transport loss only; retained CLI/process ownership is unchanged. */
|
|
13
|
+
disconnected?(): void;
|
|
14
|
+
mcp?(body: PaneMcpBody, current: () => boolean): Promise<unknown>;
|
|
15
|
+
}
|
|
16
|
+
export declare class RuntimePaneLink {
|
|
17
|
+
private socket;
|
|
18
|
+
readonly hostBootId: string;
|
|
19
|
+
private options;
|
|
20
|
+
private mcpPending;
|
|
21
|
+
private pending;
|
|
22
|
+
private timer;
|
|
23
|
+
private closed;
|
|
24
|
+
private cleanupOnly;
|
|
25
|
+
private readonly clientEpoch;
|
|
26
|
+
private constructor();
|
|
27
|
+
static open(options: PaneLinkOptions): Promise<RuntimePaneLink>;
|
|
28
|
+
/** Authenticated discovery seam; fixtures bind only private loopback services. */
|
|
29
|
+
static attach(descriptor: PaneHostDescriptor, options: Pick<PaneLinkOptions, "online" | "maxAgents" | "output" | "epoch" | "mcp" | "disconnected">): Promise<RuntimePaneLink>;
|
|
30
|
+
private mcpReply;
|
|
31
|
+
connectionChanged(): void;
|
|
32
|
+
private epoch;
|
|
33
|
+
private lease;
|
|
34
|
+
request(raw: unknown, current?: () => boolean): Promise<unknown>;
|
|
35
|
+
connected(): boolean;
|
|
36
|
+
private closePending;
|
|
37
|
+
/** An authenticated explicit machine revocation retires only this enrollment's owned panes. A disconnect never does. */
|
|
38
|
+
retireOwned(): Promise<void>;
|
|
39
|
+
stop(): Promise<void>;
|
|
40
|
+
}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/** Private authenticated link to a persistent host. Closing the runtime client never closes its CLI panes. */
|
|
2
|
+
import WebSocket from "ws";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { randomUUID } from "node:crypto";
|
|
6
|
+
import { spawn } from "./child-process.js";
|
|
7
|
+
import { readPaneSystemBootId } from "./runtime-pane-boot.js";
|
|
8
|
+
import { nativeCliEnvironment } from "./windows-cli-worker.js";
|
|
9
|
+
import { runtimeJobDigest } from "./runtime-client-store.js";
|
|
10
|
+
import { protectPaneDirectory, readPaneHostDescriptor } from "./runtime-pane-private.js";
|
|
11
|
+
import { validateRuntimePaneRequest, validateRuntimePaneSnapshot, validateRuntimePaneShutdown } from "./runtime-pane-protocol.js";
|
|
12
|
+
import { validatePaneMcpBody } from "./runtime-pane-mcp-protocol.js";
|
|
13
|
+
export class RuntimePaneLink {
|
|
14
|
+
socket;
|
|
15
|
+
hostBootId;
|
|
16
|
+
options;
|
|
17
|
+
mcpPending = 0;
|
|
18
|
+
pending = new Map();
|
|
19
|
+
timer;
|
|
20
|
+
closed = false;
|
|
21
|
+
cleanupOnly = false;
|
|
22
|
+
clientEpoch = randomUUID();
|
|
23
|
+
constructor(socket, hostBootId, options) {
|
|
24
|
+
this.socket = socket;
|
|
25
|
+
this.hostBootId = hostBootId;
|
|
26
|
+
this.options = options;
|
|
27
|
+
}
|
|
28
|
+
static async open(options) {
|
|
29
|
+
if (process.platform !== "win32")
|
|
30
|
+
throw Error("Persistent pane host requires Windows Node");
|
|
31
|
+
const directory = join(options.directory, "pane-host");
|
|
32
|
+
await protectPaneDirectory(directory);
|
|
33
|
+
const scope = runtimeJobDigest({ server: options.server, machineId: options.machineId });
|
|
34
|
+
let descriptor = readPaneHostDescriptor(directory, scope);
|
|
35
|
+
const systemBootId = await readPaneSystemBootId();
|
|
36
|
+
let live = false;
|
|
37
|
+
if (descriptor && !(descriptor.systemBootId && systemBootId && descriptor.systemBootId !== systemBootId)) {
|
|
38
|
+
live = true;
|
|
39
|
+
try {
|
|
40
|
+
process.kill(descriptor.pid, 0);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
if (error.code === "ESRCH")
|
|
44
|
+
live = false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (!live) {
|
|
48
|
+
const child = spawn(process.execPath, [fileURLToPath(new URL("./runtime-pane-service.js", import.meta.url)), directory, scope], {
|
|
49
|
+
detached: true, windowsHide: true, stdio: "ignore", shell: false, env: nativeCliEnvironment(),
|
|
50
|
+
});
|
|
51
|
+
let failed = false;
|
|
52
|
+
child.on("error", () => { failed = true; });
|
|
53
|
+
child.unref();
|
|
54
|
+
const deadline = performance.now() + 120_000;
|
|
55
|
+
const prior = descriptor?.hostBootId;
|
|
56
|
+
for (;;) {
|
|
57
|
+
if (failed || child.exitCode !== null)
|
|
58
|
+
throw Error("Pane host startup was not confirmed");
|
|
59
|
+
descriptor = readPaneHostDescriptor(directory, scope);
|
|
60
|
+
if (descriptor && descriptor.hostBootId !== prior && descriptor.pid === child.pid)
|
|
61
|
+
break;
|
|
62
|
+
if (performance.now() > deadline)
|
|
63
|
+
throw Error("Pane host startup deadline; its state is retained for inspection");
|
|
64
|
+
await new Promise(done => setTimeout(done, 50));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (!descriptor)
|
|
68
|
+
throw Error("Pane host descriptor is unavailable");
|
|
69
|
+
// A live descriptor which cannot authenticate is held, never replaced by another host.
|
|
70
|
+
return this.attach(descriptor, options);
|
|
71
|
+
}
|
|
72
|
+
/** Authenticated discovery seam; fixtures bind only private loopback services. */
|
|
73
|
+
static attach(descriptor, options) {
|
|
74
|
+
return new Promise((resolve, reject) => {
|
|
75
|
+
const socket = new WebSocket(`ws://127.0.0.1:${descriptor.port}/pane/v1`, { headers: { Authorization: `Bearer ${descriptor.token}` },
|
|
76
|
+
handshakeTimeout: 10_000, maxPayload: 256 * 1024, followRedirects: false, perMessageDeflate: false });
|
|
77
|
+
const link = new RuntimePaneLink(socket, descriptor.hostBootId, options);
|
|
78
|
+
let ready = false;
|
|
79
|
+
const deadline = setTimeout(() => { socket.terminate(); reject(Error("Pane host authentication deadline")); }, 10_000);
|
|
80
|
+
socket.on("error", () => { });
|
|
81
|
+
socket.on("close", () => { clearTimeout(deadline); link.closePending(); if (!ready)
|
|
82
|
+
reject(Error("Pane host attachment is unconfirmed")); });
|
|
83
|
+
socket.on("message", (bytes, binary) => {
|
|
84
|
+
try {
|
|
85
|
+
if (binary)
|
|
86
|
+
throw Error("Binary pane frame");
|
|
87
|
+
const value = JSON.parse(bytes.toString());
|
|
88
|
+
if (!ready) {
|
|
89
|
+
if (value?.type !== "hello" || value.hostBootId !== descriptor.hostBootId)
|
|
90
|
+
throw Error("Pane host boot changed");
|
|
91
|
+
ready = true;
|
|
92
|
+
clearTimeout(deadline);
|
|
93
|
+
link.lease();
|
|
94
|
+
link.timer = setInterval(() => link.lease(), 5000);
|
|
95
|
+
link.timer.unref();
|
|
96
|
+
resolve(link);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
if (value?.type === "mcp.request") {
|
|
100
|
+
if (Object.keys(value).some(key => !["type", "id", "epoch", "body"].includes(key)) || !/^[a-f0-9-]{36}$/i.test(value.id) || value.epoch !== link.epoch())
|
|
101
|
+
throw Error("Invalid pane MCP frame");
|
|
102
|
+
const body = validatePaneMcpBody(value.body), epoch = value.epoch;
|
|
103
|
+
const current = () => !link.closed && !link.cleanupOnly && socket.readyState === WebSocket.OPEN && options.online() && link.epoch() === epoch;
|
|
104
|
+
if (link.mcpPending >= 32)
|
|
105
|
+
throw Error("Pane MCP transport backlog");
|
|
106
|
+
link.mcpPending++;
|
|
107
|
+
void (async () => {
|
|
108
|
+
try {
|
|
109
|
+
if (!current() || !options.mcp)
|
|
110
|
+
throw Error("Pane MCP lease unavailable");
|
|
111
|
+
const result = await options.mcp(body, current);
|
|
112
|
+
if (current())
|
|
113
|
+
link.mcpReply(value.id, epoch, true, result);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
if (current())
|
|
117
|
+
link.mcpReply(value.id, epoch, false);
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
link.mcpPending--;
|
|
121
|
+
}
|
|
122
|
+
})();
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (value?.type === "output") {
|
|
126
|
+
options.output?.(validateRuntimePaneSnapshot(value.snapshot));
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (value?.type !== "response" || typeof value.id !== "string" || typeof value.ok !== "boolean")
|
|
130
|
+
throw Error("Invalid pane reply");
|
|
131
|
+
const pending = link.pending.get(value.id);
|
|
132
|
+
if (!pending)
|
|
133
|
+
return;
|
|
134
|
+
link.pending.delete(value.id);
|
|
135
|
+
clearTimeout(pending.timer);
|
|
136
|
+
if (value.ok)
|
|
137
|
+
pending.resolve(value.result);
|
|
138
|
+
else
|
|
139
|
+
pending.reject(Error("Pane host refused operation; inspect its owned snapshot"));
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
socket.close(1008, "Invalid pane host frame");
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
mcpReply(id, epoch, ok, result) {
|
|
148
|
+
const frame = JSON.stringify({ type: "mcp.result", id, epoch, ok, ...(ok ? { result } : {}) });
|
|
149
|
+
if (Buffer.byteLength(frame) > 256 * 1024 || this.socket.bufferedAmount > 256 * 1024) {
|
|
150
|
+
this.socket.terminate();
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
this.socket.send(frame);
|
|
154
|
+
}
|
|
155
|
+
connectionChanged() { this.lease(); }
|
|
156
|
+
epoch() { return this.options.epoch?.() ?? this.clientEpoch; }
|
|
157
|
+
lease() {
|
|
158
|
+
if (this.socket.readyState !== WebSocket.OPEN || this.closed)
|
|
159
|
+
return;
|
|
160
|
+
const maxAgents = this.options.maxAgents();
|
|
161
|
+
if (!Number.isInteger(maxAgents) || maxAgents < 1 || maxAgents > 16) {
|
|
162
|
+
this.socket.close(1008, "Invalid machine limit");
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
this.socket.send(JSON.stringify({ type: "lease", epoch: this.epoch(), online: this.cleanupOnly || this.options.online(), maxAgents }));
|
|
166
|
+
}
|
|
167
|
+
request(raw, current = () => true) {
|
|
168
|
+
const request = validateRuntimePaneRequest(raw);
|
|
169
|
+
if (this.cleanupOnly && !["list", "snapshot", "close", "shutdown"].includes(request.action))
|
|
170
|
+
return Promise.reject(Error("Pane link only permits owned retirement"));
|
|
171
|
+
if (!current() || this.closed || this.socket.readyState !== WebSocket.OPEN || !(this.cleanupOnly || this.options.online()))
|
|
172
|
+
return Promise.reject(Error("Pane client is disconnected"));
|
|
173
|
+
if (this.pending.size >= 64 || this.socket.bufferedAmount > 256 * 1024)
|
|
174
|
+
return Promise.reject(Error("Pane client backpressure limit"));
|
|
175
|
+
this.lease();
|
|
176
|
+
const id = randomUUID();
|
|
177
|
+
return new Promise((resolve, reject) => {
|
|
178
|
+
const timer = setTimeout(() => { this.pending.delete(id); reject(Error("Pane result unconfirmed; no input is replayed")); }, 125_000);
|
|
179
|
+
timer.unref();
|
|
180
|
+
this.pending.set(id, { resolve, reject, timer });
|
|
181
|
+
this.socket.send(JSON.stringify({ type: "request", id, epoch: this.epoch(), request }), error => {
|
|
182
|
+
if (!error)
|
|
183
|
+
return;
|
|
184
|
+
const pending = this.pending.get(id);
|
|
185
|
+
if (pending) {
|
|
186
|
+
clearTimeout(timer);
|
|
187
|
+
this.pending.delete(id);
|
|
188
|
+
reject(Error("Pane result unconfirmed"));
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
connected() { return !this.closed && this.socket.readyState === WebSocket.OPEN; }
|
|
194
|
+
closePending() {
|
|
195
|
+
if (this.closed)
|
|
196
|
+
return;
|
|
197
|
+
this.closed = true;
|
|
198
|
+
clearInterval(this.timer);
|
|
199
|
+
for (const pending of this.pending.values()) {
|
|
200
|
+
clearTimeout(pending.timer);
|
|
201
|
+
pending.reject(Error("Pane connection closed; terminal ownership is retained"));
|
|
202
|
+
}
|
|
203
|
+
this.pending.clear();
|
|
204
|
+
try {
|
|
205
|
+
this.options.disconnected?.();
|
|
206
|
+
}
|
|
207
|
+
catch { /* cleanup observers cannot change retained ownership */ }
|
|
208
|
+
}
|
|
209
|
+
/** An authenticated explicit machine revocation retires only this enrollment's owned panes. A disconnect never does. */
|
|
210
|
+
async retireOwned() {
|
|
211
|
+
this.cleanupOnly = true;
|
|
212
|
+
const deadline = performance.now() + 125_000;
|
|
213
|
+
const request = (value) => {
|
|
214
|
+
const remaining = deadline - performance.now();
|
|
215
|
+
if (remaining <= 0)
|
|
216
|
+
return Promise.reject(Error("Owned pane retirement deadline"));
|
|
217
|
+
return new Promise((resolve, reject) => { const timer = setTimeout(() => reject(Error("Owned pane retirement deadline")), remaining); timer.unref(); this.request(value).then(result => { clearTimeout(timer); resolve(result); }, error => { clearTimeout(timer); reject(error); }); });
|
|
218
|
+
};
|
|
219
|
+
const inventory = await request({ action: "list" });
|
|
220
|
+
if (inventory?.hostBootId !== this.hostBootId || !Array.isArray(inventory.panes) || inventory.panes.length > 4096)
|
|
221
|
+
throw Error("Owned pane inventory is unconfirmed");
|
|
222
|
+
const panes = inventory.panes.map(validateRuntimePaneSnapshot);
|
|
223
|
+
if (new Set(panes.map(pane => pane.paneId)).size !== panes.length)
|
|
224
|
+
throw Error("Owned pane inventory contains duplicate identities");
|
|
225
|
+
// Retire positively observed running Jobs before encountering old unknown reservations.
|
|
226
|
+
panes.sort((a, b) => Number(b.state === "running") - Number(a.state === "running"));
|
|
227
|
+
for (const pane of panes) {
|
|
228
|
+
if (pane.state === "exited")
|
|
229
|
+
continue;
|
|
230
|
+
if (pane.hostBootId !== this.hostBootId)
|
|
231
|
+
throw Error("Owned pane host changed");
|
|
232
|
+
const current = validateRuntimePaneSnapshot(await request({ action: "snapshot", paneId: pane.paneId, launchId: pane.launchId }));
|
|
233
|
+
if (current.hostBootId !== this.hostBootId || current.paneId !== pane.paneId || current.launchId !== pane.launchId || current.agentId !== pane.agentId || current.instance !== pane.instance)
|
|
234
|
+
throw Error("Owned pane retirement identity changed");
|
|
235
|
+
if (current.state === "exited")
|
|
236
|
+
continue;
|
|
237
|
+
const exited = validateRuntimePaneSnapshot(await request({ action: "close", paneId: current.paneId, launchId: current.launchId, sequence: current.commandSequence + 1, operationId: randomUUID() }));
|
|
238
|
+
if (exited.hostBootId !== this.hostBootId || exited.paneId !== pane.paneId || exited.launchId !== pane.launchId || exited.agentId !== pane.agentId || exited.instance !== pane.instance || exited.state !== "exited")
|
|
239
|
+
throw Error("Owned pane retirement exit is unconfirmed");
|
|
240
|
+
}
|
|
241
|
+
// Only explicit disable/revoke calls retireOwned. A transport/coordinator restart merely detaches via stop().
|
|
242
|
+
validateRuntimePaneShutdown(await request({ action: "shutdown", hostBootId: this.hostBootId }), this.hostBootId);
|
|
243
|
+
}
|
|
244
|
+
async stop() { this.closePending(); this.socket.terminate(); }
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=runtime-pane-link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-pane-link.js","sourceRoot":"","sources":["../src/runtime-pane-link.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface PaneMcpOwner {
|
|
2
|
+
hostBootId: string;
|
|
3
|
+
paneId: string;
|
|
4
|
+
launchId: string;
|
|
5
|
+
agentId: string;
|
|
6
|
+
instance: string;
|
|
7
|
+
}
|
|
8
|
+
export type PaneMcpBody = {
|
|
9
|
+
op: "pane-mcp";
|
|
10
|
+
owner: PaneMcpOwner;
|
|
11
|
+
helperId: string;
|
|
12
|
+
} & ({
|
|
13
|
+
method: "tools/list";
|
|
14
|
+
params: Record<string, never>;
|
|
15
|
+
} | {
|
|
16
|
+
method: "presence";
|
|
17
|
+
params: Record<string, never>;
|
|
18
|
+
} | {
|
|
19
|
+
method: "tools/call";
|
|
20
|
+
callId: string;
|
|
21
|
+
params: {
|
|
22
|
+
name: string;
|
|
23
|
+
arguments: Record<string, unknown>;
|
|
24
|
+
};
|
|
25
|
+
} | {
|
|
26
|
+
method: "response-written";
|
|
27
|
+
callId: string;
|
|
28
|
+
responseId: string;
|
|
29
|
+
});
|
|
30
|
+
export declare function validatePaneMcpOwner(value: unknown): PaneMcpOwner;
|
|
31
|
+
export declare function validatePaneMcpBody(value: unknown): PaneMcpBody;
|
|
32
|
+
export declare function samePaneMcpOwner(a: PaneMcpOwner, b: PaneMcpOwner): boolean;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** Provider-independent persistent pane MCP identity, separate from per-turn exec grants. */
|
|
2
|
+
import { validWindowsAgentId } from "./windows-cli-worker.js";
|
|
3
|
+
function object(value) { return !!value && typeof value === "object" && !Array.isArray(value); }
|
|
4
|
+
export function validatePaneMcpOwner(value) {
|
|
5
|
+
if (!object(value) || Object.keys(value).some(key => !["hostBootId", "paneId", "launchId", "agentId", "instance"].includes(key))
|
|
6
|
+
|| ![value.hostBootId, value.paneId, value.launchId, value.agentId].every(validWindowsAgentId)
|
|
7
|
+
|| typeof value.instance !== "string" || !/^[\p{L}\p{N}_.-]{1,160}$/u.test(value.instance))
|
|
8
|
+
throw Error("Invalid pane MCP owner");
|
|
9
|
+
return value;
|
|
10
|
+
}
|
|
11
|
+
export function validatePaneMcpBody(value) {
|
|
12
|
+
if (!object(value) || value.op !== "pane-mcp" || !validWindowsAgentId(value.helperId)
|
|
13
|
+
|| Buffer.byteLength(JSON.stringify(value)) > 64 * 1024)
|
|
14
|
+
throw Error("Invalid pane MCP request");
|
|
15
|
+
validatePaneMcpOwner(value.owner);
|
|
16
|
+
const common = ["op", "owner", "helperId", "method"];
|
|
17
|
+
if (value.method === "tools/list" || value.method === "presence") {
|
|
18
|
+
if (Object.keys(value).some(key => ![...common, "params"].includes(key)) || !object(value.params) || Object.keys(value.params).length)
|
|
19
|
+
throw Error("Invalid pane MCP menu request");
|
|
20
|
+
}
|
|
21
|
+
else if (value.method === "tools/call") {
|
|
22
|
+
if (Object.keys(value).some(key => ![...common, "callId", "params"].includes(key)) || typeof value.callId !== "string" || !/^[a-f0-9]{64}$/.test(value.callId)
|
|
23
|
+
|| !object(value.params) || Object.keys(value.params).some(key => !["name", "arguments"].includes(key)) || typeof value.params.name !== "string"
|
|
24
|
+
|| !/^[a-z][a-z0-9_]{0,63}$/.test(value.params.name) || !object(value.params.arguments))
|
|
25
|
+
throw Error("Invalid pane MCP tool call");
|
|
26
|
+
}
|
|
27
|
+
else if (value.method === "response-written") {
|
|
28
|
+
if (Object.keys(value).some(key => ![...common, "callId", "responseId"].includes(key)) || typeof value.callId !== "string" || !/^[a-f0-9]{64}$/.test(value.callId)
|
|
29
|
+
|| typeof value.responseId !== "string" || !/^[a-f0-9]{64}$/.test(value.responseId))
|
|
30
|
+
throw Error("Invalid pane MCP response receipt");
|
|
31
|
+
}
|
|
32
|
+
else
|
|
33
|
+
throw Error("Unsupported pane MCP method");
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
export function samePaneMcpOwner(a, b) {
|
|
37
|
+
return a.hostBootId === b.hostBootId && a.paneId === b.paneId && a.launchId === b.launchId && a.agentId === b.agentId && a.instance === b.instance;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=runtime-pane-mcp-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-pane-mcp-protocol.js","sourceRoot":"","sources":["../src/runtime-pane-mcp-protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import { type PaneMcpBody, type PaneMcpOwner } from "./runtime-pane-mcp-protocol.js";
|
|
3
|
+
import type { PaneMcpConnection } from "./windows-pane-mcp.js";
|
|
4
|
+
export interface PaneMcpRelayOptions {
|
|
5
|
+
secret: string;
|
|
6
|
+
endpoint(): string;
|
|
7
|
+
owned(owner: PaneMcpOwner): boolean;
|
|
8
|
+
forward(body: PaneMcpBody, current: () => boolean): Promise<unknown>;
|
|
9
|
+
}
|
|
10
|
+
export declare class PaneMcpRelay {
|
|
11
|
+
private options;
|
|
12
|
+
private pending;
|
|
13
|
+
constructor(options: PaneMcpRelayOptions);
|
|
14
|
+
private token;
|
|
15
|
+
connection(owner: PaneMcpOwner, tools: string[]): PaneMcpConnection;
|
|
16
|
+
handle(req: IncomingMessage, res: ServerResponse): Promise<void>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/** Local pane-scoped MCP endpoint. The CLI never receives the host or enrollment credential. */
|
|
2
|
+
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
3
|
+
import { validatePaneMcpBody, validatePaneMcpOwner } from "./runtime-pane-mcp-protocol.js";
|
|
4
|
+
function key(owner) { return JSON.stringify([owner.hostBootId, owner.paneId, owner.launchId, owner.agentId, owner.instance]); }
|
|
5
|
+
export class PaneMcpRelay {
|
|
6
|
+
options;
|
|
7
|
+
pending = 0;
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this.options = options;
|
|
10
|
+
}
|
|
11
|
+
token(owner) { return createHmac("sha256", this.options.secret).update(key(owner)).digest("hex"); }
|
|
12
|
+
connection(owner, tools) {
|
|
13
|
+
validatePaneMcpOwner(owner);
|
|
14
|
+
if (!this.options.owned(owner))
|
|
15
|
+
throw Error("Pane MCP owner is unavailable");
|
|
16
|
+
return { endpoint: this.options.endpoint(), token: this.token(owner), owner: { ...owner }, tools: [...tools] };
|
|
17
|
+
}
|
|
18
|
+
async handle(req, res) {
|
|
19
|
+
const answer = (status, value) => {
|
|
20
|
+
if (res.destroyed || res.writableEnded)
|
|
21
|
+
return;
|
|
22
|
+
const text = JSON.stringify(value);
|
|
23
|
+
if (Buffer.byteLength(text) > 192 * 1024) {
|
|
24
|
+
res.writeHead(503);
|
|
25
|
+
res.end();
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
res.writeHead(status, { "Content-Type": "application/json", "Cache-Control": "no-store" });
|
|
29
|
+
res.end(text);
|
|
30
|
+
};
|
|
31
|
+
if (req.method !== "POST" || req.url !== "/agent" || req.headers.origin !== undefined || req.headers.cookie !== undefined
|
|
32
|
+
|| !["127.0.0.1", "::1", "::ffff:127.0.0.1"].includes(req.socket.remoteAddress ?? "")
|
|
33
|
+
|| typeof req.headers["x-agend-native-token"] !== "string" || !/^[a-f0-9]{64}$/.test(req.headers["x-agend-native-token"])
|
|
34
|
+
|| this.pending >= 32) {
|
|
35
|
+
answer(403, { error: "Pane MCP scope is unavailable" });
|
|
36
|
+
req.resume();
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
this.pending++;
|
|
40
|
+
try {
|
|
41
|
+
const chunks = [];
|
|
42
|
+
let size = 0;
|
|
43
|
+
req.setTimeout(10_000, () => req.destroy());
|
|
44
|
+
for await (const part of req) {
|
|
45
|
+
const chunk = Buffer.isBuffer(part) ? part : Buffer.from(part);
|
|
46
|
+
size += chunk.length;
|
|
47
|
+
if (size > 64 * 1024)
|
|
48
|
+
throw Error("Pane MCP request limit");
|
|
49
|
+
chunks.push(chunk);
|
|
50
|
+
}
|
|
51
|
+
req.setTimeout(0);
|
|
52
|
+
const body = validatePaneMcpBody(JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(Buffer.concat(chunks))));
|
|
53
|
+
const supplied = req.headers["x-agend-native-token"];
|
|
54
|
+
if (!timingSafeEqual(Buffer.from(supplied), Buffer.from(this.token(body.owner))) || !this.options.owned(body.owner))
|
|
55
|
+
throw Error("Pane MCP scope is unavailable");
|
|
56
|
+
const current = () => !res.destroyed && !res.writableEnded && this.options.owned(body.owner);
|
|
57
|
+
const result = await this.options.forward(body, current);
|
|
58
|
+
if (!current())
|
|
59
|
+
throw Error("Pane MCP lease expired");
|
|
60
|
+
answer(200, result);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
answer(403, { error: "Pane MCP request was refused or is unconfirmed; it was not replayed" });
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
this.pending--;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=runtime-pane-mcp-relay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-pane-mcp-relay.js","sourceRoot":"","sources":["../src/runtime-pane-mcp-relay.ts"],"names":[],"mappings":"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"}
|