aws-runtime-bridge 1.9.33 → 1.9.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapter/AcodeSdkAdapter.d.ts +66 -5
- package/dist/adapter/AcodeSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/AcodeSdkAdapter.js +771 -69
- package/dist/adapter/ClaudeSdkAdapter.d.ts +6 -0
- package/dist/adapter/ClaudeSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/ClaudeSdkAdapter.js +24 -1
- package/dist/adapter/OpencodeSdkAdapter.d.ts +19 -0
- package/dist/adapter/OpencodeSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/OpencodeSdkAdapter.js +62 -0
- package/dist/adapter/idle-poll-loop.d.ts +2 -1
- package/dist/adapter/idle-poll-loop.d.ts.map +1 -1
- package/dist/adapter/types.d.ts +86 -9
- package/dist/adapter/types.d.ts.map +1 -1
- package/dist/adapter/types.js +15 -5
- package/dist/index.js +15 -0
- package/dist/routes/acode-todos.d.ts +11 -0
- package/dist/routes/acode-todos.d.ts.map +1 -0
- package/dist/routes/acode-todos.js +75 -0
- package/dist/routes/ai-sources.js +4 -1
- package/dist/routes/dashboard.d.ts.map +1 -1
- package/dist/routes/dashboard.js +1 -1
- package/dist/routes/memory.d.ts +1 -1
- package/dist/routes/memory.d.ts.map +1 -1
- package/dist/routes/memory.js +3 -3
- package/dist/routes/pty.d.ts.map +1 -1
- package/dist/routes/pty.js +9 -0
- package/dist/routes/runtime-binding.d.ts.map +1 -1
- package/dist/routes/runtime-binding.js +6 -3
- package/dist/routes/sessions.js +89 -4
- package/dist/routes/sub-agents.d.ts +14 -0
- package/dist/routes/sub-agents.d.ts.map +1 -0
- package/dist/routes/sub-agents.js +267 -0
- package/dist/routes/terminal.d.ts +12 -1
- package/dist/routes/terminal.d.ts.map +1 -1
- package/dist/routes/terminal.js +326 -24
- package/dist/services/acode-package.d.ts +8 -1
- package/dist/services/acode-package.d.ts.map +1 -1
- package/dist/services/acode-package.js +33 -4
- package/dist/services/agent-event-store.d.ts +1 -0
- package/dist/services/agent-event-store.d.ts.map +1 -1
- package/dist/services/aws-client-agent-mcp.d.ts.map +1 -1
- package/dist/services/aws-client-agent-mcp.js +11 -4
- package/dist/services/event-delta-pusher.js +4 -4
- package/dist/services/fileSnapshotStore.js +1 -1
- package/dist/services/legacy-path-migration.d.ts +3 -0
- package/dist/services/legacy-path-migration.d.ts.map +1 -0
- package/dist/services/legacy-path-migration.js +66 -0
- package/dist/services/lifecycle-state.d.ts.map +1 -1
- package/dist/services/lifecycle-state.js +1 -1
- package/dist/services/runtime-binding.d.ts +5 -0
- package/dist/services/runtime-binding.d.ts.map +1 -1
- package/dist/services/runtime-binding.js +33 -1
- package/dist/services/session-output.d.ts +10 -1
- package/dist/services/session-output.d.ts.map +1 -1
- package/dist/services/session-output.js +54 -4
- package/dist/services/sub-agent-manager-instance.d.ts +4 -0
- package/dist/services/sub-agent-manager-instance.d.ts.map +1 -0
- package/dist/services/sub-agent-manager-instance.js +12 -0
- package/dist/services/workspace-files.d.ts +1 -0
- package/dist/services/workspace-files.d.ts.map +1 -1
- package/dist/services/workspace-files.js +57 -1
- package/package/acode/dist/ask-user-question-tool.d.ts +47 -0
- package/package/acode/dist/ask-user-question-tool.d.ts.map +1 -0
- package/package/acode/dist/ask-user-question-tool.js +233 -0
- package/package/acode/dist/built-in-file-tools.d.ts +2 -0
- package/package/acode/dist/built-in-file-tools.d.ts.map +1 -1
- package/package/acode/dist/built-in-file-tools.js +504 -3
- package/package/acode/dist/compaction.d.ts +242 -0
- package/package/acode/dist/compaction.d.ts.map +1 -0
- package/package/acode/dist/compaction.js +919 -0
- package/package/acode/dist/config.d.ts +6 -1
- package/package/acode/dist/config.d.ts.map +1 -1
- package/package/acode/dist/config.js +27 -2
- package/package/acode/dist/index.d.ts +4 -0
- package/package/acode/dist/index.d.ts.map +1 -1
- package/package/acode/dist/index.js +4 -0
- package/package/acode/dist/runtime.d.ts +257 -0
- package/package/acode/dist/runtime.d.ts.map +1 -1
- package/package/acode/dist/runtime.js +1843 -191
- package/package/acode/dist/skill-tool.d.ts +30 -0
- package/package/acode/dist/skill-tool.d.ts.map +1 -0
- package/package/acode/dist/skill-tool.js +174 -0
- package/package/acode/dist/sub-agent-manager.d.ts +264 -0
- package/package/acode/dist/sub-agent-manager.d.ts.map +1 -0
- package/package/acode/dist/sub-agent-manager.js +825 -0
- package/package/acode/dist/sub-agent-store.d.ts +40 -0
- package/package/acode/dist/sub-agent-store.d.ts.map +1 -0
- package/package/acode/dist/sub-agent-store.js +164 -0
- package/package/acode/dist/sub-agent-tools.d.ts +72 -0
- package/package/acode/dist/sub-agent-tools.d.ts.map +1 -0
- package/package/acode/dist/sub-agent-tools.js +429 -0
- package/package/acode/dist/sub-agent-types.d.ts +85 -0
- package/package/acode/dist/sub-agent-types.d.ts.map +1 -0
- package/package/acode/dist/sub-agent-types.js +8 -0
- package/package/acode/dist/todo-store.d.ts +42 -0
- package/package/acode/dist/todo-store.d.ts.map +1 -0
- package/package/acode/dist/todo-store.js +68 -0
- package/package/acode/dist/todo-tool.d.ts +6 -0
- package/package/acode/dist/todo-tool.d.ts.map +1 -0
- package/package/acode/dist/todo-tool.js +138 -0
- package/package/acode/dist/types.d.ts +41 -1
- package/package/acode/dist/types.d.ts.map +1 -1
- package/package/acode/package.json +13 -2
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts +9 -0
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/agent-client.js +69 -10
- package/package/aws-client-agent-mcp/dist/agent-client.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/config.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/config.js +4 -0
- package/package/aws-client-agent-mcp/dist/config.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/constants.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/constants.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/constants.js +3 -1
- package/package/aws-client-agent-mcp/dist/constants.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts +4 -1
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/context-manager.js +6 -2
- package/package/aws-client-agent-mcp/dist/context-manager.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/context-manager.test.js +5 -3
- package/package/aws-client-agent-mcp/dist/context-manager.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/http-client.d.ts +5 -0
- package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/http-client.js +15 -1
- package/package/aws-client-agent-mcp/dist/http-client.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +162 -71
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.js +1007 -504
- package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js +371 -253
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +6 -17
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.js +20 -75
- package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts +45 -45
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-store.js +114 -162
- package/package/aws-client-agent-mcp/dist/memory-store.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-store.test.js +175 -164
- package/package/aws-client-agent-mcp/dist/memory-store.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +3 -9
- package/package/aws-client-agent-mcp/dist/memory-tools.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.js +31 -58
- package/package/aws-client-agent-mcp/dist/memory-tools.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +40 -9
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.js +123 -23
- package/package/aws-client-agent-mcp/dist/message-buffer.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +13 -13
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.js +23 -16
- package/package/aws-client-agent-mcp/dist/server-memory-store.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.js +8 -5
- package/package/aws-client-agent-mcp/dist/status-reporter.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.test.js +93 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/types.d.ts +12 -25
- package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/types.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +34 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.js +146 -18
- package/package/aws-client-agent-mcp/dist/websocket-client.js.map +1 -1
- package/package.json +17 -7
- package/dist/adapter/AcodeSdkAdapter.test.d.ts +0 -2
- package/dist/adapter/AcodeSdkAdapter.test.d.ts.map +0 -1
- package/dist/adapter/AcodeSdkAdapter.test.js +0 -2000
- package/dist/adapter/AdapterRegistry.test.d.ts +0 -5
- package/dist/adapter/AdapterRegistry.test.d.ts.map +0 -1
- package/dist/adapter/AdapterRegistry.test.js +0 -118
- package/dist/adapter/ClaudeSdkAdapter.test.d.ts +0 -2
- package/dist/adapter/ClaudeSdkAdapter.test.d.ts.map +0 -1
- package/dist/adapter/ClaudeSdkAdapter.test.js +0 -311
- package/dist/adapter/CodexSdkAdapter.test.d.ts +0 -2
- package/dist/adapter/CodexSdkAdapter.test.d.ts.map +0 -1
- package/dist/adapter/CodexSdkAdapter.test.js +0 -270
- package/dist/adapter/OpencodeSdkAdapter.test.d.ts +0 -2
- package/dist/adapter/OpencodeSdkAdapter.test.d.ts.map +0 -1
- package/dist/adapter/OpencodeSdkAdapter.test.js +0 -158
- package/dist/adapter/acode-tool-names.test.d.ts +0 -2
- package/dist/adapter/acode-tool-names.test.d.ts.map +0 -1
- package/dist/adapter/acode-tool-names.test.js +0 -28
- package/dist/adapter/adapter.test.d.ts +0 -5
- package/dist/adapter/adapter.test.d.ts.map +0 -1
- package/dist/adapter/adapter.test.js +0 -180
- package/dist/adapter/idle-poll-loop.test.d.ts +0 -2
- package/dist/adapter/idle-poll-loop.test.d.ts.map +0 -1
- package/dist/adapter/idle-poll-loop.test.js +0 -85
- package/dist/adapter/types.test.d.ts +0 -2
- package/dist/adapter/types.test.d.ts.map +0 -1
- package/dist/adapter/types.test.js +0 -50
- package/dist/adapters/cc-switch/mcp-acode.test.d.ts +0 -2
- package/dist/adapters/cc-switch/mcp-acode.test.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-acode.test.js +0 -80
- package/dist/adapters/cc-switch/mcp-claudecode.test.d.ts +0 -2
- package/dist/adapters/cc-switch/mcp-claudecode.test.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-claudecode.test.js +0 -75
- package/dist/adapters/cc-switch/mcp-codex.test.d.ts +0 -2
- package/dist/adapters/cc-switch/mcp-codex.test.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-codex.test.js +0 -126
- package/dist/adapters/cc-switch/mcp-opencode.test.d.ts +0 -2
- package/dist/adapters/cc-switch/mcp-opencode.test.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-opencode.test.js +0 -62
- package/dist/adapters/cc-switch/skill-directory.test.d.ts +0 -2
- package/dist/adapters/cc-switch/skill-directory.test.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-directory.test.js +0 -74
- package/dist/config.test.d.ts +0 -2
- package/dist/config.test.d.ts.map +0 -1
- package/dist/config.test.js +0 -107
- package/dist/routes/ai-sources.test.d.ts +0 -2
- package/dist/routes/ai-sources.test.d.ts.map +0 -1
- package/dist/routes/ai-sources.test.js +0 -169
- package/dist/routes/file-browser.test.d.ts +0 -5
- package/dist/routes/file-browser.test.d.ts.map +0 -1
- package/dist/routes/file-browser.test.js +0 -155
- package/dist/routes/git.test.d.ts +0 -2
- package/dist/routes/git.test.d.ts.map +0 -1
- package/dist/routes/git.test.js +0 -330
- package/dist/routes/instance.test.d.ts +0 -5
- package/dist/routes/instance.test.d.ts.map +0 -1
- package/dist/routes/instance.test.js +0 -389
- package/dist/routes/mcp.test.d.ts +0 -5
- package/dist/routes/mcp.test.d.ts.map +0 -1
- package/dist/routes/mcp.test.js +0 -92
- package/dist/routes/memory-route-wiring.test.d.ts +0 -2
- package/dist/routes/memory-route-wiring.test.d.ts.map +0 -1
- package/dist/routes/memory-route-wiring.test.js +0 -15
- package/dist/routes/memory.test.d.ts +0 -2
- package/dist/routes/memory.test.d.ts.map +0 -1
- package/dist/routes/memory.test.js +0 -177
- package/dist/routes/properties.test.d.ts +0 -5
- package/dist/routes/properties.test.d.ts.map +0 -1
- package/dist/routes/properties.test.js +0 -72
- package/dist/routes/pty.test.d.ts +0 -2
- package/dist/routes/pty.test.d.ts.map +0 -1
- package/dist/routes/pty.test.js +0 -82
- package/dist/routes/runtime-binding.test.d.ts +0 -2
- package/dist/routes/runtime-binding.test.d.ts.map +0 -1
- package/dist/routes/runtime-binding.test.js +0 -32
- package/dist/routes/sessions.test.d.ts +0 -5
- package/dist/routes/sessions.test.d.ts.map +0 -1
- package/dist/routes/sessions.test.js +0 -86
- package/dist/routes/skills.test.d.ts +0 -5
- package/dist/routes/skills.test.d.ts.map +0 -1
- package/dist/routes/skills.test.js +0 -50
- package/dist/routes/system-metrics.test.d.ts +0 -2
- package/dist/routes/system-metrics.test.d.ts.map +0 -1
- package/dist/routes/system-metrics.test.js +0 -16
- package/dist/routes/terminal.stop-options.test.d.ts +0 -2
- package/dist/routes/terminal.stop-options.test.d.ts.map +0 -1
- package/dist/routes/terminal.stop-options.test.js +0 -39
- package/dist/routes/terminal.test.d.ts +0 -2
- package/dist/routes/terminal.test.d.ts.map +0 -1
- package/dist/routes/terminal.test.js +0 -746
- package/dist/routes/yml.test.d.ts +0 -5
- package/dist/routes/yml.test.d.ts.map +0 -1
- package/dist/routes/yml.test.js +0 -58
- package/dist/services/ai-source-apply.test.d.ts +0 -2
- package/dist/services/ai-source-apply.test.d.ts.map +0 -1
- package/dist/services/ai-source-apply.test.js +0 -138
- package/dist/services/auto-register.test.d.ts +0 -2
- package/dist/services/auto-register.test.d.ts.map +0 -1
- package/dist/services/auto-register.test.js +0 -184
- package/dist/services/aws-client-agent-mcp.test.d.ts +0 -2
- package/dist/services/aws-client-agent-mcp.test.d.ts.map +0 -1
- package/dist/services/aws-client-agent-mcp.test.js +0 -242
- package/dist/services/bridge-package-publish-hooks.test.d.ts +0 -2
- package/dist/services/bridge-package-publish-hooks.test.d.ts.map +0 -1
- package/dist/services/bridge-package-publish-hooks.test.js +0 -136
- package/dist/services/cc-switch-discovery.test.d.ts +0 -2
- package/dist/services/cc-switch-discovery.test.d.ts.map +0 -1
- package/dist/services/cc-switch-discovery.test.js +0 -56
- package/dist/services/cli-commands.test.d.ts +0 -2
- package/dist/services/cli-commands.test.d.ts.map +0 -1
- package/dist/services/cli-commands.test.js +0 -230
- package/dist/services/instance-init-service.test.d.ts +0 -2
- package/dist/services/instance-init-service.test.d.ts.map +0 -1
- package/dist/services/instance-init-service.test.js +0 -140
- package/dist/services/instance-state.test.d.ts +0 -2
- package/dist/services/instance-state.test.d.ts.map +0 -1
- package/dist/services/instance-state.test.js +0 -245
- package/dist/services/mcp-launch-binding-queue.test.d.ts +0 -2
- package/dist/services/mcp-launch-binding-queue.test.d.ts.map +0 -1
- package/dist/services/mcp-launch-binding-queue.test.js +0 -181
- package/dist/services/runtime-binding.test.d.ts +0 -2
- package/dist/services/runtime-binding.test.d.ts.map +0 -1
- package/dist/services/runtime-binding.test.js +0 -78
- package/dist/services/runtime-lifecycle-policy.test.d.ts +0 -2
- package/dist/services/runtime-lifecycle-policy.test.d.ts.map +0 -1
- package/dist/services/runtime-lifecycle-policy.test.js +0 -41
- package/dist/services/session-output.test.d.ts +0 -5
- package/dist/services/session-output.test.d.ts.map +0 -1
- package/dist/services/session-output.test.js +0 -177
- package/dist/services/startup-config-wizard.test.d.ts +0 -2
- package/dist/services/startup-config-wizard.test.d.ts.map +0 -1
- package/dist/services/startup-config-wizard.test.js +0 -184
- package/dist/services/terminal-persistence.test.d.ts +0 -5
- package/dist/services/terminal-persistence.test.d.ts.map +0 -1
- package/dist/services/terminal-persistence.test.js +0 -159
- package/dist/services/tool-installer.test.d.ts +0 -2
- package/dist/services/tool-installer.test.d.ts.map +0 -1
- package/dist/services/tool-installer.test.js +0 -225
- package/dist/services/workspace-files.test.d.ts +0 -2
- package/dist/services/workspace-files.test.d.ts.map +0 -1
- package/dist/services/workspace-files.test.js +0 -648
- package/dist/services/workspace-watch.test.d.ts +0 -2
- package/dist/services/workspace-watch.test.d.ts.map +0 -1
- package/dist/services/workspace-watch.test.js +0 -38
- package/dist/utils/file-utils.test.d.ts +0 -2
- package/dist/utils/file-utils.test.d.ts.map +0 -1
- package/dist/utils/file-utils.test.js +0 -244
- package/dist/utils/logger.test.d.ts +0 -2
- package/dist/utils/logger.test.d.ts.map +0 -1
- package/dist/utils/logger.test.js +0 -93
- package/dist/utils/sdk-package-loader.test.d.ts +0 -2
- package/dist/utils/sdk-package-loader.test.d.ts.map +0 -1
- package/dist/utils/sdk-package-loader.test.js +0 -84
- package/dist/utils/validation.test.d.ts +0 -2
- package/dist/utils/validation.test.d.ts.map +0 -1
- package/dist/utils/validation.test.js +0 -88
- package/dist/utils/yaml-utils.test.d.ts +0 -2
- package/dist/utils/yaml-utils.test.d.ts.map +0 -1
- package/dist/utils/yaml-utils.test.js +0 -363
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"yml.test.d.ts","sourceRoot":"","sources":["../../src/routes/yml.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/dist/routes/yml.test.js
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
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() || '.agentswork/my.yml' : '.agentswork/my.yml';
|
|
31
|
-
};
|
|
32
|
-
expect(resolveYmlPath()).toBe('.agentswork/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/.agentswork/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
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ai-source-apply.test.d.ts","sourceRoot":"","sources":["../../src/services/ai-source-apply.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
-
function status(tool, installed) {
|
|
3
|
-
return {
|
|
4
|
-
tool,
|
|
5
|
-
installed,
|
|
6
|
-
executable: installed ? tool : null,
|
|
7
|
-
version: installed ? '1.0.0' : null,
|
|
8
|
-
installing: false,
|
|
9
|
-
error: installed ? null : 'not installed',
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
describe('applyCurrentAiConfigToInstalledTools', () => {
|
|
13
|
-
it('forces current unified AI config and skips uninstalled tools', async () => {
|
|
14
|
-
const applyClaudeCodeConfig = vi.fn(async (config) => config);
|
|
15
|
-
const applyCodexConfig = vi.fn(async (config) => config);
|
|
16
|
-
const applyOpenCodeConfig = vi.fn(async (config) => config);
|
|
17
|
-
const applyAcodeConfig = vi.fn(async (config) => config);
|
|
18
|
-
const { applyCurrentAiConfigToInstalledTools } = await import('./ai-source-apply.js');
|
|
19
|
-
const result = await applyCurrentAiConfigToInstalledTools({
|
|
20
|
-
template: {
|
|
21
|
-
baseUrl: 'https://current.example.com',
|
|
22
|
-
apiKey: 'sk-current',
|
|
23
|
-
model: 'gpt-current',
|
|
24
|
-
},
|
|
25
|
-
requestedSources: {
|
|
26
|
-
claudecode: { env: { ANTHROPIC_BASE_URL: 'https://stale.example.com' } },
|
|
27
|
-
codex: { model: 'stale-codex' },
|
|
28
|
-
opencode: { provider: { default: { options: { baseURL: 'https://stale.example.com/v1' } } } },
|
|
29
|
-
},
|
|
30
|
-
toolStatus: {
|
|
31
|
-
acode: status('acode', true),
|
|
32
|
-
claude: status('claude', true),
|
|
33
|
-
codex: status('codex', false),
|
|
34
|
-
opencode: status('opencode', true),
|
|
35
|
-
},
|
|
36
|
-
aiConfigService: {
|
|
37
|
-
applyAcodeConfig,
|
|
38
|
-
applyClaudeCodeConfig,
|
|
39
|
-
applyCodexConfig,
|
|
40
|
-
applyOpenCodeConfig,
|
|
41
|
-
},
|
|
42
|
-
});
|
|
43
|
-
expect(applyClaudeCodeConfig).toHaveBeenCalledWith({
|
|
44
|
-
env: {
|
|
45
|
-
ANTHROPIC_BASE_URL: 'https://current.example.com',
|
|
46
|
-
ANTHROPIC_AUTH_TOKEN: 'sk-current',
|
|
47
|
-
ANTHROPIC_MODEL: 'gpt-current',
|
|
48
|
-
},
|
|
49
|
-
});
|
|
50
|
-
expect(applyCodexConfig).not.toHaveBeenCalled();
|
|
51
|
-
expect(applyOpenCodeConfig).toHaveBeenCalledWith(expect.objectContaining({
|
|
52
|
-
provider: expect.objectContaining({
|
|
53
|
-
default: expect.objectContaining({
|
|
54
|
-
model: 'gpt-current',
|
|
55
|
-
options: expect.objectContaining({
|
|
56
|
-
baseURL: 'https://current.example.com/v1',
|
|
57
|
-
apiKey: 'sk-current',
|
|
58
|
-
}),
|
|
59
|
-
}),
|
|
60
|
-
}),
|
|
61
|
-
}));
|
|
62
|
-
expect(applyAcodeConfig).toHaveBeenCalledOnce();
|
|
63
|
-
expect(result.applied.codex).toEqual([]);
|
|
64
|
-
expect(result.skippedTools).toEqual(['codex']);
|
|
65
|
-
}, 15_000);
|
|
66
|
-
it('applies Claude Code config when the installed tool status uses the claudecode alias', async () => {
|
|
67
|
-
const applyClaudeCodeConfig = vi.fn(async (config) => config);
|
|
68
|
-
const { applyCurrentAiConfigToInstalledTools } = await import('./ai-source-apply.js');
|
|
69
|
-
await applyCurrentAiConfigToInstalledTools({
|
|
70
|
-
template: {
|
|
71
|
-
baseUrl: 'https://current.example.com',
|
|
72
|
-
apiKey: 'sk-current',
|
|
73
|
-
model: 'gpt-current',
|
|
74
|
-
},
|
|
75
|
-
toolStatus: {
|
|
76
|
-
claudecode: status('claudecode', true),
|
|
77
|
-
},
|
|
78
|
-
aiConfigService: {
|
|
79
|
-
applyAcodeConfig: vi.fn(async (config) => config),
|
|
80
|
-
applyClaudeCodeConfig,
|
|
81
|
-
applyCodexConfig: vi.fn(async (config) => config),
|
|
82
|
-
applyOpenCodeConfig: vi.fn(async (config) => config),
|
|
83
|
-
},
|
|
84
|
-
});
|
|
85
|
-
expect(applyClaudeCodeConfig).toHaveBeenCalledOnce();
|
|
86
|
-
});
|
|
87
|
-
it('applies explicit per-tool AI sources when no unified template is present', async () => {
|
|
88
|
-
const applyClaudeCodeConfig = vi.fn(async (config) => config);
|
|
89
|
-
const applyCodexConfig = vi.fn(async (config) => config);
|
|
90
|
-
const applyOpenCodeConfig = vi.fn(async (config) => config);
|
|
91
|
-
const applyAcodeConfig = vi.fn(async (config) => config);
|
|
92
|
-
const { applyCurrentAiConfigToInstalledTools } = await import('./ai-source-apply.js');
|
|
93
|
-
const result = await applyCurrentAiConfigToInstalledTools({
|
|
94
|
-
template: null,
|
|
95
|
-
requestedSources: {
|
|
96
|
-
claudecode: {
|
|
97
|
-
env: {
|
|
98
|
-
ANTHROPIC_BASE_URL: 'https://explicit.example.com',
|
|
99
|
-
ANTHROPIC_AUTH_TOKEN: 'sk-explicit',
|
|
100
|
-
ANTHROPIC_MODEL: 'claude-explicit',
|
|
101
|
-
},
|
|
102
|
-
},
|
|
103
|
-
codex: { model: 'gpt-explicit' },
|
|
104
|
-
opencode: {
|
|
105
|
-
provider: {
|
|
106
|
-
default: {
|
|
107
|
-
options: { baseURL: 'https://explicit.example.com/v1', apiKey: 'sk-explicit' },
|
|
108
|
-
},
|
|
109
|
-
},
|
|
110
|
-
},
|
|
111
|
-
},
|
|
112
|
-
toolStatus: {
|
|
113
|
-
claude: status('claude', true),
|
|
114
|
-
codex: status('codex', true),
|
|
115
|
-
opencode: status('opencode', true),
|
|
116
|
-
},
|
|
117
|
-
aiConfigService: {
|
|
118
|
-
applyAcodeConfig,
|
|
119
|
-
applyClaudeCodeConfig,
|
|
120
|
-
applyCodexConfig,
|
|
121
|
-
applyOpenCodeConfig,
|
|
122
|
-
},
|
|
123
|
-
});
|
|
124
|
-
expect(applyClaudeCodeConfig).toHaveBeenCalledWith({
|
|
125
|
-
env: {
|
|
126
|
-
ANTHROPIC_BASE_URL: 'https://explicit.example.com',
|
|
127
|
-
ANTHROPIC_AUTH_TOKEN: 'sk-explicit',
|
|
128
|
-
ANTHROPIC_MODEL: 'claude-explicit',
|
|
129
|
-
},
|
|
130
|
-
});
|
|
131
|
-
expect(applyCodexConfig).toHaveBeenCalledWith({ model: 'gpt-explicit' });
|
|
132
|
-
expect(applyOpenCodeConfig).toHaveBeenCalledOnce();
|
|
133
|
-
expect(result.generatedFromUnifiedTemplate).toBe(false);
|
|
134
|
-
expect(result.applied.claudecode).toEqual(['env']);
|
|
135
|
-
expect(result.applied.codex).toEqual(['model']);
|
|
136
|
-
expect(result.applied.opencode).toEqual(['provider']);
|
|
137
|
-
});
|
|
138
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auto-register.test.d.ts","sourceRoot":"","sources":["../../src/services/auto-register.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
2
|
-
import os from "node:os";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
5
|
-
vi.mock("node:os", async () => {
|
|
6
|
-
const actual = await vi.importActual("node:os");
|
|
7
|
-
const mocked = {
|
|
8
|
-
...actual,
|
|
9
|
-
homedir: () => process.env.AWS_TEST_HOME || actual.homedir(),
|
|
10
|
-
};
|
|
11
|
-
return {
|
|
12
|
-
...mocked,
|
|
13
|
-
default: mocked,
|
|
14
|
-
};
|
|
15
|
-
});
|
|
16
|
-
vi.mock("axios", () => ({
|
|
17
|
-
default: {
|
|
18
|
-
post: vi.fn(),
|
|
19
|
-
},
|
|
20
|
-
}));
|
|
21
|
-
const originalEnv = { ...process.env };
|
|
22
|
-
const tempRoots = [];
|
|
23
|
-
function createRuntimeHome() {
|
|
24
|
-
const root = mkdtempSync(path.join(os.tmpdir(), "aws-auto-register-"));
|
|
25
|
-
tempRoots.push(root);
|
|
26
|
-
return root;
|
|
27
|
-
}
|
|
28
|
-
function writeAutoRegisterConfig(homeDir, targets) {
|
|
29
|
-
const configPath = path.join(homeDir, ".aws-bridge", "config.json");
|
|
30
|
-
const autoRegisterTargets = (typeof targets === "string"
|
|
31
|
-
? [{ serverUrl: targets }]
|
|
32
|
-
: targets).map((target, index) => {
|
|
33
|
-
const normalizedTarget = {
|
|
34
|
-
serverUrl: target.serverUrl,
|
|
35
|
-
instanceName: target.instanceName || `test-bridge-${index + 1}`,
|
|
36
|
-
userKey: target.userKey || `aws_live_test_key_${index + 1}`,
|
|
37
|
-
};
|
|
38
|
-
if (!target.omitRegisterIp) {
|
|
39
|
-
normalizedTarget.registerIp = target.registerIp || "127.0.0.1";
|
|
40
|
-
}
|
|
41
|
-
return normalizedTarget;
|
|
42
|
-
});
|
|
43
|
-
mkdirSync(path.dirname(configPath), { recursive: true });
|
|
44
|
-
writeFileSync(configPath, `${JSON.stringify({
|
|
45
|
-
connectionKey: "bridge-key",
|
|
46
|
-
autoRegisterTargets,
|
|
47
|
-
}, null, 2)}\n`, "utf-8");
|
|
48
|
-
}
|
|
49
|
-
function useRuntimeHome(runtimeHome) {
|
|
50
|
-
process.env.AWS_TEST_HOME = runtimeHome;
|
|
51
|
-
process.env.HOME = runtimeHome;
|
|
52
|
-
process.env.USERPROFILE = runtimeHome;
|
|
53
|
-
process.env.AWS_RUNTIME_HOME_DIR = runtimeHome;
|
|
54
|
-
process.env.AWS_RUNTIME_SCHEDULER_BASE_URL = "";
|
|
55
|
-
}
|
|
56
|
-
async function mockSuccessfulPost(response) {
|
|
57
|
-
const { default: axios } = await import("axios");
|
|
58
|
-
vi.mocked(axios.post).mockResolvedValue({ data: response });
|
|
59
|
-
return vi.mocked(axios.post);
|
|
60
|
-
}
|
|
61
|
-
afterEach(() => {
|
|
62
|
-
process.env = { ...originalEnv };
|
|
63
|
-
vi.resetModules();
|
|
64
|
-
vi.clearAllMocks();
|
|
65
|
-
vi.restoreAllMocks();
|
|
66
|
-
for (const root of tempRoots.splice(0)) {
|
|
67
|
-
rmSync(root, { recursive: true, force: true });
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
describe("auto-register scheduler URL selection", () => {
|
|
71
|
-
it("uses loopback scheduler URLs without warning when registerIp is omitted", async () => {
|
|
72
|
-
const runtimeHome = createRuntimeHome();
|
|
73
|
-
useRuntimeHome(runtimeHome);
|
|
74
|
-
writeAutoRegisterConfig(runtimeHome, [
|
|
75
|
-
{ serverUrl: "http://127.0.0.1:7380", omitRegisterIp: true },
|
|
76
|
-
]);
|
|
77
|
-
const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => undefined);
|
|
78
|
-
const post = await mockSuccessfulPost({
|
|
79
|
-
success: true,
|
|
80
|
-
instanceId: "bridge-loopback",
|
|
81
|
-
userId: "user-loopback",
|
|
82
|
-
message: "ok",
|
|
83
|
-
runtimeAccessToken: "runtime-token-loopback-123456",
|
|
84
|
-
});
|
|
85
|
-
const { autoRegister } = await import("./auto-register.js");
|
|
86
|
-
await expect(autoRegister()).resolves.toBe(true);
|
|
87
|
-
expect(warnSpy).not.toHaveBeenCalledWith(expect.stringContaining("未找到与调度中心 (127.0.0.1) 同子网的本机 IP"));
|
|
88
|
-
expect(post.mock.calls[0]?.[1]).toMatchObject({
|
|
89
|
-
runtimeBridgeBaseUrl: "http://127.0.0.1:18081",
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
it("uses configured serverUrl for lifecycle callbacks when env scheduler URL is absent", async () => {
|
|
93
|
-
const runtimeHome = createRuntimeHome();
|
|
94
|
-
useRuntimeHome(runtimeHome);
|
|
95
|
-
writeAutoRegisterConfig(runtimeHome, "http://127.0.0.1:7380");
|
|
96
|
-
const post = await mockSuccessfulPost({
|
|
97
|
-
success: true,
|
|
98
|
-
instanceId: "bridge-instance-1",
|
|
99
|
-
userId: "user-1",
|
|
100
|
-
message: "ok",
|
|
101
|
-
runtimeAccessToken: "runtime-token-123456",
|
|
102
|
-
});
|
|
103
|
-
const { autoRegister, bridgeRestartCleanup, requestRuntimeAccessTokenRefresh, unregister } = await import("./auto-register.js");
|
|
104
|
-
await expect(autoRegister()).resolves.toBe(true);
|
|
105
|
-
await expect(bridgeRestartCleanup()).resolves.toMatchObject({ success: true });
|
|
106
|
-
post.mockResolvedValueOnce({
|
|
107
|
-
data: {
|
|
108
|
-
success: true,
|
|
109
|
-
runtimeAccessToken: "refreshed-token-123456",
|
|
110
|
-
userId: "user-1",
|
|
111
|
-
},
|
|
112
|
-
});
|
|
113
|
-
await expect(requestRuntimeAccessTokenRefresh()).resolves.toMatchObject({
|
|
114
|
-
success: true,
|
|
115
|
-
runtimeAccessToken: "refreshed-token-123456",
|
|
116
|
-
});
|
|
117
|
-
post.mockResolvedValueOnce({ data: { success: true, message: "unregistered" } });
|
|
118
|
-
await expect(unregister()).resolves.toBe(true);
|
|
119
|
-
expect(post.mock.calls[0]?.[0]).toBe("http://127.0.0.1:7380/api/instances/register");
|
|
120
|
-
expect(post.mock.calls[1]?.[0]).toBe("http://127.0.0.1:7380/api/instances/bridge-restart-cleanup");
|
|
121
|
-
expect(post.mock.calls[2]?.[0]).toBe("http://127.0.0.1:7380/api/instances/runtime-tokens/refresh");
|
|
122
|
-
expect(post.mock.calls[3]?.[0]).toBe("http://127.0.0.1:7380/api/instances/unregister");
|
|
123
|
-
expect(post.mock.calls[3]?.[2]?.headers?.["X-Runtime-Token"]).toBe("refreshed-token-123456");
|
|
124
|
-
const { getRuntimeAccessToken, loadRuntimeBinding } = await import("./runtime-binding.js");
|
|
125
|
-
expect(getRuntimeAccessToken("user-1", "http://127.0.0.1:7380")).toBeUndefined();
|
|
126
|
-
expect(loadRuntimeBinding().status).toBe("unpaired");
|
|
127
|
-
});
|
|
128
|
-
it("uses the registered target URL instead of the first configured target", async () => {
|
|
129
|
-
const runtimeHome = createRuntimeHome();
|
|
130
|
-
useRuntimeHome(runtimeHome);
|
|
131
|
-
writeAutoRegisterConfig(runtimeHome, [
|
|
132
|
-
{ serverUrl: "http://scheduler-a.local:7380", userKey: "aws_live_key_a" },
|
|
133
|
-
{ serverUrl: "http://scheduler-b.local:7380", userKey: "aws_live_key_b" },
|
|
134
|
-
]);
|
|
135
|
-
const post = await mockSuccessfulPost({ success: false, message: "unexpected" });
|
|
136
|
-
post.mockResolvedValueOnce({
|
|
137
|
-
data: {
|
|
138
|
-
success: true,
|
|
139
|
-
instanceId: "bridge-a",
|
|
140
|
-
userId: "user-a",
|
|
141
|
-
runtimeAccessToken: "runtime-token-a-123456",
|
|
142
|
-
},
|
|
143
|
-
});
|
|
144
|
-
post.mockResolvedValueOnce({
|
|
145
|
-
data: {
|
|
146
|
-
success: true,
|
|
147
|
-
instanceId: "bridge-b",
|
|
148
|
-
userId: "user-b",
|
|
149
|
-
runtimeAccessToken: "runtime-token-b-123456",
|
|
150
|
-
},
|
|
151
|
-
});
|
|
152
|
-
post.mockResolvedValueOnce({ data: { success: true, message: "cleanup ok" } });
|
|
153
|
-
const { autoRegister, bridgeRestartCleanup } = await import("./auto-register.js");
|
|
154
|
-
await expect(autoRegister()).resolves.toBe(true);
|
|
155
|
-
await expect(bridgeRestartCleanup()).resolves.toMatchObject({ success: true });
|
|
156
|
-
expect(post.mock.calls[0]?.[0]).toBe("http://scheduler-a.local:7380/api/instances/register");
|
|
157
|
-
expect(post.mock.calls[1]?.[0]).toBe("http://scheduler-b.local:7380/api/instances/register");
|
|
158
|
-
expect(post.mock.calls[2]?.[0]).toBe("http://scheduler-b.local:7380/api/instances/bridge-restart-cleanup");
|
|
159
|
-
});
|
|
160
|
-
it("falls back to paired runtime binding scheduler URL when config has no serverUrl", async () => {
|
|
161
|
-
const runtimeHome = createRuntimeHome();
|
|
162
|
-
useRuntimeHome(runtimeHome);
|
|
163
|
-
const post = await mockSuccessfulPost({
|
|
164
|
-
success: true,
|
|
165
|
-
runtimeAccessToken: "binding-refresh-token-123456",
|
|
166
|
-
userId: "user-from-binding",
|
|
167
|
-
});
|
|
168
|
-
const { saveRuntimeBinding } = await import("./runtime-binding.js");
|
|
169
|
-
const { requestRuntimeAccessTokenRefresh } = await import("./auto-register.js");
|
|
170
|
-
saveRuntimeBinding({
|
|
171
|
-
accessToken: "existing-binding-token-123456",
|
|
172
|
-
instanceId: "bridge-from-binding",
|
|
173
|
-
userId: "user-from-binding",
|
|
174
|
-
schedulerBaseUrl: "http://paired-scheduler.local:7380",
|
|
175
|
-
});
|
|
176
|
-
process.env.AWS_AUTO_REGISTER = "true";
|
|
177
|
-
process.env.AWS_USER_KEY = "aws_live_env_key";
|
|
178
|
-
await expect(requestRuntimeAccessTokenRefresh()).resolves.toMatchObject({
|
|
179
|
-
success: true,
|
|
180
|
-
runtimeAccessToken: "binding-refresh-token-123456",
|
|
181
|
-
});
|
|
182
|
-
expect(post.mock.calls[0]?.[0]).toBe("http://paired-scheduler.local:7380/api/instances/runtime-tokens/refresh");
|
|
183
|
-
});
|
|
184
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"aws-client-agent-mcp.test.d.ts","sourceRoot":"","sources":["../../src/services/aws-client-agent-mcp.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
import { spawnSync } from 'node:child_process';
|
|
2
|
-
import { existsSync, lstatSync, mkdirSync, mkdtempSync, readFileSync, readlinkSync, realpathSync, rmSync, writeFileSync, } from 'node:fs';
|
|
3
|
-
import os from 'node:os';
|
|
4
|
-
import path from 'node:path';
|
|
5
|
-
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
6
|
-
const originalEnv = { ...process.env };
|
|
7
|
-
afterEach(() => {
|
|
8
|
-
process.env = { ...originalEnv };
|
|
9
|
-
vi.resetModules();
|
|
10
|
-
vi.restoreAllMocks();
|
|
11
|
-
});
|
|
12
|
-
function createBundledMcpPackage(version = '1.0.0') {
|
|
13
|
-
const packageRoot = mkdtempSync(path.join(os.tmpdir(), 'aws-mcp-package-'));
|
|
14
|
-
const bundledDist = path.join(packageRoot, 'package', 'aws-client-agent-mcp', 'dist');
|
|
15
|
-
mkdirSync(bundledDist, { recursive: true });
|
|
16
|
-
writeFileSync(path.join(packageRoot, 'package.json'), JSON.stringify({ name: 'aws-runtime-bridge', version: '9.9.9' }), 'utf-8');
|
|
17
|
-
writeFileSync(path.join(packageRoot, 'package', 'aws-client-agent-mcp', 'package.json'), JSON.stringify({
|
|
18
|
-
name: 'aws-client-agent-mcp',
|
|
19
|
-
version,
|
|
20
|
-
type: 'module',
|
|
21
|
-
main: 'dist/index.js',
|
|
22
|
-
dependencies: {
|
|
23
|
-
'@modelcontextprotocol/sdk': '^1.27.1',
|
|
24
|
-
ws: '^8.14.2',
|
|
25
|
-
yaml: '^2.3.4',
|
|
26
|
-
},
|
|
27
|
-
}), 'utf-8');
|
|
28
|
-
writeFileSync(path.join(packageRoot, 'package', 'aws-client-agent-mcp', 'README.md'), '# aws-client-agent-mcp\n', 'utf-8');
|
|
29
|
-
mkdirSync(path.join(packageRoot, 'node_modules', '@modelcontextprotocol', 'sdk'), {
|
|
30
|
-
recursive: true,
|
|
31
|
-
});
|
|
32
|
-
writeFileSync(path.join(packageRoot, 'node_modules', '@modelcontextprotocol', 'sdk', 'package.json'), JSON.stringify({
|
|
33
|
-
name: '@modelcontextprotocol/sdk',
|
|
34
|
-
version: '1.27.1',
|
|
35
|
-
type: 'module',
|
|
36
|
-
main: 'index.js',
|
|
37
|
-
exports: './index.js',
|
|
38
|
-
}), 'utf-8');
|
|
39
|
-
writeFileSync(path.join(packageRoot, 'node_modules', '@modelcontextprotocol', 'sdk', 'index.js'), 'export const sdkMarker = "resolved-sdk";\n', 'utf-8');
|
|
40
|
-
mkdirSync(path.join(packageRoot, 'node_modules', 'ws'), { recursive: true });
|
|
41
|
-
mkdirSync(path.join(packageRoot, 'node_modules', 'yaml'), { recursive: true });
|
|
42
|
-
writeFileSync(path.join(bundledDist, 'index.js'), 'console.log("mcp v1");\n', 'utf-8');
|
|
43
|
-
return packageRoot;
|
|
44
|
-
}
|
|
45
|
-
describe('aws-client-agent-mcp service', () => {
|
|
46
|
-
it('prefers explicit command override from env', async () => {
|
|
47
|
-
process.env.AWS_CLIENT_AGENT_MCP_COMMAND = 'custom-aws-client-agent-mcp';
|
|
48
|
-
process.env.AWS_CLIENT_AGENT_MCP_ARGS = JSON.stringify(['--stdio', '--trace']);
|
|
49
|
-
const mod = await import('./aws-client-agent-mcp.js');
|
|
50
|
-
expect(mod.resolveAwsClientAgentMcpCommand()).toEqual({
|
|
51
|
-
source: 'override',
|
|
52
|
-
command: 'custom-aws-client-agent-mcp',
|
|
53
|
-
args: ['--stdio', '--trace'],
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
it('uses bundled dist entry after release check', async () => {
|
|
57
|
-
process.env.AWS_CLIENT_AGENT_MCP_COMMAND = '';
|
|
58
|
-
const mod = await import('./aws-client-agent-mcp.js');
|
|
59
|
-
const releasedEntry = path.join(os.homedir(), '.aws-bridge', 'mcp', 'dist', 'index.js');
|
|
60
|
-
const exists = vi.fn((filePath) => filePath === releasedEntry);
|
|
61
|
-
const release = vi.fn(() => releasedEntry);
|
|
62
|
-
const resolved = mod.resolveAwsClientAgentMcpCommand({ exists, release });
|
|
63
|
-
expect(resolved).toEqual({
|
|
64
|
-
source: 'bundled',
|
|
65
|
-
command: process.execPath,
|
|
66
|
-
args: [releasedEntry],
|
|
67
|
-
});
|
|
68
|
-
expect(exists).toHaveBeenCalled();
|
|
69
|
-
expect(release).toHaveBeenCalledOnce();
|
|
70
|
-
});
|
|
71
|
-
it('writes release manifest and skips copy when bundled mcp is unchanged', async () => {
|
|
72
|
-
process.env.AWS_CLIENT_AGENT_MCP_COMMAND = '';
|
|
73
|
-
const packageRoot = createBundledMcpPackage('1.0.0');
|
|
74
|
-
const releasedRoot = mkdtempSync(path.join(os.tmpdir(), 'aws-mcp-release-'));
|
|
75
|
-
try {
|
|
76
|
-
const mod = await import('./aws-client-agent-mcp.js');
|
|
77
|
-
const firstRelease = mod.releaseBundledAwsClientAgentMcp({
|
|
78
|
-
packageRoot,
|
|
79
|
-
releasedRoot,
|
|
80
|
-
now: () => '2026-05-04T00:00:00.000Z',
|
|
81
|
-
});
|
|
82
|
-
const releasedIndex = path.join(releasedRoot, 'dist', 'index.js');
|
|
83
|
-
const manifestPath = path.join(releasedRoot, '.release.json');
|
|
84
|
-
const releasedPackageJson = path.join(releasedRoot, 'package.json');
|
|
85
|
-
const releasedNodeModules = path.join(releasedRoot, 'node_modules');
|
|
86
|
-
expect(firstRelease).toBe(releasedIndex);
|
|
87
|
-
expect(existsSync(releasedIndex)).toBe(true);
|
|
88
|
-
expect(JSON.parse(readFileSync(releasedPackageJson, 'utf-8'))).toMatchObject({
|
|
89
|
-
name: 'aws-client-agent-mcp',
|
|
90
|
-
version: '1.0.0',
|
|
91
|
-
dependencies: {
|
|
92
|
-
'@modelcontextprotocol/sdk': '^1.27.1',
|
|
93
|
-
},
|
|
94
|
-
});
|
|
95
|
-
expect(readFileSync(path.join(releasedRoot, 'README.md'), 'utf-8')).toBe('# aws-client-agent-mcp\n');
|
|
96
|
-
expect(lstatSync(releasedNodeModules).isSymbolicLink()).toBe(true);
|
|
97
|
-
expect(realpathSync(releasedNodeModules)).toBe(realpathSync(path.join(packageRoot, 'node_modules')));
|
|
98
|
-
expect(path.resolve(readlinkSync(releasedNodeModules))).toBe(path.join(packageRoot, 'node_modules'));
|
|
99
|
-
const firstManifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
|
|
100
|
-
expect(firstManifest).toMatchObject({
|
|
101
|
-
bridgeVersion: '9.9.9',
|
|
102
|
-
mcpVersion: '1.0.0',
|
|
103
|
-
releasedAt: '2026-05-04T00:00:00.000Z',
|
|
104
|
-
});
|
|
105
|
-
expect(firstManifest.distHash).toMatch(/^sha256:/);
|
|
106
|
-
writeFileSync(releasedIndex, 'console.log("local marker");\n', 'utf-8');
|
|
107
|
-
rmSync(releasedNodeModules, { recursive: true, force: true });
|
|
108
|
-
mkdirSync(releasedNodeModules, { recursive: true });
|
|
109
|
-
mod.releaseBundledAwsClientAgentMcp({
|
|
110
|
-
packageRoot,
|
|
111
|
-
releasedRoot,
|
|
112
|
-
now: () => '2026-05-05T00:00:00.000Z',
|
|
113
|
-
});
|
|
114
|
-
expect(readFileSync(releasedIndex, 'utf-8')).toBe('console.log("local marker");\n');
|
|
115
|
-
expect(realpathSync(releasedNodeModules)).toBe(realpathSync(path.join(packageRoot, 'node_modules')));
|
|
116
|
-
expect(JSON.parse(readFileSync(manifestPath, 'utf-8')).releasedAt).toBe('2026-05-04T00:00:00.000Z');
|
|
117
|
-
}
|
|
118
|
-
finally {
|
|
119
|
-
rmSync(packageRoot, { recursive: true, force: true });
|
|
120
|
-
rmSync(releasedRoot, { recursive: true, force: true });
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
it('refreshes released mcp when bundled dist changes', async () => {
|
|
124
|
-
process.env.AWS_CLIENT_AGENT_MCP_COMMAND = '';
|
|
125
|
-
const packageRoot = createBundledMcpPackage('1.0.0');
|
|
126
|
-
const releasedRoot = mkdtempSync(path.join(os.tmpdir(), 'aws-mcp-release-'));
|
|
127
|
-
try {
|
|
128
|
-
const mod = await import('./aws-client-agent-mcp.js');
|
|
129
|
-
const bundledIndex = path.join(packageRoot, 'package', 'aws-client-agent-mcp', 'dist', 'index.js');
|
|
130
|
-
const releasedIndex = path.join(releasedRoot, 'dist', 'index.js');
|
|
131
|
-
mod.releaseBundledAwsClientAgentMcp({ packageRoot, releasedRoot });
|
|
132
|
-
writeFileSync(bundledIndex, 'console.log("mcp v2");\n', 'utf-8');
|
|
133
|
-
mod.releaseBundledAwsClientAgentMcp({
|
|
134
|
-
packageRoot,
|
|
135
|
-
releasedRoot,
|
|
136
|
-
now: () => '2026-05-05T00:00:00.000Z',
|
|
137
|
-
});
|
|
138
|
-
expect(readFileSync(releasedIndex, 'utf-8')).toBe('console.log("mcp v2");\n');
|
|
139
|
-
expect(JSON.parse(readFileSync(path.join(releasedRoot, '.release.json'), 'utf-8')).releasedAt).toBe('2026-05-05T00:00:00.000Z');
|
|
140
|
-
}
|
|
141
|
-
finally {
|
|
142
|
-
rmSync(packageRoot, { recursive: true, force: true });
|
|
143
|
-
rmSync(releasedRoot, { recursive: true, force: true });
|
|
144
|
-
}
|
|
145
|
-
});
|
|
146
|
-
it('releases a runnable package root that resolves bundled mcp runtime dependencies', async () => {
|
|
147
|
-
process.env.AWS_CLIENT_AGENT_MCP_COMMAND = '';
|
|
148
|
-
const packageRoot = createBundledMcpPackage('1.0.0');
|
|
149
|
-
const releasedRoot = mkdtempSync(path.join(os.tmpdir(), 'aws-mcp-release-'));
|
|
150
|
-
try {
|
|
151
|
-
const bundledIndex = path.join(packageRoot, 'package', 'aws-client-agent-mcp', 'dist', 'index.js');
|
|
152
|
-
writeFileSync(bundledIndex, 'import { sdkMarker } from "@modelcontextprotocol/sdk";\nconsole.log(sdkMarker);\n', 'utf-8');
|
|
153
|
-
const mod = await import('./aws-client-agent-mcp.js');
|
|
154
|
-
const releasedEntry = mod.releaseBundledAwsClientAgentMcp({ packageRoot, releasedRoot });
|
|
155
|
-
expect(releasedEntry).toBe(path.join(releasedRoot, 'dist', 'index.js'));
|
|
156
|
-
if (!releasedEntry) {
|
|
157
|
-
throw new Error('Expected bundled MCP release entry to exist');
|
|
158
|
-
}
|
|
159
|
-
const result = spawnSync(process.execPath, [releasedEntry], {
|
|
160
|
-
cwd: releasedRoot,
|
|
161
|
-
encoding: 'utf-8',
|
|
162
|
-
});
|
|
163
|
-
expect(result.stderr).toBe('');
|
|
164
|
-
expect(result.status).toBe(0);
|
|
165
|
-
expect(result.stdout.trim()).toBe('resolved-sdk');
|
|
166
|
-
}
|
|
167
|
-
finally {
|
|
168
|
-
rmSync(packageRoot, { recursive: true, force: true });
|
|
169
|
-
rmSync(releasedRoot, { recursive: true, force: true });
|
|
170
|
-
}
|
|
171
|
-
});
|
|
172
|
-
it('releases bundled mcp into home directory when runtime dist is missing', async () => {
|
|
173
|
-
process.env.AWS_CLIENT_AGENT_MCP_COMMAND = '';
|
|
174
|
-
const mod = await import('./aws-client-agent-mcp.js');
|
|
175
|
-
const releasedEntry = path.join(os.homedir(), '.aws-bridge', 'mcp', 'dist', 'index.js');
|
|
176
|
-
let released = false;
|
|
177
|
-
const exists = vi.fn((filePath) => released && filePath === releasedEntry);
|
|
178
|
-
const release = vi.fn(() => {
|
|
179
|
-
released = true;
|
|
180
|
-
return releasedEntry;
|
|
181
|
-
});
|
|
182
|
-
expect(mod.resolveAwsClientAgentMcpCommand({ exists, release })).toEqual({
|
|
183
|
-
source: 'bundled',
|
|
184
|
-
command: process.execPath,
|
|
185
|
-
args: [releasedEntry],
|
|
186
|
-
});
|
|
187
|
-
expect(release).toHaveBeenCalledOnce();
|
|
188
|
-
});
|
|
189
|
-
it('falls back to global aws-client-agent-mcp command when bundle is missing', async () => {
|
|
190
|
-
process.env.AWS_CLIENT_AGENT_MCP_COMMAND = '';
|
|
191
|
-
const mod = await import('./aws-client-agent-mcp.js');
|
|
192
|
-
expect(mod.resolveAwsClientAgentMcpCommand({ exists: () => false, release: () => null })).toEqual({
|
|
193
|
-
source: 'global',
|
|
194
|
-
command: 'aws-client-agent-mcp',
|
|
195
|
-
args: [],
|
|
196
|
-
});
|
|
197
|
-
});
|
|
198
|
-
it('builds aws-mcp server config with inferred scheduler urls', async () => {
|
|
199
|
-
process.env.AWS_CLIENT_AGENT_MCP_COMMAND = 'aws-client-agent-mcp';
|
|
200
|
-
process.env.CUSTOM_SECRET = 'should-not-leak';
|
|
201
|
-
process.env.AWS_RUNTIME_HOME_DIR = mkdtempSync(path.join(os.tmpdir(), 'aws-mcp-config-'));
|
|
202
|
-
process.env.AWS_TEST_HOME = process.env.AWS_RUNTIME_HOME_DIR;
|
|
203
|
-
process.env.AWS_RUNTIME_SCHEDULER_BASE_URL = '';
|
|
204
|
-
process.env.AWS_SERVER_URL = '';
|
|
205
|
-
process.env.AWS_MCP_HTTP_URL = '';
|
|
206
|
-
const mod = await import('./aws-client-agent-mcp.js');
|
|
207
|
-
const config = mod.buildAwsMcpServerConfig({
|
|
208
|
-
agentId: 'agent-1',
|
|
209
|
-
workspacePath: '/workspace/demo',
|
|
210
|
-
});
|
|
211
|
-
expect(config.command).toBe('aws-client-agent-mcp');
|
|
212
|
-
expect(config.env.AWS_AGENT_ID).toBe('agent-1');
|
|
213
|
-
expect(config.env.AWS_WORKSPACE_PATH).toBe('/workspace/demo');
|
|
214
|
-
expect(config.env.AWS_SERVER_URL).toBe('ws://localhost:8080/ws/agent');
|
|
215
|
-
expect(config.env.AWS_MCP_HTTP_URL).toBe('http://localhost:8080/mcp/call');
|
|
216
|
-
expect(config.env.CUSTOM_SECRET).toBeUndefined();
|
|
217
|
-
});
|
|
218
|
-
it('repairs duplicated scheduler ports when building MCP URLs', async () => {
|
|
219
|
-
process.env.AWS_CLIENT_AGENT_MCP_COMMAND = 'aws-client-agent-mcp';
|
|
220
|
-
process.env.AWS_RUNTIME_HOME_DIR = mkdtempSync(path.join(os.tmpdir(), 'aws-mcp-config-'));
|
|
221
|
-
process.env.AWS_RUNTIME_SCHEDULER_BASE_URL = 'http://127.0.0.1:8080:8080';
|
|
222
|
-
process.env.AWS_SERVER_URL = '';
|
|
223
|
-
process.env.AWS_MCP_HTTP_URL = '';
|
|
224
|
-
const mod = await import('./aws-client-agent-mcp.js');
|
|
225
|
-
const config = mod.buildAwsMcpServerConfig({
|
|
226
|
-
agentId: 'agent-1',
|
|
227
|
-
workspacePath: '/workspace/demo',
|
|
228
|
-
});
|
|
229
|
-
expect(config.env.AWS_SERVER_URL).toBe('ws://127.0.0.1:8080/ws/agent');
|
|
230
|
-
expect(config.env.AWS_MCP_HTTP_URL).toBe('http://127.0.0.1:8080/mcp/call');
|
|
231
|
-
});
|
|
232
|
-
it('ignores malformed AWS_CLIENT_AGENT_MCP_ARGS JSON', async () => {
|
|
233
|
-
process.env.AWS_CLIENT_AGENT_MCP_COMMAND = 'custom-aws-client-agent-mcp';
|
|
234
|
-
process.env.AWS_CLIENT_AGENT_MCP_ARGS = '{bad json';
|
|
235
|
-
const mod = await import('./aws-client-agent-mcp.js');
|
|
236
|
-
expect(mod.resolveAwsClientAgentMcpCommand()).toEqual({
|
|
237
|
-
source: 'override',
|
|
238
|
-
command: 'custom-aws-client-agent-mcp',
|
|
239
|
-
args: [],
|
|
240
|
-
});
|
|
241
|
-
});
|
|
242
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bridge-package-publish-hooks.test.d.ts","sourceRoot":"","sources":["../../src/services/bridge-package-publish-hooks.test.ts"],"names":[],"mappings":""}
|