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
@@ -0,0 +1,429 @@
1
+ // ==================== 工具 1: sub_agent ====================
2
+ const SUB_AGENT_TOOL_DESCRIPTION = `Launch a new sub-agent to handle a task autonomously (non-blocking).
3
+
4
+ Use this tool to:
5
+ 1. Delegate research, exploration, or implementation work to a specialized sub-agent
6
+ 2. Run multiple independent tasks in parallel (multiple tool calls in one message)
7
+ 3. Keep the main context window focused by offloading detailed work
8
+
9
+ Available subagent types:
10
+ - "general": Full-featured agent for executing multi-step tasks (file ops, bash, etc.)
11
+ - "explore": Read-only agent for codebase exploration (grep, glob, read, bash, web search)
12
+
13
+ This tool is NON-BLOCKING: it returns immediately with a subId after spawn.
14
+ The sub-agent starts automatically and runs in the background.
15
+ To get the result, call await_sub_agents with the subId.
16
+ To check progress, call get_sub_agent_status with the subId.
17
+ To list all sub-agents, call list_sub_agents.
18
+
19
+ Guidelines:
20
+ - Provide a concise 3-5 word description for tracking
21
+ - Write a clear, self-contained prompt (the sub-agent starts with a fresh context)
22
+ - Launch multiple agents concurrently when possible (multiple tool calls in one message)
23
+ - Sub-agents cannot spawn further sub-agents (no nesting)
24
+ - Always call await_sub_agents before reporting completion to the user`;
25
+ export function createSubAgentTool(deps) {
26
+ return {
27
+ kind: "builtin",
28
+ toolName: "sub_agent",
29
+ exposedName: "sub_agent",
30
+ description: SUB_AGENT_TOOL_DESCRIPTION,
31
+ inputSchema: {
32
+ type: "object",
33
+ properties: {
34
+ description: {
35
+ type: "string",
36
+ description: "A short (3-5 words) description of the task.",
37
+ },
38
+ prompt: {
39
+ type: "string",
40
+ description: "The task for the sub-agent to perform (self-contained, fresh context).",
41
+ },
42
+ subagent_type: {
43
+ type: "string",
44
+ enum: ["general", "explore"],
45
+ description: "Type of specialized agent: 'general' for multi-step tasks, 'explore' for read-only codebase exploration.",
46
+ },
47
+ },
48
+ required: ["description", "prompt", "subagent_type"],
49
+ },
50
+ async execute(args) {
51
+ const description = typeof args.description === "string" ? args.description.trim() : "";
52
+ const prompt = typeof args.prompt === "string" ? args.prompt.trim() : "";
53
+ const subagentType = args.subagent_type;
54
+ if (!description) {
55
+ return {
56
+ title: "sub_agent validation error",
57
+ output: "Invalid input: 'description' is required and must be non-empty.",
58
+ metadata: { error: true },
59
+ };
60
+ }
61
+ if (!prompt) {
62
+ return {
63
+ title: "sub_agent validation error",
64
+ output: "Invalid input: 'prompt' is required and must be non-empty.",
65
+ metadata: { error: true },
66
+ };
67
+ }
68
+ if (subagentType !== "general" && subagentType !== "explore") {
69
+ return {
70
+ title: "sub_agent validation error",
71
+ output: `Invalid input: 'subagent_type' must be 'general' or 'explore', got '${subagentType}'.`,
72
+ metadata: { error: true },
73
+ };
74
+ }
75
+ try {
76
+ const { subId } = await deps.spawnSubAgent({ subagentType, description, prompt });
77
+ return {
78
+ title: description,
79
+ output: `sub_agent spawned: ${subId}\nstatus: pending\n\nCall await_sub_agents with this subId to get the result.\nCall get_sub_agent_status to check progress.`,
80
+ metadata: { subId, spawned: true },
81
+ };
82
+ }
83
+ catch (err) {
84
+ const errorMessage = err instanceof Error ? err.message : String(err);
85
+ return {
86
+ title: description,
87
+ output: `Failed to spawn sub-agent: ${errorMessage}`,
88
+ metadata: { error: true },
89
+ };
90
+ }
91
+ },
92
+ };
93
+ }
94
+ // ==================== 工具 2: list_sub_agents ====================
95
+ const LIST_SUB_AGENTS_DESCRIPTION = `List all sub-agents for the current agent.
96
+
97
+ Returns two arrays:
98
+ - running: sub-agents currently in pending/running state
99
+ - history: completed/failed/cancelled sub-agents (most recent first)
100
+
101
+ Use this to:
102
+ 1. Check which sub-agents are still running
103
+ 2. Review completed sub-agent history
104
+ 3. Find a subId before calling await_sub_agents or get_sub_agent_status`;
105
+ export function createListSubAgentsTool(deps) {
106
+ return {
107
+ kind: "builtin",
108
+ toolName: "list_sub_agents",
109
+ exposedName: "list_sub_agents",
110
+ description: LIST_SUB_AGENTS_DESCRIPTION,
111
+ inputSchema: {
112
+ type: "object",
113
+ properties: {},
114
+ },
115
+ async execute(_args) {
116
+ try {
117
+ const { running, history } = await deps.listSubAgents();
118
+ const formatEntry = (e) => {
119
+ const duration = e.durationMs !== undefined
120
+ ? `${(e.durationMs / 1000).toFixed(1)}s`
121
+ : e.endedAt
122
+ ? `${((e.endedAt - e.startedAt) / 1000).toFixed(1)}s`
123
+ : "ongoing";
124
+ return ` - ${e.subId} [${e.status}] (${duration}) ${e.description}`;
125
+ };
126
+ const lines = [];
127
+ lines.push(`Running (${running.length}):`);
128
+ if (running.length === 0) {
129
+ lines.push(" (none)");
130
+ }
131
+ else {
132
+ running.forEach((e) => lines.push(formatEntry(e)));
133
+ }
134
+ lines.push("");
135
+ lines.push(`History (${history.length}):`);
136
+ if (history.length === 0) {
137
+ lines.push(" (none)");
138
+ }
139
+ else {
140
+ history.forEach((e) => lines.push(formatEntry(e)));
141
+ }
142
+ return {
143
+ title: "sub-agents list",
144
+ output: lines.join("\n"),
145
+ metadata: { runningCount: running.length, historyCount: history.length },
146
+ };
147
+ }
148
+ catch (err) {
149
+ const errorMessage = err instanceof Error ? err.message : String(err);
150
+ return {
151
+ title: "list_sub_agents error",
152
+ output: `Failed to list sub-agents: ${errorMessage}`,
153
+ metadata: { error: true },
154
+ };
155
+ }
156
+ },
157
+ };
158
+ }
159
+ // ==================== 工具 3: get_sub_agent_status ====================
160
+ const GET_SUB_AGENT_STATUS_DESCRIPTION = `Get the current status and context snapshot of a sub-agent.
161
+
162
+ Returns:
163
+ - status: pending/running/completed/failed/cancelled
164
+ - currentTool: tool currently being executed (if running)
165
+ - lastAssistantText: recent assistant output (truncated)
166
+ - tokenUsage: input/output token counts
167
+ - messageCount: number of messages so far
168
+ - result: final output (if completed)
169
+ - error: error message (if failed)
170
+
171
+ Use this to check progress of a running sub-agent before awaiting it.`;
172
+ export function createGetSubAgentStatusTool(deps) {
173
+ return {
174
+ kind: "builtin",
175
+ toolName: "get_sub_agent_status",
176
+ exposedName: "get_sub_agent_status",
177
+ description: GET_SUB_AGENT_STATUS_DESCRIPTION,
178
+ inputSchema: {
179
+ type: "object",
180
+ properties: {
181
+ sub_id: {
182
+ type: "string",
183
+ description: "The sub-agent ID returned by sub_agent tool.",
184
+ },
185
+ },
186
+ required: ["sub_id"],
187
+ },
188
+ async execute(args) {
189
+ const subId = typeof args.sub_id === "string" ? args.sub_id.trim() : "";
190
+ if (!subId) {
191
+ return {
192
+ title: "get_sub_agent_status validation error",
193
+ output: "Invalid input: 'sub_id' is required.",
194
+ metadata: { error: true },
195
+ };
196
+ }
197
+ try {
198
+ const detail = await deps.getSubAgentStatus(subId);
199
+ if (!detail) {
200
+ return {
201
+ title: "sub-agent not found",
202
+ output: `sub-agent not found: ${subId}`,
203
+ metadata: { subId, error: true },
204
+ };
205
+ }
206
+ const lines = [];
207
+ lines.push(`subId: ${detail.subId}`);
208
+ lines.push(`type: ${detail.subagentType}`);
209
+ lines.push(`description: ${detail.description}`);
210
+ lines.push(`status: ${detail.status}`);
211
+ if (detail.startedAt) {
212
+ lines.push(`startedAt: ${new Date(detail.startedAt).toISOString()}`);
213
+ }
214
+ if (detail.endedAt) {
215
+ lines.push(`endedAt: ${new Date(detail.endedAt).toISOString()}`);
216
+ }
217
+ if (detail.durationMs !== undefined) {
218
+ lines.push(`duration: ${(detail.durationMs / 1000).toFixed(2)}s`);
219
+ }
220
+ if (detail.contextSnapshot) {
221
+ lines.push("");
222
+ lines.push("Context:");
223
+ if (detail.contextSnapshot.currentTool) {
224
+ lines.push(` currentTool: ${detail.contextSnapshot.currentTool}`);
225
+ }
226
+ if (detail.contextSnapshot.lastAssistantText) {
227
+ const text = detail.contextSnapshot.lastAssistantText;
228
+ lines.push(` lastOutput: ${text.length > 200 ? text.slice(-200) + "..." : text}`);
229
+ }
230
+ lines.push(` tokens: input=${detail.contextSnapshot.tokenUsage.input}, output=${detail.contextSnapshot.tokenUsage.output}`);
231
+ lines.push(` messages: ${detail.contextSnapshot.messageCount}`);
232
+ lines.push(` updatedAt: ${detail.contextSnapshot.updatedAt}`);
233
+ }
234
+ if (detail.result) {
235
+ lines.push("");
236
+ lines.push("Result:");
237
+ const result = detail.result;
238
+ lines.push(result.length > 500 ? result.slice(0, 500) + "\n... (truncated)" : result);
239
+ }
240
+ if (detail.errorMessage) {
241
+ lines.push("");
242
+ lines.push(`Error: ${detail.errorMessage}`);
243
+ }
244
+ return {
245
+ title: `status: ${detail.description}`,
246
+ output: lines.join("\n"),
247
+ metadata: {
248
+ subId: detail.subId,
249
+ status: detail.status,
250
+ },
251
+ };
252
+ }
253
+ catch (err) {
254
+ const errorMessage = err instanceof Error ? err.message : String(err);
255
+ return {
256
+ title: "get_sub_agent_status error",
257
+ output: `Failed to get status: ${errorMessage}`,
258
+ metadata: { subId, error: true },
259
+ };
260
+ }
261
+ },
262
+ };
263
+ }
264
+ // ==================== 工具 4: await_sub_agents ====================
265
+ const AWAIT_SUB_AGENTS_DESCRIPTION = `Block and wait for one or more sub-agents to complete.
266
+
267
+ Use this tool after spawning one or more sub-agents (via sub_agent) to get their results.
268
+ All specified sub-agents must complete (completed/failed/cancelled) before this returns.
269
+
270
+ If a sub-agent is still pending (not started), it will be auto-started.
271
+
272
+ Returns an array of results, each containing:
273
+ - subId: the sub-agent ID
274
+ - output: the final output text (if completed)
275
+ - error: error message (if failed or cancelled)
276
+ - status: final status
277
+
278
+ Guidelines:
279
+ - Pass all subIds you want to wait for in one call
280
+ - Use a timeout to avoid waiting forever (0 = no timeout, default 0)
281
+ - After this returns, call poll_message to receive any pending messages`;
282
+ export function createAwaitSubAgentsTool(deps) {
283
+ return {
284
+ kind: "builtin",
285
+ toolName: "await_sub_agents",
286
+ exposedName: "await_sub_agents",
287
+ description: AWAIT_SUB_AGENTS_DESCRIPTION,
288
+ inputSchema: {
289
+ type: "object",
290
+ properties: {
291
+ sub_ids: {
292
+ type: "array",
293
+ items: { type: "string" },
294
+ description: "Array of sub-agent IDs to wait for.",
295
+ },
296
+ timeout_ms: {
297
+ type: "number",
298
+ description: "Maximum time to wait in milliseconds. 0 = no timeout (wait forever). Default: 0.",
299
+ },
300
+ },
301
+ required: ["sub_ids"],
302
+ },
303
+ async execute(args) {
304
+ const subIdsRaw = args.sub_ids;
305
+ const timeoutMs = typeof args.timeout_ms === "number" ? args.timeout_ms : 0;
306
+ if (!Array.isArray(subIdsRaw) || subIdsRaw.length === 0) {
307
+ return {
308
+ title: "await_sub_agents validation error",
309
+ output: "Invalid input: 'sub_ids' must be a non-empty array of sub-agent IDs.",
310
+ metadata: { error: true },
311
+ };
312
+ }
313
+ const subIds = subIdsRaw.filter((id) => typeof id === "string" && id.trim().length > 0);
314
+ if (subIds.length === 0) {
315
+ return {
316
+ title: "await_sub_agents validation error",
317
+ output: "Invalid input: 'sub_ids' contains no valid IDs.",
318
+ metadata: { error: true },
319
+ };
320
+ }
321
+ try {
322
+ const results = await deps.awaitSubAgents(subIds, timeoutMs);
323
+ const lines = [];
324
+ lines.push(`Awaited ${results.length} sub-agent(s):`);
325
+ lines.push("");
326
+ for (const r of results) {
327
+ lines.push(`=== ${r.subId} [${r.status}] ===`);
328
+ if (r.error) {
329
+ lines.push(`<task_error>`);
330
+ lines.push(r.error);
331
+ lines.push(`</task_error>`);
332
+ }
333
+ else {
334
+ lines.push(`<task_result>`);
335
+ lines.push(r.output || "(empty output)");
336
+ lines.push(`</task_result>`);
337
+ }
338
+ lines.push("");
339
+ }
340
+ const completedCount = results.filter((r) => r.status === "completed").length;
341
+ const failedCount = results.filter((r) => r.status === "failed").length;
342
+ const cancelledCount = results.filter((r) => r.status === "cancelled").length;
343
+ return {
344
+ title: `awaited ${results.length} sub-agent(s)`,
345
+ output: lines.join("\n"),
346
+ metadata: {
347
+ total: results.length,
348
+ completed: completedCount,
349
+ failed: failedCount,
350
+ cancelled: cancelledCount,
351
+ },
352
+ };
353
+ }
354
+ catch (err) {
355
+ const errorMessage = err instanceof Error ? err.message : String(err);
356
+ return {
357
+ title: "await_sub_agents error",
358
+ output: `Failed to await sub-agents: ${errorMessage}`,
359
+ metadata: { error: true },
360
+ };
361
+ }
362
+ },
363
+ };
364
+ }
365
+ // ==================== 工具 5: abort_sub_agent ====================
366
+ const ABORT_SUB_AGENT_DESCRIPTION = `Abort a running sub-agent.
367
+
368
+ Use this to cancel a sub-agent that is taking too long or is no longer needed.
369
+ Only pending or running sub-agents can be aborted; completed/failed/cancelled are no-ops.
370
+
371
+ After abort:
372
+ - The sub-agent's status becomes 'cancelled'
373
+ - Its completionPromise resolves with error='aborted'
374
+ - Any await_sub_agents waiting on it will return immediately`;
375
+ export function createAbortSubAgentTool(deps) {
376
+ return {
377
+ kind: "builtin",
378
+ toolName: "abort_sub_agent",
379
+ exposedName: "abort_sub_agent",
380
+ description: ABORT_SUB_AGENT_DESCRIPTION,
381
+ inputSchema: {
382
+ type: "object",
383
+ properties: {
384
+ sub_id: {
385
+ type: "string",
386
+ description: "The sub-agent ID to abort.",
387
+ },
388
+ },
389
+ required: ["sub_id"],
390
+ },
391
+ async execute(args) {
392
+ const subId = typeof args.sub_id === "string" ? args.sub_id.trim() : "";
393
+ if (!subId) {
394
+ return {
395
+ title: "abort_sub_agent validation error",
396
+ output: "Invalid input: 'sub_id' is required.",
397
+ metadata: { error: true },
398
+ };
399
+ }
400
+ try {
401
+ await deps.abortSubAgent(subId);
402
+ return {
403
+ title: "sub-agent aborted",
404
+ output: `sub-agent ${subId} has been aborted.`,
405
+ metadata: { subId, aborted: true },
406
+ };
407
+ }
408
+ catch (err) {
409
+ const errorMessage = err instanceof Error ? err.message : String(err);
410
+ return {
411
+ title: "abort_sub_agent error",
412
+ output: `Failed to abort sub-agent: ${errorMessage}`,
413
+ metadata: { subId, error: true },
414
+ };
415
+ }
416
+ },
417
+ };
418
+ }
419
+ // ==================== 工厂函数:一次创建全部 5 个工具 ====================
420
+ /** 创建全部 5 个 sub-agent 工具(仅当注入了 SubAgentManager 时调用) */
421
+ export function createSubAgentTools(deps) {
422
+ return [
423
+ createSubAgentTool(deps),
424
+ createListSubAgentsTool(deps),
425
+ createGetSubAgentStatusTool(deps),
426
+ createAwaitSubAgentsTool(deps),
427
+ createAbortSubAgentTool(deps),
428
+ ];
429
+ }
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Sub Agent 类型定义。
3
+ *
4
+ * Sub agent 是由主 agent 通过 task 工具 spawn 的轻量级子代理,
5
+ * 拥有独立的 ACodeRuntime 实例(独立 context window)。
6
+ * 状态持久化到 ~/.acode/sub-agents/{agentId}.json(与 todo 同构)。
7
+ */
8
+ /** Sub agent 类型(决定工具权限) */
9
+ export type SubAgentType = "general" | "explore";
10
+ /** Sub agent 状态机 */
11
+ export type SubAgentStatus = "pending" | "running" | "completed" | "failed" | "cancelled";
12
+ /** 实时上下文快照(供 dashboard popup 展示) */
13
+ export interface SubAgentContextSnapshot {
14
+ /** 当前正在执行的工具名(如 "read_file"),无则 undefined */
15
+ currentTool?: string;
16
+ /** 最近一条 assistant 文本(截断 500 字符) */
17
+ lastAssistantText?: string;
18
+ /** 累计 token 用量 */
19
+ tokenUsage: {
20
+ input: number;
21
+ output: number;
22
+ };
23
+ /** 已产生的消息数(含 user/assistant/tool) */
24
+ messageCount: number;
25
+ /** 最后更新时间(ISO) */
26
+ updatedAt: string;
27
+ }
28
+ /** 持久化的单条 sub-agent 记录 */
29
+ export interface SubAgentRecord {
30
+ /** sub-agent 唯一 ID(= sub-session-id) */
31
+ subId: string;
32
+ /** 父 agent.id */
33
+ parentAgentId: string;
34
+ /** 父 agent 的 runtime_session_id(用于校验归属) */
35
+ parentSessionId: string;
36
+ /** sub-agent 类型 */
37
+ subagentType: SubAgentType;
38
+ /** LLM 给的 3-5 词任务描述 */
39
+ description: string;
40
+ /** LLM 给的完整任务 prompt */
41
+ prompt: string;
42
+ /** 当前状态 */
43
+ status: SubAgentStatus;
44
+ /** 完成时的最终输出文本(tool output) */
45
+ result?: string;
46
+ /** 失败时的错误信息 */
47
+ errorMessage?: string;
48
+ /** 开始时间(毫秒时间戳) */
49
+ startedAt: number;
50
+ /** 结束时间(毫秒时间戳) */
51
+ endedAt?: number;
52
+ /** 运行时长(毫秒) */
53
+ durationMs?: number;
54
+ /** 最后一次上下文快照(仅 running 状态有意义,持久化时清空) */
55
+ contextSnapshot?: SubAgentContextSnapshot;
56
+ /** 工具调用事件历史(仅 tool_start/tool_end,按时间升序)。undefined 表示运行中尚未产生或旧版本记录 */
57
+ events?: SubAgentEvent[];
58
+ /** 该 sub-agent 创建时可用的工具列表(exposedName) */
59
+ availableTools?: string[];
60
+ }
61
+ /** 持久化的 sub-agent 文档结构 */
62
+ export interface SubAgentDocument {
63
+ agentId: string;
64
+ updatedAt: string;
65
+ /** 全部 sub-agent 记录,按 startedAt 倒序 */
66
+ subAgents: SubAgentRecord[];
67
+ }
68
+ /** Sub agent 运行时事件(SSE 推送) */
69
+ export interface SubAgentEvent {
70
+ /** 事件类型 */
71
+ type: "spawned" | "running" | "tool_start" | "tool_end" | "delta" | "completed" | "failed" | "cancelled";
72
+ /** sub-agent ID */
73
+ subId: string;
74
+ /** 事件时间戳(ISO) */
75
+ timestamp: string;
76
+ /** 事件数据(按 type 不同结构不同) */
77
+ data: {
78
+ tool?: string;
79
+ text?: string;
80
+ result?: string;
81
+ error?: string;
82
+ snapshot?: SubAgentContextSnapshot;
83
+ };
84
+ }
85
+ //# sourceMappingURL=sub-agent-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sub-agent-types.d.ts","sourceRoot":"","sources":["../src/sub-agent-types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2BAA2B;AAC3B,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,SAAS,CAAC;AAEjD,oBAAoB;AACpB,MAAM,MAAM,cAAc,GACtB,SAAS,GACT,SAAS,GACT,WAAW,GACX,QAAQ,GACR,WAAW,CAAC;AAEhB,oCAAoC;AACpC,MAAM,WAAW,uBAAuB;IACtC,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB;IAClB,UAAU,EAAE;QACV,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,qCAAqC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,0BAA0B;AAC1B,MAAM,WAAW,cAAc;IAC7B,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB;IACnB,YAAY,EAAE,YAAY,CAAC;IAC3B,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW;IACX,MAAM,EAAE,cAAc,CAAC;IACvB,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,eAAe,CAAC,EAAE,uBAAuB,CAAC;IAC1C,sEAAsE;IACtE,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;IACzB,0CAA0C;IAC1C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,0BAA0B;AAC1B,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,SAAS,EAAE,cAAc,EAAE,CAAC;CAC7B;AAED,8BAA8B;AAC9B,MAAM,WAAW,aAAa;IAC5B,WAAW;IACX,IAAI,EACA,SAAS,GACT,SAAS,GACT,YAAY,GACZ,UAAU,GACV,OAAO,GACP,WAAW,GACX,QAAQ,GACR,WAAW,CAAC;IAChB,mBAAmB;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,IAAI,EAAE;QACJ,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,uBAAuB,CAAC;KACpC,CAAC;CACH"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Sub Agent 类型定义。
3
+ *
4
+ * Sub agent 是由主 agent 通过 task 工具 spawn 的轻量级子代理,
5
+ * 拥有独立的 ACodeRuntime 实例(独立 context window)。
6
+ * 状态持久化到 ~/.acode/sub-agents/{agentId}.json(与 todo 同构)。
7
+ */
8
+ export {};
@@ -0,0 +1,42 @@
1
+ /** 单条 todo 项 */
2
+ export interface TodoItem {
3
+ /** 任务简短描述(必填) */
4
+ content: string;
5
+ status: "pending" | "in_progress" | "completed" | "cancelled";
6
+ priority: "high" | "medium" | "low";
7
+ }
8
+ /** 持久化的 todo 文档结构 */
9
+ export interface TodoDocument {
10
+ agentId: string;
11
+ updatedAt: string;
12
+ /**
13
+ * 整个 todo 列表的任务背景(必填)—— 描述该批任务的整体来源、目标、约束。
14
+ * 写入时由 todo_write 顶层传入,读取时一并返回,便于恢复任务上下文。
15
+ */
16
+ background: string;
17
+ todos: TodoItem[];
18
+ }
19
+ /**
20
+ * Todo JSON 文件存储,按 agentId 隔离。
21
+ * 文件路径:{homedir}/.acode/todos/{agentId}.json
22
+ *
23
+ * 路径与 bridge 现有 ~/.acode/cmd-dist/ 惯例一致,固定使用家目录:
24
+ * - 不依赖 agent 工作目录,避免 workspacePath 错误时读取失败
25
+ * - todo 跟随 agent(agentId),不跟随项目工作区
26
+ *
27
+ * 并发安全:同一 TodoStore 实例的写操作通过 Promise 链串行化,
28
+ * 避免同一 agentId 的并发 todo_write 互相覆盖。
29
+ * 写入采用 tmp + rename 原子替换,防止半写损坏。
30
+ */
31
+ export declare class TodoStore {
32
+ private readonly todosDir;
33
+ private writeChain;
34
+ constructor();
35
+ /** 文件路径(按 agentId 隔离) */
36
+ private filePath;
37
+ /** 读取该 agentId 的 todo 文档。文件不存在或损坏时返回空文档。 */
38
+ read(agentId: string): Promise<TodoDocument>;
39
+ /** 全量替换该 agentId 的 todo 文档(background + todos)。串行化以避免并发覆盖。 */
40
+ write(agentId: string, background: string, todos: TodoItem[]): Promise<void>;
41
+ }
42
+ //# sourceMappingURL=todo-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todo-store.d.ts","sourceRoot":"","sources":["../src/todo-store.ts"],"names":[],"mappings":"AAIA,gBAAgB;AAChB,MAAM,WAAW,QAAQ;IACvB,iBAAiB;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,WAAW,CAAC;IAC9D,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACrC;AAED,qBAAqB;AACrB,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,UAAU,CAAoC;;IAMtD,yBAAyB;IACzB,OAAO,CAAC,QAAQ;IAMhB,4CAA4C;IACtC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAmBlD,8DAA8D;IACxD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAkBnF"}
@@ -0,0 +1,68 @@
1
+ import { promises as fs } from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ /**
5
+ * Todo JSON 文件存储,按 agentId 隔离。
6
+ * 文件路径:{homedir}/.acode/todos/{agentId}.json
7
+ *
8
+ * 路径与 bridge 现有 ~/.acode/cmd-dist/ 惯例一致,固定使用家目录:
9
+ * - 不依赖 agent 工作目录,避免 workspacePath 错误时读取失败
10
+ * - todo 跟随 agent(agentId),不跟随项目工作区
11
+ *
12
+ * 并发安全:同一 TodoStore 实例的写操作通过 Promise 链串行化,
13
+ * 避免同一 agentId 的并发 todo_write 互相覆盖。
14
+ * 写入采用 tmp + rename 原子替换,防止半写损坏。
15
+ */
16
+ export class TodoStore {
17
+ constructor() {
18
+ this.writeChain = Promise.resolve();
19
+ this.todosDir = path.join(os.homedir(), ".acode", "todos");
20
+ }
21
+ /** 文件路径(按 agentId 隔离) */
22
+ filePath(agentId) {
23
+ // 防止路径穿越:仅允许字母数字下划线短横
24
+ const safe = String(agentId).replace(/[^a-zA-Z0-9_-]/g, "_");
25
+ return path.join(this.todosDir, `${safe}.json`);
26
+ }
27
+ /** 读取该 agentId 的 todo 文档。文件不存在或损坏时返回空文档。 */
28
+ async read(agentId) {
29
+ const empty = { agentId, updatedAt: "", background: "", todos: [] };
30
+ try {
31
+ const raw = await fs.readFile(this.filePath(agentId), "utf-8");
32
+ const doc = JSON.parse(raw);
33
+ return {
34
+ agentId,
35
+ updatedAt: typeof doc.updatedAt === "string" ? doc.updatedAt : "",
36
+ background: typeof doc.background === "string" ? doc.background : "",
37
+ todos: Array.isArray(doc.todos) ? doc.todos : [],
38
+ };
39
+ }
40
+ catch (err) {
41
+ if (err && err.code === "ENOENT")
42
+ return empty;
43
+ // JSON 解析错误也返回空,避免损坏文件阻断读取
44
+ if (err instanceof SyntaxError)
45
+ return empty;
46
+ throw err;
47
+ }
48
+ }
49
+ /** 全量替换该 agentId 的 todo 文档(background + todos)。串行化以避免并发覆盖。 */
50
+ async write(agentId, background, todos) {
51
+ const target = this.filePath(agentId);
52
+ const run = this.writeChain.then(async () => {
53
+ await fs.mkdir(this.todosDir, { recursive: true });
54
+ const doc = {
55
+ agentId,
56
+ updatedAt: new Date().toISOString(),
57
+ background,
58
+ todos,
59
+ };
60
+ const tmp = `${target}.tmp`;
61
+ await fs.writeFile(tmp, JSON.stringify(doc, null, 2), "utf-8");
62
+ await fs.rename(tmp, target);
63
+ });
64
+ // 维持链式串行,但不让单次失败阻断后续写
65
+ this.writeChain = run.catch(() => { });
66
+ await run;
67
+ }
68
+ }
@@ -0,0 +1,6 @@
1
+ import type { ACodeBuiltInTool } from "./built-in-file-tools.js";
2
+ /** 创建 todo_write 工具(全量替换该 agent 的 todo 列表) */
3
+ export declare function createTodoWriteTool(agentId: string): ACodeBuiltInTool;
4
+ /** 创建 todo_read 工具(读取该 agent 的 todo 列表,含整体 background) */
5
+ export declare function createTodoReadTool(agentId: string): ACodeBuiltInTool;
6
+ //# sourceMappingURL=todo-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todo-tool.d.ts","sourceRoot":"","sources":["../src/todo-tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAc,MAAM,0BAA0B,CAAC;AAsE7E,8CAA8C;AAC9C,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAuDrE;AAED,0DAA0D;AAC1D,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAqBpE"}