aws-runtime-bridge 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -0
- package/dist/adapter/AdapterRegistry.d.ts +53 -0
- package/dist/adapter/AdapterRegistry.d.ts.map +1 -0
- package/dist/adapter/AdapterRegistry.js +100 -0
- package/dist/adapter/AdapterRegistry.test.d.ts +5 -0
- package/dist/adapter/AdapterRegistry.test.d.ts.map +1 -0
- package/dist/adapter/AdapterRegistry.test.js +109 -0
- package/dist/adapter/ClaudeSdkAdapter.d.ts +120 -0
- package/dist/adapter/ClaudeSdkAdapter.d.ts.map +1 -0
- package/dist/adapter/ClaudeSdkAdapter.js +1140 -0
- package/dist/adapter/ClaudeSdkAdapter.test.d.ts +2 -0
- package/dist/adapter/ClaudeSdkAdapter.test.d.ts.map +1 -0
- package/dist/adapter/ClaudeSdkAdapter.test.js +95 -0
- package/dist/adapter/CodexSdkAdapter.d.ts +48 -0
- package/dist/adapter/CodexSdkAdapter.d.ts.map +1 -0
- package/dist/adapter/CodexSdkAdapter.js +750 -0
- package/dist/adapter/CodexSdkAdapter.test.d.ts +2 -0
- package/dist/adapter/CodexSdkAdapter.test.d.ts.map +1 -0
- package/dist/adapter/CodexSdkAdapter.test.js +245 -0
- package/dist/adapter/OpencodeSdkAdapter.d.ts +45 -0
- package/dist/adapter/OpencodeSdkAdapter.d.ts.map +1 -0
- package/dist/adapter/OpencodeSdkAdapter.js +622 -0
- package/dist/adapter/OpencodeSdkAdapter.test.d.ts +2 -0
- package/dist/adapter/OpencodeSdkAdapter.test.d.ts.map +1 -0
- package/dist/adapter/OpencodeSdkAdapter.test.js +14 -0
- package/dist/adapter/SdkProviderSpi.d.ts +15 -0
- package/dist/adapter/SdkProviderSpi.d.ts.map +1 -0
- package/dist/adapter/SdkProviderSpi.js +46 -0
- package/dist/adapter/adapter.test.d.ts +5 -0
- package/dist/adapter/adapter.test.d.ts.map +1 -0
- package/dist/adapter/adapter.test.js +180 -0
- package/dist/adapter/index.d.ts +11 -0
- package/dist/adapter/index.d.ts.map +1 -0
- package/dist/adapter/index.js +10 -0
- package/dist/adapter/types.d.ts +278 -0
- package/dist/adapter/types.d.ts.map +1 -0
- package/dist/adapter/types.js +278 -0
- package/dist/adapter/types.test.d.ts +2 -0
- package/dist/adapter/types.test.d.ts.map +1 -0
- package/dist/adapter/types.test.js +59 -0
- package/dist/adapters/cc-switch/common.d.ts +52 -0
- package/dist/adapters/cc-switch/common.d.ts.map +1 -0
- package/dist/adapters/cc-switch/common.js +61 -0
- package/dist/adapters/cc-switch/index.d.ts +25 -0
- package/dist/adapters/cc-switch/index.d.ts.map +1 -0
- package/dist/adapters/cc-switch/index.js +51 -0
- package/dist/adapters/cc-switch/mcp-claude.d.ts +15 -0
- package/dist/adapters/cc-switch/mcp-claude.d.ts.map +1 -0
- package/dist/adapters/cc-switch/mcp-claude.js +88 -0
- package/dist/adapters/cc-switch/mcp-claudecode.d.ts +15 -0
- package/dist/adapters/cc-switch/mcp-claudecode.d.ts.map +1 -0
- package/dist/adapters/cc-switch/mcp-claudecode.js +77 -0
- package/dist/adapters/cc-switch/mcp-codex.d.ts +17 -0
- package/dist/adapters/cc-switch/mcp-codex.d.ts.map +1 -0
- package/dist/adapters/cc-switch/mcp-codex.js +248 -0
- package/dist/adapters/cc-switch/mcp-codex.test.d.ts +2 -0
- package/dist/adapters/cc-switch/mcp-codex.test.d.ts.map +1 -0
- package/dist/adapters/cc-switch/mcp-codex.test.js +125 -0
- package/dist/adapters/cc-switch/mcp-opencode.d.ts +23 -0
- package/dist/adapters/cc-switch/mcp-opencode.d.ts.map +1 -0
- package/dist/adapters/cc-switch/mcp-opencode.js +100 -0
- package/dist/adapters/cc-switch/mcp-placeholder.d.ts +14 -0
- package/dist/adapters/cc-switch/mcp-placeholder.d.ts.map +1 -0
- package/dist/adapters/cc-switch/mcp-placeholder.js +19 -0
- package/dist/adapters/cc-switch/skill-claude.d.ts +15 -0
- package/dist/adapters/cc-switch/skill-claude.d.ts.map +1 -0
- package/dist/adapters/cc-switch/skill-claude.js +91 -0
- package/dist/adapters/cc-switch/skill-claudecode.d.ts +15 -0
- package/dist/adapters/cc-switch/skill-claudecode.d.ts.map +1 -0
- package/dist/adapters/cc-switch/skill-claudecode.js +91 -0
- package/dist/adapters/cc-switch/skill-opencode.d.ts +15 -0
- package/dist/adapters/cc-switch/skill-opencode.d.ts.map +1 -0
- package/dist/adapters/cc-switch/skill-opencode.js +95 -0
- package/dist/adapters/cc-switch/skill-placeholder.d.ts +14 -0
- package/dist/adapters/cc-switch/skill-placeholder.d.ts.map +1 -0
- package/dist/adapters/cc-switch/skill-placeholder.js +19 -0
- package/dist/config.d.ts +76 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +109 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +503 -0
- package/dist/middleware/auth.d.ts +12 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +18 -0
- package/dist/routes/ai-sources.d.ts +2 -0
- package/dist/routes/ai-sources.d.ts.map +1 -0
- package/dist/routes/ai-sources.js +136 -0
- package/dist/routes/ai-sources.test.d.ts +2 -0
- package/dist/routes/ai-sources.test.d.ts.map +1 -0
- package/dist/routes/ai-sources.test.js +148 -0
- package/dist/routes/aws-mcp.d.ts +10 -0
- package/dist/routes/aws-mcp.d.ts.map +1 -0
- package/dist/routes/aws-mcp.js +74 -0
- package/dist/routes/aws-mcp.test.d.ts +2 -0
- package/dist/routes/aws-mcp.test.d.ts.map +1 -0
- package/dist/routes/aws-mcp.test.js +42 -0
- package/dist/routes/file-browser.d.ts +7 -0
- package/dist/routes/file-browser.d.ts.map +1 -0
- package/dist/routes/file-browser.js +227 -0
- package/dist/routes/file-browser.test.d.ts +5 -0
- package/dist/routes/file-browser.test.d.ts.map +1 -0
- package/dist/routes/file-browser.test.js +88 -0
- package/dist/routes/git.d.ts +7 -0
- package/dist/routes/git.d.ts.map +1 -0
- package/dist/routes/git.js +470 -0
- package/dist/routes/git.test.d.ts +5 -0
- package/dist/routes/git.test.d.ts.map +1 -0
- package/dist/routes/git.test.js +87 -0
- package/dist/routes/instance.d.ts +3 -0
- package/dist/routes/instance.d.ts.map +1 -0
- package/dist/routes/instance.js +170 -0
- package/dist/routes/instance.test.d.ts +5 -0
- package/dist/routes/instance.test.d.ts.map +1 -0
- package/dist/routes/instance.test.js +64 -0
- package/dist/routes/mcp.d.ts +2 -0
- package/dist/routes/mcp.d.ts.map +1 -0
- package/dist/routes/mcp.js +171 -0
- package/dist/routes/mcp.test.d.ts +5 -0
- package/dist/routes/mcp.test.d.ts.map +1 -0
- package/dist/routes/mcp.test.js +84 -0
- package/dist/routes/memory.d.ts +13 -0
- package/dist/routes/memory.d.ts.map +1 -0
- package/dist/routes/memory.js +429 -0
- package/dist/routes/processes.d.ts +7 -0
- package/dist/routes/processes.d.ts.map +1 -0
- package/dist/routes/processes.js +245 -0
- package/dist/routes/properties.d.ts +7 -0
- package/dist/routes/properties.d.ts.map +1 -0
- package/dist/routes/properties.js +72 -0
- package/dist/routes/properties.test.d.ts +5 -0
- package/dist/routes/properties.test.d.ts.map +1 -0
- package/dist/routes/properties.test.js +72 -0
- package/dist/routes/sessions.d.ts +7 -0
- package/dist/routes/sessions.d.ts.map +1 -0
- package/dist/routes/sessions.js +808 -0
- package/dist/routes/sessions.test.d.ts +5 -0
- package/dist/routes/sessions.test.d.ts.map +1 -0
- package/dist/routes/sessions.test.js +70 -0
- package/dist/routes/skills.d.ts +2 -0
- package/dist/routes/skills.d.ts.map +1 -0
- package/dist/routes/skills.js +162 -0
- package/dist/routes/skills.test.d.ts +5 -0
- package/dist/routes/skills.test.d.ts.map +1 -0
- package/dist/routes/skills.test.js +42 -0
- package/dist/routes/terminal.d.ts +18 -0
- package/dist/routes/terminal.d.ts.map +1 -0
- package/dist/routes/terminal.js +663 -0
- package/dist/routes/terminal.test.d.ts +2 -0
- package/dist/routes/terminal.test.d.ts.map +1 -0
- package/dist/routes/terminal.test.js +91 -0
- package/dist/routes/yml.d.ts +7 -0
- package/dist/routes/yml.d.ts.map +1 -0
- package/dist/routes/yml.js +223 -0
- package/dist/routes/yml.test.d.ts +5 -0
- package/dist/routes/yml.test.d.ts.map +1 -0
- package/dist/routes/yml.test.js +58 -0
- package/dist/services/agent-process-manager.d.ts +241 -0
- package/dist/services/agent-process-manager.d.ts.map +1 -0
- package/dist/services/agent-process-manager.js +762 -0
- package/dist/services/auto-register.d.ts +94 -0
- package/dist/services/auto-register.d.ts.map +1 -0
- package/dist/services/auto-register.js +510 -0
- package/dist/services/aws-client-agent-mcp.d.ts +26 -0
- package/dist/services/aws-client-agent-mcp.d.ts.map +1 -0
- package/dist/services/aws-client-agent-mcp.js +142 -0
- package/dist/services/aws-client-agent-mcp.test.d.ts +2 -0
- package/dist/services/aws-client-agent-mcp.test.d.ts.map +1 -0
- package/dist/services/aws-client-agent-mcp.test.js +89 -0
- package/dist/services/aws-mcp-http.d.ts +11 -0
- package/dist/services/aws-mcp-http.d.ts.map +1 -0
- package/dist/services/aws-mcp-http.js +225 -0
- package/dist/services/aws-mcp-http.test.d.ts +2 -0
- package/dist/services/aws-mcp-http.test.d.ts.map +1 -0
- package/dist/services/aws-mcp-http.test.js +27 -0
- package/dist/services/cc-switch-sdk.d.ts +18 -0
- package/dist/services/cc-switch-sdk.d.ts.map +1 -0
- package/dist/services/cc-switch-sdk.js +117 -0
- package/dist/services/easytier-manager.d.ts +106 -0
- package/dist/services/easytier-manager.d.ts.map +1 -0
- package/dist/services/easytier-manager.js +331 -0
- package/dist/services/easytier-manager.test.d.ts +5 -0
- package/dist/services/easytier-manager.test.d.ts.map +1 -0
- package/dist/services/easytier-manager.test.js +98 -0
- package/dist/services/instance-init-service.d.ts +35 -0
- package/dist/services/instance-init-service.d.ts.map +1 -0
- package/dist/services/instance-init-service.js +190 -0
- package/dist/services/instance-service.d.ts +88 -0
- package/dist/services/instance-service.d.ts.map +1 -0
- package/dist/services/instance-service.js +236 -0
- package/dist/services/instance-state.d.ts +36 -0
- package/dist/services/instance-state.d.ts.map +1 -0
- package/dist/services/instance-state.js +79 -0
- package/dist/services/instance-state.test.d.ts +2 -0
- package/dist/services/instance-state.test.d.ts.map +1 -0
- package/dist/services/instance-state.test.js +213 -0
- package/dist/services/memory-service.d.ts +195 -0
- package/dist/services/memory-service.d.ts.map +1 -0
- package/dist/services/memory-service.js +650 -0
- package/dist/services/orphan-monitor.d.ts +94 -0
- package/dist/services/orphan-monitor.d.ts.map +1 -0
- package/dist/services/orphan-monitor.js +321 -0
- package/dist/services/process-detector.d.ts +175 -0
- package/dist/services/process-detector.d.ts.map +1 -0
- package/dist/services/process-detector.js +992 -0
- package/dist/services/process-registry.d.ts +208 -0
- package/dist/services/process-registry.d.ts.map +1 -0
- package/dist/services/process-registry.js +354 -0
- package/dist/services/session-lookup.d.ts +20 -0
- package/dist/services/session-lookup.d.ts.map +1 -0
- package/dist/services/session-lookup.js +43 -0
- package/dist/services/session-output.d.ts +56 -0
- package/dist/services/session-output.d.ts.map +1 -0
- package/dist/services/session-output.js +122 -0
- package/dist/services/session-output.test.d.ts +5 -0
- package/dist/services/session-output.test.d.ts.map +1 -0
- package/dist/services/session-output.test.js +68 -0
- package/dist/services/terminal-persistence.d.ts +51 -0
- package/dist/services/terminal-persistence.d.ts.map +1 -0
- package/dist/services/terminal-persistence.js +125 -0
- package/dist/services/terminal-persistence.test.d.ts +5 -0
- package/dist/services/terminal-persistence.test.d.ts.map +1 -0
- package/dist/services/terminal-persistence.test.js +88 -0
- package/dist/services/tool-installer.d.ts +15 -0
- package/dist/services/tool-installer.d.ts.map +1 -0
- package/dist/services/tool-installer.js +297 -0
- package/dist/services/tool-installer.test.d.ts +2 -0
- package/dist/services/tool-installer.test.d.ts.map +1 -0
- package/dist/services/tool-installer.test.js +102 -0
- package/dist/services/user-api-key-service.d.ts +28 -0
- package/dist/services/user-api-key-service.d.ts.map +1 -0
- package/dist/services/user-api-key-service.js +75 -0
- package/dist/services/workspace-files.d.ts +85 -0
- package/dist/services/workspace-files.d.ts.map +1 -0
- package/dist/services/workspace-files.js +224 -0
- package/dist/services/workspace-files.test.d.ts +2 -0
- package/dist/services/workspace-files.test.d.ts.map +1 -0
- package/dist/services/workspace-files.test.js +117 -0
- package/dist/types.d.ts +233 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -0
- package/dist/utils/file-utils.d.ts +13 -0
- package/dist/utils/file-utils.d.ts.map +1 -0
- package/dist/utils/file-utils.js +140 -0
- package/dist/utils/file-utils.test.d.ts +2 -0
- package/dist/utils/file-utils.test.d.ts.map +1 -0
- package/dist/utils/file-utils.test.js +201 -0
- package/dist/utils/logger.d.ts +39 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +110 -0
- package/dist/utils/logger.test.d.ts +2 -0
- package/dist/utils/logger.test.d.ts.map +1 -0
- package/dist/utils/logger.test.js +93 -0
- package/dist/utils/mcp-utils.d.ts +73 -0
- package/dist/utils/mcp-utils.d.ts.map +1 -0
- package/dist/utils/mcp-utils.js +165 -0
- package/dist/utils/path-utils.d.ts +24 -0
- package/dist/utils/path-utils.d.ts.map +1 -0
- package/dist/utils/path-utils.js +44 -0
- package/dist/utils/validation.d.ts +23 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +53 -0
- package/dist/utils/validation.test.d.ts +2 -0
- package/dist/utils/validation.test.d.ts.map +1 -0
- package/dist/utils/validation.test.js +88 -0
- package/dist/utils/yaml-utils.d.ts +73 -0
- package/dist/utils/yaml-utils.d.ts.map +1 -0
- package/dist/utils/yaml-utils.js +309 -0
- package/dist/utils/yaml-utils.test.d.ts +2 -0
- package/dist/utils/yaml-utils.test.d.ts.map +1 -0
- package/dist/utils/yaml-utils.test.js +363 -0
- package/package/aws-client-agent-mcp/README.md +288 -0
- package/package/aws-client-agent-mcp/dist/activity-reporter.d.ts +150 -0
- package/package/aws-client-agent-mcp/dist/activity-reporter.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/activity-reporter.js +353 -0
- package/package/aws-client-agent-mcp/dist/activity-reporter.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/activity-reporter.test.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/activity-reporter.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/activity-reporter.test.js +75 -0
- package/package/aws-client-agent-mcp/dist/activity-reporter.test.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/activity-types.d.ts +96 -0
- package/package/aws-client-agent-mcp/dist/activity-types.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/activity-types.js +141 -0
- package/package/aws-client-agent-mcp/dist/activity-types.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts +165 -0
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/agent-client.js +588 -0
- package/package/aws-client-agent-mcp/dist/agent-client.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/agent-client.test.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/agent-client.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/agent-client.test.js +534 -0
- package/package/aws-client-agent-mcp/dist/agent-client.test.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/config.d.ts +21 -0
- package/package/aws-client-agent-mcp/dist/config.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/config.js +67 -0
- package/package/aws-client-agent-mcp/dist/config.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/config.test.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/config.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/config.test.js +139 -0
- package/package/aws-client-agent-mcp/dist/config.test.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/constants.d.ts +15 -0
- package/package/aws-client-agent-mcp/dist/constants.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/constants.js +19 -0
- package/package/aws-client-agent-mcp/dist/constants.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/http-client.d.ts +27 -0
- package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/http-client.js +65 -0
- package/package/aws-client-agent-mcp/dist/http-client.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/http-client.test.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/http-client.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/http-client.test.js +228 -0
- package/package/aws-client-agent-mcp/dist/http-client.test.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/index.d.ts +14 -0
- package/package/aws-client-agent-mcp/dist/index.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/index.js +30 -0
- package/package/aws-client-agent-mcp/dist/index.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/logger.d.ts +7 -0
- package/package/aws-client-agent-mcp/dist/logger.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/logger.js +19 -0
- package/package/aws-client-agent-mcp/dist/logger.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +77 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.js +427 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.test.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js +624 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +78 -0
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/mcp-tools.js +420 -0
- package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts +61 -0
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/memory-store.js +268 -0
- package/package/aws-client-agent-mcp/dist/memory-store.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/memory-store.test.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/memory-store.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/memory-store.test.js +164 -0
- package/package/aws-client-agent-mcp/dist/memory-store.test.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +74 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.js +159 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.test.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.test.js +44 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.test.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/messageContent.d.ts +53 -0
- package/package/aws-client-agent-mcp/dist/messageContent.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/messageContent.js +125 -0
- package/package/aws-client-agent-mcp/dist/messageContent.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/orchestration-tools.d.ts +19 -0
- package/package/aws-client-agent-mcp/dist/orchestration-tools.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/orchestration-tools.js +317 -0
- package/package/aws-client-agent-mcp/dist/orchestration-tools.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.d.ts +66 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.js +220 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.test.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.test.js +45 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.test.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/types.d.ts +286 -0
- package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/types.js +9 -0
- package/package/aws-client-agent-mcp/dist/types.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/user-config-reader.d.ts +63 -0
- package/package/aws-client-agent-mcp/dist/user-config-reader.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/user-config-reader.js +161 -0
- package/package/aws-client-agent-mcp/dist/user-config-reader.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +94 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.js +316 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.test.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.test.js +191 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.test.js.map +1 -0
- package/package/aws-client-agent-mcp/package.json +51 -0
- package/package/cc-switch-sdk/README.md +541 -0
- package/package/cc-switch-sdk/dist/adapters/common.d.ts +38 -0
- package/package/cc-switch-sdk/dist/adapters/common.d.ts.map +1 -0
- package/package/cc-switch-sdk/dist/adapters/common.js +47 -0
- package/package/cc-switch-sdk/dist/adapters/index.d.ts +5 -0
- package/package/cc-switch-sdk/dist/adapters/index.d.ts.map +1 -0
- package/package/cc-switch-sdk/dist/adapters/index.js +28 -0
- package/package/cc-switch-sdk/dist/adapters/mcp-claude.d.ts +10 -0
- package/package/cc-switch-sdk/dist/adapters/mcp-claude.d.ts.map +1 -0
- package/package/cc-switch-sdk/dist/adapters/mcp-claude.js +39 -0
- package/package/cc-switch-sdk/dist/adapters/mcp-claudecode.d.ts +10 -0
- package/package/cc-switch-sdk/dist/adapters/mcp-claudecode.d.ts.map +1 -0
- package/package/cc-switch-sdk/dist/adapters/mcp-claudecode.js +40 -0
- package/package/cc-switch-sdk/dist/adapters/mcp-opencode.d.ts +18 -0
- package/package/cc-switch-sdk/dist/adapters/mcp-opencode.d.ts.map +1 -0
- package/package/cc-switch-sdk/dist/adapters/mcp-opencode.js +63 -0
- package/package/cc-switch-sdk/dist/adapters/mcp-opencode.test.d.ts +2 -0
- package/package/cc-switch-sdk/dist/adapters/mcp-opencode.test.d.ts.map +1 -0
- package/package/cc-switch-sdk/dist/adapters/mcp-opencode.test.js +86 -0
- package/package/cc-switch-sdk/dist/adapters/mcp-placeholder.d.ts +9 -0
- package/package/cc-switch-sdk/dist/adapters/mcp-placeholder.d.ts.map +1 -0
- package/package/cc-switch-sdk/dist/adapters/mcp-placeholder.js +14 -0
- package/package/cc-switch-sdk/dist/adapters/skill-claude.d.ts +10 -0
- package/package/cc-switch-sdk/dist/adapters/skill-claude.d.ts.map +1 -0
- package/package/cc-switch-sdk/dist/adapters/skill-claude.js +51 -0
- package/package/cc-switch-sdk/dist/adapters/skill-claudecode.d.ts +10 -0
- package/package/cc-switch-sdk/dist/adapters/skill-claudecode.d.ts.map +1 -0
- package/package/cc-switch-sdk/dist/adapters/skill-claudecode.js +51 -0
- package/package/cc-switch-sdk/dist/adapters/skill-opencode.d.ts +10 -0
- package/package/cc-switch-sdk/dist/adapters/skill-opencode.d.ts.map +1 -0
- package/package/cc-switch-sdk/dist/adapters/skill-opencode.js +51 -0
- package/package/cc-switch-sdk/dist/adapters/skill-placeholder.d.ts +9 -0
- package/package/cc-switch-sdk/dist/adapters/skill-placeholder.d.ts.map +1 -0
- package/package/cc-switch-sdk/dist/adapters/skill-placeholder.js +14 -0
- package/package/cc-switch-sdk/dist/constants.d.ts +9 -0
- package/package/cc-switch-sdk/dist/constants.d.ts.map +1 -0
- package/package/cc-switch-sdk/dist/constants.js +54 -0
- package/package/cc-switch-sdk/dist/errors.d.ts +6 -0
- package/package/cc-switch-sdk/dist/errors.d.ts.map +1 -0
- package/package/cc-switch-sdk/dist/errors.js +8 -0
- package/package/cc-switch-sdk/dist/index.d.ts +11 -0
- package/package/cc-switch-sdk/dist/index.d.ts.map +1 -0
- package/package/cc-switch-sdk/dist/index.js +9 -0
- package/package/cc-switch-sdk/dist/schemas.d.ts +8 -0
- package/package/cc-switch-sdk/dist/schemas.d.ts.map +1 -0
- package/package/cc-switch-sdk/dist/schemas.js +37 -0
- package/package/cc-switch-sdk/dist/sdk.d.ts +91 -0
- package/package/cc-switch-sdk/dist/sdk.d.ts.map +1 -0
- package/package/cc-switch-sdk/dist/sdk.js +427 -0
- package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts +75 -0
- package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts.map +1 -0
- package/package/cc-switch-sdk/dist/services/ai-config-service.js +280 -0
- package/package/cc-switch-sdk/dist/services/instance-service.d.ts +78 -0
- package/package/cc-switch-sdk/dist/services/instance-service.d.ts.map +1 -0
- package/package/cc-switch-sdk/dist/services/instance-service.js +180 -0
- package/package/cc-switch-sdk/dist/services/mcp-model.d.ts +17 -0
- package/package/cc-switch-sdk/dist/services/mcp-model.d.ts.map +1 -0
- package/package/cc-switch-sdk/dist/services/mcp-model.js +34 -0
- package/package/cc-switch-sdk/dist/services/mcp-service.d.ts +18 -0
- package/package/cc-switch-sdk/dist/services/mcp-service.d.ts.map +1 -0
- package/package/cc-switch-sdk/dist/services/mcp-service.js +9 -0
- package/package/cc-switch-sdk/dist/services/skill-model.d.ts +17 -0
- package/package/cc-switch-sdk/dist/services/skill-model.d.ts.map +1 -0
- package/package/cc-switch-sdk/dist/services/skill-model.js +38 -0
- package/package/cc-switch-sdk/dist/services/skill-service.d.ts +17 -0
- package/package/cc-switch-sdk/dist/services/skill-service.d.ts.map +1 -0
- package/package/cc-switch-sdk/dist/services/skill-service.js +9 -0
- package/package/cc-switch-sdk/dist/state.d.ts +4 -0
- package/package/cc-switch-sdk/dist/state.d.ts.map +1 -0
- package/package/cc-switch-sdk/dist/state.js +19 -0
- package/package/cc-switch-sdk/dist/types.d.ts +75 -0
- package/package/cc-switch-sdk/dist/types.d.ts.map +1 -0
- package/package/cc-switch-sdk/dist/types.js +1 -0
- package/package/cc-switch-sdk/dist/utils/fs.d.ts +10 -0
- package/package/cc-switch-sdk/dist/utils/fs.d.ts.map +1 -0
- package/package/cc-switch-sdk/dist/utils/fs.js +91 -0
- package/package/cc-switch-sdk/dist/utils/id.d.ts +4 -0
- package/package/cc-switch-sdk/dist/utils/id.d.ts.map +1 -0
- package/package/cc-switch-sdk/dist/utils/id.js +12 -0
- package/package/cc-switch-sdk/package.json +31 -0
- package/package.json +73 -0
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { access } from "node:fs/promises";
|
|
4
|
+
import { execFile } from "node:child_process";
|
|
5
|
+
import { promisify } from "node:util";
|
|
6
|
+
const execFileAsync = promisify(execFile);
|
|
7
|
+
const isWindows = process.platform === "win32";
|
|
8
|
+
const TOOL_DEFINITIONS = {
|
|
9
|
+
claude: {
|
|
10
|
+
key: "claude",
|
|
11
|
+
aliases: isWindows ? ["claude.cmd", "claude.exe", "claude"] : ["claude"],
|
|
12
|
+
versionArgs: ["--version"],
|
|
13
|
+
installCommands: isWindows
|
|
14
|
+
? ["npm install -g @anthropic-ai/claude-code@latest"]
|
|
15
|
+
: [
|
|
16
|
+
"curl -fsSL https://claude.ai/install.sh | bash",
|
|
17
|
+
"npm install -g @anthropic-ai/claude-code@latest",
|
|
18
|
+
],
|
|
19
|
+
},
|
|
20
|
+
claudecode: {
|
|
21
|
+
key: "claudecode",
|
|
22
|
+
aliases: isWindows ? ["claude.cmd", "claude.exe", "claude"] : ["claude"],
|
|
23
|
+
versionArgs: ["--version"],
|
|
24
|
+
installCommands: isWindows
|
|
25
|
+
? ["npm install -g @anthropic-ai/claude-code@latest"]
|
|
26
|
+
: [
|
|
27
|
+
"curl -fsSL https://claude.ai/install.sh | bash",
|
|
28
|
+
"npm install -g @anthropic-ai/claude-code@latest",
|
|
29
|
+
],
|
|
30
|
+
},
|
|
31
|
+
opencode: {
|
|
32
|
+
key: "opencode",
|
|
33
|
+
aliases: isWindows
|
|
34
|
+
? ["opencode.cmd", "opencode.exe", "opencode"]
|
|
35
|
+
: ["opencode"],
|
|
36
|
+
versionArgs: ["--version"],
|
|
37
|
+
installCommands: isWindows
|
|
38
|
+
? ["npm install -g opencode-ai@latest"]
|
|
39
|
+
: [
|
|
40
|
+
"curl -fsSL https://opencode.ai/install | bash",
|
|
41
|
+
"npm install -g opencode-ai@latest",
|
|
42
|
+
],
|
|
43
|
+
extraSearchPaths: () => {
|
|
44
|
+
const home = os.homedir();
|
|
45
|
+
return [
|
|
46
|
+
process.env.OPENCODE_INSTALL_DIR || "",
|
|
47
|
+
process.env.XDG_BIN_DIR || "",
|
|
48
|
+
path.join(home, "bin"),
|
|
49
|
+
path.join(home, ".opencode", "bin"),
|
|
50
|
+
path.join(home, "go", "bin"),
|
|
51
|
+
].filter(Boolean);
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
codex: {
|
|
55
|
+
key: "codex",
|
|
56
|
+
aliases: isWindows ? ["codex.cmd", "codex.exe", "codex"] : ["codex"],
|
|
57
|
+
versionArgs: ["--version"],
|
|
58
|
+
installCommands: ["npm install -g @openai/codex@latest"],
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
export const SUPPORTED_INSTALLABLE_TOOLS = Object.freeze(Object.keys(TOOL_DEFINITIONS));
|
|
62
|
+
function parseVersion(output) {
|
|
63
|
+
const normalized = String(output || "").trim();
|
|
64
|
+
if (!normalized) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
const match = normalized.match(/(\d+\.\d+\.\d+(?:[-+][\w.-]+)?)/);
|
|
68
|
+
return match?.[1] || normalized.split(/\s+/)[0] || null;
|
|
69
|
+
}
|
|
70
|
+
function splitPathEntries(rawPath) {
|
|
71
|
+
return String(rawPath || "")
|
|
72
|
+
.split(path.delimiter)
|
|
73
|
+
.map((item) => item.trim())
|
|
74
|
+
.filter(Boolean);
|
|
75
|
+
}
|
|
76
|
+
function uniquePaths(paths) {
|
|
77
|
+
return [...new Set(paths.filter(Boolean))];
|
|
78
|
+
}
|
|
79
|
+
function describeExecError(error) {
|
|
80
|
+
if (!error || typeof error !== "object") {
|
|
81
|
+
return "unknown detection error";
|
|
82
|
+
}
|
|
83
|
+
const code = "code" in error ? String(error.code || "").trim() : "";
|
|
84
|
+
const errno = "errno" in error ? String(error.errno || "").trim() : "";
|
|
85
|
+
const message = "message" in error ? String(error.message || "").trim() : "";
|
|
86
|
+
if (code === "ENOENT") {
|
|
87
|
+
return "command not found in PATH";
|
|
88
|
+
}
|
|
89
|
+
if (code === "EACCES" || code === "EPERM") {
|
|
90
|
+
return "command found but not executable";
|
|
91
|
+
}
|
|
92
|
+
if (code === "ETIMEDOUT") {
|
|
93
|
+
return "version command timed out";
|
|
94
|
+
}
|
|
95
|
+
if (code === "UNKNOWN" && /not recognized|not found/i.test(message)) {
|
|
96
|
+
return "command not found in PATH";
|
|
97
|
+
}
|
|
98
|
+
if (errno === "-4058") {
|
|
99
|
+
return "command not found in PATH";
|
|
100
|
+
}
|
|
101
|
+
if (errno === "-4048" || errno === "-13") {
|
|
102
|
+
return "command found but not executable";
|
|
103
|
+
}
|
|
104
|
+
return message || "command execution failed";
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* 在 Windows 上执行命令(处理 .cmd/.bat 文件)
|
|
108
|
+
* 在 Unix 系统上直接执行
|
|
109
|
+
*/
|
|
110
|
+
async function executeVersionCommand(command, args) {
|
|
111
|
+
if (isWindows) {
|
|
112
|
+
// Windows 上需要通过 cmd.exe 执行命令(尤其是 .cmd/.bat 文件)
|
|
113
|
+
const result = await execFileAsync("cmd.exe", ["/d", "/s", "/c", `${command} ${args.join(" ")}`], { timeout: 20_000 });
|
|
114
|
+
return { stdout: result.stdout || "", stderr: result.stderr || "" };
|
|
115
|
+
}
|
|
116
|
+
const result = await execFileAsync(command, args, { timeout: 20_000 });
|
|
117
|
+
return { stdout: result.stdout || "", stderr: result.stderr || "" };
|
|
118
|
+
}
|
|
119
|
+
async function resolveExecutableCandidate(definition) {
|
|
120
|
+
const searchPaths = uniquePaths([
|
|
121
|
+
...splitPathEntries(process.env.PATH),
|
|
122
|
+
...(definition.extraSearchPaths ? definition.extraSearchPaths() : []),
|
|
123
|
+
// Windows 上额外搜索 Volta 等常见路径
|
|
124
|
+
...(isWindows
|
|
125
|
+
? [
|
|
126
|
+
path.join(process.env.APPDATA || "", "npm"),
|
|
127
|
+
path.join(process.env.LOCALAPPDATA || "", "Volta", "bin"),
|
|
128
|
+
path.join(process.env.APPDATA || "", "Volta", "bin"),
|
|
129
|
+
"C:\\Program Files\\nodejs",
|
|
130
|
+
]
|
|
131
|
+
: [
|
|
132
|
+
path.join(os.homedir(), ".local", "bin"),
|
|
133
|
+
"/usr/local/bin",
|
|
134
|
+
"/usr/bin",
|
|
135
|
+
]),
|
|
136
|
+
]);
|
|
137
|
+
let foundCommandPath = null;
|
|
138
|
+
let executionFailureMessage = null;
|
|
139
|
+
for (const alias of definition.aliases) {
|
|
140
|
+
try {
|
|
141
|
+
const { stdout, stderr } = await executeVersionCommand(alias, definition.versionArgs);
|
|
142
|
+
const version = parseVersion(`${stdout || ""}\n${stderr || ""}`);
|
|
143
|
+
if (!version) {
|
|
144
|
+
return {
|
|
145
|
+
executable: alias,
|
|
146
|
+
version: null,
|
|
147
|
+
error: "command executable but version output unavailable",
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
return { executable: alias, version, error: null };
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
executionFailureMessage = describeExecError(error);
|
|
154
|
+
if (executionFailureMessage !== "command not found in PATH") {
|
|
155
|
+
return {
|
|
156
|
+
executable: alias,
|
|
157
|
+
version: null,
|
|
158
|
+
error: executionFailureMessage,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
for (const dir of searchPaths) {
|
|
163
|
+
const absolutePath = path.join(dir, alias);
|
|
164
|
+
try {
|
|
165
|
+
await access(absolutePath);
|
|
166
|
+
foundCommandPath = absolutePath;
|
|
167
|
+
const { stdout, stderr } = await executeVersionCommand(absolutePath, definition.versionArgs);
|
|
168
|
+
const version = parseVersion(`${stdout || ""}\n${stderr || ""}`);
|
|
169
|
+
if (!version) {
|
|
170
|
+
return {
|
|
171
|
+
executable: absolutePath,
|
|
172
|
+
version: null,
|
|
173
|
+
error: "command executable but version output unavailable",
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
return { executable: absolutePath, version, error: null };
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
executionFailureMessage = describeExecError(error);
|
|
180
|
+
if (foundCommandPath) {
|
|
181
|
+
return {
|
|
182
|
+
executable: foundCommandPath,
|
|
183
|
+
version: null,
|
|
184
|
+
error: executionFailureMessage,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (foundCommandPath) {
|
|
191
|
+
return {
|
|
192
|
+
executable: foundCommandPath,
|
|
193
|
+
version: null,
|
|
194
|
+
error: executionFailureMessage || "command found but failed to execute",
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
return { executable: null, version: null, error: "command not installed" };
|
|
198
|
+
}
|
|
199
|
+
async function runInstallCommand(command) {
|
|
200
|
+
if (isWindows) {
|
|
201
|
+
await execFileAsync("cmd.exe", ["/d", "/s", "/c", command], {
|
|
202
|
+
timeout: 10 * 60 * 1000,
|
|
203
|
+
});
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
await execFileAsync("/bin/sh", ["-lc", command], { timeout: 10 * 60 * 1000 });
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* 检查单个工具的 CLI 可执行状态,供实例状态展示与初始化前判断使用。
|
|
210
|
+
*/
|
|
211
|
+
export async function detectToolInstallStatus(tool) {
|
|
212
|
+
const normalizedTool = String(tool || "")
|
|
213
|
+
.trim()
|
|
214
|
+
.toLowerCase();
|
|
215
|
+
const definition = TOOL_DEFINITIONS[normalizedTool];
|
|
216
|
+
if (!definition) {
|
|
217
|
+
return {
|
|
218
|
+
tool: normalizedTool,
|
|
219
|
+
installed: false,
|
|
220
|
+
executable: null,
|
|
221
|
+
version: null,
|
|
222
|
+
installing: false,
|
|
223
|
+
error: "unsupported tool",
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
const result = await resolveExecutableCandidate(definition);
|
|
227
|
+
return {
|
|
228
|
+
tool: normalizedTool,
|
|
229
|
+
installed: Boolean(result.executable),
|
|
230
|
+
executable: result.executable,
|
|
231
|
+
version: result.version,
|
|
232
|
+
installing: false,
|
|
233
|
+
error: result.error,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* 批量检查工具安装状态,统一返回给前端面板和实例状态持久化。
|
|
238
|
+
*/
|
|
239
|
+
export async function detectToolStatuses(tools) {
|
|
240
|
+
const normalizedTools = [
|
|
241
|
+
...new Set((Array.isArray(tools) ? tools : [])
|
|
242
|
+
.map((item) => String(item || "")
|
|
243
|
+
.trim()
|
|
244
|
+
.toLowerCase())
|
|
245
|
+
.filter(Boolean)),
|
|
246
|
+
];
|
|
247
|
+
const entries = await Promise.all(normalizedTools.map(async (tool) => [tool, await detectToolInstallStatus(tool)]));
|
|
248
|
+
return Object.fromEntries(entries);
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* 根据勾选工具自动安装缺失 CLI,安装后重新检测状态并返回。
|
|
252
|
+
*/
|
|
253
|
+
export async function ensureToolsInstalled(tools) {
|
|
254
|
+
const initialStatuses = await detectToolStatuses(tools);
|
|
255
|
+
const nextStatuses = {
|
|
256
|
+
...initialStatuses,
|
|
257
|
+
};
|
|
258
|
+
for (const tool of Object.keys(initialStatuses)) {
|
|
259
|
+
const current = initialStatuses[tool];
|
|
260
|
+
if (current.installed) {
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
const definition = TOOL_DEFINITIONS[tool];
|
|
264
|
+
if (!definition) {
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
let lastError = current.error;
|
|
268
|
+
for (const command of definition.installCommands) {
|
|
269
|
+
try {
|
|
270
|
+
await runInstallCommand(command);
|
|
271
|
+
const detected = await detectToolInstallStatus(tool);
|
|
272
|
+
nextStatuses[tool] = detected;
|
|
273
|
+
if (detected.installed) {
|
|
274
|
+
lastError = null;
|
|
275
|
+
break;
|
|
276
|
+
}
|
|
277
|
+
lastError = detected.error;
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
lastError =
|
|
281
|
+
error instanceof Error
|
|
282
|
+
? error.message
|
|
283
|
+
: String(error || "install failed");
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
if (!nextStatuses[tool]?.installed) {
|
|
287
|
+
nextStatuses[tool] = {
|
|
288
|
+
...nextStatuses[tool],
|
|
289
|
+
tool,
|
|
290
|
+
installed: false,
|
|
291
|
+
installing: false,
|
|
292
|
+
error: lastError || "install failed",
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return nextStatuses;
|
|
297
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-installer.test.d.ts","sourceRoot":"","sources":["../../src/services/tool-installer.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { detectToolStatuses, detectToolInstallStatus, SUPPORTED_INSTALLABLE_TOOLS } from './tool-installer.js';
|
|
3
|
+
describe('tool installer service', () => {
|
|
4
|
+
it('returns structured status for supported tools', async () => {
|
|
5
|
+
const statuses = await detectToolStatuses(['claude', 'opencode', 'codex']);
|
|
6
|
+
expect(typeof statuses.claude.installed).toBe('boolean');
|
|
7
|
+
expect(typeof statuses.opencode.installed).toBe('boolean');
|
|
8
|
+
expect(typeof statuses.codex.installed).toBe('boolean');
|
|
9
|
+
expect(statuses.claude.tool).toBe('claude');
|
|
10
|
+
expect(statuses.opencode.tool).toBe('opencode');
|
|
11
|
+
expect(statuses.codex.tool).toBe('codex');
|
|
12
|
+
});
|
|
13
|
+
it('deduplicates repeated tool names', async () => {
|
|
14
|
+
const statuses = await detectToolStatuses(['claude', 'claude', 'opencode']);
|
|
15
|
+
expect(Object.keys(statuses).sort()).toEqual(['claude', 'opencode']);
|
|
16
|
+
});
|
|
17
|
+
it('returns unsupported status for unknown tool', async () => {
|
|
18
|
+
const status = await detectToolInstallStatus('unknown-tool');
|
|
19
|
+
expect(status.installed).toBe(false);
|
|
20
|
+
expect(status.error).toBe('unsupported tool');
|
|
21
|
+
});
|
|
22
|
+
it('uses a precise message when a tool command is missing', async () => {
|
|
23
|
+
const status = await detectToolInstallStatus('claude');
|
|
24
|
+
// error can be null (when installed) or string (when not installed)
|
|
25
|
+
expect(status.error === null || typeof status.error === 'string').toBe(true);
|
|
26
|
+
if (!status.installed && status.error) {
|
|
27
|
+
expect(status.error).not.toBe('not installed or not executable');
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
it('treats discovered command path as installed even when version is unavailable', async () => {
|
|
31
|
+
const status = await detectToolInstallStatus('opencode');
|
|
32
|
+
if (status.executable) {
|
|
33
|
+
expect(status.installed).toBe(true);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
it('normalizes tool names to lowercase', async () => {
|
|
37
|
+
const statuses = await detectToolStatuses(['CLAUDE', 'OpenCode']);
|
|
38
|
+
expect(statuses.claude).toBeDefined();
|
|
39
|
+
expect(statuses.opencode).toBeDefined();
|
|
40
|
+
});
|
|
41
|
+
it('handles empty tool array', async () => {
|
|
42
|
+
const statuses = await detectToolStatuses([]);
|
|
43
|
+
expect(statuses).toEqual({});
|
|
44
|
+
});
|
|
45
|
+
it('handles null input for detectToolStatuses', async () => {
|
|
46
|
+
const statuses = await detectToolStatuses(null);
|
|
47
|
+
expect(statuses).toEqual({});
|
|
48
|
+
});
|
|
49
|
+
it('handles undefined input for detectToolStatuses', async () => {
|
|
50
|
+
const statuses = await detectToolStatuses(undefined);
|
|
51
|
+
expect(statuses).toEqual({});
|
|
52
|
+
});
|
|
53
|
+
it('filters out empty and whitespace tool names', async () => {
|
|
54
|
+
const statuses = await detectToolStatuses(['claude', '', ' ', 'opencode']);
|
|
55
|
+
expect(Object.keys(statuses).sort()).toEqual(['claude', 'opencode']);
|
|
56
|
+
});
|
|
57
|
+
it('returns correct structure for tool status', async () => {
|
|
58
|
+
const status = await detectToolInstallStatus('claude');
|
|
59
|
+
expect(typeof status.tool).toBe('string');
|
|
60
|
+
expect(typeof status.installed).toBe('boolean');
|
|
61
|
+
expect(status.executable === null || typeof status.executable === 'string').toBe(true);
|
|
62
|
+
expect(status.version === null || typeof status.version === 'string').toBe(true);
|
|
63
|
+
expect(typeof status.installing).toBe('boolean');
|
|
64
|
+
expect(status.error === null || typeof status.error === 'string').toBe(true);
|
|
65
|
+
});
|
|
66
|
+
it('supports claudecode as alias for claude', async () => {
|
|
67
|
+
const status = await detectToolInstallStatus('claudecode');
|
|
68
|
+
expect(status.tool).toBe('claudecode');
|
|
69
|
+
// claudecode shares same detection as claude
|
|
70
|
+
expect(typeof status.installed).toBe('boolean');
|
|
71
|
+
});
|
|
72
|
+
it('supports codex as an installable tool', async () => {
|
|
73
|
+
expect(SUPPORTED_INSTALLABLE_TOOLS).toContain('codex');
|
|
74
|
+
const status = await detectToolInstallStatus('codex');
|
|
75
|
+
expect(status.tool).toBe('codex');
|
|
76
|
+
expect(typeof status.installed).toBe('boolean');
|
|
77
|
+
expect(status.error).not.toBe('unsupported tool');
|
|
78
|
+
});
|
|
79
|
+
it('detectToolStatuses returns status for all requested tools', async () => {
|
|
80
|
+
const tools = ['claude', 'opencode', 'unknown-tool'];
|
|
81
|
+
const statuses = await detectToolStatuses(tools);
|
|
82
|
+
expect(statuses.claude).toBeDefined();
|
|
83
|
+
expect(statuses.opencode).toBeDefined();
|
|
84
|
+
// unknown-tool should also be in results with unsupported status
|
|
85
|
+
expect(statuses['unknown-tool']).toBeDefined();
|
|
86
|
+
expect(statuses['unknown-tool'].error).toBe('unsupported tool');
|
|
87
|
+
});
|
|
88
|
+
it('handles mixed case tool names', async () => {
|
|
89
|
+
const statuses = await detectToolStatuses(['Claude', 'OPENCODE', 'ClaudeCode']);
|
|
90
|
+
expect(statuses.claude).toBeDefined();
|
|
91
|
+
expect(statuses.opencode).toBeDefined();
|
|
92
|
+
expect(statuses.claudecode).toBeDefined();
|
|
93
|
+
});
|
|
94
|
+
it('sets installing flag to false by default', async () => {
|
|
95
|
+
const status = await detectToolInstallStatus('claude');
|
|
96
|
+
expect(status.installing).toBe(false);
|
|
97
|
+
});
|
|
98
|
+
it('returns consistent tool name in lowercase', async () => {
|
|
99
|
+
const status = await detectToolInstallStatus('CLAUDE');
|
|
100
|
+
expect(status.tool).toBe('claude');
|
|
101
|
+
});
|
|
102
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 用户 API Key 服务
|
|
3
|
+
*
|
|
4
|
+
* 从 aws-mcp-server 获取用户的默认 API Key
|
|
5
|
+
* 用于 SDK 启动时配置 WebSocket 连接认证
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* 获取用户的默认 API Key
|
|
9
|
+
*
|
|
10
|
+
* @param userId - 用户 ID(可选,如果不提供则使用当前登录用户)
|
|
11
|
+
* @returns 默认 API Key 或 null
|
|
12
|
+
*/
|
|
13
|
+
export declare function getUserDefaultApiKey(userId?: string): Promise<string | null>;
|
|
14
|
+
/**
|
|
15
|
+
* 为 Agent 获取 API Key(用于 WebSocket 连接认证)
|
|
16
|
+
*
|
|
17
|
+
* ★ 调用后端 /api/user-api-keys/for-agent 接口
|
|
18
|
+
* 后端会自动处理以下逻辑:
|
|
19
|
+
* 1. 查找 Agent 的 ownerUserId
|
|
20
|
+
* 2. 如果找到,返回该用户的默认 API Key
|
|
21
|
+
* 3. 如果找不到,返回系统用户的默认 API Key
|
|
22
|
+
* 4. 确保每个 Agent 都能获取到可用的 API Key
|
|
23
|
+
*
|
|
24
|
+
* @param agentId - Agent ID
|
|
25
|
+
* @returns API Key 或 null
|
|
26
|
+
*/
|
|
27
|
+
export declare function getApiKeyForAgent(agentId: string): Promise<string | null>;
|
|
28
|
+
//# sourceMappingURL=user-api-key-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-api-key-service.d.ts","sourceRoot":"","sources":["../../src/services/user-api-key-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA8BxB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+BxB"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 用户 API Key 服务
|
|
3
|
+
*
|
|
4
|
+
* 从 aws-mcp-server 获取用户的默认 API Key
|
|
5
|
+
* 用于 SDK 启动时配置 WebSocket 连接认证
|
|
6
|
+
*/
|
|
7
|
+
import axios from "axios";
|
|
8
|
+
import { schedulerBaseUrl, runtimeToken } from "../config.js";
|
|
9
|
+
import { logger } from "../utils/logger.js";
|
|
10
|
+
/**
|
|
11
|
+
* 获取用户的默认 API Key
|
|
12
|
+
*
|
|
13
|
+
* @param userId - 用户 ID(可选,如果不提供则使用当前登录用户)
|
|
14
|
+
* @returns 默认 API Key 或 null
|
|
15
|
+
*/
|
|
16
|
+
export async function getUserDefaultApiKey(userId) {
|
|
17
|
+
try {
|
|
18
|
+
const url = userId
|
|
19
|
+
? `${schedulerBaseUrl}/api/user-api-keys/default?userId=${userId}`
|
|
20
|
+
: `${schedulerBaseUrl}/api/user-api-keys/default`;
|
|
21
|
+
const response = await axios.get(url, {
|
|
22
|
+
headers: {
|
|
23
|
+
"X-Runtime-Token": runtimeToken,
|
|
24
|
+
},
|
|
25
|
+
timeout: 5000,
|
|
26
|
+
});
|
|
27
|
+
if (response.data && response.data.success && response.data.data) {
|
|
28
|
+
const apiKey = response.data.data.apiKey;
|
|
29
|
+
logger.info(`[UserApiKeyService] 获取用户默认 API Key 成功: apiKey=${apiKey}`);
|
|
30
|
+
return apiKey;
|
|
31
|
+
}
|
|
32
|
+
logger.warn("[UserApiKeyService] 获取用户默认 API Key 失败: 响应数据无效");
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
37
|
+
logger.error(`[UserApiKeyService] 获取用户默认 API Key 失败: ${errorMessage}`);
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 为 Agent 获取 API Key(用于 WebSocket 连接认证)
|
|
43
|
+
*
|
|
44
|
+
* ★ 调用后端 /api/user-api-keys/for-agent 接口
|
|
45
|
+
* 后端会自动处理以下逻辑:
|
|
46
|
+
* 1. 查找 Agent 的 ownerUserId
|
|
47
|
+
* 2. 如果找到,返回该用户的默认 API Key
|
|
48
|
+
* 3. 如果找不到,返回系统用户的默认 API Key
|
|
49
|
+
* 4. 确保每个 Agent 都能获取到可用的 API Key
|
|
50
|
+
*
|
|
51
|
+
* @param agentId - Agent ID
|
|
52
|
+
* @returns API Key 或 null
|
|
53
|
+
*/
|
|
54
|
+
export async function getApiKeyForAgent(agentId) {
|
|
55
|
+
try {
|
|
56
|
+
const response = await axios.get(`${schedulerBaseUrl}/api/user-api-keys/for-agent?agentId=${agentId}`, {
|
|
57
|
+
headers: {
|
|
58
|
+
"X-Runtime-Token": runtimeToken,
|
|
59
|
+
},
|
|
60
|
+
timeout: 5000,
|
|
61
|
+
});
|
|
62
|
+
if (response.data && response.data.success && response.data.data) {
|
|
63
|
+
const apiKey = response.data.data.apiKey;
|
|
64
|
+
logger.info(`[UserApiKeyService] 获取 Agent ${agentId} 的 API Key 成功: apiKey=${apiKey}`);
|
|
65
|
+
return apiKey;
|
|
66
|
+
}
|
|
67
|
+
logger.warn(`[UserApiKeyService] 获取 Agent ${agentId} 的 API Key 失败: 响应数据无效`);
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
72
|
+
logger.error(`[UserApiKeyService] 获取 Agent ${agentId} 的 API Key 失败: ${errorMessage}`);
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 工作区文件服务
|
|
3
|
+
* 负责在工作区范围内安全地浏览、读取与保存文件。
|
|
4
|
+
*/
|
|
5
|
+
export interface WorkspaceFileItem {
|
|
6
|
+
name: string;
|
|
7
|
+
path: string;
|
|
8
|
+
isDirectory: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface ListWorkspaceDirectoryResult {
|
|
11
|
+
currentPath: string;
|
|
12
|
+
workspacePath: string;
|
|
13
|
+
items: WorkspaceFileItem[];
|
|
14
|
+
}
|
|
15
|
+
export interface ReadWorkspaceFileResult {
|
|
16
|
+
workspacePath: string;
|
|
17
|
+
filePath: string;
|
|
18
|
+
content: string;
|
|
19
|
+
}
|
|
20
|
+
interface WorkspacePathParams {
|
|
21
|
+
workspacePath: string;
|
|
22
|
+
targetPath?: string;
|
|
23
|
+
}
|
|
24
|
+
interface WorkspaceFileParams {
|
|
25
|
+
workspacePath: string;
|
|
26
|
+
filePath: string;
|
|
27
|
+
}
|
|
28
|
+
interface WriteWorkspaceFileParams extends WorkspaceFileParams {
|
|
29
|
+
content: string;
|
|
30
|
+
}
|
|
31
|
+
interface CreateWorkspaceEntryParams extends WorkspacePathParams {
|
|
32
|
+
entryName: string;
|
|
33
|
+
isDirectory: boolean;
|
|
34
|
+
}
|
|
35
|
+
interface RenameWorkspaceEntryParams extends WorkspacePathParams {
|
|
36
|
+
targetPath: string;
|
|
37
|
+
newName: string;
|
|
38
|
+
}
|
|
39
|
+
interface DeleteWorkspaceEntryParams extends WorkspacePathParams {
|
|
40
|
+
targetPath: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 列出工作区目录内容。
|
|
44
|
+
*/
|
|
45
|
+
export declare function listWorkspaceDirectory(params: WorkspacePathParams): Promise<ListWorkspaceDirectoryResult>;
|
|
46
|
+
/**
|
|
47
|
+
* 读取工作区中的文本文件。
|
|
48
|
+
*/
|
|
49
|
+
export declare function readWorkspaceFile(params: WorkspaceFileParams): Promise<ReadWorkspaceFileResult>;
|
|
50
|
+
/**
|
|
51
|
+
* 将文本内容保存到工作区文件中。
|
|
52
|
+
*/
|
|
53
|
+
export declare function writeWorkspaceFile(params: WriteWorkspaceFileParams): Promise<{
|
|
54
|
+
ok: true;
|
|
55
|
+
workspacePath: string;
|
|
56
|
+
filePath: string;
|
|
57
|
+
}>;
|
|
58
|
+
/**
|
|
59
|
+
* 在指定工作区目录下创建文件或目录。
|
|
60
|
+
*/
|
|
61
|
+
export declare function createWorkspaceEntry(params: CreateWorkspaceEntryParams): Promise<{
|
|
62
|
+
ok: true;
|
|
63
|
+
workspacePath: string;
|
|
64
|
+
targetPath: string;
|
|
65
|
+
isDirectory: boolean;
|
|
66
|
+
}>;
|
|
67
|
+
/**
|
|
68
|
+
* 在工作区内重命名文件或目录,保持目标仍位于原父目录中。
|
|
69
|
+
*/
|
|
70
|
+
export declare function renameWorkspaceEntry(params: RenameWorkspaceEntryParams): Promise<{
|
|
71
|
+
ok: true;
|
|
72
|
+
workspacePath: string;
|
|
73
|
+
sourcePath: string;
|
|
74
|
+
targetPath: string;
|
|
75
|
+
}>;
|
|
76
|
+
/**
|
|
77
|
+
* 删除工作区内的文件或目录,并阻止误删工作区根目录。
|
|
78
|
+
*/
|
|
79
|
+
export declare function deleteWorkspaceEntry(params: DeleteWorkspaceEntryParams): Promise<{
|
|
80
|
+
ok: true;
|
|
81
|
+
workspacePath: string;
|
|
82
|
+
targetPath: string;
|
|
83
|
+
}>;
|
|
84
|
+
export {};
|
|
85
|
+
//# sourceMappingURL=workspace-files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-files.d.ts","sourceRoot":"","sources":["../../src/services/workspace-files.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,iBAAiB,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,uBAAuB;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,mBAAmB;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,mBAAmB;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,wBAAyB,SAAQ,mBAAmB;IAC5D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,0BAA2B,SAAQ,mBAAmB;IAC9D,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,UAAU,0BAA2B,SAAQ,mBAAmB;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,0BAA2B,SAAQ,mBAAmB;IAC9D,UAAU,EAAE,MAAM,CAAC;CACpB;AA+FD;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAoB/G;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAerG;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAWzI;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAAC,CAiCxF;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAkCtF;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAelE"}
|