smol-symphony 0.2.0 → 0.3.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 (716) 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/src/bin/symphony.js +30 -0
  11. package/dist/src/bin/symphony.js.map +1 -0
  12. package/dist/src/core/actions/context.js +109 -0
  13. package/dist/src/core/actions/context.js.map +1 -0
  14. package/dist/{actions/parsing.js → src/core/actions/parse.js} +33 -114
  15. package/dist/src/core/actions/parse.js.map +1 -0
  16. package/dist/src/core/actions/plan.js +197 -0
  17. package/dist/src/core/actions/plan.js.map +1 -0
  18. package/dist/src/core/actions/predicates.js +111 -0
  19. package/dist/src/core/actions/predicates.js.map +1 -0
  20. package/dist/src/core/actions/run-fold.js +248 -0
  21. package/dist/src/core/actions/run-fold.js.map +1 -0
  22. package/dist/src/core/actions/template.js +118 -0
  23. package/dist/src/core/actions/template.js.map +1 -0
  24. package/dist/src/core/cli/args.js +116 -0
  25. package/dist/src/core/cli/args.js.map +1 -0
  26. package/dist/src/core/coerce.js +75 -0
  27. package/dist/src/core/coerce.js.map +1 -0
  28. package/dist/src/core/credential/account-id.js +20 -0
  29. package/dist/src/core/credential/account-id.js.map +1 -0
  30. package/dist/src/core/credential/adapter-config.js +136 -0
  31. package/dist/src/core/credential/adapter-config.js.map +1 -0
  32. package/dist/src/core/credential/availability.js +98 -0
  33. package/dist/src/core/credential/availability.js.map +1 -0
  34. package/dist/src/core/credential/extract.js +228 -0
  35. package/dist/src/core/credential/extract.js.map +1 -0
  36. package/dist/src/core/credential/fake-creds.js +171 -0
  37. package/dist/src/core/credential/fake-creds.js.map +1 -0
  38. package/dist/src/core/credential/identity.js +125 -0
  39. package/dist/src/core/credential/identity.js.map +1 -0
  40. package/dist/src/core/credential/shape.js +230 -0
  41. package/dist/src/core/credential/shape.js.map +1 -0
  42. package/dist/src/core/credential/strings.js +15 -0
  43. package/dist/src/core/credential/strings.js.map +1 -0
  44. package/dist/src/core/doctor/checks.js +303 -0
  45. package/dist/src/core/doctor/checks.js.map +1 -0
  46. package/dist/src/core/git/result.js +107 -0
  47. package/dist/src/core/git/result.js.map +1 -0
  48. package/dist/src/core/http/decisions.js +225 -0
  49. package/dist/src/core/http/decisions.js.map +1 -0
  50. package/dist/{http.js → src/core/http/render.js} +472 -738
  51. package/dist/src/core/http/render.js.map +1 -0
  52. package/dist/{http-handlers.js → src/core/http/routes.js} +52 -87
  53. package/dist/src/core/http/routes.js.map +1 -0
  54. package/dist/src/core/http/views.js +181 -0
  55. package/dist/src/core/http/views.js.map +1 -0
  56. package/dist/src/core/image/managed-image.js +95 -0
  57. package/dist/src/core/image/managed-image.js.map +1 -0
  58. package/dist/src/core/issue/file.js +149 -0
  59. package/dist/src/core/issue/file.js.map +1 -0
  60. package/dist/src/core/issue/parse.js +210 -0
  61. package/dist/src/core/issue/parse.js.map +1 -0
  62. package/dist/src/core/mcp/dispatch.js +239 -0
  63. package/dist/src/core/mcp/dispatch.js.map +1 -0
  64. package/dist/src/core/mcp/post-move.js +92 -0
  65. package/dist/src/core/mcp/post-move.js.map +1 -0
  66. package/dist/src/core/mcp/protocol.js +293 -0
  67. package/dist/src/core/mcp/protocol.js.map +1 -0
  68. package/dist/src/core/mcp/url.js +162 -0
  69. package/dist/src/core/mcp/url.js.map +1 -0
  70. package/dist/src/core/path.js +63 -0
  71. package/dist/src/core/path.js.map +1 -0
  72. package/dist/src/core/reconcile/image-decide.js +48 -0
  73. package/dist/src/core/reconcile/image-decide.js.map +1 -0
  74. package/dist/src/core/reconcile/ledger.js +142 -0
  75. package/dist/src/core/reconcile/ledger.js.map +1 -0
  76. package/dist/src/core/reconcile/pr-classify.js +62 -0
  77. package/dist/src/core/reconcile/pr-classify.js.map +1 -0
  78. package/dist/{reconciler → src/core/reconcile}/pr-decide.js +25 -12
  79. package/dist/src/core/reconcile/pr-decide.js.map +1 -0
  80. package/dist/src/core/reconcile/pr-loop.js +161 -0
  81. package/dist/src/core/reconcile/pr-loop.js.map +1 -0
  82. package/dist/src/core/reconcile/pr-notes.js +35 -0
  83. package/dist/src/core/reconcile/pr-notes.js.map +1 -0
  84. package/dist/src/core/reconcile/vm-decide.js +70 -0
  85. package/dist/src/core/reconcile/vm-decide.js.map +1 -0
  86. package/dist/src/core/reconcile/vm-reap.js +207 -0
  87. package/dist/src/core/reconcile/vm-reap.js.map +1 -0
  88. package/dist/src/core/reconcile/workspace-decide.js +162 -0
  89. package/dist/src/core/reconcile/workspace-decide.js.map +1 -0
  90. package/dist/src/core/runlog/summary.js +231 -0
  91. package/dist/src/core/runlog/summary.js.map +1 -0
  92. package/dist/src/core/runner/dispatch-config.js +95 -0
  93. package/dist/src/core/runner/dispatch-config.js.map +1 -0
  94. package/dist/src/core/runner/injection.js +61 -0
  95. package/dist/src/core/runner/injection.js.map +1 -0
  96. package/dist/src/core/runner/mise.js +210 -0
  97. package/dist/src/core/runner/mise.js.map +1 -0
  98. package/dist/src/core/runner/prompt.js +720 -0
  99. package/dist/src/core/runner/prompt.js.map +1 -0
  100. package/dist/src/core/runner/turn.js +242 -0
  101. package/dist/src/core/runner/turn.js.map +1 -0
  102. package/dist/src/core/runner/vm-plan.js +390 -0
  103. package/dist/src/core/runner/vm-plan.js.map +1 -0
  104. package/dist/src/core/schedule/admission.js +123 -0
  105. package/dist/src/core/schedule/admission.js.map +1 -0
  106. package/dist/src/core/schedule/circuit-breaker.js +111 -0
  107. package/dist/src/core/schedule/circuit-breaker.js.map +1 -0
  108. package/dist/src/core/schedule/eligibility.js +83 -0
  109. package/dist/src/core/schedule/eligibility.js.map +1 -0
  110. package/dist/src/core/schedule/reconcile-issue.js +82 -0
  111. package/dist/src/core/schedule/reconcile-issue.js.map +1 -0
  112. package/dist/src/core/schedule/retry.js +96 -0
  113. package/dist/src/core/schedule/retry.js.map +1 -0
  114. package/dist/src/core/schedule/sleep-cycle.js +133 -0
  115. package/dist/src/core/schedule/sleep-cycle.js.map +1 -0
  116. package/dist/src/core/schedule/slots.js +124 -0
  117. package/dist/src/core/schedule/slots.js.map +1 -0
  118. package/dist/src/core/schedule/tick.js +553 -0
  119. package/dist/src/core/schedule/tick.js.map +1 -0
  120. package/dist/src/core/schedule/token-fold.js +181 -0
  121. package/dist/src/core/schedule/token-fold.js.map +1 -0
  122. package/dist/src/core/state-resolve.js +86 -0
  123. package/dist/src/core/state-resolve.js.map +1 -0
  124. package/dist/src/core/vm-guards.js +278 -0
  125. package/dist/src/core/vm-guards.js.map +1 -0
  126. package/dist/src/core/workflow/derive.js +107 -0
  127. package/dist/src/core/workflow/derive.js.map +1 -0
  128. package/dist/src/core/workflow/parse.js +687 -0
  129. package/dist/src/core/workflow/parse.js.map +1 -0
  130. package/dist/src/core/workflow/prompt-probe.js +78 -0
  131. package/dist/src/core/workflow/prompt-probe.js.map +1 -0
  132. package/dist/src/core/workflow/validate.js +189 -0
  133. package/dist/src/core/workflow/validate.js.map +1 -0
  134. package/dist/src/core/workspace-key.js +19 -0
  135. package/dist/src/core/workspace-key.js.map +1 -0
  136. package/dist/src/shell/actions-runner.js +356 -0
  137. package/dist/src/shell/actions-runner.js.map +1 -0
  138. package/dist/src/shell/adapter/adapter-registry.js +45 -0
  139. package/dist/src/shell/adapter/adapter-registry.js.map +1 -0
  140. package/dist/src/shell/adapter/clock-random.js +96 -0
  141. package/dist/src/shell/adapter/clock-random.js.map +1 -0
  142. package/dist/src/shell/adapter/gondolin-dispatch-helpers.js +158 -0
  143. package/dist/src/shell/adapter/gondolin-dispatch-helpers.js.map +1 -0
  144. package/dist/src/shell/adapter/gondolin-dispatch.js +385 -0
  145. package/dist/src/shell/adapter/gondolin-dispatch.js.map +1 -0
  146. package/dist/src/shell/adapter/gondolin-image-converter.js +233 -0
  147. package/dist/src/shell/adapter/gondolin-image-converter.js.map +1 -0
  148. package/dist/src/shell/adapter/gondolin-image-fetch.js +180 -0
  149. package/dist/src/shell/adapter/gondolin-image-fetch.js.map +1 -0
  150. package/dist/src/shell/adapter/launcher-asset.js +57 -0
  151. package/dist/src/shell/adapter/launcher-asset.js.map +1 -0
  152. package/dist/src/shell/adapter/mise-config-asset.js +65 -0
  153. package/dist/src/shell/adapter/mise-config-asset.js.map +1 -0
  154. package/dist/src/shell/adapter/workflow-loader.js +304 -0
  155. package/dist/src/shell/adapter/workflow-loader.js.map +1 -0
  156. package/dist/src/shell/cli/doctor.js +268 -0
  157. package/dist/src/shell/cli/doctor.js.map +1 -0
  158. package/dist/src/shell/effect-interpreter-families.js +314 -0
  159. package/dist/src/shell/effect-interpreter-families.js.map +1 -0
  160. package/dist/src/shell/effect-interpreter.js +29 -0
  161. package/dist/src/shell/effect-interpreter.js.map +1 -0
  162. package/dist/src/shell/interp/acp-frame.js +137 -0
  163. package/dist/src/shell/interp/acp-frame.js.map +1 -0
  164. package/dist/src/shell/interp/acp-ws-conn.js +320 -0
  165. package/dist/src/shell/interp/acp-ws-conn.js.map +1 -0
  166. package/dist/src/shell/interp/acp-ws-frames.js +159 -0
  167. package/dist/src/shell/interp/acp-ws-frames.js.map +1 -0
  168. package/dist/src/shell/interp/acp-ws.js +197 -0
  169. package/dist/src/shell/interp/acp-ws.js.map +1 -0
  170. package/dist/src/shell/interp/acp.js +319 -0
  171. package/dist/src/shell/interp/acp.js.map +1 -0
  172. package/dist/src/shell/interp/credential-defaults.js +128 -0
  173. package/dist/src/shell/interp/credential-defaults.js.map +1 -0
  174. package/dist/src/shell/interp/credential-hooks.js +149 -0
  175. package/dist/src/shell/interp/credential-hooks.js.map +1 -0
  176. package/dist/src/shell/interp/credential-registry.js +226 -0
  177. package/dist/src/shell/interp/credential-registry.js.map +1 -0
  178. package/dist/src/shell/interp/credential.js +103 -0
  179. package/dist/src/shell/interp/credential.js.map +1 -0
  180. package/dist/src/shell/interp/gh.js +163 -0
  181. package/dist/src/shell/interp/gh.js.map +1 -0
  182. package/dist/src/shell/interp/git.js +28 -0
  183. package/dist/src/shell/interp/git.js.map +1 -0
  184. package/dist/src/shell/interp/log.js +213 -0
  185. package/dist/src/shell/interp/log.js.map +1 -0
  186. package/dist/src/shell/interp/process.js +178 -0
  187. package/dist/src/shell/interp/process.js.map +1 -0
  188. package/dist/src/shell/interp/runlog.js +193 -0
  189. package/dist/src/shell/interp/runlog.js.map +1 -0
  190. package/dist/src/shell/interp/timer.js +64 -0
  191. package/dist/src/shell/interp/timer.js.map +1 -0
  192. package/dist/src/shell/interp/tracker-disk.js +99 -0
  193. package/dist/src/shell/interp/tracker-disk.js.map +1 -0
  194. package/dist/src/shell/interp/tracker-parse.js +71 -0
  195. package/dist/src/shell/interp/tracker-parse.js.map +1 -0
  196. package/dist/src/shell/interp/tracker-scan.js +238 -0
  197. package/dist/src/shell/interp/tracker-scan.js.map +1 -0
  198. package/dist/src/shell/interp/tracker-write.js +91 -0
  199. package/dist/src/shell/interp/tracker-write.js.map +1 -0
  200. package/dist/src/shell/interp/tracker.js +41 -0
  201. package/dist/src/shell/interp/tracker.js.map +1 -0
  202. package/dist/src/shell/interp/tty.js +48 -0
  203. package/dist/src/shell/interp/tty.js.map +1 -0
  204. package/dist/src/shell/interp/vm.js +199 -0
  205. package/dist/src/shell/interp/vm.js.map +1 -0
  206. package/dist/src/shell/interp/workspace.js +310 -0
  207. package/dist/src/shell/interp/workspace.js.map +1 -0
  208. package/dist/src/shell/main-acp.js +78 -0
  209. package/dist/src/shell/main-acp.js.map +1 -0
  210. package/dist/src/shell/main-adapters.js +222 -0
  211. package/dist/src/shell/main-adapters.js.map +1 -0
  212. package/dist/src/shell/main-credential.js +122 -0
  213. package/dist/src/shell/main-credential.js.map +1 -0
  214. package/dist/src/shell/main-doctor.js +22 -0
  215. package/dist/src/shell/main-doctor.js.map +1 -0
  216. package/dist/src/shell/main-entry.js +46 -0
  217. package/dist/src/shell/main-entry.js.map +1 -0
  218. package/dist/src/shell/main-http-csrf.js +45 -0
  219. package/dist/src/shell/main-http-csrf.js.map +1 -0
  220. package/dist/src/shell/main-http-handler.js +389 -0
  221. package/dist/src/shell/main-http-handler.js.map +1 -0
  222. package/dist/src/shell/main-http-mcp.js +122 -0
  223. package/dist/src/shell/main-http-mcp.js.map +1 -0
  224. package/dist/src/shell/main-http-views.js +253 -0
  225. package/dist/src/shell/main-http-views.js.map +1 -0
  226. package/dist/src/shell/main-http.js +76 -0
  227. package/dist/src/shell/main-http.js.map +1 -0
  228. package/dist/src/shell/main-loops.js +130 -0
  229. package/dist/src/shell/main-loops.js.map +1 -0
  230. package/dist/src/shell/main-mcp.js +129 -0
  231. package/dist/src/shell/main-mcp.js.map +1 -0
  232. package/dist/src/shell/main-orchestrator.js +120 -0
  233. package/dist/src/shell/main-orchestrator.js.map +1 -0
  234. package/dist/src/shell/main-preflight.js +43 -0
  235. package/dist/src/shell/main-preflight.js.map +1 -0
  236. package/dist/src/shell/main-reconcilers-helpers.js +244 -0
  237. package/dist/src/shell/main-reconcilers-helpers.js.map +1 -0
  238. package/dist/src/shell/main-reconcilers-pr.js +148 -0
  239. package/dist/src/shell/main-reconcilers-pr.js.map +1 -0
  240. package/dist/src/shell/main-reconcilers.js +225 -0
  241. package/dist/src/shell/main-reconcilers.js.map +1 -0
  242. package/dist/src/shell/main-runner.js +355 -0
  243. package/dist/src/shell/main-runner.js.map +1 -0
  244. package/dist/src/shell/main-scaffold.js +116 -0
  245. package/dist/src/shell/main-scaffold.js.map +1 -0
  246. package/dist/src/shell/main-shutdown.js +115 -0
  247. package/dist/src/shell/main-shutdown.js.map +1 -0
  248. package/dist/src/shell/main-startup.js +48 -0
  249. package/dist/src/shell/main-startup.js.map +1 -0
  250. package/dist/src/shell/main-substrates.js +43 -0
  251. package/dist/src/shell/main-substrates.js.map +1 -0
  252. package/dist/src/shell/main.js +385 -0
  253. package/dist/src/shell/main.js.map +1 -0
  254. package/dist/src/shell/orchestrator-feedback.js +69 -0
  255. package/dist/src/shell/orchestrator-feedback.js.map +1 -0
  256. package/dist/src/shell/orchestrator-image.js +167 -0
  257. package/dist/src/shell/orchestrator-image.js.map +1 -0
  258. package/dist/src/shell/orchestrator-loop.js +468 -0
  259. package/dist/src/shell/orchestrator-loop.js.map +1 -0
  260. package/dist/src/shell/orchestrator-reconcile.js +36 -0
  261. package/dist/src/shell/orchestrator-reconcile.js.map +1 -0
  262. package/dist/src/shell/reconciler-loop.js +228 -0
  263. package/dist/src/shell/reconciler-loop.js.map +1 -0
  264. package/dist/src/shell/runner-loop-turn.js +301 -0
  265. package/dist/src/shell/runner-loop-turn.js.map +1 -0
  266. package/dist/src/shell/runner-loop.js +338 -0
  267. package/dist/src/shell/runner-loop.js.map +1 -0
  268. package/dist/src/shell/server/http.js +208 -0
  269. package/dist/src/shell/server/http.js.map +1 -0
  270. package/dist/src/shell/server/mcp-runtime-effects.js +237 -0
  271. package/dist/src/shell/server/mcp-runtime-effects.js.map +1 -0
  272. package/dist/src/shell/server/mcp-runtime.js +99 -0
  273. package/dist/src/shell/server/mcp-runtime.js.map +1 -0
  274. package/dist/src/shell/workspace-key.js +14 -0
  275. package/dist/src/shell/workspace-key.js.map +1 -0
  276. package/dist/src/types/acp.js +8 -0
  277. package/dist/src/types/acp.js.map +1 -0
  278. package/dist/src/types/actions/plan.js +6 -0
  279. package/dist/src/types/actions/plan.js.map +1 -0
  280. package/dist/src/types/actions/predicates.js +6 -0
  281. package/dist/src/types/actions/predicates.js.map +1 -0
  282. package/dist/src/types/actions/run-fold.js +8 -0
  283. package/dist/src/types/actions/run-fold.js.map +1 -0
  284. package/dist/src/types/actions.js +7 -0
  285. package/dist/src/types/actions.js.map +1 -0
  286. package/dist/src/types/adapter/clock-random.js +4 -0
  287. package/dist/src/types/adapter/clock-random.js.map +1 -0
  288. package/dist/src/types/adapter/gondolin-image-converter.js +5 -0
  289. package/dist/src/types/adapter/gondolin-image-converter.js.map +1 -0
  290. package/dist/src/types/adapter/gondolin-image-fetch.js +5 -0
  291. package/dist/src/types/adapter/gondolin-image-fetch.js.map +1 -0
  292. package/dist/src/types/adapter/workflow-loader.js +4 -0
  293. package/dist/src/types/adapter/workflow-loader.js.map +1 -0
  294. package/dist/src/types/cli/args.js +8 -0
  295. package/dist/src/types/cli/args.js.map +1 -0
  296. package/dist/src/types/config.js +8 -0
  297. package/dist/src/types/config.js.map +1 -0
  298. package/dist/src/types/credential-interp.js +6 -0
  299. package/dist/src/types/credential-interp.js.map +1 -0
  300. package/dist/src/types/credentials.js +10 -0
  301. package/dist/src/types/credentials.js.map +1 -0
  302. package/dist/src/types/doctor.js +7 -0
  303. package/dist/src/types/doctor.js.map +1 -0
  304. package/dist/src/types/domain.js +7 -0
  305. package/dist/src/types/domain.js.map +1 -0
  306. package/dist/src/types/effect.js +15 -0
  307. package/dist/src/types/effect.js.map +1 -0
  308. package/dist/src/types/errors.js +39 -0
  309. package/dist/src/types/errors.js.map +1 -0
  310. package/dist/src/types/http/decisions.js +6 -0
  311. package/dist/src/types/http/decisions.js.map +1 -0
  312. package/dist/src/types/http/render.js +10 -0
  313. package/dist/src/types/http/render.js.map +1 -0
  314. package/dist/src/types/http/views.js +6 -0
  315. package/dist/src/types/http/views.js.map +1 -0
  316. package/dist/src/types/http.js +9 -0
  317. package/dist/src/types/http.js.map +1 -0
  318. package/dist/src/types/image/managed-image.js +7 -0
  319. package/dist/src/types/image/managed-image.js.map +1 -0
  320. package/dist/src/types/interp/effect-interpreter.js +8 -0
  321. package/dist/src/types/interp/effect-interpreter.js.map +1 -0
  322. package/dist/src/types/interp/tracker.js +7 -0
  323. package/dist/src/types/interp/tracker.js.map +1 -0
  324. package/dist/src/types/issue/file.js +6 -0
  325. package/dist/src/types/issue/file.js.map +1 -0
  326. package/dist/src/types/issue/parse.js +8 -0
  327. package/dist/src/types/issue/parse.js.map +1 -0
  328. package/dist/src/types/main-acp.js +13 -0
  329. package/dist/src/types/main-acp.js.map +1 -0
  330. package/dist/src/types/main-adapters.js +5 -0
  331. package/dist/src/types/main-adapters.js.map +1 -0
  332. package/dist/src/types/main-credential.js +21 -0
  333. package/dist/src/types/main-credential.js.map +1 -0
  334. package/dist/src/types/main-doctor.js +6 -0
  335. package/dist/src/types/main-doctor.js.map +1 -0
  336. package/dist/src/types/main-http-handler.js +12 -0
  337. package/dist/src/types/main-http-handler.js.map +1 -0
  338. package/dist/src/types/main-http.js +5 -0
  339. package/dist/src/types/main-http.js.map +1 -0
  340. package/dist/src/types/main-loops.js +5 -0
  341. package/dist/src/types/main-loops.js.map +1 -0
  342. package/dist/src/types/main-mcp.js +12 -0
  343. package/dist/src/types/main-mcp.js.map +1 -0
  344. package/dist/src/types/main-orchestrator.js +5 -0
  345. package/dist/src/types/main-orchestrator.js.map +1 -0
  346. package/dist/src/types/main-reconcilers.js +11 -0
  347. package/dist/src/types/main-reconcilers.js.map +1 -0
  348. package/dist/src/types/main-runner.js +13 -0
  349. package/dist/src/types/main-runner.js.map +1 -0
  350. package/dist/src/types/main-startup.js +5 -0
  351. package/dist/src/types/main-startup.js.map +1 -0
  352. package/dist/src/types/main-substrates.js +5 -0
  353. package/dist/src/types/main-substrates.js.map +1 -0
  354. package/dist/src/types/mcp/dispatch.js +4 -0
  355. package/dist/src/types/mcp/dispatch.js.map +1 -0
  356. package/dist/src/types/mcp/post-move.js +7 -0
  357. package/dist/src/types/mcp/post-move.js.map +1 -0
  358. package/dist/src/types/mcp.js +9 -0
  359. package/dist/src/types/mcp.js.map +1 -0
  360. package/dist/src/types/ports.js +12 -0
  361. package/dist/src/types/ports.js.map +1 -0
  362. package/dist/src/types/reconcile/image-decide.js +5 -0
  363. package/dist/src/types/reconcile/image-decide.js.map +1 -0
  364. package/dist/src/types/reconcile/ledger.js +7 -0
  365. package/dist/src/types/reconcile/ledger.js.map +1 -0
  366. package/dist/src/types/reconcile/pr-loop.js +8 -0
  367. package/dist/src/types/reconcile/pr-loop.js.map +1 -0
  368. package/dist/src/types/reconcile/vm-reap.js +8 -0
  369. package/dist/src/types/reconcile/vm-reap.js.map +1 -0
  370. package/dist/src/types/reconcile/workspace-decide.js +7 -0
  371. package/dist/src/types/reconcile/workspace-decide.js.map +1 -0
  372. package/dist/src/types/reconcile.js +9 -0
  373. package/dist/src/types/reconcile.js.map +1 -0
  374. package/dist/src/types/runlog.js +7 -0
  375. package/dist/src/types/runlog.js.map +1 -0
  376. package/dist/src/types/runner/actions-runner.js +12 -0
  377. package/dist/src/types/runner/actions-runner.js.map +1 -0
  378. package/dist/src/types/runner/gondolin-dispatch.js +5 -0
  379. package/dist/src/types/runner/gondolin-dispatch.js.map +1 -0
  380. package/dist/src/types/runner/injection.js +6 -0
  381. package/dist/src/types/runner/injection.js.map +1 -0
  382. package/dist/src/types/runner/runner-loop.js +5 -0
  383. package/dist/src/types/runner/runner-loop.js.map +1 -0
  384. package/dist/src/types/runner/turn.js +4 -0
  385. package/dist/src/types/runner/turn.js.map +1 -0
  386. package/dist/src/types/runner/vm-plan.js +4 -0
  387. package/dist/src/types/runner/vm-plan.js.map +1 -0
  388. package/dist/src/types/runtime.js +9 -0
  389. package/dist/src/types/runtime.js.map +1 -0
  390. package/dist/src/types/schedule/admission.js +7 -0
  391. package/dist/src/types/schedule/admission.js.map +1 -0
  392. package/dist/src/types/schedule/circuit-breaker.js +2 -0
  393. package/dist/src/types/schedule/circuit-breaker.js.map +1 -0
  394. package/dist/src/types/schedule/eligibility.js +9 -0
  395. package/dist/src/types/schedule/eligibility.js.map +1 -0
  396. package/dist/src/types/schedule/orchestrator-loop.js +10 -0
  397. package/dist/src/types/schedule/orchestrator-loop.js.map +1 -0
  398. package/dist/src/types/schedule/sleep-cycle.js +4 -0
  399. package/dist/src/types/schedule/sleep-cycle.js.map +1 -0
  400. package/dist/src/types/schedule/slots.js +8 -0
  401. package/dist/src/types/schedule/slots.js.map +1 -0
  402. package/dist/src/types/schedule/tick.js +9 -0
  403. package/dist/src/types/schedule/tick.js.map +1 -0
  404. package/dist/src/types/server/mcp-runtime.js +8 -0
  405. package/dist/src/types/server/mcp-runtime.js.map +1 -0
  406. package/dist/src/types/workflow/parse.js +4 -0
  407. package/dist/src/types/workflow/parse.js.map +1 -0
  408. package/dist/tests/core/account-id.test.js +35 -0
  409. package/dist/tests/core/account-id.test.js.map +1 -0
  410. package/dist/tests/core/actions-parse.test.js +176 -0
  411. package/dist/tests/core/actions-parse.test.js.map +1 -0
  412. package/dist/tests/core/adapter-config.test.js +133 -0
  413. package/dist/tests/core/adapter-config.test.js.map +1 -0
  414. package/dist/tests/core/admission.test.js +215 -0
  415. package/dist/tests/core/admission.test.js.map +1 -0
  416. package/dist/tests/core/args.test.js +132 -0
  417. package/dist/tests/core/args.test.js.map +1 -0
  418. package/dist/tests/core/availability.test.js +62 -0
  419. package/dist/tests/core/availability.test.js.map +1 -0
  420. package/dist/tests/core/checks.test.js +395 -0
  421. package/dist/tests/core/checks.test.js.map +1 -0
  422. package/dist/tests/core/circuit-breaker.test.js +172 -0
  423. package/dist/tests/core/circuit-breaker.test.js.map +1 -0
  424. package/dist/tests/core/coerce.test.js +87 -0
  425. package/dist/tests/core/coerce.test.js.map +1 -0
  426. package/dist/tests/core/context.test.js +228 -0
  427. package/dist/tests/core/context.test.js.map +1 -0
  428. package/dist/tests/core/decisions.test.js +310 -0
  429. package/dist/tests/core/decisions.test.js.map +1 -0
  430. package/dist/tests/core/derive.test.js +205 -0
  431. package/dist/tests/core/derive.test.js.map +1 -0
  432. package/dist/tests/core/dispatch-config.test.js +164 -0
  433. package/dist/tests/core/dispatch-config.test.js.map +1 -0
  434. package/dist/tests/core/dispatch.test.js +302 -0
  435. package/dist/tests/core/dispatch.test.js.map +1 -0
  436. package/dist/tests/core/eligibility.test.js +163 -0
  437. package/dist/tests/core/eligibility.test.js.map +1 -0
  438. package/dist/tests/core/extract.test.js +139 -0
  439. package/dist/tests/core/extract.test.js.map +1 -0
  440. package/dist/tests/core/fake-creds.test.js +134 -0
  441. package/dist/tests/core/fake-creds.test.js.map +1 -0
  442. package/dist/tests/core/file.test.js +197 -0
  443. package/dist/tests/core/file.test.js.map +1 -0
  444. package/dist/tests/core/git-result.test.js +113 -0
  445. package/dist/tests/core/git-result.test.js.map +1 -0
  446. package/dist/tests/core/identity.test.js +180 -0
  447. package/dist/tests/core/identity.test.js.map +1 -0
  448. package/dist/tests/core/image-decide.test.js +59 -0
  449. package/dist/tests/core/image-decide.test.js.map +1 -0
  450. package/dist/tests/core/injection.test.js +163 -0
  451. package/dist/tests/core/injection.test.js.map +1 -0
  452. package/dist/tests/core/ledger.test.js +218 -0
  453. package/dist/tests/core/ledger.test.js.map +1 -0
  454. package/dist/tests/core/managed-image.test.js +68 -0
  455. package/dist/tests/core/managed-image.test.js.map +1 -0
  456. package/dist/tests/core/mise.test.js +138 -0
  457. package/dist/tests/core/mise.test.js.map +1 -0
  458. package/dist/tests/core/parse.test.js +174 -0
  459. package/dist/tests/core/parse.test.js.map +1 -0
  460. package/dist/tests/core/path.test.js +50 -0
  461. package/dist/tests/core/path.test.js.map +1 -0
  462. package/dist/tests/core/plan.test.js +218 -0
  463. package/dist/tests/core/plan.test.js.map +1 -0
  464. package/dist/tests/core/post-move.test.js +162 -0
  465. package/dist/tests/core/post-move.test.js.map +1 -0
  466. package/dist/tests/core/pr-classify.test.js +117 -0
  467. package/dist/tests/core/pr-classify.test.js.map +1 -0
  468. package/dist/tests/core/pr-decide.test.js +298 -0
  469. package/dist/tests/core/pr-decide.test.js.map +1 -0
  470. package/dist/tests/core/pr-loop.test.js +301 -0
  471. package/dist/tests/core/pr-loop.test.js.map +1 -0
  472. package/dist/tests/core/pr-notes.test.js +165 -0
  473. package/dist/tests/core/pr-notes.test.js.map +1 -0
  474. package/dist/tests/core/predicates.test.js +154 -0
  475. package/dist/tests/core/predicates.test.js.map +1 -0
  476. package/dist/tests/core/prompt.test.js +189 -0
  477. package/dist/tests/core/prompt.test.js.map +1 -0
  478. package/dist/tests/core/protocol.test.js +195 -0
  479. package/dist/tests/core/protocol.test.js.map +1 -0
  480. package/dist/tests/core/reconcile-issue.test.js +116 -0
  481. package/dist/tests/core/reconcile-issue.test.js.map +1 -0
  482. package/dist/tests/core/render.test.js +549 -0
  483. package/dist/tests/core/render.test.js.map +1 -0
  484. package/dist/tests/core/retry.test.js +186 -0
  485. package/dist/tests/core/retry.test.js.map +1 -0
  486. package/dist/tests/core/routes.test.js +247 -0
  487. package/dist/tests/core/routes.test.js.map +1 -0
  488. package/dist/tests/core/run-fold.test.js +299 -0
  489. package/dist/tests/core/run-fold.test.js.map +1 -0
  490. package/dist/tests/core/shape.test.js +185 -0
  491. package/dist/tests/core/shape.test.js.map +1 -0
  492. package/dist/tests/core/sleep-cycle.test.js +150 -0
  493. package/dist/tests/core/sleep-cycle.test.js.map +1 -0
  494. package/dist/tests/core/slots.test.js +201 -0
  495. package/dist/tests/core/slots.test.js.map +1 -0
  496. package/dist/tests/core/state-resolve.test.js +80 -0
  497. package/dist/tests/core/state-resolve.test.js.map +1 -0
  498. package/dist/tests/core/summary.test.js +200 -0
  499. package/dist/tests/core/summary.test.js.map +1 -0
  500. package/dist/tests/core/template.test.js +116 -0
  501. package/dist/tests/core/template.test.js.map +1 -0
  502. package/dist/tests/core/tick.test.js +558 -0
  503. package/dist/tests/core/tick.test.js.map +1 -0
  504. package/dist/tests/core/token-fold.test.js +176 -0
  505. package/dist/tests/core/token-fold.test.js.map +1 -0
  506. package/dist/tests/core/turn.test.js +388 -0
  507. package/dist/tests/core/turn.test.js.map +1 -0
  508. package/dist/tests/core/url.test.js +118 -0
  509. package/dist/tests/core/url.test.js.map +1 -0
  510. package/dist/tests/core/validate.test.js +247 -0
  511. package/dist/tests/core/validate.test.js.map +1 -0
  512. package/dist/tests/core/views.test.js +252 -0
  513. package/dist/tests/core/views.test.js.map +1 -0
  514. package/dist/tests/core/vm-decide.test.js +110 -0
  515. package/dist/tests/core/vm-decide.test.js.map +1 -0
  516. package/dist/tests/core/vm-guards.test.js +153 -0
  517. package/dist/tests/core/vm-guards.test.js.map +1 -0
  518. package/dist/tests/core/vm-plan.test.js +332 -0
  519. package/dist/tests/core/vm-plan.test.js.map +1 -0
  520. package/dist/tests/core/vm-reap.test.js +196 -0
  521. package/dist/tests/core/vm-reap.test.js.map +1 -0
  522. package/dist/tests/core/workflow-parse.test.js +493 -0
  523. package/dist/tests/core/workflow-parse.test.js.map +1 -0
  524. package/dist/tests/core/workspace-decide.test.js +236 -0
  525. package/dist/tests/core/workspace-decide.test.js.map +1 -0
  526. package/dist/tests/helpers/fixtures.js +167 -0
  527. package/dist/tests/helpers/fixtures.js.map +1 -0
  528. package/dist/tests/shell/acp-substrate.test.js +101 -0
  529. package/dist/tests/shell/acp-substrate.test.js.map +1 -0
  530. package/dist/tests/shell/actions-runner-push.test.js +203 -0
  531. package/dist/tests/shell/actions-runner-push.test.js.map +1 -0
  532. package/dist/tests/shell/credential-hooks.test.js +36 -0
  533. package/dist/tests/shell/credential-hooks.test.js.map +1 -0
  534. package/dist/tests/shell/credential-registry.test.js +165 -0
  535. package/dist/tests/shell/credential-registry.test.js.map +1 -0
  536. package/dist/tests/shell/credential-substrate.test.js +179 -0
  537. package/dist/tests/shell/credential-substrate.test.js.map +1 -0
  538. package/dist/tests/shell/dockerfile-mise-pin.test.js +51 -0
  539. package/dist/tests/shell/dockerfile-mise-pin.test.js.map +1 -0
  540. package/dist/tests/shell/doctor.test.js +101 -0
  541. package/dist/tests/shell/doctor.test.js.map +1 -0
  542. package/dist/tests/shell/effect-vm-create.test.js +52 -0
  543. package/dist/tests/shell/effect-vm-create.test.js.map +1 -0
  544. package/dist/tests/shell/gh-port.test.js +63 -0
  545. package/dist/tests/shell/gh-port.test.js.map +1 -0
  546. package/dist/tests/shell/gondolin-dispatch-guard.test.js +144 -0
  547. package/dist/tests/shell/gondolin-dispatch-guard.test.js.map +1 -0
  548. package/dist/tests/shell/gondolin-dispatch-shquote.test.js +168 -0
  549. package/dist/tests/shell/gondolin-dispatch-shquote.test.js.map +1 -0
  550. package/dist/tests/shell/gondolin-image-converter.test.js +208 -0
  551. package/dist/tests/shell/gondolin-image-converter.test.js.map +1 -0
  552. package/dist/tests/shell/gondolin-image-fetch.test.js +93 -0
  553. package/dist/tests/shell/gondolin-image-fetch.test.js.map +1 -0
  554. package/dist/tests/shell/http-handler.test.js +608 -0
  555. package/dist/tests/shell/http-handler.test.js.map +1 -0
  556. package/dist/tests/shell/http-server.test.js +53 -0
  557. package/dist/tests/shell/http-server.test.js.map +1 -0
  558. package/dist/tests/shell/mcp-runtime.test.js +366 -0
  559. package/dist/tests/shell/mcp-runtime.test.js.map +1 -0
  560. package/dist/tests/shell/mise-config-asset.test.js +87 -0
  561. package/dist/tests/shell/mise-config-asset.test.js.map +1 -0
  562. package/dist/tests/shell/orchestrator-loop.test.js +583 -0
  563. package/dist/tests/shell/orchestrator-loop.test.js.map +1 -0
  564. package/dist/tests/shell/reconciler-passes.test.js +314 -0
  565. package/dist/tests/shell/reconciler-passes.test.js.map +1 -0
  566. package/dist/tests/shell/runner-loop-turn.test.js +97 -0
  567. package/dist/tests/shell/runner-loop-turn.test.js.map +1 -0
  568. package/dist/tests/shell/runner-slice.test.js +536 -0
  569. package/dist/tests/shell/runner-slice.test.js.map +1 -0
  570. package/dist/tests/shell/scaffold.test.js +65 -0
  571. package/dist/tests/shell/scaffold.test.js.map +1 -0
  572. package/dist/tests/shell/tick-config.test.js +83 -0
  573. package/dist/tests/shell/tick-config.test.js.map +1 -0
  574. package/dist/tests/shell/tracker-parse-dates.test.js +44 -0
  575. package/dist/tests/shell/tracker-parse-dates.test.js.map +1 -0
  576. package/dist/tests/shell/tracker-write-issue.test.js +154 -0
  577. package/dist/tests/shell/tracker-write-issue.test.js.map +1 -0
  578. package/dist/tests/shell/workflow-prompt-split.test.js +208 -0
  579. package/dist/tests/shell/workflow-prompt-split.test.js.map +1 -0
  580. package/dist/tests/shell/workspace-live-config.test.js +140 -0
  581. package/dist/tests/shell/workspace-live-config.test.js.map +1 -0
  582. package/package.json +21 -9
  583. package/patches/@earendil-works+gondolin+0.12.0.patch +173 -0
  584. package/prompts/Reflect.md +91 -0
  585. package/prompts/Review.md +97 -0
  586. package/prompts/Todo.md +96 -0
  587. package/prompts/_footer.md +41 -0
  588. package/prompts/_preamble.md +42 -0
  589. package/prompts-minimal/Todo.md +26 -0
  590. package/scripts/postinstall.mjs +63 -0
  591. package/scripts/vm-agent.mjs +312 -90
  592. package/WORKFLOW.md +0 -744
  593. package/dist/acp-bridge.js +0 -324
  594. package/dist/acp-bridge.js.map +0 -1
  595. package/dist/actions/cache.js +0 -191
  596. package/dist/actions/cache.js.map +0 -1
  597. package/dist/actions/effects.js +0 -41
  598. package/dist/actions/effects.js.map +0 -1
  599. package/dist/actions/executor.js +0 -570
  600. package/dist/actions/executor.js.map +0 -1
  601. package/dist/actions/index.js +0 -13
  602. package/dist/actions/index.js.map +0 -1
  603. package/dist/actions/parsing.js.map +0 -1
  604. package/dist/actions/predicate-env.js +0 -27
  605. package/dist/actions/predicate-env.js.map +0 -1
  606. package/dist/actions/predicates.js +0 -49
  607. package/dist/actions/predicates.js.map +0 -1
  608. package/dist/actions/templating.js +0 -66
  609. package/dist/actions/templating.js.map +0 -1
  610. package/dist/actions/types.js +0 -15
  611. package/dist/actions/types.js.map +0 -1
  612. package/dist/agent/acp.js +0 -473
  613. package/dist/agent/acp.js.map +0 -1
  614. package/dist/agent/adapter-names.js +0 -159
  615. package/dist/agent/adapter-names.js.map +0 -1
  616. package/dist/agent/adapters.js +0 -511
  617. package/dist/agent/adapters.js.map +0 -1
  618. package/dist/agent/credential-extractors.js +0 -342
  619. package/dist/agent/credential-extractors.js.map +0 -1
  620. package/dist/agent/credential-secrets.js +0 -628
  621. package/dist/agent/credential-secrets.js.map +0 -1
  622. package/dist/agent/credential-ticker.js +0 -57
  623. package/dist/agent/credential-ticker.js.map +0 -1
  624. package/dist/agent/gondolin-creds-staging.js +0 -356
  625. package/dist/agent/gondolin-creds-staging.js.map +0 -1
  626. package/dist/agent/gondolin-dispatch.js +0 -375
  627. package/dist/agent/gondolin-dispatch.js.map +0 -1
  628. package/dist/agent/gondolin.js +0 -124
  629. package/dist/agent/gondolin.js.map +0 -1
  630. package/dist/agent/runner-decisions.js +0 -134
  631. package/dist/agent/runner-decisions.js.map +0 -1
  632. package/dist/agent/runner.js +0 -1456
  633. package/dist/agent/runner.js.map +0 -1
  634. package/dist/agent/tool-call-summary.js +0 -102
  635. package/dist/agent/tool-call-summary.js.map +0 -1
  636. package/dist/agent/vm-acp-mapping.js +0 -73
  637. package/dist/agent/vm-acp-mapping.js.map +0 -1
  638. package/dist/agent/vm-guards.js +0 -262
  639. package/dist/agent/vm-guards.js.map +0 -1
  640. package/dist/agent/vm-port.js +0 -22
  641. package/dist/agent/vm-port.js.map +0 -1
  642. package/dist/agent/vm-process-registry.js +0 -79
  643. package/dist/agent/vm-process-registry.js.map +0 -1
  644. package/dist/bin/cli-args.js +0 -105
  645. package/dist/bin/cli-args.js.map +0 -1
  646. package/dist/bin/symphony.js +0 -794
  647. package/dist/bin/symphony.js.map +0 -1
  648. package/dist/errors.js +0 -15
  649. package/dist/errors.js.map +0 -1
  650. package/dist/http-disk.js +0 -135
  651. package/dist/http-disk.js.map +0 -1
  652. package/dist/http-handlers.js.map +0 -1
  653. package/dist/http.js.map +0 -1
  654. package/dist/issues.js +0 -178
  655. package/dist/issues.js.map +0 -1
  656. package/dist/logging.js +0 -203
  657. package/dist/logging.js.map +0 -1
  658. package/dist/mcp.js +0 -706
  659. package/dist/mcp.js.map +0 -1
  660. package/dist/memory.js +0 -85
  661. package/dist/memory.js.map +0 -1
  662. package/dist/orchestrator-decisions.js +0 -331
  663. package/dist/orchestrator-decisions.js.map +0 -1
  664. package/dist/orchestrator.js +0 -1569
  665. package/dist/orchestrator.js.map +0 -1
  666. package/dist/prompt.js +0 -65
  667. package/dist/prompt.js.map +0 -1
  668. package/dist/reconciler/cache.js +0 -65
  669. package/dist/reconciler/cache.js.map +0 -1
  670. package/dist/reconciler/index.js +0 -448
  671. package/dist/reconciler/index.js.map +0 -1
  672. package/dist/reconciler/ledger.js +0 -131
  673. package/dist/reconciler/ledger.js.map +0 -1
  674. package/dist/reconciler/pr-adapters.js +0 -174
  675. package/dist/reconciler/pr-adapters.js.map +0 -1
  676. package/dist/reconciler/pr-decide.js.map +0 -1
  677. package/dist/reconciler/pr.js +0 -422
  678. package/dist/reconciler/pr.js.map +0 -1
  679. package/dist/reconciler/types.js +0 -12
  680. package/dist/reconciler/types.js.map +0 -1
  681. package/dist/reconciler/vm.js +0 -243
  682. package/dist/reconciler/vm.js.map +0 -1
  683. package/dist/reconciler/workspace-defaults.js +0 -83
  684. package/dist/reconciler/workspace-defaults.js.map +0 -1
  685. package/dist/reconciler/workspace.js +0 -272
  686. package/dist/reconciler/workspace.js.map +0 -1
  687. package/dist/runlog.js +0 -403
  688. package/dist/runlog.js.map +0 -1
  689. package/dist/scaffold.js +0 -165
  690. package/dist/scaffold.js.map +0 -1
  691. package/dist/trackers/local.js +0 -445
  692. package/dist/trackers/local.js.map +0 -1
  693. package/dist/trackers/types.js +0 -10
  694. package/dist/trackers/types.js.map +0 -1
  695. package/dist/types.js +0 -3
  696. package/dist/types.js.map +0 -1
  697. package/dist/util/clock.js +0 -12
  698. package/dist/util/clock.js.map +0 -1
  699. package/dist/util/crypto.js +0 -25
  700. package/dist/util/crypto.js.map +0 -1
  701. package/dist/util/frontmatter.js +0 -70
  702. package/dist/util/frontmatter.js.map +0 -1
  703. package/dist/util/fs-issues.js +0 -22
  704. package/dist/util/fs-issues.js.map +0 -1
  705. package/dist/util/process.js +0 -152
  706. package/dist/util/process.js.map +0 -1
  707. package/dist/util/workspace-key.js +0 -10
  708. package/dist/util/workspace-key.js.map +0 -1
  709. package/dist/workflow-loader.js +0 -147
  710. package/dist/workflow-loader.js.map +0 -1
  711. package/dist/workflow.js +0 -822
  712. package/dist/workflow.js.map +0 -1
  713. package/dist/workspace-types.js +0 -8
  714. package/dist/workspace-types.js.map +0 -1
  715. package/dist/workspace.js +0 -443
  716. package/dist/workspace.js.map +0 -1
