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.
Files changed (324) hide show
  1. package/dist/adapter/AcodeSdkAdapter.d.ts +66 -5
  2. package/dist/adapter/AcodeSdkAdapter.d.ts.map +1 -1
  3. package/dist/adapter/AcodeSdkAdapter.js +771 -69
  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 +24 -1
  7. package/dist/adapter/OpencodeSdkAdapter.d.ts +19 -0
  8. package/dist/adapter/OpencodeSdkAdapter.d.ts.map +1 -1
  9. package/dist/adapter/OpencodeSdkAdapter.js +62 -0
  10. package/dist/adapter/idle-poll-loop.d.ts +2 -1
  11. package/dist/adapter/idle-poll-loop.d.ts.map +1 -1
  12. package/dist/adapter/types.d.ts +86 -9
  13. package/dist/adapter/types.d.ts.map +1 -1
  14. package/dist/adapter/types.js +15 -5
  15. package/dist/index.js +15 -0
  16. package/dist/routes/acode-todos.d.ts +11 -0
  17. package/dist/routes/acode-todos.d.ts.map +1 -0
  18. package/dist/routes/acode-todos.js +75 -0
  19. package/dist/routes/ai-sources.js +4 -1
  20. package/dist/routes/dashboard.d.ts.map +1 -1
  21. package/dist/routes/dashboard.js +1 -1
  22. package/dist/routes/memory.d.ts +1 -1
  23. package/dist/routes/memory.d.ts.map +1 -1
  24. package/dist/routes/memory.js +3 -3
  25. package/dist/routes/pty.d.ts.map +1 -1
  26. package/dist/routes/pty.js +9 -0
  27. package/dist/routes/runtime-binding.d.ts.map +1 -1
  28. package/dist/routes/runtime-binding.js +6 -3
  29. package/dist/routes/sessions.js +89 -4
  30. package/dist/routes/sub-agents.d.ts +14 -0
  31. package/dist/routes/sub-agents.d.ts.map +1 -0
  32. package/dist/routes/sub-agents.js +267 -0
  33. package/dist/routes/terminal.d.ts +12 -1
  34. package/dist/routes/terminal.d.ts.map +1 -1
  35. package/dist/routes/terminal.js +326 -24
  36. package/dist/services/acode-package.d.ts +8 -1
  37. package/dist/services/acode-package.d.ts.map +1 -1
  38. package/dist/services/acode-package.js +33 -4
  39. package/dist/services/agent-event-store.d.ts +1 -0
  40. package/dist/services/agent-event-store.d.ts.map +1 -1
  41. package/dist/services/aws-client-agent-mcp.d.ts.map +1 -1
  42. package/dist/services/aws-client-agent-mcp.js +11 -4
  43. package/dist/services/event-delta-pusher.js +4 -4
  44. package/dist/services/fileSnapshotStore.js +1 -1
  45. package/dist/services/legacy-path-migration.d.ts +3 -0
  46. package/dist/services/legacy-path-migration.d.ts.map +1 -0
  47. package/dist/services/legacy-path-migration.js +66 -0
  48. package/dist/services/lifecycle-state.d.ts.map +1 -1
  49. package/dist/services/lifecycle-state.js +1 -1
  50. package/dist/services/runtime-binding.d.ts +5 -0
  51. package/dist/services/runtime-binding.d.ts.map +1 -1
  52. package/dist/services/runtime-binding.js +33 -1
  53. package/dist/services/session-output.d.ts +10 -1
  54. package/dist/services/session-output.d.ts.map +1 -1
  55. package/dist/services/session-output.js +54 -4
  56. package/dist/services/sub-agent-manager-instance.d.ts +4 -0
  57. package/dist/services/sub-agent-manager-instance.d.ts.map +1 -0
  58. package/dist/services/sub-agent-manager-instance.js +12 -0
  59. package/dist/services/workspace-files.d.ts +1 -0
  60. package/dist/services/workspace-files.d.ts.map +1 -1
  61. package/dist/services/workspace-files.js +57 -1
  62. package/package/acode/dist/ask-user-question-tool.d.ts +47 -0
  63. package/package/acode/dist/ask-user-question-tool.d.ts.map +1 -0
  64. package/package/acode/dist/ask-user-question-tool.js +233 -0
  65. package/package/acode/dist/built-in-file-tools.d.ts +2 -0
  66. package/package/acode/dist/built-in-file-tools.d.ts.map +1 -1
  67. package/package/acode/dist/built-in-file-tools.js +504 -3
  68. package/package/acode/dist/compaction.d.ts +242 -0
  69. package/package/acode/dist/compaction.d.ts.map +1 -0
  70. package/package/acode/dist/compaction.js +919 -0
  71. package/package/acode/dist/config.d.ts +6 -1
  72. package/package/acode/dist/config.d.ts.map +1 -1
  73. package/package/acode/dist/config.js +27 -2
  74. package/package/acode/dist/index.d.ts +4 -0
  75. package/package/acode/dist/index.d.ts.map +1 -1
  76. package/package/acode/dist/index.js +4 -0
  77. package/package/acode/dist/runtime.d.ts +257 -0
  78. package/package/acode/dist/runtime.d.ts.map +1 -1
  79. package/package/acode/dist/runtime.js +1843 -191
  80. package/package/acode/dist/skill-tool.d.ts +30 -0
  81. package/package/acode/dist/skill-tool.d.ts.map +1 -0
  82. package/package/acode/dist/skill-tool.js +174 -0
  83. package/package/acode/dist/sub-agent-manager.d.ts +264 -0
  84. package/package/acode/dist/sub-agent-manager.d.ts.map +1 -0
  85. package/package/acode/dist/sub-agent-manager.js +825 -0
  86. package/package/acode/dist/sub-agent-store.d.ts +40 -0
  87. package/package/acode/dist/sub-agent-store.d.ts.map +1 -0
  88. package/package/acode/dist/sub-agent-store.js +164 -0
  89. package/package/acode/dist/sub-agent-tools.d.ts +72 -0
  90. package/package/acode/dist/sub-agent-tools.d.ts.map +1 -0
  91. package/package/acode/dist/sub-agent-tools.js +429 -0
  92. package/package/acode/dist/sub-agent-types.d.ts +85 -0
  93. package/package/acode/dist/sub-agent-types.d.ts.map +1 -0
  94. package/package/acode/dist/sub-agent-types.js +8 -0
  95. package/package/acode/dist/todo-store.d.ts +42 -0
  96. package/package/acode/dist/todo-store.d.ts.map +1 -0
  97. package/package/acode/dist/todo-store.js +68 -0
  98. package/package/acode/dist/todo-tool.d.ts +6 -0
  99. package/package/acode/dist/todo-tool.d.ts.map +1 -0
  100. package/package/acode/dist/todo-tool.js +138 -0
  101. package/package/acode/dist/types.d.ts +41 -1
  102. package/package/acode/dist/types.d.ts.map +1 -1
  103. package/package/acode/package.json +13 -2
  104. package/package/aws-client-agent-mcp/dist/agent-client.d.ts +9 -0
  105. package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +1 -1
  106. package/package/aws-client-agent-mcp/dist/agent-client.js +69 -10
  107. package/package/aws-client-agent-mcp/dist/agent-client.js.map +1 -1
  108. package/package/aws-client-agent-mcp/dist/config.d.ts.map +1 -1
  109. package/package/aws-client-agent-mcp/dist/config.js +4 -0
  110. package/package/aws-client-agent-mcp/dist/config.js.map +1 -1
  111. package/package/aws-client-agent-mcp/dist/constants.d.ts +2 -0
  112. package/package/aws-client-agent-mcp/dist/constants.d.ts.map +1 -1
  113. package/package/aws-client-agent-mcp/dist/constants.js +3 -1
  114. package/package/aws-client-agent-mcp/dist/constants.js.map +1 -1
  115. package/package/aws-client-agent-mcp/dist/context-manager.d.ts +4 -1
  116. package/package/aws-client-agent-mcp/dist/context-manager.d.ts.map +1 -1
  117. package/package/aws-client-agent-mcp/dist/context-manager.js +6 -2
  118. package/package/aws-client-agent-mcp/dist/context-manager.js.map +1 -1
  119. package/package/aws-client-agent-mcp/dist/context-manager.test.js +5 -3
  120. package/package/aws-client-agent-mcp/dist/context-manager.test.js.map +1 -1
  121. package/package/aws-client-agent-mcp/dist/http-client.d.ts +5 -0
  122. package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +1 -1
  123. package/package/aws-client-agent-mcp/dist/http-client.js +15 -1
  124. package/package/aws-client-agent-mcp/dist/http-client.js.map +1 -1
  125. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +162 -71
  126. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -1
  127. package/package/aws-client-agent-mcp/dist/mcp-server.js +1007 -504
  128. package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -1
  129. package/package/aws-client-agent-mcp/dist/mcp-server.test.js +371 -253
  130. package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -1
  131. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +6 -17
  132. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +1 -1
  133. package/package/aws-client-agent-mcp/dist/mcp-tools.js +20 -75
  134. package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +1 -1
  135. package/package/aws-client-agent-mcp/dist/memory-store.d.ts +45 -45
  136. package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +1 -1
  137. package/package/aws-client-agent-mcp/dist/memory-store.js +114 -162
  138. package/package/aws-client-agent-mcp/dist/memory-store.js.map +1 -1
  139. package/package/aws-client-agent-mcp/dist/memory-store.test.js +175 -164
  140. package/package/aws-client-agent-mcp/dist/memory-store.test.js.map +1 -1
  141. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +3 -9
  142. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts.map +1 -1
  143. package/package/aws-client-agent-mcp/dist/memory-tools.js +31 -58
  144. package/package/aws-client-agent-mcp/dist/memory-tools.js.map +1 -1
  145. package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +40 -9
  146. package/package/aws-client-agent-mcp/dist/message-buffer.d.ts.map +1 -1
  147. package/package/aws-client-agent-mcp/dist/message-buffer.js +123 -23
  148. package/package/aws-client-agent-mcp/dist/message-buffer.js.map +1 -1
  149. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +13 -13
  150. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts.map +1 -1
  151. package/package/aws-client-agent-mcp/dist/server-memory-store.js +23 -16
  152. package/package/aws-client-agent-mcp/dist/server-memory-store.js.map +1 -1
  153. package/package/aws-client-agent-mcp/dist/status-reporter.d.ts.map +1 -1
  154. package/package/aws-client-agent-mcp/dist/status-reporter.js +8 -5
  155. package/package/aws-client-agent-mcp/dist/status-reporter.js.map +1 -1
  156. package/package/aws-client-agent-mcp/dist/status-reporter.test.js +93 -0
  157. package/package/aws-client-agent-mcp/dist/status-reporter.test.js.map +1 -1
  158. package/package/aws-client-agent-mcp/dist/types.d.ts +12 -25
  159. package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -1
  160. package/package/aws-client-agent-mcp/dist/types.js.map +1 -1
  161. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +34 -1
  162. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +1 -1
  163. package/package/aws-client-agent-mcp/dist/websocket-client.js +146 -18
  164. package/package/aws-client-agent-mcp/dist/websocket-client.js.map +1 -1
  165. package/package.json +17 -7
  166. package/dist/adapter/AcodeSdkAdapter.test.d.ts +0 -2
  167. package/dist/adapter/AcodeSdkAdapter.test.d.ts.map +0 -1
  168. package/dist/adapter/AcodeSdkAdapter.test.js +0 -2000
  169. package/dist/adapter/AdapterRegistry.test.d.ts +0 -5
  170. package/dist/adapter/AdapterRegistry.test.d.ts.map +0 -1
  171. package/dist/adapter/AdapterRegistry.test.js +0 -118
  172. package/dist/adapter/ClaudeSdkAdapter.test.d.ts +0 -2
  173. package/dist/adapter/ClaudeSdkAdapter.test.d.ts.map +0 -1
  174. package/dist/adapter/ClaudeSdkAdapter.test.js +0 -311
  175. package/dist/adapter/CodexSdkAdapter.test.d.ts +0 -2
  176. package/dist/adapter/CodexSdkAdapter.test.d.ts.map +0 -1
  177. package/dist/adapter/CodexSdkAdapter.test.js +0 -270
  178. package/dist/adapter/OpencodeSdkAdapter.test.d.ts +0 -2
  179. package/dist/adapter/OpencodeSdkAdapter.test.d.ts.map +0 -1
  180. package/dist/adapter/OpencodeSdkAdapter.test.js +0 -158
  181. package/dist/adapter/acode-tool-names.test.d.ts +0 -2
  182. package/dist/adapter/acode-tool-names.test.d.ts.map +0 -1
  183. package/dist/adapter/acode-tool-names.test.js +0 -28
  184. package/dist/adapter/adapter.test.d.ts +0 -5
  185. package/dist/adapter/adapter.test.d.ts.map +0 -1
  186. package/dist/adapter/adapter.test.js +0 -180
  187. package/dist/adapter/idle-poll-loop.test.d.ts +0 -2
  188. package/dist/adapter/idle-poll-loop.test.d.ts.map +0 -1
  189. package/dist/adapter/idle-poll-loop.test.js +0 -85
  190. package/dist/adapter/types.test.d.ts +0 -2
  191. package/dist/adapter/types.test.d.ts.map +0 -1
  192. package/dist/adapter/types.test.js +0 -50
  193. package/dist/adapters/cc-switch/mcp-acode.test.d.ts +0 -2
  194. package/dist/adapters/cc-switch/mcp-acode.test.d.ts.map +0 -1
  195. package/dist/adapters/cc-switch/mcp-acode.test.js +0 -80
  196. package/dist/adapters/cc-switch/mcp-claudecode.test.d.ts +0 -2
  197. package/dist/adapters/cc-switch/mcp-claudecode.test.d.ts.map +0 -1
  198. package/dist/adapters/cc-switch/mcp-claudecode.test.js +0 -75
  199. package/dist/adapters/cc-switch/mcp-codex.test.d.ts +0 -2
  200. package/dist/adapters/cc-switch/mcp-codex.test.d.ts.map +0 -1
  201. package/dist/adapters/cc-switch/mcp-codex.test.js +0 -126
  202. package/dist/adapters/cc-switch/mcp-opencode.test.d.ts +0 -2
  203. package/dist/adapters/cc-switch/mcp-opencode.test.d.ts.map +0 -1
  204. package/dist/adapters/cc-switch/mcp-opencode.test.js +0 -62
  205. package/dist/adapters/cc-switch/skill-directory.test.d.ts +0 -2
  206. package/dist/adapters/cc-switch/skill-directory.test.d.ts.map +0 -1
  207. package/dist/adapters/cc-switch/skill-directory.test.js +0 -74
  208. package/dist/config.test.d.ts +0 -2
  209. package/dist/config.test.d.ts.map +0 -1
  210. package/dist/config.test.js +0 -107
  211. package/dist/routes/ai-sources.test.d.ts +0 -2
  212. package/dist/routes/ai-sources.test.d.ts.map +0 -1
  213. package/dist/routes/ai-sources.test.js +0 -169
  214. package/dist/routes/file-browser.test.d.ts +0 -5
  215. package/dist/routes/file-browser.test.d.ts.map +0 -1
  216. package/dist/routes/file-browser.test.js +0 -155
  217. package/dist/routes/git.test.d.ts +0 -2
  218. package/dist/routes/git.test.d.ts.map +0 -1
  219. package/dist/routes/git.test.js +0 -330
  220. package/dist/routes/instance.test.d.ts +0 -5
  221. package/dist/routes/instance.test.d.ts.map +0 -1
  222. package/dist/routes/instance.test.js +0 -389
  223. package/dist/routes/mcp.test.d.ts +0 -5
  224. package/dist/routes/mcp.test.d.ts.map +0 -1
  225. package/dist/routes/mcp.test.js +0 -92
  226. package/dist/routes/memory-route-wiring.test.d.ts +0 -2
  227. package/dist/routes/memory-route-wiring.test.d.ts.map +0 -1
  228. package/dist/routes/memory-route-wiring.test.js +0 -15
  229. package/dist/routes/memory.test.d.ts +0 -2
  230. package/dist/routes/memory.test.d.ts.map +0 -1
  231. package/dist/routes/memory.test.js +0 -177
  232. package/dist/routes/properties.test.d.ts +0 -5
  233. package/dist/routes/properties.test.d.ts.map +0 -1
  234. package/dist/routes/properties.test.js +0 -72
  235. package/dist/routes/pty.test.d.ts +0 -2
  236. package/dist/routes/pty.test.d.ts.map +0 -1
  237. package/dist/routes/pty.test.js +0 -82
  238. package/dist/routes/runtime-binding.test.d.ts +0 -2
  239. package/dist/routes/runtime-binding.test.d.ts.map +0 -1
  240. package/dist/routes/runtime-binding.test.js +0 -32
  241. package/dist/routes/sessions.test.d.ts +0 -5
  242. package/dist/routes/sessions.test.d.ts.map +0 -1
  243. package/dist/routes/sessions.test.js +0 -86
  244. package/dist/routes/skills.test.d.ts +0 -5
  245. package/dist/routes/skills.test.d.ts.map +0 -1
  246. package/dist/routes/skills.test.js +0 -50
  247. package/dist/routes/system-metrics.test.d.ts +0 -2
  248. package/dist/routes/system-metrics.test.d.ts.map +0 -1
  249. package/dist/routes/system-metrics.test.js +0 -16
  250. package/dist/routes/terminal.stop-options.test.d.ts +0 -2
  251. package/dist/routes/terminal.stop-options.test.d.ts.map +0 -1
  252. package/dist/routes/terminal.stop-options.test.js +0 -39
  253. package/dist/routes/terminal.test.d.ts +0 -2
  254. package/dist/routes/terminal.test.d.ts.map +0 -1
  255. package/dist/routes/terminal.test.js +0 -746
  256. package/dist/routes/yml.test.d.ts +0 -5
  257. package/dist/routes/yml.test.d.ts.map +0 -1
  258. package/dist/routes/yml.test.js +0 -58
  259. package/dist/services/ai-source-apply.test.d.ts +0 -2
  260. package/dist/services/ai-source-apply.test.d.ts.map +0 -1
  261. package/dist/services/ai-source-apply.test.js +0 -138
  262. package/dist/services/auto-register.test.d.ts +0 -2
  263. package/dist/services/auto-register.test.d.ts.map +0 -1
  264. package/dist/services/auto-register.test.js +0 -184
  265. package/dist/services/aws-client-agent-mcp.test.d.ts +0 -2
  266. package/dist/services/aws-client-agent-mcp.test.d.ts.map +0 -1
  267. package/dist/services/aws-client-agent-mcp.test.js +0 -242
  268. package/dist/services/bridge-package-publish-hooks.test.d.ts +0 -2
  269. package/dist/services/bridge-package-publish-hooks.test.d.ts.map +0 -1
  270. package/dist/services/bridge-package-publish-hooks.test.js +0 -136
  271. package/dist/services/cc-switch-discovery.test.d.ts +0 -2
  272. package/dist/services/cc-switch-discovery.test.d.ts.map +0 -1
  273. package/dist/services/cc-switch-discovery.test.js +0 -56
  274. package/dist/services/cli-commands.test.d.ts +0 -2
  275. package/dist/services/cli-commands.test.d.ts.map +0 -1
  276. package/dist/services/cli-commands.test.js +0 -230
  277. package/dist/services/instance-init-service.test.d.ts +0 -2
  278. package/dist/services/instance-init-service.test.d.ts.map +0 -1
  279. package/dist/services/instance-init-service.test.js +0 -140
  280. package/dist/services/instance-state.test.d.ts +0 -2
  281. package/dist/services/instance-state.test.d.ts.map +0 -1
  282. package/dist/services/instance-state.test.js +0 -245
  283. package/dist/services/mcp-launch-binding-queue.test.d.ts +0 -2
  284. package/dist/services/mcp-launch-binding-queue.test.d.ts.map +0 -1
  285. package/dist/services/mcp-launch-binding-queue.test.js +0 -181
  286. package/dist/services/runtime-binding.test.d.ts +0 -2
  287. package/dist/services/runtime-binding.test.d.ts.map +0 -1
  288. package/dist/services/runtime-binding.test.js +0 -78
  289. package/dist/services/runtime-lifecycle-policy.test.d.ts +0 -2
  290. package/dist/services/runtime-lifecycle-policy.test.d.ts.map +0 -1
  291. package/dist/services/runtime-lifecycle-policy.test.js +0 -41
  292. package/dist/services/session-output.test.d.ts +0 -5
  293. package/dist/services/session-output.test.d.ts.map +0 -1
  294. package/dist/services/session-output.test.js +0 -177
  295. package/dist/services/startup-config-wizard.test.d.ts +0 -2
  296. package/dist/services/startup-config-wizard.test.d.ts.map +0 -1
  297. package/dist/services/startup-config-wizard.test.js +0 -184
  298. package/dist/services/terminal-persistence.test.d.ts +0 -5
  299. package/dist/services/terminal-persistence.test.d.ts.map +0 -1
  300. package/dist/services/terminal-persistence.test.js +0 -159
  301. package/dist/services/tool-installer.test.d.ts +0 -2
  302. package/dist/services/tool-installer.test.d.ts.map +0 -1
  303. package/dist/services/tool-installer.test.js +0 -225
  304. package/dist/services/workspace-files.test.d.ts +0 -2
  305. package/dist/services/workspace-files.test.d.ts.map +0 -1
  306. package/dist/services/workspace-files.test.js +0 -648
  307. package/dist/services/workspace-watch.test.d.ts +0 -2
  308. package/dist/services/workspace-watch.test.d.ts.map +0 -1
  309. package/dist/services/workspace-watch.test.js +0 -38
  310. package/dist/utils/file-utils.test.d.ts +0 -2
  311. package/dist/utils/file-utils.test.d.ts.map +0 -1
  312. package/dist/utils/file-utils.test.js +0 -244
  313. package/dist/utils/logger.test.d.ts +0 -2
  314. package/dist/utils/logger.test.d.ts.map +0 -1
  315. package/dist/utils/logger.test.js +0 -93
  316. package/dist/utils/sdk-package-loader.test.d.ts +0 -2
  317. package/dist/utils/sdk-package-loader.test.d.ts.map +0 -1
  318. package/dist/utils/sdk-package-loader.test.js +0 -84
  319. package/dist/utils/validation.test.d.ts +0 -2
  320. package/dist/utils/validation.test.d.ts.map +0 -1
  321. package/dist/utils/validation.test.js +0 -88
  322. package/dist/utils/yaml-utils.test.d.ts +0 -2
  323. package/dist/utils/yaml-utils.test.d.ts.map +0 -1
  324. package/dist/utils/yaml-utils.test.js +0 -363
