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,38 +0,0 @@
1
- import { promises as fs } from 'node:fs';
2
- import os from 'node:os';
3
- import path from 'node:path';
4
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
5
- import { getWorkspaceWatchCountForTests, unwatchWorkspaceFile, watchWorkspaceFile, } from './workspace-watch.js';
6
- describe('workspace file watch service', () => {
7
- let tempRoot = '';
8
- let workspacePath = '';
9
- let filePath = '';
10
- beforeEach(async () => {
11
- tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'aws-workspace-watch-'));
12
- workspacePath = path.join(tempRoot, 'workspace');
13
- filePath = path.join(workspacePath, 'demo.docx');
14
- await fs.mkdir(workspacePath, { recursive: true });
15
- await fs.writeFile(filePath, 'watch me', 'utf-8');
16
- });
17
- afterEach(async () => {
18
- await unwatchWorkspaceFile({ workspacePath, filePath }).catch(() => undefined);
19
- await unwatchWorkspaceFile({ workspacePath, filePath }).catch(() => undefined);
20
- await fs.rm(tempRoot, { recursive: true, force: true, maxRetries: 3, retryDelay: 50 });
21
- });
22
- it('unwatches a deleted file by its original workspace path key', async () => {
23
- await watchWorkspaceFile({ workspacePath, filePath });
24
- expect(getWorkspaceWatchCountForTests()).toBe(1);
25
- await fs.rm(filePath);
26
- await unwatchWorkspaceFile({ workspacePath, filePath });
27
- expect(getWorkspaceWatchCountForTests()).toBe(0);
28
- });
29
- it('keeps shared watchers until all references unwatch', async () => {
30
- await watchWorkspaceFile({ workspacePath, filePath });
31
- await watchWorkspaceFile({ workspacePath, filePath });
32
- expect(getWorkspaceWatchCountForTests()).toBe(1);
33
- await unwatchWorkspaceFile({ workspacePath, filePath });
34
- expect(getWorkspaceWatchCountForTests()).toBe(1);
35
- await unwatchWorkspaceFile({ workspacePath, filePath });
36
- expect(getWorkspaceWatchCountForTests()).toBe(0);
37
- });
38
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=file-utils.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"file-utils.test.d.ts","sourceRoot":"","sources":["../../src/utils/file-utils.test.ts"],"names":[],"mappings":""}
@@ -1,244 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
- import { promises as fs } from 'node:fs';
3
- import os from 'node:os';
4
- import path from 'node:path';
5
- import { atomicWriteJsonFile, ensureDir, escapePowerShellLiteral, resolveSkillSourceDirFromExtractRoot, stringifyStableJson, toSdkAppsFromEnabledTools, resolveSkillSourceDir, } from './file-utils.js';
6
- // Mock axios for download tests
7
- vi.mock('axios', () => ({
8
- default: {
9
- get: vi.fn(),
10
- post: vi.fn(),
11
- },
12
- }));
13
- // Mock config
14
- vi.mock('../config.js', () => ({
15
- schedulerBaseUrl: 'http://localhost:8080',
16
- }));
17
- vi.mock('../services/runtime-binding.js', () => ({
18
- getRuntimeAccessToken: vi.fn(() => 'test-token'),
19
- }));
20
- describe('file-utils', () => {
21
- describe('ensureDir', () => {
22
- const tempDir = path.join(os.tmpdir(), `aws-file-utils-test-${Date.now()}`);
23
- afterEach(async () => {
24
- try {
25
- await fs.rm(tempDir, { recursive: true, force: true });
26
- }
27
- catch {
28
- // ignore
29
- }
30
- });
31
- it('should create directory if not exists', async () => {
32
- const result = await ensureDir(tempDir);
33
- expect(result).toBe(tempDir);
34
- const stat = await fs.stat(tempDir);
35
- expect(stat.isDirectory()).toBe(true);
36
- });
37
- it('should create nested directories', async () => {
38
- const nestedDir = path.join(tempDir, 'level1', 'level2', 'level3');
39
- const result = await ensureDir(nestedDir);
40
- expect(result).toBe(nestedDir);
41
- const stat = await fs.stat(nestedDir);
42
- expect(stat.isDirectory()).toBe(true);
43
- });
44
- it('should return path if directory already exists', async () => {
45
- await fs.mkdir(tempDir, { recursive: true });
46
- const result = await ensureDir(tempDir);
47
- expect(result).toBe(tempDir);
48
- });
49
- });
50
- describe('atomicWriteJsonFile', () => {
51
- const tempDir = path.join(os.tmpdir(), `aws-file-utils-json-test-${Date.now()}`);
52
- afterEach(async () => {
53
- await fs.rm(tempDir, { recursive: true, force: true }).catch(() => undefined);
54
- });
55
- it('should write stable sorted json for deterministic config files', async () => {
56
- const filePath = path.join(tempDir, 'config.json');
57
- await atomicWriteJsonFile(filePath, {
58
- z: 1,
59
- nested: { b: true, a: false },
60
- array: [{ d: 4, c: 3 }],
61
- });
62
- expect(await fs.readFile(filePath, 'utf-8')).toBe('{\n' +
63
- ' "array": [\n' +
64
- ' {\n' +
65
- ' "c": 3,\n' +
66
- ' "d": 4\n' +
67
- ' }\n' +
68
- ' ],\n' +
69
- ' "nested": {\n' +
70
- ' "a": false,\n' +
71
- ' "b": true\n' +
72
- ' },\n' +
73
- ' "z": 1\n' +
74
- '}\n');
75
- });
76
- });
77
- describe('stringifyStableJson', () => {
78
- it('should preserve array order while sorting object keys', () => {
79
- expect(stringifyStableJson([{ b: 2, a: 1 }, { d: 4, c: 3 }])).toBe('[\n' +
80
- ' {\n' +
81
- ' "a": 1,\n' +
82
- ' "b": 2\n' +
83
- ' },\n' +
84
- ' {\n' +
85
- ' "c": 3,\n' +
86
- ' "d": 4\n' +
87
- ' }\n' +
88
- ']\n');
89
- });
90
- });
91
- describe('escapePowerShellLiteral', () => {
92
- it('should escape single quotes by doubling them', () => {
93
- expect(escapePowerShellLiteral("test'value")).toBe("test''value");
94
- });
95
- it('should handle multiple single quotes', () => {
96
- expect(escapePowerShellLiteral("a'b'c")).toBe("a''b''c");
97
- });
98
- it('should return empty string for empty input', () => {
99
- expect(escapePowerShellLiteral('')).toBe('');
100
- });
101
- it('should handle null/undefined gracefully', () => {
102
- expect(escapePowerShellLiteral(null)).toBe('');
103
- expect(escapePowerShellLiteral(undefined)).toBe('');
104
- });
105
- it('should not modify strings without quotes', () => {
106
- expect(escapePowerShellLiteral('normal path')).toBe('normal path');
107
- });
108
- it('should handle path with special characters', () => {
109
- expect(escapePowerShellLiteral("C:\\Users\\Test's Folder")).toBe("C:\\Users\\Test''s Folder");
110
- });
111
- });
112
- describe('resolveSkillSourceDirFromExtractRoot', () => {
113
- const tempRoot = path.join(os.tmpdir(), `aws-skill-extract-test-${Date.now()}`);
114
- beforeEach(async () => {
115
- await fs.mkdir(tempRoot, { recursive: true });
116
- });
117
- afterEach(async () => {
118
- try {
119
- await fs.rm(tempRoot, { recursive: true, force: true });
120
- }
121
- catch {
122
- // ignore
123
- }
124
- });
125
- it('should return subdirectory when single visible directory exists', async () => {
126
- const subDir = path.join(tempRoot, 'skill-package');
127
- await fs.mkdir(subDir, { recursive: true });
128
- await fs.writeFile(path.join(subDir, 'skill.md'), 'test', 'utf-8');
129
- const result = await resolveSkillSourceDirFromExtractRoot(tempRoot);
130
- expect(result).toBe(subDir);
131
- });
132
- it('should return root when multiple visible directories exist', async () => {
133
- const subDir1 = path.join(tempRoot, 'dir1');
134
- const subDir2 = path.join(tempRoot, 'dir2');
135
- await fs.mkdir(subDir1, { recursive: true });
136
- await fs.mkdir(subDir2, { recursive: true });
137
- const result = await resolveSkillSourceDirFromExtractRoot(tempRoot);
138
- expect(result).toBe(tempRoot);
139
- });
140
- it('should return root when files exist at root level', async () => {
141
- await fs.writeFile(path.join(tempRoot, 'skill.md'), 'test', 'utf-8');
142
- await fs.writeFile(path.join(tempRoot, 'README.md'), 'readme', 'utf-8');
143
- const result = await resolveSkillSourceDirFromExtractRoot(tempRoot);
144
- expect(result).toBe(tempRoot);
145
- });
146
- it('should ignore hidden directories (starting with dot)', async () => {
147
- const visibleDir = path.join(tempRoot, 'visible');
148
- const hiddenDir = path.join(tempRoot, '.hidden');
149
- await fs.mkdir(visibleDir, { recursive: true });
150
- await fs.mkdir(hiddenDir, { recursive: true });
151
- const result = await resolveSkillSourceDirFromExtractRoot(tempRoot);
152
- expect(result).toBe(visibleDir);
153
- });
154
- it('should return root when no visible entries exist', async () => {
155
- const hiddenDir = path.join(tempRoot, '.hidden');
156
- await fs.mkdir(hiddenDir, { recursive: true });
157
- const result = await resolveSkillSourceDirFromExtractRoot(tempRoot);
158
- expect(result).toBe(tempRoot);
159
- });
160
- });
161
- describe('toSdkAppsFromEnabledTools', () => {
162
- it('should map enabled tools to app flags', () => {
163
- const result = toSdkAppsFromEnabledTools(['claude', 'opencode']);
164
- expect(result.claude).toBe(true);
165
- expect(result.opencode).toBe(true);
166
- expect(result.codex).toBe(false);
167
- expect(result.gemini).toBe(false);
168
- });
169
- it('should handle all known tools', () => {
170
- const result = toSdkAppsFromEnabledTools([
171
- 'claude',
172
- 'claudecode',
173
- 'codex',
174
- 'gemini',
175
- 'opencode',
176
- 'openclaw',
177
- ]);
178
- expect(result.claude).toBe(true);
179
- expect(result.codex).toBe(true);
180
- expect(result.gemini).toBe(true);
181
- expect(result.opencode).toBe(true);
182
- expect(result.openclaw).toBe(true);
183
- });
184
- it('should return all false for empty array', () => {
185
- const result = toSdkAppsFromEnabledTools([]);
186
- expect(result.claude).toBe(false);
187
- expect(result.codex).toBe(false);
188
- expect(result.gemini).toBe(false);
189
- expect(result.opencode).toBe(false);
190
- expect(result.openclaw).toBe(false);
191
- });
192
- it('should handle null/undefined input', () => {
193
- const resultNull = toSdkAppsFromEnabledTools(null);
194
- const resultUndefined = toSdkAppsFromEnabledTools(undefined);
195
- expect(resultNull.claude).toBe(false);
196
- expect(resultUndefined.claude).toBe(false);
197
- });
198
- it('should ignore unknown tools', () => {
199
- const result = toSdkAppsFromEnabledTools(['unknown-tool', 'claude']);
200
- expect(result.claude).toBe(true);
201
- });
202
- });
203
- describe('resolveSkillSourceDir', () => {
204
- it('should return sourceDir when available', () => {
205
- const skill = { sourceDir: '/path/to/source' };
206
- expect(resolveSkillSourceDir(skill)).toBe(path.resolve('/path/to/source'));
207
- });
208
- it('should fallback to directory when sourceDir not available', () => {
209
- const skill = { directory: '/path/to/directory' };
210
- expect(resolveSkillSourceDir(skill)).toBe(path.resolve('/path/to/directory'));
211
- });
212
- it('should fallback to filePath when sourceDir and directory not available', () => {
213
- const skill = { filePath: '/path/to/file.yaml' };
214
- expect(resolveSkillSourceDir(skill)).toBe(path.resolve('/path/to/file.yaml'));
215
- });
216
- it('should prioritize sourceDir over directory and filePath', () => {
217
- const skill = {
218
- sourceDir: '/source',
219
- directory: '/directory',
220
- filePath: '/file',
221
- };
222
- expect(resolveSkillSourceDir(skill)).toBe(path.resolve('/source'));
223
- });
224
- it('should throw error when no path is available', () => {
225
- const skill = {};
226
- expect(() => resolveSkillSourceDir(skill)).toThrow('skill.sourceDir is required');
227
- });
228
- it('should throw error when skill is null', () => {
229
- expect(() => resolveSkillSourceDir(null)).toThrow('skill.sourceDir is required');
230
- });
231
- it('should throw error when path is empty string', () => {
232
- const skill = { sourceDir: '' };
233
- expect(() => resolveSkillSourceDir(skill)).toThrow('skill.sourceDir is required');
234
- });
235
- it('should throw error when path is whitespace only', () => {
236
- const skill = { sourceDir: ' ' };
237
- expect(() => resolveSkillSourceDir(skill)).toThrow('skill.sourceDir is required');
238
- });
239
- it('should trim whitespace from path', () => {
240
- const skill = { sourceDir: ' /path/to/source ' };
241
- expect(resolveSkillSourceDir(skill)).toBe(path.resolve('/path/to/source'));
242
- });
243
- });
244
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=logger.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.test.d.ts","sourceRoot":"","sources":["../../src/utils/logger.test.ts"],"names":[],"mappings":""}
@@ -1,93 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
- import { Logger, createLogger, logger } from './logger';
3
- describe('Logger', () => {
4
- let consoleSpy;
5
- beforeEach(() => {
6
- consoleSpy = {
7
- debug: vi.spyOn(console, 'debug').mockImplementation(() => { }),
8
- info: vi.spyOn(console, 'info').mockImplementation(() => { }),
9
- warn: vi.spyOn(console, 'warn').mockImplementation(() => { }),
10
- error: vi.spyOn(console, 'error').mockImplementation(() => { }),
11
- };
12
- });
13
- afterEach(() => {
14
- vi.restoreAllMocks();
15
- });
16
- describe('log levels', () => {
17
- it('should not log debug when level is info', () => {
18
- const log = new Logger({ level: 'info' });
19
- log.debug('test message');
20
- expect(consoleSpy.debug).not.toHaveBeenCalled();
21
- });
22
- it('should log info when level is info', () => {
23
- const log = new Logger({ level: 'info' });
24
- log.info('test message');
25
- expect(consoleSpy.info).toHaveBeenCalled();
26
- });
27
- it('should log warn when level is info', () => {
28
- const log = new Logger({ level: 'info' });
29
- log.warn('test message');
30
- expect(consoleSpy.warn).toHaveBeenCalled();
31
- });
32
- it('should log error when level is info', () => {
33
- const log = new Logger({ level: 'info' });
34
- log.error('test message');
35
- expect(consoleSpy.error).toHaveBeenCalled();
36
- });
37
- it('should log all levels when level is debug', () => {
38
- const log = new Logger({ level: 'debug' });
39
- log.debug('debug message');
40
- log.info('info message');
41
- log.warn('warn message');
42
- log.error('error message');
43
- expect(consoleSpy.debug).toHaveBeenCalled();
44
- expect(consoleSpy.info).toHaveBeenCalled();
45
- expect(consoleSpy.warn).toHaveBeenCalled();
46
- expect(consoleSpy.error).toHaveBeenCalled();
47
- });
48
- });
49
- describe('prefix', () => {
50
- it('should include prefix in log message', () => {
51
- const log = new Logger({ level: 'info', prefix: 'test-module' });
52
- log.info('test message');
53
- expect(consoleSpy.info).toHaveBeenCalledWith(expect.stringContaining('[test-module]'));
54
- });
55
- });
56
- describe('timestamp', () => {
57
- it('should include timestamp by default', () => {
58
- const log = new Logger({ level: 'info' });
59
- log.info('test message');
60
- expect(consoleSpy.info).toHaveBeenCalledWith(expect.stringMatching(/\[\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/));
61
- });
62
- });
63
- describe('child logger', () => {
64
- it('should create child logger with combined prefix', () => {
65
- const parentLog = new Logger({ level: 'info', prefix: 'parent' });
66
- const childLog = parentLog.child('child');
67
- childLog.info('test message');
68
- expect(consoleSpy.info).toHaveBeenCalledWith(expect.stringContaining('[parent:child]'));
69
- });
70
- });
71
- describe('object formatting', () => {
72
- it('should format objects in log message', () => {
73
- const log = new Logger({ level: 'info' });
74
- log.info('test', { key: 'value' });
75
- expect(consoleSpy.info).toHaveBeenCalledWith(expect.stringContaining('"key"'));
76
- });
77
- });
78
- });
79
- describe('createLogger', () => {
80
- it('should create logger with prefix', () => {
81
- const log = createLogger('test-prefix');
82
- expect(log).toBeInstanceOf(Logger);
83
- });
84
- });
85
- describe('default logger', () => {
86
- it('should export logger methods', () => {
87
- expect(typeof logger.debug).toBe('function');
88
- expect(typeof logger.info).toBe('function');
89
- expect(typeof logger.warn).toBe('function');
90
- expect(typeof logger.error).toBe('function');
91
- expect(typeof logger.child).toBe('function');
92
- });
93
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=sdk-package-loader.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sdk-package-loader.test.d.ts","sourceRoot":"","sources":["../../src/utils/sdk-package-loader.test.ts"],"names":[],"mappings":""}
@@ -1,84 +0,0 @@
1
- import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';
2
- import os from 'node:os';
3
- import path from 'node:path';
4
- import { afterEach, describe, expect, it } from 'vitest';
5
- import { resolveBridgePackageEntryPath } from './sdk-package-loader.js';
6
- const tempRoots = [];
7
- afterEach(async () => {
8
- await Promise.all(tempRoots.splice(0).map((root) => rm(root, { recursive: true, force: true })));
9
- });
10
- async function createTempPackageRoot() {
11
- const root = await mkdtemp(path.join(os.tmpdir(), 'aws-sdk-package-loader-'));
12
- tempRoots.push(root);
13
- return root;
14
- }
15
- describe('sdk package loader', () => {
16
- it('resolves package exports instead of assuming a root index.js file', async () => {
17
- const packageRoot = await createTempPackageRoot();
18
- const packageDirectory = path.join(packageRoot, 'node_modules', '@opencode-ai', 'sdk');
19
- await mkdir(path.join(packageDirectory, 'dist'), { recursive: true });
20
- await writeFile(path.join(packageDirectory, 'package.json'), JSON.stringify({
21
- name: '@opencode-ai/sdk',
22
- type: 'module',
23
- exports: {
24
- '.': {
25
- import: './dist/index.js',
26
- types: './dist/index.d.ts',
27
- },
28
- },
29
- }));
30
- await writeFile(path.join(packageDirectory, 'dist', 'index.js'), 'export const ok = true;');
31
- await expect(resolveBridgePackageEntryPath('@opencode-ai/sdk', packageRoot)).resolves.toBe(path.join(packageDirectory, 'dist', 'index.js'));
32
- });
33
- it('resolves default conditional exports', async () => {
34
- const packageRoot = await createTempPackageRoot();
35
- const packageDirectory = path.join(packageRoot, 'node_modules', 'default-only-sdk');
36
- await mkdir(path.join(packageDirectory, 'dist'), { recursive: true });
37
- await writeFile(path.join(packageDirectory, 'package.json'), JSON.stringify({ exports: { '.': { default: './dist/default.js' } } }));
38
- await writeFile(path.join(packageDirectory, 'dist', 'default.js'), 'export const ok = true;');
39
- await expect(resolveBridgePackageEntryPath('default-only-sdk', packageRoot)).resolves.toBe(path.join(packageDirectory, 'dist', 'default.js'));
40
- });
41
- it('resolves Claude Agent SDK default export to sdk.mjs', async () => {
42
- const packageRoot = await createTempPackageRoot();
43
- const packageDirectory = path.join(packageRoot, 'node_modules', '@anthropic-ai', 'claude-agent-sdk');
44
- await mkdir(packageDirectory, { recursive: true });
45
- await writeFile(path.join(packageDirectory, 'package.json'), JSON.stringify({
46
- name: '@anthropic-ai/claude-agent-sdk',
47
- type: 'module',
48
- main: 'sdk.mjs',
49
- exports: {
50
- '.': {
51
- types: './sdk.d.ts',
52
- default: './sdk.mjs',
53
- },
54
- },
55
- }));
56
- await writeFile(path.join(packageDirectory, 'sdk.mjs'), 'export const query = () => {};');
57
- await expect(resolveBridgePackageEntryPath('@anthropic-ai/claude-agent-sdk', packageRoot)).resolves.toBe(path.join(packageDirectory, 'sdk.mjs'));
58
- });
59
- it('falls back to module when exports is absent', async () => {
60
- const packageRoot = await createTempPackageRoot();
61
- const packageDirectory = path.join(packageRoot, 'node_modules', 'module-sdk');
62
- await mkdir(path.join(packageDirectory, 'esm'), { recursive: true });
63
- await writeFile(path.join(packageDirectory, 'package.json'), JSON.stringify({ module: './esm/index.js' }));
64
- await writeFile(path.join(packageDirectory, 'esm', 'index.js'), 'export const ok = true;');
65
- await expect(resolveBridgePackageEntryPath('module-sdk', packageRoot)).resolves.toBe(path.join(packageDirectory, 'esm', 'index.js'));
66
- });
67
- it('falls back to main when exports and module are absent', async () => {
68
- const packageRoot = await createTempPackageRoot();
69
- const packageDirectory = path.join(packageRoot, 'node_modules', 'main-sdk');
70
- await mkdir(path.join(packageDirectory, 'lib'), { recursive: true });
71
- await writeFile(path.join(packageDirectory, 'package.json'), JSON.stringify({ main: './lib/main.js' }));
72
- await writeFile(path.join(packageDirectory, 'lib', 'main.js'), 'export const ok = true;');
73
- await expect(resolveBridgePackageEntryPath('main-sdk', packageRoot)).resolves.toBe(path.join(packageDirectory, 'lib', 'main.js'));
74
- });
75
- it('rejects when the resolved package entry is missing', async () => {
76
- const packageRoot = await createTempPackageRoot();
77
- const packageDirectory = path.join(packageRoot, 'node_modules', 'broken-sdk');
78
- await mkdir(packageDirectory, { recursive: true });
79
- await writeFile(path.join(packageDirectory, 'package.json'), JSON.stringify({ exports: './dist/missing.js' }));
80
- await expect(resolveBridgePackageEntryPath('broken-sdk', packageRoot)).rejects.toMatchObject({
81
- code: 'ENOENT',
82
- });
83
- });
84
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=validation.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validation.test.d.ts","sourceRoot":"","sources":["../../src/utils/validation.test.ts"],"names":[],"mappings":""}
@@ -1,88 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { parseBoolean, ensureEnabledTools } from './validation';
3
- describe('parseBoolean', () => {
4
- describe('true values', () => {
5
- it('should return true for "true"', () => {
6
- expect(parseBoolean('true')).toBe(true);
7
- });
8
- it('should return true for "TRUE"', () => {
9
- expect(parseBoolean('TRUE')).toBe(true);
10
- });
11
- it('should return true for "1"', () => {
12
- expect(parseBoolean('1')).toBe(true);
13
- });
14
- it('should return true for "yes"', () => {
15
- expect(parseBoolean('yes')).toBe(true);
16
- });
17
- it('should return true for boolean true', () => {
18
- expect(parseBoolean(true)).toBe(true);
19
- });
20
- });
21
- describe('empty/null/undefined values', () => {
22
- it('should return default value (true) for empty string', () => {
23
- expect(parseBoolean('')).toBe(true); // 默认值是 true
24
- });
25
- it('should return default value (true) for null', () => {
26
- expect(parseBoolean(null)).toBe(true); // 默认值是 true
27
- });
28
- it('should return default value (true) for undefined', () => {
29
- expect(parseBoolean(undefined)).toBe(true); // 默认值是 true
30
- });
31
- it('should return false when defaultValue is false for empty string', () => {
32
- expect(parseBoolean('', false)).toBe(false);
33
- });
34
- it('should return false when defaultValue is false for null', () => {
35
- expect(parseBoolean(null, false)).toBe(false);
36
- });
37
- it('should return false when defaultValue is false for undefined', () => {
38
- expect(parseBoolean(undefined, false)).toBe(false);
39
- });
40
- });
41
- describe('default value', () => {
42
- it('should return default when value is null', () => {
43
- expect(parseBoolean(null, true)).toBe(true);
44
- });
45
- it('should return default when value is undefined', () => {
46
- expect(parseBoolean(undefined, true)).toBe(true);
47
- });
48
- it('should ignore default for valid values', () => {
49
- expect(parseBoolean('false', true)).toBe(false);
50
- });
51
- });
52
- });
53
- describe('ensureEnabledTools', () => {
54
- it('should return default tools for empty array', () => {
55
- const result = ensureEnabledTools([]);
56
- expect(result).toContain('claude');
57
- expect(result).toContain('opencode');
58
- expect(result).toContain('codex');
59
- });
60
- it('should return default tools for null', () => {
61
- const result = ensureEnabledTools(null);
62
- expect(result).toContain('claude');
63
- expect(result).toContain('opencode');
64
- expect(result).toContain('codex');
65
- });
66
- it('should return default tools for undefined', () => {
67
- const result = ensureEnabledTools(undefined);
68
- expect(result).toContain('claude');
69
- expect(result).toContain('opencode');
70
- expect(result).toContain('codex');
71
- });
72
- it('should return input array when not empty', () => {
73
- const result = ensureEnabledTools(['claude', 'gemini']);
74
- expect(result).toEqual(['claude', 'gemini']);
75
- });
76
- it('should handle single tool', () => {
77
- const result = ensureEnabledTools(['opencode']);
78
- expect(result).toEqual(['opencode']);
79
- });
80
- it('should deduplicate tools', () => {
81
- const result = ensureEnabledTools(['claude', 'claude', 'opencode']);
82
- expect(result).toEqual(['claude', 'opencode']);
83
- });
84
- it('should normalize tools to lowercase', () => {
85
- const result = ensureEnabledTools(['CLAUDE', 'OpenCode']);
86
- expect(result).toEqual(['claude', 'opencode']);
87
- });
88
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=yaml-utils.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"yaml-utils.test.d.ts","sourceRoot":"","sources":["../../src/utils/yaml-utils.test.ts"],"names":[],"mappings":""}