@@ -0,0 +1,225 @@
1
+ // FCIS rewrite — reconciler-pass construction for the composition root (shell).
2
+ //
3
+ // Sliced out of src/shell/main.ts (mirroring main-adapters.ts) so the root keeps
4
+ // only the core-wiring under the max-lines budget. This module builds the three
5
+ // ReconcilerLoop passes (VM reaper / workspace janitor / PR autopilot) + the two
6
+ // effect appliers (applyKillStep / applyPrEffect) the central interpreter routes
7
+ // the `reaper` / `pr` families through. It imports NO core (only the root may) —
8
+ // every pure decider arrives already injected via `ReconcilerCoreDeps`.
9
+ //
10
+ // Each pass is the imperative shell of one resource: OBSERVE live state through
11
+ // the injected IO ports, DECIDE via the pure core decider, APPLY the returned
12
+ // effects/actions back through the ports, and project a ResourceSnapshot for the
13
+ // dashboard via the shared (pure) ledger reducer. The loop driver
14
+ // (reconciler-loop.ts) owns coalescing + ordering + the backstop timer only.
15
+ // The OBSERVE / apply-step / ledger primitives live in
16
+ // ./main-reconcilers-helpers; the PR sticky-cache applier in ./main-reconcilers-pr.
17
+ //
18
+ // Shell rule: imports from src/types/** ONLY. Concrete ports are injected.
19
+ import { buildPrApplier, EMPTY_PR_CACHE } from './main-reconcilers-pr.js';
20
+ import { applyKillLedger, buildApplyKillStep, collectPrIntents, firstActiveState, observeDesiredWorkspaces, observeHandoffMarkers, observeInspections, recordPrLedger, resolveBaseRefSha, sanitizeWorkspaceKey, } from './main-reconcilers-helpers.js';
21
+ /**
22
+ * Build the VM-reaper / workspace-janitor / PR-autopilot passes + the two
23
+ * appliers. Each pass observes → calls a pure core decider → applies through the
24
+ * ports → projects a ResourceSnapshot. Returns the appliers separately so the
25
+ * root can also inject them into the central EffectAdapters bundle (the
26
+ * interpreter's `reaper` / `pr` families).
27
+ */
28
+ export function buildReconcilerPasses(deps) {
29
+ const applyKillStep = buildApplyKillStep(deps);
30
+ const pr = buildPrApplier(deps);
31
+ const ledgers = {
32
+ vm: deps.core.createLedger('vm', 32),
33
+ workspace: deps.core.createLedger('workspace', 32),
34
+ pr: deps.core.createLedger('pr', 64),
35
+ };
36
+ return {
37
+ passes: {
38
+ vm: () => vmPass(deps, applyKillStep, ledgers),
39
+ workspace: () => workspacePass(deps, ledgers),
40
+ pr: () => prPass(deps, pr, ledgers),
41
+ },
42
+ applyKillStep,
43
+ applyPrEffect: pr.applyFamily,
44
+ };
45
+ }
46
+ // ─── VM reaper pass ─────────────────────────────────────────────────────────
47
+ async function vmPass(deps, applyKillStep, ledgers) {
48
+ const { core, log } = deps;
49
+ // gc STALE/dead-pid sessions first, then enumerate the LIVE set.
50
+ const observed = await observeVmSessions(deps);
51
+ let lastError = observed.error;
52
+ if (observed.sessions === null)
53
+ return core.ledgerResourceSnapshot(ledgers.vm, { ready: true, last_error: lastError });
54
+ const intendedLabels = new Set(deps.intended.inFlight().map((e) => e.sessionLabel));
55
+ const selfPid = deps.signal.selfPid();
56
+ const actions = core.decideVm({ sessions: observed.sessions, intendedLabels, selfPid });
57
+ if (actions.length > 0)
58
+ log.emit('info', 'vm reaper: killing orphan sessions', { orphans: actions.length });
59
+ for (const action of actions) {
60
+ const err = await driveKill(deps, applyKillStep, ledgers, action, selfPid);
61
+ if (err)
62
+ lastError = err;
63
+ }
64
+ return core.ledgerResourceSnapshot(ledgers.vm, { ready: true, last_error: lastError });
65
+ }
66
+ /** gc + live-session enumeration; `sessions === null` ⇒ enumeration failed (bail). */
67
+ async function observeVmSessions(deps) {
68
+ let error = null;
69
+ try {
70
+ const reaped = await deps.vm.gc();
71
+ if (reaped > 0)
72
+ deps.log.emit('info', 'vm reaper: gondolin gc collected stale sessions', { reaped });
73
+ }
74
+ catch (err) {
75
+ error = `gondolin gc failed: ${err.message}`;
76
+ deps.log.emit('warn', 'vm reaper: gondolin gc failed', { error: err.message });
77
+ }
78
+ try {
79
+ const sessions = (await deps.vm.listSessions()).filter((s) => s.alive).map((s) => ({ pid: s.pid, label: s.label }));
80
+ return { sessions, error };
81
+ }
82
+ catch (err) {
83
+ deps.log.emit('warn', 'vm reaper: session enumeration failed', { error: err.message });
84
+ return { sessions: null, error: `session enumeration failed: ${err.message}` };
85
+ }
86
+ }
87
+ /**
88
+ * Drive one session's SIGTERM→grace→probe→SIGKILL escalation: the pure
89
+ * beginKill/foldKillStep emit the next KillStep, applyKillStep performs its IO
90
+ * and returns the result the fold consumes. Bounded by the pure terminal-`done`
91
+ * state. Returns the terminal error message (if any) for the snapshot.
92
+ */
93
+ async function driveKill(deps, applyKillStep, ledgers, action, selfPid) {
94
+ let lastError = null;
95
+ let decision = deps.core.beginKill(action, selfPid);
96
+ ledgers.vm = applyKillLedger(ledgers.vm, decision, deps.core, deps.clock);
97
+ let guard = 0;
98
+ while (decision.next.kind !== 'done' && guard < 16) {
99
+ guard += 1;
100
+ const result = await applyKillStep(decision.next);
101
+ decision = deps.core.foldKillStep(decision.next, result);
102
+ ledgers.vm = applyKillLedger(ledgers.vm, decision, deps.core, deps.clock);
103
+ if (decision.ledger.op === 'error')
104
+ lastError = decision.ledger.message;
105
+ }
106
+ return lastError;
107
+ }
108
+ // ─── workspace janitor pass ─────────────────────────────────────────────────
109
+ async function workspacePass(deps, ledgers) {
110
+ const { core, log } = deps;
111
+ const cfg = deps.getCfg();
112
+ const routing = deps.derivePrRouting(cfg);
113
+ const obs = await observeWorkspaceState(deps, cfg);
114
+ if (obs.error !== null) {
115
+ log.emit('warn', 'workspace reconcile: observe failed', { error: obs.error });
116
+ return core.ledgerResourceSnapshot(ledgers.workspace, { ready: true, last_error: obs.error });
117
+ }
118
+ const decision = core.decideWorkspace({ ...obs.observation, prMergeState: routing.mergeState });
119
+ for (const l of decision.logs)
120
+ log.emit(l.level, l.message, l.fields);
121
+ let lastError = null;
122
+ for (const action of decision.actions)
123
+ lastError = (await applyWorkspaceAction(deps, ledgers, action, cfg)) ?? lastError;
124
+ for (const mark of decision.marks) {
125
+ ledgers.workspace = core.ledgerRecord(ledgers.workspace, `mark_${mark.status}:${mark.identifier}`, 'done', deps.clock.iso(), mark.reason);
126
+ }
127
+ if (decision.lastError)
128
+ lastError = decision.lastError;
129
+ return core.ledgerResourceSnapshot(ledgers.workspace, { ready: true, last_error: lastError });
130
+ }
131
+ /** Observe the workspace inputs; `error` set ⇒ fail closed (leave dirs untouched). */
132
+ async function observeWorkspaceState(deps, cfg) {
133
+ const empty = { desired: [], observed: [], baseRefSha: null, inspections: {}, handoffPending: new Set() };
134
+ let desired;
135
+ try {
136
+ desired = await observeDesiredWorkspaces(deps, cfg);
137
+ }
138
+ catch (err) {
139
+ return { error: `active_fetch_failed: ${err.message}`, observation: empty };
140
+ }
141
+ let observed;
142
+ try {
143
+ observed = await deps.workspace.list();
144
+ }
145
+ catch (err) {
146
+ return { error: `workspace_root_read_failed: ${err.message}`, observation: empty };
147
+ }
148
+ const baseRefSha = await resolveBaseRefSha(deps, cfg);
149
+ const inspections = baseRefSha === null ? {} : await observeInspections(deps, cfg, desired, observed);
150
+ const handoffPending = await observeHandoffMarkers(deps, desired, observed);
151
+ return { error: null, observation: { desired, observed, baseRefSha, inspections, handoffPending } };
152
+ }
153
+ /** Apply one create/remove workspace action through the port; ledger + return any error. */
154
+ async function applyWorkspaceAction(deps, ledgers, action, cfg) {
155
+ const { core, clock } = deps;
156
+ const isRemove = action.kind === 'remove_workspace';
157
+ const key = isRemove ? `remove_workspace:${action.identifier}` : `create_workspace:${sanitizeWorkspaceKey(action.identifier)}`;
158
+ ledgers.workspace = core.ledgerStart(ledgers.workspace, key, clock.iso());
159
+ try {
160
+ if (isRemove)
161
+ await deps.workspace.remove(action.identifier, 'stale_issue');
162
+ else
163
+ await deps.workspace.ensureFor(action.identifier, { baseBranch: cfg.workspace.base_branch, githubRepo: cfg.workspace.github_repo });
164
+ ledgers.workspace = core.ledgerDone(ledgers.workspace, key, clock.iso());
165
+ return null;
166
+ }
167
+ catch (err) {
168
+ const msg = err.message;
169
+ ledgers.workspace = core.ledgerError(ledgers.workspace, key, msg, clock.iso());
170
+ return msg;
171
+ }
172
+ }
173
+ // ─── PR autopilot pass ──────────────────────────────────────────────────────
174
+ async function prPass(deps, pr, ledgers) {
175
+ const cfg = deps.getCfg();
176
+ if (!cfg.pr.enabled)
177
+ return null;
178
+ const routing = deps.derivePrRouting(cfg);
179
+ if (routing.mergeState === null && routing.closeState === null)
180
+ return null;
181
+ const intents = await collectPrIntents(deps, cfg, routing);
182
+ pr.dropExcept(new Set(intents.map((i) => i.identifier)));
183
+ let lastError = null;
184
+ for (const intent of intents) {
185
+ try {
186
+ await drivePrIntent(deps, pr, ledgers, intent, routing);
187
+ }
188
+ catch (err) {
189
+ lastError = err.message;
190
+ deps.log.emit('warn', 'pr reconcile: per-issue pass threw', { identifier: intent.identifier, error: lastError });
191
+ }
192
+ }
193
+ return deps.core.ledgerResourceSnapshot(ledgers.pr, { ready: true, last_error: lastError });
194
+ }
195
+ async function drivePrIntent(deps, pr, ledgers, intent, routing) {
196
+ const { core, clock } = deps;
197
+ let obs = freshObservation(deps, intent, routing);
198
+ for (let i = 0; i < core.maxPrDecideIterations; i += 1) {
199
+ const effects = core.decidePr(obs);
200
+ if (effects.length === 0)
201
+ return;
202
+ for (const effect of effects) {
203
+ ledgers.pr = recordPrLedger(ledgers.pr, effect, 'start', clock, core);
204
+ const outcome = await pr.apply(intent, effect);
205
+ ledgers.pr = recordPrLedger(ledgers.pr, effect, 'done', clock, core);
206
+ obs = core.foldPrEffectOutcome(obs, effect, outcome);
207
+ }
208
+ }
209
+ deps.log.emit('warn', 'pr reconcile: decide loop iteration cap reached', { identifier: intent.identifier });
210
+ }
211
+ function freshObservation(deps, intent, routing) {
212
+ return {
213
+ intent,
214
+ cache: EMPTY_PR_CACHE,
215
+ summaryResolved: false,
216
+ summary: null,
217
+ viewResolved: false,
218
+ view: null,
219
+ closeAttempted: false,
220
+ closeOutcome: null,
221
+ halt: false,
222
+ config: { strategy: routing.strategy, conflictRouteTo: routing.conflictRouteTo ?? firstActiveState(deps.getCfg()) },
223
+ };
224
+ }
225
+ //# sourceMappingURL=main-reconcilers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main-reconcilers.js","sourceRoot":"","sources":["../../../src/shell/main-reconcilers.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,EAAE;AACF,iFAAiF;AACjF,gFAAgF;AAChF,iFAAiF;AACjF,iFAAiF;AACjF,iFAAiF;AACjF,wEAAwE;AACxE,EAAE;AACF,gFAAgF;AAChF,8EAA8E;AAC9E,iFAAiF;AACjF,kEAAkE;AAClE,6EAA6E;AAC7E,uDAAuD;AACvD,oFAAoF;AACpF,EAAE;AACF,2EAA2E;AAa3E,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,wBAAwB,EACxB,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,+BAA+B,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAwB;IAC5D,MAAM,aAAa,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG;QACd,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;QACpC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC;QAClD,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;KACrC,CAAC;IACF,OAAO;QACL,MAAM,EAAE;YACN,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC;YAC9C,SAAS,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC;YAC7C,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC;SACpC;QACD,aAAa;QACb,aAAa,EAAE,EAAE,CAAC,WAAW;KAC9B,CAAC;AACJ,CAAC;AASD,+EAA+E;AAE/E,KAAK,UAAU,MAAM,CAAC,IAAwB,EAAE,aAA+C,EAAE,OAAgB;IAC/G,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC3B,iEAAiE;IACjE,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC/B,IAAI,QAAQ,CAAC,QAAQ,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;IAEvH,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;IACpF,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC;IACxF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,oCAAoC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE5G,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC3E,IAAI,GAAG;YAAE,SAAS,GAAG,GAAG,CAAC;IAC3B,CAAC;IACD,OAAO,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;AACzF,CAAC;AAED,sFAAsF;AACtF,KAAK,UAAU,iBAAiB,CAAC,IAAwB;IACvD,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,IAAI,MAAM,GAAG,CAAC;YAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,iDAAiD,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACvG,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,GAAG,uBAAwB,GAAa,CAAC,OAAO,EAAE,CAAC;QACxD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,+BAA+B,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5F,CAAC;IACD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACpH,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,uCAAuC,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAClG,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,+BAAgC,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC;IAC5F,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,SAAS,CACtB,IAAwB,EACxB,aAA+C,EAC/C,OAAgB,EAChB,MAAyB,EACzB,OAAe;IAEf,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,IAAI,QAAQ,GAAqB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtE,OAAO,CAAC,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1E,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;QACnD,KAAK,IAAI,CAAC,CAAC;QACX,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClD,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzD,OAAO,CAAC,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1E,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,OAAO;YAAE,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;IAC1E,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,+EAA+E;AAE/E,KAAK,UAAU,aAAa,CAAC,IAAwB,EAAE,OAAgB;IACrE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IAE1C,MAAM,GAAG,GAAG,MAAM,qBAAqB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACnD,IAAI,GAAG,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QACvB,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,qCAAqC,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9E,OAAO,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IAChG,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE,YAAY,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAChG,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,IAAI;QAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IAEtE,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,OAAO;QAAE,SAAS,GAAG,CAAC,MAAM,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC;IACzH,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5I,CAAC;IACD,IAAI,QAAQ,CAAC,SAAS;QAAE,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;IACvD,OAAO,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;AAChG,CAAC;AAED,sFAAsF;AACtF,KAAK,UAAU,qBAAqB,CAClC,IAAwB,EACxB,GAAkB;IAElB,MAAM,KAAK,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,GAAG,EAAU,EAAE,CAAC;IAClH,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,wBAAwB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,KAAK,EAAE,wBAAyB,GAAa,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IACzF,CAAC;IACD,IAAI,QAAQ,CAAC;IACb,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,KAAK,EAAE,+BAAgC,GAAa,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IAChG,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACtG,MAAM,cAAc,GAAG,MAAM,qBAAqB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC5E,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE,CAAC;AACtG,CAAC;AAED,4FAA4F;AAC5F,KAAK,UAAU,oBAAoB,CACjC,IAAwB,EACxB,OAAgB,EAChB,MAA6E,EAC7E,GAAkB;IAElB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,KAAK,kBAAkB,CAAC;IACpD,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,oBAAoB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,oBAAoB,oBAAoB,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;IAC/H,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1E,IAAI,CAAC;QACH,IAAI,QAAQ;YAAE,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;;YACvE,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QACzI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAI,GAAa,CAAC,OAAO,CAAC;QACnC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/E,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED,+EAA+E;AAE/E,KAAK,UAAU,MAAM,CAAC,IAAwB,EAAE,EAAa,EAAE,OAAgB;IAC7E,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC1B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAE5E,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAC3D,EAAE,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAEzD,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,GAAI,GAAa,CAAC,OAAO,CAAC;YACnC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,oCAAoC,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACnH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;AAC9F,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAwB,EAAE,EAAa,EAAE,OAAgB,EAAE,MAAgB,EAAE,OAAkB;IAC1H,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAC7B,IAAI,GAAG,GAAG,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACvD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACjC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,OAAO,CAAC,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YACtE,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC/C,OAAO,CAAC,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YACrE,GAAG,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,iDAAiD,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;AAC9G,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAwB,EAAE,MAAgB,EAAE,OAAkB;IACtF,OAAO;QACL,MAAM;QACN,KAAK,EAAE,cAAc;QACrB,eAAe,EAAE,KAAK;QACtB,OAAO,EAAE,IAAI;QACb,YAAY,EAAE,KAAK;QACnB,IAAI,EAAE,IAAI;QACV,cAAc,EAAE,KAAK;QACrB,YAAY,EAAE,IAAI;QAClB,IAAI,EAAE,KAAK;QACX,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;KACpH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,355 @@
1
+ // FCIS rewrite — RUNNER-slice construction for the composition root (kind: shell).
2
+ //
3
+ // THE CAPSTONE WIRING. Replaces the `runWorker: async () => undefined` stub with a
4
+ // real per-dispatch worker: it builds the per-attempt `RunnerLoopDeps` (the
5
+ // workspace→VM→ACP→turn-loop→actions pipeline `runAttempt` drives), the terminal-
6
+ // actions runner, the SINGLE dispatcher-backed VM bring-up (the real
7
+ // `GondolinDispatcher`: stages the guest files INCL. the vm-agent.mjs launcher,
8
+ // builds the `{ tcp: { hosts }, dns }` tunnel, runs the BYO probe + the §2a security
9
+ // mount guard, registers the per-VM egress secret, and launches the agent), and the
10
+ // DispatchRunner (`runWorker`) the orchestrator loop spawns per dispatch.
11
+ //
12
+ // PER-DISPATCH BRACKETING (the contract the task pins):
13
+ // • MCP lifecycle: an `mcp` activate effect at bring-up (mints the per-dispatch
14
+ // bearer the guest's tools/call authenticates with; the token rides back on the
15
+ // EffectResult) and an `mcp` deactivate effect at teardown (entry removed + parked
16
+ // steering cancelled). Both cross the CENTRAL interpreter, NOT a direct poke on the
17
+ // runtime read surface (the app-db one-mutation-seam rule).
18
+ // • ACP dispatch context: registered (vmId → issue/workspace + the MCP server set)
19
+ // when the VM comes up so `sessionNew(vmId)` resolves; deregistered at teardown.
20
+ // • the SECURITY mount guard fires IMMEDIATELY before createVm (host-only-refresh),
21
+ // over BOTH the lexical AND the realpath-resolved mount set (symlink bypass).
22
+ // • ONE AdapterCredentialSpec per dispatch threaded through guest staging + the
23
+ // egress hooks (placeholder parity), keyed on the LIVE token (codex route active).
24
+ //
25
+ // Core-free: imports src/types + sibling shell ONLY — every pure decider arrives
26
+ // injected via `input.core` (only the composition root imports core).
27
+ import os from 'node:os';
28
+ import { realpath } from 'node:fs/promises';
29
+ import { runAttempt } from './runner-loop.js';
30
+ import { createActionsRunner } from './actions-runner.js';
31
+ import { GondolinDispatcher } from './adapter/gondolin-dispatch.js';
32
+ /**
33
+ * Build the runner slice: returns the `runWorker` DispatchRunner the orchestrator
34
+ * loop calls per dispatch plan. Everything per-dispatch (adapter resolution, the
35
+ * single dispatcher-backed VM bring-up, the MCP/ACP bracketing) is captured in a
36
+ * closure so the loop just hands it `(plan, entry, cancel)`.
37
+ */
38
+ export function buildRunnerSlice(input) {
39
+ const actions = createActionsRunner({
40
+ core: input.core.actions,
41
+ interpreter: input.ports.interpreter,
42
+ clock: input.ports.clock,
43
+ log: input.ports.log,
44
+ runlog: input.ports.runlog,
45
+ cfg: input.getLiveCfg,
46
+ readEnv: input.readEnv,
47
+ });
48
+ const runWorker = async (plan, entry, cancel) => {
49
+ await runOneDispatch(input, actions, plan, entry, cancel);
50
+ };
51
+ return { runWorker };
52
+ }
53
+ // ─── one dispatch: activate MCP, run the attempt, deactivate, report exit ──────
54
+ async function runOneDispatch(input, actions, plan, entry, cancel) {
55
+ const { core, substrates } = input;
56
+ // Pin the dispatch-time actor on the entry (RunningEntry.resolved_actor) so the
57
+ // dashboard + breaker-trip moves carry `<adapter>/<model>` (§2c resolveActorString).
58
+ const cfg = input.getLiveCfg();
59
+ entry.resolved_actor = core.resolveActorString(cfg.states, cfg.acp.adapter, cfg.acp.model, entry.issue.state);
60
+ // MCP activate at bring-up: mint the per-dispatch bearer the in-VM agent's
61
+ // tools/call authenticates with. The bearer + the synthetic-guest MCP URL form
62
+ // the MCP server descriptor the ACP session advertises.
63
+ const mcpServers = await activateMcp(input, entry);
64
+ // Register the `/acp` WS registration NOW — BEFORE the agent launches — so the
65
+ // dial-back token in the launch env matches a pending registration the guest dials
66
+ // back against. The returned `acpReg.token` is threaded into the VmPlan launch env
67
+ // (buildRunnerDeps → runAttempt → buildVmPlan), and `acpReg.accepted` is carried
68
+ // into the ACP dispatch context so `sessionNew` CONSUMES it (it must NOT register a
69
+ // second, divergent token — that late-registration race was the dial-back rejection).
70
+ const acpReg = substrates.acpRegistry.register(entry.issue_id, entry.identifier);
71
+ // ONE AdapterCredentialSpec per dispatch (codex HIGH): the randomized placeholder
72
+ // is built ONCE and memoized, then threaded through BOTH guest staging (→ buildVmPlan)
73
+ // AND the egress substitution hooks, so the guest placeholder and the substitution
74
+ // placeholder can never diverge. Keyed by adapter (one per dispatch in practice).
75
+ const specFor = buildDispatchSpec(input);
76
+ const credStager = buildCredStager(input, specFor);
77
+ const bringUp = buildBringUp(input, entry, mcpServers, specFor, acpReg);
78
+ let outcome;
79
+ try {
80
+ const deps = buildRunnerDeps(input, credStager, actions, bringUp, cfg, acpReg.token);
81
+ outcome = await runAttemptSafely(input, deps, entry, cancel);
82
+ }
83
+ finally {
84
+ // Teardown bracket: MCP deactivate + ACP context deregister always run, even on
85
+ // a thrown attempt, so a dispatch's control-plane registrations never leak. Cancel
86
+ // the WS registration too so a dispatch that tore down before the guest connected
87
+ // doesn't leave a pending registration (and its unsettled `accepted` promise) behind.
88
+ // The deactivate crosses the seam as an `mcp` effect (removes the active entry +
89
+ // cancels any parked steering inside the runtime) — never a direct poke.
90
+ await input.ports.interpreter.execute({ family: 'mcp', kind: 'deactivate', identifier: entry.identifier });
91
+ deregisterAcpContext(input, entry);
92
+ acpReg.cancel('dispatch_ended');
93
+ }
94
+ reportWorkerExit(input, plan, entry, outcome.ok, outcome.reason, outcome.turnsCompleted);
95
+ }
96
+ /**
97
+ * Per-dispatch ONE-spec resolver (codex HIGH fix). `buildAdapterSpec` mints a fresh
98
+ * RANDOM placeholder each call, so calling it twice in a dispatch (once for guest
99
+ * staging, once for egress hooks) yields two different placeholders → the egress
100
+ * substitution never matches the guest's bearer. This memoizes the spec per adapter
101
+ * for the dispatch so the SAME `AdapterCredentialSpec` is threaded everywhere.
102
+ */
103
+ function buildDispatchSpec(input) {
104
+ const cache = new Map();
105
+ return (adapter) => {
106
+ const hit = cache.get(adapter);
107
+ if (hit)
108
+ return hit;
109
+ const spec = input.substrates.credential.buildAdapterSpec(adapter);
110
+ cache.set(adapter, spec);
111
+ return spec;
112
+ };
113
+ }
114
+ /** Run one attempt, converting a thrown worker into an abnormal-exit outcome. */
115
+ async function runAttemptSafely(input, deps, entry, cancel) {
116
+ try {
117
+ const result = await runAttempt(deps, entry.issue, entry.retry_attempt, cancel, entry);
118
+ if (result.threadId)
119
+ entry.thread_id = result.threadId;
120
+ entry.turn_count = result.turnsCompleted;
121
+ return { ok: result.ok, reason: result.reason, turnsCompleted: result.turnsCompleted };
122
+ }
123
+ catch (err) {
124
+ input.ports.log.withIssue(entry.issue_id).emit('error', 'runner worker threw', { error: err.message });
125
+ return { ok: false, reason: err.message, turnsCompleted: 0 };
126
+ }
127
+ }
128
+ /** MCP activate → the guest MCP server descriptor (bearer + synthetic-guest URL). */
129
+ async function activateMcp(input, entry) {
130
+ const cfg = input.getLiveCfg();
131
+ if (!cfg.mcp.enabled)
132
+ return [];
133
+ // Cross the seam: the central interpreter performs the `mcp` activate effect
134
+ // (registers the live entry + mints the bearer) and hands the token back on the
135
+ // EffectResult — the runner never pokes the runtime's active-entry map directly.
136
+ const res = await input.ports.interpreter.execute({ family: 'mcp', kind: 'activate', entry });
137
+ const token = 'kind' in res && res.kind === 'mcp_activated' ? res.token : null;
138
+ if (!token) {
139
+ input.ports.log.withIssue(entry.issue_id).emit('warn', 'mcp activate produced no bearer; tools/call disabled', {
140
+ reason: 'error' in res ? res.error : 'unexpected effect result',
141
+ });
142
+ return [];
143
+ }
144
+ entry.mcp_token = token;
145
+ const url = input.core.guestMcpUrl(entry.identifier, { host: cfg.mcp.host, explicit_host_url: cfg.mcp.explicit_host_url }, input.boundMcpPort());
146
+ if (!url) {
147
+ input.ports.log.withIssue(entry.issue_id).emit('warn', 'mcp enabled but no reachable url', {
148
+ host: cfg.mcp.host,
149
+ explicit_host_url: cfg.mcp.explicit_host_url,
150
+ });
151
+ return [];
152
+ }
153
+ return [{ type: 'http', name: 'symphony', url, headers: [{ name: 'Authorization', value: `Bearer ${token}` }] }];
154
+ }
155
+ /** Deregister the ACP dispatch context for every vm id this dispatch registered. */
156
+ function deregisterAcpContext(input, entry) {
157
+ const vmId = vmIdFor.get(entry.issue_id);
158
+ if (vmId) {
159
+ input.substrates.acpContext.deregister(vmId);
160
+ vmIdFor.delete(entry.issue_id);
161
+ }
162
+ }
163
+ /** issueId → live vmId, set by the credential-aware VmClient at createVm. */
164
+ const vmIdFor = new Map();
165
+ /** Fold the attempt outcome into the orchestrator's worker-exit reducer event. */
166
+ function reportWorkerExit(input, plan, entry, ok, reason, turnsCompleted) {
167
+ if (entry.last_transition)
168
+ input.ports.runlog.system(entry.issue_id, 'transition', { ...entry.last_transition });
169
+ input.ports.runlog.system(entry.issue_id, 'attempt_ended', { ok, reason, turns_completed: turnsCompleted });
170
+ // TODO(compose) §2h: emit `write_summary` here so the sibling `*.summary.json` is
171
+ // written (core summarizeRunLog → RunLogStore.writeSummary). DEFERRED, not cheap:
172
+ // summarizeRunLog needs the per-issue accumulated trajectory (the buffered .jsonl
173
+ // entries), which FsRunLogStore owns internally and does NOT yet surface. Wiring
174
+ // it means (a) exposing the accumulator off the runlog store and (b) injecting the
175
+ // core summarizeRunLog into this slice. The .jsonl is written today; only the
176
+ // reflector's sibling summary is absent. Tracked as the §2h gap.
177
+ // The orchestrator loop owns the running map + onWorkerExit; it injects the exit
178
+ // reporter so the runner slice stays decoupled from the loop's internals.
179
+ input.onWorkerExit({
180
+ kind: 'worker_exit',
181
+ issueId: entry.issue_id,
182
+ identifier: entry.identifier,
183
+ normal: ok,
184
+ reason,
185
+ priorAttempt: entry.retry_attempt,
186
+ targetState: entry.issue.state,
187
+ progress: { issue_id: entry.issue_id, identifier: entry.identifier, last_transition: entry.last_transition },
188
+ trackerRootAtDispatch: entry.tracker_root_at_dispatch,
189
+ resolvedActor: entry.resolved_actor || null,
190
+ });
191
+ }
192
+ // ─── the single VM bring-up path (GondolinDispatcher: stage+probe+tunnel+guard) ─
193
+ /**
194
+ * Build the per-dispatch VM bring-up backed by the REAL {@link GondolinDispatcher} —
195
+ * the ONE bring-up path (codex CRITICAL: the old bespoke VmClient skipped guest-file
196
+ * staging, the BYO probe, and the `{ tcp: { hosts }, dns }` tunnel shape). Per call
197
+ * it: builds the per-VM egress hooks keyed on the LIVE token (so the codex
198
+ * chatgpt-backend route is active — codex CRITICAL #2), constructs a dispatcher whose
199
+ * mount guard ALSO resolves symlinks (codex HIGH #3), and dispatches the core-built
200
+ * VmPlan. The ACP dispatch context is registered the moment the VM exists (onVmCreated),
201
+ * and the returned `teardown` releases the VM + the per-VM secret registration.
202
+ */
203
+ function buildBringUp(input, entry, mcpServers, specFor, acpReg) {
204
+ const { core, ports, substrates } = input;
205
+ const dispatcher = new GondolinDispatcher(ports.baseVm, substrates.credential.registry, core.assertNoCredentialMounts, resolveMountRealpath, core.byoProbeFailureMessage, core.byoProbeScript, core.miseInstallFailureMessage, core.hasProjectMiseConfig, ports.log);
206
+ return {
207
+ bringUp: async (req) => {
208
+ // The live credential keys the codex chatgpt-backend route swap (PR#119) — the
209
+ // REAL token lands ONLY in the egress SecretManager + the route hook (host side),
210
+ // NEVER in the guest (the guest holds the placeholder from the SAME spec).
211
+ const token = await resolveLiveToken(ports, req.adapterId);
212
+ const egress = buildEgress(input, req.adapterId, specFor(req.adapterId), token);
213
+ const opts = {
214
+ plan: req.plan,
215
+ launchEnv: req.launchEnv,
216
+ // The probe resolves the ADAPTER CLI name on PATH — NOT the launcher path
217
+ // (plan.agentCommand is `[node, launcher]`). core threads the CLI name into
218
+ // launchEnv.SYMPHONY_ADAPTER_BIN (same value the launcher spawns); fall back
219
+ // to the adapter id only if absent.
220
+ adapterBin: req.launchEnv.SYMPHONY_ADAPTER_BIN ?? req.adapterId,
221
+ workdir: req.workspacePath,
222
+ egress,
223
+ onStderr: req.onStderr,
224
+ onVmCreated: (vmId) => {
225
+ vmIdFor.set(entry.issue_id, vmId);
226
+ // Carry the dial-back stream of the WS registration created BEFORE bring-up so
227
+ // `sessionNew(vmId)` CONSUMES the same `accepted` the guest (presenting the
228
+ // launch-env token) resolves — no second, mismatched registration.
229
+ substrates.acpContext.register(vmId, {
230
+ issueId: entry.issue_id,
231
+ identifier: entry.identifier,
232
+ workspacePath: req.workspacePath || entry.workspace_path,
233
+ mcpServers,
234
+ accepted: acpReg.accepted,
235
+ cancelAccept: acpReg.cancel,
236
+ });
237
+ },
238
+ };
239
+ const handle = await dispatcher.dispatch(opts);
240
+ return { vm: handle.vm, exec: handle.exec, teardown: () => handle.teardown() };
241
+ },
242
+ };
243
+ }
244
+ /** Resolve the live host credential for this dispatch (null = none / will 401 visibly). */
245
+ async function resolveLiveToken(ports, adapter) {
246
+ try {
247
+ return await ports.credentialPort.probe(adapter);
248
+ }
249
+ catch (err) {
250
+ ports.log.emit('warn', 'credential probe failed; egress route built without live token', {
251
+ adapter, error: err.message,
252
+ });
253
+ return null;
254
+ }
255
+ }
256
+ /**
257
+ * Build the per-dispatch egress hooks + secret manager from the ONE shared spec.
258
+ * The live `token` keys the codex chatgpt-backend route swap (PR#119); the secret
259
+ * substitution + egress audit are wired inside the substrate. The SAME spec.placeholder
260
+ * is staged into the guest (buildFakeCreds) so the substitution matches at egress.
261
+ */
262
+ function buildEgress(input, adapterId, spec, token) {
263
+ const { credential } = input.substrates;
264
+ const hooksConfig = credential.buildHooksConfig([spec], input.getLiveCfg().egress.allowed_hosts);
265
+ const result = credential.buildPerVmHooks({
266
+ adapterId,
267
+ secretName: spec.secretName,
268
+ placeholder: spec.placeholder,
269
+ substitutionHosts: spec.substitutionHosts,
270
+ allowedHosts: hooksConfig.allowedHosts,
271
+ token,
272
+ });
273
+ return {
274
+ httpHooks: result.httpHooks,
275
+ secretManager: result.secretManager,
276
+ secretName: spec.secretName,
277
+ adapterId,
278
+ };
279
+ }
280
+ /**
281
+ * Symlink-resolving mount canonicalizer (IO) injected into the dispatcher's guard so
282
+ * a symlink whose lexical path is benign but whose target overlaps a credential dir
283
+ * is still rejected (codex HIGH). A non-existent path resolves to itself (it can't be
284
+ * mounted anyway — the lexical check then governs).
285
+ */
286
+ const resolveMountRealpath = async (hostPath) => {
287
+ try {
288
+ return await realpath(hostPath);
289
+ }
290
+ catch {
291
+ return hostPath;
292
+ }
293
+ };
294
+ // ─── per-adapter fake-cred staging (CredStager) ────────────────────────────────
295
+ /**
296
+ * Build the CredStager from the per-dispatch shared spec resolver: the guest is
297
+ * staged the placeholder-only fake creds keyed on the SAME `AdapterCredentialSpec`
298
+ * the egress hooks substitute (codex HIGH #4 — one spec, threaded everywhere).
299
+ */
300
+ function buildCredStager(input, specFor) {
301
+ const { credential } = input.substrates;
302
+ return {
303
+ stageFakeCreds: async (adapter) => {
304
+ const spec = specFor(adapter);
305
+ const [claudeIdentity, codexIdentity] = await Promise.all([
306
+ input.ports.credentialPort.readClaudeIdentity(),
307
+ input.ports.credentialPort.readCodexIdentity(),
308
+ ]);
309
+ return credential.buildFakeCreds({ adapter, placeholder: spec.placeholder, secretName: spec.secretName, claudeIdentity, codexIdentity });
310
+ },
311
+ };
312
+ }
313
+ // ─── per-attempt RunnerLoopDeps assembly ───────────────────────────────────────
314
+ function buildRunnerDeps(input, credStager, actions, bringUp, cfg, acpToken) {
315
+ const { core, ports, substrates } = input;
316
+ return {
317
+ cfg,
318
+ workflow: input.getWorkflow(),
319
+ core: core.loop,
320
+ workspaces: ports.workspaces,
321
+ tracker: ports.tracker,
322
+ bringUp,
323
+ acp: ports.acp,
324
+ adapters: ports.adapters,
325
+ actions,
326
+ credStager,
327
+ steering: substrates.mcp.steering,
328
+ // Teardown's steering.cancel rides the SAME central interpreter the HTTP reply path
329
+ // does (issue 200): emit the Effect through ports.interpreter, never poke the awaiter.
330
+ performSteering: (effect) => ports.interpreter.execute(effect),
331
+ runlog: ports.runlog,
332
+ log: ports.log,
333
+ clock: ports.clock,
334
+ random: ports.random,
335
+ launcherSource: input.launcherSource,
336
+ // The symphony-bundled mise SYSTEM config source (issue 209), read off host disk
337
+ // once at startup; core always stages it at /etc/mise/config.toml (issue 233).
338
+ miseSystemConfigSource: input.miseSystemConfigSource,
339
+ // The pre-minted ACP bearer (AcpWsRegistry.register) — the SAME token the
340
+ // dial-back registration is keyed on (unified-token fix).
341
+ acpToken,
342
+ boundMcpPort: input.boundMcpPort(),
343
+ resolvedNodeBin: input.resolvedNodeBin(),
344
+ allowWebSockets: (adapter) => adapter === 'codex',
345
+ // In-session 401 recovery (issue 214): refresh the host token + fan it out into the
346
+ // live VM's SecretManager, reporting whether a fresh token landed.
347
+ refreshCredential: (adapter) => substrates.credential.refreshCredential(adapter),
348
+ // Resolved at dispatch time (issue 206): the asset auto-converted from
349
+ // `gondolin.oci_image`, or null when inactive / not yet ready. buildVmPlan uses
350
+ // it as the boot imagePath only when the `gondolin.image` escape hatch is unset.
351
+ convertedImageSelector: input.resolveImageSelector?.() ?? null,
352
+ readEnv: input.readEnv,
353
+ };
354
+ }
355
+ //# sourceMappingURL=main-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main-runner.js","sourceRoot":"","sources":["../../../src/shell/main-runner.ts"],"names":[],"mappings":"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"}