aws-runtime-bridge 1.9.172 → 1.9.179
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/CHANGELOG.md +314 -0
- package/README.md +61 -2
- package/dist/adapter/AcodeSdkAdapter.d.ts +374 -1
- package/dist/adapter/AcodeSdkAdapter.js +3 -3
- package/dist/adapter/AdapterRegistry.d.ts +28 -0
- package/dist/adapter/ClaudeSdkAdapter.d.ts +71 -0
- package/dist/adapter/CodexSdkAdapter.d.ts +14 -0
- package/dist/adapter/OpencodeSdkAdapter.d.ts +44 -0
- package/dist/adapter/acode-tool-names.d.ts +9 -0
- package/dist/adapter/idle-poll-loop.d.ts +20 -0
- package/dist/adapter/index.d.ts +3 -0
- package/dist/adapter/instance-ai-config-resolver.d.ts +20 -0
- package/dist/adapter/prompts.d.ts +12 -0
- package/dist/adapter/types.d.ts +184 -0
- package/dist/browser/browser-bootstrap.d.ts +15 -0
- package/dist/browser/browser-connect-token.d.ts +11 -0
- package/dist/browser/browser-frame-encode.d.ts +32 -0
- package/dist/browser/browser-pool.d.ts +129 -0
- package/dist/browser/browser-profile-store.d.ts +41 -0
- package/dist/browser/browser-ws-bridge.d.ts +20 -0
- package/dist/browser/built-in-browser-tools.d.ts +44 -0
- package/dist/browser/element-locator.d.ts +25 -0
- package/dist/browser/element-picker.d.ts +30 -0
- package/dist/browser/frame-encode.d.ts +19 -0
- package/dist/browser/input-dispatcher.d.ts +35 -0
- package/dist/browser/listener-store.d.ts +44 -0
- package/dist/browser/page-listener-manager.d.ts +88 -0
- package/dist/browser/page-listener-types.d.ts +38 -0
- package/dist/browser/screencast-differ.d.ts +10 -0
- package/dist/browser/screencast-manager.d.ts +94 -0
- package/dist/browser/snapshot-serializer.d.ts +56 -0
- package/dist/browser/ssrf-guard.d.ts +44 -0
- package/dist/browser/stealth.d.ts +21 -0
- package/dist/browser/step-archive.d.ts +13 -0
- package/dist/browser/types.d.ts +100 -0
- package/dist/browser/ws-server.d.ts +54 -0
- package/dist/config.d.ts +138 -2
- package/dist/config.js +2 -2
- package/dist/desktop/built-in-desktop-tools.d.ts +68 -0
- package/dist/desktop/built-in-desktop-tools.js +2 -1
- package/dist/desktop/desktop-control.d.ts +142 -0
- package/dist/desktop/desktop-control.js +2 -0
- package/dist/desktop/desktop-mcp-client.d.ts +28 -0
- package/dist/desktop/desktop-staleness.d.ts +66 -0
- package/dist/desktop/desktop-staleness.js +2 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +1 -1
- package/dist/middleware/auth.d.ts +26 -0
- package/dist/middleware/auth.js +1 -1
- package/dist/remote-desktop/computer-control.d.ts +3 -0
- package/dist/remote-desktop/coords.d.ts +6 -0
- package/dist/remote-desktop/frame-backpressure.d.ts +10 -0
- package/dist/remote-desktop/frame-encode.d.ts +3 -0
- package/dist/remote-desktop/index.js +2 -2
- package/dist/remote-desktop/input-dispatcher.d.ts +4 -0
- package/dist/remote-desktop/permission-manager.d.ts +3 -0
- package/dist/remote-desktop/screen-capture.d.ts +91 -0
- package/dist/remote-desktop/session-manager.d.ts +47 -0
- package/dist/remote-desktop/session-manager.js +1 -1
- package/dist/remote-desktop/system-backend.d.ts +64 -0
- package/dist/remote-desktop/types.d.ts +25 -0
- package/dist/remote-desktop/ui-automation.d.ts +11 -0
- package/dist/remote-desktop/win32-api.d.ts +10 -0
- package/dist/routes/acode-todos.d.ts +13 -0
- package/dist/routes/agent-state.d.ts +15 -0
- package/dist/routes/ai-sources.js +1 -1
- package/dist/routes/background-tasks.d.ts +18 -0
- package/dist/routes/background-tasks.js +2 -2
- package/dist/routes/bridge-temp-files.d.ts +1 -0
- package/dist/routes/bridge-temp-files.js +2 -0
- package/dist/routes/browser-listeners.d.ts +17 -0
- package/dist/routes/browser-sessions.d.ts +10 -0
- package/dist/routes/capabilities.js +1 -1
- package/dist/routes/dashboard-icon.d.ts +9 -0
- package/dist/routes/dashboard-icon.js +2 -0
- package/dist/routes/dashboard-theme.d.ts +24 -0
- package/dist/routes/dashboard-theme.js +157 -0
- package/dist/routes/dashboard.d.ts +9 -0
- package/dist/routes/dashboard.js +2021 -628
- package/dist/routes/debug-mount.d.ts +16 -0
- package/dist/routes/desktop-control.d.ts +15 -0
- package/dist/routes/desktop-control.js +2 -0
- package/dist/routes/events.d.ts +4 -0
- package/dist/routes/file-browser.d.ts +15 -10
- package/dist/routes/file-browser.js +1 -1
- package/dist/routes/file-change-diff.d.ts +25 -0
- package/dist/routes/file-diff-rollback.d.ts +28 -0
- package/dist/routes/file-snapshot.d.ts +7 -0
- package/dist/routes/git.d.ts +185 -0
- package/dist/routes/git.js +34 -34
- package/dist/routes/instance-tool-status.d.ts +5 -0
- package/dist/routes/instance.d.ts +8 -0
- package/dist/routes/instance.js +1 -1
- package/dist/routes/jdks.d.ts +4 -0
- package/dist/routes/launch.d.ts +5 -0
- package/dist/routes/lsp-providers.d.ts +11 -0
- package/dist/routes/lsp-providers.js +2 -0
- package/dist/routes/lsp.d.ts +41 -0
- package/dist/routes/lsp.js +4 -2
- package/dist/routes/mcp-extra.d.ts +15 -0
- package/dist/routes/mcp.d.ts +16 -0
- package/dist/routes/mcp.js +1 -1
- package/dist/routes/plugins.d.ts +19 -0
- package/dist/routes/plugins.js +1 -1
- package/dist/routes/processes.d.ts +4 -0
- package/dist/routes/properties.d.ts +4 -0
- package/dist/routes/pty.d.ts +29 -0
- package/dist/routes/runtime-binding.d.ts +3 -0
- package/dist/routes/sessions.d.ts +22 -0
- package/dist/routes/sessions.js +1 -1
- package/dist/routes/skills.d.ts +15 -0
- package/dist/routes/skills.js +1 -1
- package/dist/routes/sub-agents.d.ts +11 -0
- package/dist/routes/sub-agents.js +1 -1
- package/dist/routes/task-context.d.ts +5 -0
- package/dist/routes/tech-stack.d.ts +6 -0
- package/dist/routes/tech-stack.js +2 -0
- package/dist/routes/terminal.d.ts +122 -0
- package/dist/routes/terminal.js +22 -22
- package/dist/routes/workspace-index.d.ts +12 -0
- package/dist/routes/workspace-index.js +2 -0
- package/dist/routes/yml.d.ts +4 -0
- package/dist/scripts/migrate-user-scopes.d.ts +26 -0
- package/dist/scripts/migrate-user-scopes.js +2 -0
- package/dist/services/access-control.d.ts +21 -0
- package/dist/services/acode-bg-manager.d.ts +21 -0
- package/dist/services/acode-package.d.ts +10 -0
- package/dist/services/acode-package.js +1 -1
- package/dist/services/agent-capability-sync.d.ts +26 -0
- package/dist/services/agent-capability-sync.js +1 -1
- package/dist/services/agent-event-store.d.ts +20 -0
- package/dist/services/agent-ownership.d.ts +58 -0
- package/dist/services/agent-ownership.js +3 -0
- package/dist/services/agent-process-manager.d.ts +154 -0
- package/dist/services/agent-pty-manager.d.ts +39 -0
- package/dist/services/agent-pty-manager.js +5 -4
- package/dist/services/agent-startup-memory.d.ts +34 -0
- package/dist/services/agent-startup-memory.js +4 -4
- package/dist/services/ai-config-service.d.ts +26 -52
- package/dist/services/ai-config-service.js +1 -3
- package/dist/services/ai-source-apply.d.ts +7 -15
- package/dist/services/ai-source-apply.js +1 -1
- package/dist/services/auto-register.d.ts +165 -1
- package/dist/services/auto-register.js +1 -1
- package/dist/services/aws-client-agent-mcp.d.ts +14 -0
- package/dist/services/aws-client-agent-mcp.js +2 -2
- package/dist/services/bridge-package-publish-hooks.d.ts +14 -0
- package/dist/services/bridge-pairing.d.ts +82 -0
- package/dist/services/bridge-pairing.js +2 -0
- package/dist/services/bridge-temp-files.d.ts +65 -0
- package/dist/services/bridge-temp-files.js +2 -0
- package/dist/services/browser-session-manager.d.ts +71 -0
- package/dist/services/capability-config.d.ts +60 -15
- package/dist/services/capability-config.js +2 -2
- package/dist/services/change-cache-retention.d.ts +9 -0
- package/dist/services/changelog.d.ts +9 -0
- package/dist/services/cli-commands.d.ts +82 -0
- package/dist/services/cli-commands.js +6 -6
- package/dist/services/connection-key-rotation.d.ts +27 -0
- package/dist/services/connection-key-rotation.js +2 -0
- package/dist/services/debug-mount.d.ts +49 -0
- package/dist/services/desktop-mcp-manager.d.ts +103 -1
- package/dist/services/desktop-mcp-manager.js +1 -1
- package/dist/services/event-delta-pusher.d.ts +15 -0
- package/dist/services/fileSnapshotStore.d.ts +42 -0
- package/dist/services/fileSnapshotStore.js +1 -1
- package/dist/services/gitignore.d.ts +21 -0
- package/dist/services/gitignore.js +2 -0
- package/dist/services/instance-ai-config-service.d.ts +9 -0
- package/dist/services/instance-ai-config-service.js +1 -1
- package/dist/services/instance-features.d.ts +127 -0
- package/dist/services/instance-features.js +1 -1
- package/dist/services/instance-init-service.d.ts +3 -0
- package/dist/services/instance-init-service.js +1 -1
- package/dist/services/instance-state.d.ts +23 -0
- package/dist/services/jdk-scanner.d.ts +15 -0
- package/dist/services/launch-manager.d.ts +138 -0
- package/dist/services/launch-metrics.d.ts +42 -0
- package/dist/services/launch-streams.d.ts +19 -0
- package/dist/services/lifecycle-state.d.ts +5 -0
- package/dist/services/log-retention.d.ts +38 -0
- package/dist/services/log-retention.js +1 -1
- package/dist/services/lsp/install-manager.d.ts +55 -0
- package/dist/services/lsp/install-manager.js +2 -0
- package/dist/services/lsp/provider-registry.d.ts +108 -0
- package/dist/services/lsp/provider-registry.js +2 -0
- package/dist/services/lsp/uri-rewrite.d.ts +44 -0
- package/dist/services/lsp/uri-rewrite.js +2 -0
- package/dist/services/lsp-stdio-bridge.d.ts +41 -4
- package/dist/services/lsp-stdio-bridge.js +3 -3
- package/dist/services/mcp-deploy.d.ts +45 -4
- package/dist/services/mcp-deploy.js +4 -4
- package/dist/services/mcp-env-injector.d.ts +52 -0
- package/dist/services/mcp-launch-binding-queue.d.ts +12 -0
- package/dist/services/mcp-package.d.ts +22 -0
- package/dist/services/mcp-package.js +1 -1
- package/dist/services/mcp-probe-client.d.ts +19 -0
- package/dist/services/mcp-probe-client.js +1 -1
- package/dist/services/open-doc-events.d.ts +43 -0
- package/dist/services/open-doc-events.js +2 -0
- package/dist/services/open-doc-registry.d.ts +59 -0
- package/dist/services/open-doc-registry.js +2 -0
- package/dist/services/orphan-monitor.d.ts +43 -0
- package/dist/services/panel-auth.d.ts +24 -0
- package/dist/services/panel-env.d.ts +28 -0
- package/dist/services/plugin-deployment.d.ts +34 -1
- package/dist/services/plugin-deployment.js +2 -2
- package/dist/services/plugin-event-buffer.d.ts +21 -0
- package/dist/services/plugin-fs.d.ts +11 -0
- package/dist/services/plugin-handler-adapter.d.ts +13 -0
- package/dist/services/plugin-listener-runner.d.ts +10 -0
- package/dist/services/plugin-loader.d.ts +15 -0
- package/dist/services/plugin-manager.d.ts +95 -9
- package/dist/services/plugin-manager.js +4 -4
- package/dist/services/plugin-manifest.d.ts +14 -0
- package/dist/services/plugin-package.d.ts +13 -0
- package/dist/services/plugin-runtime.d.ts +15 -0
- package/dist/services/port-detector.d.ts +15 -0
- package/dist/services/process-detail.d.ts +3 -0
- package/dist/services/process-detector.d.ts +132 -0
- package/dist/services/process-registry.d.ts +120 -0
- package/dist/services/process-top.d.ts +6 -0
- package/dist/services/request-identity.d.ts +77 -0
- package/dist/services/request-identity.js +2 -0
- package/dist/services/request-invalid-dump.d.ts +4 -0
- package/dist/services/request-invalid-dump.js +1 -1
- package/dist/services/ring-buffer.d.ts +33 -0
- package/dist/services/runtime-binding.d.ts +56 -4
- package/dist/services/runtime-binding.js +4 -4
- package/dist/services/runtime-lifecycle-policy.d.ts +17 -0
- package/dist/services/runtime-resources-snapshot.d.ts +26 -0
- package/dist/services/runtime-resources-snapshot.js +2 -2
- package/dist/services/sdk-tool-file-change-recorder.d.ts +9 -0
- package/dist/services/session-output.d.ts +63 -0
- package/dist/services/session-output.js +3 -3
- package/dist/services/skill-manager.d.ts +42 -5
- package/dist/services/skill-manager.js +3 -3
- package/dist/services/snapshot-retention.d.ts +30 -0
- package/dist/services/snapshot-retention.js +2 -0
- package/dist/services/startup-config-wizard.d.ts +7 -1
- package/dist/services/startup-config-wizard.js +10 -10
- package/dist/services/system-metrics.d.ts +3 -0
- package/dist/services/tech-stack-scanner.d.ts +43 -0
- package/dist/services/tech-stack-scanner.js +2 -0
- package/dist/services/terminal-persistence.d.ts +43 -0
- package/dist/services/tool-installer.d.ts +12 -0
- package/dist/services/tunnel-client.d.ts +99 -2
- package/dist/services/tunnel-client.js +1 -1
- package/dist/services/update-log.d.ts +6 -0
- package/dist/services/update-notifier.d.ts +17 -0
- package/dist/services/update-notifier.js +2 -2
- package/dist/services/user-scope.d.ts +115 -0
- package/dist/services/user-scope.js +2 -0
- package/dist/services/windows-service-manager.d.ts +12 -0
- package/dist/services/workspace-files.d.ts +64 -0
- package/dist/services/workspace-index/index-manager.d.ts +46 -0
- package/dist/services/workspace-index/index-manager.js +2 -0
- package/dist/services/workspace-index/indexer.d.ts +15 -0
- package/dist/services/workspace-index/indexer.js +2 -0
- package/dist/services/workspace-index/query.d.ts +74 -0
- package/dist/services/workspace-index/query.js +5 -0
- package/dist/services/workspace-index/resolver.d.ts +26 -0
- package/dist/services/workspace-index/resolver.js +2 -0
- package/dist/services/workspace-index/types.d.ts +89 -0
- package/dist/services/workspace-index/types.js +2 -0
- package/dist/services/workspace-watch.d.ts +4 -0
- package/dist/services/workspaceTaskChangeWatcher.d.ts +49 -0
- package/dist/services/workspaceTaskChangeWatcher.js +2 -2
- package/dist/types.d.ts +9 -0
- package/dist/utils/config-write-queue.d.ts +11 -0
- package/dist/utils/env-safety.d.ts +21 -0
- package/dist/utils/file-utils.d.ts +15 -0
- package/dist/utils/instance-ai-config-debug-logger.d.ts +15 -0
- package/dist/utils/lifecycle-log.d.ts +5 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.js +2 -1
- package/dist/utils/npm-version.d.ts +10 -0
- package/dist/utils/path-utils.d.ts +12 -0
- package/dist/utils/scheduler-url.d.ts +18 -0
- package/dist/utils/scheduler-url.js +2 -0
- package/dist/utils/sdk-package-loader.d.ts +13 -0
- package/dist/utils/sdk-package-loader.js +1 -1
- package/dist/utils/target-identity.d.ts +31 -0
- package/dist/utils/target-identity.js +2 -0
- package/dist/utils/validation.d.ts +17 -0
- package/dist/utils/yaml-utils.d.ts +48 -0
- package/package/acode/dist/__tests__/summary-request-helper.d.ts +12 -0
- package/package/acode/dist/__tests__/summary-request-helper.js +2 -0
- package/package/acode/dist/ask-user-question-tool.d.ts +17 -0
- package/package/acode/dist/await-complete-tool.d.ts +12 -0
- package/package/acode/dist/background-command-manager.d.ts +105 -0
- package/package/acode/dist/background-command-store.d.ts +27 -0
- package/package/acode/dist/background-command-tools.d.ts +8 -0
- package/package/acode/dist/background-output-ringbuffer.d.ts +15 -0
- package/package/acode/dist/built-in-file-tools.d.ts +65 -0
- package/package/acode/dist/built-in-symbols-tool.d.ts +3 -0
- package/package/acode/dist/builtins/commandArtifacts.d.ts +3 -0
- package/package/acode/dist/builtins/shellCommandPreparation.d.ts +17 -0
- package/package/acode/dist/builtins/shellCommandRunner.d.ts +4 -0
- package/package/acode/dist/builtins/shellOutputDecoder.d.ts +15 -0
- package/package/acode/dist/cache-control.d.ts +71 -0
- package/package/acode/dist/cache-control.js +2 -0
- package/package/acode/dist/commands/commandLoader.d.ts +3 -0
- package/package/acode/dist/commands/commandParser.d.ts +3 -0
- package/package/acode/dist/commands/commandRegistry.d.ts +3 -0
- package/package/acode/dist/compaction.d.ts +388 -4
- package/package/acode/dist/compaction.js +19 -17
- package/package/acode/dist/config.d.ts +3 -0
- package/package/acode/dist/context-overflow.d.ts +32 -0
- package/package/acode/dist/fs-utils.d.ts +18 -0
- package/package/acode/dist/hooks/hookBus.d.ts +3 -0
- package/package/acode/dist/image-utils.d.ts +35 -0
- package/package/acode/dist/index.d.ts +1 -0
- package/package/acode/dist/index.js +1 -1
- package/package/acode/dist/mcpToolNames.d.ts +32 -0
- package/package/acode/dist/microcompact.d.ts +110 -0
- package/package/acode/dist/microcompact.js +2 -0
- package/package/acode/dist/parsers/ast-cache.d.ts +41 -0
- package/package/acode/dist/parsers/file-index.d.ts +83 -0
- package/package/acode/dist/parsers/file-index.js +4 -0
- package/package/acode/dist/parsers/language-detector.d.ts +4 -0
- package/package/acode/dist/parsers/tree-sitter-loader.d.ts +12 -0
- package/package/acode/dist/parsers/types.d.ts +11 -0
- package/package/acode/dist/paths.d.ts +14 -0
- package/package/acode/dist/plugin-types.d.ts +34 -0
- package/package/acode/dist/read-file-state.d.ts +15 -0
- package/package/acode/dist/runtime-environment.d.ts +16 -0
- package/package/acode/dist/runtime.d.ts +828 -9
- package/package/acode/dist/runtime.js +40 -33
- package/package/acode/dist/skill-tool.d.ts +20 -0
- package/package/acode/dist/sub-agent-manager.d.ts +169 -0
- package/package/acode/dist/sub-agent-manager.js +1 -1
- package/package/acode/dist/sub-agent-store.d.ts +50 -0
- package/package/acode/dist/sub-agent-tools.d.ts +15 -0
- package/package/acode/dist/sub-agent-types.d.ts +13 -0
- package/package/acode/dist/terminal-tool.d.ts +15 -0
- package/package/acode/dist/terminal-types.d.ts +10 -0
- package/package/acode/dist/todo-store.d.ts +15 -0
- package/package/acode/dist/token-estimator.d.ts +32 -0
- package/package/acode/dist/token-estimator.js +2 -0
- package/package/acode/dist/tool-allocation.d.ts +113 -0
- package/package/acode/dist/tool-concurrency/index.d.ts +8 -0
- package/package/acode/dist/tool-concurrency/observability.d.ts +32 -0
- package/package/acode/dist/tool-concurrency/resource-lock.d.ts +30 -0
- package/package/acode/dist/tool-concurrency/scheduler.d.ts +19 -0
- package/package/acode/dist/tool-concurrency/types.d.ts +57 -0
- package/package/acode/dist/tool-group-manager.d.ts +195 -0
- package/package/acode/dist/tool-group-manager.js +4 -4
- package/package/acode/dist/types.d.ts +192 -0
- package/package/aws-client-agent-mcp/README.md +130 -215
- package/package/aws-client-agent-mcp/dist/ability-market-tools.d.ts +57 -0
- package/package/aws-client-agent-mcp/dist/ability-market-tools.js +1 -1
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts +290 -3
- package/package/aws-client-agent-mcp/dist/agent-client.js +1 -1
- package/package/aws-client-agent-mcp/dist/config.d.ts +18 -0
- package/package/aws-client-agent-mcp/dist/constants.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts +70 -0
- package/package/aws-client-agent-mcp/dist/http-client.d.ts +61 -0
- package/package/aws-client-agent-mcp/dist/index.d.ts +10 -0
- package/package/aws-client-agent-mcp/dist/logger.d.ts +24 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +610 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.js +25 -23
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +158 -0
- package/package/aws-client-agent-mcp/dist/mcp-tools.js +38 -22
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts +102 -2
- package/package/aws-client-agent-mcp/dist/memory-store.js +27 -2
- package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +18 -0
- package/package/aws-client-agent-mcp/dist/memory-tools.js +13 -9
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +86 -0
- package/package/aws-client-agent-mcp/dist/messageContent.d.ts +24 -0
- package/package/aws-client-agent-mcp/dist/office/office-equation.d.ts +19 -0
- package/package/aws-client-agent-mcp/dist/office/office-image.d.ts +18 -0
- package/package/aws-client-agent-mcp/dist/office/office-workspace.d.ts +29 -0
- package/package/aws-client-agent-mcp/dist/parent-lifecycle.d.ts +18 -0
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts +6 -0
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +5 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.js +1 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.d.ts +41 -0
- package/package/aws-client-agent-mcp/dist/tool-groups.d.ts +136 -0
- package/package/aws-client-agent-mcp/dist/types.d.ts +174 -0
- package/package/aws-client-agent-mcp/dist/watchdog.d.ts +7 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +108 -0
- package/package.json +1 -1
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
export type DesktopActionStatus = "started" | "done" | "error" | "rejected";
|
|
25
|
+
|
|
26
|
+
export type DesktopActionRejectReason = "paused" | "human-control";
|
|
27
|
+
|
|
28
|
+
export interface DesktopActionEvent {
|
|
29
|
+
id: string;
|
|
30
|
+
|
|
31
|
+
seq: number;
|
|
32
|
+
ts: number;
|
|
33
|
+
|
|
34
|
+
tool: string;
|
|
35
|
+
|
|
36
|
+
action: string;
|
|
37
|
+
|
|
38
|
+
summary: string;
|
|
39
|
+
|
|
40
|
+
x?: number;
|
|
41
|
+
y?: number;
|
|
42
|
+
|
|
43
|
+
x2?: number;
|
|
44
|
+
y2?: number;
|
|
45
|
+
|
|
46
|
+
screenId?: string;
|
|
47
|
+
button?: string;
|
|
48
|
+
|
|
49
|
+
text?: string;
|
|
50
|
+
|
|
51
|
+
keys?: string;
|
|
52
|
+
amount?: number;
|
|
53
|
+
status: DesktopActionStatus;
|
|
54
|
+
reason?: DesktopActionRejectReason;
|
|
55
|
+
|
|
56
|
+
error?: string;
|
|
57
|
+
durationMs?: number;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export interface DesktopControlState {
|
|
61
|
+
paused: boolean;
|
|
62
|
+
pausedBy?: string;
|
|
63
|
+
pausedAt?: number;
|
|
64
|
+
humanControlActive: boolean;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export interface DesktopScreenGeometry {
|
|
68
|
+
id: string;
|
|
69
|
+
x: number;
|
|
70
|
+
y: number;
|
|
71
|
+
width: number;
|
|
72
|
+
height: number;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export interface DesktopActionDraft {
|
|
76
|
+
action: string;
|
|
77
|
+
summary: string;
|
|
78
|
+
x?: number;
|
|
79
|
+
y?: number;
|
|
80
|
+
x2?: number;
|
|
81
|
+
y2?: number;
|
|
82
|
+
screenId?: string;
|
|
83
|
+
button?: string;
|
|
84
|
+
text?: string;
|
|
85
|
+
keys?: string;
|
|
86
|
+
amount?: number;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export declare function registerBroadcaster(fn: (agentId: string, type: string, data: unknown) => void): void;
|
|
90
|
+
|
|
91
|
+
export declare function registerProviders(providers: {
|
|
92
|
+
humanControl: (agentId: string) => boolean;
|
|
93
|
+
screenGeometry: (agentId: string) => DesktopScreenGeometry[] | null;
|
|
94
|
+
}): void;
|
|
95
|
+
|
|
96
|
+
export declare function setPaused(agentId: string, paused: boolean, by?: string): DesktopControlState;
|
|
97
|
+
|
|
98
|
+
export declare function isPaused(agentId: string): boolean;
|
|
99
|
+
|
|
100
|
+
export declare function isHumanControlActive(agentId: string): boolean;
|
|
101
|
+
|
|
102
|
+
export declare function getControlState(agentId: string): DesktopControlState;
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
export declare const DESKTOP_INPUT_TOOLS: ReadonlySet<string>;
|
|
109
|
+
|
|
110
|
+
export declare function broadcastControlState(agentId: string): void;
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
export declare function emitDesktopAction(agentId: string, tool: string, draft: DesktopActionDraft, status: DesktopActionStatus, extra?: {
|
|
116
|
+
id?: string;
|
|
117
|
+
reason?: DesktopActionRejectReason;
|
|
118
|
+
error?: string;
|
|
119
|
+
durationMs?: number;
|
|
120
|
+
}): DesktopActionEvent;
|
|
121
|
+
|
|
122
|
+
export declare function getRecentActions(agentId: string): DesktopActionEvent[];
|
|
123
|
+
|
|
124
|
+
export declare function clearForTests(): void;
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
export declare function normalizeScreenPoint(agentId: string, px: number, py: number): {
|
|
130
|
+
x: number;
|
|
131
|
+
y: number;
|
|
132
|
+
screenId: string;
|
|
133
|
+
} | null;
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
export declare function describeDesktopAction(agentId: string, tool: string, args: Record<string, unknown>): DesktopActionDraft;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{randomUUID as x}from"node:crypto";const m=new Map,l=new Map,_=new Map,w=100,h=80;let a=null,y=null,k=null;function v(n){a=n}function A(n){y=n.humanControl,k=n.screenGeometry}function M(n,c,e="dashboard"){return c?m.set(n,{by:e,at:Date.now()}):m.delete(n),f(n)}function S(n){return m.has(n)}function b(n){return y?y(n):!1}function f(n){const c=m.get(n);return{paused:c!==void 0,pausedBy:c?.by,pausedAt:c?.at,humanControlActive:b(n)}}const P=new Set(["desktop_mouse","desktop_mouse_drag","desktop_input","desktop_click_mark","desktop_smart_click","desktop_uia_click","desktop_clipboard_write","desktop_clipboard_clean","desktop_window_activate","desktop_window_move","desktop_window_resize"]);function C(n){a?.(n,"remote-desktop:ai-control-state",f(n))}function T(n,c,e,r,t){const o=(_.get(n)??0)+1;_.set(n,o);const i={id:t?.id??x(),seq:o,ts:Date.now(),tool:c,action:e.action,summary:e.summary,status:r,...e.x!==void 0&&{x:e.x},...e.y!==void 0&&{y:e.y},...e.x2!==void 0&&{x2:e.x2},...e.y2!==void 0&&{y2:e.y2},...e.screenId!==void 0&&{screenId:e.screenId},...e.button!==void 0&&{button:e.button},...e.text!==void 0&&{text:e.text},...e.keys!==void 0&&{keys:e.keys},...e.amount!==void 0&&{amount:e.amount},...t?.reason!==void 0&&{reason:t.reason},...t?.error!==void 0&&{error:t.error},...t?.durationMs!==void 0&&{durationMs:t.durationMs}},s=l.get(n)??[];return s.push(i),s.length>w&&s.splice(0,s.length-w),l.set(n,s),a?.(n,"remote-desktop:ai-action",i),i}function D(n){return(l.get(n)??[]).slice()}function z(){m.clear(),l.clear(),_.clear(),a=null,y=null,k=null}function u(n,c=h){const e=n.trim();return e.length<=c?e:`${e.slice(0,c)}\u2026`}function d(n){return typeof n=="number"&&Number.isFinite(n)}function p(n,c,e){const r=k?.(n);if(!r||r.length===0)return null;const t=r.find(o=>c>=o.x&&c<o.x+o.width&&e>=o.y&&e<o.y+o.height)??null;return!t||t.width<=0||t.height<=0?null:{x:Math.round((c-t.x)/t.width*1e3),y:Math.round((e-t.y)/t.height*1e3),screenId:t.id}}function N(n,c,e){const r=e.hwnd!==null&&e.hwnd!==void 0;switch(c){case"desktop_mouse":{const t=typeof e.action=="string"?e.action:"",o=typeof e.button=="string"?e.button:void 0;if(t==="click"||t==="double_click"){const i=!r&&d(e.x)&&d(e.y)?p(n,e.x,e.y):null;return{action:t==="click"?"click":"doubleClick",summary:`${t==="click"?"click":"double-click"} ${o??"left"}${i?` @ (${e.x},${e.y})`:r?" (window-relative)":""}`,...i&&{x:i.x,y:i.y,screenId:i.screenId},...o&&{button:o}}}if(t==="move"||t==="hover"){const i=!r&&d(e.x)&&d(e.y)?p(n,e.x,e.y):null;return{action:"move",summary:`move cursor${i?` @ (${e.x},${e.y})`:""}`,...i&&{x:i.x,y:i.y,screenId:i.screenId}}}if(t==="scroll"){const i=typeof e.direction=="string"?e.direction:"down",s=d(e.amount)?e.amount:3;return{action:"scroll",summary:`scroll ${i} \xD7${s}`,amount:s,keys:i}}return t==="position"?{action:"inspect",summary:"query cursor position"}:{action:"other",summary:`mouse ${u(t||"?",24)}`}}case"desktop_mouse_drag":{const t=!r&&d(e.start_x)&&d(e.start_y)?p(n,e.start_x,e.start_y):null,o=!r&&d(e.end_x)&&d(e.end_y)?p(n,e.end_x,e.end_y):null;return{action:"drag",summary:`drag (${e.start_x},${e.start_y}) \u2192 (${e.end_x},${e.end_y})`,...t&&{x:t.x,y:t.y,screenId:t.screenId},...o&&{x2:o.x,y2:o.y}}}case"desktop_input":{const t=typeof e.mode=="string"?e.mode:"";if(t==="type"){const o=typeof e.text=="string"?e.text:"";return{action:"type",summary:`type ${JSON.stringify(u(o,40))}`,...o&&{text:u(o)}}}if(t==="hotkey"){const o=Array.isArray(e.keys)?e.keys.filter(s=>typeof s=="string").join("+"):typeof e.keys=="string"?e.keys:"",i=u(o,40);return{action:"key",summary:`hotkey ${i}`,...i&&{keys:i}}}return{action:"other",summary:`input ${u(t||"?",24)}`}}case"desktop_click_mark":return{action:"click",summary:`click mark #${String(e.mark??"?")}`,...typeof e.button=="string"&&{button:e.button}};case"desktop_smart_click":{const t=typeof e.text=="string"?e.text:"";return{action:"click",summary:`smart click ${JSON.stringify(u(t,40))}`}}case"desktop_uia_click":return{action:"click",summary:"uia click"};case"desktop_screenshot":return{action:"screenshot",summary:e.region?"screenshot (region)":"screenshot (full screen)"};case"desktop_window_screenshot":return{action:"screenshot",summary:"window screenshot"};case"desktop_perceive":return{action:"perceive",summary:"perceive screen elements"};case"desktop_vision":return{action:"vision",summary:"vision analysis"};case"desktop_uia_tree":return{action:"inspect",summary:"read UIA tree"};case"desktop_windows_list":return{action:"inspect",summary:"list windows"};case"desktop_window_info":return{action:"inspect",summary:"window info"};case"desktop_screen_size":return{action:"inspect",summary:"query screen size"};case"desktop_wait_for":return{action:"wait",summary:"wait for screen text"};case"desktop_window_activate":return{action:"window",summary:"activate window"};case"desktop_window_move":return{action:"window",summary:"move window"};case"desktop_window_resize":return{action:"window",summary:"resize window"};case"desktop_clipboard_write":{const t=typeof e.text=="string"?e.text:"";return{action:"clipboard",summary:`clipboard write ${JSON.stringify(u(t,40))}`,...t&&{text:u(t)}}}case"desktop_clipboard_clean":return{action:"clipboard",summary:"clipboard clear"};default:return{action:"other",summary:u(c,40)}}}export{P as DESKTOP_INPUT_TOOLS,C as broadcastControlState,z as clearForTests,N as describeDesktopAction,T as emitDesktopAction,f as getControlState,D as getRecentActions,b as isHumanControlActive,S as isPaused,p as normalizeScreenPoint,v as registerBroadcaster,A as registerProviders,M as setPaused};
|
|
2
|
+
|
|
@@ -1,4 +1,20 @@
|
|
|
1
1
|
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
2
18
|
import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
3
19
|
|
|
4
20
|
export interface DesktopMcpConnectionOptions {
|
|
@@ -37,11 +53,23 @@ export declare class DesktopMcpConnection {
|
|
|
37
53
|
|
|
38
54
|
getRecentStderr(lines?: number): string[];
|
|
39
55
|
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
40
59
|
start(): Promise<DesktopMcpToolInfo[]>;
|
|
41
60
|
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
|
|
42
65
|
callTool(name: string, args: Record<string, unknown>, timeoutMs: number): Promise<string>;
|
|
43
66
|
|
|
44
67
|
close(): Promise<void>;
|
|
45
68
|
}
|
|
46
69
|
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
|
|
47
75
|
export declare function callToolResultToText(result: CallToolResult): string;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
import type { DesktopJsonObject, DesktopToolForwarder } from "./built-in-desktop-tools.js";
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
export declare function normalizePathKey(p: string): string;
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
export declare function recordScreenshotCapture(agentId: string, toolName: string, args: DesktopJsonObject, result: string): void;
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
export declare function recordPerceiveBasis(agentId: string, path: string): Promise<void>;
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
export declare function markFreshObservation(agentId: string): void;
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
export declare function resolveStalenessNote(params: {
|
|
53
|
+
agentId: string;
|
|
54
|
+
toolName: string;
|
|
55
|
+
args: DesktopJsonObject;
|
|
56
|
+
internalForwarder?: DesktopToolForwarder;
|
|
57
|
+
screenshotDir: string;
|
|
58
|
+
}): Promise<string | null>;
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
export declare function screenContentChanged(fileA: string, fileB: string): Promise<boolean | null>;
|
|
65
|
+
|
|
66
|
+
export declare function clearStalenessState(): void;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{rm as w,stat as m}from"node:fs/promises";import{join as y}from"node:path";import{isPaused as _}from"./desktop-control.js";function g(t){return t.trim().replace(/\//g,"\\").toLowerCase()}const k=(()=>{const t=Number.parseInt(process.env.AWS_DESKTOP_STALE_WARN_MS??"",10);return Number.isFinite(t)&&t>0?t:6e4})(),S=5e3,A="staleness-",i=new Map,c=new Map,v=500,p=new Map;function T(t,o,e,r){if(!t||r.startsWith("nuphus-mcp tool error:"))return;let n=null;try{n=JSON.parse(r)}catch{n=null}const a=(typeof n?.path=="string"?n.path.trim():"")||(typeof e.path=="string"?e.path.trim():"");if(!a)return;const u=Date.now(),l={...e};delete l.path;const f={tool:o,args:l,at:u},h=g(a);for(c.delete(h),c.set(h,f);c.size>v;){const d=c.keys().next().value;if(d===void 0)break;c.delete(d)}i.set(t,{file:a,at:u,capture:{tool:o,args:f.args}})}async function x(t,o){if(!t)return;const e=o.trim();if(!e)return;const r=c.get(g(e));if(r){i.set(t,{file:e,at:r.at,capture:{tool:r.tool,args:r.args}});return}try{const n=await m(e);i.set(t,{file:e,at:n.mtimeMs})}catch{}}function F(t){t&&i.set(t,{file:"(fresh)",at:Date.now()})}async function O(t){const{agentId:o,toolName:e,args:r,internalForwarder:n,screenshotDir:s}=t;if(!o||_(o)||!M(e,r))return null;const a=i.get(o);if(!a)return null;const u=Date.now(),l=u-a.at;if(l<=k)return null;const f=a.capture&&n?await E(o,a,n,s):"unknown";if(f==="unchanged")return a.at=u,null;const h=Math.round(l/1e3);return f==="changed"?`[bridge] STALE COORDINATES: the screen content has CHANGED since the screenshot these coordinates came from (${h}s ago). Re-capture with desktop_screenshot + desktop_perceive before clicking, or verify the target is still at these coordinates.`:`[bridge] STALE COORDINATES WARNING: these coordinates are based on a screenshot taken ${h}s ago; the screen may have changed since. If the action misses, re-capture with desktop_screenshot + desktop_perceive first.`}function M(t,o){if(t==="desktop_mouse"){const e=typeof o.action=="string"?o.action:"";return e==="move"||e==="hover"||e==="click"||e==="double_click"}return t==="desktop_mouse_drag"||t==="desktop_click_mark"}async function E(t,o,e,r){const n=p.get(t);if(n&&Date.now()-n.at<S)return n.outcome;const s=await C(o,e,r);return p.set(t,{at:Date.now(),outcome:s}),s}async function C(t,o,e){if(!t.capture)return"unknown";const r=y(e,`${A}${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}.png`);try{const n=t.capture;await o(n.tool,{...n.args,path:r});const s=await D(t.file,r);return s===null?"unknown":s?"changed":"unchanged"}catch{return"unknown"}finally{await w(r,{force:!0}).catch(()=>{})}}async function R(){try{const t=await import("sharp");return t&&t.default||t}catch{return null}}async function D(t,o){const e=await R();if(!e)return null;try{const[r,n]=await Promise.all([e(t).resize(32,32,{fit:"fill"}).grayscale().raw().toBuffer(),e(o).resize(32,32,{fit:"fill"}).grayscale().raw().toBuffer()]);if(r.length!==n.length)return!0;let s=0;for(let a=0;a<r.length;a++)s+=Math.abs(r[a]-n[a]);return s/r.length>3}catch{return null}}function W(){i.clear(),c.clear(),p.clear()}export{W as clearStalenessState,F as markFreshObservation,g as normalizePathKey,x as recordPerceiveBasis,T as recordScreenshotCapture,O as resolveStalenessNote,D as screenContentChanged};
|
|
2
|
+
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{existsSync as T,readFileSync as D}from"node:fs";import M from"node:os";import S from"node:path";import{pathToFileURL as E}from"node:url";import x from"cors";import P from"express";import{adapterRegistry as F}from"./adapter/index.js";import{attachBrowserWebSocketServer as G}from"./browser/browser-ws-bridge.js";import{getAcodeDataHome as L,getActiveBridgeHttpPort as y,getAutoRegisterConfigFilePath as O,getBridgeDataHome as _,getBridgeRuntimePropertiesFilePath as j,getBridgeTemplateConfigFile as K,reserveBridgeListenPort as N,validateProductionToken as W,writeBridgeRuntimePropertiesFile as H}from"./config.js";import{attachRemoteDesktopWebSocketServer as U}from"./remote-desktop/index.js";import{acodeTodosRouter as z}from"./routes/acode-todos.js";import{agentStateRouter as J}from"./routes/agent-state.js";import{aiSourcesRouter as Y}from"./routes/ai-sources.js";import{backgroundTasksRouter as Z}from"./routes/background-tasks.js";import{browserListenersRouter as q}from"./routes/browser-listeners.js";import{browserSessionsRouter as Q}from"./routes/browser-sessions.js";import{capabilitiesRouter as V}from"./routes/capabilities.js";import{computerRouter as X}from"./routes/computer.js";import{dashboardRouter as ee}from"./routes/dashboard.js";import{eventsRouter as re}from"./routes/events.js";import{fileBrowserRouter as te}from"./routes/file-browser.js";import{fileChangeDiffRouter as ie}from"./routes/file-change-diff.js";import{fileDiffRollbackRouter as oe}from"./routes/file-diff-rollback.js";import{fileSnapshotRouter as ne}from"./routes/file-snapshot.js";import{gitRouter as se}from"./routes/git.js";import{instanceRouter as ae,setGracefulShutdownFn as me}from"./routes/instance.js";import{jdksRouter as ue}from"./routes/jdks.js";import{launchRouter as ce}from"./routes/launch.js";import{attachLspWebSocketServer as de}from"./routes/lsp.js";import{ltrRouter as ge}from"./routes/ltr.js";import{debugMountRouter as pe}from"./routes/debug-mount.js";import{mcpExtraRouter as fe}from"./routes/mcp-extra.js";import{mcpRouter as le}from"./routes/mcp.js";import{pluginsRouter as be}from"./routes/plugins.js";import{processesRouter as he}from"./routes/processes.js";import{propertiesRouter as we}from"./routes/properties.js";import{attachPtyWebSocketServer as Re,closeAllPtySessions as Se,ptyRouter as Pe,ptySessions as ye}from"./routes/pty.js";import{runtimeBindingRouter as Ie,logRuntimeBindingStartupState as $e}from"./routes/runtime-binding.js";import{sessionsRouter as ke}from"./routes/sessions.js";import{skillsRouter as Ae}from"./routes/skills.js";import{subAgentsRouter as Ce}from"./routes/sub-agents.js";import{systemMetricsRouter as ve}from"./routes/system-metrics.js";import{taskContextRouter as Be}from"./routes/task-context.js";import{terminalRouter as Te,sdkSessions as w}from"./routes/terminal.js";import{ymlRouter as De}from"./routes/yml.js";import{accessControlMiddleware as Me}from"./services/access-control.js";import{ensureAcodePackageReleased as Ee,getReleasedAcodeEntryPath as xe}from"./services/acode-package.js";import{getAgentProcessManager as I}from"./services/agent-process-manager.js";import{autoRegister as Fe,unregister as Ge,bridgeRestartCleanup as Le,cancelBackgroundRegisterRetries as Oe}from"./services/auto-register.js";import{ensureAwsClientAgentMcpReleased as _e}from"./services/aws-client-agent-mcp.js";import{disposeBrowserSessionManager as je}from"./services/browser-session-manager.js";import{handleCliCommand as Ke}from"./services/cli-commands.js";import{disposeDesktopMcpManager as Ne}from"./services/desktop-mcp-manager.js";import{getLaunchManager as We}from"./services/launch-manager.js";import{migrateOldPathsOnStartup as He}from"./services/legacy-path-migration.js";import{deliverPendingBridgeLifecycleNotifications as Ue}from"./services/lifecycle-state.js";import{startOrphanMonitor as ze,stopOrphanMonitor as Je}from"./services/orphan-monitor.js";import{pluginManager as Ye}from"./services/plugin-manager.js";import{detectOrphanProcesses as Ze}from"./services/process-detector.js";import{buildGracefulShutdownPlan as qe,shouldCleanupPersistedSessionsOnStartup as Qe}from"./services/runtime-lifecycle-policy.js";import{ensureStartupConfig as Ve}from"./services/startup-config-wizard.js";import{subAgentStore as Xe}from"./services/sub-agent-manager-instance.js";import{startLogRetention as er}from"./services/log-retention.js";import{loadPersistedSessions as $,savePersistedSessions as k}from"./services/terminal-persistence.js";import{stopTunnelClient as rr}from"./services/tunnel-client.js";import{logger as e}from"./utils/logger.js";const A=await Ke();A.handled&&process.exit(A.exitCode),await Ve(),W(),_e(),Ee(),He(),$e(),await N(),H(),e.info(`[runtime-bridge] \u5DF2\u5199\u5165\u8FD0\u884C\u65F6\u914D\u7F6E ${j()}\uFF08port=${y()}\uFF09`),e.info(`[runtime-bridge] ACode \u6570\u636E\u76EE\u5F55(\u7528\u6237): ${L()}`),e.info(`[runtime-bridge] Bridge \u6570\u636E\u76EE\u5F55: ${_()}`),e.info(`[runtime-bridge] \u6A21\u677F\u914D\u7F6E: ${K()}`);async function tr(){try{if(await Fe())e.info("[runtime-bridge] \u81EA\u52A8\u6CE8\u518C\u6210\u529F");else{const{loadConfig:o}=await import("./services/auto-register.js"),n=o();!!n.userKey&&n.enabled?e.warn("[runtime-bridge] \u81EA\u52A8\u6CE8\u518C\u6682\u65F6\u5931\u8D25\uFF0C\u5C06\u5728\u540E\u53F0\u6301\u7EED\u91CD\u8BD5\u76F4\u5230\u4E0E\u8C03\u5EA6\u4E2D\u5FC3\u5EFA\u7ACB\u8FDE\u63A5"):(e.info("[runtime-bridge] \u81EA\u52A8\u6CE8\u518C\u672A\u914D\u7F6E\uFF0C\u7EE7\u7EED\u542F\u52A8\u670D\u52A1"),e.info(`[runtime-bridge] \u8981\u542F\u7528\u81EA\u52A8\u6CE8\u518C\uFF0C\u8BF7\u521B\u5EFA\u914D\u7F6E\u6587\u4EF6 ${O()}`))}}catch(r){const o=r;e.warn("[runtime-bridge] \u81EA\u52A8\u6CE8\u518C\u51FA\u9519:",o.message)}}tr().then(()=>ir()).then(()=>Ue()).then(()=>{e.info("[runtime-bridge] Bridge \u751F\u547D\u5468\u671F\u901A\u77E5\u540C\u6B65\u5B8C\u6210")}).catch(r=>{e.warn("[runtime-bridge] \u81EA\u52A8\u6CE8\u518C\u6216\u6E05\u7406\u51FA\u9519:",r)}),import("./services/update-notifier.js").then(({startUpdateNotifier:r})=>r()).catch(r=>{e.warn("[runtime-bridge] \u7248\u672C\u68C0\u67E5\u670D\u52A1\u542F\u52A8\u5931\u8D25:",r.message)});async function ir(){try{if(process.env.AWS_BRIDGE_RESTART_CLEANUP!=="true"){e.info("[runtime-bridge] \u8DF3\u8FC7 Bridge \u91CD\u542F\u6E05\u7406\uFF0C\u4FDD\u7559 Agent \u72B6\u6001\u4F9B\u8C03\u5EA6\u4E2D\u5FC3\u6062\u590D");return}const{getRegistrationState:r}=await import("./services/auto-register.js"),o=r();if(!o.registered||!o.instanceId){e.info("[runtime-bridge] \u5B9E\u4F8B\u672A\u6CE8\u518C\uFF0C\u8DF3\u8FC7 Bridge \u91CD\u542F\u6E05\u7406");return}e.info("[runtime-bridge] \u2605 Bridge \u91CD\u542F\u6E05\u7406\u5DF2\u663E\u5F0F\u542F\u7528\uFF0C\u6B63\u5728\u901A\u77E5\u8C03\u5EA6\u4E2D\u5FC3\u6E05\u7406 Agent \u72B6\u6001...");const n=await Le();n.success?e.info(`[runtime-bridge] \u2605 Bridge \u91CD\u542F\u6E05\u7406\u6210\u529F\uFF0C\u6E05\u7406\u4E86 ${n.agentCount||0} \u4E2A Agent`):e.warn(`[runtime-bridge] \u2605 Bridge \u91CD\u542F\u6E05\u7406\u5931\u8D25: ${n.error}`)}catch(r){const o=r;e.warn("[runtime-bridge] Bridge \u91CD\u542F\u6E05\u7406\u51FA\u9519:",o.message)}}async function or(){try{const r=await $();if(r.length===0){e.info("[runtime-bridge] \u65E0\u6301\u4E45\u5316\u4F1A\u8BDD\uFF0C\u8DF3\u8FC7\u8FDB\u7A0B\u6CE8\u518C\u8868\u91CD\u5EFA");return}await I().rebuildRegistry(r.map(n=>({agentId:n.agentId,sessionId:n.sessionId,pid:n.pid,workspacePath:n.workspacePath,command:n.command,mode:"sdk"}))),e.info(`[runtime-bridge] \u8FDB\u7A0B\u6CE8\u518C\u8868\u91CD\u5EFA\u5B8C\u6210: ${r.length} \u6761\u8BB0\u5F55`)}catch(r){const o=r;e.warn("[runtime-bridge] \u8FDB\u7A0B\u6CE8\u518C\u8868\u91CD\u5EFA\u5931\u8D25:",o.message)}}or().catch(r=>{e.warn("[runtime-bridge] \u8FDB\u7A0B\u6CE8\u518C\u8868\u91CD\u5EFA\u5931\u8D25:",r)}),import(E(S.join(xe(),"..","background-command-manager.js")).href).then(async r=>{const o=r.backgroundCommandManager;if(!o||typeof o.reconcileAllAgents!="function"){e.warn("[runtime-bridge] \u540E\u53F0\u547D\u4EE4\u7BA1\u7406\u5668\u4E0D\u53EF\u7528\uFF0C\u8DF3\u8FC7\u542F\u52A8\u5B64\u513F\u5BF9\u8D26");return}const n=await o.reconcileAllAgents();n>0&&e.info(`[runtime-bridge] \u2605 \u542F\u52A8\u5B64\u513F\u5BF9\u8D26\u5B8C\u6210\uFF1A\u4FEE\u590D ${n} \u6761\u540E\u53F0\u547D\u4EE4\u72B6\u6001`)}).catch(r=>{e.warn("[runtime-bridge] \u542F\u52A8\u5B64\u513F\u5BF9\u8D26\u5931\u8D25:",r.message)});async function nr(){try{const r=await import("node:fs/promises"),o=await import("node:path"),n=await import("node:os"),f=o.join(n.tmpdir(),"agentswork-runtime-bridge",".preserve-sessions");let u=!1;try{const t=await r.readFile(f,"utf-8");u=JSON.parse(t).preserveSessions===!0,await r.unlink(f),e.info(`[runtime-bridge] \u2605 \u68C0\u6D4B\u5230\u4FDD\u7559\u4F1A\u8BDD\u6807\u8BB0\uFF0CpreserveSessions=${u}`)}catch{}const a=await $();if(a.length===0){e.info("[runtime-bridge] \u542F\u52A8\u65F6\u65E0\u6301\u4E45\u5316\u4F1A\u8BDD\uFF0C\u65E0\u9700\u68C0\u6D4B\u5B64\u513F\u8FDB\u7A0B");return}if(!Qe(u)){e.info(`[runtime-bridge] \u2605 \u4FDD\u7559 ${a.length} \u4E2A\u6301\u4E45\u5316\u4F1A\u8BDD\u5E76\u91CD\u5EFA\u8FDB\u7A0B\u6CE8\u518C\u8868`),await I().rebuildRegistry(a.map(s=>({agentId:s.agentId,sessionId:s.sessionId,pid:s.pid,workspacePath:s.workspacePath,command:s.command,mode:"sdk"})));return}e.info(`[runtime-bridge] \u2605 \u5DF2\u663E\u5F0F\u542F\u7528\u542F\u52A8\u6E05\u7406\uFF0C\u68C0\u6D4B ${a.length} \u4E2A\u6301\u4E45\u5316\u4F1A\u8BDD\u7684\u5B64\u513F\u8FDB\u7A0B...`);const d=await Ze(a.map(t=>({agentId:t.agentId,pid:t.pid,workspacePath:t.workspacePath,command:t.command})));if(d.length>0){e.warn(`[runtime-bridge] \u2605 \u68C0\u6D4B\u5230 ${d.length} \u4E2A\u5B64\u513F\u8FDB\u7A0B\u4ECD\u5728\u8FD0\u884C\uFF1A`);for(const t of d)e.warn(` - agentId=${t.agentId}, pid=${t.process.pid}, command=${t.process.command?.slice(0,50)}`);e.info("[runtime-bridge] \u6B63\u5728\u81EA\u52A8\u6E05\u7406\u6240\u6709\u5B64\u513F\u8FDB\u7A0B...");for(const t of d)try{if(t.process.pid)if(process.platform==="win32"){const{execSync:s}=await import("node:child_process");s(`taskkill /PID ${t.process.pid} /T /F`,{encoding:"utf8",timeout:3e3}),e.info(`[runtime-bridge] \u5DF2\u81EA\u52A8\u7EC8\u6B62\u5B64\u513F\u8FDB\u7A0B: agentId=${t.agentId}, PID=${t.process.pid}`)}else process.kill(t.process.pid,"SIGKILL"),e.info(`[runtime-bridge] \u5DF2\u81EA\u52A8\u7EC8\u6B62\u5B64\u513F\u8FDB\u7A0B: agentId=${t.agentId}, PID=${t.process.pid}`)}catch(s){const c=s;e.warn(`[runtime-bridge] \u81EA\u52A8\u7EC8\u6B62\u5B64\u513F\u8FDB\u7A0B\u5931\u8D25: agentId=${t.agentId}, PID=${t.process.pid}, error=${c.message}`)}await new Promise(t=>setTimeout(t,1e3))}await k([]),e.info(`[runtime-bridge] \u2605 \u542F\u52A8\u6E05\u7406\u5B8C\u6210\uFF0C\u5DF2\u6E05\u7A7A\u6240\u6709\u6301\u4E45\u5316\u4F1A\u8BDD\uFF08\u6E05\u7406\u4E86 ${d.length} \u4E2A\u5B64\u513F\u8FDB\u7A0B\uFF09`)}catch(r){const o=r;e.warn("[runtime-bridge] \u542F\u52A8\u65F6\u5B64\u513F\u8FDB\u7A0B\u68C0\u6D4B\u5931\u8D25:",o.message)}}nr().catch(r=>{e.warn("[runtime-bridge] \u5B64\u513F\u8FDB\u7A0B\u68C0\u6D4B\u51FA\u9519:",r)}),ze().catch(r=>{e.warn("[runtime-bridge] \u542F\u52A8\u5B64\u513F\u8FDB\u7A0B\u76D1\u63A7\u5931\u8D25:",r)});const i=P();i.use(Me),i.use(x()),i.use(P.json({limit:"1mb"})),i.use("/runtime",Ie),i.use("/runtime",we),i.use("/runtime",De),i.use("/runtime",ae),i.use("/runtime",Ae),i.use("/runtime",le),i.use("/runtime",V),i.use("/runtime",Te),i.use("/runtime",ke),i.use("/runtime",he),i.use("/runtime",ce),i.use("/runtime",ue),i.use("/runtime",ve),i.use("/runtime",re),i.use("/runtime",se),i.use("/runtime",ne),i.use("/runtime",z),i.use("/runtime",J),i.use("/runtime",Z),i.use("/runtime",Ce),i.use("/runtime",Q),i.use("/runtime",q),i.use("/runtime",be),i.use("/runtime",fe),i.use("/runtime",pe),i.use("/runtime",Y),i.use("/runtime",Be),i.use("/runtime",oe),i.use("/runtime",ie),i.use("/runtime/computer",X),i.use("/pty",Pe),i.use("/",ee),i.use("/api/file-browser",te),i.use("/api/ltr",ge);function sr(){const r=y(),o=i.listen(r,()=>{e.info(`[runtime-bridge] listening on ${r}`)});return Re(o),U(o),G(o),de(o),o.on("error",n=>{if(n.code==="EADDRINUSE"){e.error(`[runtime-bridge] port ${r} became unavailable after reservation (another process grabbed it concurrently). Set AWS_RUNTIME_BRIDGE_PORT to a free port and restart.`),process.exitCode=1;return}e.error("[runtime-bridge] failed to start server:",n),process.exitCode=1}),o}let C=!1;async function b(r,o,n=!1){if(C){e.info(`[runtime-bridge] \u5DF2\u5728\u5173\u95ED\u4E2D\uFF0C\u5FFD\u7565 ${r}`);return}C=!0,n||R()&&(n=!0,e.info("[runtime-bridge] \u2605 \u68C0\u6D4B\u5230 .preserve-sessions \u6807\u8BB0\u6587\u4EF6\uFF0C\u81EA\u52A8\u5347\u7EA7\u4E3A\u4FDD\u7559\u4F1A\u8BDD\u6A21\u5F0F")),e.info(`[runtime-bridge] \u6536\u5230 ${r} \u4FE1\u53F7\uFF0C\u5F00\u59CB\u4F18\u96C5\u5173\u95ED... (preserveSessions=${n})`);const f=Date.now(),u=qe(n);try{const a=w.size;if(u.terminateSdkSessions){e.info(`[runtime-bridge] \u6B63\u5728\u505C\u6B62 ${a} \u4E2A SDK \u4F1A\u8BDD...`);for(const[t,s]of w.entries())try{const c=s.providerId||"claude-code",g=F.get(c);let p="";try{const m=g.getSessionPid?.(t);m&&(p=` (PID: ${m})`)}catch{}await g.terminateSession(t),e.info(`[runtime-bridge] SDK \u4F1A\u8BDD ${t} \u5DF2\u7EC8\u6B62${p}`),w.delete(t)}catch(c){const g=c;e.error(`[runtime-bridge] SDK \u4F1A\u8BDD ${t} \u7EC8\u6B62\u5931\u8D25:`,g.message),w.delete(t)}}else e.info(`[runtime-bridge] \u2605 \u4FDD\u7559 ${a} \u4E2A SDK \u4F1A\u8BDD\uFF0C\u4E0D\u5728\u91CD\u542F\u6062\u590D\u573A\u666F\u4E2D\u7EC8\u6B62 Agent \u8FDB\u7A0B`);const l=ye.size;u.closePtySessions?(e.info(`[runtime-bridge] \u6B63\u5728\u505C\u6B62 ${l} \u4E2A PTY \u4F1A\u8BDD...`),Se("shutdown")):e.info(`[runtime-bridge] \u2605 \u4FDD\u7559 ${l} \u4E2A PTY \u4F1A\u8BDD\uFF0C\u4E0D\u5728\u91CD\u542F\u6062\u590D\u573A\u666F\u4E2D\u5173\u95ED\u7EC8\u7AEF\u8FDB\u7A0B`);try{const{running:t,stopped:s}=await We().stopAll();t>0&&e.info(`[runtime-bridge] \u542F\u52A8\u9879\u8FDB\u7A0B\u5DF2\u505C\u6B62: running=${t}, stopped=${s}`)}catch(t){e.warn("[runtime-bridge] \u505C\u6B62\u542F\u52A8\u9879\u8FDB\u7A0B\u5931\u8D25:",t.message)}e.info("[runtime-bridge] \u6B63\u5728\u505C\u6B62\u5B64\u513F\u8FDB\u7A0B\u76D1\u63A7...");try{const c=(await import("file://"+S.join(__dirname,"..","package","acode","dist","background-command-manager.js")).catch(()=>({backgroundCommandManager:null}))).backgroundCommandManager;c&&(e.info("[runtime-bridge] \u6B63\u5728\u6E05\u7406\u540E\u53F0\u547D\u4EE4..."),await c.disposeAll())}catch(t){e.warn("[runtime-bridge] \u540E\u53F0\u547D\u4EE4\u6E05\u7406\u5931\u8D25: %s",t?.message)}if(Je(),u.terminateResidualProcesses&&(e.info("[runtime-bridge] \u7B49\u5F85\u8FDB\u7A0B\u5B8C\u5168\u7EC8\u6B62..."),await new Promise(t=>setTimeout(t,1e3))),u.terminateResidualProcesses)try{const{detectOrphanProcesses:t,terminateProcessTree:s}=await import("./services/process-detector.js"),{loadPersistedSessions:c}=await import("./services/terminal-persistence.js"),g=await c();if(g.length>0){const p=await t(g.map(m=>({agentId:m.agentId,pid:m.pid,workspacePath:m.workspacePath,command:m.command})));if(p.length>0){e.warn(`[runtime-bridge] \u68C0\u6D4B\u5230 ${p.length} \u4E2A\u6B8B\u7559\u8FDB\u7A0B\uFF0C\u6B63\u5728\u5F3A\u5236\u7EC8\u6B62...`);for(const m of p)if(m.process.pid){const B=await s(m.process.pid);e.info(`[runtime-bridge] \u5DF2\u5F3A\u5236\u7EC8\u6B62\u6B8B\u7559\u8FDB\u7A0B\u6811\uFF1AagentId=${m.agentId}, PID=${m.process.pid}, \u7EC8\u6B62\u4E86 ${B.terminated} \u4E2A\u8FDB\u7A0B`)}}}}catch(t){const s=t;e.warn("[runtime-bridge] \u6B8B\u7559\u8FDB\u7A0B\u68C0\u67E5\u5931\u8D25:",s.message)}else e.info("[runtime-bridge] \u2605 \u4FDD\u7559\u6A21\u5F0F\u8DF3\u8FC7\u6B8B\u7559\u8FDB\u7A0B\u5F3A\u5236\u7EC8\u6B62\uFF0C\u7B49\u5F85\u8C03\u5EA6\u4E2D\u5FC3\u6062\u590D\u4F1A\u8BDD");if(u.unregisterInstance){e.info("[runtime-bridge] \u6B63\u5728\u6CE8\u9500\u5B9E\u4F8B...");try{await Ge()}catch(t){const s=t;e.error("[runtime-bridge] \u6CE8\u9500\u5B9E\u4F8B\u5931\u8D25:",s.message)}}else e.info("[runtime-bridge] \u2605 \u4FDD\u7559\u6A21\u5F0F\u8DF3\u8FC7\u5B9E\u4F8B\u6CE8\u9500\uFF0C\u907F\u514D\u8C03\u5EA6\u4E2D\u5FC3\u5C06 Agent \u6807\u8BB0\u4E3A stopped");if(Oe(),u.stopTunnelClient&&(e.info("[runtime-bridge] \u6B63\u5728\u5173\u95ED\u96A7\u9053\u5BA2\u6237\u7AEF..."),rr()),u.clearPersistedSessions){e.info("[runtime-bridge] \u6B63\u5728\u6E05\u7A7A\u6301\u4E45\u5316\u4F1A\u8BDD\u72B6\u6001...");try{await k([])}catch(t){const s=t;e.error("[runtime-bridge] \u6E05\u7A7A\u6301\u4E45\u5316\u72B6\u6001\u5931\u8D25:",s.message)}}else e.info("[runtime-bridge] \u2605 \u4FDD\u7559\u6301\u4E45\u5316\u4F1A\u8BDD\u72B6\u6001\uFF08aws-mcp-server \u91CD\u542F\u6062\u590D\u573A\u666F\uFF09");try{await je(),e.info("[runtime-bridge] browser \u5DE5\u5177\u6808\u5DF2\u6E05\u7406")}catch(t){e.warn("[runtime-bridge] browser \u5DE5\u5177\u6808\u6E05\u7406\u5931\u8D25:",t.message)}try{await Ne(),e.info("[runtime-bridge] desktop \u5DE5\u5177\u6808\u5DF2\u6E05\u7406")}catch(t){e.warn("[runtime-bridge] desktop \u5DE5\u5177\u6808\u6E05\u7406\u5931\u8D25:",t.message)}try{await Ye.stopAll(),e.info("[runtime-bridge] \u63D2\u4EF6\u76D1\u542C\u8FDB\u7A0B\u5DF2\u6E05\u7406")}catch(t){e.warn("[runtime-bridge] \u63D2\u4EF6\u76D1\u542C\u8FDB\u7A0B\u6E05\u7406\u5931\u8D25:",t.message)}const d=Date.now()-f;e.info(`[runtime-bridge] \u4F18\u96C5\u5173\u95ED\u5B8C\u6210 (\u8017\u65F6 ${d}ms)\uFF0C\u505C\u6B62 ${a} SDK \u4F1A\u8BDD`),o.close(()=>{e.info("[runtime-bridge] HTTP \u670D\u52A1\u5668\u5DF2\u5173\u95ED"),process.exit(process.exitCode||0)}),setTimeout(()=>{e.warn("[runtime-bridge] \u4F18\u96C5\u5173\u95ED\u8D85\u65F6\uFF0C\u5F3A\u5236\u9000\u51FA"),process.exit(1)},15e3)}catch(a){const l=a;e.error("[runtime-bridge] \u4F18\u96C5\u5173\u95ED\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF:",l),process.exit(1)}}Xe.reconcileZombies().then(r=>{r>0&&e.info(`[runtime-bridge] \u5DF2\u6E05\u7406 ${r} \u4E2A\u50F5\u5C38 sub-agent \u8BB0\u5F55`)}).catch(r=>{e.warn("[runtime-bridge] \u6E05\u7406\u50F5\u5C38 sub-agent \u8BB0\u5F55\u5931\u8D25:",r.message)});const h=sr();er();const v=S.join(M.tmpdir(),"agentswork-runtime-bridge",".preserve-sessions");function R(){try{if(T(v)){const r=D(v,"utf-8");return JSON.parse(r).preserveSessions===!0}}catch{}return!1}me(async(r,o)=>{await b(r,h,o)}),process.on("SIGTERM",()=>{const r=R();b("SIGTERM",h,r)}),process.on("SIGINT",()=>{const r=R();b("SIGINT",h,r)}),process.platform==="win32"&&process.on("SIGBREAK",()=>{const r=R();b("SIGBREAK",h,r)}),process.on("uncaughtException",r=>{e.error("[runtime-bridge] \u672A\u6355\u83B7\u5F02\u5E38:",r),b("uncaughtException",h)}),process.on("unhandledRejection",r=>{e.error("[runtime-bridge] \u672A\u5904\u7406\u7684 Promise \u62D2\u7EDD:",r)});
|
|
2
|
+
import{existsSync as T,readFileSync as D}from"node:fs";import M from"node:os";import S from"node:path";import{pathToFileURL as E}from"node:url";import x from"cors";import P from"express";import{adapterRegistry as F}from"./adapter/index.js";import{attachBrowserWebSocketServer as L}from"./browser/browser-ws-bridge.js";import{getAcodeDataHome as G,getActiveBridgeHttpPort as y,getAutoRegisterConfigFilePath as O,getBridgeDataHome as j,getBridgeListenHost as K,getBridgeRuntimePropertiesFilePath as N,getBridgeTemplateConfigFile as _,reserveBridgeListenPort as H,validateProductionToken as W,writeBridgeRuntimePropertiesFile as U}from"./config.js";import{attachRemoteDesktopWebSocketServer as z}from"./remote-desktop/index.js";import{acodeTodosRouter as J}from"./routes/acode-todos.js";import{agentStateRouter as Y}from"./routes/agent-state.js";import{aiSourcesRouter as Z}from"./routes/ai-sources.js";import{backgroundTasksRouter as q}from"./routes/background-tasks.js";import{bridgeTempFilesRouter as Q}from"./routes/bridge-temp-files.js";import{browserListenersRouter as V}from"./routes/browser-listeners.js";import{browserSessionsRouter as X}from"./routes/browser-sessions.js";import{capabilitiesRouter as ee}from"./routes/capabilities.js";import{computerRouter as re}from"./routes/computer.js";import{dashboardRouter as te}from"./routes/dashboard.js";import{debugMountRouter as ie}from"./routes/debug-mount.js";import{desktopControlRouter as oe}from"./routes/desktop-control.js";import{eventsRouter as ne}from"./routes/events.js";import{fileBrowserRouter as se}from"./routes/file-browser.js";import{fileChangeDiffRouter as ae}from"./routes/file-change-diff.js";import{fileDiffRollbackRouter as me}from"./routes/file-diff-rollback.js";import{fileSnapshotRouter as ue}from"./routes/file-snapshot.js";import{gitRouter as ce}from"./routes/git.js";import{instanceRouter as de,setGracefulShutdownFn as ge}from"./routes/instance.js";import{jdksRouter as pe}from"./routes/jdks.js";import{launchRouter as fe}from"./routes/launch.js";import{lspProvidersRouter as le}from"./routes/lsp-providers.js";import{attachLspWebSocketServer as be}from"./routes/lsp.js";import{ltrRouter as he}from"./routes/ltr.js";import{mcpExtraRouter as we}from"./routes/mcp-extra.js";import{mcpRouter as Re}from"./routes/mcp.js";import{pluginsRouter as Se}from"./routes/plugins.js";import{processesRouter as Pe}from"./routes/processes.js";import{propertiesRouter as ye}from"./routes/properties.js";import{attachPtyWebSocketServer as Ie,closeAllPtySessions as $e,ptyRouter as ke,ptySessions as Ce}from"./routes/pty.js";import{runtimeBindingRouter as Ae,logRuntimeBindingStartupState as ve}from"./routes/runtime-binding.js";import{sessionsRouter as Be}from"./routes/sessions.js";import{skillsRouter as Te}from"./routes/skills.js";import{subAgentsRouter as De}from"./routes/sub-agents.js";import{systemMetricsRouter as Me}from"./routes/system-metrics.js";import{taskContextRouter as Ee}from"./routes/task-context.js";import{techStackRouter as xe}from"./routes/tech-stack.js";import{terminalRouter as Fe,sdkSessions as w}from"./routes/terminal.js";import{workspaceIndexRouter as Le}from"./routes/workspace-index.js";import{ymlRouter as Ge}from"./routes/yml.js";import{accessControlMiddleware as Oe}from"./services/access-control.js";import{ensureAcodePackageReleased as je,getReleasedAcodeEntryPath as Ke}from"./services/acode-package.js";import{getAgentProcessManager as I}from"./services/agent-process-manager.js";import{autoRegister as Ne,unregister as _e,bridgeRestartCleanup as He,cancelBackgroundRegisterRetries as We}from"./services/auto-register.js";import{ensureAwsClientAgentMcpReleased as Ue}from"./services/aws-client-agent-mcp.js";import{disposeBrowserSessionManager as ze}from"./services/browser-session-manager.js";import{handleCliCommand as Je}from"./services/cli-commands.js";import{disposeDesktopMcpManager as Ye}from"./services/desktop-mcp-manager.js";import{getLaunchManager as Ze}from"./services/launch-manager.js";import{migrateOldPathsOnStartup as qe}from"./services/legacy-path-migration.js";import{deliverPendingBridgeLifecycleNotifications as Qe}from"./services/lifecycle-state.js";import{startLogRetention as Ve}from"./services/log-retention.js";import{startOrphanMonitor as Xe,stopOrphanMonitor as er}from"./services/orphan-monitor.js";import{pluginManager as rr}from"./services/plugin-manager.js";import{detectOrphanProcesses as tr}from"./services/process-detector.js";import{buildGracefulShutdownPlan as ir,shouldCleanupPersistedSessionsOnStartup as or}from"./services/runtime-lifecycle-policy.js";import{ensureStartupConfig as nr}from"./services/startup-config-wizard.js";import{subAgentStore as sr}from"./services/sub-agent-manager-instance.js";import{loadPersistedSessions as $,savePersistedSessions as k}from"./services/terminal-persistence.js";import{stopTunnelClient as ar}from"./services/tunnel-client.js";import{logger as e}from"./utils/logger.js";const C=await Je();C.handled&&process.exit(C.exitCode),await nr(),W(),Ue(),je(),qe(),ve(),await H(),U(),e.info(`[runtime-bridge] \u5DF2\u5199\u5165\u8FD0\u884C\u65F6\u914D\u7F6E ${N()}\uFF08port=${y()}\uFF09`),e.info(`[runtime-bridge] ACode \u6570\u636E\u76EE\u5F55(\u7528\u6237): ${G()}`),e.info(`[runtime-bridge] Bridge \u6570\u636E\u76EE\u5F55: ${j()}`),e.info(`[runtime-bridge] \u6A21\u677F\u914D\u7F6E: ${_()}`);async function mr(){try{if(await Ne())e.info("[runtime-bridge] \u81EA\u52A8\u6CE8\u518C\u6210\u529F");else{const{loadConfig:n}=await import("./services/auto-register.js"),o=n();!!o.userKey&&o.enabled?e.warn("[runtime-bridge] \u81EA\u52A8\u6CE8\u518C\u6682\u65F6\u5931\u8D25\uFF0C\u5C06\u5728\u540E\u53F0\u6301\u7EED\u91CD\u8BD5\u76F4\u5230\u4E0E\u8C03\u5EA6\u4E2D\u5FC3\u5EFA\u7ACB\u8FDE\u63A5"):(e.info("[runtime-bridge] \u81EA\u52A8\u6CE8\u518C\u672A\u914D\u7F6E\uFF0C\u7EE7\u7EED\u542F\u52A8\u670D\u52A1"),e.info(`[runtime-bridge] \u8981\u542F\u7528\u81EA\u52A8\u6CE8\u518C\uFF0C\u8BF7\u521B\u5EFA\u914D\u7F6E\u6587\u4EF6 ${O()}`))}}catch(r){const n=r;e.warn("[runtime-bridge] \u81EA\u52A8\u6CE8\u518C\u51FA\u9519:",n.message)}}mr().then(()=>ur()).then(()=>Qe()).then(()=>{e.info("[runtime-bridge] Bridge \u751F\u547D\u5468\u671F\u901A\u77E5\u540C\u6B65\u5B8C\u6210")}).catch(r=>{e.warn("[runtime-bridge] \u81EA\u52A8\u6CE8\u518C\u6216\u6E05\u7406\u51FA\u9519:",r)}),import("./services/update-notifier.js").then(({startUpdateNotifier:r})=>r()).catch(r=>{e.warn("[runtime-bridge] \u7248\u672C\u68C0\u67E5\u670D\u52A1\u542F\u52A8\u5931\u8D25:",r.message)});async function ur(){try{if(process.env.AWS_BRIDGE_RESTART_CLEANUP!=="true"){e.info("[runtime-bridge] \u8DF3\u8FC7 Bridge \u91CD\u542F\u6E05\u7406\uFF0C\u4FDD\u7559 Agent \u72B6\u6001\u4F9B\u8C03\u5EA6\u4E2D\u5FC3\u6062\u590D");return}const{getRegistrationState:r}=await import("./services/auto-register.js"),n=r();if(!n.registered||!n.instanceId){e.info("[runtime-bridge] \u5B9E\u4F8B\u672A\u6CE8\u518C\uFF0C\u8DF3\u8FC7 Bridge \u91CD\u542F\u6E05\u7406");return}e.info("[runtime-bridge] \u2605 Bridge \u91CD\u542F\u6E05\u7406\u5DF2\u663E\u5F0F\u542F\u7528\uFF0C\u6B63\u5728\u901A\u77E5\u8C03\u5EA6\u4E2D\u5FC3\u6E05\u7406 Agent \u72B6\u6001...");const o=await He();o.success?e.info(`[runtime-bridge] \u2605 Bridge \u91CD\u542F\u6E05\u7406\u6210\u529F\uFF0C\u6E05\u7406\u4E86 ${o.agentCount||0} \u4E2A Agent`):e.warn(`[runtime-bridge] \u2605 Bridge \u91CD\u542F\u6E05\u7406\u5931\u8D25: ${o.error}`)}catch(r){const n=r;e.warn("[runtime-bridge] Bridge \u91CD\u542F\u6E05\u7406\u51FA\u9519:",n.message)}}async function cr(){try{const r=await $();if(r.length===0){e.info("[runtime-bridge] \u65E0\u6301\u4E45\u5316\u4F1A\u8BDD\uFF0C\u8DF3\u8FC7\u8FDB\u7A0B\u6CE8\u518C\u8868\u91CD\u5EFA");return}await I().rebuildRegistry(r.map(o=>({agentId:o.agentId,sessionId:o.sessionId,pid:o.pid,workspacePath:o.workspacePath,command:o.command,mode:"sdk"}))),e.info(`[runtime-bridge] \u8FDB\u7A0B\u6CE8\u518C\u8868\u91CD\u5EFA\u5B8C\u6210: ${r.length} \u6761\u8BB0\u5F55`)}catch(r){const n=r;e.warn("[runtime-bridge] \u8FDB\u7A0B\u6CE8\u518C\u8868\u91CD\u5EFA\u5931\u8D25:",n.message)}}cr().catch(r=>{e.warn("[runtime-bridge] \u8FDB\u7A0B\u6CE8\u518C\u8868\u91CD\u5EFA\u5931\u8D25:",r)}),import(E(S.join(Ke(),"..","background-command-manager.js")).href).then(async r=>{const n=r.backgroundCommandManager;if(!n||typeof n.reconcileAllAgents!="function"){e.warn("[runtime-bridge] \u540E\u53F0\u547D\u4EE4\u7BA1\u7406\u5668\u4E0D\u53EF\u7528\uFF0C\u8DF3\u8FC7\u542F\u52A8\u5B64\u513F\u5BF9\u8D26");return}const o=await n.reconcileAllAgents();o>0&&e.info(`[runtime-bridge] \u2605 \u542F\u52A8\u5B64\u513F\u5BF9\u8D26\u5B8C\u6210\uFF1A\u4FEE\u590D ${o} \u6761\u540E\u53F0\u547D\u4EE4\u72B6\u6001`)}).catch(r=>{e.warn("[runtime-bridge] \u542F\u52A8\u5B64\u513F\u5BF9\u8D26\u5931\u8D25:",r.message)});async function dr(){try{const r=await import("node:fs/promises"),n=await import("node:path"),o=await import("node:os"),d=n.join(o.tmpdir(),"agentswork-runtime-bridge",".preserve-sessions");let u=!1;try{const t=await r.readFile(d,"utf-8");u=JSON.parse(t).preserveSessions===!0,await r.unlink(d),e.info(`[runtime-bridge] \u2605 \u68C0\u6D4B\u5230\u4FDD\u7559\u4F1A\u8BDD\u6807\u8BB0\uFF0CpreserveSessions=${u}`)}catch{}const a=await $();if(a.length===0){e.info("[runtime-bridge] \u542F\u52A8\u65F6\u65E0\u6301\u4E45\u5316\u4F1A\u8BDD\uFF0C\u65E0\u9700\u68C0\u6D4B\u5B64\u513F\u8FDB\u7A0B");return}if(!or(u)){e.info(`[runtime-bridge] \u2605 \u4FDD\u7559 ${a.length} \u4E2A\u6301\u4E45\u5316\u4F1A\u8BDD\u5E76\u91CD\u5EFA\u8FDB\u7A0B\u6CE8\u518C\u8868`),await I().rebuildRegistry(a.map(s=>({agentId:s.agentId,sessionId:s.sessionId,pid:s.pid,workspacePath:s.workspacePath,command:s.command,mode:"sdk"})));return}e.info(`[runtime-bridge] \u2605 \u5DF2\u663E\u5F0F\u542F\u7528\u542F\u52A8\u6E05\u7406\uFF0C\u68C0\u6D4B ${a.length} \u4E2A\u6301\u4E45\u5316\u4F1A\u8BDD\u7684\u5B64\u513F\u8FDB\u7A0B...`);const g=await tr(a.map(t=>({agentId:t.agentId,pid:t.pid,workspacePath:t.workspacePath,command:t.command})));if(g.length>0){e.warn(`[runtime-bridge] \u2605 \u68C0\u6D4B\u5230 ${g.length} \u4E2A\u5B64\u513F\u8FDB\u7A0B\u4ECD\u5728\u8FD0\u884C\uFF1A`);for(const t of g)e.warn(` - agentId=${t.agentId}, pid=${t.process.pid}, command=${t.process.command?.slice(0,50)}`);e.info("[runtime-bridge] \u6B63\u5728\u81EA\u52A8\u6E05\u7406\u6240\u6709\u5B64\u513F\u8FDB\u7A0B...");for(const t of g)try{if(t.process.pid)if(process.platform==="win32"){const{execSync:s}=await import("node:child_process");s(`taskkill /PID ${t.process.pid} /T /F`,{encoding:"utf8",timeout:3e3}),e.info(`[runtime-bridge] \u5DF2\u81EA\u52A8\u7EC8\u6B62\u5B64\u513F\u8FDB\u7A0B: agentId=${t.agentId}, PID=${t.process.pid}`)}else process.kill(t.process.pid,"SIGKILL"),e.info(`[runtime-bridge] \u5DF2\u81EA\u52A8\u7EC8\u6B62\u5B64\u513F\u8FDB\u7A0B: agentId=${t.agentId}, PID=${t.process.pid}`)}catch(s){const c=s;e.warn(`[runtime-bridge] \u81EA\u52A8\u7EC8\u6B62\u5B64\u513F\u8FDB\u7A0B\u5931\u8D25: agentId=${t.agentId}, PID=${t.process.pid}, error=${c.message}`)}await new Promise(t=>setTimeout(t,1e3))}await k([]),e.info(`[runtime-bridge] \u2605 \u542F\u52A8\u6E05\u7406\u5B8C\u6210\uFF0C\u5DF2\u6E05\u7A7A\u6240\u6709\u6301\u4E45\u5316\u4F1A\u8BDD\uFF08\u6E05\u7406\u4E86 ${g.length} \u4E2A\u5B64\u513F\u8FDB\u7A0B\uFF09`)}catch(r){const n=r;e.warn("[runtime-bridge] \u542F\u52A8\u65F6\u5B64\u513F\u8FDB\u7A0B\u68C0\u6D4B\u5931\u8D25:",n.message)}}dr().catch(r=>{e.warn("[runtime-bridge] \u5B64\u513F\u8FDB\u7A0B\u68C0\u6D4B\u51FA\u9519:",r)}),Xe().catch(r=>{e.warn("[runtime-bridge] \u542F\u52A8\u5B64\u513F\u8FDB\u7A0B\u76D1\u63A7\u5931\u8D25:",r)});const i=P();i.use(Oe),i.use(x()),i.use(P.json({limit:"1mb"})),i.use("/runtime",Ae),i.use("/runtime",ye),i.use("/runtime",Ge),i.use("/runtime",de),i.use("/runtime",Te),i.use("/runtime",Re),i.use("/runtime",ee),i.use("/runtime",Fe),i.use("/runtime",Be),i.use("/runtime",Pe),i.use("/runtime",fe),i.use("/runtime",pe),i.use("/runtime",xe),i.use("/runtime",Me),i.use("/runtime",ne),i.use("/runtime",ce),i.use("/runtime",ue),i.use("/runtime",J),i.use("/runtime",Y),i.use("/runtime",q),i.use("/runtime",De),i.use("/runtime",X),i.use("/runtime",oe),i.use("/runtime",V),i.use("/runtime",Se),i.use("/runtime",we),i.use("/runtime",ie),i.use("/runtime",Z),i.use("/runtime",Ee),i.use("/runtime",me),i.use("/runtime",ae),i.use("/runtime",le),i.use("/runtime/computer",re),i.use("/pty",ke),i.use("/",te),i.use("/api/file-browser",se),i.use("/api",Le),i.use("/api/ltr",he),i.use("/api/bridge-temp-files",Q);function gr(){const r=y(),n=K(),o=n?i.listen(r,n,()=>{e.info(`[runtime-bridge] listening on ${n}:${r}`)}):i.listen(r,()=>{e.info(`[runtime-bridge] listening on ${r}`)});return Ie(o),z(o),L(o),be(o),o.on("error",d=>{if(d.code==="EADDRINUSE"){e.error(`[runtime-bridge] port ${r} became unavailable after reservation (another process grabbed it concurrently). Set AWS_RUNTIME_BRIDGE_PORT to a free port and restart.`),process.exitCode=1;return}e.error("[runtime-bridge] failed to start server:",d),process.exitCode=1}),o}let A=!1;async function b(r,n,o=!1){if(A){e.info(`[runtime-bridge] \u5DF2\u5728\u5173\u95ED\u4E2D\uFF0C\u5FFD\u7565 ${r}`);return}A=!0,o||R()&&(o=!0,e.info("[runtime-bridge] \u2605 \u68C0\u6D4B\u5230 .preserve-sessions \u6807\u8BB0\u6587\u4EF6\uFF0C\u81EA\u52A8\u5347\u7EA7\u4E3A\u4FDD\u7559\u4F1A\u8BDD\u6A21\u5F0F")),e.info(`[runtime-bridge] \u6536\u5230 ${r} \u4FE1\u53F7\uFF0C\u5F00\u59CB\u4F18\u96C5\u5173\u95ED... (preserveSessions=${o})`);const d=Date.now(),u=ir(o);try{const a=w.size;if(u.terminateSdkSessions){e.info(`[runtime-bridge] \u6B63\u5728\u505C\u6B62 ${a} \u4E2A SDK \u4F1A\u8BDD...`);for(const[t,s]of w.entries())try{const c=s.providerId||"claude-code",p=F.get(c);let f="";try{const m=p.getSessionPid?.(t);m&&(f=` (PID: ${m})`)}catch{}await p.terminateSession(t),e.info(`[runtime-bridge] SDK \u4F1A\u8BDD ${t} \u5DF2\u7EC8\u6B62${f}`),w.delete(t)}catch(c){const p=c;e.error(`[runtime-bridge] SDK \u4F1A\u8BDD ${t} \u7EC8\u6B62\u5931\u8D25:`,p.message),w.delete(t)}}else e.info(`[runtime-bridge] \u2605 \u4FDD\u7559 ${a} \u4E2A SDK \u4F1A\u8BDD\uFF0C\u4E0D\u5728\u91CD\u542F\u6062\u590D\u573A\u666F\u4E2D\u7EC8\u6B62 Agent \u8FDB\u7A0B`);const l=Ce.size;u.closePtySessions?(e.info(`[runtime-bridge] \u6B63\u5728\u505C\u6B62 ${l} \u4E2A PTY \u4F1A\u8BDD...`),$e("shutdown")):e.info(`[runtime-bridge] \u2605 \u4FDD\u7559 ${l} \u4E2A PTY \u4F1A\u8BDD\uFF0C\u4E0D\u5728\u91CD\u542F\u6062\u590D\u573A\u666F\u4E2D\u5173\u95ED\u7EC8\u7AEF\u8FDB\u7A0B`);try{const{running:t,stopped:s}=await Ze().stopAll();t>0&&e.info(`[runtime-bridge] \u542F\u52A8\u9879\u8FDB\u7A0B\u5DF2\u505C\u6B62: running=${t}, stopped=${s}`)}catch(t){e.warn("[runtime-bridge] \u505C\u6B62\u542F\u52A8\u9879\u8FDB\u7A0B\u5931\u8D25:",t.message)}e.info("[runtime-bridge] \u6B63\u5728\u505C\u6B62\u5B64\u513F\u8FDB\u7A0B\u76D1\u63A7...");try{const c=(await import("file://"+S.join(import.meta.dirname,"..","package","acode","dist","background-command-manager.js")).catch(()=>({backgroundCommandManager:null}))).backgroundCommandManager;c&&(e.info("[runtime-bridge] \u6B63\u5728\u6E05\u7406\u540E\u53F0\u547D\u4EE4..."),await c.disposeAll())}catch(t){e.warn("[runtime-bridge] \u540E\u53F0\u547D\u4EE4\u6E05\u7406\u5931\u8D25: %s",t?.message)}if(er(),u.terminateResidualProcesses&&(e.info("[runtime-bridge] \u7B49\u5F85\u8FDB\u7A0B\u5B8C\u5168\u7EC8\u6B62..."),await new Promise(t=>setTimeout(t,1e3))),u.terminateResidualProcesses)try{const{detectOrphanProcesses:t,terminateProcessTree:s}=await import("./services/process-detector.js"),{loadPersistedSessions:c}=await import("./services/terminal-persistence.js"),p=await c();if(p.length>0){const f=await t(p.map(m=>({agentId:m.agentId,pid:m.pid,workspacePath:m.workspacePath,command:m.command})));if(f.length>0){e.warn(`[runtime-bridge] \u68C0\u6D4B\u5230 ${f.length} \u4E2A\u6B8B\u7559\u8FDB\u7A0B\uFF0C\u6B63\u5728\u5F3A\u5236\u7EC8\u6B62...`);for(const m of f)if(m.process.pid){const B=await s(m.process.pid);e.info(`[runtime-bridge] \u5DF2\u5F3A\u5236\u7EC8\u6B62\u6B8B\u7559\u8FDB\u7A0B\u6811\uFF1AagentId=${m.agentId}, PID=${m.process.pid}, \u7EC8\u6B62\u4E86 ${B.terminated} \u4E2A\u8FDB\u7A0B`)}}}}catch(t){const s=t;e.warn("[runtime-bridge] \u6B8B\u7559\u8FDB\u7A0B\u68C0\u67E5\u5931\u8D25:",s.message)}else e.info("[runtime-bridge] \u2605 \u4FDD\u7559\u6A21\u5F0F\u8DF3\u8FC7\u6B8B\u7559\u8FDB\u7A0B\u5F3A\u5236\u7EC8\u6B62\uFF0C\u7B49\u5F85\u8C03\u5EA6\u4E2D\u5FC3\u6062\u590D\u4F1A\u8BDD");if(u.unregisterInstance){e.info("[runtime-bridge] \u6B63\u5728\u6CE8\u9500\u5B9E\u4F8B...");try{await _e()}catch(t){const s=t;e.error("[runtime-bridge] \u6CE8\u9500\u5B9E\u4F8B\u5931\u8D25:",s.message)}}else e.info("[runtime-bridge] \u2605 \u4FDD\u7559\u6A21\u5F0F\u8DF3\u8FC7\u5B9E\u4F8B\u6CE8\u9500\uFF0C\u907F\u514D\u8C03\u5EA6\u4E2D\u5FC3\u5C06 Agent \u6807\u8BB0\u4E3A stopped");if(We(),u.stopTunnelClient&&(e.info("[runtime-bridge] \u6B63\u5728\u5173\u95ED\u96A7\u9053\u5BA2\u6237\u7AEF..."),ar()),u.clearPersistedSessions){e.info("[runtime-bridge] \u6B63\u5728\u6E05\u7A7A\u6301\u4E45\u5316\u4F1A\u8BDD\u72B6\u6001...");try{await k([])}catch(t){const s=t;e.error("[runtime-bridge] \u6E05\u7A7A\u6301\u4E45\u5316\u72B6\u6001\u5931\u8D25:",s.message)}}else e.info("[runtime-bridge] \u2605 \u4FDD\u7559\u6301\u4E45\u5316\u4F1A\u8BDD\u72B6\u6001\uFF08aws-mcp-server \u91CD\u542F\u6062\u590D\u573A\u666F\uFF09");try{await ze(),e.info("[runtime-bridge] browser \u5DE5\u5177\u6808\u5DF2\u6E05\u7406")}catch(t){e.warn("[runtime-bridge] browser \u5DE5\u5177\u6808\u6E05\u7406\u5931\u8D25:",t.message)}try{await Ye(),e.info("[runtime-bridge] desktop \u5DE5\u5177\u6808\u5DF2\u6E05\u7406")}catch(t){e.warn("[runtime-bridge] desktop \u5DE5\u5177\u6808\u6E05\u7406\u5931\u8D25:",t.message)}try{await rr.stopAll(),e.info("[runtime-bridge] \u63D2\u4EF6\u76D1\u542C\u8FDB\u7A0B\u5DF2\u6E05\u7406")}catch(t){e.warn("[runtime-bridge] \u63D2\u4EF6\u76D1\u542C\u8FDB\u7A0B\u6E05\u7406\u5931\u8D25:",t.message)}const g=Date.now()-d;e.info(`[runtime-bridge] \u4F18\u96C5\u5173\u95ED\u5B8C\u6210 (\u8017\u65F6 ${g}ms)\uFF0C\u505C\u6B62 ${a} SDK \u4F1A\u8BDD`),n.close(()=>{e.info("[runtime-bridge] HTTP \u670D\u52A1\u5668\u5DF2\u5173\u95ED"),process.exit(process.exitCode||0)}),setTimeout(()=>{e.warn("[runtime-bridge] \u4F18\u96C5\u5173\u95ED\u8D85\u65F6\uFF0C\u5F3A\u5236\u9000\u51FA"),process.exit(1)},15e3)}catch(a){const l=a;e.error("[runtime-bridge] \u4F18\u96C5\u5173\u95ED\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF:",l),process.exit(1)}}sr.reconcileZombies().then(r=>{r>0&&e.info(`[runtime-bridge] \u5DF2\u6E05\u7406 ${r} \u4E2A\u50F5\u5C38 sub-agent \u8BB0\u5F55`)}).catch(r=>{e.warn("[runtime-bridge] \u6E05\u7406\u50F5\u5C38 sub-agent \u8BB0\u5F55\u5931\u8D25:",r.message)});const h=gr();Ve();const v=S.join(M.tmpdir(),"agentswork-runtime-bridge",".preserve-sessions");function R(){try{if(T(v)){const r=D(v,"utf-8");return JSON.parse(r).preserveSessions===!0}}catch{}return!1}ge(async(r,n)=>{await b(r,h,n)}),process.on("SIGTERM",()=>{const r=R();b("SIGTERM",h,r)}),process.on("SIGINT",()=>{const r=R();b("SIGINT",h,r)}),process.platform==="win32"&&process.on("SIGBREAK",()=>{const r=R();b("SIGBREAK",h,r)}),process.on("uncaughtException",r=>{e.error("[runtime-bridge] \u672A\u6355\u83B7\u5F02\u5E38:",r),b("uncaughtException",h)}),process.on("unhandledRejection",r=>{e.error("[runtime-bridge] \u672A\u5904\u7406\u7684 Promise \u62D2\u7EDD:",r)});
|
|
3
3
|
|
|
@@ -1,10 +1,36 @@
|
|
|
1
1
|
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
2
7
|
import type { Request, Response, NextFunction } from "express";
|
|
3
8
|
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
4
12
|
export declare function isRuntimeTokenValid(token: unknown): boolean;
|
|
5
13
|
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
6
20
|
export declare function validateToken(req: Request, res: Response, next: NextFunction): void;
|
|
7
21
|
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
8
29
|
export declare function validateTokenOrLoopback(req: Request, res: Response, next: NextFunction): void;
|
|
9
30
|
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
10
36
|
export declare function validateTokenOrPanelSession(req: Request, res: Response, next: NextFunction): void;
|
package/dist/middleware/auth.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{getConfiguredConnectionKeys as
|
|
1
|
+
import{getConfiguredConnectionKeys as f}from"../services/auto-register.js";import{validateSession as d}from"../services/panel-auth.js";import{isLoopbackRequest as l,resolveCredentialIdentity as m}from"../services/request-identity.js";import{hasRuntimeBinding as p,validateRuntimeBindingToken as k}from"../services/runtime-binding.js";import{resolveUserScope as r}from"../services/user-scope.js";function s(e){const t=e.header("X-Runtime-Token");return t?t.trim():(e.header("Authorization")||"").match(/^Bearer\s+(.+)$/i)?.[1]?.trim()||""}function h(e){return e?!!f().includes(e):!1}function a(e,t,n){const o=m(e,n);return o.scope?(e.userScope=o.scope,!0):(t.status(403).json({ok:!1,error:"scope-not-authorized",message:"\u8BF7\u6C42\u58F0\u660E\u7684\u7EC4\u7EC7/\u7528\u6237\u4E0E\u51ED\u636E\u6240\u5C5E\u76EE\u6807\u4E0D\u4E00\u81F4\uFF0C\u6216\u914D\u5BF9\u914D\u7F6E\u7F3A\u5C11\u79DF\u6237\u4FE1\u606F"}),!1)}function u(e){const t=String(e||"").trim();return k(t)||h(t)}function T(e,t,n){const o=s(e);if(u(o)){if(!a(e,t,o))return;n();return}if(!p()){t.status(401).json({error:"runtime_bridge_unpaired",message:"Runtime bridge is not paired. Add this instance from the panel first."});return}t.status(401).json({error:"unauthorized"})}function O(e,t,n){if(l(e)){r(e,t,()=>{}),n();return}T(e,t,n)}const g="panel_sid";function v(e){const t={};if(!e)return t;for(const n of e.split(";")){const o=n.indexOf("=");if(o===-1)continue;const i=n.slice(0,o).trim(),c=n.slice(o+1).trim();i&&(t[i]=c)}return t}function z(e){return v(e.headers.cookie)[g]}function _(e,t,n){const o=s(e);if(u(o)){if(!a(e,t,o))return;n();return}const i=z(e);if(i&&d(i)){r(e,t,()=>{}),n();return}t.status(401).json({error:"unauthorized"})}export{u as isRuntimeTokenValid,T as validateToken,O as validateTokenOrLoopback,_ as validateTokenOrPanelSession};
|
|
2
2
|
|
|
@@ -2,6 +2,9 @@ import type { InputBackend } from "./input-backends/interface.js";
|
|
|
2
2
|
import type { ScreenCapture } from "./screen-capture.js";
|
|
3
3
|
import type { ScreenInfo, ScreenshotResult, AppInfo, UIElement } from "./types.js";
|
|
4
4
|
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
5
8
|
export declare class ComputerControl {
|
|
6
9
|
private screenCapture;
|
|
7
10
|
private inputBackend;
|
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
import type { RemoteDesktopQuality } from "./types.js";
|
|
2
2
|
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
3
9
|
export declare const FRAME_BUFFER_LIMITS: Record<RemoteDesktopQuality, number>;
|
|
4
10
|
|
|
5
11
|
export declare function getFrameBufferLimit(quality: RemoteDesktopQuality): number;
|
|
6
12
|
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
7
17
|
export declare function shouldDropFrameForBackpressure(bufferedAmount: number, maxBufferedBytes: number): boolean;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{WebSocketServer as
|
|
1
|
+
import{WebSocketServer as F}from"ws";import{broadcastControlState as C,registerBroadcaster as A,registerProviders as T}from"../desktop/desktop-control.js";import{isRuntimeTokenValid as v}from"../middleware/auth.js";import{isUpgradeAllowed as D}from"../services/access-control.js";import{getFrameBufferLimit as I,shouldDropFrameForBackpressure as M}from"./frame-backpressure.js";import{encodeFrame as P}from"./frame-encode.js";import{PermissionManager as W}from"./permission-manager.js";import{getSharpLoadStatus as x}from"./screen-capture.js";import{SessionManager as B}from"./session-manager.js";const h=new W,s=new B(h);function N(a,o){const t=o.searchParams.get("token");if(t)return t;const e=a.headers["x-runtime-token"];if(typeof e=="string")return e;const n=a.headers.authorization;return typeof n=="string"&&n.startsWith("Bearer ")?n.slice(7):""}function u(a,o){a.readyState===a.OPEN&&a.send(JSON.stringify(o))}function O(a,o,t){switch(t.type){case"remote-desktop:input":{const e=t.data;s.handleInput(o,e).catch(n=>{u(a,{type:"remote-desktop:error",sessionId:o,data:{error:String(n)}})});break}case"remote-desktop:stop":{s.closeSession(o),a.close();break}case"remote-desktop:quality":{const e=s.getSession(o);if(e&&t.data){const n=t.data;e.screenCapture.setQuality(n.quality,n.fps)}break}case"remote-desktop:control-mode":{const e=s.getSession(o);e&&t.data&&(t.data.enabled?e.enableControl().catch(p=>{console.warn("[remote-desktop] enableControl failed:",p)}):e.stopInputBackend(),C(e.agentId));break}case"remote-desktop:switch-screen":{const e=s.getSession(o);if(e&&t.data){const n=t.data;e.switchScreen(n.screenId||null).catch(p=>{u(a,{type:"remote-desktop:error",sessionId:o,data:{error:String(p)}})})}break}case"remote-desktop:ping":{u(a,{type:"remote-desktop:pong",sessionId:o,data:t.data});break}case"remote-desktop:resync":{const e=s.getSession(o);e&&e.screenCapture.requestFullFrame();break}}}function G(a){A((t,e,n)=>{s.broadcastToAgent(t,e,n)}),T({humanControl:t=>s.isHumanControlling(t),screenGeometry:t=>s.getScreensFor(t)});const o=new F({noServer:!0});a.on("upgrade",(t,e,n)=>{if(!D(t,e))return;const p=new URL(t.url||"/",`http://${t.headers.host}`);if(p.pathname!=="/remote-desktop")return;const S=N(t,p);if(!v(S)&&!h.validateToken(S)){e.write(`HTTP/1.1 401 Unauthorized\r
|
|
2
2
|
\r
|
|
3
|
-
`),e.destroy();return}o.handleUpgrade(t,e,
|
|
3
|
+
`),e.destroy();return}o.handleUpgrade(t,e,n,r=>{const y=p.searchParams.get("agentId")||"default";s.createSession(y,S).then(i=>{const c=s.getSession(i.sessionId);if(c?.attachWebSocket(r),u(r,{type:"remote-desktop:start-result",sessionId:i.sessionId,data:{screens:i.screens,permissions:i.permissions}}),C(y),c){let l=0,d=0,m=Date.now();const $=setInterval(()=>{const f=Date.now()-m,g=c.screenCapture.frameStats;console.warn(`[remote-desktop] frames: sent=${l} dropped=${d} bufferedAmount=${r.bufferedAmount} silent=${f}ms quality=${c.screenCapture.getQuality()} sharp=${x()} full=${g.full} partial=${g.partial} null=${g.null} sharpFail=${g.sharpFail}`),l=0,d=0,c.screenCapture.resetFrameStats()},5e3);let k=0;c.startFrameLoop(b=>{if(r.readyState===r.OPEN&&!M(r.bufferedAmount,I(c.screenCapture.getQuality())))return r.send(P(b,k)),k=k+1>>>0,l++,m=Date.now(),!0;d++,c.screenCapture.notifyFrameDropped();const f=Date.now()-m;return f>3e3&&console.warn(`[remote-desktop] \u8FDE\u7EED ${f}ms \u65E0\u5E27\u53D1\u9001 bufferedAmount=${r.bufferedAmount} readyState=${r.readyState}`),!1}),r.on("close",()=>clearInterval($))}r.on("message",l=>{try{const d=l.toString();if(d.startsWith("{")){const m=JSON.parse(d);O(r,i.sessionId,m)}}catch{}}),r.on("close",()=>{s.closeSession(i.sessionId)}),r.on("error",()=>{s.closeSession(i.sessionId)})}).catch(i=>{console.error("[remote-desktop] createSession failed:",i),u(r,{type:"remote-desktop:error",sessionId:"",data:{error:String(i)}}),r.close(1011,String(i))})})})}export{G as attachRemoteDesktopWebSocketServer,h as permissionManager,s as sessionManager};
|
|
4
4
|
|
|
@@ -6,6 +6,10 @@ export declare class InputDispatcher {
|
|
|
6
6
|
private screen;
|
|
7
7
|
constructor(backend: InputBackend, permissions: Set<RemoteDesktopCapability>, screen: ScreenInfo);
|
|
8
8
|
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
9
13
|
setScreen(screen: ScreenInfo): void;
|
|
10
14
|
handle(message: InputMessage): Promise<void>;
|
|
11
15
|
}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { RemoteDesktopCapability } from "./types.js";
|
|
2
2
|
export declare class PermissionManager {
|
|
3
3
|
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
4
7
|
resolvePermissions(token: string): Set<RemoteDesktopCapability>;
|
|
5
8
|
validateToken(token: string): boolean;
|
|
6
9
|
hasCapability(permissions: Set<RemoteDesktopCapability>, capability: RemoteDesktopCapability): boolean;
|