aws-runtime-bridge 1.9.175 → 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 +188 -0
- package/README.md +61 -2
- package/dist/adapter/AcodeSdkAdapter.d.ts +369 -0
- package/dist/adapter/AcodeSdkAdapter.js +2 -2
- 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 +182 -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/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 +1988 -625
- 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 +11 -0
- 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 +143 -0
- 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/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 +4 -0
- package/dist/routes/terminal.d.ts +122 -0
- package/dist/routes/terminal.js +16 -16
- 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 +37 -0
- package/dist/services/agent-startup-memory.d.ts +34 -0
- package/dist/services/agent-startup-memory.js +1 -1
- 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 +29 -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 +33 -0
- package/dist/services/gitignore.d.ts +9 -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/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 +22 -0
- package/dist/services/open-doc-registry.d.ts +35 -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/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/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 +23 -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 +12 -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 +57 -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 +1 -1
- 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 +10 -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 +45 -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 +354 -0
- 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 +53 -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 +824 -9
- package/package/acode/dist/runtime.js +21 -21
- 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 +17 -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 +179 -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/agent-client.d.ts +277 -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 +606 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.js +4 -4
- 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 +81 -0
- package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +18 -0
- 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 +4 -0
- 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 +123 -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 B,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{bridgeTempFilesRouter as q}from"./routes/bridge-temp-files.js";import{browserListenersRouter as Q}from"./routes/browser-listeners.js";import{browserSessionsRouter as V}from"./routes/browser-sessions.js";import{capabilitiesRouter as X}from"./routes/capabilities.js";import{computerRouter as ee}from"./routes/computer.js";import{dashboardRouter as re}from"./routes/dashboard.js";import{debugMountRouter as te}from"./routes/debug-mount.js";import{eventsRouter as ie}from"./routes/events.js";import{fileBrowserRouter as oe}from"./routes/file-browser.js";import{fileChangeDiffRouter as ne}from"./routes/file-change-diff.js";import{fileDiffRollbackRouter as se}from"./routes/file-diff-rollback.js";import{fileSnapshotRouter as ae}from"./routes/file-snapshot.js";import{gitRouter as me}from"./routes/git.js";import{instanceRouter as ue,setGracefulShutdownFn as ce}from"./routes/instance.js";import{jdksRouter as de}from"./routes/jdks.js";import{launchRouter as ge}from"./routes/launch.js";import{attachLspWebSocketServer as pe}from"./routes/lsp.js";import{ltrRouter as fe}from"./routes/ltr.js";import{mcpExtraRouter as le}from"./routes/mcp-extra.js";import{mcpRouter as be}from"./routes/mcp.js";import{pluginsRouter as he}from"./routes/plugins.js";import{processesRouter as we}from"./routes/processes.js";import{propertiesRouter as Re}from"./routes/properties.js";import{attachPtyWebSocketServer as Se,closeAllPtySessions as Pe,ptyRouter as ye,ptySessions as Ie}from"./routes/pty.js";import{runtimeBindingRouter as $e,logRuntimeBindingStartupState as ke}from"./routes/runtime-binding.js";import{sessionsRouter as Ae}from"./routes/sessions.js";import{skillsRouter as Ce}from"./routes/skills.js";import{subAgentsRouter as ve}from"./routes/sub-agents.js";import{systemMetricsRouter as Te}from"./routes/system-metrics.js";import{taskContextRouter as Be}from"./routes/task-context.js";import{techStackRouter as De}from"./routes/tech-stack.js";import{terminalRouter as Me,sdkSessions as w}from"./routes/terminal.js";import{ymlRouter as Ee}from"./routes/yml.js";import{accessControlMiddleware as xe}from"./services/access-control.js";import{ensureAcodePackageReleased as Fe,getReleasedAcodeEntryPath as Ge}from"./services/acode-package.js";import{getAgentProcessManager as I}from"./services/agent-process-manager.js";import{autoRegister as Le,unregister as Oe,bridgeRestartCleanup as _e,cancelBackgroundRegisterRetries as je}from"./services/auto-register.js";import{ensureAwsClientAgentMcpReleased as Ke}from"./services/aws-client-agent-mcp.js";import{disposeBrowserSessionManager as Ne}from"./services/browser-session-manager.js";import{handleCliCommand as We}from"./services/cli-commands.js";import{disposeDesktopMcpManager as He}from"./services/desktop-mcp-manager.js";import{getLaunchManager as Ue}from"./services/launch-manager.js";import{migrateOldPathsOnStartup as ze}from"./services/legacy-path-migration.js";import{deliverPendingBridgeLifecycleNotifications as Je}from"./services/lifecycle-state.js";import{startLogRetention as Ye}from"./services/log-retention.js";import{startOrphanMonitor as Ze,stopOrphanMonitor as qe}from"./services/orphan-monitor.js";import{pluginManager as Qe}from"./services/plugin-manager.js";import{detectOrphanProcesses as Ve}from"./services/process-detector.js";import{buildGracefulShutdownPlan as Xe,shouldCleanupPersistedSessionsOnStartup as er}from"./services/runtime-lifecycle-policy.js";import{ensureStartupConfig as rr}from"./services/startup-config-wizard.js";import{subAgentStore as tr}from"./services/sub-agent-manager-instance.js";import{loadPersistedSessions as $,savePersistedSessions as k}from"./services/terminal-persistence.js";import{stopTunnelClient as ir}from"./services/tunnel-client.js";import{logger as e}from"./utils/logger.js";const A=await We();A.handled&&process.exit(A.exitCode),await rr(),W(),Ke(),Fe(),ze(),ke(),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 or(){try{if(await Le())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)}}or().then(()=>nr()).then(()=>Je()).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 nr(){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 _e();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 sr(){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)}}sr().catch(r=>{e.warn("[runtime-bridge] \u8FDB\u7A0B\u6CE8\u518C\u8868\u91CD\u5EFA\u5931\u8D25:",r)}),import(E(S.join(Ge(),"..","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 ar(){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(!er(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 Ve(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)}}ar().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(xe),i.use(x()),i.use(P.json({limit:"1mb"})),i.use("/runtime",$e),i.use("/runtime",Re),i.use("/runtime",Ee),i.use("/runtime",ue),i.use("/runtime",Ce),i.use("/runtime",be),i.use("/runtime",X),i.use("/runtime",Me),i.use("/runtime",Ae),i.use("/runtime",we),i.use("/runtime",ge),i.use("/runtime",de),i.use("/runtime",De),i.use("/runtime",Te),i.use("/runtime",ie),i.use("/runtime",me),i.use("/runtime",ae),i.use("/runtime",z),i.use("/runtime",J),i.use("/runtime",Z),i.use("/runtime",ve),i.use("/runtime",V),i.use("/runtime",Q),i.use("/runtime",he),i.use("/runtime",le),i.use("/runtime",te),i.use("/runtime",Y),i.use("/runtime",Be),i.use("/runtime",se),i.use("/runtime",ne),i.use("/runtime/computer",ee),i.use("/pty",ye),i.use("/",re),i.use("/api/file-browser",oe),i.use("/api/ltr",fe),i.use("/api/bridge-temp-files",q);function mr(){const r=y(),o=i.listen(r,()=>{e.info(`[runtime-bridge] listening on ${r}`)});return Se(o),U(o),G(o),pe(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=Xe(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=Ie.size;u.closePtySessions?(e.info(`[runtime-bridge] \u6B63\u5728\u505C\u6B62 ${l} \u4E2A PTY \u4F1A\u8BDD...`),Pe("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 Ue().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(qe(),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 T=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 ${T.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 Oe()}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(je(),u.stopTunnelClient&&(e.info("[runtime-bridge] \u6B63\u5728\u5173\u95ED\u96A7\u9053\u5BA2\u6237\u7AEF..."),ir()),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 Ne(),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 He(),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 Qe.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)}}tr.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=mr();Ye();const v=S.join(M.tmpdir(),"agentswork-runtime-bridge",".preserve-sessions");function R(){try{if(B(v)){const r=D(v,"utf-8");return JSON.parse(r).preserveSessions===!0}}catch{}return!1}ce(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;
|