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 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-claudecode.d.ts","sourceRoot":"","sources":["../../../src/adapters/cc-switch/mcp-claudecode.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAwC7D,qBAAa,oBAAqB,YAAW,WAAW;IAG1C,OAAO,CAAC,QAAQ,CAAC,UAAU;IAFvC,SAAgB,KAAK,EAAG,YAAY,CAAU;gBAEjB,UAAU,EAAE,MAAM;IAEzC,aAAa,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAmBrC,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5C,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CASrD"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClaudeCode MCP Adapter
|
|
3
|
+
*
|
|
4
|
+
* 实现 IMcpAdapter 接口,负责 ClaudeCode 的 MCP 配置读写
|
|
5
|
+
*/
|
|
6
|
+
import { toMcpSpecFromClaudecode, toClaudecodeServer } from './common.js';
|
|
7
|
+
/**
|
|
8
|
+
* JSON 文件读取工具
|
|
9
|
+
*/
|
|
10
|
+
async function readJsonFile(filePath, fallback) {
|
|
11
|
+
try {
|
|
12
|
+
const raw = await import('node:fs/promises').then(fs => fs.readFile(filePath, "utf-8"));
|
|
13
|
+
const parsed = JSON.parse(raw);
|
|
14
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
15
|
+
return parsed;
|
|
16
|
+
}
|
|
17
|
+
return { ...fallback };
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return { ...fallback };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* JSON 文件写入工具
|
|
25
|
+
*/
|
|
26
|
+
async function writeJsonFile(filePath, content) {
|
|
27
|
+
const fs = await import('node:fs/promises');
|
|
28
|
+
const path = await import('node:path');
|
|
29
|
+
const parent = path.dirname(filePath);
|
|
30
|
+
await fs.mkdir(parent, { recursive: true });
|
|
31
|
+
await fs.writeFile(filePath, JSON.stringify(content, null, 2), "utf-8");
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 生成唯一 ID
|
|
35
|
+
*/
|
|
36
|
+
function createId(prefix) {
|
|
37
|
+
const timestamp = Date.now().toString(36);
|
|
38
|
+
const random = Math.random().toString(36).slice(2, 8);
|
|
39
|
+
return `${prefix}_${timestamp}_${random}`;
|
|
40
|
+
}
|
|
41
|
+
export class ClaudecodeMcpAdapter {
|
|
42
|
+
constructor(configPath) {
|
|
43
|
+
this.configPath = configPath;
|
|
44
|
+
this.appId = "claudecode";
|
|
45
|
+
}
|
|
46
|
+
async importServers() {
|
|
47
|
+
const config = await readJsonFile(this.configPath, {});
|
|
48
|
+
const entries = Object.entries(config.mcpServers ?? {});
|
|
49
|
+
return entries.map(([name, server]) => ({
|
|
50
|
+
id: createId("mcp"),
|
|
51
|
+
name,
|
|
52
|
+
server: toMcpSpecFromClaudecode(server),
|
|
53
|
+
apps: {
|
|
54
|
+
claude: false,
|
|
55
|
+
claudecode: true,
|
|
56
|
+
codex: false,
|
|
57
|
+
gemini: false,
|
|
58
|
+
opencode: false,
|
|
59
|
+
openclaw: false,
|
|
60
|
+
},
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
async syncServer(server) {
|
|
64
|
+
const config = await readJsonFile(this.configPath, {});
|
|
65
|
+
config.mcpServers = config.mcpServers ?? {};
|
|
66
|
+
config.mcpServers[server.name] = toClaudecodeServer(server.server);
|
|
67
|
+
await writeJsonFile(this.configPath, config);
|
|
68
|
+
}
|
|
69
|
+
async removeServer(server) {
|
|
70
|
+
const config = await readJsonFile(this.configPath, {});
|
|
71
|
+
if (!config.mcpServers) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
delete config.mcpServers[server.name];
|
|
75
|
+
await writeJsonFile(this.configPath, config);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex MCP Adapter
|
|
3
|
+
*
|
|
4
|
+
* Codex does not receive per-session MCP servers from the current SDK surface.
|
|
5
|
+
* This adapter persists MCP servers into Codex's config.toml while preserving
|
|
6
|
+
* unrelated user-owned config text.
|
|
7
|
+
*/
|
|
8
|
+
import type { IMcpAdapter, McpServer } from '@cc-switch/sdk';
|
|
9
|
+
export declare class CodexMcpAdapter implements IMcpAdapter {
|
|
10
|
+
private readonly configPath;
|
|
11
|
+
readonly appId: "codex";
|
|
12
|
+
constructor(configPath: string);
|
|
13
|
+
importServers(): Promise<McpServer[]>;
|
|
14
|
+
syncServer(server: McpServer): Promise<void>;
|
|
15
|
+
removeServer(server: McpServer): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=mcp-codex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-codex.d.ts","sourceRoot":"","sources":["../../../src/adapters/cc-switch/mcp-codex.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAiB,MAAM,gBAAgB,CAAC;AAuP5E,qBAAa,eAAgB,YAAW,WAAW;IAGrC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAFvC,SAAgB,KAAK,EAAG,OAAO,CAAU;gBAEZ,UAAU,EAAE,MAAM;IAEzC,aAAa,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAiBrC,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5C,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CAQrD"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex MCP Adapter
|
|
3
|
+
*
|
|
4
|
+
* Codex does not receive per-session MCP servers from the current SDK surface.
|
|
5
|
+
* This adapter persists MCP servers into Codex's config.toml while preserving
|
|
6
|
+
* unrelated user-owned config text.
|
|
7
|
+
*/
|
|
8
|
+
const MCP_TABLE_PATTERN = /^\s*\[mcp_servers\.("(?:\\.|[^"])+"|[A-Za-z0-9_-]+)\]\s*$/;
|
|
9
|
+
const TABLE_PATTERN = /^\s*\[[^\]]+\]\s*$/;
|
|
10
|
+
const KEY_VALUE_PATTERN = /^\s*([A-Za-z0-9_-]+)\s*=\s*(.*)\s*$/;
|
|
11
|
+
async function readTextFile(filePath) {
|
|
12
|
+
try {
|
|
13
|
+
const fs = await import('node:fs/promises');
|
|
14
|
+
return await fs.readFile(filePath, 'utf-8');
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return '';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async function writeTextFile(filePath, content) {
|
|
21
|
+
const fs = await import('node:fs/promises');
|
|
22
|
+
const path = await import('node:path');
|
|
23
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
24
|
+
await fs.writeFile(filePath, content, 'utf-8');
|
|
25
|
+
}
|
|
26
|
+
function createId(prefix) {
|
|
27
|
+
const timestamp = Date.now().toString(36);
|
|
28
|
+
const random = Math.random().toString(36).slice(2, 8);
|
|
29
|
+
return `${prefix}_${timestamp}_${random}`;
|
|
30
|
+
}
|
|
31
|
+
function escapeTomlString(value) {
|
|
32
|
+
return String(value).replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
33
|
+
}
|
|
34
|
+
function unescapeTomlString(value) {
|
|
35
|
+
return value.replace(/\\"/g, '"').replace(/\\\\/g, '\\');
|
|
36
|
+
}
|
|
37
|
+
function quoteTomlString(value) {
|
|
38
|
+
return `"${escapeTomlString(value)}"`;
|
|
39
|
+
}
|
|
40
|
+
function parseTomlString(raw) {
|
|
41
|
+
const trimmed = raw.trim();
|
|
42
|
+
if (!trimmed.startsWith('"') || !trimmed.endsWith('"')) {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
return unescapeTomlString(trimmed.slice(1, -1));
|
|
46
|
+
}
|
|
47
|
+
function parseTomlStringArray(raw) {
|
|
48
|
+
const trimmed = raw.trim();
|
|
49
|
+
if (!trimmed.startsWith('[') || !trimmed.endsWith(']')) {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
const values = [];
|
|
53
|
+
let current = '';
|
|
54
|
+
let inString = false;
|
|
55
|
+
let escaping = false;
|
|
56
|
+
for (const char of trimmed.slice(1, -1)) {
|
|
57
|
+
if (escaping) {
|
|
58
|
+
current += char;
|
|
59
|
+
escaping = false;
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (char === '\\' && inString) {
|
|
63
|
+
escaping = true;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (char === '"') {
|
|
67
|
+
if (inString) {
|
|
68
|
+
values.push(unescapeTomlString(current));
|
|
69
|
+
current = '';
|
|
70
|
+
}
|
|
71
|
+
inString = !inString;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (inString) {
|
|
75
|
+
current += char;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return values;
|
|
79
|
+
}
|
|
80
|
+
function formatTomlArray(values) {
|
|
81
|
+
return `[${(values ?? []).map(quoteTomlString).join(', ')}]`;
|
|
82
|
+
}
|
|
83
|
+
function parseTableName(rawName) {
|
|
84
|
+
const trimmed = rawName.trim();
|
|
85
|
+
if (trimmed.startsWith('"') && trimmed.endsWith('"')) {
|
|
86
|
+
return unescapeTomlString(trimmed.slice(1, -1));
|
|
87
|
+
}
|
|
88
|
+
return trimmed;
|
|
89
|
+
}
|
|
90
|
+
function isNestedMcpTableForServer(line, serverName) {
|
|
91
|
+
const trimmed = line.trim();
|
|
92
|
+
const quotedPrefix = `[mcp_servers.${quoteTomlString(serverName)}.`;
|
|
93
|
+
const barePrefix = `[mcp_servers.${serverName}.`;
|
|
94
|
+
return trimmed.startsWith(quotedPrefix) || trimmed.startsWith(barePrefix);
|
|
95
|
+
}
|
|
96
|
+
function findMcpBlocks(raw) {
|
|
97
|
+
const lines = raw.split(/\r?\n/);
|
|
98
|
+
const blocks = [];
|
|
99
|
+
let currentName = null;
|
|
100
|
+
let currentStart = null;
|
|
101
|
+
const flushCurrent = (end) => {
|
|
102
|
+
if (currentName === null || currentStart === null) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
blocks.push({
|
|
106
|
+
name: currentName,
|
|
107
|
+
start: currentStart,
|
|
108
|
+
end,
|
|
109
|
+
lines: lines.slice(currentStart, end),
|
|
110
|
+
});
|
|
111
|
+
currentName = null;
|
|
112
|
+
currentStart = null;
|
|
113
|
+
};
|
|
114
|
+
lines.forEach((line, index) => {
|
|
115
|
+
const mcpMatch = line.match(MCP_TABLE_PATTERN);
|
|
116
|
+
if (mcpMatch) {
|
|
117
|
+
flushCurrent(index);
|
|
118
|
+
currentName = parseTableName(mcpMatch[1]);
|
|
119
|
+
currentStart = index;
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (line.match(TABLE_PATTERN) && currentName && !isNestedMcpTableForServer(line, currentName)) {
|
|
123
|
+
flushCurrent(index);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
flushCurrent(lines.length);
|
|
127
|
+
return blocks;
|
|
128
|
+
}
|
|
129
|
+
function buildCodexMcpBlock(server) {
|
|
130
|
+
const spec = server.server;
|
|
131
|
+
const lines = [`[mcp_servers.${quoteTomlString(server.name)}]`];
|
|
132
|
+
if (spec.command) {
|
|
133
|
+
lines.push(`command = ${quoteTomlString(spec.command)}`);
|
|
134
|
+
}
|
|
135
|
+
if (spec.args) {
|
|
136
|
+
lines.push(`args = ${formatTomlArray(spec.args)}`);
|
|
137
|
+
}
|
|
138
|
+
if (spec.cwd) {
|
|
139
|
+
lines.push(`cwd = ${quoteTomlString(spec.cwd)}`);
|
|
140
|
+
}
|
|
141
|
+
if (spec.url) {
|
|
142
|
+
lines.push(`url = ${quoteTomlString(spec.url)}`);
|
|
143
|
+
}
|
|
144
|
+
const envEntries = Object.entries(spec.env ?? {}).sort(([left], [right]) => left.localeCompare(right));
|
|
145
|
+
if (envEntries.length > 0) {
|
|
146
|
+
lines.push('');
|
|
147
|
+
lines.push(`[mcp_servers.${quoteTomlString(server.name)}.env]`);
|
|
148
|
+
for (const [key, value] of envEntries) {
|
|
149
|
+
lines.push(`${key} = ${quoteTomlString(value)}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return lines.join('\n');
|
|
153
|
+
}
|
|
154
|
+
function removeCodexMcpBlock(raw, serverName) {
|
|
155
|
+
const lines = raw.split(/\r?\n/);
|
|
156
|
+
const block = findMcpBlocks(raw).find((entry) => entry.name === serverName);
|
|
157
|
+
if (!block) {
|
|
158
|
+
return raw;
|
|
159
|
+
}
|
|
160
|
+
const nextLines = [...lines.slice(0, block.start), ...lines.slice(block.end)];
|
|
161
|
+
return nextLines.join('\n').replace(/\n{3,}/g, '\n\n').trimEnd();
|
|
162
|
+
}
|
|
163
|
+
function upsertCodexMcpBlock(raw, server) {
|
|
164
|
+
const withoutExisting = removeCodexMcpBlock(raw, server.name).trimEnd();
|
|
165
|
+
const block = buildCodexMcpBlock(server);
|
|
166
|
+
if (!withoutExisting) {
|
|
167
|
+
return `${block}\n`;
|
|
168
|
+
}
|
|
169
|
+
return `${withoutExisting}\n\n${block}\n`;
|
|
170
|
+
}
|
|
171
|
+
function parseCodexBlock(block) {
|
|
172
|
+
const spec = { type: 'stdio' };
|
|
173
|
+
const env = {};
|
|
174
|
+
let inEnv = false;
|
|
175
|
+
for (const line of block.lines.slice(1)) {
|
|
176
|
+
const trimmed = line.trim();
|
|
177
|
+
if (!trimmed || trimmed.startsWith('#')) {
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
if (trimmed === `[mcp_servers.${quoteTomlString(block.name)}.env]`) {
|
|
181
|
+
inEnv = true;
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
const match = line.match(KEY_VALUE_PATTERN);
|
|
185
|
+
if (!match) {
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
const [, key, rawValue] = match;
|
|
189
|
+
if (inEnv) {
|
|
190
|
+
const value = parseTomlString(rawValue);
|
|
191
|
+
if (value !== undefined) {
|
|
192
|
+
env[key] = value;
|
|
193
|
+
}
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
if (key === 'args') {
|
|
197
|
+
spec.args = parseTomlStringArray(rawValue) ?? [];
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
if (key === 'command' || key === 'cwd' || key === 'url') {
|
|
201
|
+
const value = parseTomlString(rawValue);
|
|
202
|
+
if (value !== undefined) {
|
|
203
|
+
spec[key] = value;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (Object.keys(env).length > 0) {
|
|
208
|
+
spec.env = env;
|
|
209
|
+
}
|
|
210
|
+
if (spec.url) {
|
|
211
|
+
spec.type = 'sse';
|
|
212
|
+
}
|
|
213
|
+
return spec;
|
|
214
|
+
}
|
|
215
|
+
export class CodexMcpAdapter {
|
|
216
|
+
constructor(configPath) {
|
|
217
|
+
this.configPath = configPath;
|
|
218
|
+
this.appId = 'codex';
|
|
219
|
+
}
|
|
220
|
+
async importServers() {
|
|
221
|
+
const raw = await readTextFile(this.configPath);
|
|
222
|
+
return findMcpBlocks(raw).map((block) => ({
|
|
223
|
+
id: createId('mcp'),
|
|
224
|
+
name: block.name,
|
|
225
|
+
server: parseCodexBlock(block),
|
|
226
|
+
apps: {
|
|
227
|
+
claude: false,
|
|
228
|
+
claudecode: false,
|
|
229
|
+
codex: true,
|
|
230
|
+
gemini: false,
|
|
231
|
+
opencode: false,
|
|
232
|
+
openclaw: false,
|
|
233
|
+
},
|
|
234
|
+
}));
|
|
235
|
+
}
|
|
236
|
+
async syncServer(server) {
|
|
237
|
+
const raw = await readTextFile(this.configPath);
|
|
238
|
+
await writeTextFile(this.configPath, upsertCodexMcpBlock(raw, server));
|
|
239
|
+
}
|
|
240
|
+
async removeServer(server) {
|
|
241
|
+
const raw = await readTextFile(this.configPath);
|
|
242
|
+
const next = removeCodexMcpBlock(raw, server.name);
|
|
243
|
+
if (next === raw) {
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
await writeTextFile(this.configPath, next ? `${next}\n` : '');
|
|
247
|
+
}
|
|
248
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-codex.test.d.ts","sourceRoot":"","sources":["../../../src/adapters/cc-switch/mcp-codex.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
5
|
+
import { CodexMcpAdapter } from './mcp-codex.js';
|
|
6
|
+
let tempDir;
|
|
7
|
+
let configPath;
|
|
8
|
+
function buildServer(name = 'aws-client-agent-mcp') {
|
|
9
|
+
return {
|
|
10
|
+
id: 'mcp_test',
|
|
11
|
+
name,
|
|
12
|
+
server: {
|
|
13
|
+
type: 'stdio',
|
|
14
|
+
command: 'node',
|
|
15
|
+
args: ['D:\\code\\AgentsWorkStudio\\aws-runtime-bridge\\package\\cc-switch-sdk\\dist\\index.js'],
|
|
16
|
+
env: {
|
|
17
|
+
AWS_AGENT_ID: 'agent-1',
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
apps: {
|
|
21
|
+
claude: false,
|
|
22
|
+
claudecode: false,
|
|
23
|
+
codex: true,
|
|
24
|
+
gemini: false,
|
|
25
|
+
opencode: false,
|
|
26
|
+
openclaw: false,
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
beforeEach(async () => {
|
|
31
|
+
tempDir = await mkdtemp(path.join(os.tmpdir(), 'codex-mcp-adapter-'));
|
|
32
|
+
configPath = path.join(tempDir, 'config.toml');
|
|
33
|
+
});
|
|
34
|
+
afterEach(async () => {
|
|
35
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
36
|
+
});
|
|
37
|
+
describe('CodexMcpAdapter', () => {
|
|
38
|
+
it('creates a Codex config with an MCP block when none exists', async () => {
|
|
39
|
+
const adapter = new CodexMcpAdapter(configPath);
|
|
40
|
+
await adapter.syncServer(buildServer());
|
|
41
|
+
const written = await readFile(configPath, 'utf-8');
|
|
42
|
+
expect(written).toContain('[mcp_servers."aws-client-agent-mcp"]');
|
|
43
|
+
expect(written).toContain('command = "node"');
|
|
44
|
+
expect(written).toContain('args = ["D:\\\\code\\\\AgentsWorkStudio\\\\aws-runtime-bridge\\\\package\\\\cc-switch-sdk\\\\dist\\\\index.js"]');
|
|
45
|
+
expect(written).toContain('[mcp_servers."aws-client-agent-mcp".env]');
|
|
46
|
+
expect(written).toContain('AWS_AGENT_ID = "agent-1"');
|
|
47
|
+
});
|
|
48
|
+
it('preserves unrelated Codex model/provider config while appending MCP config', async () => {
|
|
49
|
+
const existing = [
|
|
50
|
+
'# user comment',
|
|
51
|
+
'model = "gpt-5.1"',
|
|
52
|
+
'model_provider = "custom"',
|
|
53
|
+
'',
|
|
54
|
+
'[model_providers.custom]',
|
|
55
|
+
'name = "Custom"',
|
|
56
|
+
'base_url = "https://example.test/v1"',
|
|
57
|
+
'',
|
|
58
|
+
].join('\n');
|
|
59
|
+
await writeFile(configPath, existing, 'utf-8');
|
|
60
|
+
const adapter = new CodexMcpAdapter(configPath);
|
|
61
|
+
await adapter.syncServer(buildServer());
|
|
62
|
+
const written = await readFile(configPath, 'utf-8');
|
|
63
|
+
expect(written).toContain(existing.trimEnd());
|
|
64
|
+
expect(written).toContain('[mcp_servers."aws-client-agent-mcp"]');
|
|
65
|
+
});
|
|
66
|
+
it('updates an existing MCP block without duplicating it', async () => {
|
|
67
|
+
const adapter = new CodexMcpAdapter(configPath);
|
|
68
|
+
await adapter.syncServer(buildServer());
|
|
69
|
+
await adapter.syncServer({
|
|
70
|
+
...buildServer(),
|
|
71
|
+
server: {
|
|
72
|
+
type: 'stdio',
|
|
73
|
+
command: 'node',
|
|
74
|
+
args: ['new-index.js'],
|
|
75
|
+
env: {
|
|
76
|
+
AWS_AGENT_ID: 'agent-2',
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
const written = await readFile(configPath, 'utf-8');
|
|
81
|
+
expect(written.match(/\[mcp_servers\."aws-client-agent-mcp"\]/g)).toHaveLength(1);
|
|
82
|
+
expect(written).toContain('args = ["new-index.js"]');
|
|
83
|
+
expect(written).toContain('AWS_AGENT_ID = "agent-2"');
|
|
84
|
+
expect(written).not.toContain('agent-1');
|
|
85
|
+
});
|
|
86
|
+
it('removes the MCP block and its nested env table only', async () => {
|
|
87
|
+
const adapter = new CodexMcpAdapter(configPath);
|
|
88
|
+
await writeFile(configPath, [
|
|
89
|
+
'model = "gpt-5.1"',
|
|
90
|
+
'',
|
|
91
|
+
'[mcp_servers."aws-client-agent-mcp"]',
|
|
92
|
+
'command = "node"',
|
|
93
|
+
'args = ["old.js"]',
|
|
94
|
+
'',
|
|
95
|
+
'[mcp_servers."aws-client-agent-mcp".env]',
|
|
96
|
+
'AWS_AGENT_ID = "agent-1"',
|
|
97
|
+
'',
|
|
98
|
+
'[model_providers.custom]',
|
|
99
|
+
'name = "Custom"',
|
|
100
|
+
'',
|
|
101
|
+
].join('\n'), 'utf-8');
|
|
102
|
+
await adapter.removeServer(buildServer());
|
|
103
|
+
const written = await readFile(configPath, 'utf-8');
|
|
104
|
+
expect(written).toContain('model = "gpt-5.1"');
|
|
105
|
+
expect(written).toContain('[model_providers.custom]');
|
|
106
|
+
expect(written).not.toContain('aws-client-agent-mcp');
|
|
107
|
+
expect(written).not.toContain('AWS_AGENT_ID');
|
|
108
|
+
});
|
|
109
|
+
it('imports Codex MCP blocks', async () => {
|
|
110
|
+
const adapter = new CodexMcpAdapter(configPath);
|
|
111
|
+
await adapter.syncServer(buildServer());
|
|
112
|
+
const servers = await adapter.importServers();
|
|
113
|
+
expect(servers).toHaveLength(1);
|
|
114
|
+
expect(servers[0]).toMatchObject({
|
|
115
|
+
name: 'aws-client-agent-mcp',
|
|
116
|
+
apps: { codex: true },
|
|
117
|
+
server: {
|
|
118
|
+
type: 'stdio',
|
|
119
|
+
command: 'node',
|
|
120
|
+
args: ['D:\\code\\AgentsWorkStudio\\aws-runtime-bridge\\package\\cc-switch-sdk\\dist\\index.js'],
|
|
121
|
+
env: { AWS_AGENT_ID: 'agent-1' },
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode MCP Adapter
|
|
3
|
+
*
|
|
4
|
+
* 实现 IMcpAdapter 接口,负责 OpenCode 的 MCP 配置读写
|
|
5
|
+
*/
|
|
6
|
+
import type { IMcpAdapter, McpServer } from '@cc-switch/sdk';
|
|
7
|
+
export declare class OpenCodeMcpAdapter implements IMcpAdapter {
|
|
8
|
+
private readonly configPath;
|
|
9
|
+
readonly appId: "opencode";
|
|
10
|
+
constructor(configPath: string);
|
|
11
|
+
/**
|
|
12
|
+
* 读取 OpenCode MCP 映射,优先使用合法的 mcp 字段,兼容历史错误写入的 mcpServers。
|
|
13
|
+
*/
|
|
14
|
+
private getMcpMap;
|
|
15
|
+
/**
|
|
16
|
+
* 将 MCP 服务器写回 OpenCode 配置,只保留合法的 mcp 字段并清理错误的 mcpServers。
|
|
17
|
+
*/
|
|
18
|
+
private saveMcpMap;
|
|
19
|
+
importServers(): Promise<McpServer[]>;
|
|
20
|
+
syncServer(server: McpServer): Promise<void>;
|
|
21
|
+
removeServer(server: McpServer): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=mcp-opencode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-opencode.d.ts","sourceRoot":"","sources":["../../../src/adapters/cc-switch/mcp-opencode.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAwC7D,qBAAa,kBAAmB,YAAW,WAAW;IAGxC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAFvC,SAAgB,KAAK,EAAG,UAAU,CAAU;gBAEf,UAAU,EAAE,MAAM;IAE/C;;OAEG;IACH,OAAO,CAAC,SAAS;IAUjB;;OAEG;YACW,UAAU;IAQlB,aAAa,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAmBrC,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5C,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CAUrD"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode MCP Adapter
|
|
3
|
+
*
|
|
4
|
+
* 实现 IMcpAdapter 接口,负责 OpenCode 的 MCP 配置读写
|
|
5
|
+
*/
|
|
6
|
+
import { toMcpSpecFromOpenCode, toOpenCodeServer } from './common.js';
|
|
7
|
+
/**
|
|
8
|
+
* JSON 文件读取工具
|
|
9
|
+
*/
|
|
10
|
+
async function readJsonFile(filePath, fallback) {
|
|
11
|
+
try {
|
|
12
|
+
const raw = await import('node:fs/promises').then(fs => fs.readFile(filePath, "utf-8"));
|
|
13
|
+
const parsed = JSON.parse(raw);
|
|
14
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
15
|
+
return parsed;
|
|
16
|
+
}
|
|
17
|
+
return { ...fallback };
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return { ...fallback };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* JSON 文件写入工具
|
|
25
|
+
*/
|
|
26
|
+
async function writeJsonFile(filePath, content) {
|
|
27
|
+
const fs = await import('node:fs/promises');
|
|
28
|
+
const path = await import('node:path');
|
|
29
|
+
const parent = path.dirname(filePath);
|
|
30
|
+
await fs.mkdir(parent, { recursive: true });
|
|
31
|
+
await fs.writeFile(filePath, JSON.stringify(content, null, 2), "utf-8");
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 生成唯一 ID
|
|
35
|
+
*/
|
|
36
|
+
function createId(prefix) {
|
|
37
|
+
const timestamp = Date.now().toString(36);
|
|
38
|
+
const random = Math.random().toString(36).slice(2, 8);
|
|
39
|
+
return `${prefix}_${timestamp}_${random}`;
|
|
40
|
+
}
|
|
41
|
+
export class OpenCodeMcpAdapter {
|
|
42
|
+
constructor(configPath) {
|
|
43
|
+
this.configPath = configPath;
|
|
44
|
+
this.appId = "opencode";
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 读取 OpenCode MCP 映射,优先使用合法的 mcp 字段,兼容历史错误写入的 mcpServers。
|
|
48
|
+
*/
|
|
49
|
+
getMcpMap(config) {
|
|
50
|
+
if (config.mcp && typeof config.mcp === "object") {
|
|
51
|
+
return config.mcp;
|
|
52
|
+
}
|
|
53
|
+
if (config.mcpServers && typeof config.mcpServers === "object") {
|
|
54
|
+
return config.mcpServers;
|
|
55
|
+
}
|
|
56
|
+
return {};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 将 MCP 服务器写回 OpenCode 配置,只保留合法的 mcp 字段并清理错误的 mcpServers。
|
|
60
|
+
*/
|
|
61
|
+
async saveMcpMap(config, mcp) {
|
|
62
|
+
config.mcp = mcp;
|
|
63
|
+
if ("mcpServers" in config) {
|
|
64
|
+
delete config.mcpServers;
|
|
65
|
+
}
|
|
66
|
+
await writeJsonFile(this.configPath, config);
|
|
67
|
+
}
|
|
68
|
+
async importServers() {
|
|
69
|
+
const config = await readJsonFile(this.configPath, {});
|
|
70
|
+
const entries = Object.entries(this.getMcpMap(config));
|
|
71
|
+
return entries.map(([name, server]) => ({
|
|
72
|
+
id: createId("mcp"),
|
|
73
|
+
name,
|
|
74
|
+
server: toMcpSpecFromOpenCode(server),
|
|
75
|
+
apps: {
|
|
76
|
+
claude: false,
|
|
77
|
+
claudecode: false,
|
|
78
|
+
codex: false,
|
|
79
|
+
gemini: false,
|
|
80
|
+
opencode: true,
|
|
81
|
+
openclaw: false,
|
|
82
|
+
},
|
|
83
|
+
}));
|
|
84
|
+
}
|
|
85
|
+
async syncServer(server) {
|
|
86
|
+
const config = await readJsonFile(this.configPath, {});
|
|
87
|
+
const mcp = this.getMcpMap(config);
|
|
88
|
+
mcp[server.name] = toOpenCodeServer(server.server);
|
|
89
|
+
await this.saveMcpMap(config, mcp);
|
|
90
|
+
}
|
|
91
|
+
async removeServer(server) {
|
|
92
|
+
const config = await readJsonFile(this.configPath, {});
|
|
93
|
+
const mcp = this.getMcpMap(config);
|
|
94
|
+
if (!mcp[server.name]) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
delete mcp[server.name];
|
|
98
|
+
await this.saveMcpMap(config, mcp);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Placeholder MCP Adapter
|
|
3
|
+
*
|
|
4
|
+
* 用于尚未实现的 AI 工具(Codex、Gemini、OpenClaw)
|
|
5
|
+
*/
|
|
6
|
+
import type { AppId, IMcpAdapter, McpServer } from '@cc-switch/sdk';
|
|
7
|
+
export declare class PlaceholderMcpAdapter implements IMcpAdapter {
|
|
8
|
+
readonly appId: AppId;
|
|
9
|
+
constructor(appId: AppId);
|
|
10
|
+
importServers(): Promise<McpServer[]>;
|
|
11
|
+
syncServer(): Promise<void>;
|
|
12
|
+
removeServer(): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=mcp-placeholder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-placeholder.d.ts","sourceRoot":"","sources":["../../../src/adapters/cc-switch/mcp-placeholder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEpE,qBAAa,qBAAsB,YAAW,WAAW;aAC3B,KAAK,EAAE,KAAK;gBAAZ,KAAK,EAAE,KAAK;IAElC,aAAa,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAIrC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;CAGpC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Placeholder MCP Adapter
|
|
3
|
+
*
|
|
4
|
+
* 用于尚未实现的 AI 工具(Codex、Gemini、OpenClaw)
|
|
5
|
+
*/
|
|
6
|
+
export class PlaceholderMcpAdapter {
|
|
7
|
+
constructor(appId) {
|
|
8
|
+
this.appId = appId;
|
|
9
|
+
}
|
|
10
|
+
async importServers() {
|
|
11
|
+
return [];
|
|
12
|
+
}
|
|
13
|
+
async syncServer() {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
async removeServer() {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Skill Adapter
|
|
3
|
+
*
|
|
4
|
+
* 实现 ISkillAdapter 接口,负责 Claude Desktop 的 Skill 目录管理
|
|
5
|
+
*/
|
|
6
|
+
import type { ISkillAdapter, InstalledSkill, SkillSyncMethod } from '@cc-switch/sdk';
|
|
7
|
+
export declare class ClaudeSkillAdapter implements ISkillAdapter {
|
|
8
|
+
private readonly skillsDir;
|
|
9
|
+
readonly appId: "claude";
|
|
10
|
+
constructor(skillsDir: string);
|
|
11
|
+
importSkills(): Promise<Array<Pick<InstalledSkill, "id" | "name" | "directory" | "description">>>;
|
|
12
|
+
syncSkill(skill: InstalledSkill, sourceDir: string, method: SkillSyncMethod): Promise<void>;
|
|
13
|
+
removeSkill(skill: InstalledSkill): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=skill-claude.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-claude.d.ts","sourceRoot":"","sources":["../../../src/adapters/cc-switch/skill-claude.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAoErF,qBAAa,kBAAmB,YAAW,aAAa;IAG1C,OAAO,CAAC,QAAQ,CAAC,SAAS;IAFtC,SAAgB,KAAK,EAAG,QAAQ,CAAU;gBAEb,SAAS,EAAE,MAAM;IAExC,YAAY,IAAI,OAAO,CAC3B,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,GAAG,MAAM,GAAG,WAAW,GAAG,aAAa,CAAC,CAAC,CACzE;IAmBK,SAAS,CACb,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,IAAI,CAAC;IAMV,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAKxD"}
|