smol-symphony 0.2.0 → 0.3.1

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 (540) hide show
  1. package/AGENTS.md +41 -22
  2. package/DESIGN.md +494 -273
  3. package/README.md +109 -57
  4. package/SPEC.md +33 -24
  5. package/WORKFLOW.minimal.yaml +34 -0
  6. package/{WORKFLOW.template.md → WORKFLOW.template.yaml} +409 -256
  7. package/WORKFLOW.yaml +487 -0
  8. package/assets/skills/symphony-issues/SKILL.md +136 -0
  9. package/assets/symphony-mise.system.toml +68 -0
  10. package/dist/bin/symphony.js +22 -786
  11. package/dist/bin/symphony.js.map +1 -1
  12. package/dist/core/actions/context.js +109 -0
  13. package/dist/core/actions/context.js.map +1 -0
  14. package/dist/{actions/parsing.js → core/actions/parse.js} +33 -114
  15. package/dist/core/actions/parse.js.map +1 -0
  16. package/dist/core/actions/plan.js +197 -0
  17. package/dist/core/actions/plan.js.map +1 -0
  18. package/dist/core/actions/predicates.js +111 -0
  19. package/dist/core/actions/predicates.js.map +1 -0
  20. package/dist/core/actions/run-fold.js +248 -0
  21. package/dist/core/actions/run-fold.js.map +1 -0
  22. package/dist/core/actions/template.js +118 -0
  23. package/dist/core/actions/template.js.map +1 -0
  24. package/dist/core/cli/args.js +116 -0
  25. package/dist/core/cli/args.js.map +1 -0
  26. package/dist/core/coerce.js +75 -0
  27. package/dist/core/coerce.js.map +1 -0
  28. package/dist/core/credential/account-id.js +20 -0
  29. package/dist/core/credential/account-id.js.map +1 -0
  30. package/dist/core/credential/adapter-config.js +136 -0
  31. package/dist/core/credential/adapter-config.js.map +1 -0
  32. package/dist/core/credential/availability.js +98 -0
  33. package/dist/core/credential/availability.js.map +1 -0
  34. package/dist/core/credential/extract.js +228 -0
  35. package/dist/core/credential/extract.js.map +1 -0
  36. package/dist/core/credential/fake-creds.js +171 -0
  37. package/dist/core/credential/fake-creds.js.map +1 -0
  38. package/dist/core/credential/identity.js +125 -0
  39. package/dist/core/credential/identity.js.map +1 -0
  40. package/dist/core/credential/shape.js +230 -0
  41. package/dist/core/credential/shape.js.map +1 -0
  42. package/dist/core/credential/strings.js +15 -0
  43. package/dist/core/credential/strings.js.map +1 -0
  44. package/dist/core/doctor/checks.js +303 -0
  45. package/dist/core/doctor/checks.js.map +1 -0
  46. package/dist/core/git/result.js +107 -0
  47. package/dist/core/git/result.js.map +1 -0
  48. package/dist/core/http/decisions.js +225 -0
  49. package/dist/core/http/decisions.js.map +1 -0
  50. package/dist/{http.js → core/http/render.js} +472 -738
  51. package/dist/core/http/render.js.map +1 -0
  52. package/dist/{http-handlers.js → core/http/routes.js} +52 -87
  53. package/dist/core/http/routes.js.map +1 -0
  54. package/dist/core/http/views.js +181 -0
  55. package/dist/core/http/views.js.map +1 -0
  56. package/dist/core/image/managed-image.js +95 -0
  57. package/dist/core/image/managed-image.js.map +1 -0
  58. package/dist/core/issue/file.js +149 -0
  59. package/dist/core/issue/file.js.map +1 -0
  60. package/dist/core/issue/parse.js +210 -0
  61. package/dist/core/issue/parse.js.map +1 -0
  62. package/dist/core/mcp/dispatch.js +239 -0
  63. package/dist/core/mcp/dispatch.js.map +1 -0
  64. package/dist/core/mcp/post-move.js +92 -0
  65. package/dist/core/mcp/post-move.js.map +1 -0
  66. package/dist/core/mcp/protocol.js +293 -0
  67. package/dist/core/mcp/protocol.js.map +1 -0
  68. package/dist/core/mcp/url.js +162 -0
  69. package/dist/core/mcp/url.js.map +1 -0
  70. package/dist/core/path.js +63 -0
  71. package/dist/core/path.js.map +1 -0
  72. package/dist/core/reconcile/image-decide.js +48 -0
  73. package/dist/core/reconcile/image-decide.js.map +1 -0
  74. package/dist/core/reconcile/ledger.js +142 -0
  75. package/dist/core/reconcile/ledger.js.map +1 -0
  76. package/dist/core/reconcile/pr-classify.js +62 -0
  77. package/dist/core/reconcile/pr-classify.js.map +1 -0
  78. package/dist/{reconciler → core/reconcile}/pr-decide.js +25 -12
  79. package/dist/core/reconcile/pr-decide.js.map +1 -0
  80. package/dist/core/reconcile/pr-loop.js +161 -0
  81. package/dist/core/reconcile/pr-loop.js.map +1 -0
  82. package/dist/core/reconcile/pr-notes.js +35 -0
  83. package/dist/core/reconcile/pr-notes.js.map +1 -0
  84. package/dist/core/reconcile/vm-decide.js +70 -0
  85. package/dist/core/reconcile/vm-decide.js.map +1 -0
  86. package/dist/core/reconcile/vm-reap.js +207 -0
  87. package/dist/core/reconcile/vm-reap.js.map +1 -0
  88. package/dist/core/reconcile/workspace-decide.js +162 -0
  89. package/dist/core/reconcile/workspace-decide.js.map +1 -0
  90. package/dist/core/runlog/summary.js +231 -0
  91. package/dist/core/runlog/summary.js.map +1 -0
  92. package/dist/core/runner/dispatch-config.js +95 -0
  93. package/dist/core/runner/dispatch-config.js.map +1 -0
  94. package/dist/core/runner/injection.js +61 -0
  95. package/dist/core/runner/injection.js.map +1 -0
  96. package/dist/core/runner/mise.js +210 -0
  97. package/dist/core/runner/mise.js.map +1 -0
  98. package/dist/core/runner/prompt.js +720 -0
  99. package/dist/core/runner/prompt.js.map +1 -0
  100. package/dist/core/runner/turn.js +242 -0
  101. package/dist/core/runner/turn.js.map +1 -0
  102. package/dist/core/runner/vm-plan.js +390 -0
  103. package/dist/core/runner/vm-plan.js.map +1 -0
  104. package/dist/core/schedule/admission.js +123 -0
  105. package/dist/core/schedule/admission.js.map +1 -0
  106. package/dist/core/schedule/circuit-breaker.js +111 -0
  107. package/dist/core/schedule/circuit-breaker.js.map +1 -0
  108. package/dist/core/schedule/eligibility.js +83 -0
  109. package/dist/core/schedule/eligibility.js.map +1 -0
  110. package/dist/core/schedule/reconcile-issue.js +82 -0
  111. package/dist/core/schedule/reconcile-issue.js.map +1 -0
  112. package/dist/core/schedule/retry.js +96 -0
  113. package/dist/core/schedule/retry.js.map +1 -0
  114. package/dist/core/schedule/sleep-cycle.js +133 -0
  115. package/dist/core/schedule/sleep-cycle.js.map +1 -0
  116. package/dist/core/schedule/slots.js +124 -0
  117. package/dist/core/schedule/slots.js.map +1 -0
  118. package/dist/core/schedule/tick.js +553 -0
  119. package/dist/core/schedule/tick.js.map +1 -0
  120. package/dist/core/schedule/token-fold.js +181 -0
  121. package/dist/core/schedule/token-fold.js.map +1 -0
  122. package/dist/core/state-resolve.js +86 -0
  123. package/dist/core/state-resolve.js.map +1 -0
  124. package/dist/core/vm-guards.js +278 -0
  125. package/dist/core/vm-guards.js.map +1 -0
  126. package/dist/core/workflow/derive.js +107 -0
  127. package/dist/core/workflow/derive.js.map +1 -0
  128. package/dist/core/workflow/parse.js +687 -0
  129. package/dist/core/workflow/parse.js.map +1 -0
  130. package/dist/core/workflow/prompt-probe.js +78 -0
  131. package/dist/core/workflow/prompt-probe.js.map +1 -0
  132. package/dist/core/workflow/validate.js +189 -0
  133. package/dist/core/workflow/validate.js.map +1 -0
  134. package/dist/core/workspace-key.js +19 -0
  135. package/dist/core/workspace-key.js.map +1 -0
  136. package/dist/shell/actions-runner.js +356 -0
  137. package/dist/shell/actions-runner.js.map +1 -0
  138. package/dist/shell/adapter/adapter-registry.js +45 -0
  139. package/dist/shell/adapter/adapter-registry.js.map +1 -0
  140. package/dist/shell/adapter/clock-random.js +96 -0
  141. package/dist/shell/adapter/clock-random.js.map +1 -0
  142. package/dist/shell/adapter/gondolin-dispatch-helpers.js +158 -0
  143. package/dist/shell/adapter/gondolin-dispatch-helpers.js.map +1 -0
  144. package/dist/shell/adapter/gondolin-dispatch.js +385 -0
  145. package/dist/shell/adapter/gondolin-dispatch.js.map +1 -0
  146. package/dist/shell/adapter/gondolin-image-converter.js +233 -0
  147. package/dist/shell/adapter/gondolin-image-converter.js.map +1 -0
  148. package/dist/shell/adapter/gondolin-image-fetch.js +180 -0
  149. package/dist/shell/adapter/gondolin-image-fetch.js.map +1 -0
  150. package/dist/shell/adapter/launcher-asset.js +57 -0
  151. package/dist/shell/adapter/launcher-asset.js.map +1 -0
  152. package/dist/shell/adapter/mise-config-asset.js +65 -0
  153. package/dist/shell/adapter/mise-config-asset.js.map +1 -0
  154. package/dist/shell/adapter/workflow-loader.js +304 -0
  155. package/dist/shell/adapter/workflow-loader.js.map +1 -0
  156. package/dist/shell/cli/doctor.js +268 -0
  157. package/dist/shell/cli/doctor.js.map +1 -0
  158. package/dist/shell/effect-interpreter-families.js +314 -0
  159. package/dist/shell/effect-interpreter-families.js.map +1 -0
  160. package/dist/shell/effect-interpreter.js +29 -0
  161. package/dist/shell/effect-interpreter.js.map +1 -0
  162. package/dist/shell/interp/acp-frame.js +137 -0
  163. package/dist/shell/interp/acp-frame.js.map +1 -0
  164. package/dist/shell/interp/acp-ws-conn.js +320 -0
  165. package/dist/shell/interp/acp-ws-conn.js.map +1 -0
  166. package/dist/shell/interp/acp-ws-frames.js +159 -0
  167. package/dist/shell/interp/acp-ws-frames.js.map +1 -0
  168. package/dist/shell/interp/acp-ws.js +197 -0
  169. package/dist/shell/interp/acp-ws.js.map +1 -0
  170. package/dist/shell/interp/acp.js +319 -0
  171. package/dist/shell/interp/acp.js.map +1 -0
  172. package/dist/shell/interp/credential-defaults.js +128 -0
  173. package/dist/shell/interp/credential-defaults.js.map +1 -0
  174. package/dist/shell/interp/credential-hooks.js +149 -0
  175. package/dist/shell/interp/credential-hooks.js.map +1 -0
  176. package/dist/shell/interp/credential-registry.js +226 -0
  177. package/dist/shell/interp/credential-registry.js.map +1 -0
  178. package/dist/shell/interp/credential.js +103 -0
  179. package/dist/shell/interp/credential.js.map +1 -0
  180. package/dist/shell/interp/gh.js +163 -0
  181. package/dist/shell/interp/gh.js.map +1 -0
  182. package/dist/shell/interp/git.js +28 -0
  183. package/dist/shell/interp/git.js.map +1 -0
  184. package/dist/shell/interp/log.js +213 -0
  185. package/dist/shell/interp/log.js.map +1 -0
  186. package/dist/shell/interp/process.js +178 -0
  187. package/dist/shell/interp/process.js.map +1 -0
  188. package/dist/shell/interp/runlog.js +193 -0
  189. package/dist/shell/interp/runlog.js.map +1 -0
  190. package/dist/shell/interp/timer.js +64 -0
  191. package/dist/shell/interp/timer.js.map +1 -0
  192. package/dist/shell/interp/tracker-disk.js +99 -0
  193. package/dist/shell/interp/tracker-disk.js.map +1 -0
  194. package/dist/shell/interp/tracker-parse.js +71 -0
  195. package/dist/shell/interp/tracker-parse.js.map +1 -0
  196. package/dist/shell/interp/tracker-scan.js +238 -0
  197. package/dist/shell/interp/tracker-scan.js.map +1 -0
  198. package/dist/shell/interp/tracker-write.js +91 -0
  199. package/dist/shell/interp/tracker-write.js.map +1 -0
  200. package/dist/shell/interp/tracker.js +41 -0
  201. package/dist/shell/interp/tracker.js.map +1 -0
  202. package/dist/shell/interp/tty.js +48 -0
  203. package/dist/shell/interp/tty.js.map +1 -0
  204. package/dist/shell/interp/vm.js +199 -0
  205. package/dist/shell/interp/vm.js.map +1 -0
  206. package/dist/shell/interp/workspace.js +310 -0
  207. package/dist/shell/interp/workspace.js.map +1 -0
  208. package/dist/shell/main-acp.js +78 -0
  209. package/dist/shell/main-acp.js.map +1 -0
  210. package/dist/shell/main-adapters.js +222 -0
  211. package/dist/shell/main-adapters.js.map +1 -0
  212. package/dist/shell/main-credential.js +122 -0
  213. package/dist/shell/main-credential.js.map +1 -0
  214. package/dist/shell/main-doctor.js +22 -0
  215. package/dist/shell/main-doctor.js.map +1 -0
  216. package/dist/shell/main-entry.js +46 -0
  217. package/dist/shell/main-entry.js.map +1 -0
  218. package/dist/shell/main-http-csrf.js +45 -0
  219. package/dist/shell/main-http-csrf.js.map +1 -0
  220. package/dist/shell/main-http-handler.js +389 -0
  221. package/dist/shell/main-http-handler.js.map +1 -0
  222. package/dist/shell/main-http-mcp.js +122 -0
  223. package/dist/shell/main-http-mcp.js.map +1 -0
  224. package/dist/shell/main-http-views.js +253 -0
  225. package/dist/shell/main-http-views.js.map +1 -0
  226. package/dist/shell/main-http.js +76 -0
  227. package/dist/shell/main-http.js.map +1 -0
  228. package/dist/shell/main-loops.js +130 -0
  229. package/dist/shell/main-loops.js.map +1 -0
  230. package/dist/shell/main-mcp.js +129 -0
  231. package/dist/shell/main-mcp.js.map +1 -0
  232. package/dist/shell/main-orchestrator.js +120 -0
  233. package/dist/shell/main-orchestrator.js.map +1 -0
  234. package/dist/shell/main-preflight.js +43 -0
  235. package/dist/shell/main-preflight.js.map +1 -0
  236. package/dist/shell/main-reconcilers-helpers.js +244 -0
  237. package/dist/shell/main-reconcilers-helpers.js.map +1 -0
  238. package/dist/shell/main-reconcilers-pr.js +148 -0
  239. package/dist/shell/main-reconcilers-pr.js.map +1 -0
  240. package/dist/shell/main-reconcilers.js +225 -0
  241. package/dist/shell/main-reconcilers.js.map +1 -0
  242. package/dist/shell/main-runner.js +355 -0
  243. package/dist/shell/main-runner.js.map +1 -0
  244. package/dist/shell/main-scaffold.js +116 -0
  245. package/dist/shell/main-scaffold.js.map +1 -0
  246. package/dist/shell/main-shutdown.js +115 -0
  247. package/dist/shell/main-shutdown.js.map +1 -0
  248. package/dist/shell/main-startup.js +48 -0
  249. package/dist/shell/main-startup.js.map +1 -0
  250. package/dist/shell/main-substrates.js +43 -0
  251. package/dist/shell/main-substrates.js.map +1 -0
  252. package/dist/shell/main.js +385 -0
  253. package/dist/shell/main.js.map +1 -0
  254. package/dist/shell/orchestrator-feedback.js +69 -0
  255. package/dist/shell/orchestrator-feedback.js.map +1 -0
  256. package/dist/shell/orchestrator-image.js +167 -0
  257. package/dist/shell/orchestrator-image.js.map +1 -0
  258. package/dist/shell/orchestrator-loop.js +468 -0
  259. package/dist/shell/orchestrator-loop.js.map +1 -0
  260. package/dist/shell/orchestrator-reconcile.js +36 -0
  261. package/dist/shell/orchestrator-reconcile.js.map +1 -0
  262. package/dist/shell/reconciler-loop.js +228 -0
  263. package/dist/shell/reconciler-loop.js.map +1 -0
  264. package/dist/shell/runner-loop-turn.js +301 -0
  265. package/dist/shell/runner-loop-turn.js.map +1 -0
  266. package/dist/shell/runner-loop.js +338 -0
  267. package/dist/shell/runner-loop.js.map +1 -0
  268. package/dist/shell/server/http.js +208 -0
  269. package/dist/shell/server/http.js.map +1 -0
  270. package/dist/shell/server/mcp-runtime-effects.js +237 -0
  271. package/dist/shell/server/mcp-runtime-effects.js.map +1 -0
  272. package/dist/shell/server/mcp-runtime.js +99 -0
  273. package/dist/shell/server/mcp-runtime.js.map +1 -0
  274. package/dist/shell/workspace-key.js +14 -0
  275. package/dist/shell/workspace-key.js.map +1 -0
  276. package/dist/types/acp.js +8 -0
  277. package/dist/types/acp.js.map +1 -0
  278. package/dist/types/actions/plan.js +6 -0
  279. package/dist/types/actions/plan.js.map +1 -0
  280. package/dist/types/actions/predicates.js +6 -0
  281. package/dist/types/actions/predicates.js.map +1 -0
  282. package/dist/types/actions/run-fold.js +8 -0
  283. package/dist/types/actions/run-fold.js.map +1 -0
  284. package/dist/types/actions.js +7 -0
  285. package/dist/types/actions.js.map +1 -0
  286. package/dist/types/adapter/clock-random.js +4 -0
  287. package/dist/types/adapter/clock-random.js.map +1 -0
  288. package/dist/types/adapter/gondolin-image-converter.js +5 -0
  289. package/dist/types/adapter/gondolin-image-converter.js.map +1 -0
  290. package/dist/types/adapter/gondolin-image-fetch.js +5 -0
  291. package/dist/types/adapter/gondolin-image-fetch.js.map +1 -0
  292. package/dist/types/adapter/workflow-loader.js +4 -0
  293. package/dist/types/adapter/workflow-loader.js.map +1 -0
  294. package/dist/types/cli/args.js +8 -0
  295. package/dist/types/cli/args.js.map +1 -0
  296. package/dist/types/config.js +8 -0
  297. package/dist/types/config.js.map +1 -0
  298. package/dist/types/credential-interp.js +6 -0
  299. package/dist/types/credential-interp.js.map +1 -0
  300. package/dist/types/credentials.js +10 -0
  301. package/dist/types/credentials.js.map +1 -0
  302. package/dist/types/doctor.js +7 -0
  303. package/dist/types/doctor.js.map +1 -0
  304. package/dist/types/domain.js +7 -0
  305. package/dist/types/domain.js.map +1 -0
  306. package/dist/types/effect.js +15 -0
  307. package/dist/types/effect.js.map +1 -0
  308. package/dist/types/errors.js +39 -0
  309. package/dist/types/errors.js.map +1 -0
  310. package/dist/types/http/decisions.js +6 -0
  311. package/dist/types/http/decisions.js.map +1 -0
  312. package/dist/types/http/render.js +10 -0
  313. package/dist/types/http/render.js.map +1 -0
  314. package/dist/types/http/views.js +6 -0
  315. package/dist/types/http/views.js.map +1 -0
  316. package/dist/types/http.js +9 -0
  317. package/dist/types/http.js.map +1 -0
  318. package/dist/types/image/managed-image.js +7 -0
  319. package/dist/types/image/managed-image.js.map +1 -0
  320. package/dist/types/interp/effect-interpreter.js +8 -0
  321. package/dist/types/interp/effect-interpreter.js.map +1 -0
  322. package/dist/types/interp/tracker.js +7 -0
  323. package/dist/types/interp/tracker.js.map +1 -0
  324. package/dist/types/issue/file.js +6 -0
  325. package/dist/types/issue/file.js.map +1 -0
  326. package/dist/types/issue/parse.js +8 -0
  327. package/dist/types/issue/parse.js.map +1 -0
  328. package/dist/types/main-acp.js +13 -0
  329. package/dist/types/main-acp.js.map +1 -0
  330. package/dist/types/main-adapters.js +5 -0
  331. package/dist/types/main-adapters.js.map +1 -0
  332. package/dist/types/main-credential.js +21 -0
  333. package/dist/types/main-credential.js.map +1 -0
  334. package/dist/types/main-doctor.js +6 -0
  335. package/dist/types/main-doctor.js.map +1 -0
  336. package/dist/types/main-http-handler.js +12 -0
  337. package/dist/types/main-http-handler.js.map +1 -0
  338. package/dist/types/main-http.js +5 -0
  339. package/dist/types/main-http.js.map +1 -0
  340. package/dist/types/main-loops.js +5 -0
  341. package/dist/types/main-loops.js.map +1 -0
  342. package/dist/types/main-mcp.js +12 -0
  343. package/dist/types/main-mcp.js.map +1 -0
  344. package/dist/types/main-orchestrator.js +5 -0
  345. package/dist/types/main-orchestrator.js.map +1 -0
  346. package/dist/types/main-reconcilers.js +11 -0
  347. package/dist/types/main-reconcilers.js.map +1 -0
  348. package/dist/types/main-runner.js +13 -0
  349. package/dist/types/main-runner.js.map +1 -0
  350. package/dist/types/main-startup.js +5 -0
  351. package/dist/types/main-startup.js.map +1 -0
  352. package/dist/types/main-substrates.js +5 -0
  353. package/dist/types/main-substrates.js.map +1 -0
  354. package/dist/types/mcp/dispatch.js +4 -0
  355. package/dist/types/mcp/dispatch.js.map +1 -0
  356. package/dist/types/mcp/post-move.js +7 -0
  357. package/dist/types/mcp/post-move.js.map +1 -0
  358. package/dist/types/mcp.js +9 -0
  359. package/dist/types/mcp.js.map +1 -0
  360. package/dist/types/ports.js +12 -0
  361. package/dist/types/ports.js.map +1 -0
  362. package/dist/types/reconcile/image-decide.js +5 -0
  363. package/dist/types/reconcile/image-decide.js.map +1 -0
  364. package/dist/types/reconcile/ledger.js +7 -0
  365. package/dist/types/reconcile/ledger.js.map +1 -0
  366. package/dist/types/reconcile/pr-loop.js +8 -0
  367. package/dist/types/reconcile/pr-loop.js.map +1 -0
  368. package/dist/types/reconcile/vm-reap.js +8 -0
  369. package/dist/types/reconcile/vm-reap.js.map +1 -0
  370. package/dist/types/reconcile/workspace-decide.js +7 -0
  371. package/dist/types/reconcile/workspace-decide.js.map +1 -0
  372. package/dist/types/reconcile.js +9 -0
  373. package/dist/types/reconcile.js.map +1 -0
  374. package/dist/types/runlog.js +7 -0
  375. package/dist/types/runlog.js.map +1 -0
  376. package/dist/types/runner/actions-runner.js +12 -0
  377. package/dist/types/runner/actions-runner.js.map +1 -0
  378. package/dist/types/runner/gondolin-dispatch.js +5 -0
  379. package/dist/types/runner/gondolin-dispatch.js.map +1 -0
  380. package/dist/types/runner/injection.js +6 -0
  381. package/dist/types/runner/injection.js.map +1 -0
  382. package/dist/types/runner/runner-loop.js +5 -0
  383. package/dist/types/runner/runner-loop.js.map +1 -0
  384. package/dist/types/runner/turn.js +4 -0
  385. package/dist/types/runner/turn.js.map +1 -0
  386. package/dist/types/runner/vm-plan.js +4 -0
  387. package/dist/types/runner/vm-plan.js.map +1 -0
  388. package/dist/types/runtime.js +9 -0
  389. package/dist/types/runtime.js.map +1 -0
  390. package/dist/types/schedule/admission.js +7 -0
  391. package/dist/types/schedule/admission.js.map +1 -0
  392. package/dist/types/schedule/circuit-breaker.js +2 -0
  393. package/dist/types/schedule/circuit-breaker.js.map +1 -0
  394. package/dist/types/schedule/eligibility.js +9 -0
  395. package/dist/types/schedule/eligibility.js.map +1 -0
  396. package/dist/types/schedule/orchestrator-loop.js +10 -0
  397. package/dist/types/schedule/orchestrator-loop.js.map +1 -0
  398. package/dist/types/schedule/sleep-cycle.js +4 -0
  399. package/dist/types/schedule/sleep-cycle.js.map +1 -0
  400. package/dist/types/schedule/slots.js +8 -0
  401. package/dist/types/schedule/slots.js.map +1 -0
  402. package/dist/types/schedule/tick.js +9 -0
  403. package/dist/types/schedule/tick.js.map +1 -0
  404. package/dist/types/server/mcp-runtime.js +8 -0
  405. package/dist/types/server/mcp-runtime.js.map +1 -0
  406. package/dist/types/workflow/parse.js +4 -0
  407. package/dist/types/workflow/parse.js.map +1 -0
  408. package/package.json +22 -10
  409. package/patches/@earendil-works+gondolin+0.12.0.patch +173 -0
  410. package/prompts/Reflect.md +91 -0
  411. package/prompts/Review.md +97 -0
  412. package/prompts/Todo.md +96 -0
  413. package/prompts/_footer.md +41 -0
  414. package/prompts/_preamble.md +42 -0
  415. package/prompts-minimal/Todo.md +26 -0
  416. package/scripts/postinstall.mjs +63 -0
  417. package/scripts/vm-agent.mjs +312 -90
  418. package/WORKFLOW.md +0 -744
  419. package/dist/acp-bridge.js +0 -324
  420. package/dist/acp-bridge.js.map +0 -1
  421. package/dist/actions/cache.js +0 -191
  422. package/dist/actions/cache.js.map +0 -1
  423. package/dist/actions/effects.js +0 -41
  424. package/dist/actions/effects.js.map +0 -1
  425. package/dist/actions/executor.js +0 -570
  426. package/dist/actions/executor.js.map +0 -1
  427. package/dist/actions/index.js +0 -13
  428. package/dist/actions/index.js.map +0 -1
  429. package/dist/actions/parsing.js.map +0 -1
  430. package/dist/actions/predicate-env.js +0 -27
  431. package/dist/actions/predicate-env.js.map +0 -1
  432. package/dist/actions/predicates.js +0 -49
  433. package/dist/actions/predicates.js.map +0 -1
  434. package/dist/actions/templating.js +0 -66
  435. package/dist/actions/templating.js.map +0 -1
  436. package/dist/actions/types.js +0 -15
  437. package/dist/actions/types.js.map +0 -1
  438. package/dist/agent/acp.js +0 -473
  439. package/dist/agent/acp.js.map +0 -1
  440. package/dist/agent/adapter-names.js +0 -159
  441. package/dist/agent/adapter-names.js.map +0 -1
  442. package/dist/agent/adapters.js +0 -511
  443. package/dist/agent/adapters.js.map +0 -1
  444. package/dist/agent/credential-extractors.js +0 -342
  445. package/dist/agent/credential-extractors.js.map +0 -1
  446. package/dist/agent/credential-secrets.js +0 -628
  447. package/dist/agent/credential-secrets.js.map +0 -1
  448. package/dist/agent/credential-ticker.js +0 -57
  449. package/dist/agent/credential-ticker.js.map +0 -1
  450. package/dist/agent/gondolin-creds-staging.js +0 -356
  451. package/dist/agent/gondolin-creds-staging.js.map +0 -1
  452. package/dist/agent/gondolin-dispatch.js +0 -375
  453. package/dist/agent/gondolin-dispatch.js.map +0 -1
  454. package/dist/agent/gondolin.js +0 -124
  455. package/dist/agent/gondolin.js.map +0 -1
  456. package/dist/agent/runner-decisions.js +0 -134
  457. package/dist/agent/runner-decisions.js.map +0 -1
  458. package/dist/agent/runner.js +0 -1456
  459. package/dist/agent/runner.js.map +0 -1
  460. package/dist/agent/tool-call-summary.js +0 -102
  461. package/dist/agent/tool-call-summary.js.map +0 -1
  462. package/dist/agent/vm-acp-mapping.js +0 -73
  463. package/dist/agent/vm-acp-mapping.js.map +0 -1
  464. package/dist/agent/vm-guards.js +0 -262
  465. package/dist/agent/vm-guards.js.map +0 -1
  466. package/dist/agent/vm-port.js +0 -22
  467. package/dist/agent/vm-port.js.map +0 -1
  468. package/dist/agent/vm-process-registry.js +0 -79
  469. package/dist/agent/vm-process-registry.js.map +0 -1
  470. package/dist/bin/cli-args.js +0 -105
  471. package/dist/bin/cli-args.js.map +0 -1
  472. package/dist/errors.js +0 -15
  473. package/dist/errors.js.map +0 -1
  474. package/dist/http-disk.js +0 -135
  475. package/dist/http-disk.js.map +0 -1
  476. package/dist/http-handlers.js.map +0 -1
  477. package/dist/http.js.map +0 -1
  478. package/dist/issues.js +0 -178
  479. package/dist/issues.js.map +0 -1
  480. package/dist/logging.js +0 -203
  481. package/dist/logging.js.map +0 -1
  482. package/dist/mcp.js +0 -706
  483. package/dist/mcp.js.map +0 -1
  484. package/dist/memory.js +0 -85
  485. package/dist/memory.js.map +0 -1
  486. package/dist/orchestrator-decisions.js +0 -331
  487. package/dist/orchestrator-decisions.js.map +0 -1
  488. package/dist/orchestrator.js +0 -1569
  489. package/dist/orchestrator.js.map +0 -1
  490. package/dist/prompt.js +0 -65
  491. package/dist/prompt.js.map +0 -1
  492. package/dist/reconciler/cache.js +0 -65
  493. package/dist/reconciler/cache.js.map +0 -1
  494. package/dist/reconciler/index.js +0 -448
  495. package/dist/reconciler/index.js.map +0 -1
  496. package/dist/reconciler/ledger.js +0 -131
  497. package/dist/reconciler/ledger.js.map +0 -1
  498. package/dist/reconciler/pr-adapters.js +0 -174
  499. package/dist/reconciler/pr-adapters.js.map +0 -1
  500. package/dist/reconciler/pr-decide.js.map +0 -1
  501. package/dist/reconciler/pr.js +0 -422
  502. package/dist/reconciler/pr.js.map +0 -1
  503. package/dist/reconciler/types.js +0 -12
  504. package/dist/reconciler/types.js.map +0 -1
  505. package/dist/reconciler/vm.js +0 -243
  506. package/dist/reconciler/vm.js.map +0 -1
  507. package/dist/reconciler/workspace-defaults.js +0 -83
  508. package/dist/reconciler/workspace-defaults.js.map +0 -1
  509. package/dist/reconciler/workspace.js +0 -272
  510. package/dist/reconciler/workspace.js.map +0 -1
  511. package/dist/runlog.js +0 -403
  512. package/dist/runlog.js.map +0 -1
  513. package/dist/scaffold.js +0 -165
  514. package/dist/scaffold.js.map +0 -1
  515. package/dist/trackers/local.js +0 -445
  516. package/dist/trackers/local.js.map +0 -1
  517. package/dist/trackers/types.js +0 -10
  518. package/dist/trackers/types.js.map +0 -1
  519. package/dist/types.js +0 -3
  520. package/dist/types.js.map +0 -1
  521. package/dist/util/clock.js +0 -12
  522. package/dist/util/clock.js.map +0 -1
  523. package/dist/util/crypto.js +0 -25
  524. package/dist/util/crypto.js.map +0 -1
  525. package/dist/util/frontmatter.js +0 -70
  526. package/dist/util/frontmatter.js.map +0 -1
  527. package/dist/util/fs-issues.js +0 -22
  528. package/dist/util/fs-issues.js.map +0 -1
  529. package/dist/util/process.js +0 -152
  530. package/dist/util/process.js.map +0 -1
  531. package/dist/util/workspace-key.js +0 -10
  532. package/dist/util/workspace-key.js.map +0 -1
  533. package/dist/workflow-loader.js +0 -147
  534. package/dist/workflow-loader.js.map +0 -1
  535. package/dist/workflow.js +0 -822
  536. package/dist/workflow.js.map +0 -1
  537. package/dist/workspace-types.js +0 -8
  538. package/dist/workspace-types.js.map +0 -1
  539. package/dist/workspace.js +0 -443
  540. package/dist/workspace.js.map +0 -1
