@mobrienv/autoloop 0.4.0 → 0.7.0

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 (440) hide show
  1. package/README.md +40 -14
  2. package/bin/autoloop +1 -1
  3. package/dist/index.d.ts +6 -0
  4. package/dist/index.js +19 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/testing/mock-backend.js +3 -5
  7. package/dist/testing/mock-backend.js.map +1 -1
  8. package/package.json +30 -23
  9. package/plugins/autoloop/.claude-plugin/plugin.json +1 -1
  10. package/dist/agent-map.d.ts +0 -10
  11. package/dist/agent-map.js +0 -58
  12. package/dist/agent-map.js.map +0 -1
  13. package/dist/backend/acp-client.d.ts +0 -38
  14. package/dist/backend/acp-client.js +0 -293
  15. package/dist/backend/acp-client.js.map +0 -1
  16. package/dist/backend/index.d.ts +0 -10
  17. package/dist/backend/index.js +0 -71
  18. package/dist/backend/index.js.map +0 -1
  19. package/dist/backend/kiro-bridge.d.ts +0 -19
  20. package/dist/backend/kiro-bridge.js +0 -114
  21. package/dist/backend/kiro-bridge.js.map +0 -1
  22. package/dist/backend/kiro-worker.d.ts +0 -1
  23. package/dist/backend/kiro-worker.js +0 -96
  24. package/dist/backend/kiro-worker.js.map +0 -1
  25. package/dist/backend/run-command.d.ts +0 -7
  26. package/dist/backend/run-command.js +0 -50
  27. package/dist/backend/run-command.js.map +0 -1
  28. package/dist/backend/run-kiro.d.ts +0 -3
  29. package/dist/backend/run-kiro.js +0 -16
  30. package/dist/backend/run-kiro.js.map +0 -1
  31. package/dist/backend/run-mock.d.ts +0 -1
  32. package/dist/backend/run-mock.js +0 -6
  33. package/dist/backend/run-mock.js.map +0 -1
  34. package/dist/backend/run-pi.d.ts +0 -5
  35. package/dist/backend/run-pi.js +0 -5
  36. package/dist/backend/run-pi.js.map +0 -1
  37. package/dist/backend/types.d.ts +0 -21
  38. package/dist/backend/types.js +0 -2
  39. package/dist/backend/types.js.map +0 -1
  40. package/dist/chains/budget.d.ts +0 -7
  41. package/dist/chains/budget.js +0 -54
  42. package/dist/chains/budget.js.map +0 -1
  43. package/dist/chains/load.d.ts +0 -18
  44. package/dist/chains/load.js +0 -129
  45. package/dist/chains/load.js.map +0 -1
  46. package/dist/chains/render.d.ts +0 -2
  47. package/dist/chains/render.js +0 -74
  48. package/dist/chains/render.js.map +0 -1
  49. package/dist/chains/run.d.ts +0 -17
  50. package/dist/chains/run.js +0 -260
  51. package/dist/chains/run.js.map +0 -1
  52. package/dist/chains/types.d.ts +0 -38
  53. package/dist/chains/types.js +0 -2
  54. package/dist/chains/types.js.map +0 -1
  55. package/dist/chains.d.ts +0 -6
  56. package/dist/chains.js +0 -5
  57. package/dist/chains.js.map +0 -1
  58. package/dist/cli/color.d.ts +0 -6
  59. package/dist/cli/color.js +0 -40
  60. package/dist/cli/color.js.map +0 -1
  61. package/dist/commands/chain.d.ts +0 -1
  62. package/dist/commands/chain.js +0 -53
  63. package/dist/commands/chain.js.map +0 -1
  64. package/dist/commands/config.d.ts +0 -1
  65. package/dist/commands/config.js +0 -74
  66. package/dist/commands/config.js.map +0 -1
  67. package/dist/commands/dashboard.d.ts +0 -1
  68. package/dist/commands/dashboard.js +0 -68
  69. package/dist/commands/dashboard.js.map +0 -1
  70. package/dist/commands/guide.d.ts +0 -1
  71. package/dist/commands/guide.js +0 -33
  72. package/dist/commands/guide.js.map +0 -1
  73. package/dist/commands/inspect.d.ts +0 -1
  74. package/dist/commands/inspect.js +0 -243
  75. package/dist/commands/inspect.js.map +0 -1
  76. package/dist/commands/list.d.ts +0 -1
  77. package/dist/commands/list.js +0 -15
  78. package/dist/commands/list.js.map +0 -1
  79. package/dist/commands/loops.d.ts +0 -1
  80. package/dist/commands/loops.js +0 -72
  81. package/dist/commands/loops.js.map +0 -1
  82. package/dist/commands/memory.d.ts +0 -1
  83. package/dist/commands/memory.js +0 -65
  84. package/dist/commands/memory.js.map +0 -1
  85. package/dist/commands/pi-adapter.d.ts +0 -1
  86. package/dist/commands/pi-adapter.js +0 -6
  87. package/dist/commands/pi-adapter.js.map +0 -1
  88. package/dist/commands/run.d.ts +0 -1
  89. package/dist/commands/run.js +0 -292
  90. package/dist/commands/run.js.map +0 -1
  91. package/dist/commands/runs.d.ts +0 -1
  92. package/dist/commands/runs.js +0 -50
  93. package/dist/commands/runs.js.map +0 -1
  94. package/dist/commands/task.d.ts +0 -1
  95. package/dist/commands/task.js +0 -74
  96. package/dist/commands/task.js.map +0 -1
  97. package/dist/commands/worktree.d.ts +0 -1
  98. package/dist/commands/worktree.js +0 -162
  99. package/dist/commands/worktree.js.map +0 -1
  100. package/dist/config.d.ts +0 -31
  101. package/dist/config.js +0 -261
  102. package/dist/config.js.map +0 -1
  103. package/dist/dashboard/app.d.ts +0 -12
  104. package/dist/dashboard/app.js +0 -23
  105. package/dist/dashboard/app.js.map +0 -1
  106. package/dist/dashboard/routes/api.d.ts +0 -3
  107. package/dist/dashboard/routes/api.js +0 -186
  108. package/dist/dashboard/routes/api.js.map +0 -1
  109. package/dist/dashboard/routes/pages.d.ts +0 -2
  110. package/dist/dashboard/routes/pages.js +0 -16
  111. package/dist/dashboard/routes/pages.js.map +0 -1
  112. package/dist/dashboard/views/alpine-vendor.d.ts +0 -1
  113. package/dist/dashboard/views/alpine-vendor.js +0 -10
  114. package/dist/dashboard/views/alpine-vendor.js.map +0 -1
  115. package/dist/dashboard/views/shell.d.ts +0 -1
  116. package/dist/dashboard/views/shell.js +0 -1062
  117. package/dist/dashboard/views/shell.js.map +0 -1
  118. package/dist/events/decode.d.ts +0 -2
  119. package/dist/events/decode.js +0 -45
  120. package/dist/events/decode.js.map +0 -1
  121. package/dist/events/encode.d.ts +0 -2
  122. package/dist/events/encode.js +0 -33
  123. package/dist/events/encode.js.map +0 -1
  124. package/dist/events/guards.d.ts +0 -5
  125. package/dist/events/guards.js +0 -42
  126. package/dist/events/guards.js.map +0 -1
  127. package/dist/events/types.d.ts +0 -27
  128. package/dist/events/types.js +0 -2
  129. package/dist/events/types.js.map +0 -1
  130. package/dist/harness/artifacts.d.ts +0 -50
  131. package/dist/harness/artifacts.js +0 -333
  132. package/dist/harness/artifacts.js.map +0 -1
  133. package/dist/harness/config-helpers.d.ts +0 -35
  134. package/dist/harness/config-helpers.js +0 -409
  135. package/dist/harness/config-helpers.js.map +0 -1
  136. package/dist/harness/coordination.d.ts +0 -1
  137. package/dist/harness/coordination.js +0 -127
  138. package/dist/harness/coordination.js.map +0 -1
  139. package/dist/harness/display.d.ts +0 -21
  140. package/dist/harness/display.js +0 -176
  141. package/dist/harness/display.js.map +0 -1
  142. package/dist/harness/emit.d.ts +0 -15
  143. package/dist/harness/emit.js +0 -240
  144. package/dist/harness/emit.js.map +0 -1
  145. package/dist/harness/index.d.ts +0 -20
  146. package/dist/harness/index.js +0 -311
  147. package/dist/harness/index.js.map +0 -1
  148. package/dist/harness/iteration.d.ts +0 -16
  149. package/dist/harness/iteration.js +0 -131
  150. package/dist/harness/iteration.js.map +0 -1
  151. package/dist/harness/journal-format.d.ts +0 -25
  152. package/dist/harness/journal-format.js +0 -153
  153. package/dist/harness/journal-format.js.map +0 -1
  154. package/dist/harness/journal.d.ts +0 -31
  155. package/dist/harness/journal.js +0 -178
  156. package/dist/harness/journal.js.map +0 -1
  157. package/dist/harness/metareview.d.ts +0 -4
  158. package/dist/harness/metareview.js +0 -48
  159. package/dist/harness/metareview.js.map +0 -1
  160. package/dist/harness/metrics.d.ts +0 -12
  161. package/dist/harness/metrics.js +0 -180
  162. package/dist/harness/metrics.js.map +0 -1
  163. package/dist/harness/parallel.d.ts +0 -37
  164. package/dist/harness/parallel.js +0 -237
  165. package/dist/harness/parallel.js.map +0 -1
  166. package/dist/harness/prompt.d.ts +0 -46
  167. package/dist/harness/prompt.js +0 -403
  168. package/dist/harness/prompt.js.map +0 -1
  169. package/dist/harness/scratchpad.d.ts +0 -2
  170. package/dist/harness/scratchpad.js +0 -67
  171. package/dist/harness/scratchpad.js.map +0 -1
  172. package/dist/harness/stop.d.ts +0 -5
  173. package/dist/harness/stop.js +0 -70
  174. package/dist/harness/stop.js.map +0 -1
  175. package/dist/harness/tools.d.ts +0 -3
  176. package/dist/harness/tools.js +0 -65
  177. package/dist/harness/tools.js.map +0 -1
  178. package/dist/harness/types.d.ts +0 -110
  179. package/dist/harness/types.js +0 -2
  180. package/dist/harness/types.js.map +0 -1
  181. package/dist/harness/wave/finalize-wave.d.ts +0 -9
  182. package/dist/harness/wave/finalize-wave.js +0 -87
  183. package/dist/harness/wave/finalize-wave.js.map +0 -1
  184. package/dist/harness/wave/launch-branches.d.ts +0 -6
  185. package/dist/harness/wave/launch-branches.js +0 -314
  186. package/dist/harness/wave/launch-branches.js.map +0 -1
  187. package/dist/harness/wave/parse-objectives.d.ts +0 -3
  188. package/dist/harness/wave/parse-objectives.js +0 -32
  189. package/dist/harness/wave/parse-objectives.js.map +0 -1
  190. package/dist/harness/wave/types.d.ts +0 -43
  191. package/dist/harness/wave/types.js +0 -2
  192. package/dist/harness/wave/types.js.map +0 -1
  193. package/dist/harness/wave.d.ts +0 -6
  194. package/dist/harness/wave.js +0 -159
  195. package/dist/harness/wave.js.map +0 -1
  196. package/dist/isolation/index.d.ts +0 -4
  197. package/dist/isolation/index.js +0 -3
  198. package/dist/isolation/index.js.map +0 -1
  199. package/dist/isolation/resolve.d.ts +0 -39
  200. package/dist/isolation/resolve.js +0 -118
  201. package/dist/isolation/resolve.js.map +0 -1
  202. package/dist/isolation/run-scope.d.ts +0 -21
  203. package/dist/isolation/run-scope.js +0 -50
  204. package/dist/isolation/run-scope.js.map +0 -1
  205. package/dist/json.d.ts +0 -8
  206. package/dist/json.js +0 -82
  207. package/dist/json.js.map +0 -1
  208. package/dist/loops/health.d.ts +0 -17
  209. package/dist/loops/health.js +0 -152
  210. package/dist/loops/health.js.map +0 -1
  211. package/dist/loops/list.d.ts +0 -6
  212. package/dist/loops/list.js +0 -21
  213. package/dist/loops/list.js.map +0 -1
  214. package/dist/loops/policy.d.ts +0 -6
  215. package/dist/loops/policy.js +0 -41
  216. package/dist/loops/policy.js.map +0 -1
  217. package/dist/loops/render.d.ts +0 -19
  218. package/dist/loops/render.js +0 -100
  219. package/dist/loops/render.js.map +0 -1
  220. package/dist/loops/show.d.ts +0 -8
  221. package/dist/loops/show.js +0 -31
  222. package/dist/loops/show.js.map +0 -1
  223. package/dist/loops/watch.d.ts +0 -14
  224. package/dist/loops/watch.js +0 -143
  225. package/dist/loops/watch.js.map +0 -1
  226. package/dist/main.d.ts +0 -1
  227. package/dist/main.js +0 -148
  228. package/dist/main.js.map +0 -1
  229. package/dist/markdown.d.ts +0 -10
  230. package/dist/markdown.js +0 -66
  231. package/dist/markdown.js.map +0 -1
  232. package/dist/memory-render.d.ts +0 -6
  233. package/dist/memory-render.js +0 -81
  234. package/dist/memory-render.js.map +0 -1
  235. package/dist/memory.d.ts +0 -22
  236. package/dist/memory.js +0 -318
  237. package/dist/memory.js.map +0 -1
  238. package/dist/pi-adapter.d.ts +0 -1
  239. package/dist/pi-adapter.js +0 -220
  240. package/dist/pi-adapter.js.map +0 -1
  241. package/dist/profiles.d.ts +0 -12
  242. package/dist/profiles.js +0 -71
  243. package/dist/profiles.js.map +0 -1
  244. package/dist/registry/derive.d.ts +0 -8
  245. package/dist/registry/derive.js +0 -88
  246. package/dist/registry/derive.js.map +0 -1
  247. package/dist/registry/discover.d.ts +0 -20
  248. package/dist/registry/discover.js +0 -98
  249. package/dist/registry/discover.js.map +0 -1
  250. package/dist/registry/harness.d.ts +0 -7
  251. package/dist/registry/harness.js +0 -63
  252. package/dist/registry/harness.js.map +0 -1
  253. package/dist/registry/index.d.ts +0 -6
  254. package/dist/registry/index.js +0 -6
  255. package/dist/registry/index.js.map +0 -1
  256. package/dist/registry/read.d.ts +0 -11
  257. package/dist/registry/read.js +0 -50
  258. package/dist/registry/read.js.map +0 -1
  259. package/dist/registry/rebuild.d.ts +0 -5
  260. package/dist/registry/rebuild.js +0 -22
  261. package/dist/registry/rebuild.js.map +0 -1
  262. package/dist/registry/types.d.ts +0 -28
  263. package/dist/registry/types.js +0 -2
  264. package/dist/registry/types.js.map +0 -1
  265. package/dist/registry/update.d.ts +0 -2
  266. package/dist/registry/update.js +0 -7
  267. package/dist/registry/update.js.map +0 -1
  268. package/dist/tasks-render.d.ts +0 -2
  269. package/dist/tasks-render.js +0 -44
  270. package/dist/tasks-render.js.map +0 -1
  271. package/dist/tasks.d.ts +0 -24
  272. package/dist/tasks.js +0 -184
  273. package/dist/tasks.js.map +0 -1
  274. package/dist/topology.d.ts +0 -31
  275. package/dist/topology.js +0 -309
  276. package/dist/topology.js.map +0 -1
  277. package/dist/usage.d.ts +0 -9
  278. package/dist/usage.js +0 -160
  279. package/dist/usage.js.map +0 -1
  280. package/dist/utils.d.ts +0 -21
  281. package/dist/utils.js +0 -349
  282. package/dist/utils.js.map +0 -1
  283. package/dist/worktree/clean.d.ts +0 -12
  284. package/dist/worktree/clean.js +0 -113
  285. package/dist/worktree/clean.js.map +0 -1
  286. package/dist/worktree/create.d.ts +0 -14
  287. package/dist/worktree/create.js +0 -71
  288. package/dist/worktree/create.js.map +0 -1
  289. package/dist/worktree/index.d.ts +0 -10
  290. package/dist/worktree/index.js +0 -6
  291. package/dist/worktree/index.js.map +0 -1
  292. package/dist/worktree/list.d.ts +0 -9
  293. package/dist/worktree/list.js +0 -24
  294. package/dist/worktree/list.js.map +0 -1
  295. package/dist/worktree/merge.d.ts +0 -11
  296. package/dist/worktree/merge.js +0 -129
  297. package/dist/worktree/merge.js.map +0 -1
  298. package/dist/worktree/meta.d.ts +0 -17
  299. package/dist/worktree/meta.js +0 -34
  300. package/dist/worktree/meta.js.map +0 -1
  301. package/presets/autocode/README.md +0 -81
  302. package/presets/autocode/autoloops.toml +0 -30
  303. package/presets/autocode/harness.md +0 -26
  304. package/presets/autocode/miniloops.toml +0 -22
  305. package/presets/autocode/roles/build.md +0 -34
  306. package/presets/autocode/roles/critic.md +0 -40
  307. package/presets/autocode/roles/finalizer.md +0 -43
  308. package/presets/autocode/roles/planner.md +0 -40
  309. package/presets/autocode/topology.toml +0 -32
  310. package/presets/autodebug/README.md +0 -50
  311. package/presets/autodebug/autoloops.toml +0 -18
  312. package/presets/autodebug/harness.md +0 -31
  313. package/presets/autodebug/roles/fixer.md +0 -58
  314. package/presets/autodebug/roles/investigator.md +0 -52
  315. package/presets/autodebug/roles/strategist.md +0 -45
  316. package/presets/autodebug/roles/verifier.md +0 -66
  317. package/presets/autodebug/topology.toml +0 -34
  318. package/presets/autodoc/README.md +0 -42
  319. package/presets/autodoc/autoloops.toml +0 -21
  320. package/presets/autodoc/harness.md +0 -19
  321. package/presets/autodoc/miniloops.toml +0 -21
  322. package/presets/autodoc/roles/auditor.md +0 -39
  323. package/presets/autodoc/roles/checker.md +0 -43
  324. package/presets/autodoc/roles/publisher.md +0 -51
  325. package/presets/autodoc/roles/writer.md +0 -37
  326. package/presets/autodoc/topology.toml +0 -31
  327. package/presets/autofix/README.md +0 -56
  328. package/presets/autofix/autoloops.toml +0 -24
  329. package/presets/autofix/harness.md +0 -25
  330. package/presets/autofix/miniloops.toml +0 -21
  331. package/presets/autofix/roles/closer.md +0 -48
  332. package/presets/autofix/roles/diagnoser.md +0 -43
  333. package/presets/autofix/roles/fixer.md +0 -28
  334. package/presets/autofix/roles/verifier.md +0 -31
  335. package/presets/autofix/topology.toml +0 -33
  336. package/presets/autoideas/README.md +0 -73
  337. package/presets/autoideas/autoloops.toml +0 -18
  338. package/presets/autoideas/harness.md +0 -31
  339. package/presets/autoideas/miniloops.toml +0 -18
  340. package/presets/autoideas/roles/analyst.md +0 -32
  341. package/presets/autoideas/roles/reviewer.md +0 -36
  342. package/presets/autoideas/roles/scanner.md +0 -26
  343. package/presets/autoideas/roles/synthesizer.md +0 -61
  344. package/presets/autoideas/topology.toml +0 -32
  345. package/presets/automerge/README.md +0 -3
  346. package/presets/automerge/autoloops.toml +0 -12
  347. package/presets/automerge/harness.md +0 -10
  348. package/presets/automerge/miniloops.toml +0 -12
  349. package/presets/automerge/roles/merge.md +0 -10
  350. package/presets/automerge/topology.toml +0 -10
  351. package/presets/autoperf/README.md +0 -56
  352. package/presets/autoperf/autoloops.toml +0 -21
  353. package/presets/autoperf/harness.md +0 -21
  354. package/presets/autoperf/miniloops.toml +0 -21
  355. package/presets/autoperf/roles/judge.md +0 -38
  356. package/presets/autoperf/roles/measurer.md +0 -36
  357. package/presets/autoperf/roles/optimizer.md +0 -35
  358. package/presets/autoperf/roles/profiler.md +0 -38
  359. package/presets/autoperf/topology.toml +0 -32
  360. package/presets/autopr/README.md +0 -99
  361. package/presets/autopr/autoloops.toml +0 -22
  362. package/presets/autopr/harness.md +0 -27
  363. package/presets/autopr/miniloops.toml +0 -22
  364. package/presets/autopr/roles/collector.md +0 -55
  365. package/presets/autopr/roles/drafter.md +0 -38
  366. package/presets/autopr/roles/publisher.md +0 -28
  367. package/presets/autopr/roles/validator.md +0 -31
  368. package/presets/autopr/topology.toml +0 -32
  369. package/presets/autopreset/README.md +0 -35
  370. package/presets/autopreset/autoloops.toml +0 -18
  371. package/presets/autopreset/harness.md +0 -38
  372. package/presets/autopreset/roles/designer.md +0 -33
  373. package/presets/autopreset/roles/finalizer.md +0 -23
  374. package/presets/autopreset/roles/generator.md +0 -34
  375. package/presets/autopreset/roles/validator.md +0 -31
  376. package/presets/autopreset/topology.toml +0 -32
  377. package/presets/autoqa/README.md +0 -105
  378. package/presets/autoqa/autoloops.toml +0 -21
  379. package/presets/autoqa/harness.md +0 -52
  380. package/presets/autoqa/miniloops.toml +0 -21
  381. package/presets/autoqa/roles/executor.md +0 -96
  382. package/presets/autoqa/roles/inspector.md +0 -100
  383. package/presets/autoqa/roles/planner.md +0 -87
  384. package/presets/autoqa/roles/reporter.md +0 -117
  385. package/presets/autoqa/topology.toml +0 -31
  386. package/presets/autoresearch/README.md +0 -63
  387. package/presets/autoresearch/autoloops.toml +0 -18
  388. package/presets/autoresearch/harness.md +0 -28
  389. package/presets/autoresearch/miniloops.toml +0 -18
  390. package/presets/autoresearch/roles/benchmarker.md +0 -34
  391. package/presets/autoresearch/roles/evaluator.md +0 -33
  392. package/presets/autoresearch/roles/implementer.md +0 -26
  393. package/presets/autoresearch/roles/strategist.md +0 -43
  394. package/presets/autoresearch/topology.toml +0 -31
  395. package/presets/autoreview/README.md +0 -51
  396. package/presets/autoreview/autoloops.toml +0 -21
  397. package/presets/autoreview/harness.md +0 -20
  398. package/presets/autoreview/miniloops.toml +0 -21
  399. package/presets/autoreview/roles/checker.md +0 -36
  400. package/presets/autoreview/roles/reader.md +0 -33
  401. package/presets/autoreview/roles/suggester.md +0 -26
  402. package/presets/autoreview/roles/summarizer.md +0 -57
  403. package/presets/autoreview/topology.toml +0 -31
  404. package/presets/autosec/README.md +0 -51
  405. package/presets/autosec/autoloops.toml +0 -21
  406. package/presets/autosec/harness.md +0 -20
  407. package/presets/autosec/miniloops.toml +0 -21
  408. package/presets/autosec/roles/analyst.md +0 -38
  409. package/presets/autosec/roles/hardener.md +0 -36
  410. package/presets/autosec/roles/reporter.md +0 -63
  411. package/presets/autosec/roles/scanner.md +0 -38
  412. package/presets/autosec/topology.toml +0 -31
  413. package/presets/autosimplify/README.md +0 -83
  414. package/presets/autosimplify/autoloops.toml +0 -26
  415. package/presets/autosimplify/harness.md +0 -25
  416. package/presets/autosimplify/miniloops.toml +0 -22
  417. package/presets/autosimplify/roles/reviewer.md +0 -38
  418. package/presets/autosimplify/roles/scoper.md +0 -42
  419. package/presets/autosimplify/roles/simplifier.md +0 -51
  420. package/presets/autosimplify/roles/verifier.md +0 -40
  421. package/presets/autosimplify/topology.toml +0 -32
  422. package/presets/autospec/README.md +0 -84
  423. package/presets/autospec/autoloops.toml +0 -21
  424. package/presets/autospec/harness.md +0 -23
  425. package/presets/autospec/miniloops.toml +0 -21
  426. package/presets/autospec/roles/clarifier.md +0 -39
  427. package/presets/autospec/roles/critic.md +0 -41
  428. package/presets/autospec/roles/designer.md +0 -37
  429. package/presets/autospec/roles/planner.md +0 -38
  430. package/presets/autospec/roles/researcher.md +0 -33
  431. package/presets/autospec/topology.toml +0 -38
  432. package/presets/autotest/README.md +0 -55
  433. package/presets/autotest/autoloops.toml +0 -21
  434. package/presets/autotest/harness.md +0 -21
  435. package/presets/autotest/miniloops.toml +0 -21
  436. package/presets/autotest/roles/assessor.md +0 -57
  437. package/presets/autotest/roles/runner.md +0 -31
  438. package/presets/autotest/roles/surveyor.md +0 -39
  439. package/presets/autotest/roles/writer.md +0 -37
  440. package/presets/autotest/topology.toml +0 -32
