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,91 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { SDK_PROVIDER_DEFINITIONS } from '../adapter/SdkProviderSpi.js';
|
|
3
|
+
import { AWS_MCP_SERVER_NAME } from '../services/aws-client-agent-mcp.js';
|
|
4
|
+
import { resolveSdkProviderId } from './terminal.js';
|
|
5
|
+
describe('terminal route validation', () => {
|
|
6
|
+
it('requires agentId and workspacePath for start', () => {
|
|
7
|
+
const validateStartRequest = (body) => {
|
|
8
|
+
if (!body.agentId || !body.workspacePath)
|
|
9
|
+
return { valid: false, error: 'agentId and workspacePath are required' };
|
|
10
|
+
return { valid: true };
|
|
11
|
+
};
|
|
12
|
+
expect(validateStartRequest({}).valid).toBe(false);
|
|
13
|
+
expect(validateStartRequest({ agentId: 'agent-1', workspacePath: '/path' }).valid).toBe(true);
|
|
14
|
+
});
|
|
15
|
+
it('uses default command when not provided', () => {
|
|
16
|
+
const resolveCommand = (command) => command || 'claude';
|
|
17
|
+
expect(resolveCommand(undefined)).toBe('claude');
|
|
18
|
+
expect(resolveCommand('custom-cli')).toBe('custom-cli');
|
|
19
|
+
});
|
|
20
|
+
it('requires sessionId and input for input', () => {
|
|
21
|
+
const validateInputRequest = (body) => {
|
|
22
|
+
if (!body.sessionId || body.input === undefined || body.input === null) {
|
|
23
|
+
return { valid: false, error: 'sessionId and input are required' };
|
|
24
|
+
}
|
|
25
|
+
return { valid: true };
|
|
26
|
+
};
|
|
27
|
+
expect(validateInputRequest({}).valid).toBe(false);
|
|
28
|
+
expect(validateInputRequest({ sessionId: 'session-1', input: 'ls' }).valid).toBe(true);
|
|
29
|
+
});
|
|
30
|
+
it('requires sessionId, cols, and rows for resize', () => {
|
|
31
|
+
const validateResizeRequest = (body) => {
|
|
32
|
+
if (!body.sessionId || !body.cols || !body.rows)
|
|
33
|
+
return { valid: false, error: 'sessionId, cols, rows are required' };
|
|
34
|
+
return { valid: true };
|
|
35
|
+
};
|
|
36
|
+
expect(validateResizeRequest({}).valid).toBe(false);
|
|
37
|
+
expect(validateResizeRequest({ sessionId: 'session-1', cols: 120, rows: 30 }).valid).toBe(true);
|
|
38
|
+
});
|
|
39
|
+
it('requires sessionId for stop', () => {
|
|
40
|
+
const validateStopRequest = (body) => {
|
|
41
|
+
if (!body.sessionId)
|
|
42
|
+
return { valid: false, error: 'sessionId is required' };
|
|
43
|
+
return { valid: true };
|
|
44
|
+
};
|
|
45
|
+
expect(validateStopRequest({}).valid).toBe(false);
|
|
46
|
+
expect(validateStopRequest({ sessionId: 'session-1' }).valid).toBe(true);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
describe('terminal configuration', () => {
|
|
50
|
+
it('selects correct shell for platform', () => {
|
|
51
|
+
const getShellConfig = (platform) => {
|
|
52
|
+
if (platform === 'win32')
|
|
53
|
+
return { shell: 'powershell.exe', args: ['-NoLogo'] };
|
|
54
|
+
return { shell: 'bash', args: [] };
|
|
55
|
+
};
|
|
56
|
+
expect(getShellConfig('win32').shell).toBe('powershell.exe');
|
|
57
|
+
expect(getShellConfig('linux').shell).toBe('bash');
|
|
58
|
+
});
|
|
59
|
+
it('builds correct terminal environment', () => {
|
|
60
|
+
const buildTerminalEnv = (agentId, baseEnv) => ({
|
|
61
|
+
...baseEnv,
|
|
62
|
+
AWS_AGENT_ID: agentId,
|
|
63
|
+
});
|
|
64
|
+
const env = buildTerminalEnv('agent-123', { PATH: '/usr/bin' });
|
|
65
|
+
expect(env.AWS_AGENT_ID).toBe('agent-123');
|
|
66
|
+
});
|
|
67
|
+
it('uses aws-mcp as the default injected MCP server name', () => {
|
|
68
|
+
expect(AWS_MCP_SERVER_NAME).toBe('aws-mcp');
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
describe('resolveSdkProviderId', () => {
|
|
72
|
+
it('exposes codex through the SDK provider SPI', () => {
|
|
73
|
+
expect(SDK_PROVIDER_DEFINITIONS.map((definition) => definition.runtimeMode)).toContain('codex');
|
|
74
|
+
expect(SDK_PROVIDER_DEFINITIONS.find((definition) => definition.runtimeMode === 'codex')).toMatchObject({
|
|
75
|
+
providerId: 'codex',
|
|
76
|
+
defaultCommand: 'codex',
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
it('resolves codex commands to codex provider', () => {
|
|
80
|
+
expect(resolveSdkProviderId('codex')).toBe('codex');
|
|
81
|
+
expect(resolveSdkProviderId('npx codex --model gpt-5-codex')).toBe('codex');
|
|
82
|
+
});
|
|
83
|
+
it('resolves opencode commands to opencode provider', () => {
|
|
84
|
+
expect(resolveSdkProviderId('opencode')).toBe('opencode');
|
|
85
|
+
});
|
|
86
|
+
it('falls back to claude-code for claude or unknown commands', () => {
|
|
87
|
+
expect(resolveSdkProviderId('claude')).toBe('claude-code');
|
|
88
|
+
expect(resolveSdkProviderId('custom-binary')).toBe('claude-code');
|
|
89
|
+
expect(resolveSdkProviderId(undefined)).toBe('claude-code');
|
|
90
|
+
});
|
|
91
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yml.d.ts","sourceRoot":"","sources":["../../src/routes/yml.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAiBH,eAAO,MAAM,SAAS,4CAAW,CAAC"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YAML 配置文件 API 路由
|
|
3
|
+
*
|
|
4
|
+
* 提供 YAML 配置文件的读取和写入功能
|
|
5
|
+
*/
|
|
6
|
+
import { Router } from 'express';
|
|
7
|
+
import { promises as fs } from 'node:fs';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
import { validateToken } from '../middleware/auth.js';
|
|
10
|
+
import { createLogger } from '../utils/logger.js';
|
|
11
|
+
import { resolveWorkspaceFilePath } from '../utils/path-utils.js';
|
|
12
|
+
import { loadYmlWithUpwardSearch, extractAgentConfigOrTemplate, generateEmptyTemplate, autoFillPathInYml } from '../utils/yaml-utils.js';
|
|
13
|
+
const log = createLogger('yml-routes');
|
|
14
|
+
export const ymlRouter = Router();
|
|
15
|
+
/**
|
|
16
|
+
* 读取 YAML 配置文件
|
|
17
|
+
* POST /runtime/read-yml
|
|
18
|
+
*/
|
|
19
|
+
ymlRouter.post('/read-yml', validateToken, async (req, res) => {
|
|
20
|
+
const { workspacePath, ymlPath } = req.body || {};
|
|
21
|
+
try {
|
|
22
|
+
const { normalizedWorkspace, resolvedTarget } = resolveWorkspaceFilePath(workspacePath, ymlPath, 'vibe-coding/my.yml');
|
|
23
|
+
const providedPathStr = ymlPath ? String(ymlPath).trim() || 'vibe-coding/my.yml' : 'vibe-coding/my.yml';
|
|
24
|
+
if (path.isAbsolute(providedPathStr)) {
|
|
25
|
+
let content = '';
|
|
26
|
+
let exists = true;
|
|
27
|
+
try {
|
|
28
|
+
content = await fs.readFile(resolvedTarget, 'utf-8');
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
const error = err;
|
|
32
|
+
if (error?.code === 'ENOENT') {
|
|
33
|
+
exists = false;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
throw err;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// 计算工作目录相对于配置文件所属目录(项目根目录)的相对路径
|
|
40
|
+
const configFileDir = path.dirname(resolvedTarget);
|
|
41
|
+
const projectRootDir = path.dirname(configFileDir);
|
|
42
|
+
let workspaceRelativeToProject = path.relative(projectRootDir, normalizedWorkspace);
|
|
43
|
+
if (workspaceRelativeToProject === '') {
|
|
44
|
+
workspaceRelativeToProject = '.';
|
|
45
|
+
}
|
|
46
|
+
let displayContent;
|
|
47
|
+
let isTemplate = false;
|
|
48
|
+
let projectFromSibling = null;
|
|
49
|
+
if (exists && content) {
|
|
50
|
+
const result = extractAgentConfigOrTemplate(content, workspaceRelativeToProject);
|
|
51
|
+
displayContent = result.content;
|
|
52
|
+
isTemplate = result.isTemplate;
|
|
53
|
+
projectFromSibling = result.projectFromSibling;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
displayContent = generateEmptyTemplate(workspaceRelativeToProject);
|
|
57
|
+
isTemplate = true;
|
|
58
|
+
}
|
|
59
|
+
res.json({
|
|
60
|
+
ok: true,
|
|
61
|
+
workspacePath: normalizedWorkspace,
|
|
62
|
+
filePath: resolvedTarget,
|
|
63
|
+
exists,
|
|
64
|
+
content: displayContent,
|
|
65
|
+
fullContent: exists ? content : null,
|
|
66
|
+
foundInParent: false,
|
|
67
|
+
isTemplate,
|
|
68
|
+
projectFromSibling,
|
|
69
|
+
});
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// 相对路径:向上查找配置文件
|
|
73
|
+
const loadResult = await loadYmlWithUpwardSearch(normalizedWorkspace, providedPathStr);
|
|
74
|
+
log.info(`loadResult.content length: ${loadResult.content?.length || 0}`);
|
|
75
|
+
const configFileDir = path.dirname(loadResult.resolvedPath);
|
|
76
|
+
const projectRootDir = path.dirname(configFileDir);
|
|
77
|
+
let workspaceRelativeToProject = path.relative(projectRootDir, normalizedWorkspace);
|
|
78
|
+
if (workspaceRelativeToProject === '') {
|
|
79
|
+
workspaceRelativeToProject = '.';
|
|
80
|
+
}
|
|
81
|
+
let displayContent;
|
|
82
|
+
let isTemplate = false;
|
|
83
|
+
let projectFromSibling = null;
|
|
84
|
+
if (loadResult.content !== null) {
|
|
85
|
+
const result = extractAgentConfigOrTemplate(loadResult.content, workspaceRelativeToProject);
|
|
86
|
+
displayContent = result.content;
|
|
87
|
+
isTemplate = result.isTemplate;
|
|
88
|
+
projectFromSibling = result.projectFromSibling;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
displayContent = generateEmptyTemplate(workspaceRelativeToProject);
|
|
92
|
+
isTemplate = true;
|
|
93
|
+
}
|
|
94
|
+
log.info(`returning fullContent length: ${loadResult.content?.length || 0}`);
|
|
95
|
+
res.json({
|
|
96
|
+
ok: true,
|
|
97
|
+
workspacePath: normalizedWorkspace,
|
|
98
|
+
filePath: loadResult.resolvedPath,
|
|
99
|
+
exists: loadResult.content !== null,
|
|
100
|
+
content: displayContent,
|
|
101
|
+
fullContent: loadResult.content,
|
|
102
|
+
foundInParent: loadResult.foundInParent,
|
|
103
|
+
matchedAgentPath: loadResult.matchedAgentPath,
|
|
104
|
+
isTemplate,
|
|
105
|
+
projectFromSibling,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
const err = error;
|
|
110
|
+
res.status(400).json({ error: err?.message || 'read yml failed' });
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
/**
|
|
114
|
+
* 加载完整的 YAML 文件内容
|
|
115
|
+
* POST /runtime/load-yml
|
|
116
|
+
*/
|
|
117
|
+
ymlRouter.post('/load-yml', validateToken, async (req, res) => {
|
|
118
|
+
const { workspacePath, ymlPath } = req.body || {};
|
|
119
|
+
try {
|
|
120
|
+
const { normalizedWorkspace, resolvedTarget } = resolveWorkspaceFilePath(workspacePath, ymlPath, 'vibe-coding/my.yml');
|
|
121
|
+
const providedPathStr = ymlPath ? String(ymlPath).trim() || 'vibe-coding/my.yml' : 'vibe-coding/my.yml';
|
|
122
|
+
if (path.isAbsolute(providedPathStr)) {
|
|
123
|
+
let content = null;
|
|
124
|
+
let exists = true;
|
|
125
|
+
try {
|
|
126
|
+
content = await fs.readFile(resolvedTarget, 'utf-8');
|
|
127
|
+
log.info(`绝对路径读取成功: ${resolvedTarget}, 内容长度: ${content.length}`);
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
const error = err;
|
|
131
|
+
if (error?.code === 'ENOENT') {
|
|
132
|
+
exists = false;
|
|
133
|
+
log.info(`绝对路径文件不存在: ${resolvedTarget}`);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
throw err;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
res.json({
|
|
140
|
+
ok: true,
|
|
141
|
+
workspacePath: normalizedWorkspace,
|
|
142
|
+
filePath: resolvedTarget,
|
|
143
|
+
exists,
|
|
144
|
+
content: exists ? content : null,
|
|
145
|
+
});
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const loadResult = await loadYmlWithUpwardSearch(normalizedWorkspace, providedPathStr);
|
|
149
|
+
log.info(`向上查找结果: filePath=${loadResult.resolvedPath}, exists=${loadResult.content !== null}, contentLength=${loadResult.content?.length || 0}`);
|
|
150
|
+
res.json({
|
|
151
|
+
ok: true,
|
|
152
|
+
workspacePath: normalizedWorkspace,
|
|
153
|
+
filePath: loadResult.resolvedPath,
|
|
154
|
+
exists: loadResult.content !== null,
|
|
155
|
+
content: loadResult.content,
|
|
156
|
+
foundInParent: loadResult.foundInParent,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
const err = error;
|
|
161
|
+
res.status(400).json({ error: err?.message || 'load yml failed' });
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
/**
|
|
165
|
+
* 写入 YAML 配置文件
|
|
166
|
+
* POST /runtime/write-yml
|
|
167
|
+
*/
|
|
168
|
+
ymlRouter.post('/write-yml', validateToken, async (req, res) => {
|
|
169
|
+
const { workspacePath, ymlPath, content } = req.body || {};
|
|
170
|
+
if (!content || !String(content).trim()) {
|
|
171
|
+
res.status(400).json({ error: 'content is required' });
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
try {
|
|
175
|
+
const { normalizedWorkspace, resolvedTarget: absoluteOrDefaultTarget } = resolveWorkspaceFilePath(workspacePath, ymlPath, 'vibe-coding/my.yml');
|
|
176
|
+
const providedPathStr = ymlPath ? String(ymlPath).trim() || 'vibe-coding/my.yml' : 'vibe-coding/my.yml';
|
|
177
|
+
if (path.isAbsolute(providedPathStr)) {
|
|
178
|
+
const resolvedTarget = absoluteOrDefaultTarget;
|
|
179
|
+
const configFileDir = path.dirname(resolvedTarget);
|
|
180
|
+
const projectRootDir = path.dirname(configFileDir);
|
|
181
|
+
let workspaceRelativeToProject = path.relative(projectRootDir, normalizedWorkspace);
|
|
182
|
+
if (workspaceRelativeToProject === '') {
|
|
183
|
+
workspaceRelativeToProject = '.';
|
|
184
|
+
}
|
|
185
|
+
const processedContent = autoFillPathInYml(String(content), workspaceRelativeToProject);
|
|
186
|
+
const targetDir = path.dirname(resolvedTarget);
|
|
187
|
+
await fs.mkdir(targetDir, { recursive: true });
|
|
188
|
+
await fs.writeFile(resolvedTarget, processedContent, 'utf-8');
|
|
189
|
+
res.json({
|
|
190
|
+
ok: true,
|
|
191
|
+
workspacePath: normalizedWorkspace,
|
|
192
|
+
filePath: resolvedTarget,
|
|
193
|
+
foundInParent: false,
|
|
194
|
+
});
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
const loadResult = await loadYmlWithUpwardSearch(normalizedWorkspace, providedPathStr);
|
|
198
|
+
const initialTarget = path.resolve(normalizedWorkspace, providedPathStr);
|
|
199
|
+
const resolvedTarget = loadResult.content !== null ? loadResult.resolvedPath : initialTarget;
|
|
200
|
+
const configFileDir = path.dirname(resolvedTarget);
|
|
201
|
+
const projectRootDir = path.dirname(configFileDir);
|
|
202
|
+
let workspaceRelativeToProject = path.relative(projectRootDir, normalizedWorkspace);
|
|
203
|
+
if (workspaceRelativeToProject === '') {
|
|
204
|
+
workspaceRelativeToProject = '.';
|
|
205
|
+
}
|
|
206
|
+
const processedContent = autoFillPathInYml(String(content), workspaceRelativeToProject);
|
|
207
|
+
const targetDir = path.dirname(resolvedTarget);
|
|
208
|
+
await fs.mkdir(targetDir, { recursive: true });
|
|
209
|
+
await fs.writeFile(resolvedTarget, processedContent, 'utf-8');
|
|
210
|
+
res.json({
|
|
211
|
+
ok: true,
|
|
212
|
+
workspacePath: normalizedWorkspace,
|
|
213
|
+
filePath: resolvedTarget,
|
|
214
|
+
foundInParent: loadResult.foundInParent,
|
|
215
|
+
matchedAgentPath: loadResult.matchedAgentPath,
|
|
216
|
+
originalTarget: initialTarget !== resolvedTarget ? initialTarget : undefined,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
const err = error;
|
|
221
|
+
res.status(400).json({ error: err?.message || 'write yml failed' });
|
|
222
|
+
}
|
|
223
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yml.test.d.ts","sourceRoot":"","sources":["../../src/routes/yml.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YAML 路由单元测试
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect } from 'vitest';
|
|
5
|
+
describe('yml route validation', () => {
|
|
6
|
+
it('requires workspacePath for read', () => {
|
|
7
|
+
const validateReadRequest = (body) => {
|
|
8
|
+
const normalizedWorkspace = body.workspacePath ? String(body.workspacePath).trim() : '';
|
|
9
|
+
if (!normalizedWorkspace)
|
|
10
|
+
return { valid: false, error: 'workspacePath is required' };
|
|
11
|
+
return { valid: true };
|
|
12
|
+
};
|
|
13
|
+
expect(validateReadRequest({}).valid).toBe(false);
|
|
14
|
+
expect(validateReadRequest({ workspacePath: '/valid/path' }).valid).toBe(true);
|
|
15
|
+
});
|
|
16
|
+
it('requires workspacePath and content for write', () => {
|
|
17
|
+
const validateWriteRequest = (body) => {
|
|
18
|
+
const normalizedWorkspace = body.workspacePath ? String(body.workspacePath).trim() : '';
|
|
19
|
+
if (!normalizedWorkspace)
|
|
20
|
+
return { valid: false, error: 'workspacePath is required' };
|
|
21
|
+
if (!body.content || !String(body.content).trim())
|
|
22
|
+
return { valid: false, error: 'content is required' };
|
|
23
|
+
return { valid: true };
|
|
24
|
+
};
|
|
25
|
+
expect(validateWriteRequest({}).valid).toBe(false);
|
|
26
|
+
expect(validateWriteRequest({ workspacePath: '/path', content: 'test' }).valid).toBe(true);
|
|
27
|
+
});
|
|
28
|
+
it('uses default ymlPath when not provided', () => {
|
|
29
|
+
const resolveYmlPath = (ymlPath) => {
|
|
30
|
+
return ymlPath ? String(ymlPath).trim() || 'vibe-coding/my.yml' : 'vibe-coding/my.yml';
|
|
31
|
+
};
|
|
32
|
+
expect(resolveYmlPath()).toBe('vibe-coding/my.yml');
|
|
33
|
+
expect(resolveYmlPath('custom/path.yml')).toBe('custom/path.yml');
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe('response building', () => {
|
|
37
|
+
it('builds correct response for existing file', () => {
|
|
38
|
+
const response = {
|
|
39
|
+
ok: true,
|
|
40
|
+
workspacePath: '/project/workspace',
|
|
41
|
+
filePath: '/project/vibe-coding/my.yml',
|
|
42
|
+
exists: true,
|
|
43
|
+
content: 'agent:\n - name: test',
|
|
44
|
+
};
|
|
45
|
+
expect(response.ok).toBe(true);
|
|
46
|
+
expect(response.exists).toBe(true);
|
|
47
|
+
});
|
|
48
|
+
it('builds correct response for non-existing file', () => {
|
|
49
|
+
const response = {
|
|
50
|
+
ok: true,
|
|
51
|
+
exists: false,
|
|
52
|
+
fullContent: null,
|
|
53
|
+
isTemplate: true,
|
|
54
|
+
};
|
|
55
|
+
expect(response.exists).toBe(false);
|
|
56
|
+
expect(response.isTemplate).toBe(true);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Process Manager
|
|
3
|
+
*
|
|
4
|
+
* Core lifecycle manager for agent processes on the bridge machine.
|
|
5
|
+
* Provides comprehensive process management including creation, discovery,
|
|
6
|
+
* monitoring, termination, and orphan reclamation capabilities.
|
|
7
|
+
*/
|
|
8
|
+
import { type ProcessRecord, type ProcessState, type HealthStatus } from './process-registry.js';
|
|
9
|
+
import { type ProcessInfo, type ProcessHealthStatus } from './process-detector.js';
|
|
10
|
+
/**
|
|
11
|
+
* Process configuration for starting a new agent process
|
|
12
|
+
*/
|
|
13
|
+
export interface ProcessConfig {
|
|
14
|
+
agentId: string;
|
|
15
|
+
sessionId: string;
|
|
16
|
+
pid: number;
|
|
17
|
+
mode: 'pty' | 'sdk';
|
|
18
|
+
workspacePath: string;
|
|
19
|
+
command: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Discovered process with management status
|
|
23
|
+
*/
|
|
24
|
+
export interface DiscoveredProcess extends ProcessInfo {
|
|
25
|
+
managementStatus: 'managed' | 'orphan' | 'unknown';
|
|
26
|
+
sessionId?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Termination result with escalation level details
|
|
30
|
+
*/
|
|
31
|
+
export interface TerminationResult {
|
|
32
|
+
success: boolean;
|
|
33
|
+
agentId: string;
|
|
34
|
+
pid: number;
|
|
35
|
+
level: number;
|
|
36
|
+
terminated: number;
|
|
37
|
+
failed: number;
|
|
38
|
+
message: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Reclamation result
|
|
42
|
+
*/
|
|
43
|
+
export interface ReclamationResult {
|
|
44
|
+
success: boolean;
|
|
45
|
+
pid: number;
|
|
46
|
+
action: 'adopted' | 'terminated' | 'failed';
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Agent Process Manager
|
|
50
|
+
*
|
|
51
|
+
* Manages the complete lifecycle of agent processes including:
|
|
52
|
+
* - Creation: Register and verify new processes
|
|
53
|
+
* - Discovery: Scan for managed, orphan, and unknown processes
|
|
54
|
+
* - Monitoring: Health checks and heartbeat tracking
|
|
55
|
+
* - Termination: Graceful stop with escalation strategy
|
|
56
|
+
* - Orphan Reclamation: Adopt or terminate orphan processes
|
|
57
|
+
*/
|
|
58
|
+
export declare class AgentProcessManager {
|
|
59
|
+
private static instance;
|
|
60
|
+
private readonly registry;
|
|
61
|
+
/**
|
|
62
|
+
* Private constructor - use getAgentProcessManager() for singleton access
|
|
63
|
+
*/
|
|
64
|
+
private constructor();
|
|
65
|
+
/**
|
|
66
|
+
* Get the singleton instance
|
|
67
|
+
*/
|
|
68
|
+
static getInstance(): AgentProcessManager;
|
|
69
|
+
/**
|
|
70
|
+
* Start a new process and register it in the process registry
|
|
71
|
+
*
|
|
72
|
+
* Flow:
|
|
73
|
+
* 1. Register process with state='creating'
|
|
74
|
+
* 2. Verify it's running
|
|
75
|
+
* 3. Update state to 'running'
|
|
76
|
+
*
|
|
77
|
+
* @param config - Process configuration
|
|
78
|
+
* @throws Error if process registration fails or process is not running
|
|
79
|
+
*/
|
|
80
|
+
startProcess(config: ProcessConfig): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Discover all agent processes on the system
|
|
83
|
+
*
|
|
84
|
+
* Scans OS for all agent processes, compares with registry, and returns
|
|
85
|
+
* a list of discovered processes with their management status.
|
|
86
|
+
*
|
|
87
|
+
* @returns Array of discovered processes with management status
|
|
88
|
+
*/
|
|
89
|
+
discoverAllProcesses(): Promise<DiscoveredProcess[]>;
|
|
90
|
+
/**
|
|
91
|
+
* Check health of all registered processes
|
|
92
|
+
*
|
|
93
|
+
* Updates heartbeat and health status in registry for each managed process.
|
|
94
|
+
*
|
|
95
|
+
* @returns Map of agentId to health status
|
|
96
|
+
*/
|
|
97
|
+
healthCheckAll(): Promise<Map<string, ProcessHealthStatus>>;
|
|
98
|
+
/**
|
|
99
|
+
* Check health of a single process
|
|
100
|
+
*
|
|
101
|
+
* @param agentId - Agent ID to check
|
|
102
|
+
* @returns Health status of the process
|
|
103
|
+
*/
|
|
104
|
+
healthCheck(agentId: string): Promise<ProcessHealthStatus>;
|
|
105
|
+
/**
|
|
106
|
+
* Stop a process with graceful escalation strategy
|
|
107
|
+
*
|
|
108
|
+
* Escalation levels:
|
|
109
|
+
* Level 1: SIGTERM → wait 3s
|
|
110
|
+
* Level 2: taskkill /T /F (Win) or kill -9 (Unix) → wait 3s
|
|
111
|
+
* Level 3: terminateProcessTree → wait 5s
|
|
112
|
+
* Level 4: mark as "unstoppable", return failure
|
|
113
|
+
*
|
|
114
|
+
* @param agentId - Agent ID to stop
|
|
115
|
+
* @returns Termination result with details
|
|
116
|
+
*/
|
|
117
|
+
stopProcess(agentId: string): Promise<TerminationResult>;
|
|
118
|
+
/**
|
|
119
|
+
* Send SIGTERM to a process
|
|
120
|
+
*/
|
|
121
|
+
private sendSigterm;
|
|
122
|
+
/**
|
|
123
|
+
* Send force kill (SIGKILL on Unix, taskkill /F on Windows)
|
|
124
|
+
*/
|
|
125
|
+
private sendForceKill;
|
|
126
|
+
/**
|
|
127
|
+
* Force kill a process immediately using terminateProcessTree
|
|
128
|
+
*
|
|
129
|
+
* This bypasses the graceful escalation and uses the most aggressive
|
|
130
|
+
* termination method immediately.
|
|
131
|
+
*
|
|
132
|
+
* @param agentId - Agent ID to force kill
|
|
133
|
+
* @returns Termination result
|
|
134
|
+
*/
|
|
135
|
+
forceKill(agentId: string): Promise<TerminationResult>;
|
|
136
|
+
/**
|
|
137
|
+
* Reclaim an orphan process by agentId
|
|
138
|
+
*
|
|
139
|
+
* Finds an orphan process by agentId, and either:
|
|
140
|
+
* - Adopts it into the registry (if found and not managed)
|
|
141
|
+
* - Terminates it (if adoption fails or process is problematic)
|
|
142
|
+
*
|
|
143
|
+
* @param agentId - Agent ID to find and reclaim
|
|
144
|
+
* @returns Reclamation result
|
|
145
|
+
*/
|
|
146
|
+
reclaimOrphan(agentId: string): Promise<ReclamationResult>;
|
|
147
|
+
/**
|
|
148
|
+
* Scan all orphans and attempt to reclaim each
|
|
149
|
+
*
|
|
150
|
+
* @returns Array of reclamation results
|
|
151
|
+
*/
|
|
152
|
+
scanAndReclaimAll(): Promise<Array<{
|
|
153
|
+
agentId: string;
|
|
154
|
+
pid: number;
|
|
155
|
+
action: string;
|
|
156
|
+
}>>;
|
|
157
|
+
/**
|
|
158
|
+
* Mark a process as orphaned in the registry
|
|
159
|
+
*
|
|
160
|
+
* @param agentId - Agent ID to mark
|
|
161
|
+
* @returns Whether the operation succeeded
|
|
162
|
+
*/
|
|
163
|
+
markOrphaned(agentId: string): Promise<boolean>;
|
|
164
|
+
/**
|
|
165
|
+
* Check if a process is managed
|
|
166
|
+
*
|
|
167
|
+
* @param agentId - Agent ID to check
|
|
168
|
+
* @returns Whether the process is managed
|
|
169
|
+
*/
|
|
170
|
+
isManaged(agentId: string): boolean;
|
|
171
|
+
/**
|
|
172
|
+
* Get all managed processes
|
|
173
|
+
*
|
|
174
|
+
* @returns Array of all managed process records
|
|
175
|
+
*/
|
|
176
|
+
getAllManagedProcesses(): ProcessRecord[];
|
|
177
|
+
/**
|
|
178
|
+
* Get managed processes by state
|
|
179
|
+
*
|
|
180
|
+
* @param state - Process state to filter by
|
|
181
|
+
* @returns Array of process records matching the state
|
|
182
|
+
*/
|
|
183
|
+
getManagedProcessesByState(state: ProcessState): ProcessRecord[];
|
|
184
|
+
/**
|
|
185
|
+
* Find processes running on the machine that are NOT in registry
|
|
186
|
+
*
|
|
187
|
+
* @returns Array of unmanaged process info
|
|
188
|
+
*/
|
|
189
|
+
getUnmanagedProcesses(): Promise<ProcessInfo[]>;
|
|
190
|
+
/**
|
|
191
|
+
* Rebuild the process registry from persisted sessions (e.g. on startup)
|
|
192
|
+
*
|
|
193
|
+
* Scans all persisted sessions, checks which processes are still running,
|
|
194
|
+
* and registers them with appropriate state.
|
|
195
|
+
*
|
|
196
|
+
* @param sessions - Array of persisted session data
|
|
197
|
+
*/
|
|
198
|
+
rebuildRegistry(sessions: Array<{
|
|
199
|
+
agentId: string;
|
|
200
|
+
sessionId: string;
|
|
201
|
+
pid?: number;
|
|
202
|
+
workspacePath?: string;
|
|
203
|
+
command?: string;
|
|
204
|
+
mode?: 'pty' | 'sdk';
|
|
205
|
+
}>): Promise<void>;
|
|
206
|
+
/**
|
|
207
|
+
* Get process statistics
|
|
208
|
+
*
|
|
209
|
+
* @returns Statistics for all managed processes
|
|
210
|
+
*/
|
|
211
|
+
getStats(): Record<ProcessState | 'total', number>;
|
|
212
|
+
/**
|
|
213
|
+
* Remove a process from registry
|
|
214
|
+
*
|
|
215
|
+
* @param agentId - Agent ID to remove
|
|
216
|
+
* @returns Whether the operation succeeded
|
|
217
|
+
*/
|
|
218
|
+
removeProcess(agentId: string): Promise<boolean>;
|
|
219
|
+
/**
|
|
220
|
+
* Get a single process record
|
|
221
|
+
*
|
|
222
|
+
* @param agentId - Agent ID to get
|
|
223
|
+
* @returns Process record or undefined
|
|
224
|
+
*/
|
|
225
|
+
getProcess(agentId: string): ProcessRecord | undefined;
|
|
226
|
+
/**
|
|
227
|
+
* Get a process record by PID
|
|
228
|
+
*
|
|
229
|
+
* @param pid - Process ID to get
|
|
230
|
+
* @returns Process record or undefined
|
|
231
|
+
*/
|
|
232
|
+
getProcessByPid(pid: number): ProcessRecord | undefined;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Get the AgentProcessManager singleton instance
|
|
236
|
+
*
|
|
237
|
+
* @returns AgentProcessManager instance
|
|
238
|
+
*/
|
|
239
|
+
export declare function getAgentProcessManager(): AgentProcessManager;
|
|
240
|
+
export type { ProcessRecord, ProcessState, HealthStatus, ProcessInfo, ProcessHealthStatus };
|
|
241
|
+
//# sourceMappingURL=agent-process-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-process-manager.d.ts","sourceRoot":"","sources":["../../src/services/agent-process-manager.ts"],"names":[],"mappings":"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"}
|