@@ -1,448 +0,0 @@
1
- // Reconciler (issue 32). Owns the resource DAG that converges managed external
2
- // resources toward their declared desired state.
3
- //
4
- // Resources: the VM reaper (Gondolin session GC), the workspace janitor, and PR
5
- // autopilot. The DAG walker, per-action ledger, and dispatch-gating predicate
6
- // are written generically so additional resources can plug in by registering.
7
- // (The earlier per-issue image-bake resource was removed in the Gondolin
8
- // migration — the agent image is built once via `images/agents`, not baked per
9
- // issue.)
10
- //
11
- // Triggers (per issue 31 sketch):
12
- // • startup — orchestrator calls reconcile() before the first dispatch.
13
- // • config-watcher — orchestrator's onConfigReloaded calls reconcile().
14
- // • tracker-state — left to a future stage (no tracker-driven resources in v1).
15
- // • backstop tick — internal timer fires reconcile() every
16
- // `backstopIntervalMs` so a missed signal can't park the
17
- // reconciler forever.
18
- //
19
- // `reconcile --force` (CLI flag) propagates `{ force: true }` through, requesting
20
- // an immediate reconcile pass instead of waiting on the backstop tick.
21
- import { VmResource } from './vm.js';
22
- import { WorkspaceResource, } from './workspace.js';
23
- import { defaultInspectWorkspace, defaultListWorkspaceDirs, defaultRemoveWorkspace, } from './workspace-defaults.js';
24
- import { PrResource, } from './pr.js';
25
- import { GhCliPrApi } from './pr-adapters.js';
26
- import { derivePrRouting } from '../workflow.js';
27
- import { log } from '../logging.js';
28
- export class Reconciler {
29
- cfg;
30
- backstopIntervalMs;
31
- // VM reaper. Built at construction when a VmClient + intended provider are
32
- // already wired; otherwise lazily constructed via setIntendedVmProvider
33
- // (the production path — bin/symphony.ts builds the Reconciler before the
34
- // Orchestrator, then plugs the Orchestrator in as the intended-VM source).
35
- vm = null;
36
- vmClient = null;
37
- vmListSessions;
38
- vmGc;
39
- vmKillProcess;
40
- vmKillGraceMs;
41
- vmSelfPid;
42
- // Workspace janitor (issue 34). Constructed when an intended-set provider is
43
- // wired; without one there's no desired set to compare against, so the
44
- // resource is null and the reconcile pass skips it.
45
- workspace = null;
46
- workspaceInspect;
47
- workspaceRemove;
48
- workspaceCreate;
49
- workspaceBaseRef;
50
- workspaceIntended = null;
51
- // PR autopilot (issue 38). Built only when the PR engine (`pr.enabled`) is on
52
- // and providers have been wired. Null otherwise; reconcile() skips the pass.
53
- pr = null;
54
- prIntended = null;
55
- prApi = null;
56
- prTransition = null;
57
- prCleanup = null;
58
- backstopTimer = null;
59
- stopped = false;
60
- // Single-flight: collapse concurrent reconcile() calls into one ongoing pass so
61
- // an event burst (config reload + backstop + manual trigger landing within ms
62
- // of each other) doesn't kick off three overlapping reconcile passes.
63
- inFlight = null;
64
- rerunRequested = false;
65
- constructor(cfg, opts = {}) {
66
- this.cfg = cfg;
67
- this.backstopIntervalMs = opts.backstopIntervalMs ?? 5 * 60_000;
68
- this.initVm(opts);
69
- this.initWorkspace(opts);
70
- this.initPrProviders(opts);
71
- this.pr = this.buildPrResource();
72
- }
73
- initVm(opts) {
74
- this.vmClient = opts.vmClient ?? null;
75
- this.vmListSessions = opts.listSessions;
76
- this.vmGc = opts.gc;
77
- this.vmKillProcess = opts.killProcess;
78
- this.vmKillGraceMs = opts.killGraceMs;
79
- this.vmSelfPid = opts.selfPid;
80
- // Build eagerly only when a session source AND an intended provider are
81
- // both already wired. The session source is either the VmClient or the
82
- // explicit `listSessions` test hook; `setIntendedVmProvider` rebuilds once
83
- // the orchestrator lands.
84
- if ((this.vmClient || this.vmListSessions) && opts.vmIntendedProvider) {
85
- this.vm = this.buildVmResource(opts.vmIntendedProvider);
86
- }
87
- }
88
- /**
89
- * Assemble the {@link VmResource} options against the wired Gondolin session
90
- * source. `listSessions`/`gc` resolve from explicit test hooks first, then
91
- * fall back to the {@link VmClient} (the production path) — the shell adapts
92
- * `VmClient.listSessions()` (`VmSession[]`) into the reaper's local
93
- * `ReaperSession` shape so vm.ts never imports the port/adapter.
94
- */
95
- buildVmResource(intended) {
96
- const client = this.vmClient;
97
- const listSessions = this.vmSessionLister();
98
- const gc = this.vmGc ?? (client ? () => client.gc() : null);
99
- if (!listSessions || !gc) {
100
- throw new Error('vm reaper: no session source wired (need vmClient or listSessions+gc)');
101
- }
102
- return new VmResource({
103
- intended,
104
- listSessions,
105
- gc,
106
- killProcess: this.vmKillProcess ?? defaultKillProcess,
107
- killGraceMs: this.vmKillGraceMs,
108
- // The reaper's own pid, injected so the pure core can exclude it (and so
109
- // the shell can never `process.kill` itself). Sourced here in the shell —
110
- // vm.ts must not read `process`.
111
- selfPid: this.vmSelfPid ?? process.pid,
112
- });
113
- }
114
- initWorkspace(opts) {
115
- this.workspaceInspect = opts.workspaceInspect;
116
- this.workspaceRemove = opts.workspaceRemove;
117
- this.workspaceCreate = opts.workspaceCreate;
118
- this.workspaceBaseRef = opts.workspaceBaseRef;
119
- if (opts.workspaceIntendedProvider) {
120
- this.workspaceIntended = opts.workspaceIntendedProvider;
121
- this.workspace = this.buildWorkspaceResource();
122
- }
123
- }
124
- initPrProviders(opts) {
125
- if (opts.prIntendedProvider)
126
- this.prIntended = opts.prIntendedProvider;
127
- if (opts.prApi)
128
- this.prApi = opts.prApi;
129
- if (opts.prTransition)
130
- this.prTransition = opts.prTransition;
131
- if (opts.prCleanup)
132
- this.prCleanup = opts.prCleanup;
133
- }
134
- /**
135
- * Construct (or rebuild) the PR autopilot resource against the current
136
- * config + wired providers. Returns null when the PR engine (`pr.enabled`) is
137
- * false OR any required provider is missing — the latter happens on the
138
- * production path during the brief window between Reconciler construction
139
- * and the orchestrator wiring its callbacks via {@link setPrAutopilotProviders}.
140
- *
141
- * The auto-merge strategy and conflict-route target are derived by scanning
142
- * states for the per-state `pr:` field (issue 139); only the engine on/off +
143
- * poll TTL are read from the top-level `pr:` block.
144
- */
145
- buildPrResource() {
146
- if (!this.cfg.pr.enabled)
147
- return null;
148
- if (!this.prIntended || !this.prApi || !this.prTransition || !this.prCleanup) {
149
- return null;
150
- }
151
- const routing = derivePrRouting(this.cfg.states);
152
- const conflictRouteTo = routing.conflictRouteTo ?? defaultConflictRouteTo(this.cfg);
153
- return new PrResource({
154
- intended: this.prIntended,
155
- pr: this.prApi,
156
- transition: this.prTransition,
157
- cleanup: this.prCleanup,
158
- strategy: routing.strategy,
159
- conflictRouteTo,
160
- pollIntervalMs: this.cfg.pr.poll_interval_ms,
161
- actor: 'pr-autopilot',
162
- });
163
- }
164
- buildWorkspaceResource() {
165
- if (!this.workspaceIntended)
166
- return null;
167
- const root = this.cfg.workspace.root;
168
- return new WorkspaceResource({
169
- intended: this.workspaceIntended,
170
- baseRef: this.workspaceBaseRef,
171
- listWorkspaces: () => defaultListWorkspaceDirs(root),
172
- inspect: this.workspaceInspect ?? defaultInspectWorkspace,
173
- remove: this.workspaceRemove ?? ((identifier) => defaultRemoveWorkspace(root, identifier)),
174
- create: this.workspaceCreate,
175
- });
176
- }
177
- /**
178
- * Wire the VM resource against an intended-VM source after construction.
179
- * The orchestrator is the intended-VM provider in production (it owns the
180
- * `running` map) but is constructed AFTER the Reconciler because the runner
181
- * needs the Reconciler at construction time. Calling this is idempotent —
182
- * the resource is replaced wholesale.
183
- *
184
- * No-op when no session source (VmClient or explicit `listSessions` hook)
185
- * was wired at Reconciler construction; without one, the reaper has nothing
186
- * to enumerate Gondolin's session set with.
187
- */
188
- setIntendedVmProvider(provider) {
189
- if (!this.vmClient && !this.vmListSessions)
190
- return;
191
- this.vm = this.buildVmResource(provider);
192
- }
193
- /**
194
- * Wire the PR autopilot resource after construction. Same ordering reason
195
- * as the VM and workspace janitors: the orchestrator implements every
196
- * provider but is built after the Reconciler. Idempotent — the resource
197
- * is rebuilt against the latest providers on each call.
198
- *
199
- * Calling this with the PR engine (`pr.enabled`) false in the live config is
200
- * a no-op (the resource stays null).
201
- */
202
- setPrAutopilotProviders(opts) {
203
- this.prIntended = opts.intended;
204
- this.prApi = opts.pr;
205
- this.prTransition = opts.transition;
206
- this.prCleanup = opts.cleanup;
207
- this.pr = this.buildPrResource();
208
- }
209
- /**
210
- * Wire the workspace janitor after construction. Same construction-ordering
211
- * reason as `setIntendedVmProvider`: the orchestrator is the intended
212
- * provider in production but is built after the Reconciler. Idempotent —
213
- * the resource is replaced wholesale on each call.
214
- */
215
- setWorkspaceProviders(intended, opts = {}) {
216
- this.workspaceIntended = intended;
217
- if (opts.baseRef !== undefined)
218
- this.workspaceBaseRef = opts.baseRef;
219
- if (opts.remove !== undefined)
220
- this.workspaceRemove = opts.remove;
221
- if (opts.create !== undefined)
222
- this.workspaceCreate = opts.create;
223
- this.workspace = this.buildWorkspaceResource();
224
- }
225
- /**
226
- * Run the workspace reaper outside the normal reconcile() walk. Used by the
227
- * orchestrator at startup to take over from the deleted `startupTerminalCleanup`
228
- * sweep: a single awaited pass before the first dispatch tick removes
229
- * leftover dirs from a prior run so a brand-new dispatch doesn't reuse
230
- * stale state. No-op when the resource isn't wired.
231
- */
232
- async reapWorkspaces() {
233
- if (!this.workspace)
234
- return;
235
- try {
236
- await this.workspace.reconcile();
237
- }
238
- catch (err) {
239
- log.warn('workspace reap pass threw', { error: err.message });
240
- }
241
- }
242
- /**
243
- * Run the VM reaper outside the normal reconcile() walk. Used by the
244
- * orchestrator at:
245
- * • startup (after `start()` — initial sweep of leftover symphony-* VMs).
246
- * • shutdown (`stop()` clears `running` first so desired = ∅).
247
- * • non-clean worker exit (the per-attempt destroy may not have fired).
248
- *
249
- * Decoupled from `reconcile()` so VM reaping can run on its own cadence
250
- * (startup/shutdown/worker-exit) without waiting on a full reconcile pass.
251
- * Returns immediately when the vm resource isn't wired.
252
- */
253
- async reapVms() {
254
- if (!this.vm)
255
- return;
256
- try {
257
- await this.vm.reconcile();
258
- }
259
- catch (err) {
260
- log.warn('vm reap pass threw', { error: err.message });
261
- }
262
- }
263
- /**
264
- * Resolve the session enumerator: the explicit `listSessions` test hook if
265
- * set, else an adapter over `VmClient.listSessions()` (alive-only,
266
- * `ReaperSession`-shaped), else null when no source is wired.
267
- *
268
- * NOTE: the session registry records the *creating* process's pid — for
269
- * symphony's in-process VMs that is the orchestrator's own pid, not the
270
- * backing qemu's. So this enumerator drives the convergence reaper (which
271
- * compares labels against the intended set), NOT forced qemu teardown on exit:
272
- * that is `VmClient.killAllVms()`, which signals each VM's `getHostPid()`
273
- * directly (issue 152).
274
- */
275
- vmSessionLister() {
276
- if (this.vmListSessions)
277
- return this.vmListSessions;
278
- const client = this.vmClient;
279
- if (!client)
280
- return null;
281
- return async () => adaptSessions(await client.listSessions());
282
- }
283
- // Re-bind config-dependent resources against the freshly-reloaded config.
284
- updateConfig(cfg) {
285
- this.cfg = cfg;
286
- // Workspace janitor reads `workspace.root` at construction; rebind so a
287
- // workflow reload that moved the workspace root takes effect on the next
288
- // pass. Preserves the held intended/integration providers — they're
289
- // referenced indirectly via the orchestrator's identity, which doesn't
290
- // change on reload.
291
- if (this.workspace) {
292
- this.workspace = this.buildWorkspaceResource();
293
- }
294
- // PR autopilot reads strategy / route-state fields from cfg at
295
- // construction. Rebuild so a reload that flips `enabled` or changes any
296
- // field takes effect on the next pass.
297
- this.pr = this.buildPrResource();
298
- void this.reconcile().catch((err) => log.warn('reconcile after config reload failed', { error: err.message }));
299
- }
300
- start() {
301
- if (this.backstopTimer)
302
- return;
303
- this.backstopTimer = setInterval(() => {
304
- void this.reconcile().catch((err) => log.debug('backstop reconcile failed', { error: err.message }));
305
- }, this.backstopIntervalMs);
306
- this.backstopTimer.unref();
307
- }
308
- async stop() {
309
- this.stopped = true;
310
- if (this.backstopTimer) {
311
- clearInterval(this.backstopTimer);
312
- this.backstopTimer = null;
313
- }
314
- // Don't block shutdown on an in-flight reconcile pass — the janitors are
315
- // idempotent and re-run on the next start. Surface awaitInFlight() as an
316
- // explicit call for tests that need deterministic completion.
317
- }
318
- // Await the current reconcile pass (if any). Used by tests that trigger a
319
- // background reconcile (e.g. via updateConfig) and need it settled before
320
- // asserting. Resolves immediately when no pass is in flight.
321
- async awaitInFlight() {
322
- if (this.inFlight)
323
- await this.inFlight;
324
- }
325
- // Trigger a reconcile pass. Idempotent across overlapping callers (single-flight);
326
- // if a pass is in progress when called, a re-run is scheduled to fire once it
327
- // completes so the latest config is always observed.
328
- //
329
- // `force` requests an immediate pass (the CLI `reconcile --force` entry point);
330
- // it no longer has resource-specific semantics now that the bake is gone, but
331
- // the parameter is threaded so existing callers keep compiling and the rerun
332
- // coalescing below still guarantees a fresh pass observes the latest state.
333
- async reconcile(opts = {}) {
334
- if (this.stopped)
335
- return;
336
- if (this.inFlight) {
337
- this.rerunRequested = true;
338
- await this.inFlight;
339
- if (this.rerunRequested) {
340
- this.rerunRequested = false;
341
- await this.runPass();
342
- }
343
- return;
344
- }
345
- await this.runPass();
346
- while (this.rerunRequested && !this.stopped) {
347
- this.rerunRequested = false;
348
- await this.runPass();
349
- }
350
- }
351
- async runPass() {
352
- this.inFlight = (async () => {
353
- try {
354
- // Independent janitors: vm reaper, workspace janitor, PR autopilot. Each
355
- // is idempotent / cheap when there's no work to do — the passes return
356
- // immediately when desired == actual.
357
- if (this.vm) {
358
- try {
359
- await this.vm.reconcile();
360
- }
361
- catch (err) {
362
- log.warn('vm reconcile pass threw', { error: err.message });
363
- }
364
- }
365
- if (this.workspace) {
366
- try {
367
- await this.workspace.reconcile();
368
- }
369
- catch (err) {
370
- log.warn('workspace reconcile pass threw', { error: err.message });
371
- }
372
- }
373
- if (this.pr) {
374
- try {
375
- await this.pr.reconcile();
376
- }
377
- catch (err) {
378
- log.warn('pr reconcile pass threw', { error: err.message });
379
- }
380
- }
381
- }
382
- catch (err) {
383
- log.warn('reconcile pass threw', { error: err.message });
384
- }
385
- finally {
386
- this.inFlight = null;
387
- }
388
- })();
389
- await this.inFlight;
390
- }
391
- // Public predicate the orchestrator's dispatch loop calls before claiming an issue.
392
- // True iff every resource the dispatch flow depends on is ready. The bake was
393
- // the only dispatch-gating prerequisite; with the image built ahead of time
394
- // (not per issue) there is nothing left to gate on, so dispatch is always ready.
395
- dispatchReady() {
396
- return true;
397
- }
398
- snapshot() {
399
- const resources = [];
400
- if (this.vm)
401
- resources.push(this.vm.snapshot());
402
- if (this.workspace)
403
- resources.push(this.workspace.snapshot());
404
- if (this.pr)
405
- resources.push(this.pr.snapshot());
406
- return { resources };
407
- }
408
- }
409
- /**
410
- * First declared active state, used as the default `conflict_route_to` when
411
- * the workflow doesn't pin one. Mirrors symphony's convention of routing
412
- * conflict-handling work to "Todo" without hardcoding the name.
413
- */
414
- function defaultConflictRouteTo(cfg) {
415
- for (const [name, sc] of Object.entries(cfg.states)) {
416
- if (sc.role === 'active')
417
- return name;
418
- }
419
- // Validation already rejects workflows with no active state, but keep a
420
- // sentinel just in case so the PrResource can construct without throwing.
421
- return 'Todo';
422
- }
423
- /**
424
- * Adapt Gondolin's `VmSession[]` (from `VmClient.listSessions()`) into the
425
- * reaper's local `ReaperSession` shape. Keeping this projection in the shell
426
- * lets `vm.ts` (the functional core) stay free of any `vm-port`/adapter import:
427
- * the core only ever sees the minimal `{ pid, label? }` it acts on.
428
- *
429
- * Safety: only `alive === true` sessions are forwarded to the core. A STALE
430
- * (dead-pid, `alive: false`) session is Gondolin `gc()`'s job; if it reached the
431
- * core it could be SIGTERM'd as a "live orphan" even though its recorded `pid`
432
- * may since have been REUSED by an unrelated host process — signalling that pid
433
- * would hit the wrong process. Dropping dead sessions here keeps the core
434
- * minimal (it never needs an `alive` flag) and guarantees `decideVm` only ever
435
- * sees genuinely-live pids.
436
- */
437
- function adaptSessions(sessions) {
438
- return sessions
439
- .filter((s) => s.alive === true)
440
- .map((s) => ({ pid: s.pid, label: s.label }));
441
- }
442
- function defaultKillProcess(pid, signal) {
443
- process.kill(pid, signal);
444
- }
445
- export { decideVm } from './vm.js';
446
- export { PrResource } from './pr.js';
447
- export { GhCliPrApi } from './pr-adapters.js';
448
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reconciler/index.ts"],"names":[],"mappings":"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"}
@@ -1,131 +0,0 @@
1
- // Shared action ledger for reconciler resources (issue 43).
2
- //
3
- // Each resource (bake, vm, workspace, pr, …) carries a most-recent-first buffer
4
- // of `ActionStatus` rows so the dashboard can render "what is this resource
5
- // currently doing / what did it just try." Every resource used to inline its
6
- // own copy of the push/done/error/snapshot plumbing — four identical
7
- // implementations modulo the action-key shape (bake keys by hash, the rest key
8
- // by an opaque string). This module centralizes that plumbing so adding a new
9
- // ledger field (per-action duration, structured logging, ring-buffer policy)
10
- // is a one-file change.
11
- //
12
- // Semantics preserved verbatim from the prior inline implementations:
13
- // • start(action) — unshifts an `in_progress` row.
14
- // • done(action) — flips the most-recent matching `in_progress` row to
15
- // `done`. Idempotent: a second call (or a call with no
16
- // matching row) is a no-op.
17
- // • error(action) — flips the matching `in_progress` row to `error`; when
18
- // no in-progress row exists, pushes a fresh orphan-error
19
- // row with `started_at === finished_at`.
20
- // • record(action) — pushes a one-shot already-terminal annotation (used by
21
- // workspace's mark_stale/mark_stuck and the vm reaper's
22
- // kill_session path).
23
- // • run(action, fn) — convenience wrapper: start → await → done/error.
24
- //
25
- // The buffer is capped at `maxHistory * 2` rows; `snapshot()` exposes the
26
- // first `maxHistory` for the dashboard. The over-cap headroom matches the
27
- // pre-refactor behavior: the underlying array keeps a small lookback for
28
- // late-arriving `done`/`error` calls whose `in_progress` row was created
29
- // shortly before a flood of newer actions.
30
- const DEFAULT_MAX_HISTORY = 32;
31
- export class ResourceActionLedger {
32
- resource;
33
- nowFn;
34
- maxHistory;
35
- buf = [];
36
- constructor(resource, opts = {}) {
37
- this.resource = resource;
38
- this.nowFn = opts.now ?? (() => Date.now());
39
- this.maxHistory = opts.maxHistory ?? DEFAULT_MAX_HISTORY;
40
- }
41
- start(action) {
42
- this.push({
43
- resource: this.resource,
44
- action,
45
- state: 'in_progress',
46
- started_at: this.iso(),
47
- finished_at: null,
48
- error: null,
49
- });
50
- }
51
- done(action) {
52
- const idx = this.findInProgress(action);
53
- if (idx < 0)
54
- return;
55
- this.buf[idx] = { ...this.buf[idx], state: 'done', finished_at: this.iso() };
56
- }
57
- error(action, msg) {
58
- const idx = this.findInProgress(action);
59
- const finished = this.iso();
60
- if (idx >= 0) {
61
- this.buf[idx] = {
62
- ...this.buf[idx],
63
- state: 'error',
64
- finished_at: finished,
65
- error: msg,
66
- };
67
- return;
68
- }
69
- this.push({
70
- resource: this.resource,
71
- action,
72
- state: 'error',
73
- started_at: finished,
74
- finished_at: finished,
75
- error: msg,
76
- });
77
- }
78
- /**
79
- * One-shot terminal annotation. The action is pushed already-finished;
80
- * `started_at === finished_at`. Used for state that has no meaningful
81
- * in-progress phase (workspace drift annotations, vm kill_session errors).
82
- */
83
- record(action, state, error = null) {
84
- const now = this.iso();
85
- this.push({
86
- resource: this.resource,
87
- action,
88
- state,
89
- started_at: now,
90
- finished_at: now,
91
- error,
92
- });
93
- }
94
- /**
95
- * Convenience: start the action, await the promise, then done/error based on
96
- * outcome. Returns the wrapped result so callers can still branch on the
97
- * value or message without rethrowing. Errors are converted to their
98
- * `.message` string — matching every existing resource's `(err as Error).message`
99
- * extraction.
100
- */
101
- async run(action, fn) {
102
- this.start(action);
103
- try {
104
- const value = await fn();
105
- this.done(action);
106
- return { ok: true, value };
107
- }
108
- catch (err) {
109
- const msg = err.message;
110
- this.error(action, msg);
111
- return { ok: false, error: msg };
112
- }
113
- }
114
- /** Most-recent-first slice of action statuses, capped at `maxItems`. */
115
- snapshot(maxItems) {
116
- return this.buf.slice(0, maxItems ?? this.maxHistory);
117
- }
118
- findInProgress(action) {
119
- return this.buf.findIndex((a) => a.action === action && a.state === 'in_progress');
120
- }
121
- push(status) {
122
- this.buf.unshift(status);
123
- if (this.buf.length > this.maxHistory * 2) {
124
- this.buf.length = this.maxHistory * 2;
125
- }
126
- }
127
- iso() {
128
- return new Date(this.nowFn()).toISOString();
129
- }
130
- }
131
- //# sourceMappingURL=ledger.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../src/reconciler/ledger.ts"],"names":[],"mappings":"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"}