package/README.md CHANGED
@@ -7,10 +7,36 @@ It’s a simpler, more opinionated loop harness for long-running agent work: ins
7
7
  It’s early and still evolving. autoloop is not a replacement for ralph-orchestrator — it’s a cleaner path for exploring a simpler UX without breaking Ralph.
8
8
 
9
9
  [![npm version](https://img.shields.io/npm/v/@mobrienv/autoloop)](https://www.npmjs.com/package/@mobrienv/autoloop)
10
+ [![docs](https://img.shields.io/badge/docs-live-blue)](https://mikeyobrien.github.io/autoloop/)
10
11
  [![Node.js](https://img.shields.io/badge/node-%3E%3D18-brightgreen)](https://nodejs.org/)
11
12
 
13
+ **[Read the docs →](https://mikeyobrien.github.io/autoloop/)**
14
+
12
15
  [![autoloop hero showing the CLI surface and local dashboard](docs/launches/autoloop-readme-hero.png)](docs/launches/autoloop-hybrid-launch-video-x.mp4)
13
16
 
17
+ ## Use as a library
18
+
19
+ As of `0.5.0-sdk.0`, autoloop ships an embed-able runtime alongside the CLI. Pass an `AbortSignal` for cancellation and an `onEvent` callback to consume the structured event stream — no terminal output is produced unless you ask for it.
20
+
21
+ ```ts
22
+ import { run, type LoopEvent } from "@mobrienv/autoloop";
23
+
24
+ const controller = new AbortController();
25
+ setTimeout(() => controller.abort(), 60_000);
26
+
27
+ const summary = await run("./my-project", "build the login page", "autoloop", {
28
+ signal: controller.signal,
29
+ onEvent: (event: LoopEvent) => {
30
+ if (event.type === "iteration.start") console.log(`iter ${event.iteration}`);
31
+ if (event.type === "loop.finish") console.log(`done: ${event.stopReason}`);
32
+ },
33
+ });
34
+
35
+ console.log(summary); // { iterations, stopReason, runId }
36
+ ```
37
+
38
+ The CLI entry (`bin/autoloop`) is still the primary interface; the library export is for agent frameworks and dashboards that want to drive loops in-process.
39
+
14
40
  ## Why autoloop exists
15
41
 
16
42
  ralph-orchestrator grew to include a lot of different experiments and ways of doing things. autoloop spins out a narrower set of ideas into something simpler and more opinionated.
@@ -196,7 +222,7 @@ Bundled presets give you opinionated starting points for common workflows like c
196
222
 
197
223
  ## Creating custom presets
198
224
 
199
- A preset is a directory containing `autoloops.toml`, `topology.toml`, `harness.md`, and a `roles/` folder. See [Creating presets](docs/creating-presets.md) for the full guide, or examine any `presets/<name>/` directory as a working example.
225
+ A preset is a directory containing `autoloops.toml`, `topology.toml`, `harness.md`, and a `roles/` folder. See [Creating presets](https://mikeyobrien.github.io/autoloop/guides/creating-presets) for the full guide, or examine any `presets/<name>/` directory as a working example.
200
226
 
201
227
  Some older or internal layouts may still include `miniloops.toml`, but `autoloops.toml` is the canonical entry point for new presets.
202
228
 
@@ -253,22 +279,22 @@ export MOCK_FIXTURE_PATH=test/fixtures/backend/complete-success.json
253
279
  node bin/autoloop run . -b "node dist/testing/mock-backend.js"
254
280
  ```
255
281
 
256
- See [CLI reference](docs/cli.md#mock-backend) for fixture schema and bundled scenarios.
282
+ See [CLI reference](https://mikeyobrien.github.io/autoloop/reference/cli#mock-backend) for fixture schema and bundled scenarios.
257
283
 
258
284
  ## Further reading
259
285
 
260
- - [Platform architecture](docs/platform.md)
261
- - [Configuration reference](docs/configuration.md)
262
- - [Creating presets](docs/creating-presets.md)
263
- - [Topology and event routing](docs/topology.md)
264
- - [Memory system](docs/memory.md)
265
- - [Dynamic chains](docs/dynamic-chains.md)
266
- - [CLI reference](docs/cli.md)
267
- - [Dashboard](docs/dashboard.md)
268
- - [Profiles](docs/profiles.md)
269
- - [Tasks](docs/tasks.md)
270
- - [Worktree isolation](docs/worktree.md)
271
- - [Releasing](docs/releasing.md)
286
+ - [Platform architecture](https://mikeyobrien.github.io/autoloop/concepts/platform)
287
+ - [Configuration reference](https://mikeyobrien.github.io/autoloop/reference/configuration)
288
+ - [Creating presets](https://mikeyobrien.github.io/autoloop/guides/creating-presets)
289
+ - [Topology and event routing](https://mikeyobrien.github.io/autoloop/reference/topology)
290
+ - [Memory system](https://mikeyobrien.github.io/autoloop/reference/memory)
291
+ - [Dynamic chains](https://mikeyobrien.github.io/autoloop/features/dynamic-chains)
292
+ - [CLI reference](https://mikeyobrien.github.io/autoloop/reference/cli)
293
+ - [Dashboard](https://mikeyobrien.github.io/autoloop/features/dashboard)
294
+ - [Profiles](https://mikeyobrien.github.io/autoloop/features/profiles)
295
+ - [Tasks](https://mikeyobrien.github.io/autoloop/features/tasks)
296
+ - [Worktree isolation](https://mikeyobrien.github.io/autoloop/features/worktree)
297
+ - [Releasing](https://mikeyobrien.github.io/autoloop/development/releasing)
272
298
 
273
299
  ## Contributing
274
300
 
package/bin/autoloop CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import('../dist/main.js');
2
+ import('@mobrienv/autoloop-cli');
@@ -0,0 +1,6 @@
1
+ export { loadProject as loadProjectConfig } from "@mobrienv/autoloop-core/config";
2
+ export { type Config, defaults as configDefaults, get as configGet, getInt as configGetInt, getList as configGetList, type LayeredConfig, parseToml as parseConfigToml, } from "@mobrienv/autoloop-core/config-schema";
3
+ export { emit, run, runParallelBranchCli } from "@mobrienv/autoloop-harness";
4
+ export type { EmitResult } from "@mobrienv/autoloop-harness/emit";
5
+ export type { LoopEvent, LoopEventEmitter, } from "@mobrienv/autoloop-harness/events";
6
+ export type { LoopContext, RunOptions, RunSummary, TriggerSource, Verdict, VerdictKind, } from "@mobrienv/autoloop-harness/types";
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ // Public SDK entry point for @mobrienv/autoloop.
2
+ //
3
+ // This module re-exports the minimal surface SDK consumers need to embed
4
+ // autoloop in their own code. It is deliberately narrow; everything else
5
+ // (CLI render helpers, preset resolution, dashboard, etc.) stays internal.
6
+ //
7
+ // Usage:
8
+ // import { run, type LoopEvent } from "@mobrienv/autoloop";
9
+ //
10
+ // const summary = await run(projectDir, prompt, "autoloop", {
11
+ // signal: controller.signal,
12
+ // onEvent: (e: LoopEvent) => console.log(e.type),
13
+ // });
14
+ export { loadProject as loadProjectConfig } from "@mobrienv/autoloop-core/config";
15
+ // Pure config helpers, for consumers who want to inspect merged config
16
+ // without re-implementing the schema layer.
17
+ export { defaults as configDefaults, get as configGet, getInt as configGetInt, getList as configGetList, parseToml as parseConfigToml, } from "@mobrienv/autoloop-core/config-schema";
18
+ export { emit, run, runParallelBranchCli } from "@mobrienv/autoloop-harness";
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,EAAE;AACF,yEAAyE;AACzE,yEAAyE;AACzE,2EAA2E;AAC3E,EAAE;AACF,SAAS;AACT,8DAA8D;AAC9D,EAAE;AACF,gEAAgE;AAChE,iCAAiC;AACjC,sDAAsD;AACtD,QAAQ;AAER,OAAO,EAAE,WAAW,IAAI,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAClF,uEAAuE;AACvE,4CAA4C;AAC5C,OAAO,EAEL,QAAQ,IAAI,cAAc,EAC1B,GAAG,IAAI,SAAS,EAChB,MAAM,IAAI,YAAY,EACtB,OAAO,IAAI,aAAa,EAExB,SAAS,IAAI,eAAe,GAC7B,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -10,8 +10,7 @@
10
10
  */
11
11
  import { execFileSync } from "node:child_process";
12
12
  import { readFileSync } from "node:fs";
13
- import { dirname, resolve } from "node:path";
14
- import { fileURLToPath } from "node:url";
13
+ import { createRequire } from "node:module";
15
14
  function fixturePathFromArgs() {
16
15
  return process.argv[2] ?? "";
17
16
  }
@@ -38,9 +37,8 @@ function loadFixture() {
38
37
  }
39
38
  }
40
39
  function emitEvent(event, payload) {
41
- const currentFile = fileURLToPath(import.meta.url);
42
- const distDir = dirname(dirname(currentFile));
43
- const mainEntry = resolve(distDir, "main.js");
40
+ const require = createRequire(import.meta.url);
41
+ const mainEntry = require.resolve("@mobrienv/autoloop-cli");
44
42
  try {
45
43
  execFileSync(process.execPath, [mainEntry, "emit", event, payload], {
46
44
  encoding: "utf-8",
@@ -1 +1 @@
1
- {"version":3,"file":"mock-backend.js","sourceRoot":"","sources":["../../src/testing/mock-backend.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mock-backend.js","sourceRoot":"","sources":["../../src/testing/mock-backend.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,9 +1,17 @@
1
1
  {
2
2
  "name": "@mobrienv/autoloop",
3
- "version": "0.4.0",
3
+ "version": "0.7.0",
4
4
  "description": "Simpler, opinionated loop harness for inspectable long-running agent workflows",
5
5
  "type": "module",
6
- "main": "dist/main.js",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ },
13
+ "./package.json": "./package.json"
14
+ },
7
15
  "bin": {
8
16
  "autoloop": "bin/autoloop"
9
17
  },
@@ -11,27 +19,19 @@
11
19
  "bin/autoloop",
12
20
  "dist",
13
21
  "plugins/autoloop",
14
- "presets/autocode",
15
- "presets/autodebug",
16
- "presets/autodoc",
17
- "presets/autofix",
18
- "presets/autoideas",
19
- "presets/automerge",
20
- "presets/autoperf",
21
- "presets/autopr",
22
- "presets/autopreset",
23
- "presets/autoqa",
24
- "presets/autoresearch",
25
- "presets/autoreview",
26
- "presets/autosec",
27
- "presets/autosimplify",
28
- "presets/autospec",
29
- "presets/autotest",
30
22
  "README.md"
31
23
  ],
32
24
  "engines": {
33
25
  "node": ">=18"
34
26
  },
27
+ "workspaces": [
28
+ "packages/core",
29
+ "packages/presets",
30
+ "packages/backends",
31
+ "packages/harness",
32
+ "packages/dashboard",
33
+ "packages/cli"
34
+ ],
35
35
  "repository": {
36
36
  "type": "git",
37
37
  "url": "git+https://github.com/mikeyobrien/autoloop.git"
@@ -53,7 +53,8 @@
53
53
  "provenance": true
54
54
  },
55
55
  "scripts": {
56
- "build": "tsc",
56
+ "build": "npm run build --workspaces && tsc",
57
+ "build:root": "tsc",
57
58
  "lint": "biome check src/ test/",
58
59
  "lint:fix": "biome check --write src/ test/",
59
60
  "format": "biome format src/ test/",
@@ -62,6 +63,10 @@
62
63
  "test:coverage": "node --experimental-vm-modules node_modules/.bin/vitest run --coverage",
63
64
  "test:watch": "node --experimental-vm-modules node_modules/.bin/vitest",
64
65
  "check": "biome check src/ test/ && tsc --noEmit && npm run test:coverage",
66
+ "release": "node bin/release",
67
+ "docs:dev": "vitepress dev docs",
68
+ "docs:build": "vitepress build docs",
69
+ "docs:preview": "vitepress preview docs",
65
70
  "prepare": "husky",
66
71
  "version": "node -e \"const p=require('./plugins/autoloop/.claude-plugin/plugin.json');p.version=require('./package.json').version;require('fs').writeFileSync('./plugins/autoloop/.claude-plugin/plugin.json',JSON.stringify(p,null,2)+'\\n')\" && git add plugins/autoloop/.claude-plugin/plugin.json"
67
72
  },
@@ -78,12 +83,14 @@
78
83
  "lint-staged": "^16.4.0",
79
84
  "playwright": "^1.59.1",
80
85
  "typescript": "^5.9.3",
86
+ "vitepress": "^1.6.4",
87
+ "vitepress-plugin-llmstxt": "^0.5.1",
81
88
  "vitest": "^3.0.0"
82
89
  },
83
90
  "dependencies": {
84
- "@agentclientprotocol/sdk": "^0.18.0",
85
- "@hono/node-server": "^1.19.12",
86
- "@iarna/toml": "^2.2.5",
87
- "hono": "^4.12.10"
91
+ "@mobrienv/autoloop-cli": "0.7.0",
92
+ "@mobrienv/autoloop-core": "0.7.0",
93
+ "@mobrienv/autoloop-harness": "0.7.0",
94
+ "@mobrienv/autoloop-presets": "0.7.0"
88
95
  }
89
96
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "autoloop",
3
- "version": "0.4.0",
3
+ "version": "0.7.0",
4
4
  "description": "Run and operate autoloops — start runs, monitor progress, inject guidance, manage worktrees, inspect artifacts, and clean up.",
5
5
  "homepage": "https://github.com/mikeyobrien/autoloop-ts",
6
6
  "repository": "https://github.com/mikeyobrien/autoloop-ts",
@@ -1,10 +0,0 @@
1
- export interface AgentMap {
2
- globalDefault: string;
3
- presets: Record<string, PresetAgentMap>;
4
- }
5
- export interface PresetAgentMap {
6
- defaultAgent: string;
7
- roles: Record<string, string>;
8
- }
9
- export declare function loadAgentMap(projectDir: string): AgentMap | null;
10
- export declare function resolveRoleAgent(agentMap: AgentMap | null, presetName: string, roleId: string): string | undefined;
package/dist/agent-map.js DELETED
@@ -1,58 +0,0 @@
1
- /**
2
- * Loads and resolves per-role agent mappings from agents.toml.
3
- *
4
- * Resolution order:
5
- * 1. preset.<name>.<role> (role-specific)
6
- * 2. preset.<name>.default (preset default)
7
- * 3. defaults.agent (global fallback)
8
- * 4. undefined (caller falls back to backend.agent)
9
- */
10
- import { existsSync, readFileSync } from "node:fs";
11
- import { join } from "node:path";
12
- import TOML from "@iarna/toml";
13
- export function loadAgentMap(projectDir) {
14
- const path = join(projectDir, "agents.toml");
15
- if (!existsSync(path))
16
- return null;
17
- const text = readFileSync(path, "utf-8");
18
- const parsed = TOML.parse(text);
19
- return buildAgentMap(parsed);
20
- }
21
- export function resolveRoleAgent(agentMap, presetName, roleId) {
22
- if (!agentMap)
23
- return undefined;
24
- const preset = agentMap.presets[presetName];
25
- if (preset) {
26
- const roleAgent = preset.roles[roleId];
27
- if (roleAgent)
28
- return roleAgent;
29
- if (preset.defaultAgent)
30
- return preset.defaultAgent;
31
- }
32
- return agentMap.globalDefault || undefined;
33
- }
34
- function buildAgentMap(parsed) {
35
- const defaults = parsed["defaults"];
36
- const globalDefault = typeof defaults?.["agent"] === "string" ? defaults["agent"] : "";
37
- const presets = {};
38
- const presetSection = parsed["preset"];
39
- if (presetSection) {
40
- for (const [name, value] of Object.entries(presetSection)) {
41
- if (typeof value === "object" && value !== null) {
42
- presets[name] = buildPresetAgentMap(value);
43
- }
44
- }
45
- }
46
- return { globalDefault, presets };
47
- }
48
- function buildPresetAgentMap(section) {
49
- const defaultAgent = typeof section["default"] === "string" ? section["default"] : "";
50
- const roles = {};
51
- for (const [key, value] of Object.entries(section)) {
52
- if (key !== "default" && typeof value === "string") {
53
- roles[key] = value;
54
- }
55
- }
56
- return { defaultAgent, roles };
57
- }
58
- //# sourceMappingURL=agent-map.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent-map.js","sourceRoot":"","sources":["../src/agent-map.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,IAAI,MAAM,aAAa,CAAC;AAY/B,MAAM,UAAU,YAAY,CAAC,UAAkB;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;IAC3D,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,QAAyB,EACzB,UAAkB,EAClB,MAAc;IAEd,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAEhC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,SAAS;YAAE,OAAO,SAAS,CAAC;QAChC,IAAI,MAAM,CAAC,YAAY;YAAE,OAAO,MAAM,CAAC,YAAY,CAAC;IACtD,CAAC;IAED,OAAO,QAAQ,CAAC,aAAa,IAAI,SAAS,CAAC;AAC7C,CAAC;AAED,SAAS,aAAa,CAAC,MAA+B;IACpD,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAwC,CAAC;IAC3E,MAAM,aAAa,GACjB,OAAO,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnE,MAAM,OAAO,GAAmC,EAAE,CAAC;IACnD,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAwC,CAAC;IAC9E,IAAI,aAAa,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;YAC1D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAChD,OAAO,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,KAAgC,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAgC;IAC3D,MAAM,YAAY,GAChB,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnD,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;AACjC,CAAC"}
@@ -1,38 +0,0 @@
1
- import { type ChildProcess } from "node:child_process";
2
- import * as acp from "@agentclientprotocol/sdk";
3
- export interface AcpClientOptions {
4
- command: string;
5
- args: string[];
6
- cwd: string;
7
- trustAllTools: boolean;
8
- agentName?: string;
9
- modelId?: string;
10
- verbose?: boolean;
11
- }
12
- export interface AcpSession {
13
- sessionId: string;
14
- connection: acp.ClientSideConnection;
15
- process: ChildProcess;
16
- textBuffer: string;
17
- stderrBuffer: string;
18
- options: AcpClientOptions;
19
- /** Resolves when the child process exits — used to race against hanging prompts */
20
- closed: Promise<{
21
- code: number | null;
22
- signal: string | null;
23
- }>;
24
- }
25
- export interface AcpPromptResult {
26
- output: string;
27
- stopReason: acp.StopReason;
28
- timedOut: boolean;
29
- error?: string;
30
- }
31
- /**
32
- * Format an ACP SessionUpdate for verbose stderr output.
33
- * Returns null for event types that should be silenced.
34
- */
35
- export declare function formatStreamingUpdate(update: acp.SessionUpdate): string | null;
36
- export declare function initAcpSession(opts: AcpClientOptions): Promise<AcpSession>;
37
- export declare function sendAcpPrompt(session: AcpSession, prompt: string, timeoutMs: number): Promise<AcpPromptResult>;
38
- export declare function terminateAcpSession(session: AcpSession): Promise<void>;
@@ -1,293 +0,0 @@
1
- import { spawn } from "node:child_process";
2
- import * as acp from "@agentclientprotocol/sdk";
3
- /**
4
- * Format an ACP SessionUpdate for verbose stderr output.
5
- * Returns null for event types that should be silenced.
6
- */
7
- export function formatStreamingUpdate(update) {
8
- switch (update.sessionUpdate) {
9
- case "agent_message_chunk":
10
- return update.content?.type === "text" ? update.content.text : null;
11
- case "agent_thought_chunk":
12
- return update.content?.type === "text"
13
- ? `[thinking] ${update.content.text}\n`
14
- : null;
15
- case "tool_call":
16
- return `[tool:${update.kind ?? "other"}] ${update.title}\n`;
17
- case "tool_call_update":
18
- if (update.status === "completed")
19
- return `[tool:✓] ${update.title ?? ""}\n`;
20
- if (update.status === "failed")
21
- return `[tool:✗] ${update.title ?? ""}\n`;
22
- return null;
23
- default:
24
- return null;
25
- }
26
- }
27
- export async function initAcpSession(opts) {
28
- const child = spawn(opts.command, opts.args, {
29
- stdio: ["pipe", "pipe", "pipe"],
30
- cwd: opts.cwd,
31
- env: process.env,
32
- detached: true, // create own process group so process.kill(-pid) in terminateAcpSession kills the full tree
33
- });
34
- if (!child.stdout || !child.stdin) {
35
- throw new Error("Failed to create ACP process stdio streams");
36
- }
37
- const session = {
38
- sessionId: "",
39
- connection: null,
40
- process: child,
41
- textBuffer: "",
42
- stderrBuffer: "",
43
- options: opts,
44
- closed: null,
45
- };
46
- // Buffer stderr for diagnostics
47
- if (child.stderr) {
48
- child.stderr.on("data", (chunk) => {
49
- session.stderrBuffer += chunk.toString();
50
- });
51
- }
52
- // Track process exit so hanging prompts can bail out
53
- session.closed = new Promise((resolve) => {
54
- child.on("close", (code, signal) => resolve({ code, signal }));
55
- });
56
- // Build transport: manual NDJSON parsing on stdout (more reliable), SDK serialization on stdin
57
- const stdin = child.stdin;
58
- const stdout = child.stdout;
59
- const writable = new WritableStream({
60
- async write(chunk) {
61
- if (stdin.destroyed || stdin.writableEnded)
62
- return;
63
- return new Promise((resolve, reject) => {
64
- stdin.write(chunk, (err) => (err ? reject(err) : resolve()));
65
- });
66
- },
67
- close() {
68
- stdin.end();
69
- },
70
- abort(reason) {
71
- stdin.destroy(reason instanceof Error ? reason : new Error(String(reason)));
72
- },
73
- });
74
- let buffer = "";
75
- const decoder = new TextDecoder();
76
- let msgController;
77
- const parsedMessages = new ReadableStream({
78
- start(controller) {
79
- msgController = controller;
80
- },
81
- cancel() {
82
- stdout.destroy();
83
- },
84
- });
85
- stdout.on("data", (chunk) => {
86
- buffer += decoder.decode(chunk, { stream: true });
87
- const lines = buffer.split("\n");
88
- buffer = lines.pop() || "";
89
- for (const line of lines) {
90
- const trimmed = line.trim();
91
- if (trimmed) {
92
- try {
93
- const msg = JSON.parse(trimmed);
94
- // Filter kiro-cli private notifications — the ACP SDK doesn't know about
95
- // _kiro.dev/* methods and responds with -32601 "Method not found".
96
- // These are private kiro-cli extensions the ACP SDK does not handle.
97
- if (msg.method &&
98
- typeof msg.method === "string" &&
99
- msg.method.startsWith("_kiro.dev/")) {
100
- continue;
101
- }
102
- msgController.enqueue(msg);
103
- }
104
- catch {
105
- /* skip malformed */
106
- }
107
- }
108
- }
109
- });
110
- stdout.on("end", () => {
111
- if (buffer.trim()) {
112
- try {
113
- msgController.enqueue(JSON.parse(buffer.trim()));
114
- }
115
- catch {
116
- /* skip */
117
- }
118
- }
119
- msgController.close();
120
- });
121
- stdout.on("error", (err) => {
122
- msgController.error(err);
123
- });
124
- // Use ndJsonStream only for writable serialization; readable is our manual parser
125
- const dummyReadable = new ReadableStream({ start() { } });
126
- const ndJson = acp.ndJsonStream(writable, dummyReadable);
127
- const stream = {
128
- readable: parsedMessages,
129
- writable: ndJson.writable,
130
- };
131
- const client = {
132
- async requestPermission(params) {
133
- if (opts.trustAllTools && params.options?.length) {
134
- const allow = params.options.find((o) => o.kind === "allow_always") ??
135
- params.options.find((o) => o.kind === "allow_once");
136
- if (allow)
137
- return { outcome: { outcome: "selected", optionId: allow.optionId } };
138
- }
139
- return { outcome: { outcome: "cancelled" } };
140
- },
141
- async sessionUpdate(params) {
142
- const { update } = params;
143
- if (!update)
144
- return;
145
- if (update.sessionUpdate === "agent_message_chunk" &&
146
- update.content?.type === "text") {
147
- session.textBuffer += update.content.text;
148
- }
149
- if (opts.verbose) {
150
- const line = formatStreamingUpdate(update);
151
- if (line)
152
- process.stderr.write(line);
153
- }
154
- },
155
- };
156
- session.connection = new acp.ClientSideConnection(() => client, stream);
157
- // Initialize
158
- await session.connection.initialize({
159
- protocolVersion: acp.PROTOCOL_VERSION,
160
- clientCapabilities: {},
161
- clientInfo: { name: "autoloop", version: "0.1.0" },
162
- });
163
- // Create session
164
- const result = await session.connection.newSession({
165
- cwd: opts.cwd,
166
- mcpServers: [],
167
- });
168
- session.sessionId = result.sessionId;
169
- // Optionally set mode/model
170
- if (opts.agentName) {
171
- await session.connection.setSessionMode({
172
- sessionId: session.sessionId,
173
- modeId: opts.agentName,
174
- });
175
- }
176
- if (opts.modelId) {
177
- await session.connection.unstable_setSessionModel({
178
- sessionId: session.sessionId,
179
- modelId: opts.modelId,
180
- });
181
- }
182
- return session;
183
- }
184
- export async function sendAcpPrompt(session, prompt, timeoutMs) {
185
- session.textBuffer = "";
186
- // Retry with backoff if agent isn't idle yet
187
- const maxAttempts = 3;
188
- for (let attempt = 1; attempt <= maxAttempts; attempt++) {
189
- try {
190
- return await sendAcpPromptOnce(session, prompt, timeoutMs);
191
- }
192
- catch (err) {
193
- if (err.message?.includes("not idle") && attempt < maxAttempts) {
194
- await new Promise((r) => setTimeout(r, attempt * 2000));
195
- continue;
196
- }
197
- throw err;
198
- }
199
- }
200
- // unreachable, but satisfies TS
201
- return {
202
- output: session.textBuffer,
203
- stopReason: "end_turn",
204
- timedOut: false,
205
- error: "retry exhausted",
206
- };
207
- }
208
- async function sendAcpPromptOnce(session, prompt, timeoutMs) {
209
- session.textBuffer = "";
210
- let timedOut = false;
211
- let timer;
212
- const timeoutPromise = new Promise((_resolve, reject) => {
213
- timer = setTimeout(() => {
214
- timedOut = true;
215
- session.connection.cancel({ sessionId: session.sessionId });
216
- reject(new Error("ACP prompt timed out"));
217
- }, timeoutMs);
218
- });
219
- // Detect process crash mid-prompt
220
- const crashPromise = session.closed.then(({ code, signal }) => {
221
- const stderr = session.stderrBuffer.trim();
222
- const detail = stderr ? `\n${stderr}` : "";
223
- throw new Error(`kiro-cli exited unexpectedly: code=${code} signal=${signal}${detail}`);
224
- });
225
- try {
226
- const response = await Promise.race([
227
- session.connection.prompt({
228
- sessionId: session.sessionId,
229
- prompt: [{ type: "text", text: prompt }],
230
- }),
231
- timeoutPromise,
232
- crashPromise,
233
- ]);
234
- clearTimeout(timer);
235
- return {
236
- output: session.textBuffer,
237
- stopReason: response.stopReason,
238
- timedOut: false,
239
- };
240
- }
241
- catch (err) {
242
- clearTimeout(timer);
243
- if (timedOut) {
244
- return {
245
- output: session.textBuffer,
246
- stopReason: "cancelled",
247
- timedOut: true,
248
- };
249
- }
250
- return {
251
- output: session.textBuffer,
252
- stopReason: "end_turn",
253
- timedOut: false,
254
- error: String(err),
255
- };
256
- }
257
- }
258
- export async function terminateAcpSession(session) {
259
- const child = session.process;
260
- if (!child.pid || child.killed)
261
- return;
262
- // Cancel any in-flight turn before killing
263
- try {
264
- session.connection.cancel({ sessionId: session.sessionId });
265
- }
266
- catch {
267
- /* may not have a session */
268
- }
269
- // Kill the entire process tree — MCP servers run in their own process groups
270
- // and won't die from just killing the parent.
271
- const pid = child.pid;
272
- try {
273
- process.kill(-pid, "SIGTERM");
274
- }
275
- catch {
276
- /* process group may not exist */
277
- }
278
- child.kill("SIGTERM");
279
- const exited = await Promise.race([
280
- new Promise((resolve) => child.on("exit", () => resolve(true))),
281
- new Promise((resolve) => setTimeout(() => resolve(false), 3000)),
282
- ]);
283
- if (!exited && !child.killed) {
284
- try {
285
- process.kill(-pid, "SIGKILL");
286
- }
287
- catch {
288
- /* already dead */
289
- }
290
- child.kill("SIGKILL");
291
- }
292
- }
293
- //# sourceMappingURL=acp-client.js.map