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
@@ -0,0 +1,197 @@
1
+ // FCIS rewrite — ACP-over-WebSocket transport adapter (kind: adapter).
2
+ //
3
+ // Host-side `/acp` endpoint on the unified HTTP server. Replaces the retired raw-TCP
4
+ // `AcpBridge`: the in-VM agent's ACP control channel rides a WebSocket `Upgrade` on the
5
+ // SAME node:http server that serves the dashboard + MCP JSON-RPC. ACP reuses the MCP
6
+ // `tcp.hosts` tunnel (guest dials `ws://symphony-mcp:7001/acp`).
7
+ //
8
+ // This is legitimately the SHELL: it is pure RFC-6455 wire mechanics + socket lifecycle
9
+ // with no domain DECISIONS to push into core (frame encode/decode in acp-ws-frames.ts,
10
+ // socket lifecycle in acp-ws-conn.ts, the constant-time bearer match here). The ONE FCIS
11
+ // adaptation versus the reference (src/acp-ws.ts) is that the process-global `log` is
12
+ // replaced by an injected `LogSink` port. Lifecycle (mirrors the reference exactly):
13
+ // 1. Orchestrator calls registry.register(issueId, identifier) BEFORE launching the VM →
14
+ // { token, accepted, cancel }; token goes into the launch env as SYMPHONY_ACP_TOKEN.
15
+ // 2. In-VM vm-agent.mjs dials ws://…/acp and sends {type:'auth',token} as its FIRST WS
16
+ // message (WHATWG client cannot set custom upgrade headers).
17
+ // 3. handleUpgrade completes the handshake; the per-connection AcpWsConnection decodes
18
+ // frames incrementally, validates the token constant-time against a pending
19
+ // registration, then resolves `accepted` with a Duplex byte stream OR closes 1008.
20
+ // 4. A transport fault (heartbeat-timeout / oversized frame) ends the Duplex inbound side
21
+ // so the runner classifies the resulting prompt rejection as a transport_error (feeds
22
+ // isTransportError → the critic gap / circuit breaker). No NEW teardown semantics.
23
+ import { randomBytes, timingSafeEqual } from 'node:crypto';
24
+ import { AcpWsConnection } from './acp-ws-conn.js';
25
+ import { computeAccept } from './acp-ws-frames.js';
26
+ const DEFAULT_AUTH_TIMEOUT_MS = 10_000;
27
+ const DEFAULT_HEARTBEAT_INTERVAL_MS = 15_000;
28
+ const DEFAULT_HEARTBEAT_TIMEOUT_MS = 45_000;
29
+ const NOOP_LOG = {
30
+ emit: () => undefined,
31
+ withIssue() {
32
+ return NOOP_LOG;
33
+ },
34
+ };
35
+ /**
36
+ * Host-side ACP-over-WebSocket registry. Owns the per-dispatch registration table + the
37
+ * `/acp` upgrade handler. Does NOT own a listener — attached to the unified HTTP server's
38
+ * `upgrade` event. Replaces AcpBridge's register/cancel/accepted semantics, yielding a
39
+ * Duplex instead of a raw Socket.
40
+ */
41
+ export class AcpWsRegistry {
42
+ // Pending registrations keyed by token (lookups are constant-time via timingSafeEqual).
43
+ pending = new Map();
44
+ // Every upgraded socket — pre- AND post-auth — so stop() can force them closed instead of
45
+ // leaking across shutdown (a silent unauthenticated socket would otherwise linger until its
46
+ // auth timeout, re-introducing the shutdown-hang the retired bridge guarded against).
47
+ sockets = new Set();
48
+ stopped = false;
49
+ authTimeoutMs;
50
+ heartbeatIntervalMs;
51
+ heartbeatTimeoutMs;
52
+ log;
53
+ constructor(opts = {}) {
54
+ this.authTimeoutMs = opts.authTimeoutMs ?? DEFAULT_AUTH_TIMEOUT_MS;
55
+ this.heartbeatIntervalMs = opts.heartbeatIntervalMs ?? DEFAULT_HEARTBEAT_INTERVAL_MS;
56
+ this.heartbeatTimeoutMs = opts.heartbeatTimeoutMs ?? DEFAULT_HEARTBEAT_TIMEOUT_MS;
57
+ this.log = opts.log ?? NOOP_LOG;
58
+ }
59
+ /**
60
+ * Register a pending dispatch. Returns a token to inject into the in-VM agent's env and a
61
+ * promise that resolves when the agent connects + authenticates. Rejects if cancel() is
62
+ * called or stop() runs before the agent connects.
63
+ */
64
+ register(issueId, identifier) {
65
+ if (this.stopped)
66
+ throw new Error('acp ws registry is stopped');
67
+ const token = randomBytes(24).toString('base64url');
68
+ let resolveFn;
69
+ let rejectFn;
70
+ const accepted = new Promise((res, rej) => {
71
+ resolveFn = res;
72
+ rejectFn = rej;
73
+ });
74
+ // Defensive no-op catch so a cancel() before the caller wires its handler can't escalate
75
+ // to an unhandled-rejection crash; the caller's own `await accepted` still observes it.
76
+ accepted.catch(() => undefined);
77
+ const reg = {
78
+ issueId,
79
+ identifier,
80
+ token,
81
+ resolve: (s) => {
82
+ if (reg.settled)
83
+ return;
84
+ reg.settled = true;
85
+ this.pending.delete(token);
86
+ resolveFn(s);
87
+ },
88
+ reject: (err) => {
89
+ if (reg.settled)
90
+ return;
91
+ reg.settled = true;
92
+ this.pending.delete(token);
93
+ rejectFn(err);
94
+ },
95
+ settled: false,
96
+ };
97
+ this.pending.set(token, reg);
98
+ this.log.emit('debug', 'acp ws registered', { issue_id: issueId, issue_identifier: identifier });
99
+ return {
100
+ token,
101
+ accepted,
102
+ cancel: (reason) => reg.reject(new Error(`acp ws cancel: ${reason}`)),
103
+ };
104
+ }
105
+ /**
106
+ * Handle an HTTP `upgrade` event. Only `/acp` is a WebSocket endpoint; any other path is
107
+ * rejected. Completes the handshake, then defers auth + frame pumping to a per-connection
108
+ * {@link AcpWsConnection}.
109
+ */
110
+ handleUpgrade(req, socket, head) {
111
+ let pathname;
112
+ try {
113
+ pathname = new URL(req.url ?? '/', 'http://symphony.local').pathname;
114
+ }
115
+ catch {
116
+ return rejectUpgrade(socket, '400 Bad Request');
117
+ }
118
+ if (pathname !== '/acp')
119
+ return rejectUpgrade(socket, '404 Not Found');
120
+ const key = req.headers['sec-websocket-key'];
121
+ const upgrade = (req.headers['upgrade'] ?? '').toString().toLowerCase();
122
+ if (upgrade !== 'websocket' || typeof key !== 'string') {
123
+ return rejectUpgrade(socket, '400 Bad Request');
124
+ }
125
+ if (this.stopped)
126
+ return rejectUpgrade(socket, '503 Service Unavailable');
127
+ socket.setNoDelay(true);
128
+ socket.write('HTTP/1.1 101 Switching Protocols\r\n' +
129
+ 'Upgrade: websocket\r\nConnection: Upgrade\r\n' +
130
+ `Sec-WebSocket-Accept: ${computeAccept(key)}\r\n\r\n`);
131
+ // Track the upgraded socket from handshake-complete (BEFORE auth) so stop() can destroy a
132
+ // connection that never authenticates; it drops itself from the set on close.
133
+ this.sockets.add(socket);
134
+ socket.once('close', () => this.sockets.delete(socket));
135
+ new AcpWsConnection(socket, head ?? Buffer.alloc(0), (token, buildStream) => this.accept(token, buildStream), this.authTimeoutMs, this.heartbeatIntervalMs, this.heartbeatTimeoutMs, this.log);
136
+ }
137
+ /**
138
+ * Stop accepting connections, reject every pending registration, and force-close every
139
+ * upgraded socket — authenticated streams AND silent pre-auth sockets. Mirrors
140
+ * AcpBridge.stop(): an open socket would otherwise keep shutdown waiting on the HTTP drain.
141
+ */
142
+ async stop() {
143
+ if (this.stopped)
144
+ return;
145
+ this.stopped = true;
146
+ for (const reg of [...this.pending.values()]) {
147
+ reg.reject(new Error('acp ws registry stopped'));
148
+ }
149
+ this.pending.clear();
150
+ for (const sock of [...this.sockets]) {
151
+ try {
152
+ sock.destroy();
153
+ }
154
+ catch {
155
+ /* idempotent */
156
+ }
157
+ }
158
+ this.sockets.clear();
159
+ }
160
+ // Constant-time validate the presented token against each pending registration; on a match
161
+ // resolve that registration with the authenticated stream. False on no match (connection
162
+ // closes 1008; the registration stays pending until connect-timeout/cancel/stop rejects it).
163
+ accept(token, buildStream) {
164
+ const reg = this.findPendingByToken(token);
165
+ if (!reg || reg.settled)
166
+ return false;
167
+ const stream = buildStream();
168
+ this.log.emit('info', 'acp ws accepted', { issue_id: reg.issueId, issue_identifier: reg.identifier });
169
+ reg.resolve(stream);
170
+ return true;
171
+ }
172
+ // Constant-time compare against each pending token (typically one entry under
173
+ // max_concurrent_agents=1, but loop for correctness).
174
+ findPendingByToken(presented) {
175
+ const presentedBuf = Buffer.from(presented, 'utf8');
176
+ for (const reg of this.pending.values()) {
177
+ const expected = Buffer.from(reg.token, 'utf8');
178
+ if (expected.length !== presentedBuf.length)
179
+ continue;
180
+ if (timingSafeEqual(expected, presentedBuf))
181
+ return reg;
182
+ }
183
+ return null;
184
+ }
185
+ }
186
+ // Write a minimal HTTP error response on a non-`/acp` (or malformed) upgrade and destroy the
187
+ // socket so a stray probe can't hold the connection open.
188
+ function rejectUpgrade(socket, status) {
189
+ try {
190
+ socket.write(`HTTP/1.1 ${status}\r\nConnection: close\r\n\r\n`);
191
+ socket.destroy();
192
+ }
193
+ catch {
194
+ /* socket may already be gone */
195
+ }
196
+ }
197
+ //# sourceMappingURL=acp-ws.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp-ws.js","sourceRoot":"","sources":["../../../src/shell/interp/acp-ws.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,319 @@
1
+ // FCIS rewrite — ACP effect interpreter (shell adapter).
2
+ //
3
+ // Interprets the AcpPort (session_new / run_prompt / cancel) over the
4
+ // @agentclientprotocol/sdk client driven by the host-side `/acp` WebSocket. The
5
+ // guest dials `ws://symphony-mcp:7001/acp`, authenticates with the per-dispatch
6
+ // bearer, and an AcpWsRegistration resolves to a Duplex BYTE stream which we
7
+ // bridge to the SDK's WHATWG streams (Readable.toWeb / Writable.toWeb via
8
+ // ndJsonStream). Faithfully ports src/agent/acp.ts: LineTap multibyte-safe
9
+ // framing of BOTH directions, redactBearerTokens before any JSONL write,
10
+ // usage/agent/tool/plan chunks → RuntimeEvent feed, tool-call lifecycle delta,
11
+ // PromptOutcome surfacing. Shell rule: imports src/types/** + sibling shell +
12
+ // real deps + node builtins ONLY (the AcpWs* types live in the sibling root).
13
+ import { Readable, Writable } from 'node:stream';
14
+ import { ClientSideConnection, ndJsonStream, PROTOCOL_VERSION, } from '@agentclientprotocol/sdk';
15
+ import { LineTap, recordAcpFrame, summarize, extractTextContent, truncate, summarizeToolCall, summarizeToolCallUpdate, } from './acp-frame.js';
16
+ // Connection/transport faults from the in-VM model client (ECONNRESET, socket hang
17
+ // up, "Unable to connect to API", …) arrive as a thrown JSON-RPC error on
18
+ // session/prompt — NOT an agent decision (issue 135). Label them transport_error so
19
+ // the run log stays honest and the breaker treats them as transient. The split
20
+ // decision (`deps.isTransportError`) is the SINGLE core copy (core/runner/turn.ts),
21
+ // injected through the substrate — the inline regex this file used to repeat is gone.
22
+ // ─── One open ACP session bound to one /acp WebSocket Duplex ──────────────────
23
+ class AcpSession {
24
+ socket;
25
+ issueId;
26
+ cwd;
27
+ deps;
28
+ onEvent;
29
+ onTokenUsage;
30
+ conn;
31
+ sessionId = null;
32
+ closed = false;
33
+ cancelled = false;
34
+ transportErrored = false;
35
+ lastAssistantText = '';
36
+ inboundTap;
37
+ outboundTap;
38
+ constructor(socket, issueId, cwd, deps, onEvent, onTokenUsage) {
39
+ this.socket = socket;
40
+ this.issueId = issueId;
41
+ this.cwd = cwd;
42
+ this.deps = deps;
43
+ this.onEvent = onEvent;
44
+ this.onTokenUsage = onTokenUsage;
45
+ this.inboundTap = new LineTap((line) => recordAcpFrame(deps.runlog, issueId, 'vm_to_host', line));
46
+ this.outboundTap = new LineTap((line) => recordAcpFrame(deps.runlog, issueId, 'host_to_vm', line));
47
+ // LineTap is a Transform subclass; its self-returning method/event overloads
48
+ // (end/on/once → LineTap) defeat assignability to the base Readable/Writable
49
+ // params, so widen to the base Transform at the stream boundary.
50
+ const inbound = this.inboundTap;
51
+ const outbound = this.outboundTap;
52
+ socket.pipe(inbound);
53
+ outbound.pipe(socket);
54
+ const input = Readable.toWeb(inbound);
55
+ const output = Writable.toWeb(outbound);
56
+ this.conn = new ClientSideConnection(() => this.makeClient(), ndJsonStream(output, input));
57
+ // A transport FAULT (heartbeat timeout / oversized frame) destroys the Duplex WITH
58
+ // an Error host-side → `'error'`. Flag it so the close is classified transport_error.
59
+ socket.on('error', () => {
60
+ this.transportErrored = true;
61
+ this.handleTransportClose('transport_error');
62
+ });
63
+ socket.on('close', () => this.handleTransportClose('stdout_closed'));
64
+ }
65
+ makeClient() {
66
+ const fail = (msg) => {
67
+ throw Object.assign(new Error(msg), { code: 'client_capability_not_implemented' });
68
+ };
69
+ return {
70
+ sessionUpdate: async (p) => this.onSessionUpdate(p),
71
+ requestPermission: async (p) => this.onPermissionRequest(p),
72
+ // §6.1 high-trust posture: the agent has direct in-VM workspace access, so
73
+ // client-mediated fs/terminal are unsupported; returning a failure keeps the
74
+ // session alive (no stall) per spec.
75
+ readTextFile: async () => fail('client fs read not supported'),
76
+ writeTextFile: async () => fail('client fs write not supported'),
77
+ createTerminal: async () => fail('client terminal not supported'),
78
+ terminalOutput: async () => fail('client terminal not supported'),
79
+ waitForTerminalExit: async () => fail('client terminal not supported'),
80
+ killTerminal: async () => fail('client terminal not supported'),
81
+ releaseTerminal: async () => fail('client terminal not supported'),
82
+ };
83
+ }
84
+ emit(event, message, tool) {
85
+ this.onEvent(tool ? { at: this.deps.iso(), event, message, tool } : { at: this.deps.iso(), event, message });
86
+ }
87
+ onSessionUpdate(params) {
88
+ const u = params.update;
89
+ switch (u.sessionUpdate) {
90
+ case 'agent_message_chunk': {
91
+ const text = extractTextContent(u.content);
92
+ if (text) {
93
+ this.lastAssistantText += text;
94
+ this.emit('agent_message_chunk', truncate(text, 80));
95
+ }
96
+ return;
97
+ }
98
+ case 'agent_thought_chunk': {
99
+ const text = extractTextContent(u.content);
100
+ if (text)
101
+ this.emit('agent_thought_chunk', truncate(text, 80));
102
+ return;
103
+ }
104
+ case 'tool_call':
105
+ return this.emitToolCall('tool_call', summarizeToolCall(u), u);
106
+ case 'tool_call_update':
107
+ return this.emitToolCall('tool_call_update', summarizeToolCallUpdate(u), u);
108
+ case 'plan':
109
+ return this.emit('plan', summarize(u.entries ?? u));
110
+ case 'usage_update':
111
+ return this.onUsageUpdate(u);
112
+ default:
113
+ return this.emit('session_update', `${u.sessionUpdate}: ${summarize(u)}`);
114
+ }
115
+ }
116
+ // ACP usage is context-window used/size, not cumulative I/O. Map `used` into
117
+ // total_tokens; the I/O split is zero (ACP does not expose it).
118
+ onUsageUpdate(u) {
119
+ const used = Number(u.used ?? 0);
120
+ this.onTokenUsage({ input_tokens: 0, output_tokens: 0, total_tokens: used });
121
+ this.emit('usage_update', `used=${used}/${Number(u.size ?? 0)}`);
122
+ }
123
+ // Attach the tool lifecycle ONLY when in-flight state actually changes; a
124
+ // status-less (content/title-only) update attaches no `tool` so it never re-adds
125
+ // a finished tool to the stall-reaper-suppression set.
126
+ emitToolCall(event, message, u) {
127
+ const id = typeof u.toolCallId === 'string' ? u.toolCallId : '';
128
+ const status = typeof u.status === 'string' ? u.status : '';
129
+ const life = id ? this.deps.toolCallLifecycle(event, status) : undefined;
130
+ this.emit(event, message, life ? { id, ended: life.ended } : undefined);
131
+ }
132
+ onPermissionRequest(params) {
133
+ // §6.1 auto-approval policy lives in core (`selectPermissionOption`, injected):
134
+ // prefer allow_always so the agent doesn't re-ask, degrade to the first listed
135
+ // option when no allow_* is present (keeps the session alive). Map the SDK
136
+ // options into the bare `{ kind, optionId }` shape core consumes (§4a).
137
+ const optionId = this.deps.selectPermissionOption(params.options.map((o) => ({ kind: o.kind, optionId: o.optionId })));
138
+ this.emit('approval_auto_approved', `${optionId || 'unknown'}: ${summarizeToolCallUpdate(params.toolCall)}`);
139
+ return { outcome: { outcome: 'selected', optionId } };
140
+ }
141
+ // Force-end the LineTaps so the SDK's receive() reader observes done:true and rejects
142
+ // every pending response (incl. an in-flight session/prompt). socket.destroy() emits
143
+ // 'close' but Node's pipe machinery may not propagate EOF through the Transform
144
+ // synchronously, so without this the runner hangs for the full prompt timeout.
145
+ handleTransportClose(reason) {
146
+ if (this.closed)
147
+ return;
148
+ this.closed = true;
149
+ this.emit('subprocess_exit', reason);
150
+ try {
151
+ this.inboundTap.end();
152
+ }
153
+ catch { /* idempotent */ }
154
+ try {
155
+ this.outboundTap.end();
156
+ }
157
+ catch { /* idempotent */ }
158
+ }
159
+ forceClose(reason) {
160
+ this.handleTransportClose(reason);
161
+ }
162
+ async initSession(mcpServers) {
163
+ const init = await withTimeout(this.conn.initialize({
164
+ protocolVersion: PROTOCOL_VERSION,
165
+ clientInfo: { name: 'smol-symphony', version: '0.1.0' },
166
+ clientCapabilities: { fs: { readTextFile: false, writeTextFile: false }, terminal: false },
167
+ }), this.deps.readTimeoutMs, 'initialize');
168
+ this.emit('session_init', `protocolVersion=${init.protocolVersion}`);
169
+ assertMcpSupported(init, mcpServers, (kinds, caps) => {
170
+ this.emit('mcp_capability_mismatch', `unsupported=${kinds} adapter_caps=${caps}`);
171
+ });
172
+ const session = await withTimeout(this.conn.newSession({ cwd: this.cwd, mcpServers }), this.deps.readTimeoutMs, 'session/new');
173
+ this.sessionId = session.sessionId;
174
+ this.emit('session_started', `sessionId=${session.sessionId} cwd=${this.cwd} mcp_servers=${mcpServers.length}`);
175
+ return { sessionId: session.sessionId };
176
+ }
177
+ get id() {
178
+ return this.sessionId;
179
+ }
180
+ /** Issue 213: the host↔guest ACP link is up iff the session hasn't been torn down. */
181
+ get alive() { return !this.closed; }
182
+ async runPrompt(promptText) {
183
+ if (this.closed)
184
+ return { reason: 'subprocess_exit', message: 'adapter already closed' };
185
+ if (!this.sessionId)
186
+ return { reason: 'startup_failed', message: 'no active session' };
187
+ this.lastAssistantText = '';
188
+ const request = { sessionId: this.sessionId, prompt: [{ type: 'text', text: promptText }] };
189
+ let resp;
190
+ try {
191
+ resp = await withTimeout(this.conn.prompt(request), this.deps.promptTimeoutMs, 'session/prompt');
192
+ }
193
+ catch (err) {
194
+ if (err instanceof TimeoutError) {
195
+ this.cancel().catch(() => undefined);
196
+ return { reason: 'prompt_timeout', message: err.message };
197
+ }
198
+ const message = err.message;
199
+ if (this.transportErrored)
200
+ return { reason: 'transport_error', message };
201
+ if (this.closed)
202
+ return { reason: 'subprocess_exit', message };
203
+ if (this.deps.isTransportError(message))
204
+ return { reason: 'transport_error', message };
205
+ return { reason: 'refusal', message };
206
+ }
207
+ return mapStopReason(resp.stopReason, this.lastAssistantText);
208
+ }
209
+ async cancel() {
210
+ if (!this.sessionId || this.closed || this.cancelled)
211
+ return;
212
+ this.cancelled = true;
213
+ const note = { sessionId: this.sessionId };
214
+ try {
215
+ await this.conn.cancel(note);
216
+ }
217
+ catch {
218
+ /* surfaces through transport close */
219
+ }
220
+ }
221
+ }
222
+ // MCP is mandatory for symphony operations: refuse to start a session if the agent
223
+ // does not advertise the requested transport (else it runs degraded with no
224
+ // transition / request_human_steering tools). Stdio is implicit; http/sse/acp are
225
+ // optional booleans on agentCapabilities.mcpCapabilities.
226
+ function assertMcpSupported(init, requested, onMismatch) {
227
+ const caps = (init.agentCapabilities ?? {});
228
+ const mcpCaps = caps.mcpCapabilities ?? {};
229
+ const supports = (k) => k === 'stdio' || (k === 'http' && mcpCaps.http === true) || (k === 'sse' && mcpCaps.sse === true) || (k === 'acp' && mcpCaps.acp === true);
230
+ const unsupported = requested.filter((s) => !supports(s.type ?? 'stdio'));
231
+ if (unsupported.length === 0)
232
+ return;
233
+ const kinds = unsupported.map((s) => s.type ?? 'stdio').join(', ');
234
+ const capsJson = JSON.stringify(mcpCaps);
235
+ onMismatch(kinds, capsJson);
236
+ throw Object.assign(new Error(`agent does not support required MCP transport(s): ${kinds}. Adapter caps: ${capsJson}`), {
237
+ code: 'mcp_capability_mismatch',
238
+ });
239
+ }
240
+ function mapStopReason(stopReason, lastText) {
241
+ switch (stopReason) {
242
+ case 'end_turn':
243
+ return { reason: 'end_turn', message: summarize(lastText) };
244
+ case 'max_tokens':
245
+ case 'max_turn_requests':
246
+ case 'refusal':
247
+ case 'cancelled':
248
+ return { reason: stopReason, message: summarize(lastText) };
249
+ default:
250
+ return { reason: 'refusal', message: `unknown stop_reason ${stopReason}` };
251
+ }
252
+ }
253
+ class TimeoutError extends Error {
254
+ }
255
+ function withTimeout(p, ms, label) {
256
+ return new Promise((resolve, reject) => {
257
+ const t = setTimeout(() => reject(new TimeoutError(`${label} timed out after ${ms}ms`)), ms);
258
+ p.then((v) => { clearTimeout(t); resolve(v); }, (e) => { clearTimeout(t); reject(e); });
259
+ });
260
+ }
261
+ // ─── The AcpPort interpreter ──────────────────────────────────────────────────
262
+ // sessionNew(vmId): register the /acp WS for this dispatch, race the guest dial-back
263
+ // against connectTimeoutMs, build the session, init it, key it by sessionId.
264
+ // runPrompt/cancel delegate by sessionId. onEvent/onTokenUsage register the fan-out
265
+ // callbacks shared by every session this interpreter owns.
266
+ export function createAcpInterpreter(deps) {
267
+ const sessions = new Map();
268
+ let eventCb = () => { };
269
+ let tokenCb = () => { };
270
+ return {
271
+ onEvent(cb) {
272
+ eventCb = cb;
273
+ },
274
+ onTokenUsage(cb) {
275
+ tokenCb = cb;
276
+ },
277
+ async sessionNew(vmId, opts) {
278
+ const ctx = deps.contextForVm(vmId);
279
+ if (!ctx)
280
+ throw new Error(`no dispatch context for vm ${vmId}`);
281
+ // The WS registration was created — and its bearer placed in the VM launch env —
282
+ // BEFORE the agent launched (so the dial-back finds a pending registration keyed
283
+ // on the SAME token). Here we only CONSUME the dial-back stream; registering again
284
+ // would mint a SECOND token the guest never presented (the late-registration bug).
285
+ let socket;
286
+ try {
287
+ socket = await Promise.race([
288
+ ctx.accepted,
289
+ new Promise((_, rej) => setTimeout(() => rej(new Error('acp ws: in-VM agent did not connect in time')), deps.connectTimeoutMs)),
290
+ ]);
291
+ }
292
+ catch (err) {
293
+ ctx.cancelAccept('connect_timeout');
294
+ throw err;
295
+ }
296
+ deps.runlog.system(ctx.issueId, 'acp_ws_connected', { vm_id: vmId });
297
+ const session = new AcpSession(socket, ctx.issueId, ctx.workspacePath, deps, (e) => eventCb(ctx.issueId, e), (u) => tokenCb(ctx.issueId, u));
298
+ const { sessionId } = await session.initSession(deps.mcpServersFor(vmId, opts));
299
+ sessions.set(sessionId, session);
300
+ return { sessionId };
301
+ },
302
+ async runPrompt(sessionId, promptText) {
303
+ const session = sessions.get(sessionId);
304
+ if (!session)
305
+ return { reason: 'startup_failed', message: `no active session ${sessionId}` };
306
+ return session.runPrompt(promptText);
307
+ },
308
+ sessionAlive: (sessionId) => sessions.get(sessionId)?.alive ?? false,
309
+ async cancel(sessionId) {
310
+ const session = sessions.get(sessionId);
311
+ if (!session)
312
+ return;
313
+ await session.cancel();
314
+ session.forceClose('cancel_requested');
315
+ sessions.delete(sessionId);
316
+ },
317
+ };
318
+ }
319
+ //# sourceMappingURL=acp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp.js","sourceRoot":"","sources":["../../../src/shell/interp/acp.ts"],"names":[],"mappings":"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"}