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,622 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode SDK Adapter
|
|
3
|
+
*
|
|
4
|
+
* 主干流程:
|
|
5
|
+
* 1. spawn `opencode serve --port <port>` 进程(使用 shell: true)
|
|
6
|
+
* 2. 创建 SDK 客户端连接到该端口
|
|
7
|
+
* 3. 通过 client.session.create() 创建 OpenCode 会话
|
|
8
|
+
* 4. 订阅 SSE 事件流并映射到统一 ProviderEvent
|
|
9
|
+
* 5. 通过 client.session.prompt() 发送用户消息
|
|
10
|
+
*
|
|
11
|
+
* 参考:spectrai-community/src/main/adapter/OpenCodeSdkAdapter.ts
|
|
12
|
+
*/
|
|
13
|
+
import { spawn } from 'child_process';
|
|
14
|
+
import { EventEmitter } from 'node:events';
|
|
15
|
+
import * as fs from 'fs';
|
|
16
|
+
import * as net from 'net';
|
|
17
|
+
import * as os from 'os';
|
|
18
|
+
import * as path from 'path';
|
|
19
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
20
|
+
import { createOpencodeClient, } from '@opencode-ai/sdk';
|
|
21
|
+
import { getToolActionInfo } from './types.js';
|
|
22
|
+
// ============ 可执行文件查找 ============
|
|
23
|
+
/**
|
|
24
|
+
* 查找 opencode 可执行文件
|
|
25
|
+
* 优先级:用户配置的绝对路径 > Windows Volta exe > npm 全局目录 > 回退到 'opencode'
|
|
26
|
+
*/
|
|
27
|
+
function findOpenCodeExecutable(configCommand) {
|
|
28
|
+
if (configCommand && path.isAbsolute(configCommand) && fs.existsSync(configCommand)) {
|
|
29
|
+
return configCommand;
|
|
30
|
+
}
|
|
31
|
+
const fallback = configCommand?.trim() || 'opencode';
|
|
32
|
+
if (process.platform === 'win32') {
|
|
33
|
+
const home = process.env.USERPROFILE || process.env.HOME || os.homedir();
|
|
34
|
+
const localAppData = process.env.LOCALAPPDATA || '';
|
|
35
|
+
// 1. Volta 安装的 opencode.exe(优先,不需要 shell)
|
|
36
|
+
const voltaExeDirs = [
|
|
37
|
+
path.join(localAppData, 'Volta', 'tools', 'shared', 'opencode-ai', 'node_modules', 'opencode-windows-x64', 'bin'),
|
|
38
|
+
path.join(localAppData, 'Volta', 'tools', 'shared', 'opencode-ai', 'node_modules', 'opencode-windows-x64-baseline', 'bin'),
|
|
39
|
+
];
|
|
40
|
+
for (const dir of voltaExeDirs) {
|
|
41
|
+
const exePath = path.join(dir, 'opencode.exe');
|
|
42
|
+
if (fs.existsSync(exePath)) {
|
|
43
|
+
console.log(`[OpencodeSdkAdapter] Found opencode.exe: ${exePath}`);
|
|
44
|
+
return exePath;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// 2. npm 全局安装的 opencode.cmd
|
|
48
|
+
const npmGlobalDirs = [
|
|
49
|
+
path.join(home, 'AppData', 'Roaming', 'npm'),
|
|
50
|
+
path.join(home, 'AppData', 'Local', 'Volta', 'bin'),
|
|
51
|
+
];
|
|
52
|
+
for (const dir of npmGlobalDirs) {
|
|
53
|
+
for (const name of ['opencode.cmd', 'opencode.exe', 'opencode']) {
|
|
54
|
+
const candidate = path.join(dir, name);
|
|
55
|
+
if (fs.existsSync(candidate)) {
|
|
56
|
+
console.log(`[OpencodeSdkAdapter] Found ${name}: ${candidate}`);
|
|
57
|
+
return candidate;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return fallback;
|
|
63
|
+
}
|
|
64
|
+
// ============ 端口检测 ============
|
|
65
|
+
async function findAvailablePort(startPort = 14096) {
|
|
66
|
+
for (let port = startPort; port < startPort + 100; port++) {
|
|
67
|
+
const available = await new Promise((resolve) => {
|
|
68
|
+
const server = net.createServer();
|
|
69
|
+
server.once('error', () => resolve(false));
|
|
70
|
+
server.once('listening', () => {
|
|
71
|
+
server.close(() => resolve(true));
|
|
72
|
+
});
|
|
73
|
+
server.listen(port, '127.0.0.1');
|
|
74
|
+
});
|
|
75
|
+
if (available)
|
|
76
|
+
return port;
|
|
77
|
+
}
|
|
78
|
+
throw new Error(`No available port found in range ${startPort}–${startPort + 99}`);
|
|
79
|
+
}
|
|
80
|
+
// ============ Adapter ============
|
|
81
|
+
export class OpencodeSdkAdapter extends EventEmitter {
|
|
82
|
+
constructor() {
|
|
83
|
+
super(...arguments);
|
|
84
|
+
this.providerId = 'opencode';
|
|
85
|
+
this.displayName = 'OpenCode';
|
|
86
|
+
this.sessions = new Map();
|
|
87
|
+
}
|
|
88
|
+
async startSession(sessionId, config) {
|
|
89
|
+
console.log(`[OpencodeSdkAdapter] ★★★ 启动 OpenCode SDK 会话 ★★★ sessionId="${sessionId}", workingDirectory="${config.workingDirectory}"`);
|
|
90
|
+
const session = {
|
|
91
|
+
adapterSession: {
|
|
92
|
+
sessionId,
|
|
93
|
+
status: 'starting',
|
|
94
|
+
messages: [],
|
|
95
|
+
createdAt: new Date().toISOString(),
|
|
96
|
+
totalUsage: { inputTokens: 0, outputTokens: 0 },
|
|
97
|
+
},
|
|
98
|
+
config,
|
|
99
|
+
sseActive: false,
|
|
100
|
+
pendingPermissions: new Map(),
|
|
101
|
+
emittedToolStarts: new Set(),
|
|
102
|
+
workingDirectory: config.workingDirectory,
|
|
103
|
+
userMessageIds: new Set(),
|
|
104
|
+
currentAssistantText: '',
|
|
105
|
+
seenTextPartIds: new Set(),
|
|
106
|
+
};
|
|
107
|
+
this.sessions.set(sessionId, session);
|
|
108
|
+
this.emit('status-change', sessionId, 'starting');
|
|
109
|
+
try {
|
|
110
|
+
// 步骤 1:找空闲端口
|
|
111
|
+
const port = await findAvailablePort();
|
|
112
|
+
session.port = port;
|
|
113
|
+
console.log(`[OpencodeSdkAdapter] ★★★ 使用端口 ★★★ port=${port}`);
|
|
114
|
+
// 步骤 2:启动 opencode serve 进程
|
|
115
|
+
const openCodeCommand = findOpenCodeExecutable(config.command);
|
|
116
|
+
console.log(`[OpencodeSdkAdapter] ★★★ 启动命令 ★★★ command="${openCodeCommand}"`);
|
|
117
|
+
// ★ 关键:Windows 上 .cmd 必须使用 shell: true
|
|
118
|
+
const useShell = openCodeCommand.endsWith('.cmd') ||
|
|
119
|
+
openCodeCommand.endsWith('.CMD') ||
|
|
120
|
+
(process.platform === 'win32' && !path.isAbsolute(openCodeCommand));
|
|
121
|
+
console.log(`[OpencodeSdkAdapter] shell=${useShell}`);
|
|
122
|
+
const env = { ...process.env, ...config.envOverrides };
|
|
123
|
+
const proc = spawn(openCodeCommand, ['serve', '--port', String(port)], {
|
|
124
|
+
cwd: config.workingDirectory,
|
|
125
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
126
|
+
env,
|
|
127
|
+
shell: useShell,
|
|
128
|
+
});
|
|
129
|
+
session.serverProcess = proc;
|
|
130
|
+
proc.stdout?.on('data', (d) => {
|
|
131
|
+
console.debug(`[OpencodeSdkAdapter] serve stdout: ${d.toString().slice(0, 200)}`);
|
|
132
|
+
});
|
|
133
|
+
proc.stderr?.on('data', (d) => {
|
|
134
|
+
console.debug(`[OpencodeSdkAdapter] serve stderr: ${d.toString().slice(0, 200)}`);
|
|
135
|
+
});
|
|
136
|
+
proc.on('error', (err) => {
|
|
137
|
+
console.error(`[OpencodeSdkAdapter] Server process error:`, err);
|
|
138
|
+
if (session.adapterSession.status !== 'terminated') {
|
|
139
|
+
session.adapterSession.status = 'error';
|
|
140
|
+
this.emit('status-change', sessionId, 'error');
|
|
141
|
+
this.emitEvent({
|
|
142
|
+
type: 'error',
|
|
143
|
+
sessionId,
|
|
144
|
+
timestamp: new Date().toISOString(),
|
|
145
|
+
data: { text: `OpenCode server error: ${err.message}` },
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
proc.on('exit', (code) => {
|
|
150
|
+
console.log(`[OpencodeSdkAdapter] Server exited with code ${code}`);
|
|
151
|
+
session.sseActive = false;
|
|
152
|
+
});
|
|
153
|
+
// 步骤 3:创建 SDK 客户端
|
|
154
|
+
const client = createOpencodeClient({
|
|
155
|
+
baseUrl: `http://127.0.0.1:${port}`,
|
|
156
|
+
});
|
|
157
|
+
session.client = client;
|
|
158
|
+
// 步骤 4:等待服务器就绪
|
|
159
|
+
await this.waitForServer(client, config.workingDirectory, 10_000, port);
|
|
160
|
+
console.log(`[OpencodeSdkAdapter] ★★★ OpenCode server ready ★★★ port=${port}`);
|
|
161
|
+
// 步骤 5:创建 OpenCode 会话
|
|
162
|
+
const createResult = await client.session.create({
|
|
163
|
+
body: { title: `aws-bridge-${sessionId.slice(0, 8)}` },
|
|
164
|
+
query: { directory: config.workingDirectory },
|
|
165
|
+
});
|
|
166
|
+
const ocSession = createResult.data;
|
|
167
|
+
if (!ocSession?.id) {
|
|
168
|
+
throw new Error('OpenCode session.create() did not return an ID');
|
|
169
|
+
}
|
|
170
|
+
session.opencodeSessionId = ocSession.id;
|
|
171
|
+
session.adapterSession.providerSessionId = ocSession.id;
|
|
172
|
+
console.log(`[OpencodeSdkAdapter] ★★★ OpenCode 会话创建成功 ★★★ sessionId="${ocSession.id}"`);
|
|
173
|
+
// 步骤 6:后台启动 SSE 事件订阅循环
|
|
174
|
+
this.startSseLoop(sessionId, session);
|
|
175
|
+
session.adapterSession.status = 'waiting_input';
|
|
176
|
+
this.emit('status-change', sessionId, 'waiting_input');
|
|
177
|
+
// 步骤 7:发送初始 Prompt
|
|
178
|
+
if (config.initialPrompt) {
|
|
179
|
+
await this.sendMessage(sessionId, config.initialPrompt);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
catch (err) {
|
|
183
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
184
|
+
console.error(`[OpencodeSdkAdapter] startSession failed:`, err);
|
|
185
|
+
session.adapterSession.status = 'error';
|
|
186
|
+
this.emit('status-change', sessionId, 'error');
|
|
187
|
+
this.emitEvent({
|
|
188
|
+
type: 'error',
|
|
189
|
+
sessionId,
|
|
190
|
+
timestamp: new Date().toISOString(),
|
|
191
|
+
data: { text: `OpenCode start failed: ${msg}` },
|
|
192
|
+
});
|
|
193
|
+
throw err;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
async sendMessage(sessionId, message) {
|
|
197
|
+
const session = this.sessions.get(sessionId);
|
|
198
|
+
if (!session)
|
|
199
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
200
|
+
if (!session.client || !session.opencodeSessionId) {
|
|
201
|
+
throw new Error(`Session ${sessionId} not ready`);
|
|
202
|
+
}
|
|
203
|
+
const userMsg = {
|
|
204
|
+
id: uuidv4(),
|
|
205
|
+
sessionId,
|
|
206
|
+
role: 'user',
|
|
207
|
+
content: message,
|
|
208
|
+
timestamp: new Date().toISOString(),
|
|
209
|
+
};
|
|
210
|
+
session.adapterSession.messages.push(userMsg);
|
|
211
|
+
this.emit('conversation-message', sessionId, userMsg);
|
|
212
|
+
session.adapterSession.status = 'thinking';
|
|
213
|
+
this.emit('status-change', sessionId, 'thinking');
|
|
214
|
+
this.stopIdleDetection(sessionId);
|
|
215
|
+
try {
|
|
216
|
+
await session.client.session.prompt({
|
|
217
|
+
path: { id: session.opencodeSessionId },
|
|
218
|
+
body: {
|
|
219
|
+
parts: [{ type: 'text', text: message }],
|
|
220
|
+
},
|
|
221
|
+
query: { directory: session.workingDirectory },
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
catch (err) {
|
|
225
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
226
|
+
this.emitEvent({
|
|
227
|
+
type: 'error',
|
|
228
|
+
sessionId,
|
|
229
|
+
timestamp: new Date().toISOString(),
|
|
230
|
+
data: { text: msg },
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
async sendConfirmation(sessionId, accept) {
|
|
235
|
+
const session = this.sessions.get(sessionId);
|
|
236
|
+
if (!session?.client || !session.opencodeSessionId)
|
|
237
|
+
return;
|
|
238
|
+
const response = accept ? 'once' : 'reject';
|
|
239
|
+
const ocId = session.opencodeSessionId;
|
|
240
|
+
for (const [permissionId] of session.pendingPermissions) {
|
|
241
|
+
try {
|
|
242
|
+
await session.client.postSessionIdPermissionsPermissionId({
|
|
243
|
+
path: { id: ocId, permissionID: permissionId },
|
|
244
|
+
body: { response },
|
|
245
|
+
query: { directory: session.workingDirectory },
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
console.warn(`[OpencodeSdkAdapter] Permission response failed:`, err);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
session.pendingPermissions.clear();
|
|
253
|
+
}
|
|
254
|
+
async sendQuestionAnswer(_sessionId, _answers) {
|
|
255
|
+
// OpenCode 的 AskUserQuestion 通过 permission 机制处理
|
|
256
|
+
}
|
|
257
|
+
setIdleCommands(sessionId, commands) {
|
|
258
|
+
const session = this.sessions.get(sessionId);
|
|
259
|
+
if (session) {
|
|
260
|
+
session.idleCommands = commands;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
async abortCurrentTurn(sessionId) {
|
|
264
|
+
const session = this.sessions.get(sessionId);
|
|
265
|
+
if (!session?.client || !session.opencodeSessionId)
|
|
266
|
+
return;
|
|
267
|
+
try {
|
|
268
|
+
await session.client.session.abort({
|
|
269
|
+
path: { id: session.opencodeSessionId },
|
|
270
|
+
query: { directory: session.workingDirectory },
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
catch (err) {
|
|
274
|
+
console.warn(`[OpencodeSdkAdapter] Abort failed:`, err);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
async terminateSession(sessionId) {
|
|
278
|
+
const session = this.sessions.get(sessionId);
|
|
279
|
+
if (!session)
|
|
280
|
+
return;
|
|
281
|
+
this.stopIdleDetection(sessionId);
|
|
282
|
+
session.sseActive = false;
|
|
283
|
+
session.sseAbortController?.abort();
|
|
284
|
+
if (session.serverProcess) {
|
|
285
|
+
try {
|
|
286
|
+
session.serverProcess.kill();
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
// ignore
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
session.adapterSession.status = 'terminated';
|
|
293
|
+
this.emit('status-change', sessionId, 'terminated');
|
|
294
|
+
this.emitEvent({
|
|
295
|
+
type: 'session_complete',
|
|
296
|
+
sessionId,
|
|
297
|
+
timestamp: new Date().toISOString(),
|
|
298
|
+
data: { exitCode: 0 },
|
|
299
|
+
});
|
|
300
|
+
this.sessions.delete(sessionId);
|
|
301
|
+
}
|
|
302
|
+
getConversation(sessionId) {
|
|
303
|
+
return this.sessions.get(sessionId)?.adapterSession.messages ?? [];
|
|
304
|
+
}
|
|
305
|
+
hasSession(sessionId) {
|
|
306
|
+
return this.sessions.has(sessionId);
|
|
307
|
+
}
|
|
308
|
+
getProviderSessionId(sessionId) {
|
|
309
|
+
return this.sessions.get(sessionId)?.opencodeSessionId;
|
|
310
|
+
}
|
|
311
|
+
getSessionStatus(sessionId) {
|
|
312
|
+
return this.sessions.get(sessionId)?.adapterSession.status;
|
|
313
|
+
}
|
|
314
|
+
getSessionPid(sessionId) {
|
|
315
|
+
const session = this.sessions.get(sessionId);
|
|
316
|
+
if (!session)
|
|
317
|
+
return undefined;
|
|
318
|
+
// OpenCode SDK 模式下 serverProcess 是 spawn 出来的子进程
|
|
319
|
+
return session.serverProcess?.pid;
|
|
320
|
+
}
|
|
321
|
+
cleanup() {
|
|
322
|
+
for (const [id] of this.sessions) {
|
|
323
|
+
try {
|
|
324
|
+
this.terminateSession(id);
|
|
325
|
+
}
|
|
326
|
+
catch {
|
|
327
|
+
// ignore
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
this.sessions.clear();
|
|
331
|
+
}
|
|
332
|
+
// ============ 私有方法 ============
|
|
333
|
+
async waitForServer(client, directory, timeoutMs, port) {
|
|
334
|
+
const deadline = Date.now() + timeoutMs;
|
|
335
|
+
while (Date.now() < deadline) {
|
|
336
|
+
try {
|
|
337
|
+
const result = await client.session.list({ query: { directory } });
|
|
338
|
+
if (result.data !== undefined)
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
catch {
|
|
342
|
+
// 服务器尚未就绪
|
|
343
|
+
}
|
|
344
|
+
await new Promise((r) => setTimeout(r, 300));
|
|
345
|
+
}
|
|
346
|
+
throw new Error(`OpenCode server (port ${port}) did not start within ${timeoutMs}ms`);
|
|
347
|
+
}
|
|
348
|
+
startSseLoop(sessionId, session) {
|
|
349
|
+
session.sseActive = true;
|
|
350
|
+
const ac = new AbortController();
|
|
351
|
+
session.sseAbortController = ac;
|
|
352
|
+
this.runSseLoop(sessionId, session, ac).catch((err) => {
|
|
353
|
+
if (!ac.signal.aborted) {
|
|
354
|
+
console.error(`[OpencodeSdkAdapter] SSE loop error:`, err);
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
async runSseLoop(sessionId, session, ac) {
|
|
359
|
+
if (!session.client)
|
|
360
|
+
return;
|
|
361
|
+
try {
|
|
362
|
+
const sseResult = await session.client.event.subscribe({
|
|
363
|
+
query: { directory: session.workingDirectory },
|
|
364
|
+
signal: ac.signal,
|
|
365
|
+
});
|
|
366
|
+
for await (const event of sseResult.stream) {
|
|
367
|
+
if (!session.sseActive || ac.signal.aborted)
|
|
368
|
+
break;
|
|
369
|
+
this.handleOpenCodeEvent(sessionId, session, event);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
catch (err) {
|
|
373
|
+
if (ac.signal.aborted)
|
|
374
|
+
return;
|
|
375
|
+
console.error(`[OpencodeSdkAdapter] SSE stream ended:`, err);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
handleOpenCodeEvent(sessionId, session, event) {
|
|
379
|
+
const ts = new Date().toISOString();
|
|
380
|
+
const ocId = session.opencodeSessionId;
|
|
381
|
+
switch (event.type) {
|
|
382
|
+
case 'message.updated': {
|
|
383
|
+
const msg = event.properties.info;
|
|
384
|
+
if (msg.sessionID !== ocId)
|
|
385
|
+
break;
|
|
386
|
+
if (msg.role === 'user') {
|
|
387
|
+
session.userMessageIds.add(msg.id);
|
|
388
|
+
}
|
|
389
|
+
else if (msg.role === 'assistant') {
|
|
390
|
+
const tokens = msg.tokens;
|
|
391
|
+
if (tokens) {
|
|
392
|
+
session.adapterSession.totalUsage.inputTokens = Math.max(session.adapterSession.totalUsage.inputTokens, tokens.input);
|
|
393
|
+
session.adapterSession.totalUsage.outputTokens = Math.max(session.adapterSession.totalUsage.outputTokens, tokens.output);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
break;
|
|
397
|
+
}
|
|
398
|
+
case 'message.part.updated': {
|
|
399
|
+
const { part, delta } = event.properties;
|
|
400
|
+
if (part.sessionID !== ocId)
|
|
401
|
+
break;
|
|
402
|
+
if (session.userMessageIds.has(part.messageID))
|
|
403
|
+
break;
|
|
404
|
+
this.handlePartUpdate(sessionId, session, part, delta, ts);
|
|
405
|
+
break;
|
|
406
|
+
}
|
|
407
|
+
case 'session.idle': {
|
|
408
|
+
if (event.properties.sessionID !== ocId)
|
|
409
|
+
break;
|
|
410
|
+
if (session.currentAssistantText) {
|
|
411
|
+
const assistantMsg = {
|
|
412
|
+
id: uuidv4(),
|
|
413
|
+
sessionId,
|
|
414
|
+
role: 'assistant',
|
|
415
|
+
content: session.currentAssistantText,
|
|
416
|
+
timestamp: ts,
|
|
417
|
+
};
|
|
418
|
+
session.adapterSession.messages.push(assistantMsg);
|
|
419
|
+
session.currentAssistantText = '';
|
|
420
|
+
}
|
|
421
|
+
session.seenTextPartIds.clear();
|
|
422
|
+
this.emitEvent({
|
|
423
|
+
type: 'turn_complete',
|
|
424
|
+
sessionId,
|
|
425
|
+
timestamp: ts,
|
|
426
|
+
data: { usage: session.adapterSession.totalUsage },
|
|
427
|
+
});
|
|
428
|
+
session.adapterSession.status = 'waiting_input';
|
|
429
|
+
this.emit('status-change', sessionId, 'waiting_input');
|
|
430
|
+
this.startIdleDetection(sessionId);
|
|
431
|
+
break;
|
|
432
|
+
}
|
|
433
|
+
case 'permission.updated': {
|
|
434
|
+
const perm = event.properties;
|
|
435
|
+
if (perm.sessionID !== ocId)
|
|
436
|
+
break;
|
|
437
|
+
const permId = perm.id;
|
|
438
|
+
session.pendingPermissions.set(permId, perm);
|
|
439
|
+
if (session.config.autoAccept && session.client && ocId) {
|
|
440
|
+
session.client
|
|
441
|
+
.postSessionIdPermissionsPermissionId({
|
|
442
|
+
path: { id: ocId, permissionID: permId },
|
|
443
|
+
body: { response: 'once' },
|
|
444
|
+
query: { directory: session.workingDirectory },
|
|
445
|
+
})
|
|
446
|
+
.then(() => {
|
|
447
|
+
session.pendingPermissions.delete(permId);
|
|
448
|
+
})
|
|
449
|
+
.catch((err) => {
|
|
450
|
+
console.warn(`[OpencodeSdkAdapter] Auto-accept permission failed:`, err);
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
else {
|
|
454
|
+
this.emitEvent({
|
|
455
|
+
type: 'permission_request',
|
|
456
|
+
sessionId,
|
|
457
|
+
timestamp: ts,
|
|
458
|
+
data: {
|
|
459
|
+
permissionPrompt: perm.title,
|
|
460
|
+
toolName: perm.type,
|
|
461
|
+
},
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
break;
|
|
465
|
+
}
|
|
466
|
+
case 'session.error': {
|
|
467
|
+
const { sessionID, error } = event.properties;
|
|
468
|
+
if (sessionID && sessionID !== ocId)
|
|
469
|
+
break;
|
|
470
|
+
let errMsg = 'OpenCode session error';
|
|
471
|
+
if (error) {
|
|
472
|
+
const data = error.data;
|
|
473
|
+
if (typeof data?.message === 'string') {
|
|
474
|
+
errMsg = `${error.name}: ${data.message}`;
|
|
475
|
+
}
|
|
476
|
+
else {
|
|
477
|
+
errMsg = error.name;
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
this.emitEvent({
|
|
481
|
+
type: 'error',
|
|
482
|
+
sessionId,
|
|
483
|
+
timestamp: ts,
|
|
484
|
+
data: { text: errMsg },
|
|
485
|
+
});
|
|
486
|
+
break;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
handlePartUpdate(sessionId, session, part, delta, ts) {
|
|
491
|
+
switch (part.type) {
|
|
492
|
+
case 'text': {
|
|
493
|
+
let text;
|
|
494
|
+
if (delta !== undefined) {
|
|
495
|
+
text = delta;
|
|
496
|
+
session.seenTextPartIds.add(part.id);
|
|
497
|
+
}
|
|
498
|
+
else if (!session.seenTextPartIds.has(part.id)) {
|
|
499
|
+
text = part.text;
|
|
500
|
+
if (text)
|
|
501
|
+
session.seenTextPartIds.add(part.id);
|
|
502
|
+
}
|
|
503
|
+
else {
|
|
504
|
+
break;
|
|
505
|
+
}
|
|
506
|
+
if (!text)
|
|
507
|
+
break;
|
|
508
|
+
session.currentAssistantText += text;
|
|
509
|
+
this.emitEvent({
|
|
510
|
+
type: 'text_delta',
|
|
511
|
+
sessionId,
|
|
512
|
+
timestamp: ts,
|
|
513
|
+
data: { text },
|
|
514
|
+
});
|
|
515
|
+
break;
|
|
516
|
+
}
|
|
517
|
+
case 'reasoning': {
|
|
518
|
+
const text = delta ?? part.text;
|
|
519
|
+
if (!text)
|
|
520
|
+
break;
|
|
521
|
+
this.emitEvent({
|
|
522
|
+
type: 'thinking',
|
|
523
|
+
sessionId,
|
|
524
|
+
timestamp: ts,
|
|
525
|
+
data: { text },
|
|
526
|
+
});
|
|
527
|
+
break;
|
|
528
|
+
}
|
|
529
|
+
case 'tool': {
|
|
530
|
+
const toolUseId = part.callID;
|
|
531
|
+
const toolName = part.tool;
|
|
532
|
+
const state = part.state;
|
|
533
|
+
const toolInput = state.input;
|
|
534
|
+
// 从 ToolPart.metadata 中提取 MCP server 信息(注意:metadata 在 part 上,不在 state 上)
|
|
535
|
+
const metadata = part.metadata;
|
|
536
|
+
// 调试日志:查看 metadata 内容
|
|
537
|
+
if (metadata && Object.keys(metadata).length > 0) {
|
|
538
|
+
console.log(`[OpencodeSdkAdapter] Tool "${toolName}" metadata:`, JSON.stringify(metadata));
|
|
539
|
+
}
|
|
540
|
+
const emitToolStart = () => {
|
|
541
|
+
if (session.emittedToolStarts.has(toolUseId))
|
|
542
|
+
return;
|
|
543
|
+
session.emittedToolStarts.add(toolUseId);
|
|
544
|
+
const actionInfo = getToolActionInfo(toolName, toolInput, metadata);
|
|
545
|
+
this.emitEvent({
|
|
546
|
+
type: 'tool_use_start',
|
|
547
|
+
sessionId,
|
|
548
|
+
timestamp: ts,
|
|
549
|
+
data: { toolName, toolInput, toolUseId, ...actionInfo },
|
|
550
|
+
});
|
|
551
|
+
session.adapterSession.messages.push({
|
|
552
|
+
id: uuidv4(),
|
|
553
|
+
sessionId,
|
|
554
|
+
role: 'tool_use',
|
|
555
|
+
content: `${toolName}: ${JSON.stringify(toolInput).slice(0, 100)}`,
|
|
556
|
+
timestamp: ts,
|
|
557
|
+
toolName,
|
|
558
|
+
toolInput,
|
|
559
|
+
toolUseId,
|
|
560
|
+
});
|
|
561
|
+
};
|
|
562
|
+
if (state.status === 'running') {
|
|
563
|
+
emitToolStart();
|
|
564
|
+
const actionInfo = getToolActionInfo(toolName, toolInput, metadata);
|
|
565
|
+
this.emit('status-change', sessionId, 'tool_using', actionInfo);
|
|
566
|
+
}
|
|
567
|
+
else if (state.status === 'completed') {
|
|
568
|
+
emitToolStart();
|
|
569
|
+
const output = state.output;
|
|
570
|
+
this.emitEvent({
|
|
571
|
+
type: 'tool_use_end',
|
|
572
|
+
sessionId,
|
|
573
|
+
timestamp: ts,
|
|
574
|
+
data: { toolName, toolResult: output, isError: false, toolUseId },
|
|
575
|
+
});
|
|
576
|
+
session.emittedToolStarts.delete(toolUseId);
|
|
577
|
+
}
|
|
578
|
+
else if (state.status === 'error') {
|
|
579
|
+
emitToolStart();
|
|
580
|
+
const errorStr = state.error;
|
|
581
|
+
this.emitEvent({
|
|
582
|
+
type: 'tool_use_end',
|
|
583
|
+
sessionId,
|
|
584
|
+
timestamp: ts,
|
|
585
|
+
data: { toolName, toolResult: errorStr, isError: true, toolUseId },
|
|
586
|
+
});
|
|
587
|
+
session.emittedToolStarts.delete(toolUseId);
|
|
588
|
+
}
|
|
589
|
+
break;
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
emitEvent(event) {
|
|
594
|
+
this.emit('event', event);
|
|
595
|
+
}
|
|
596
|
+
startIdleDetection(sessionId) {
|
|
597
|
+
this.stopIdleDetection(sessionId);
|
|
598
|
+
const session = this.sessions.get(sessionId);
|
|
599
|
+
if (!session?.idleCommands?.idleInputCommand)
|
|
600
|
+
return;
|
|
601
|
+
const timer = setInterval(() => {
|
|
602
|
+
this.checkIdleState(sessionId);
|
|
603
|
+
}, 500);
|
|
604
|
+
session.idleTimer = timer;
|
|
605
|
+
}
|
|
606
|
+
stopIdleDetection(sessionId) {
|
|
607
|
+
const session = this.sessions.get(sessionId);
|
|
608
|
+
if (session?.idleTimer) {
|
|
609
|
+
clearInterval(session.idleTimer);
|
|
610
|
+
session.idleTimer = undefined;
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
checkIdleState(sessionId) {
|
|
614
|
+
const session = this.sessions.get(sessionId);
|
|
615
|
+
if (!session || session.adapterSession.status !== 'waiting_input')
|
|
616
|
+
return;
|
|
617
|
+
if (!session.idleCommands?.idleInputCommand)
|
|
618
|
+
return;
|
|
619
|
+
void this.sendMessage(sessionId, session.idleCommands.idleInputCommand);
|
|
620
|
+
this.stopIdleDetection(sessionId);
|
|
621
|
+
}
|
|
622
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OpencodeSdkAdapter.test.d.ts","sourceRoot":"","sources":["../../src/adapter/OpencodeSdkAdapter.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { OpencodeSdkAdapter } from './OpencodeSdkAdapter.js';
|
|
3
|
+
describe('OpencodeSdkAdapter', () => {
|
|
4
|
+
it('should expose opencode provider identity', () => {
|
|
5
|
+
const adapter = new OpencodeSdkAdapter();
|
|
6
|
+
expect(adapter.providerId).toBe('opencode');
|
|
7
|
+
expect(adapter.displayName).toBe('OpenCode');
|
|
8
|
+
});
|
|
9
|
+
it('should start with no active sessions', () => {
|
|
10
|
+
const adapter = new OpencodeSdkAdapter();
|
|
11
|
+
expect(adapter.hasSession('missing-session')).toBe(false);
|
|
12
|
+
expect(adapter.getSessionStatus('missing-session')).toBeUndefined();
|
|
13
|
+
});
|
|
14
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AdapterRegistry } from './AdapterRegistry.js';
|
|
2
|
+
import type { BaseProviderAdapter } from './types.js';
|
|
3
|
+
export interface SdkProviderDefinition {
|
|
4
|
+
runtimeMode: string;
|
|
5
|
+
providerId: string;
|
|
6
|
+
displayName: string;
|
|
7
|
+
defaultCommand: string;
|
|
8
|
+
commandMatchers: string[];
|
|
9
|
+
createAdapter: () => BaseProviderAdapter;
|
|
10
|
+
}
|
|
11
|
+
export declare const SDK_PROVIDER_DEFINITIONS: SdkProviderDefinition[];
|
|
12
|
+
export declare function resolveSdkProviderByCommand(command?: string): SdkProviderDefinition;
|
|
13
|
+
export declare function resolveSdkProviderIdByCommand(command?: string): string;
|
|
14
|
+
export declare function registerSdkProviders(registry: AdapterRegistry, wireAdapterEvents: (adapter: BaseProviderAdapter, definition: SdkProviderDefinition) => void): void;
|
|
15
|
+
//# sourceMappingURL=SdkProviderSpi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SdkProviderSpi.d.ts","sourceRoot":"","sources":["../../src/adapter/SdkProviderSpi.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,EAAE,MAAM,mBAAmB,CAAC;CAC1C;AAED,eAAO,MAAM,wBAAwB,EAAE,qBAAqB,EAyB3D,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,qBAAqB,CAOnF;AAED,wBAAgB,6BAA6B,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,eAAe,EACzB,iBAAiB,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,qBAAqB,KAAK,IAAI,GAC3F,IAAI,CASN"}
|