aws-runtime-bridge 1.9.79 → 1.9.80
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/dist/adapter/AcodeSdkAdapter.d.ts +0 -1
- package/dist/adapter/AcodeSdkAdapter.js +11 -1986
- package/dist/adapter/AdapterRegistry.d.ts +0 -1
- package/dist/adapter/AdapterRegistry.js +2 -100
- package/dist/adapter/ClaudeSdkAdapter.d.ts +0 -1
- package/dist/adapter/ClaudeSdkAdapter.js +4 -1300
- package/dist/adapter/CodexSdkAdapter.d.ts +0 -1
- package/dist/adapter/CodexSdkAdapter.js +4 -836
- package/dist/adapter/OpencodeSdkAdapter.d.ts +0 -1
- package/dist/adapter/OpencodeSdkAdapter.js +4 -879
- package/dist/adapter/SdkProviderSpi.d.ts +0 -1
- package/dist/adapter/SdkProviderSpi.js +2 -55
- package/dist/adapter/acode-tool-names.d.ts +0 -1
- package/dist/adapter/acode-tool-names.js +2 -37
- package/dist/adapter/idle-poll-loop.d.ts +0 -1
- package/dist/adapter/idle-poll-loop.js +2 -59
- package/dist/adapter/index.d.ts +0 -1
- package/dist/adapter/index.js +2 -11
- package/dist/adapter/instance-ai-config-resolver.d.ts +0 -1
- package/dist/adapter/instance-ai-config-resolver.js +2 -46
- package/dist/adapter/types.d.ts +0 -1
- package/dist/adapter/types.js +2 -443
- package/dist/adapters/cc-switch/common.d.ts +0 -1
- package/dist/adapters/cc-switch/common.js +2 -61
- package/dist/adapters/cc-switch/index.d.ts +0 -1
- package/dist/adapters/cc-switch/index.js +2 -57
- package/dist/adapters/cc-switch/mcp-acode.d.ts +0 -1
- package/dist/adapters/cc-switch/mcp-acode.js +2 -71
- package/dist/adapters/cc-switch/mcp-claude.d.ts +0 -1
- package/dist/adapters/cc-switch/mcp-claude.js +2 -89
- package/dist/adapters/cc-switch/mcp-claudecode.d.ts +0 -1
- package/dist/adapters/cc-switch/mcp-claudecode.js +2 -77
- package/dist/adapters/cc-switch/mcp-codex.d.ts +0 -1
- package/dist/adapters/cc-switch/mcp-codex.js +11 -249
- package/dist/adapters/cc-switch/mcp-opencode.d.ts +0 -1
- package/dist/adapters/cc-switch/mcp-opencode.js +2 -97
- package/dist/adapters/cc-switch/mcp-placeholder.d.ts +0 -1
- package/dist/adapters/cc-switch/mcp-placeholder.js +2 -19
- package/dist/adapters/cc-switch/skill-acode.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-acode.js +2 -12
- package/dist/adapters/cc-switch/skill-claude.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-claude.js +2 -11
- package/dist/adapters/cc-switch/skill-claudecode.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-claudecode.js +2 -11
- package/dist/adapters/cc-switch/skill-codex.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-codex.js +2 -6
- package/dist/adapters/cc-switch/skill-directory.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-directory.js +3 -137
- package/dist/adapters/cc-switch/skill-opencode.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-opencode.js +2 -11
- package/dist/adapters/cc-switch/skill-placeholder.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-placeholder.js +2 -19
- package/dist/config.d.ts +0 -1
- package/dist/config.js +2 -290
- package/dist/index.d.ts +0 -1
- package/dist/index.js +2 -573
- package/dist/middleware/auth.d.ts +0 -1
- package/dist/middleware/auth.js +2 -98
- package/dist/routes/acode-todos.d.ts +0 -1
- package/dist/routes/acode-todos.js +2 -75
- package/dist/routes/ai-sources.d.ts +0 -1
- package/dist/routes/ai-sources.js +2 -132
- package/dist/routes/dashboard.d.ts +0 -1
- package/dist/routes/dashboard.js +182 -649
- package/dist/routes/events.d.ts +0 -1
- package/dist/routes/events.js +2 -22
- package/dist/routes/file-browser.d.ts +0 -1
- package/dist/routes/file-browser.js +2 -781
- package/dist/routes/file-diff-rollback.d.ts +0 -1
- package/dist/routes/file-diff-rollback.js +2 -301
- package/dist/routes/file-snapshot.d.ts +0 -1
- package/dist/routes/file-snapshot.js +2 -156
- package/dist/routes/git.d.ts +0 -1
- package/dist/routes/git.js +28 -1900
- package/dist/routes/instance.d.ts +0 -1
- package/dist/routes/instance.js +3 -748
- package/dist/routes/mcp.d.ts +0 -1
- package/dist/routes/mcp.js +2 -196
- package/dist/routes/processes.d.ts +0 -1
- package/dist/routes/processes.js +2 -252
- package/dist/routes/properties.d.ts +0 -1
- package/dist/routes/properties.js +2 -72
- package/dist/routes/pty.d.ts +0 -1
- package/dist/routes/pty.js +6 -560
- package/dist/routes/runtime-binding.d.ts +0 -1
- package/dist/routes/runtime-binding.js +2 -263
- package/dist/routes/sessions.d.ts +0 -1
- package/dist/routes/sessions.js +2 -758
- package/dist/routes/skills.d.ts +0 -1
- package/dist/routes/skills.js +2 -187
- package/dist/routes/sub-agents.d.ts +0 -1
- package/dist/routes/sub-agents.js +20 -279
- package/dist/routes/system-metrics.d.ts +0 -1
- package/dist/routes/system-metrics.js +2 -20
- package/dist/routes/task-context.d.ts +0 -1
- package/dist/routes/task-context.js +2 -78
- package/dist/routes/terminal.d.ts +0 -1
- package/dist/routes/terminal.js +54 -2882
- package/dist/routes/yml.d.ts +0 -1
- package/dist/routes/yml.js +2 -223
- package/dist/services/acode-package.d.ts +0 -1
- package/dist/services/acode-package.js +2 -111
- package/dist/services/agent-event-store.d.ts +0 -1
- package/dist/services/agent-event-store.js +2 -81
- package/dist/services/agent-process-manager.d.ts +0 -1
- package/dist/services/agent-process-manager.js +2 -796
- package/dist/services/ai-source-apply.d.ts +0 -1
- package/dist/services/ai-source-apply.js +2 -83
- package/dist/services/auto-register.d.ts +0 -1
- package/dist/services/auto-register.js +2 -1053
- package/dist/services/aws-client-agent-mcp.d.ts +0 -1
- package/dist/services/aws-client-agent-mcp.js +3 -337
- package/dist/services/bridge-package-publish-hooks.d.ts +0 -1
- package/dist/services/bridge-package-publish-hooks.js +2 -115
- package/dist/services/cc-switch-sdk.d.ts +0 -1
- package/dist/services/cc-switch-sdk.js +2 -135
- package/dist/services/cli-commands.d.ts +6 -1
- package/dist/services/cli-commands.js +6 -645
- package/dist/services/event-delta-pusher.d.ts +0 -1
- package/dist/services/event-delta-pusher.js +2 -95
- package/dist/services/fileSnapshotStore.d.ts +0 -1
- package/dist/services/fileSnapshotStore.js +2 -500
- package/dist/services/instance-ai-config-service.d.ts +0 -1
- package/dist/services/instance-ai-config-service.js +2 -174
- package/dist/services/instance-init-service.d.ts +0 -1
- package/dist/services/instance-init-service.js +2 -193
- package/dist/services/instance-service.d.ts +0 -1
- package/dist/services/instance-service.js +2 -237
- package/dist/services/instance-state.d.ts +0 -1
- package/dist/services/instance-state.js +2 -94
- package/dist/services/legacy-path-migration.d.ts +0 -1
- package/dist/services/legacy-path-migration.js +2 -66
- package/dist/services/lifecycle-state.d.ts +0 -1
- package/dist/services/lifecycle-state.js +3 -110
- package/dist/services/mcp-launch-binding-queue.d.ts +0 -1
- package/dist/services/mcp-launch-binding-queue.js +2 -175
- package/dist/services/orphan-monitor.d.ts +0 -1
- package/dist/services/orphan-monitor.js +2 -382
- package/dist/services/panel-auth.d.ts +0 -1
- package/dist/services/panel-auth.js +2 -168
- package/dist/services/process-detector.d.ts +0 -1
- package/dist/services/process-detector.js +18 -1019
- package/dist/services/process-registry.d.ts +0 -1
- package/dist/services/process-registry.js +2 -375
- package/dist/services/ring-buffer.d.ts +0 -1
- package/dist/services/ring-buffer.js +2 -103
- package/dist/services/runtime-binding.d.ts +0 -1
- package/dist/services/runtime-binding.js +6 -363
- package/dist/services/runtime-lifecycle-policy.d.ts +0 -1
- package/dist/services/runtime-lifecycle-policy.js +2 -35
- package/dist/services/session-output.d.ts +0 -1
- package/dist/services/session-output.js +5 -539
- package/dist/services/startup-config-wizard.d.ts +0 -1
- package/dist/services/startup-config-wizard.js +14 -258
- package/dist/services/sub-agent-manager-instance.d.ts +0 -1
- package/dist/services/sub-agent-manager-instance.js +2 -12
- package/dist/services/system-metrics.d.ts +0 -1
- package/dist/services/system-metrics.js +2 -252
- package/dist/services/terminal-persistence.d.ts +0 -1
- package/dist/services/terminal-persistence.js +2 -176
- package/dist/services/tool-installer.d.ts +0 -1
- package/dist/services/tool-installer.js +5 -751
- package/dist/services/tunnel-client.d.ts +0 -1
- package/dist/services/tunnel-client.js +2 -402
- package/dist/services/windows-service-manager.d.ts +3 -3
- package/dist/services/windows-service-manager.js +2 -59
- package/dist/services/workspace-files.d.ts +0 -1
- package/dist/services/workspace-files.js +2 -1275
- package/dist/services/workspace-watch.d.ts +0 -1
- package/dist/services/workspace-watch.js +2 -123
- package/dist/services/workspaceTaskChangeWatcher.d.ts +0 -1
- package/dist/services/workspaceTaskChangeWatcher.js +2 -483
- package/dist/types.d.ts +0 -1
- package/dist/types.js +1 -1
- package/dist/utils/file-utils.d.ts +0 -1
- package/dist/utils/file-utils.js +3 -208
- package/dist/utils/instance-ai-config-debug-logger.d.ts +0 -1
- package/dist/utils/instance-ai-config-debug-logger.js +4 -63
- package/dist/utils/logger.d.ts +0 -1
- package/dist/utils/logger.js +2 -154
- package/dist/utils/mcp-utils.d.ts +0 -1
- package/dist/utils/mcp-utils.js +2 -187
- package/dist/utils/path-utils.d.ts +0 -1
- package/dist/utils/path-utils.js +2 -44
- package/dist/utils/sdk-package-loader.d.ts +0 -1
- package/dist/utils/sdk-package-loader.js +2 -78
- package/dist/utils/validation.d.ts +0 -1
- package/dist/utils/validation.js +2 -53
- package/dist/utils/yaml-utils.d.ts +0 -1
- package/dist/utils/yaml-utils.js +2 -312
- package/node_modules/@cc-switch/sdk/dist/constants.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/constants.js +2 -63
- package/node_modules/@cc-switch/sdk/dist/errors.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/errors.js +2 -8
- package/node_modules/@cc-switch/sdk/dist/index.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/index.js +2 -9
- package/node_modules/@cc-switch/sdk/dist/schemas.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/schemas.js +2 -38
- package/node_modules/@cc-switch/sdk/dist/sdk.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/sdk.js +2 -470
- package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.js +4 -307
- package/node_modules/@cc-switch/sdk/dist/services/mcp-model.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/mcp-model.js +2 -37
- package/node_modules/@cc-switch/sdk/dist/services/mcp-service.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/mcp-service.js +2 -9
- package/node_modules/@cc-switch/sdk/dist/services/skill-model.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/skill-model.js +2 -41
- package/node_modules/@cc-switch/sdk/dist/services/skill-service.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/skill-service.js +2 -9
- package/node_modules/@cc-switch/sdk/dist/state.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/state.js +2 -19
- package/node_modules/@cc-switch/sdk/dist/types.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/types.js +1 -1
- package/node_modules/@cc-switch/sdk/dist/utils/fs.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/utils/fs.js +3 -114
- package/node_modules/@cc-switch/sdk/dist/utils/id.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/utils/id.js +2 -12
- package/node_modules/@cc-switch/sdk/package.json +1 -1
- package/package/acode/dist/ask-user-question-tool.d.ts +0 -1
- package/package/acode/dist/ask-user-question-tool.js +4 -233
- package/package/acode/dist/built-in-file-tools.d.ts +0 -1
- package/package/acode/dist/built-in-file-tools.js +4 -966
- package/package/acode/dist/built-in-symbols-tool.d.ts +0 -1
- package/package/acode/dist/built-in-symbols-tool.js +2 -117
- package/package/acode/dist/builtins/commandArtifacts.d.ts +0 -1
- package/package/acode/dist/builtins/commandArtifacts.js +9 -97
- package/package/acode/dist/builtins/commandOutputEvents.d.ts +0 -1
- package/package/acode/dist/builtins/commandOutputEvents.js +2 -56
- package/package/acode/dist/builtins/shellCommandPreparation.d.ts +0 -1
- package/package/acode/dist/builtins/shellCommandPreparation.js +5 -44
- package/package/acode/dist/builtins/shellCommandResult.d.ts +0 -1
- package/package/acode/dist/builtins/shellCommandResult.js +2 -71
- package/package/acode/dist/builtins/shellCommandRunner.d.ts +0 -1
- package/package/acode/dist/builtins/shellCommandRunner.js +2 -115
- package/package/acode/dist/builtins/shellOutputDecoder.d.ts +0 -1
- package/package/acode/dist/builtins/shellOutputDecoder.js +2 -94
- package/package/acode/dist/cli.d.ts +0 -1
- package/package/acode/dist/cli.js +4 -38
- package/package/acode/dist/commands/commandLoader.d.ts +0 -1
- package/package/acode/dist/commands/commandLoader.js +2 -33
- package/package/acode/dist/commands/commandParser.d.ts +0 -1
- package/package/acode/dist/commands/commandParser.js +3 -77
- package/package/acode/dist/commands/commandRegistry.d.ts +0 -1
- package/package/acode/dist/commands/commandRegistry.js +2 -30
- package/package/acode/dist/compaction.d.ts +0 -1
- package/package/acode/dist/compaction.js +7 -919
- package/package/acode/dist/config.d.ts +0 -1
- package/package/acode/dist/config.js +5 -105
- package/package/acode/dist/fs-utils.d.ts +0 -1
- package/package/acode/dist/fs-utils.js +2 -79
- package/package/acode/dist/hooks/hookBus.d.ts +0 -1
- package/package/acode/dist/hooks/hookBus.js +2 -40
- package/package/acode/dist/index.d.ts +0 -1
- package/package/acode/dist/index.js +2 -19
- package/package/acode/dist/mcpToolNames.d.ts +0 -1
- package/package/acode/dist/mcpToolNames.js +2 -17
- package/package/acode/dist/parsers/ast-cache.d.ts +0 -1
- package/package/acode/dist/parsers/ast-cache.js +2 -76
- package/package/acode/dist/parsers/language-detector.d.ts +0 -1
- package/package/acode/dist/parsers/language-detector.js +2 -44
- package/package/acode/dist/parsers/language-queries.d.ts +0 -1
- package/package/acode/dist/parsers/language-queries.js +12 -602
- package/package/acode/dist/parsers/symbol-extractor.d.ts +0 -1
- package/package/acode/dist/parsers/symbol-extractor.js +3 -164
- package/package/acode/dist/parsers/tree-sitter-loader.d.ts +0 -1
- package/package/acode/dist/parsers/tree-sitter-loader.js +2 -64
- package/package/acode/dist/parsers/types.d.ts +0 -1
- package/package/acode/dist/parsers/types.js +1 -7
- package/package/acode/dist/runtime.d.ts +0 -1
- package/package/acode/dist/runtime.js +86 -3771
- package/package/acode/dist/skill-tool.d.ts +0 -1
- package/package/acode/dist/skill-tool.js +5 -174
- package/package/acode/dist/sub-agent-manager.d.ts +0 -1
- package/package/acode/dist/sub-agent-manager.js +2 -1159
- package/package/acode/dist/sub-agent-store.d.ts +0 -1
- package/package/acode/dist/sub-agent-store.js +4 -236
- package/package/acode/dist/sub-agent-tools.d.ts +0 -1
- package/package/acode/dist/sub-agent-tools.js +15 -369
- package/package/acode/dist/sub-agent-types.d.ts +0 -1
- package/package/acode/dist/sub-agent-types.js +1 -8
- package/package/acode/dist/todo-store.d.ts +0 -1
- package/package/acode/dist/todo-store.js +2 -73
- package/package/acode/dist/todo-tool.d.ts +0 -1
- package/package/acode/dist/todo-tool.js +5 -121
- package/package/acode/dist/types.d.ts +0 -1
- package/package/acode/dist/types.js +1 -1
- package/package/acode/package.json +2 -2
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/agent-client.js +2 -890
- package/package/aws-client-agent-mcp/dist/agent-client.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/agent-client.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/config.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/config.js +2 -243
- package/package/aws-client-agent-mcp/dist/config.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/config.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/constants.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/constants.js +2 -24
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/context-manager.js +2 -477
- package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/context-manager.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.js +2 -446
- package/package/aws-client-agent-mcp/dist/http-client.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/index.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/index.js +2 -34
- package/package/aws-client-agent-mcp/dist/logger.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/logger.js +3 -178
- package/package/aws-client-agent-mcp/dist/logger.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/logger.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.js +38 -2709
- package/package/aws-client-agent-mcp/dist/mcp-server.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.js +22 -562
- package/package/aws-client-agent-mcp/dist/mcp-tools.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.js +4 -826
- package/package/aws-client-agent-mcp/dist/memory-store.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.js +31 -294
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.js +2 -288
- package/package/aws-client-agent-mcp/dist/message-buffer.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/messageContent.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/messageContent.js +2 -125
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js +2 -103
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.js +2 -96
- package/package/aws-client-agent-mcp/dist/status-reporter.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.js +3 -327
- package/package/aws-client-agent-mcp/dist/status-reporter.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/types.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/types.js +2 -9
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.js +2 -677
- package/package/aws-client-agent-mcp/dist/websocket-client.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.test.js +0 -1
- package/package/aws-client-agent-mcp/package.json +1 -1
- package/package/cc-switch-sdk/dist/constants.d.ts +0 -1
- package/package/cc-switch-sdk/dist/constants.js +2 -63
- package/package/cc-switch-sdk/dist/errors.d.ts +0 -1
- package/package/cc-switch-sdk/dist/errors.js +2 -8
- package/package/cc-switch-sdk/dist/index.d.ts +0 -1
- package/package/cc-switch-sdk/dist/index.js +2 -9
- package/package/cc-switch-sdk/dist/schemas.d.ts +0 -1
- package/package/cc-switch-sdk/dist/schemas.js +2 -38
- package/package/cc-switch-sdk/dist/sdk.d.ts +0 -1
- package/package/cc-switch-sdk/dist/sdk.js +2 -470
- package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts +0 -1
- package/package/cc-switch-sdk/dist/services/ai-config-service.js +4 -307
- package/package/cc-switch-sdk/dist/services/mcp-model.d.ts +0 -1
- package/package/cc-switch-sdk/dist/services/mcp-model.js +2 -37
- package/package/cc-switch-sdk/dist/services/mcp-service.d.ts +0 -1
- package/package/cc-switch-sdk/dist/services/mcp-service.js +2 -9
- package/package/cc-switch-sdk/dist/services/skill-model.d.ts +0 -1
- package/package/cc-switch-sdk/dist/services/skill-model.js +2 -41
- package/package/cc-switch-sdk/dist/services/skill-service.d.ts +0 -1
- package/package/cc-switch-sdk/dist/services/skill-service.js +2 -9
- package/package/cc-switch-sdk/dist/state.d.ts +0 -1
- package/package/cc-switch-sdk/dist/state.js +2 -19
- package/package/cc-switch-sdk/dist/types.d.ts +0 -1
- package/package/cc-switch-sdk/dist/types.js +1 -1
- package/package/cc-switch-sdk/dist/utils/fs.d.ts +0 -1
- package/package/cc-switch-sdk/dist/utils/fs.js +3 -114
- package/package/cc-switch-sdk/dist/utils/id.d.ts +0 -1
- package/package/cc-switch-sdk/dist/utils/id.js +2 -12
- package/package/cc-switch-sdk/package.json +1 -1
- package/package.json +4 -2
- package/dist/adapter/AcodeSdkAdapter.d.ts.map +0 -1
- package/dist/adapter/AdapterRegistry.d.ts.map +0 -1
- package/dist/adapter/ClaudeSdkAdapter.d.ts.map +0 -1
- package/dist/adapter/CodexSdkAdapter.d.ts.map +0 -1
- package/dist/adapter/OpencodeSdkAdapter.d.ts.map +0 -1
- package/dist/adapter/SdkProviderSpi.d.ts.map +0 -1
- package/dist/adapter/acode-tool-names.d.ts.map +0 -1
- package/dist/adapter/idle-poll-loop.d.ts.map +0 -1
- package/dist/adapter/index.d.ts.map +0 -1
- package/dist/adapter/instance-ai-config-resolver.d.ts.map +0 -1
- package/dist/adapter/types.d.ts.map +0 -1
- package/dist/adapters/cc-switch/common.d.ts.map +0 -1
- package/dist/adapters/cc-switch/index.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-acode.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-claude.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-claudecode.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-codex.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-opencode.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-placeholder.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-acode.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-claude.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-claudecode.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-codex.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-directory.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-opencode.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-placeholder.d.ts.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/middleware/auth.d.ts.map +0 -1
- package/dist/routes/acode-todos.d.ts.map +0 -1
- package/dist/routes/ai-sources.d.ts.map +0 -1
- package/dist/routes/dashboard.d.ts.map +0 -1
- package/dist/routes/events.d.ts.map +0 -1
- package/dist/routes/file-browser.d.ts.map +0 -1
- package/dist/routes/file-diff-rollback.d.ts.map +0 -1
- package/dist/routes/file-snapshot.d.ts.map +0 -1
- package/dist/routes/git.d.ts.map +0 -1
- package/dist/routes/instance.d.ts.map +0 -1
- package/dist/routes/mcp.d.ts.map +0 -1
- package/dist/routes/processes.d.ts.map +0 -1
- package/dist/routes/properties.d.ts.map +0 -1
- package/dist/routes/pty.d.ts.map +0 -1
- package/dist/routes/runtime-binding.d.ts.map +0 -1
- package/dist/routes/sessions.d.ts.map +0 -1
- package/dist/routes/skills.d.ts.map +0 -1
- package/dist/routes/sub-agents.d.ts.map +0 -1
- package/dist/routes/system-metrics.d.ts.map +0 -1
- package/dist/routes/task-context.d.ts.map +0 -1
- package/dist/routes/terminal.d.ts.map +0 -1
- package/dist/routes/yml.d.ts.map +0 -1
- package/dist/services/acode-package.d.ts.map +0 -1
- package/dist/services/agent-event-store.d.ts.map +0 -1
- package/dist/services/agent-process-manager.d.ts.map +0 -1
- package/dist/services/ai-source-apply.d.ts.map +0 -1
- package/dist/services/auto-register.d.ts.map +0 -1
- package/dist/services/aws-client-agent-mcp.d.ts.map +0 -1
- package/dist/services/bridge-package-publish-hooks.d.ts.map +0 -1
- package/dist/services/cc-switch-sdk.d.ts.map +0 -1
- package/dist/services/cli-commands.d.ts.map +0 -1
- package/dist/services/event-delta-pusher.d.ts.map +0 -1
- package/dist/services/fileSnapshotStore.d.ts.map +0 -1
- package/dist/services/instance-ai-config-service.d.ts.map +0 -1
- package/dist/services/instance-init-service.d.ts.map +0 -1
- package/dist/services/instance-service.d.ts.map +0 -1
- package/dist/services/instance-state.d.ts.map +0 -1
- package/dist/services/legacy-path-migration.d.ts.map +0 -1
- package/dist/services/lifecycle-state.d.ts.map +0 -1
- package/dist/services/mcp-launch-binding-queue.d.ts.map +0 -1
- package/dist/services/orphan-monitor.d.ts.map +0 -1
- package/dist/services/panel-auth.d.ts.map +0 -1
- package/dist/services/process-detector.d.ts.map +0 -1
- package/dist/services/process-registry.d.ts.map +0 -1
- package/dist/services/ring-buffer.d.ts.map +0 -1
- package/dist/services/runtime-binding.d.ts.map +0 -1
- package/dist/services/runtime-lifecycle-policy.d.ts.map +0 -1
- package/dist/services/session-output.d.ts.map +0 -1
- package/dist/services/startup-config-wizard.d.ts.map +0 -1
- package/dist/services/sub-agent-manager-instance.d.ts.map +0 -1
- package/dist/services/system-metrics.d.ts.map +0 -1
- package/dist/services/terminal-persistence.d.ts.map +0 -1
- package/dist/services/tool-installer.d.ts.map +0 -1
- package/dist/services/tunnel-client.d.ts.map +0 -1
- package/dist/services/windows-service-manager.d.ts.map +0 -1
- package/dist/services/workspace-files.d.ts.map +0 -1
- package/dist/services/workspace-watch.d.ts.map +0 -1
- package/dist/services/workspaceTaskChangeWatcher.d.ts.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/utils/file-utils.d.ts.map +0 -1
- package/dist/utils/instance-ai-config-debug-logger.d.ts.map +0 -1
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/mcp-utils.d.ts.map +0 -1
- package/dist/utils/path-utils.d.ts.map +0 -1
- package/dist/utils/sdk-package-loader.d.ts.map +0 -1
- package/dist/utils/validation.d.ts.map +0 -1
- package/dist/utils/yaml-utils.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/constants.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/errors.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/index.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/schemas.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/sdk.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/mcp-model.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/mcp-service.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/skill-model.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/skill-service.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/state.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/types.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/utils/fs.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/utils/id.d.ts.map +0 -1
- package/package/acode/dist/ask-user-question-tool.d.ts.map +0 -1
- package/package/acode/dist/built-in-file-tools.d.ts.map +0 -1
- package/package/acode/dist/built-in-symbols-tool.d.ts.map +0 -1
- package/package/acode/dist/builtins/commandArtifacts.d.ts.map +0 -1
- package/package/acode/dist/builtins/commandOutputEvents.d.ts.map +0 -1
- package/package/acode/dist/builtins/shellCommandPreparation.d.ts.map +0 -1
- package/package/acode/dist/builtins/shellCommandResult.d.ts.map +0 -1
- package/package/acode/dist/builtins/shellCommandRunner.d.ts.map +0 -1
- package/package/acode/dist/builtins/shellOutputDecoder.d.ts.map +0 -1
- package/package/acode/dist/cli.d.ts.map +0 -1
- package/package/acode/dist/commands/commandLoader.d.ts.map +0 -1
- package/package/acode/dist/commands/commandParser.d.ts.map +0 -1
- package/package/acode/dist/commands/commandRegistry.d.ts.map +0 -1
- package/package/acode/dist/compaction.d.ts.map +0 -1
- package/package/acode/dist/config.d.ts.map +0 -1
- package/package/acode/dist/fs-utils.d.ts.map +0 -1
- package/package/acode/dist/hooks/hookBus.d.ts.map +0 -1
- package/package/acode/dist/index.d.ts.map +0 -1
- package/package/acode/dist/mcpToolNames.d.ts.map +0 -1
- package/package/acode/dist/parsers/ast-cache.d.ts.map +0 -1
- package/package/acode/dist/parsers/language-detector.d.ts.map +0 -1
- package/package/acode/dist/parsers/language-queries.d.ts.map +0 -1
- package/package/acode/dist/parsers/symbol-extractor.d.ts.map +0 -1
- package/package/acode/dist/parsers/tree-sitter-loader.d.ts.map +0 -1
- package/package/acode/dist/parsers/types.d.ts.map +0 -1
- package/package/acode/dist/runtime.d.ts.map +0 -1
- package/package/acode/dist/skill-tool.d.ts.map +0 -1
- package/package/acode/dist/sub-agent-manager.d.ts.map +0 -1
- package/package/acode/dist/sub-agent-store.d.ts.map +0 -1
- package/package/acode/dist/sub-agent-tools.d.ts.map +0 -1
- package/package/acode/dist/sub-agent-types.d.ts.map +0 -1
- package/package/acode/dist/todo-store.d.ts.map +0 -1
- package/package/acode/dist/todo-tool.d.ts.map +0 -1
- package/package/acode/dist/types.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/agent-client.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/agent-client.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/agent-client.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/config.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/config.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/config.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/config.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/constants.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/constants.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/context-manager.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/context-manager.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/index.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/index.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/logger.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/logger.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/logger.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/logger.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/messageContent.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/messageContent.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/types.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/types.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.test.js.map +0 -1
- package/package/cc-switch-sdk/dist/constants.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/errors.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/index.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/schemas.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/sdk.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/services/mcp-model.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/services/mcp-service.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/services/skill-model.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/services/skill-service.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/state.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/types.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/utils/fs.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/utils/id.d.ts.map +0 -1
package/dist/routes/instance.js
CHANGED
|
@@ -1,748 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import axios from "axios";
|
|
3
|
-
|
|
4
|
-
import { createHash, timingSafeEqual } from "node:crypto";
|
|
5
|
-
import { getBridgeVersion, resolveSchedulerBaseUrlFrom } from "../config.js";
|
|
6
|
-
import { validateToken, validateTokenOrPanelSession } from "../middleware/auth.js";
|
|
7
|
-
import { getConfiguredConnectionKeys, requestRuntimeAccessTokenRefreshForServer } from "../services/auto-register.js";
|
|
8
|
-
import { discoverCcSwitchConfiguredItems, loadCcSwitchSdk } from "../services/cc-switch-sdk.js";
|
|
9
|
-
import { initInstance, syncLegacyStateFromSdk } from "../services/instance-init-service.js";
|
|
10
|
-
import { createBridgeLifecycleOperation, deliverPendingBridgeLifecycleNotifications, upsertBridgeLifecycleOperation, } from "../services/lifecycle-state.js";
|
|
11
|
-
import { loadInstanceState, saveInstanceState, } from "../services/instance-state.js";
|
|
12
|
-
import { getRuntimeAccessToken } from "../services/runtime-binding.js";
|
|
13
|
-
import { detectToolStatuses, ensureToolsInstalled, SUPPORTED_INSTALLABLE_TOOLS, SUPPORTED_UNINSTALLABLE_TOOLS, uninstallTools, } from "../services/tool-installer.js";
|
|
14
|
-
import { createLogger } from "../utils/logger.js";
|
|
15
|
-
const log = createLogger("instance");
|
|
16
|
-
const PANEL_TOOL_STATUS_KEYS = ["acode", "claude", "opencode", "codex"];
|
|
17
|
-
// ★★★ 导出 gracefulShutdown 的触发函数
|
|
18
|
-
// 用于 aws-mcp-server 通知 bridge 保留会话状态关闭
|
|
19
|
-
let gracefulShutdownFn = null;
|
|
20
|
-
export function setGracefulShutdownFn(fn) {
|
|
21
|
-
gracefulShutdownFn = fn;
|
|
22
|
-
}
|
|
23
|
-
export const instanceRouter = Router();
|
|
24
|
-
function resolveNpmExecutable() {
|
|
25
|
-
return process.platform === "win32" ? "npm.cmd" : "npm";
|
|
26
|
-
}
|
|
27
|
-
function truncateCommandOutput(output) {
|
|
28
|
-
const maxLength = 16_000;
|
|
29
|
-
return output.length > maxLength
|
|
30
|
-
? `${output.slice(output.length - maxLength)}\n[output truncated]`
|
|
31
|
-
: output;
|
|
32
|
-
}
|
|
33
|
-
function runCommand(command, args) {
|
|
34
|
-
return new Promise((resolve, reject) => {
|
|
35
|
-
const child = spawn(command, args, {
|
|
36
|
-
shell: false,
|
|
37
|
-
windowsHide: true,
|
|
38
|
-
});
|
|
39
|
-
let stdout = "";
|
|
40
|
-
let stderr = "";
|
|
41
|
-
child.stdout.on("data", (chunk) => {
|
|
42
|
-
stdout += chunk.toString("utf8");
|
|
43
|
-
});
|
|
44
|
-
child.stderr.on("data", (chunk) => {
|
|
45
|
-
stderr += chunk.toString("utf8");
|
|
46
|
-
});
|
|
47
|
-
child.on("error", reject);
|
|
48
|
-
child.on("close", (exitCode) => {
|
|
49
|
-
resolve({
|
|
50
|
-
command,
|
|
51
|
-
args,
|
|
52
|
-
exitCode,
|
|
53
|
-
stdout: truncateCommandOutput(stdout),
|
|
54
|
-
stderr: truncateCommandOutput(stderr),
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
function normalizeOptionalText(value) {
|
|
60
|
-
const normalized = String(value || "").trim();
|
|
61
|
-
return normalized || undefined;
|
|
62
|
-
}
|
|
63
|
-
function resolveRequestRuntimeBridgeBaseUrl(req) {
|
|
64
|
-
const host = req.get("host");
|
|
65
|
-
if (!host) {
|
|
66
|
-
return undefined;
|
|
67
|
-
}
|
|
68
|
-
return `${req.protocol}://${host}`;
|
|
69
|
-
}
|
|
70
|
-
async function runBridgeUpdateInBackground(input) {
|
|
71
|
-
const runningOperation = {
|
|
72
|
-
...input.operation,
|
|
73
|
-
status: "running",
|
|
74
|
-
message: "Bridge 更新正在后台执行。",
|
|
75
|
-
};
|
|
76
|
-
await upsertBridgeLifecycleOperation(runningOperation);
|
|
77
|
-
try {
|
|
78
|
-
log.info("[update-bridge] 正在后台更新 aws-runtime-bridge 到最新版本");
|
|
79
|
-
const result = await runCommand(input.command, input.args);
|
|
80
|
-
const succeeded = result.exitCode === 0;
|
|
81
|
-
await upsertBridgeLifecycleOperation({
|
|
82
|
-
...runningOperation,
|
|
83
|
-
status: succeeded ? "succeeded" : "failed",
|
|
84
|
-
message: succeeded
|
|
85
|
-
? "Bridge 更新完成,请重启实例 Bridge 以加载新版本。"
|
|
86
|
-
: `Bridge 更新失败,npm 退出码: ${result.exitCode ?? "unknown"}`,
|
|
87
|
-
error: succeeded ? undefined : result.stderr || result.stdout,
|
|
88
|
-
});
|
|
89
|
-
await deliverPendingBridgeLifecycleNotifications();
|
|
90
|
-
}
|
|
91
|
-
catch (error) {
|
|
92
|
-
const err = error;
|
|
93
|
-
log.error("[update-bridge] background update failed:", err);
|
|
94
|
-
await upsertBridgeLifecycleOperation({
|
|
95
|
-
...runningOperation,
|
|
96
|
-
status: "failed",
|
|
97
|
-
message: "Bridge 更新失败。",
|
|
98
|
-
error: err.message || "update bridge failed",
|
|
99
|
-
});
|
|
100
|
-
await deliverPendingBridgeLifecycleNotifications();
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
async function writeRestartSessionFlag(preserveSessions) {
|
|
104
|
-
const fs = await import("node:fs/promises");
|
|
105
|
-
const path = await import("node:path");
|
|
106
|
-
const os = await import("node:os");
|
|
107
|
-
const restartFlagFile = path.join(os.tmpdir(), "agentswork-runtime-bridge", ".preserve-sessions");
|
|
108
|
-
if (preserveSessions) {
|
|
109
|
-
await fs.mkdir(path.dirname(restartFlagFile), { recursive: true });
|
|
110
|
-
await fs.writeFile(restartFlagFile, JSON.stringify({
|
|
111
|
-
preserveSessions: true,
|
|
112
|
-
timestamp: new Date().toISOString(),
|
|
113
|
-
}), "utf-8");
|
|
114
|
-
log.info(`[prepare-restart] 已创建保留会话标记文件: ${restartFlagFile}`);
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
try {
|
|
118
|
-
await fs.unlink(restartFlagFile);
|
|
119
|
-
log.info("[prepare-restart] 已删除保留会话标记文件");
|
|
120
|
-
}
|
|
121
|
-
catch {
|
|
122
|
-
// 文件不存在时无需处理。
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
function md5Hex(value) {
|
|
126
|
-
return createHash("md5").update(value, "utf8").digest("hex");
|
|
127
|
-
}
|
|
128
|
-
function hasMatchingConnectionKeyDigest(connectionKeyMd5) {
|
|
129
|
-
const provided = connectionKeyMd5.trim().toLowerCase();
|
|
130
|
-
if (!/^[a-f0-9]{32}$/.test(provided)) {
|
|
131
|
-
return false;
|
|
132
|
-
}
|
|
133
|
-
const providedBuffer = Buffer.from(provided, "hex");
|
|
134
|
-
return getConfiguredConnectionKeys()
|
|
135
|
-
.map((key) => key.trim())
|
|
136
|
-
.filter(Boolean)
|
|
137
|
-
.some((key) => {
|
|
138
|
-
const configuredBuffer = Buffer.from(md5Hex(key), "hex");
|
|
139
|
-
return (configuredBuffer.length === providedBuffer.length &&
|
|
140
|
-
timingSafeEqual(configuredBuffer, providedBuffer));
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
export function buildConnectionCheckResponse(connectionKeyMd5) {
|
|
144
|
-
const configuredConnectionKeys = getConfiguredConnectionKeys();
|
|
145
|
-
const connectionKeyRequired = configuredConnectionKeys.length > 0;
|
|
146
|
-
const version = getBridgeVersion();
|
|
147
|
-
if (!connectionKeyRequired) {
|
|
148
|
-
return {
|
|
149
|
-
status: 200,
|
|
150
|
-
body: {
|
|
151
|
-
ok: true,
|
|
152
|
-
runtimeBridge: "healthy",
|
|
153
|
-
version,
|
|
154
|
-
connectionKeyMatched: true,
|
|
155
|
-
connectionKeyRequired: false,
|
|
156
|
-
},
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
if (hasMatchingConnectionKeyDigest(connectionKeyMd5)) {
|
|
160
|
-
return {
|
|
161
|
-
status: 200,
|
|
162
|
-
body: {
|
|
163
|
-
ok: true,
|
|
164
|
-
runtimeBridge: "healthy",
|
|
165
|
-
version,
|
|
166
|
-
connectionKeyMatched: true,
|
|
167
|
-
connectionKeyRequired: true,
|
|
168
|
-
},
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
return {
|
|
172
|
-
status: 401,
|
|
173
|
-
body: {
|
|
174
|
-
ok: false,
|
|
175
|
-
error: "connection_key_mismatch",
|
|
176
|
-
version,
|
|
177
|
-
connectionKeyMatched: false,
|
|
178
|
-
connectionKeyRequired: true,
|
|
179
|
-
},
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* 构建调度中心 ping 失败响应。
|
|
184
|
-
* 主流程:保留底层错误与 scheduler 地址,同时明确 bridge 本身已连通、失败点在 bridge 回连调度中心。
|
|
185
|
-
*/
|
|
186
|
-
export function buildSchedulerPingFailureResponse(error, configuredSchedulerBaseUrl) {
|
|
187
|
-
const trimmedSchedulerBaseUrl = configuredSchedulerBaseUrl.trim();
|
|
188
|
-
const schedulerUrl = trimmedSchedulerBaseUrl || "http://localhost:8080";
|
|
189
|
-
const isLocalhostScheduler = /^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?(?:\/|$)/i.test(schedulerUrl);
|
|
190
|
-
return {
|
|
191
|
-
ok: false,
|
|
192
|
-
error: error.message || "scheduler ping failed",
|
|
193
|
-
failureStage: "scheduler_ping",
|
|
194
|
-
runtimeBridge: "healthy",
|
|
195
|
-
schedulerBaseUrl: schedulerUrl,
|
|
196
|
-
hint: isLocalhostScheduler
|
|
197
|
-
? "aws-runtime-bridge 已连通,但它回连调度中心失败。请在 bridge 启动环境中将 AWS_RUNTIME_SCHEDULER_BASE_URL 配置为该实例可访问的调度中心地址,例如 http://<server-host>:7380。"
|
|
198
|
-
: "aws-runtime-bridge 已连通,但它回连调度中心失败。请确认 AWS_RUNTIME_SCHEDULER_BASE_URL 指向的调度中心地址可从 bridge 机器访问,并且运行时访问令牌仍有效。",
|
|
199
|
-
};
|
|
200
|
-
}
|
|
201
|
-
function getAxiosStatusCode(error) {
|
|
202
|
-
if (typeof error !== "object" || error === null) {
|
|
203
|
-
return undefined;
|
|
204
|
-
}
|
|
205
|
-
const response = Reflect.get(error, "response");
|
|
206
|
-
if (typeof response !== "object" || response === null) {
|
|
207
|
-
return undefined;
|
|
208
|
-
}
|
|
209
|
-
const status = Reflect.get(response, "status");
|
|
210
|
-
return typeof status === "number" ? status : undefined;
|
|
211
|
-
}
|
|
212
|
-
async function pingSchedulerWithToken(schedulerBaseUrl, runtimeAccessToken) {
|
|
213
|
-
try {
|
|
214
|
-
const schedulerResponse = await axios.get(`${schedulerBaseUrl}/api/runtime/ping`, { headers: { "X-Runtime-Token": runtimeAccessToken } });
|
|
215
|
-
return {
|
|
216
|
-
schedulerReachable: schedulerResponse.status >= 200 && schedulerResponse.status < 300,
|
|
217
|
-
tokenRefreshed: false,
|
|
218
|
-
};
|
|
219
|
-
}
|
|
220
|
-
catch (error) {
|
|
221
|
-
if (getAxiosStatusCode(error) !== 401) {
|
|
222
|
-
throw error;
|
|
223
|
-
}
|
|
224
|
-
const refreshResult = await requestRuntimeAccessTokenRefreshForServer(schedulerBaseUrl);
|
|
225
|
-
if (!refreshResult.success || !refreshResult.runtimeAccessToken) {
|
|
226
|
-
throw error;
|
|
227
|
-
}
|
|
228
|
-
const retryResponse = await axios.get(`${schedulerBaseUrl}/api/runtime/ping`, { headers: { "X-Runtime-Token": refreshResult.runtimeAccessToken } });
|
|
229
|
-
return {
|
|
230
|
-
schedulerReachable: retryResponse.status >= 200 && retryResponse.status < 300,
|
|
231
|
-
tokenRefreshed: true,
|
|
232
|
-
};
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
/**
|
|
236
|
-
* Build the response for ambiguous scheduler targets.
|
|
237
|
-
* Main flow: never silently pick the first target; require an explicit scheduler URL or future scheduler identity routing.
|
|
238
|
-
*/
|
|
239
|
-
export function buildAmbiguousSchedulerBaseUrlResponse(targetUrls) {
|
|
240
|
-
return {
|
|
241
|
-
ok: false,
|
|
242
|
-
error: "ambiguous_scheduler_base_url",
|
|
243
|
-
failureStage: "scheduler_ping",
|
|
244
|
-
runtimeBridge: "healthy",
|
|
245
|
-
schedulerBaseUrl: "",
|
|
246
|
-
autoRegisterTargetUrls: targetUrls,
|
|
247
|
-
hint: "Multiple autoRegisterTargets.serverUrl values were found, so bridge cannot safely infer which scheduler /runtime/ping should call back. Set AWS_RUNTIME_SCHEDULER_BASE_URL explicitly, or use future schedulerId/token-bound multi-scheduler routing.",
|
|
248
|
-
};
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* 构建工具状态检测目标列表。
|
|
252
|
-
* 主流程:合并实例启用工具与配置面板固定展示工具,避免历史状态缺少 Codex 时前端误判为待检测。
|
|
253
|
-
*/
|
|
254
|
-
export function buildToolStatusDetectionTargets(enabledTools) {
|
|
255
|
-
return Array.from(new Set([...enabledTools, ...PANEL_TOOL_STATUS_KEYS]
|
|
256
|
-
.map((tool) => String(tool || "").trim().toLowerCase())
|
|
257
|
-
.filter(Boolean)));
|
|
258
|
-
}
|
|
259
|
-
/**
|
|
260
|
-
* 汇总卸载后仍可执行的工具,用于避免把部分卸载误报为成功。
|
|
261
|
-
*/
|
|
262
|
-
export function buildUninstallFailureMessage(requestedTools, toolStatus) {
|
|
263
|
-
const failedTools = requestedTools.filter((tool) => toolStatus[tool]?.installed);
|
|
264
|
-
if (failedTools.length === 0) {
|
|
265
|
-
return "";
|
|
266
|
-
}
|
|
267
|
-
return failedTools
|
|
268
|
-
.map((tool) => {
|
|
269
|
-
const status = toolStatus[tool];
|
|
270
|
-
const detail = status?.error || status?.executable || "command is still available";
|
|
271
|
-
return `${tool}: ${detail}`;
|
|
272
|
-
})
|
|
273
|
-
.join("; ");
|
|
274
|
-
}
|
|
275
|
-
export function summarizeToolStatus(toolStatus) {
|
|
276
|
-
return Object.fromEntries(Object.entries(toolStatus || {}).map(([tool, status]) => [
|
|
277
|
-
tool,
|
|
278
|
-
{
|
|
279
|
-
installed: Boolean(status?.installed),
|
|
280
|
-
version: status?.version || null,
|
|
281
|
-
executable: status?.executable || null,
|
|
282
|
-
error: status?.error || null,
|
|
283
|
-
},
|
|
284
|
-
]));
|
|
285
|
-
}
|
|
286
|
-
/**
|
|
287
|
-
* GET /runtime/check-update
|
|
288
|
-
*
|
|
289
|
-
* 查询 npm registry 获取 aws-runtime-bridge 的最新版本并和当前版本比较。
|
|
290
|
-
* 使用 5 分钟内存缓存减少对 npm registry 的请求。
|
|
291
|
-
*/
|
|
292
|
-
let updateCheckCache = null;
|
|
293
|
-
const UPDATE_CHECK_CACHE_TTL = 300_000; // 5 分钟
|
|
294
|
-
async function fetchLatestNpmVersion() {
|
|
295
|
-
const response = await axios.get("https://registry.npmjs.org/aws-runtime-bridge/latest", { timeout: 10_000, responseType: "json" });
|
|
296
|
-
const data = response.data;
|
|
297
|
-
return data?.version || "unknown";
|
|
298
|
-
}
|
|
299
|
-
instanceRouter.get("/check-update", async (_req, res) => {
|
|
300
|
-
try {
|
|
301
|
-
let latestVersion;
|
|
302
|
-
if (updateCheckCache && Date.now() - updateCheckCache.ts < UPDATE_CHECK_CACHE_TTL) {
|
|
303
|
-
latestVersion = updateCheckCache.latestVersion;
|
|
304
|
-
}
|
|
305
|
-
else {
|
|
306
|
-
latestVersion = await fetchLatestNpmVersion();
|
|
307
|
-
updateCheckCache = { latestVersion, ts: Date.now() };
|
|
308
|
-
}
|
|
309
|
-
const currentVersion = getBridgeVersion();
|
|
310
|
-
const hasUpdate = latestVersion !== "unknown" && currentVersion !== "unknown" && latestVersion !== currentVersion;
|
|
311
|
-
res.json({
|
|
312
|
-
ok: true,
|
|
313
|
-
hasUpdate,
|
|
314
|
-
currentVersion,
|
|
315
|
-
latestVersion,
|
|
316
|
-
});
|
|
317
|
-
}
|
|
318
|
-
catch (error) {
|
|
319
|
-
const err = error;
|
|
320
|
-
log.warn("[check-update] Failed to query npm registry:", err.message);
|
|
321
|
-
res.json({
|
|
322
|
-
ok: false,
|
|
323
|
-
hasUpdate: false,
|
|
324
|
-
currentVersion: getBridgeVersion(),
|
|
325
|
-
latestVersion: null,
|
|
326
|
-
error: err.message || "failed to check for updates",
|
|
327
|
-
});
|
|
328
|
-
}
|
|
329
|
-
});
|
|
330
|
-
instanceRouter.get("/healthz", (_req, res) => {
|
|
331
|
-
res.json({
|
|
332
|
-
ok: true,
|
|
333
|
-
runtimeBridge: "healthy",
|
|
334
|
-
});
|
|
335
|
-
});
|
|
336
|
-
instanceRouter.get("/connection-check", (req, res) => {
|
|
337
|
-
const connectionKeyMd5 = String(req.header("X-Bridge-Connection-Key-MD5") || "");
|
|
338
|
-
const result = buildConnectionCheckResponse(connectionKeyMd5);
|
|
339
|
-
res.status(result.status).json(result.body);
|
|
340
|
-
});
|
|
341
|
-
instanceRouter.get("/ping", validateToken, async (req, res) => {
|
|
342
|
-
const schedulerBaseUrlResolution = resolveSchedulerBaseUrlFrom(req.header("X-Scheduler-Base-Url"), req.header("X-Bridge-Instance-Id"), req.header("X-Bridge-Instance-Name"));
|
|
343
|
-
if (schedulerBaseUrlResolution.source === "ambiguous-auto-register-targets") {
|
|
344
|
-
res
|
|
345
|
-
.status(400)
|
|
346
|
-
.json(buildAmbiguousSchedulerBaseUrlResponse(schedulerBaseUrlResolution.ambiguousTargetUrls));
|
|
347
|
-
return;
|
|
348
|
-
}
|
|
349
|
-
const schedulerBaseUrl = schedulerBaseUrlResolution.url;
|
|
350
|
-
try {
|
|
351
|
-
const runtimeAccessToken = getRuntimeAccessToken(schedulerBaseUrl);
|
|
352
|
-
if (!runtimeAccessToken) {
|
|
353
|
-
res.status(401).json({ ok: false, error: "runtime_access_token_required" });
|
|
354
|
-
return;
|
|
355
|
-
}
|
|
356
|
-
const schedulerPing = await pingSchedulerWithToken(schedulerBaseUrl, runtimeAccessToken);
|
|
357
|
-
res.json({
|
|
358
|
-
ok: true,
|
|
359
|
-
runtimeBridge: "healthy",
|
|
360
|
-
version: getBridgeVersion(),
|
|
361
|
-
schedulerReachable: schedulerPing.schedulerReachable,
|
|
362
|
-
tokenRefreshed: schedulerPing.tokenRefreshed,
|
|
363
|
-
schedulerBaseUrl,
|
|
364
|
-
// 回传匹配到的 instanceId/instanceName,让 server 知道 bridge 实际绑定的是哪个
|
|
365
|
-
instanceId: schedulerBaseUrlResolution.instanceId,
|
|
366
|
-
instanceName: schedulerBaseUrlResolution.instanceName,
|
|
367
|
-
});
|
|
368
|
-
}
|
|
369
|
-
catch (error) {
|
|
370
|
-
const err = error;
|
|
371
|
-
res
|
|
372
|
-
.status(502)
|
|
373
|
-
.json(buildSchedulerPingFailureResponse(err, schedulerBaseUrl));
|
|
374
|
-
}
|
|
375
|
-
});
|
|
376
|
-
instanceRouter.post("/init-instance", validateToken, async (req, res) => {
|
|
377
|
-
const { agentId, workspacePath, skillEnabled, mcpEnabled, ccSwitchEnabledTools, skillPackage, skillPackages, mcpServers, } = req.body || {};
|
|
378
|
-
if (!agentId || !workspacePath) {
|
|
379
|
-
res.status(400).json({ error: "agentId and workspacePath are required" });
|
|
380
|
-
return;
|
|
381
|
-
}
|
|
382
|
-
try {
|
|
383
|
-
log.info("[init-instance] Request received", {
|
|
384
|
-
agentId: String(agentId),
|
|
385
|
-
workspacePath: String(workspacePath),
|
|
386
|
-
skillEnabled,
|
|
387
|
-
mcpEnabled,
|
|
388
|
-
ccSwitchEnabledTools,
|
|
389
|
-
});
|
|
390
|
-
const result = await initInstance(agentId, workspacePath, {
|
|
391
|
-
skillEnabled,
|
|
392
|
-
mcpEnabled,
|
|
393
|
-
ccSwitchEnabledTools,
|
|
394
|
-
skillPackage,
|
|
395
|
-
skillPackages,
|
|
396
|
-
mcpServers,
|
|
397
|
-
});
|
|
398
|
-
log.info("[init-instance] Initialization completed", {
|
|
399
|
-
agentId: String(agentId),
|
|
400
|
-
ok: result.ok,
|
|
401
|
-
logCount: result.logs?.length || 0,
|
|
402
|
-
enabledTools: result.enabledTools,
|
|
403
|
-
});
|
|
404
|
-
res.json(result);
|
|
405
|
-
}
|
|
406
|
-
catch (error) {
|
|
407
|
-
const err = error;
|
|
408
|
-
log.error("[init-instance] Initialization failed", {
|
|
409
|
-
agentId: String(agentId),
|
|
410
|
-
workspacePath: String(workspacePath),
|
|
411
|
-
error: err?.message || String(error),
|
|
412
|
-
stack: err?.stack || null,
|
|
413
|
-
});
|
|
414
|
-
res.status(400).json({
|
|
415
|
-
error: err?.message || "initialize instance failed",
|
|
416
|
-
});
|
|
417
|
-
}
|
|
418
|
-
});
|
|
419
|
-
instanceRouter.post("/cc-switch/state", validateToken, async (req, res) => {
|
|
420
|
-
const { agentId } = req.body || {};
|
|
421
|
-
if (!agentId) {
|
|
422
|
-
res.status(400).json({ error: "agentId is required" });
|
|
423
|
-
return;
|
|
424
|
-
}
|
|
425
|
-
try {
|
|
426
|
-
log.info("[cc-switch/state] Request received", { agentId: String(agentId) });
|
|
427
|
-
const sdk = await loadCcSwitchSdk(agentId);
|
|
428
|
-
const imported = await discoverCcSwitchConfiguredItems(sdk);
|
|
429
|
-
const synced = await syncLegacyStateFromSdk(agentId, sdk);
|
|
430
|
-
const state = synced.state;
|
|
431
|
-
const detectionTargets = buildToolStatusDetectionTargets(state.enabledTools || []);
|
|
432
|
-
log.info("[cc-switch/state] Detecting SDK statuses", {
|
|
433
|
-
agentId: String(agentId),
|
|
434
|
-
detectionTargets,
|
|
435
|
-
});
|
|
436
|
-
const toolStatus = await detectToolStatuses(detectionTargets);
|
|
437
|
-
log.info("[cc-switch/state] SDK status detection completed", {
|
|
438
|
-
agentId: String(agentId),
|
|
439
|
-
toolStatus: summarizeToolStatus(toolStatus),
|
|
440
|
-
importedMcpCount: imported.mcpServers,
|
|
441
|
-
importedSkillCount: imported.skills,
|
|
442
|
-
});
|
|
443
|
-
res.json({
|
|
444
|
-
ok: true,
|
|
445
|
-
agentId: String(agentId),
|
|
446
|
-
imported: {
|
|
447
|
-
mcpServers: imported.mcpServers,
|
|
448
|
-
skills: imported.skills,
|
|
449
|
-
},
|
|
450
|
-
state: { ...state, toolStatus },
|
|
451
|
-
});
|
|
452
|
-
}
|
|
453
|
-
catch (error) {
|
|
454
|
-
const err = error;
|
|
455
|
-
log.error("[cc-switch/state] Failed to load state", {
|
|
456
|
-
agentId: String(agentId),
|
|
457
|
-
error: err?.message || String(error),
|
|
458
|
-
stack: err?.stack || null,
|
|
459
|
-
});
|
|
460
|
-
res.status(400).json({ error: err?.message || "load state failed" });
|
|
461
|
-
}
|
|
462
|
-
});
|
|
463
|
-
instanceRouter.post("/cc-switch/install-tools", validateToken, async (req, res) => {
|
|
464
|
-
const { agentId, tools } = req.body || {};
|
|
465
|
-
if (!agentId) {
|
|
466
|
-
res.status(400).json({ error: "agentId is required" });
|
|
467
|
-
return;
|
|
468
|
-
}
|
|
469
|
-
const requestedTools = Array.isArray(tools)
|
|
470
|
-
? tools
|
|
471
|
-
.map((tool) => String(tool || "")
|
|
472
|
-
.trim()
|
|
473
|
-
.toLowerCase())
|
|
474
|
-
.filter(Boolean)
|
|
475
|
-
: [];
|
|
476
|
-
log.info("[cc-switch/install-tools] Request received", {
|
|
477
|
-
agentId: String(agentId),
|
|
478
|
-
requestedTools,
|
|
479
|
-
});
|
|
480
|
-
const supportedInstallableTools = new Set(SUPPORTED_INSTALLABLE_TOOLS);
|
|
481
|
-
const installableTools = requestedTools.filter((tool) => supportedInstallableTools.has(tool));
|
|
482
|
-
log.info("[cc-switch/install-tools] Request normalized", {
|
|
483
|
-
agentId: String(agentId),
|
|
484
|
-
requestedTools,
|
|
485
|
-
installableTools,
|
|
486
|
-
supportedInstallableTools: SUPPORTED_INSTALLABLE_TOOLS,
|
|
487
|
-
});
|
|
488
|
-
if (installableTools.length === 0) {
|
|
489
|
-
log.warn("[cc-switch/install-tools] No supported installable tools requested", {
|
|
490
|
-
agentId: String(agentId),
|
|
491
|
-
requestedTools,
|
|
492
|
-
});
|
|
493
|
-
res
|
|
494
|
-
.status(400)
|
|
495
|
-
.json({
|
|
496
|
-
error: `tools must include ${SUPPORTED_INSTALLABLE_TOOLS.join(", ")}`,
|
|
497
|
-
});
|
|
498
|
-
return;
|
|
499
|
-
}
|
|
500
|
-
try {
|
|
501
|
-
const state = await loadInstanceState(agentId);
|
|
502
|
-
const enabledTools = Array.from(new Set([...(state.enabledTools || []), ...installableTools]));
|
|
503
|
-
log.info("[cc-switch/install-tools] Starting installer", {
|
|
504
|
-
agentId: String(agentId),
|
|
505
|
-
installableTools,
|
|
506
|
-
previousEnabledTools: state.enabledTools || [],
|
|
507
|
-
nextEnabledTools: enabledTools,
|
|
508
|
-
});
|
|
509
|
-
const toolStatus = await ensureToolsInstalled(installableTools);
|
|
510
|
-
log.info("[cc-switch/install-tools] Installer completed", {
|
|
511
|
-
agentId: String(agentId),
|
|
512
|
-
toolStatus: summarizeToolStatus(toolStatus),
|
|
513
|
-
});
|
|
514
|
-
const refreshedToolStatus = await detectToolStatuses(enabledTools);
|
|
515
|
-
log.info("[cc-switch/install-tools] Refreshed enabled SDK statuses", {
|
|
516
|
-
agentId: String(agentId),
|
|
517
|
-
refreshedToolStatus: summarizeToolStatus(refreshedToolStatus),
|
|
518
|
-
});
|
|
519
|
-
const nextToolStatus = {
|
|
520
|
-
...refreshedToolStatus,
|
|
521
|
-
...toolStatus,
|
|
522
|
-
};
|
|
523
|
-
const savedState = await saveInstanceState(agentId, {
|
|
524
|
-
...state,
|
|
525
|
-
enabledTools,
|
|
526
|
-
toolStatus: nextToolStatus,
|
|
527
|
-
});
|
|
528
|
-
const installableToolSet = new Set(installableTools);
|
|
529
|
-
const failedTools = Object.entries(nextToolStatus)
|
|
530
|
-
.filter(([tool]) => installableToolSet.has(tool))
|
|
531
|
-
.filter(([, status]) => !status.installed)
|
|
532
|
-
.map(([tool, status]) => ({ tool, error: status.error || null }));
|
|
533
|
-
if (failedTools.length > 0) {
|
|
534
|
-
log.warn("[cc-switch/install-tools] Some SDKs remain unavailable", {
|
|
535
|
-
agentId: String(agentId),
|
|
536
|
-
failedTools,
|
|
537
|
-
});
|
|
538
|
-
}
|
|
539
|
-
log.info("[cc-switch/install-tools] State saved", {
|
|
540
|
-
agentId: String(agentId),
|
|
541
|
-
enabledTools: savedState.enabledTools,
|
|
542
|
-
toolStatus: summarizeToolStatus(nextToolStatus),
|
|
543
|
-
});
|
|
544
|
-
res.json({
|
|
545
|
-
ok: failedTools.length === 0,
|
|
546
|
-
agentId: String(agentId),
|
|
547
|
-
toolStatus: nextToolStatus,
|
|
548
|
-
failedTools,
|
|
549
|
-
state: savedState,
|
|
550
|
-
});
|
|
551
|
-
}
|
|
552
|
-
catch (error) {
|
|
553
|
-
const err = error;
|
|
554
|
-
log.error("[cc-switch/install-tools] Install route failed", {
|
|
555
|
-
agentId: String(agentId),
|
|
556
|
-
requestedTools,
|
|
557
|
-
installableTools,
|
|
558
|
-
error: err?.message || String(error),
|
|
559
|
-
stack: err?.stack || null,
|
|
560
|
-
});
|
|
561
|
-
res.status(400).json({ error: err?.message || "install tools failed" });
|
|
562
|
-
}
|
|
563
|
-
});
|
|
564
|
-
instanceRouter.post("/cc-switch/uninstall-tools", validateToken, async (req, res) => {
|
|
565
|
-
const { agentId, tools } = req.body || {};
|
|
566
|
-
if (!agentId) {
|
|
567
|
-
res.status(400).json({ error: "agentId is required" });
|
|
568
|
-
return;
|
|
569
|
-
}
|
|
570
|
-
const requestedTools = Array.isArray(tools)
|
|
571
|
-
? tools
|
|
572
|
-
.map((tool) => String(tool || "")
|
|
573
|
-
.trim()
|
|
574
|
-
.toLowerCase())
|
|
575
|
-
.filter(Boolean)
|
|
576
|
-
: [];
|
|
577
|
-
const supportedUninstallableTools = new Set(SUPPORTED_UNINSTALLABLE_TOOLS);
|
|
578
|
-
const uninstallableTools = requestedTools.filter((tool) => supportedUninstallableTools.has(tool));
|
|
579
|
-
if (uninstallableTools.length === 0) {
|
|
580
|
-
res.status(400).json({
|
|
581
|
-
error: `tools must include ${SUPPORTED_UNINSTALLABLE_TOOLS.join(", ")}`,
|
|
582
|
-
});
|
|
583
|
-
return;
|
|
584
|
-
}
|
|
585
|
-
try {
|
|
586
|
-
const state = await loadInstanceState(agentId);
|
|
587
|
-
const uninstallableToolSet = new Set(uninstallableTools);
|
|
588
|
-
const enabledTools = (state.enabledTools || []).filter((tool) => !uninstallableToolSet.has(String(tool || "").trim().toLowerCase()));
|
|
589
|
-
const uninstalledToolStatus = await uninstallTools(uninstallableTools);
|
|
590
|
-
const refreshedToolStatus = await detectToolStatuses([
|
|
591
|
-
...enabledTools,
|
|
592
|
-
...uninstallableTools,
|
|
593
|
-
]);
|
|
594
|
-
const nextToolStatus = {
|
|
595
|
-
...refreshedToolStatus,
|
|
596
|
-
...uninstalledToolStatus,
|
|
597
|
-
};
|
|
598
|
-
const uninstallFailureMessage = buildUninstallFailureMessage(uninstallableTools, nextToolStatus);
|
|
599
|
-
const nextEnabledTools = uninstallFailureMessage
|
|
600
|
-
? state.enabledTools || []
|
|
601
|
-
: enabledTools;
|
|
602
|
-
const savedState = await saveInstanceState(agentId, {
|
|
603
|
-
...state,
|
|
604
|
-
enabledTools: nextEnabledTools,
|
|
605
|
-
toolStatus: nextToolStatus,
|
|
606
|
-
});
|
|
607
|
-
if (uninstallFailureMessage) {
|
|
608
|
-
res.status(400).json({
|
|
609
|
-
ok: false,
|
|
610
|
-
agentId: String(agentId),
|
|
611
|
-
error: `uninstall incomplete: ${uninstallFailureMessage}`,
|
|
612
|
-
toolStatus: nextToolStatus,
|
|
613
|
-
state: savedState,
|
|
614
|
-
});
|
|
615
|
-
return;
|
|
616
|
-
}
|
|
617
|
-
res.json({
|
|
618
|
-
ok: true,
|
|
619
|
-
agentId: String(agentId),
|
|
620
|
-
toolStatus: nextToolStatus,
|
|
621
|
-
state: savedState,
|
|
622
|
-
});
|
|
623
|
-
}
|
|
624
|
-
catch (error) {
|
|
625
|
-
const err = error;
|
|
626
|
-
res.status(400).json({ error: err?.message || "uninstall tools failed" });
|
|
627
|
-
}
|
|
628
|
-
});
|
|
629
|
-
/**
|
|
630
|
-
* ★★★ 新增:aws-mcp-server 通知 bridge 准备重启
|
|
631
|
-
* POST /runtime/prepare-restart
|
|
632
|
-
*
|
|
633
|
-
* 当 aws-mcp-server 准备重启时,调用此接口通知 bridge:
|
|
634
|
-
* - bridge 保留所有会话状态(不清空持久化)
|
|
635
|
-
* - aws-mcp-server 重启后可以从 bridge 恢复 agent 状态
|
|
636
|
-
*
|
|
637
|
-
* 请求体:
|
|
638
|
-
* - preserveSessions: true = 保留会话(aws-mcp-server 重启)
|
|
639
|
-
* false = 清理会话(bridge 自己关闭)
|
|
640
|
-
*/
|
|
641
|
-
instanceRouter.post("/prepare-restart", validateToken, async (req, res) => {
|
|
642
|
-
const { preserveSessions = true } = req.body || {};
|
|
643
|
-
try {
|
|
644
|
-
log.info(`[prepare-restart] 收到准备重启通知,preserveSessions=${preserveSessions}`);
|
|
645
|
-
// 记录重启模式到文件,供下次启动时判断。
|
|
646
|
-
await writeRestartSessionFlag(Boolean(preserveSessions));
|
|
647
|
-
res.json({
|
|
648
|
-
ok: true,
|
|
649
|
-
preserveSessions,
|
|
650
|
-
message: preserveSessions
|
|
651
|
-
? "Bridge will preserve sessions for aws-mcp-server restart"
|
|
652
|
-
: "Bridge will clean up sessions on shutdown",
|
|
653
|
-
});
|
|
654
|
-
}
|
|
655
|
-
catch (error) {
|
|
656
|
-
const err = error;
|
|
657
|
-
log.error("[prepare-restart] Error:", err);
|
|
658
|
-
res.status(500).json({ error: err.message });
|
|
659
|
-
}
|
|
660
|
-
});
|
|
661
|
-
/**
|
|
662
|
-
* POST /runtime/update-bridge
|
|
663
|
-
*
|
|
664
|
-
* 通过当前 Bridge 进程执行全局 npm 包更新,等价于 CLI 的
|
|
665
|
-
* `awsb update`,用于面板上的“更新实例 Bridge”。
|
|
666
|
-
*/
|
|
667
|
-
instanceRouter.post("/update-bridge", validateTokenOrPanelSession, async (req, res) => {
|
|
668
|
-
const command = resolveNpmExecutable();
|
|
669
|
-
const args = ["install", "-g", "aws-runtime-bridge@latest", "--omit=optional"];
|
|
670
|
-
const requestedByUserId = normalizeOptionalText(req.body?.requestedByUserId);
|
|
671
|
-
try {
|
|
672
|
-
if (!requestedByUserId) {
|
|
673
|
-
res.status(400).json({ error: "requestedByUserId is required" });
|
|
674
|
-
return;
|
|
675
|
-
}
|
|
676
|
-
const operation = createBridgeLifecycleOperation({
|
|
677
|
-
operationType: "update",
|
|
678
|
-
requestedByUserId,
|
|
679
|
-
schedulerBaseUrl: req.body?.schedulerBaseUrl,
|
|
680
|
-
runtimeBridgeBaseUrl: resolveRequestRuntimeBridgeBaseUrl(req),
|
|
681
|
-
status: "accepted",
|
|
682
|
-
message: "Bridge 更新请求已收到,将在后台执行。",
|
|
683
|
-
});
|
|
684
|
-
await upsertBridgeLifecycleOperation(operation);
|
|
685
|
-
void runBridgeUpdateInBackground({ command, args, operation });
|
|
686
|
-
res.json({
|
|
687
|
-
ok: true,
|
|
688
|
-
operationId: operation.operationId,
|
|
689
|
-
message: "Bridge 更新已在后台开始,完成后会通过消息中心通知结果。",
|
|
690
|
-
});
|
|
691
|
-
}
|
|
692
|
-
catch (error) {
|
|
693
|
-
const err = error;
|
|
694
|
-
log.error("[update-bridge] Error:", err);
|
|
695
|
-
res.status(500).json({ error: err.message || "update bridge failed" });
|
|
696
|
-
}
|
|
697
|
-
});
|
|
698
|
-
/**
|
|
699
|
-
* POST /runtime/restart-bridge
|
|
700
|
-
*
|
|
701
|
-
* 写入保留会话标记后优雅关闭当前 Bridge 进程。真正的重新拉起由
|
|
702
|
-
* systemd、PM2、Docker 外部守护或用户手动启动完成。
|
|
703
|
-
*/
|
|
704
|
-
instanceRouter.post("/restart-bridge", validateTokenOrPanelSession, async (req, res) => {
|
|
705
|
-
const { preserveSessions = true } = req.body || {};
|
|
706
|
-
const requestedByUserId = normalizeOptionalText(req.body?.requestedByUserId);
|
|
707
|
-
try {
|
|
708
|
-
if (!requestedByUserId) {
|
|
709
|
-
res.status(400).json({ error: "requestedByUserId is required" });
|
|
710
|
-
return;
|
|
711
|
-
}
|
|
712
|
-
log.info(`[restart-bridge] 收到实例 Bridge 重启请求,preserveSessions=${preserveSessions}`);
|
|
713
|
-
const operation = createBridgeLifecycleOperation({
|
|
714
|
-
operationType: "restart",
|
|
715
|
-
requestedByUserId,
|
|
716
|
-
schedulerBaseUrl: req.body?.schedulerBaseUrl,
|
|
717
|
-
runtimeBridgeBaseUrl: resolveRequestRuntimeBridgeBaseUrl(req),
|
|
718
|
-
status: "accepted",
|
|
719
|
-
message: "Bridge 已收到重启请求;下次启动后会发送确认通知。",
|
|
720
|
-
});
|
|
721
|
-
await upsertBridgeLifecycleOperation(operation);
|
|
722
|
-
await writeRestartSessionFlag(Boolean(preserveSessions));
|
|
723
|
-
res.json({
|
|
724
|
-
ok: true,
|
|
725
|
-
operationId: operation.operationId,
|
|
726
|
-
preserveSessions: Boolean(preserveSessions),
|
|
727
|
-
message: "Bridge 正在优雅退出;下次启动后会通过消息中心通知结果。若未由守护进程管理,请手动重新启动。",
|
|
728
|
-
});
|
|
729
|
-
setTimeout(() => {
|
|
730
|
-
// 用退出码 42 表示"重启请求",配合 systemd Restart=on-failure 触发自动拉起
|
|
731
|
-
process.exitCode = 42;
|
|
732
|
-
if (gracefulShutdownFn) {
|
|
733
|
-
gracefulShutdownFn("PANEL_RESTART", Boolean(preserveSessions)).catch((error) => {
|
|
734
|
-
const err = error;
|
|
735
|
-
log.error("[restart-bridge] graceful shutdown failed:", err);
|
|
736
|
-
process.exit(1);
|
|
737
|
-
});
|
|
738
|
-
return;
|
|
739
|
-
}
|
|
740
|
-
process.exit(42);
|
|
741
|
-
}, 250);
|
|
742
|
-
}
|
|
743
|
-
catch (error) {
|
|
744
|
-
const err = error;
|
|
745
|
-
log.error("[restart-bridge] Error:", err);
|
|
746
|
-
res.status(500).json({ error: err.message || "restart bridge failed" });
|
|
747
|
-
}
|
|
748
|
-
});
|
|
1
|
+
import{Router as D}from"express";import I from"axios";import{spawn as N}from"node:child_process";import{createHash as $,timingSafeEqual as F}from"node:crypto";import{getBridgeVersion as b,resolveSchedulerBaseUrlFrom as M}from"../config.js";import{validateToken as S,validateTokenOrPanelSession as j}from"../middleware/auth.js";import{getConfiguredConnectionKeys as _,requestRuntimeAccessTokenRefreshForServer as z}from"../services/auto-register.js";import{discoverCcSwitchConfiguredItems as H,loadCcSwitchSdk as V}from"../services/cc-switch-sdk.js";import{initInstance as X,syncLegacyStateFromSdk as W}from"../services/instance-init-service.js";import{createBridgeLifecycleOperation as E,deliverPendingBridgeLifecycleNotifications as C,upsertBridgeLifecycleOperation as y}from"../services/lifecycle-state.js";import{loadInstanceState as x,saveInstanceState as L}from"../services/instance-state.js";import{getRuntimeAccessToken as G}from"../services/runtime-binding.js";import{detectToolStatuses as R,ensureToolsInstalled as J,SUPPORTED_INSTALLABLE_TOOLS as v,SUPPORTED_UNINSTALLABLE_TOOLS as A,uninstallTools as Y}from"../services/tool-installer.js";import{createLogger as Q}from"../utils/logger.js";const l=Q("instance"),Z=["acode","claude","opencode","codex"];let U=null;function je(r){U=r}const d=D();function ee(){return process.platform==="win32"?"npm.cmd":"npm"}function q(r){return r.length>16e3?`${r.slice(r.length-16e3)}
|
|
2
|
+
[output truncated]`:r}function te(r,t){return new Promise((e,s)=>{const n=N(r,t,{shell:!1,windowsHide:!0});let a="",i="";n.stdout.on("data",o=>{a+=o.toString("utf8")}),n.stderr.on("data",o=>{i+=o.toString("utf8")}),n.on("error",s),n.on("close",o=>{e({command:r,args:t,exitCode:o,stdout:q(a),stderr:q(i)})})})}function K(r){return String(r||"").trim()||void 0}function O(r){const t=r.get("host");if(t)return`${r.protocol}://${t}`}async function re(r){const t={...r.operation,status:"running",message:"Bridge \u66F4\u65B0\u6B63\u5728\u540E\u53F0\u6267\u884C\u3002"};await y(t);try{l.info("[update-bridge] \u6B63\u5728\u540E\u53F0\u66F4\u65B0 aws-runtime-bridge \u5230\u6700\u65B0\u7248\u672C");const e=await te(r.command,r.args),s=e.exitCode===0;await y({...t,status:s?"succeeded":"failed",message:s?"Bridge \u66F4\u65B0\u5B8C\u6210\uFF0C\u8BF7\u91CD\u542F\u5B9E\u4F8B Bridge \u4EE5\u52A0\u8F7D\u65B0\u7248\u672C\u3002":`Bridge \u66F4\u65B0\u5931\u8D25\uFF0Cnpm \u9000\u51FA\u7801: ${e.exitCode??"unknown"}`,error:s?void 0:e.stderr||e.stdout}),await C()}catch(e){const s=e;l.error("[update-bridge] background update failed:",s),await y({...t,status:"failed",message:"Bridge \u66F4\u65B0\u5931\u8D25\u3002",error:s.message||"update bridge failed"}),await C()}}async function P(r){const t=await import("node:fs/promises"),e=await import("node:path"),s=await import("node:os"),n=e.join(s.tmpdir(),"agentswork-runtime-bridge",".preserve-sessions");if(r){await t.mkdir(e.dirname(n),{recursive:!0}),await t.writeFile(n,JSON.stringify({preserveSessions:!0,timestamp:new Date().toISOString()}),"utf-8"),l.info(`[prepare-restart] \u5DF2\u521B\u5EFA\u4FDD\u7559\u4F1A\u8BDD\u6807\u8BB0\u6587\u4EF6: ${n}`);return}try{await t.unlink(n),l.info("[prepare-restart] \u5DF2\u5220\u9664\u4FDD\u7559\u4F1A\u8BDD\u6807\u8BB0\u6587\u4EF6")}catch{}}function se(r){return $("md5").update(r,"utf8").digest("hex")}function ne(r){const t=r.trim().toLowerCase();if(!/^[a-f0-9]{32}$/.test(t))return!1;const e=Buffer.from(t,"hex");return _().map(s=>s.trim()).filter(Boolean).some(s=>{const n=Buffer.from(se(s),"hex");return n.length===e.length&&F(n,e)})}function oe(r){const e=_().length>0,s=b();return e?ne(r)?{status:200,body:{ok:!0,runtimeBridge:"healthy",version:s,connectionKeyMatched:!0,connectionKeyRequired:!0}}:{status:401,body:{ok:!1,error:"connection_key_mismatch",version:s,connectionKeyMatched:!1,connectionKeyRequired:!0}}:{status:200,body:{ok:!0,runtimeBridge:"healthy",version:s,connectionKeyMatched:!0,connectionKeyRequired:!1}}}function ae(r,t){const s=t.trim()||"http://localhost:8080",n=/^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?(?:\/|$)/i.test(s);return{ok:!1,error:r.message||"scheduler ping failed",failureStage:"scheduler_ping",runtimeBridge:"healthy",schedulerBaseUrl:s,hint:n?"aws-runtime-bridge \u5DF2\u8FDE\u901A\uFF0C\u4F46\u5B83\u56DE\u8FDE\u8C03\u5EA6\u4E2D\u5FC3\u5931\u8D25\u3002\u8BF7\u5728 bridge \u542F\u52A8\u73AF\u5883\u4E2D\u5C06 AWS_RUNTIME_SCHEDULER_BASE_URL \u914D\u7F6E\u4E3A\u8BE5\u5B9E\u4F8B\u53EF\u8BBF\u95EE\u7684\u8C03\u5EA6\u4E2D\u5FC3\u5730\u5740\uFF0C\u4F8B\u5982 http://<server-host>:7380\u3002":"aws-runtime-bridge \u5DF2\u8FDE\u901A\uFF0C\u4F46\u5B83\u56DE\u8FDE\u8C03\u5EA6\u4E2D\u5FC3\u5931\u8D25\u3002\u8BF7\u786E\u8BA4 AWS_RUNTIME_SCHEDULER_BASE_URL \u6307\u5411\u7684\u8C03\u5EA6\u4E2D\u5FC3\u5730\u5740\u53EF\u4ECE bridge \u673A\u5668\u8BBF\u95EE\uFF0C\u5E76\u4E14\u8FD0\u884C\u65F6\u8BBF\u95EE\u4EE4\u724C\u4ECD\u6709\u6548\u3002"}}function ie(r){if(typeof r!="object"||r===null)return;const t=Reflect.get(r,"response");if(typeof t!="object"||t===null)return;const e=Reflect.get(t,"status");return typeof e=="number"?e:void 0}async function le(r,t){try{const e=await I.get(`${r}/api/runtime/ping`,{headers:{"X-Runtime-Token":t}});return{schedulerReachable:e.status>=200&&e.status<300,tokenRefreshed:!1}}catch(e){if(ie(e)!==401)throw e;const s=await z(r);if(!s.success||!s.runtimeAccessToken)throw e;const n=await I.get(`${r}/api/runtime/ping`,{headers:{"X-Runtime-Token":s.runtimeAccessToken}});return{schedulerReachable:n.status>=200&&n.status<300,tokenRefreshed:!0}}}function ce(r){return{ok:!1,error:"ambiguous_scheduler_base_url",failureStage:"scheduler_ping",runtimeBridge:"healthy",schedulerBaseUrl:"",autoRegisterTargetUrls:r,hint:"Multiple autoRegisterTargets.serverUrl values were found, so bridge cannot safely infer which scheduler /runtime/ping should call back. Set AWS_RUNTIME_SCHEDULER_BASE_URL explicitly, or use future schedulerId/token-bound multi-scheduler routing."}}function ue(r){return Array.from(new Set([...r,...Z].map(t=>String(t||"").trim().toLowerCase()).filter(Boolean)))}function de(r,t){const e=r.filter(s=>t[s]?.installed);return e.length===0?"":e.map(s=>{const n=t[s],a=n?.error||n?.executable||"command is still available";return`${s}: ${a}`}).join("; ")}function T(r){return Object.fromEntries(Object.entries(r||{}).map(([t,e])=>[t,{installed:!!e?.installed,version:e?.version||null,executable:e?.executable||null,error:e?.error||null}]))}let k=null;const ge=3e5;async function fe(){return(await I.get("https://registry.npmjs.org/aws-runtime-bridge/latest",{timeout:1e4,responseType:"json"})).data?.version||"unknown"}d.get("/check-update",async(r,t)=>{try{let e;k&&Date.now()-k.ts<ge?e=k.latestVersion:(e=await fe(),k={latestVersion:e,ts:Date.now()});const s=b(),n=e!=="unknown"&&s!=="unknown"&&e!==s;t.json({ok:!0,hasUpdate:n,currentVersion:s,latestVersion:e})}catch(e){const s=e;l.warn("[check-update] Failed to query npm registry:",s.message),t.json({ok:!1,hasUpdate:!1,currentVersion:b(),latestVersion:null,error:s.message||"failed to check for updates"})}}),d.get("/healthz",(r,t)=>{t.json({ok:!0,runtimeBridge:"healthy"})}),d.get("/connection-check",(r,t)=>{const e=String(r.header("X-Bridge-Connection-Key-MD5")||""),s=oe(e);t.status(s.status).json(s.body)}),d.get("/ping",S,async(r,t)=>{const e=M(r.header("X-Scheduler-Base-Url"),r.header("X-Bridge-Instance-Id"),r.header("X-Bridge-Instance-Name"));if(e.source==="ambiguous-auto-register-targets"){t.status(400).json(ce(e.ambiguousTargetUrls));return}const s=e.url;try{const n=G(s);if(!n){t.status(401).json({ok:!1,error:"runtime_access_token_required"});return}const a=await le(s,n);t.json({ok:!0,runtimeBridge:"healthy",version:b(),schedulerReachable:a.schedulerReachable,tokenRefreshed:a.tokenRefreshed,schedulerBaseUrl:s,instanceId:e.instanceId,instanceName:e.instanceName})}catch(n){const a=n;t.status(502).json(ae(a,s))}}),d.post("/init-instance",S,async(r,t)=>{const{agentId:e,workspacePath:s,skillEnabled:n,mcpEnabled:a,ccSwitchEnabledTools:i,skillPackage:o,skillPackages:c,mcpServers:m}=r.body||{};if(!e||!s){t.status(400).json({error:"agentId and workspacePath are required"});return}try{l.info("[init-instance] Request received",{agentId:String(e),workspacePath:String(s),skillEnabled:n,mcpEnabled:a,ccSwitchEnabledTools:i});const u=await X(e,s,{skillEnabled:n,mcpEnabled:a,ccSwitchEnabledTools:i,skillPackage:o,skillPackages:c,mcpServers:m});l.info("[init-instance] Initialization completed",{agentId:String(e),ok:u.ok,logCount:u.logs?.length||0,enabledTools:u.enabledTools}),t.json(u)}catch(u){const g=u;l.error("[init-instance] Initialization failed",{agentId:String(e),workspacePath:String(s),error:g?.message||String(u),stack:g?.stack||null}),t.status(400).json({error:g?.message||"initialize instance failed"})}}),d.post("/cc-switch/state",S,async(r,t)=>{const{agentId:e}=r.body||{};if(!e){t.status(400).json({error:"agentId is required"});return}try{l.info("[cc-switch/state] Request received",{agentId:String(e)});const s=await V(e),n=await H(s),i=(await W(e,s)).state,o=ue(i.enabledTools||[]);l.info("[cc-switch/state] Detecting SDK statuses",{agentId:String(e),detectionTargets:o});const c=await R(o);l.info("[cc-switch/state] SDK status detection completed",{agentId:String(e),toolStatus:T(c),importedMcpCount:n.mcpServers,importedSkillCount:n.skills}),t.json({ok:!0,agentId:String(e),imported:{mcpServers:n.mcpServers,skills:n.skills},state:{...i,toolStatus:c}})}catch(s){const n=s;l.error("[cc-switch/state] Failed to load state",{agentId:String(e),error:n?.message||String(s),stack:n?.stack||null}),t.status(400).json({error:n?.message||"load state failed"})}}),d.post("/cc-switch/install-tools",S,async(r,t)=>{const{agentId:e,tools:s}=r.body||{};if(!e){t.status(400).json({error:"agentId is required"});return}const n=Array.isArray(s)?s.map(o=>String(o||"").trim().toLowerCase()).filter(Boolean):[];l.info("[cc-switch/install-tools] Request received",{agentId:String(e),requestedTools:n});const a=new Set(v),i=n.filter(o=>a.has(o));if(l.info("[cc-switch/install-tools] Request normalized",{agentId:String(e),requestedTools:n,installableTools:i,supportedInstallableTools:v}),i.length===0){l.warn("[cc-switch/install-tools] No supported installable tools requested",{agentId:String(e),requestedTools:n}),t.status(400).json({error:`tools must include ${v.join(", ")}`});return}try{const o=await x(e),c=Array.from(new Set([...o.enabledTools||[],...i]));l.info("[cc-switch/install-tools] Starting installer",{agentId:String(e),installableTools:i,previousEnabledTools:o.enabledTools||[],nextEnabledTools:c});const m=await J(i);l.info("[cc-switch/install-tools] Installer completed",{agentId:String(e),toolStatus:T(m)});const u=await R(c);l.info("[cc-switch/install-tools] Refreshed enabled SDK statuses",{agentId:String(e),refreshedToolStatus:T(u)});const g={...u,...m},p=await L(e,{...o,enabledTools:c,toolStatus:g}),w=new Set(i),h=Object.entries(g).filter(([f])=>w.has(f)).filter(([,f])=>!f.installed).map(([f,B])=>({tool:f,error:B.error||null}));h.length>0&&l.warn("[cc-switch/install-tools] Some SDKs remain unavailable",{agentId:String(e),failedTools:h}),l.info("[cc-switch/install-tools] State saved",{agentId:String(e),enabledTools:p.enabledTools,toolStatus:T(g)}),t.json({ok:h.length===0,agentId:String(e),toolStatus:g,failedTools:h,state:p})}catch(o){const c=o;l.error("[cc-switch/install-tools] Install route failed",{agentId:String(e),requestedTools:n,installableTools:i,error:c?.message||String(o),stack:c?.stack||null}),t.status(400).json({error:c?.message||"install tools failed"})}}),d.post("/cc-switch/uninstall-tools",S,async(r,t)=>{const{agentId:e,tools:s}=r.body||{};if(!e){t.status(400).json({error:"agentId is required"});return}const n=Array.isArray(s)?s.map(o=>String(o||"").trim().toLowerCase()).filter(Boolean):[],a=new Set(A),i=n.filter(o=>a.has(o));if(i.length===0){t.status(400).json({error:`tools must include ${A.join(", ")}`});return}try{const o=await x(e),c=new Set(i),m=(o.enabledTools||[]).filter(B=>!c.has(String(B||"").trim().toLowerCase())),u=await Y(i),p={...await R([...m,...i]),...u},w=de(i,p),h=w?o.enabledTools||[]:m,f=await L(e,{...o,enabledTools:h,toolStatus:p});if(w){t.status(400).json({ok:!1,agentId:String(e),error:`uninstall incomplete: ${w}`,toolStatus:p,state:f});return}t.json({ok:!0,agentId:String(e),toolStatus:p,state:f})}catch(o){const c=o;t.status(400).json({error:c?.message||"uninstall tools failed"})}}),d.post("/prepare-restart",S,async(r,t)=>{const{preserveSessions:e=!0}=r.body||{};try{l.info(`[prepare-restart] \u6536\u5230\u51C6\u5907\u91CD\u542F\u901A\u77E5\uFF0CpreserveSessions=${e}`),await P(!!e),t.json({ok:!0,preserveSessions:e,message:e?"Bridge will preserve sessions for aws-mcp-server restart":"Bridge will clean up sessions on shutdown"})}catch(s){const n=s;l.error("[prepare-restart] Error:",n),t.status(500).json({error:n.message})}}),d.post("/update-bridge",j,async(r,t)=>{const e=ee(),s=["install","-g","aws-runtime-bridge@latest","--omit=optional"],n=K(r.body?.requestedByUserId);try{if(!n){t.status(400).json({error:"requestedByUserId is required"});return}const a=E({operationType:"update",requestedByUserId:n,schedulerBaseUrl:r.body?.schedulerBaseUrl,runtimeBridgeBaseUrl:O(r),status:"accepted",message:"Bridge \u66F4\u65B0\u8BF7\u6C42\u5DF2\u6536\u5230\uFF0C\u5C06\u5728\u540E\u53F0\u6267\u884C\u3002"});await y(a),re({command:e,args:s,operation:a}),t.json({ok:!0,operationId:a.operationId,message:"Bridge \u66F4\u65B0\u5DF2\u5728\u540E\u53F0\u5F00\u59CB\uFF0C\u5B8C\u6210\u540E\u4F1A\u901A\u8FC7\u6D88\u606F\u4E2D\u5FC3\u901A\u77E5\u7ED3\u679C\u3002"})}catch(a){const i=a;l.error("[update-bridge] Error:",i),t.status(500).json({error:i.message||"update bridge failed"})}}),d.post("/restart-bridge",j,async(r,t)=>{const{preserveSessions:e=!0}=r.body||{},s=K(r.body?.requestedByUserId);try{if(!s){t.status(400).json({error:"requestedByUserId is required"});return}l.info(`[restart-bridge] \u6536\u5230\u5B9E\u4F8B Bridge \u91CD\u542F\u8BF7\u6C42\uFF0CpreserveSessions=${e}`);const n=E({operationType:"restart",requestedByUserId:s,schedulerBaseUrl:r.body?.schedulerBaseUrl,runtimeBridgeBaseUrl:O(r),status:"accepted",message:"Bridge \u5DF2\u6536\u5230\u91CD\u542F\u8BF7\u6C42\uFF1B\u4E0B\u6B21\u542F\u52A8\u540E\u4F1A\u53D1\u9001\u786E\u8BA4\u901A\u77E5\u3002"});await y(n),await P(!!e),t.json({ok:!0,operationId:n.operationId,preserveSessions:!!e,message:"Bridge \u6B63\u5728\u4F18\u96C5\u9000\u51FA\uFF1B\u4E0B\u6B21\u542F\u52A8\u540E\u4F1A\u901A\u8FC7\u6D88\u606F\u4E2D\u5FC3\u901A\u77E5\u7ED3\u679C\u3002\u82E5\u672A\u7531\u5B88\u62A4\u8FDB\u7A0B\u7BA1\u7406\uFF0C\u8BF7\u624B\u52A8\u91CD\u65B0\u542F\u52A8\u3002"}),setTimeout(()=>{if(process.exitCode=42,U){U("PANEL_RESTART",!!e).catch(a=>{const i=a;l.error("[restart-bridge] graceful shutdown failed:",i),process.exit(1)});return}process.exit(42)},250)}catch(n){const a=n;l.error("[restart-bridge] Error:",a),t.status(500).json({error:a.message||"restart bridge failed"})}});export{ce as buildAmbiguousSchedulerBaseUrlResponse,oe as buildConnectionCheckResponse,ae as buildSchedulerPingFailureResponse,ue as buildToolStatusDetectionTargets,de as buildUninstallFailureMessage,d as instanceRouter,je as setGracefulShutdownFn,T as summarizeToolStatus};
|
|
3
|
+
|