aws-runtime-bridge 1.9.33 → 1.9.40

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.
Files changed (276) hide show
  1. package/dist/adapter/AcodeSdkAdapter.d.ts +35 -1
  2. package/dist/adapter/AcodeSdkAdapter.d.ts.map +1 -1
  3. package/dist/adapter/AcodeSdkAdapter.js +417 -40
  4. package/dist/adapter/ClaudeSdkAdapter.d.ts +6 -0
  5. package/dist/adapter/ClaudeSdkAdapter.d.ts.map +1 -1
  6. package/dist/adapter/ClaudeSdkAdapter.js +23 -1
  7. package/dist/adapter/idle-poll-loop.d.ts +2 -1
  8. package/dist/adapter/idle-poll-loop.d.ts.map +1 -1
  9. package/dist/adapter/types.d.ts +65 -3
  10. package/dist/adapter/types.d.ts.map +1 -1
  11. package/dist/adapter/types.js +5 -4
  12. package/dist/index.js +4 -0
  13. package/dist/routes/acode-todos.d.ts +11 -0
  14. package/dist/routes/acode-todos.d.ts.map +1 -0
  15. package/dist/routes/acode-todos.js +75 -0
  16. package/dist/routes/memory.d.ts +1 -1
  17. package/dist/routes/memory.d.ts.map +1 -1
  18. package/dist/routes/memory.js +3 -3
  19. package/dist/routes/pty.d.ts.map +1 -1
  20. package/dist/routes/pty.js +9 -0
  21. package/dist/routes/sub-agents.d.ts +14 -0
  22. package/dist/routes/sub-agents.d.ts.map +1 -0
  23. package/dist/routes/sub-agents.js +253 -0
  24. package/dist/routes/terminal.d.ts +9 -1
  25. package/dist/routes/terminal.d.ts.map +1 -1
  26. package/dist/routes/terminal.js +207 -22
  27. package/dist/services/agent-event-store.d.ts +1 -0
  28. package/dist/services/agent-event-store.d.ts.map +1 -1
  29. package/dist/services/event-delta-pusher.js +4 -4
  30. package/dist/services/session-output.d.ts +3 -0
  31. package/dist/services/session-output.d.ts.map +1 -1
  32. package/dist/services/session-output.js +38 -2
  33. package/dist/services/sub-agent-manager-instance.d.ts +4 -0
  34. package/dist/services/sub-agent-manager-instance.d.ts.map +1 -0
  35. package/dist/services/sub-agent-manager-instance.js +12 -0
  36. package/dist/services/workspace-files.d.ts +1 -0
  37. package/dist/services/workspace-files.d.ts.map +1 -1
  38. package/dist/services/workspace-files.js +57 -1
  39. package/package/acode/dist/ask-user-question-tool.d.ts +47 -0
  40. package/package/acode/dist/ask-user-question-tool.d.ts.map +1 -0
  41. package/package/acode/dist/ask-user-question-tool.js +233 -0
  42. package/package/acode/dist/built-in-file-tools.d.ts +2 -0
  43. package/package/acode/dist/built-in-file-tools.d.ts.map +1 -1
  44. package/package/acode/dist/compaction.d.ts +206 -0
  45. package/package/acode/dist/compaction.d.ts.map +1 -0
  46. package/package/acode/dist/compaction.js +664 -0
  47. package/package/acode/dist/config.d.ts +6 -1
  48. package/package/acode/dist/config.d.ts.map +1 -1
  49. package/package/acode/dist/config.js +27 -2
  50. package/package/acode/dist/index.d.ts +4 -0
  51. package/package/acode/dist/index.d.ts.map +1 -1
  52. package/package/acode/dist/index.js +4 -0
  53. package/package/acode/dist/runtime.d.ts +137 -0
  54. package/package/acode/dist/runtime.d.ts.map +1 -1
  55. package/package/acode/dist/runtime.js +974 -172
  56. package/package/acode/dist/skill-tool.d.ts +30 -0
  57. package/package/acode/dist/skill-tool.d.ts.map +1 -0
  58. package/package/acode/dist/skill-tool.js +174 -0
  59. package/package/acode/dist/sub-agent-manager.d.ts +169 -0
  60. package/package/acode/dist/sub-agent-manager.d.ts.map +1 -0
  61. package/package/acode/dist/sub-agent-manager.js +535 -0
  62. package/package/acode/dist/sub-agent-store.d.ts +33 -0
  63. package/package/acode/dist/sub-agent-store.d.ts.map +1 -0
  64. package/package/acode/dist/sub-agent-store.js +109 -0
  65. package/package/acode/dist/sub-agent-tools.d.ts +72 -0
  66. package/package/acode/dist/sub-agent-tools.d.ts.map +1 -0
  67. package/package/acode/dist/sub-agent-tools.js +429 -0
  68. package/package/acode/dist/sub-agent-types.d.ts +81 -0
  69. package/package/acode/dist/sub-agent-types.d.ts.map +1 -0
  70. package/package/acode/dist/sub-agent-types.js +8 -0
  71. package/package/acode/dist/todo-store.d.ts +42 -0
  72. package/package/acode/dist/todo-store.d.ts.map +1 -0
  73. package/package/acode/dist/todo-store.js +68 -0
  74. package/package/acode/dist/todo-tool.d.ts +6 -0
  75. package/package/acode/dist/todo-tool.d.ts.map +1 -0
  76. package/package/acode/dist/todo-tool.js +138 -0
  77. package/package/acode/dist/types.d.ts +22 -1
  78. package/package/acode/dist/types.d.ts.map +1 -1
  79. package/package/acode/package.json +13 -2
  80. package/package/aws-client-agent-mcp/dist/context-manager.test.js +0 -3
  81. package/package/aws-client-agent-mcp/dist/context-manager.test.js.map +1 -1
  82. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +83 -50
  83. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -1
  84. package/package/aws-client-agent-mcp/dist/mcp-server.js +451 -346
  85. package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -1
  86. package/package/aws-client-agent-mcp/dist/mcp-server.test.js +259 -241
  87. package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -1
  88. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +1 -19
  89. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +1 -1
  90. package/package/aws-client-agent-mcp/dist/mcp-tools.js +4 -77
  91. package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +1 -1
  92. package/package/aws-client-agent-mcp/dist/memory-store.d.ts +17 -40
  93. package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +1 -1
  94. package/package/aws-client-agent-mcp/dist/memory-store.js +62 -149
  95. package/package/aws-client-agent-mcp/dist/memory-store.js.map +1 -1
  96. package/package/aws-client-agent-mcp/dist/memory-store.test.js +175 -164
  97. package/package/aws-client-agent-mcp/dist/memory-store.test.js.map +1 -1
  98. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +3 -9
  99. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts.map +1 -1
  100. package/package/aws-client-agent-mcp/dist/memory-tools.js +28 -55
  101. package/package/aws-client-agent-mcp/dist/memory-tools.js.map +1 -1
  102. package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +27 -9
  103. package/package/aws-client-agent-mcp/dist/message-buffer.d.ts.map +1 -1
  104. package/package/aws-client-agent-mcp/dist/message-buffer.js +100 -23
  105. package/package/aws-client-agent-mcp/dist/message-buffer.js.map +1 -1
  106. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +1 -14
  107. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts.map +1 -1
  108. package/package/aws-client-agent-mcp/dist/server-memory-store.js +7 -18
  109. package/package/aws-client-agent-mcp/dist/server-memory-store.js.map +1 -1
  110. package/package/aws-client-agent-mcp/dist/status-reporter.d.ts.map +1 -1
  111. package/package/aws-client-agent-mcp/dist/status-reporter.js +8 -5
  112. package/package/aws-client-agent-mcp/dist/status-reporter.js.map +1 -1
  113. package/package/aws-client-agent-mcp/dist/status-reporter.test.js +93 -0
  114. package/package/aws-client-agent-mcp/dist/status-reporter.test.js.map +1 -1
  115. package/package/aws-client-agent-mcp/dist/types.d.ts +3 -25
  116. package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -1
  117. package/package.json +17 -7
  118. package/dist/adapter/AcodeSdkAdapter.test.d.ts +0 -2
  119. package/dist/adapter/AcodeSdkAdapter.test.d.ts.map +0 -1
  120. package/dist/adapter/AcodeSdkAdapter.test.js +0 -2000
  121. package/dist/adapter/AdapterRegistry.test.d.ts +0 -5
  122. package/dist/adapter/AdapterRegistry.test.d.ts.map +0 -1
  123. package/dist/adapter/AdapterRegistry.test.js +0 -118
  124. package/dist/adapter/ClaudeSdkAdapter.test.d.ts +0 -2
  125. package/dist/adapter/ClaudeSdkAdapter.test.d.ts.map +0 -1
  126. package/dist/adapter/ClaudeSdkAdapter.test.js +0 -311
  127. package/dist/adapter/CodexSdkAdapter.test.d.ts +0 -2
  128. package/dist/adapter/CodexSdkAdapter.test.d.ts.map +0 -1
  129. package/dist/adapter/CodexSdkAdapter.test.js +0 -270
  130. package/dist/adapter/OpencodeSdkAdapter.test.d.ts +0 -2
  131. package/dist/adapter/OpencodeSdkAdapter.test.d.ts.map +0 -1
  132. package/dist/adapter/OpencodeSdkAdapter.test.js +0 -158
  133. package/dist/adapter/acode-tool-names.test.d.ts +0 -2
  134. package/dist/adapter/acode-tool-names.test.d.ts.map +0 -1
  135. package/dist/adapter/acode-tool-names.test.js +0 -28
  136. package/dist/adapter/adapter.test.d.ts +0 -5
  137. package/dist/adapter/adapter.test.d.ts.map +0 -1
  138. package/dist/adapter/adapter.test.js +0 -180
  139. package/dist/adapter/idle-poll-loop.test.d.ts +0 -2
  140. package/dist/adapter/idle-poll-loop.test.d.ts.map +0 -1
  141. package/dist/adapter/idle-poll-loop.test.js +0 -85
  142. package/dist/adapter/types.test.d.ts +0 -2
  143. package/dist/adapter/types.test.d.ts.map +0 -1
  144. package/dist/adapter/types.test.js +0 -50
  145. package/dist/adapters/cc-switch/mcp-acode.test.d.ts +0 -2
  146. package/dist/adapters/cc-switch/mcp-acode.test.d.ts.map +0 -1
  147. package/dist/adapters/cc-switch/mcp-acode.test.js +0 -80
  148. package/dist/adapters/cc-switch/mcp-claudecode.test.d.ts +0 -2
  149. package/dist/adapters/cc-switch/mcp-claudecode.test.d.ts.map +0 -1
  150. package/dist/adapters/cc-switch/mcp-claudecode.test.js +0 -75
  151. package/dist/adapters/cc-switch/mcp-codex.test.d.ts +0 -2
  152. package/dist/adapters/cc-switch/mcp-codex.test.d.ts.map +0 -1
  153. package/dist/adapters/cc-switch/mcp-codex.test.js +0 -126
  154. package/dist/adapters/cc-switch/mcp-opencode.test.d.ts +0 -2
  155. package/dist/adapters/cc-switch/mcp-opencode.test.d.ts.map +0 -1
  156. package/dist/adapters/cc-switch/mcp-opencode.test.js +0 -62
  157. package/dist/adapters/cc-switch/skill-directory.test.d.ts +0 -2
  158. package/dist/adapters/cc-switch/skill-directory.test.d.ts.map +0 -1
  159. package/dist/adapters/cc-switch/skill-directory.test.js +0 -74
  160. package/dist/config.test.d.ts +0 -2
  161. package/dist/config.test.d.ts.map +0 -1
  162. package/dist/config.test.js +0 -107
  163. package/dist/routes/ai-sources.test.d.ts +0 -2
  164. package/dist/routes/ai-sources.test.d.ts.map +0 -1
  165. package/dist/routes/ai-sources.test.js +0 -169
  166. package/dist/routes/file-browser.test.d.ts +0 -5
  167. package/dist/routes/file-browser.test.d.ts.map +0 -1
  168. package/dist/routes/file-browser.test.js +0 -155
  169. package/dist/routes/git.test.d.ts +0 -2
  170. package/dist/routes/git.test.d.ts.map +0 -1
  171. package/dist/routes/git.test.js +0 -330
  172. package/dist/routes/instance.test.d.ts +0 -5
  173. package/dist/routes/instance.test.d.ts.map +0 -1
  174. package/dist/routes/instance.test.js +0 -389
  175. package/dist/routes/mcp.test.d.ts +0 -5
  176. package/dist/routes/mcp.test.d.ts.map +0 -1
  177. package/dist/routes/mcp.test.js +0 -92
  178. package/dist/routes/memory-route-wiring.test.d.ts +0 -2
  179. package/dist/routes/memory-route-wiring.test.d.ts.map +0 -1
  180. package/dist/routes/memory-route-wiring.test.js +0 -15
  181. package/dist/routes/memory.test.d.ts +0 -2
  182. package/dist/routes/memory.test.d.ts.map +0 -1
  183. package/dist/routes/memory.test.js +0 -177
  184. package/dist/routes/properties.test.d.ts +0 -5
  185. package/dist/routes/properties.test.d.ts.map +0 -1
  186. package/dist/routes/properties.test.js +0 -72
  187. package/dist/routes/pty.test.d.ts +0 -2
  188. package/dist/routes/pty.test.d.ts.map +0 -1
  189. package/dist/routes/pty.test.js +0 -82
  190. package/dist/routes/runtime-binding.test.d.ts +0 -2
  191. package/dist/routes/runtime-binding.test.d.ts.map +0 -1
  192. package/dist/routes/runtime-binding.test.js +0 -32
  193. package/dist/routes/sessions.test.d.ts +0 -5
  194. package/dist/routes/sessions.test.d.ts.map +0 -1
  195. package/dist/routes/sessions.test.js +0 -86
  196. package/dist/routes/skills.test.d.ts +0 -5
  197. package/dist/routes/skills.test.d.ts.map +0 -1
  198. package/dist/routes/skills.test.js +0 -50
  199. package/dist/routes/system-metrics.test.d.ts +0 -2
  200. package/dist/routes/system-metrics.test.d.ts.map +0 -1
  201. package/dist/routes/system-metrics.test.js +0 -16
  202. package/dist/routes/terminal.stop-options.test.d.ts +0 -2
  203. package/dist/routes/terminal.stop-options.test.d.ts.map +0 -1
  204. package/dist/routes/terminal.stop-options.test.js +0 -39
  205. package/dist/routes/terminal.test.d.ts +0 -2
  206. package/dist/routes/terminal.test.d.ts.map +0 -1
  207. package/dist/routes/terminal.test.js +0 -746
  208. package/dist/routes/yml.test.d.ts +0 -5
  209. package/dist/routes/yml.test.d.ts.map +0 -1
  210. package/dist/routes/yml.test.js +0 -58
  211. package/dist/services/ai-source-apply.test.d.ts +0 -2
  212. package/dist/services/ai-source-apply.test.d.ts.map +0 -1
  213. package/dist/services/ai-source-apply.test.js +0 -138
  214. package/dist/services/auto-register.test.d.ts +0 -2
  215. package/dist/services/auto-register.test.d.ts.map +0 -1
  216. package/dist/services/auto-register.test.js +0 -184
  217. package/dist/services/aws-client-agent-mcp.test.d.ts +0 -2
  218. package/dist/services/aws-client-agent-mcp.test.d.ts.map +0 -1
  219. package/dist/services/aws-client-agent-mcp.test.js +0 -242
  220. package/dist/services/bridge-package-publish-hooks.test.d.ts +0 -2
  221. package/dist/services/bridge-package-publish-hooks.test.d.ts.map +0 -1
  222. package/dist/services/bridge-package-publish-hooks.test.js +0 -136
  223. package/dist/services/cc-switch-discovery.test.d.ts +0 -2
  224. package/dist/services/cc-switch-discovery.test.d.ts.map +0 -1
  225. package/dist/services/cc-switch-discovery.test.js +0 -56
  226. package/dist/services/cli-commands.test.d.ts +0 -2
  227. package/dist/services/cli-commands.test.d.ts.map +0 -1
  228. package/dist/services/cli-commands.test.js +0 -230
  229. package/dist/services/instance-init-service.test.d.ts +0 -2
  230. package/dist/services/instance-init-service.test.d.ts.map +0 -1
  231. package/dist/services/instance-init-service.test.js +0 -140
  232. package/dist/services/instance-state.test.d.ts +0 -2
  233. package/dist/services/instance-state.test.d.ts.map +0 -1
  234. package/dist/services/instance-state.test.js +0 -245
  235. package/dist/services/mcp-launch-binding-queue.test.d.ts +0 -2
  236. package/dist/services/mcp-launch-binding-queue.test.d.ts.map +0 -1
  237. package/dist/services/mcp-launch-binding-queue.test.js +0 -181
  238. package/dist/services/runtime-binding.test.d.ts +0 -2
  239. package/dist/services/runtime-binding.test.d.ts.map +0 -1
  240. package/dist/services/runtime-binding.test.js +0 -78
  241. package/dist/services/runtime-lifecycle-policy.test.d.ts +0 -2
  242. package/dist/services/runtime-lifecycle-policy.test.d.ts.map +0 -1
  243. package/dist/services/runtime-lifecycle-policy.test.js +0 -41
  244. package/dist/services/session-output.test.d.ts +0 -5
  245. package/dist/services/session-output.test.d.ts.map +0 -1
  246. package/dist/services/session-output.test.js +0 -177
  247. package/dist/services/startup-config-wizard.test.d.ts +0 -2
  248. package/dist/services/startup-config-wizard.test.d.ts.map +0 -1
  249. package/dist/services/startup-config-wizard.test.js +0 -184
  250. package/dist/services/terminal-persistence.test.d.ts +0 -5
  251. package/dist/services/terminal-persistence.test.d.ts.map +0 -1
  252. package/dist/services/terminal-persistence.test.js +0 -159
  253. package/dist/services/tool-installer.test.d.ts +0 -2
  254. package/dist/services/tool-installer.test.d.ts.map +0 -1
  255. package/dist/services/tool-installer.test.js +0 -225
  256. package/dist/services/workspace-files.test.d.ts +0 -2
  257. package/dist/services/workspace-files.test.d.ts.map +0 -1
  258. package/dist/services/workspace-files.test.js +0 -648
  259. package/dist/services/workspace-watch.test.d.ts +0 -2
  260. package/dist/services/workspace-watch.test.d.ts.map +0 -1
  261. package/dist/services/workspace-watch.test.js +0 -38
  262. package/dist/utils/file-utils.test.d.ts +0 -2
  263. package/dist/utils/file-utils.test.d.ts.map +0 -1
  264. package/dist/utils/file-utils.test.js +0 -244
  265. package/dist/utils/logger.test.d.ts +0 -2
  266. package/dist/utils/logger.test.d.ts.map +0 -1
  267. package/dist/utils/logger.test.js +0 -93
  268. package/dist/utils/sdk-package-loader.test.d.ts +0 -2
  269. package/dist/utils/sdk-package-loader.test.d.ts.map +0 -1
  270. package/dist/utils/sdk-package-loader.test.js +0 -84
  271. package/dist/utils/validation.test.d.ts +0 -2
  272. package/dist/utils/validation.test.d.ts.map +0 -1
  273. package/dist/utils/validation.test.js +0 -88
  274. package/dist/utils/yaml-utils.test.d.ts +0 -2
  275. package/dist/utils/yaml-utils.test.d.ts.map +0 -1
  276. package/dist/utils/yaml-utils.test.js +0 -363
@@ -1,5 +0,0 @@
1
- /**
2
- * YAML 路由单元测试
3
- */
4
- export {};
5
- //# sourceMappingURL=yml.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"yml.test.d.ts","sourceRoot":"","sources":["../../src/routes/yml.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=ai-source-apply.test.d.ts.map
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=auto-register.test.d.ts.map
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=aws-client-agent-mcp.test.d.ts.map
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=bridge-package-publish-hooks.test.d.ts.map
@@ -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":""}