@@ -1,330 +0,0 @@
1
- import { execFile } from 'node:child_process';
2
- import { promises as fs } from 'node:fs';
3
- import { tmpdir } from 'node:os';
4
- import path from 'node:path';
5
- import { promisify } from 'node:util';
6
- import { describe, expect, it, vi } from 'vitest';
7
- import { callAiForCommitMessage, createAgentsWorkStashSnapshotRef, createScopedFilePathspecArgs, createScopedGitPathspecArgs, extractOpenAiStreamDelta, mergeGitDiffSummaryFiles, normalizeGitCommitMessage, parseGitDiffSummary, parseGitStashListLine, sanitizeCommitMessage, streamAiForCommitMessage, parseGitStatusStagedPaths, parseLatestGitStash, persistAgentsWorkStashSnapshotRef, } from './git.js';
8
- const execFileAsync = promisify(execFile);
9
- async function runGit(cwd, args) {
10
- const result = await execFileAsync('git', [...args], { cwd });
11
- return result.stdout;
12
- }
13
- describe('git commit helpers', () => {
14
- it('normalizes commit messages before executing git commit', () => {
15
- expect(normalizeGitCommitMessage(' chore: update dashboard ')).toBe('chore: update dashboard');
16
- expect(normalizeGitCommitMessage(' ')).toBe('');
17
- expect(normalizeGitCommitMessage(null)).toBe('');
18
- });
19
- it('creates pathspec args scoped to the selected workspace path', () => {
20
- expect(createScopedGitPathspecArgs({ relativeWorkspacePath: 'packages/app' })).toEqual(['--', 'packages/app']);
21
- expect(createScopedGitPathspecArgs({ relativeWorkspacePath: '' })).toEqual(['--', '.']);
22
- });
23
- it('creates file pathspec args relative to parent git repositories', () => {
24
- expect(createScopedFilePathspecArgs('src/App.vue', { relativeWorkspacePath: 'packages/app' })).toEqual([
25
- '--',
26
- 'packages/app/src/App.vue',
27
- ]);
28
- });
29
- it('parses staged paths from porcelain status output', () => {
30
- const stagedPaths = parseGitStatusStagedPaths('M staged.ts\n M unstaged.ts\nA added.ts\n?? untracked.ts\nR old.ts -> renamed.ts\n');
31
- expect([...stagedPaths].sort()).toEqual(['added.ts', 'renamed.ts', 'staged.ts']);
32
- });
33
- it('marks cached diff files as staged when parsing staged summaries', () => {
34
- const files = parseGitDiffSummary('M\tsrc/staged.ts\n', '2\t1\tsrc/staged.ts\n', new Set(), true);
35
- expect(files).toEqual([
36
- {
37
- path: 'src/staged.ts',
38
- status: 'modified',
39
- additions: 2,
40
- deletions: 1,
41
- staged: true,
42
- },
43
- ]);
44
- });
45
- it('merges unstaged and staged summaries while preserving staged-only files', () => {
46
- const unstagedFiles = parseGitDiffSummary('M\tsrc/mixed.ts\nM\tsrc/unstaged.ts\n', '1\t0\tsrc/mixed.ts\n3\t1\tsrc/unstaged.ts\n', new Set(['src/mixed.ts']));
47
- const stagedFiles = parseGitDiffSummary('M\tsrc/mixed.ts\nA\tsrc/staged-only.ts\n', '2\t1\tsrc/mixed.ts\n5\t0\tsrc/staged-only.ts\n', new Set(['src/mixed.ts', 'src/staged-only.ts']), true);
48
- expect(mergeGitDiffSummaryFiles(unstagedFiles, stagedFiles)).toEqual([
49
- {
50
- path: 'src/mixed.ts',
51
- status: 'modified',
52
- additions: 3,
53
- deletions: 1,
54
- staged: true,
55
- },
56
- {
57
- path: 'src/unstaged.ts',
58
- status: 'modified',
59
- additions: 3,
60
- deletions: 1,
61
- staged: false,
62
- },
63
- {
64
- path: 'src/staged-only.ts',
65
- status: 'added',
66
- additions: 5,
67
- deletions: 0,
68
- staged: true,
69
- },
70
- ]);
71
- });
72
- });
73
- describe('git stash reference helpers', () => {
74
- it('parses stable stash object hashes while preserving the display selector', () => {
75
- const stash = parseGitStashListLine('0123456789abcdef0123456789abcdef01234567\u0000stash@{3}\u0000On main: 快照: 任务线-2026-06-02 10:00:00\u00002 hours ago');
76
- expect(stash).toEqual({
77
- ref: '0123456789abcdef0123456789abcdef01234567',
78
- stashName: 'stash@{3}',
79
- message: '快照: 任务线-2026-06-02 10:00:00',
80
- branch: 'main',
81
- createdAt: '2 hours ago',
82
- });
83
- });
84
- it('uses the stable stash object hash for the latest no-change snapshot reuse', () => {
85
- const latest = parseLatestGitStash('fedcba9876543210fedcba9876543210fedcba98\u0000stash@{0}\u0000On master: 快照: latest\u0000just now\n');
86
- expect(latest).toEqual({
87
- ref: 'fedcba9876543210fedcba9876543210fedcba98',
88
- stashName: 'stash@{0}',
89
- message: '快照: latest',
90
- });
91
- });
92
- it('keeps flow start snapshots restorable after the original stash selector is removed', async () => {
93
- let workspacePath = null;
94
- try {
95
- workspacePath = await fs.mkdtemp(path.join(tmpdir(), 'aws-stash-ref-'));
96
- await runGit(workspacePath, ['init']);
97
- await runGit(workspacePath, ['config', 'core.autocrlf', 'false']);
98
- await runGit(workspacePath, ['config', 'user.email', 'test@example.com']);
99
- await runGit(workspacePath, ['config', 'user.name', 'Tester']);
100
- await fs.writeFile(path.join(workspacePath, 'task.txt'), 'base\n', 'utf8');
101
- await runGit(workspacePath, ['add', 'task.txt']);
102
- await runGit(workspacePath, ['commit', '-m', 'init']);
103
- await fs.writeFile(path.join(workspacePath, 'task.txt'), 'snapshot-content\n', 'utf8');
104
- await runGit(workspacePath, ['stash', 'push', '-m', 'flow start snapshot']);
105
- const latest = parseLatestGitStash(await runGit(workspacePath, ['stash', 'list', '-n', '1', '--format=%H%x00%gd%x00%gs%x00%cr']));
106
- if (!latest) {
107
- throw new Error('expected a latest stash entry');
108
- }
109
- const persistentRef = createAgentsWorkStashSnapshotRef(latest.ref);
110
- if (!persistentRef) {
111
- throw new Error('expected a persistent AgentsWork stash ref');
112
- }
113
- const persistedRef = await persistAgentsWorkStashSnapshotRef(workspacePath, latest.ref);
114
- if (!persistedRef) {
115
- throw new Error('expected the persistent ref to be written');
116
- }
117
- expect(persistedRef).toBe(persistentRef);
118
- await runGit(workspacePath, ['stash', 'drop', latest.stashName]);
119
- await runGit(workspacePath, ['stash', 'apply', persistedRef]);
120
- await expect(fs.readFile(path.join(workspacePath, 'task.txt'), 'utf8')).resolves.toBe('snapshot-content\n');
121
- }
122
- finally {
123
- if (workspacePath) {
124
- await fs.rm(workspacePath, { recursive: true, force: true });
125
- }
126
- }
127
- }, 15_000);
128
- });
129
- describe('callAiForCommitMessage', () => {
130
- it('should return trimmed content from AI response', async () => {
131
- const mockResponse = { data: { choices: [{ message: { content: ' feat(readme): add new section ' } }] } };
132
- const axiosModule = await import('axios');
133
- vi.spyOn(axiosModule.default, 'post').mockResolvedValueOnce(mockResponse);
134
- const result = await callAiForCommitMessage('https://api.openai.com/v1', 'sk-test-key', 'gpt-4o', 'diff content here');
135
- expect(result).toBe('feat(readme): add new section');
136
- });
137
- it('should return fallback commit message when AI response content is empty', async () => {
138
- const mockResponse = { data: { choices: [{ message: { content: '' } }] } };
139
- const axiosModule = await import('axios');
140
- vi.spyOn(axiosModule.default, 'post').mockResolvedValueOnce(mockResponse);
141
- const result = await callAiForCommitMessage('https://api.openai.com/v1', 'sk-test-key', 'gpt-4o', 'diff content here');
142
- // 空响应走 sanitize 兜底
143
- expect(result).toBe('chore: update staged changes');
144
- });
145
- it('should sanitize away meta-language prefixes from AI response', async () => {
146
- const mockResponse = {
147
- data: { choices: [{ message: { content: '我们被问到根据 diff 生成提交信息:feat(readme): 新增 README 章节' } }] }
148
- };
149
- const axiosModule = await import('axios');
150
- vi.spyOn(axiosModule.default, 'post').mockResolvedValueOnce(mockResponse);
151
- const result = await callAiForCommitMessage('https://api.openai.com/v1', 'sk-test-key', 'gpt-4o', 'diff content here');
152
- expect(result).toBe('feat(readme): 新增 README 章节');
153
- });
154
- it('should use correct API endpoint, headers and tightened limits', async () => {
155
- const axiosModule = await import('axios');
156
- const postSpy = vi.spyOn(axiosModule.default, 'post').mockResolvedValueOnce({
157
- data: { choices: [{ message: { content: 'test message' } }] },
158
- });
159
- await callAiForCommitMessage('https://custom.ai.com/api/v1', 'sk-custom-key', 'custom-model', 'test diff');
160
- expect(postSpy).toHaveBeenCalledWith('https://custom.ai.com/api/v1/chat/completions', expect.objectContaining({
161
- model: 'custom-model',
162
- stream: false,
163
- messages: expect.arrayContaining([
164
- expect.objectContaining({ role: 'system' }),
165
- expect.objectContaining({ role: 'user' }),
166
- ]),
167
- max_tokens: 200,
168
- temperature: 0.2,
169
- }), expect.objectContaining({
170
- headers: expect.objectContaining({
171
- 'Content-Type': 'application/json',
172
- 'Authorization': 'Bearer sk-custom-key',
173
- }),
174
- }));
175
- });
176
- });
177
- describe('sanitizeCommitMessage', () => {
178
- it('returns a clean commit message unchanged', () => {
179
- expect(sanitizeCommitMessage('feat(api): 增加用户登录接口')).toBe('feat(api): 增加用户登录接口');
180
- });
181
- it('strips "我们被问到" style meta-language prefix', () => {
182
- expect(sanitizeCommitMessage('我们被问到根据 diff 生成提交信息:feat(api): 增加用户登录接口'))
183
- .toBe('feat(api): 增加用户登录接口');
184
- });
185
- it('strips "好的" / "Sure" / "Here is" prefixes', () => {
186
- expect(sanitizeCommitMessage('好的,以下是提交信息:feat(api): xxx')).toBe('feat(api): xxx');
187
- expect(sanitizeCommitMessage('Sure, here is your commit message:\nfeat(api): xxx'))
188
- .toBe('feat(api): xxx');
189
- });
190
- it('strips "根据" / "以下是" Chinese meta-language prefixes', () => {
191
- expect(sanitizeCommitMessage('根据您提供的 diff,以下是符合 conventional commit 规范的提交信息:feat(api): xxx'))
192
- .toBe('feat(api): xxx');
193
- expect(sanitizeCommitMessage('以下是生成的提交信息:fix(api): xxx')).toBe('fix(api): xxx');
194
- });
195
- it('strips markdown code block fences', () => {
196
- expect(sanitizeCommitMessage('```text\nfeat(api): xxx\n```')).toBe('feat(api): xxx');
197
- });
198
- it('truncates at first blank line to drop meta-language body', () => {
199
- expect(sanitizeCommitMessage('feat(api): xxx\n\n我们刚才生成的提交信息是上面这一行'))
200
- .toBe('feat(api): xxx');
201
- });
202
- it('keeps only the first line when the first line is suspiciously long', () => {
203
- const long = 'a'.repeat(150);
204
- expect(sanitizeCommitMessage(`${long}\n\nbody content`)).toBe(long);
205
- });
206
- it('returns fallback when input is empty after sanitization', () => {
207
- expect(sanitizeCommitMessage('')).toBe('chore: update staged changes');
208
- expect(sanitizeCommitMessage(' \n\n ')).toBe('chore: update staged changes');
209
- });
210
- it('returns fallback for pure meta-language output', () => {
211
- // 反复剥离前缀后为空 → 兜底
212
- expect(sanitizeCommitMessage('我们被问到根据 diff 生成提交信息,好的以下是:'))
213
- .toBe('chore: update staged changes');
214
- });
215
- it('handles loose type style without scope', () => {
216
- expect(sanitizeCommitMessage('fix: 修复登录问题')).toBe('fix: 修复登录问题');
217
- expect(sanitizeCommitMessage('feat: 新增用户功能')).toBe('feat: 新增用户功能');
218
- });
219
- it('handles loose type style without space after colon', () => {
220
- expect(sanitizeCommitMessage('chore:更新依赖')).toBe('chore:更新依赖');
221
- });
222
- it('preserves Chinese-only description without conventional type', () => {
223
- expect(sanitizeCommitMessage('添加用户登录功能')).toBe('添加用户登录功能');
224
- expect(sanitizeCommitMessage('修复登录页面样式问题')).toBe('修复登录页面样式问题');
225
- });
226
- it('preserves English commit description without conventional type', () => {
227
- expect(sanitizeCommitMessage('Add user login feature')).toBe('Add user login feature');
228
- expect(sanitizeCommitMessage('Fix login page styling')).toBe('Fix login page styling');
229
- });
230
- it('strips meta prefix before loose type pattern', () => {
231
- expect(sanitizeCommitMessage('我们被问到根据 diff 生成提交信息,以下是:fix: 修复 bug'))
232
- .toBe('fix: 修复 bug');
233
- });
234
- it('strips meta prefix before Chinese-only description', () => {
235
- expect(sanitizeCommitMessage('我们被问到根据 diff 生成的提交信息是:添加新功能'))
236
- .toBe('添加新功能');
237
- expect(sanitizeCommitMessage('好的,以下是:更新用户配置'))
238
- .toBe('更新用户配置');
239
- });
240
- });
241
- describe('extractOpenAiStreamDelta', () => {
242
- it('extracts content from a single SSE data line', () => {
243
- const chunk = 'data: {"choices":[{"delta":{"content":"feat"}}]}';
244
- expect(extractOpenAiStreamDelta(chunk)).toBe('feat');
245
- });
246
- it('returns empty string for [DONE] sentinel', () => {
247
- expect(extractOpenAiStreamDelta('data: [DONE]')).toBe('');
248
- });
249
- it('skips non-data lines and aggregates multiple data lines', () => {
250
- const chunk = [
251
- 'event: message',
252
- 'data: {"choices":[{"delta":{"content":"feat"}}]}',
253
- 'data: {"choices":[{"delta":{"content":"(api)"}}]}',
254
- '',
255
- ].join('\n');
256
- expect(extractOpenAiStreamDelta(chunk)).toBe('feat(api)');
257
- });
258
- it('skips invalid JSON lines without throwing', () => {
259
- const chunk = 'data: not-valid-json\ndata: {"choices":[{"delta":{"content":"x"}}]}';
260
- expect(extractOpenAiStreamDelta(chunk)).toBe('x');
261
- });
262
- it('returns empty when no data lines present', () => {
263
- expect(extractOpenAiStreamDelta('event: foo\n')).toBe('');
264
- });
265
- });
266
- describe('streamAiForCommitMessage', () => {
267
- it('emits deltas and returns sanitized final message', async () => {
268
- const { Readable } = await import('node:stream');
269
- const sseChunks = [
270
- 'data: {"choices":[{"delta":{"content":"feat"}}]}\n\n',
271
- 'data: {"choices":[{"delta":{"content":"(api):"}}]}\n\n',
272
- 'data: {"choices":[{"delta":{"content":" 增加用户登录"}}]}\n\n',
273
- 'data: [DONE]\n\n',
274
- ];
275
- const stream = Readable.from(sseChunks.map(c => Buffer.from(c, 'utf8')));
276
- const axiosModule = await import('axios');
277
- vi.spyOn(axiosModule.default, 'post').mockResolvedValueOnce({ data: stream });
278
- const deltas = [];
279
- const final = await streamAiForCommitMessage('https://api.openai.com/v1', 'sk-test', 'gpt-4o', 'diff', (delta) => { deltas.push(delta); });
280
- expect(deltas.join('')).toBe('feat(api): 增加用户登录');
281
- expect(final).toBe('feat(api): 增加用户登录');
282
- });
283
- it('returns fallback when stream produces no content', async () => {
284
- const { Readable } = await import('node:stream');
285
- const stream = Readable.from([
286
- Buffer.from('data: [DONE]\n\n', 'utf8'),
287
- ]);
288
- const axiosModule = await import('axios');
289
- vi.spyOn(axiosModule.default, 'post').mockResolvedValueOnce({ data: stream });
290
- const final = await streamAiForCommitMessage('https://api.openai.com/v1', 'sk-test', 'gpt-4o', 'diff', () => { });
291
- expect(final).toBe('chore: update staged changes');
292
- });
293
- it('strips meta-language prefix from accumulated stream', async () => {
294
- const { Readable } = await import('node:stream');
295
- // 模型边输出边"思考",先说废话,后输出真实 commit
296
- const sseChunks = [
297
- 'data: {"choices":[{"delta":{"content":"我们被问到"}}]}\n\n',
298
- 'data: {"choices":[{"delta":{"content":"根据 diff"}}]}\n\n',
299
- 'data: {"choices":[{"delta":{"content":",feat(api): 增加用户"}}]}\n\n',
300
- 'data: [DONE]\n\n',
301
- ];
302
- const stream = Readable.from(sseChunks.map(c => Buffer.from(c, 'utf8')));
303
- const axiosModule = await import('axios');
304
- vi.spyOn(axiosModule.default, 'post').mockResolvedValueOnce({ data: stream });
305
- const accumulatedMessages = [];
306
- const final = await streamAiForCommitMessage('https://api.openai.com/v1', 'sk-test', 'gpt-4o', 'diff', (_delta, accumulated) => { accumulatedMessages.push(accumulated); });
307
- // 最终应只剩 commit message
308
- expect(final).toBe('feat(api): 增加用户');
309
- // 倒数几次 onDelta 调用中应该已经能拿到清洗后的结果
310
- expect(accumulatedMessages[accumulatedMessages.length - 1]).toBe('feat(api): 增加用户');
311
- });
312
- it('uses streaming parameters in the request', async () => {
313
- const { Readable } = await import('node:stream');
314
- const stream = Readable.from([Buffer.from('data: [DONE]\n\n', 'utf8')]);
315
- const axiosModule = await import('axios');
316
- const postSpy = vi.spyOn(axiosModule.default, 'post').mockResolvedValueOnce({ data: stream });
317
- await streamAiForCommitMessage('https://api.openai.com/v1', 'sk-test', 'gpt-4o', 'diff', () => { });
318
- expect(postSpy).toHaveBeenCalledWith('https://api.openai.com/v1/chat/completions', expect.objectContaining({
319
- model: 'gpt-4o',
320
- stream: true,
321
- max_tokens: 200,
322
- temperature: 0.2,
323
- }), expect.objectContaining({
324
- responseType: 'stream',
325
- headers: expect.objectContaining({
326
- Accept: 'text/event-stream',
327
- }),
328
- }));
329
- });
330
- });
@@ -1,5 +0,0 @@
1
- /**
2
- * Instance 路由单元测试
3
- */
4
- export {};
5
- //# sourceMappingURL=instance.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"instance.test.d.ts","sourceRoot":"","sources":["../../src/routes/instance.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}