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
package/dist/runlog.js DELETED
@@ -1,403 +0,0 @@
1
- // Per-issue JSONL run log. Captures everything crossing the host/VM boundary plus host-side
2
- // hook output, so a later evaluation pass (likely another in-VM agent) can replay a run end
3
- // to end. One file per issue, appended forever; each entry is a self-describing JSON object.
4
- //
5
- // Schema (one of):
6
- // { ts, issue_id, attempt, channel: "acp", direction: "host_to_vm"|"vm_to_host", frame: <parsed JSON-RPC> }
7
- // { ts, issue_id, attempt, channel: "acp", direction: ..., kind: "unparseable", raw: <string> }
8
- // { ts, issue_id, attempt, channel: "stderr", text }
9
- // { ts, issue_id, attempt, channel: "system", event, fields? }
10
- // { ts, issue_id, attempt, channel: "hook", hook, stream: "stdout"|"stderr", text }
11
- // { ts, issue_id, attempt, channel: "hook", hook, kind: "result", exit_code, signal, timed_out }
12
- //
13
- // Writes are best-effort: a write failure is swallowed so it can never crash the orchestrator
14
- // (consistent with logging.ts §9.2). Streams are opened in append mode so concurrent symphony
15
- // processes or restarts append safely to the same file.
16
- import { createWriteStream, mkdirSync, writeFileSync } from 'node:fs';
17
- import path from 'node:path';
18
- import { sanitizeWorkspaceKey } from './util/workspace-key.js';
19
- import { log } from './logging.js';
20
- export class RunLog {
21
- filePath;
22
- issueId;
23
- identifier;
24
- stream;
25
- currentAttempt = 0;
26
- // Once a stream error fires we stop trying to write. The first error is logged at warn;
27
- // subsequent attempts are silently dropped (prevents log spam if disk is full).
28
- broken = false;
29
- // In-memory accumulator of the low-frequency LIFECYCLE events only (system events plus
30
- // the Done-state `actions:` stdout, where the PR URL surfaces). The high-frequency ACP
31
- // frame / stderr stream is NOT accumulated — it stays on disk. `writeSummary` reduces
32
- // this list into a compact per-issue `*.summary.json` for the reflector (issue 123), so
33
- // a reflection turn never has to re-parse the multi-MB raw frame log. Bounded by the two
34
- // caps below so a pathological issue can't grow the host's memory without limit.
35
- lifecycle = [];
36
- actionsStdout = '';
37
- static LIFECYCLE_CAP = 4000;
38
- static ACTIONS_STDOUT_CAP = 65_536;
39
- /**
40
- * `issueId` is the tracker's primary key (e.g. the local tracker's front-matter `id`)
41
- * and is what each JSONL line is stamped with. `identifier` is the filename-safe display
42
- * id (e.g. `ABC-123`) and is only used to derive the file path. The two coincide for
43
- * local trackers today but MUST be kept separate so downstream evaluators can correlate
44
- * by tracker id even on trackers where the values diverge.
45
- */
46
- constructor(filePath, issueId, identifier) {
47
- this.filePath = filePath;
48
- this.issueId = issueId;
49
- this.identifier = identifier;
50
- this.stream = createWriteStream(filePath, { flags: 'a', encoding: 'utf8' });
51
- this.stream.on('error', (err) => {
52
- if (!this.broken) {
53
- this.broken = true;
54
- log.warn('runlog write failed', {
55
- issue_id: this.issueId,
56
- issue_identifier: this.identifier,
57
- error: err.message,
58
- });
59
- }
60
- });
61
- }
62
- setAttempt(n) {
63
- this.currentAttempt = n;
64
- }
65
- attempt() {
66
- return this.currentAttempt;
67
- }
68
- /**
69
- * Append one entry. `ts`, `issue_id`, `issue_identifier`, and `attempt` are stamped
70
- * automatically and override any same-named field on the entry, so callers cannot
71
- * accidentally backdate or mislabel lines. Returns nothing — writes are best-effort.
72
- *
73
- * The spread order below intentionally puts the auto-stamped fields AFTER the caller's
74
- * entry so they win over any same-named keys the caller (often passing arbitrary fields
75
- * for ad-hoc events) accidentally supplied. Reversing this would silently corrupt the
76
- * canonical correlation identifiers downstream evaluation depends on.
77
- */
78
- record(entry) {
79
- if (this.broken)
80
- return;
81
- const stamped = {
82
- ...entry,
83
- ts: new Date().toISOString(),
84
- issue_id: this.issueId,
85
- issue_identifier: this.identifier,
86
- attempt: this.currentAttempt,
87
- };
88
- this.captureLifecycle(stamped);
89
- let line;
90
- try {
91
- line = JSON.stringify(stamped);
92
- }
93
- catch (err) {
94
- log.warn('runlog serialize failed', { issue_id: this.issueId, error: err.message });
95
- return;
96
- }
97
- try {
98
- this.stream.write(line + '\n');
99
- }
100
- catch {
101
- // Stream errors land in the 'error' handler. A synchronous throw here is unusual but
102
- // not impossible (e.g. if the stream is in an invalid state); silence it.
103
- }
104
- }
105
- /** Convenience: emit a `channel: "system"` event. */
106
- system(event, fields) {
107
- this.record({ channel: 'system', event, ...(fields ? { fields } : {}) });
108
- }
109
- /**
110
- * Fold a just-stamped entry into the in-memory lifecycle accumulator that
111
- * `writeSummary` reduces over. Keeps only the cheap, low-frequency signals:
112
- * every `system` event, plus the Done-state `actions:` stdout (where
113
- * `gh pr create` prints the PR URL). The high-volume ACP/stderr channels are
114
- * skipped so the hot path stays a single bounded string-compare.
115
- */
116
- captureLifecycle(stamped) {
117
- if (stamped.channel === 'system') {
118
- if (this.lifecycle.length < RunLog.LIFECYCLE_CAP)
119
- this.lifecycle.push(stamped);
120
- return;
121
- }
122
- if (stamped.channel === 'hook' &&
123
- stamped.hook === 'actions' &&
124
- stamped.stream === 'stdout' &&
125
- typeof stamped.text === 'string' &&
126
- this.actionsStdout.length < RunLog.ACTIONS_STDOUT_CAP) {
127
- this.actionsStdout += stamped.text;
128
- }
129
- }
130
- /** Sibling path of the JSONL log: `<root>/<key>.summary.json`. */
131
- summaryFilePath() {
132
- return this.filePath.replace(/\.jsonl$/, '.summary.json');
133
- }
134
- /**
135
- * Reduce the accumulated lifecycle events into a compact per-issue summary
136
- * and write it next to the JSONL log. Best-effort: a failure is logged at
137
- * warn and swallowed (a missing summary is tolerated by the reflector). Pure
138
- * over in-memory state, so it needs no disk read and no stream flush — the
139
- * orchestrator calls it at the terminal unwind, just before closing the log.
140
- */
141
- writeSummary(generatedAt) {
142
- if (this.lifecycle.length === 0)
143
- return;
144
- try {
145
- const summary = summarizeRunLog({
146
- entries: this.lifecycle,
147
- actionsStdout: this.actionsStdout,
148
- issueId: this.issueId,
149
- issueIdentifier: this.identifier,
150
- generatedAt,
151
- });
152
- writeFileSync(this.summaryFilePath(), JSON.stringify(summary, null, 2) + '\n', 'utf8');
153
- }
154
- catch (err) {
155
- log.warn('run summary write failed', {
156
- issue_id: this.issueId,
157
- issue_identifier: this.identifier,
158
- error: err.message,
159
- });
160
- }
161
- }
162
- /** Closes the underlying stream. Idempotent. */
163
- async close() {
164
- return new Promise((resolve) => {
165
- if (this.broken)
166
- return resolve();
167
- this.stream.end(() => resolve());
168
- });
169
- }
170
- }
171
- /**
172
- * Open (or reopen, append-mode) the run log for an issue. Creates the directory tree on
173
- * demand. Path is `<logsRoot>/<sanitized-identifier>.jsonl`; sanitization matches workspace
174
- * keys so the same characters are escaped consistently across .symphony/ subdirs.
175
- *
176
- * `issueId` is the tracker's primary key and is stamped on every line as `issue_id`.
177
- * `issueIdentifier` is the filename-safe display id and is used to derive the path AND
178
- * is stamped as `issue_identifier`. Pass both — they may diverge on trackers where ids
179
- * are opaque distinct from human-readable identifiers.
180
- */
181
- export function openRunLog(logsRoot, issueId, issueIdentifier) {
182
- const key = sanitizeWorkspaceKey(issueIdentifier);
183
- if (key.length === 0) {
184
- throw new Error(`cannot derive runlog filename from identifier: ${issueIdentifier}`);
185
- }
186
- mkdirSync(logsRoot, { recursive: true });
187
- const filePath = path.join(logsRoot, `${key}.jsonl`);
188
- return new RunLog(filePath, issueId, issueIdentifier);
189
- }
190
- // ===========================================================================
191
- // Per-issue run summary (issue 123)
192
- //
193
- // The reflector (companion #122) needs to spot patterns across many finished
194
- // issues. The raw `<id>.jsonl` runs to multiple MB per heavy issue, so we emit
195
- // a compact, comparable per-issue OUTCOME record alongside it. The summary is a
196
- // pure reduction over the LIFECYCLE events already captured in the run log — no
197
- // new hot-path instrumentation; the high-frequency ACP frame stream is not
198
- // touched.
199
- //
200
- // Schema is versioned (`schema_version`). The reflector tolerates a missing
201
- // summary (issues closed before this feature shipped, or runs whose summary
202
- // write failed): treat absence as "no signal for this issue", never an error.
203
- // ===========================================================================
204
- /** Bumped when the on-disk `*.summary.json` shape changes incompatibly. */
205
- export const RUN_SUMMARY_SCHEMA_VERSION = 1;
206
- const NOTE_CAP = 4000;
207
- const TIMEOUT_RE = /timeout|timed out|stall|prompt_timeout|did not connect|bridge/i;
208
- const PR_URL_RE = /(https?:\/\/[^\s)]+\/pull\/(\d+))/;
209
- function fieldsOf(e) {
210
- return e.fields && typeof e.fields === 'object' ? e.fields : {};
211
- }
212
- function asStr(v) {
213
- return typeof v === 'string' ? v : null;
214
- }
215
- function asNum(v) {
216
- return typeof v === 'number' && Number.isFinite(v) ? v : null;
217
- }
218
- function isBudgetExhausted(reason) {
219
- return reason !== null && /max_turns/i.test(reason);
220
- }
221
- function spanDurationMs(s) {
222
- if (!s.ended_at)
223
- return 0;
224
- const a = Date.parse(s.started_at);
225
- const b = Date.parse(s.ended_at);
226
- return Number.isFinite(a) && Number.isFinite(b) && b >= a ? b - a : 0;
227
- }
228
- /** Pair `attempt_started`/`attempt_ended` events in order into per-attempt spans. */
229
- function buildAttemptSpans(entries) {
230
- const spans = [];
231
- for (const e of entries) {
232
- if (e.channel !== 'system')
233
- continue;
234
- const f = fieldsOf(e);
235
- if (e.event === 'attempt_started') {
236
- spans.push({
237
- attempt: asNum(f.attempt) ?? spans.length,
238
- state: asStr(f.issue_state) ?? 'unknown',
239
- max_turns: asNum(f.max_turns),
240
- turns_used: 0,
241
- reason: null,
242
- started_at: e.ts,
243
- ended_at: null,
244
- });
245
- }
246
- else if (e.event === 'attempt_ended') {
247
- const open = spans[spans.length - 1];
248
- if (open && open.ended_at === null) {
249
- open.turns_used = asNum(f.turns_completed) ?? 0;
250
- open.reason = asStr(f.reason);
251
- open.ended_at = e.ts;
252
- }
253
- }
254
- }
255
- return spans;
256
- }
257
- function collectTransitions(entries) {
258
- const out = [];
259
- for (const e of entries) {
260
- if (e.channel !== 'system' || e.event !== 'transition')
261
- continue;
262
- const f = fieldsOf(e);
263
- out.push({
264
- from_state: asStr(f.from_state) ?? 'unknown',
265
- to_state: asStr(f.to_state) ?? 'unknown',
266
- notes: asStr(f.notes) ?? '',
267
- actor: asStr(f.actor),
268
- terminal: f.terminal === true,
269
- rerouted: f.rerouted === true,
270
- });
271
- }
272
- return out;
273
- }
274
- function collapseConsecutive(seq) {
275
- const out = [];
276
- for (const s of seq) {
277
- if (out[out.length - 1] !== s)
278
- out.push(s);
279
- }
280
- return out;
281
- }
282
- /** State path backbone is the per-attempt states (every dispatch logs one); the terminal state is appended. */
283
- function buildStatePath(spans, transitions, terminalState) {
284
- let path = collapseConsecutive(spans.map((s) => s.state));
285
- if (path.length === 0 && transitions.length > 0) {
286
- path = collapseConsecutive([transitions[0].from_state, ...transitions.map((t) => t.to_state)]);
287
- }
288
- if (terminalState && path[path.length - 1] !== terminalState)
289
- path.push(terminalState);
290
- return path;
291
- }
292
- function perStateStats(spans) {
293
- const order = [];
294
- const byState = new Map();
295
- for (const s of spans) {
296
- let stat = byState.get(s.state);
297
- if (!stat) {
298
- stat = { state: s.state, attempts: 0, turns_used: 0, max_turns: null, budget_exhausted: false, wall_clock_ms: 0 };
299
- byState.set(s.state, stat);
300
- order.push(s.state);
301
- }
302
- stat.attempts += 1;
303
- stat.turns_used += s.turns_used;
304
- if (s.max_turns !== null)
305
- stat.max_turns = s.max_turns;
306
- if (isBudgetExhausted(s.reason))
307
- stat.budget_exhausted = true;
308
- stat.wall_clock_ms += spanDurationMs(s);
309
- }
310
- return order.map((st) => byState.get(st));
311
- }
312
- function capNotes(notes) {
313
- return notes.length > NOTE_CAP ? notes.slice(0, NOTE_CAP) + '…[truncated]' : notes;
314
- }
315
- /**
316
- * A review rejection is a non-reroute transition back to the INITIAL implementing
317
- * state (where the issue started). In the shipped Todo→Review→Done flow that is
318
- * exactly a Review→Todo kick-back; the definition stays workflow-agnostic.
319
- */
320
- function collectRejections(transitions, initialState) {
321
- if (initialState === null)
322
- return [];
323
- const out = [];
324
- for (const t of transitions) {
325
- if (t.rerouted)
326
- continue;
327
- if (t.to_state === initialState && t.from_state !== t.to_state) {
328
- out.push({ from_state: t.from_state, to_state: t.to_state, actor: t.actor, notes: capNotes(t.notes) });
329
- }
330
- }
331
- return out;
332
- }
333
- function collectTimeouts(spans) {
334
- const out = [];
335
- for (const s of spans) {
336
- if (s.reason !== null && TIMEOUT_RE.test(s.reason)) {
337
- out.push({ attempt: s.attempt, state: s.state, reason: s.reason });
338
- }
339
- }
340
- return out;
341
- }
342
- function terminalOf(transitions) {
343
- let terminal = null;
344
- for (const t of transitions) {
345
- if (t.terminal)
346
- terminal = t;
347
- }
348
- if (!terminal)
349
- return { state: null, outcome: 'incomplete' };
350
- return { state: terminal.to_state, outcome: /cancel/i.test(terminal.to_state) ? 'cancelled' : 'completed' };
351
- }
352
- function prFrom(actionsStdout) {
353
- const m = PR_URL_RE.exec(actionsStdout);
354
- if (!m)
355
- return { number: null, url: null };
356
- return { url: m[1], number: Number.parseInt(m[2], 10) };
357
- }
358
- function wallClockTotal(entries) {
359
- if (entries.length === 0)
360
- return null;
361
- const a = Date.parse(entries[0].ts);
362
- const b = Date.parse(entries[entries.length - 1].ts);
363
- return Number.isFinite(a) && Number.isFinite(b) && b >= a ? b - a : null;
364
- }
365
- /**
366
- * Reduce a per-issue lifecycle event list into a {@link RunSummary}. Pure and
367
- * deterministic (pass `generatedAt` to pin the timestamp under test). Tolerant
368
- * of partial streams — every field degrades to a sensible empty/null value.
369
- */
370
- export function summarizeRunLog(input) {
371
- const spans = buildAttemptSpans(input.entries);
372
- const transitions = collectTransitions(input.entries);
373
- const term = terminalOf(transitions);
374
- const statePath = buildStatePath(spans, transitions, term.state);
375
- const initialState = statePath[0] ?? spans[0]?.state ?? null;
376
- const rejections = collectRejections(transitions, initialState);
377
- const perState = perStateStats(spans);
378
- const pr = prFrom(input.actionsStdout);
379
- return {
380
- schema_version: RUN_SUMMARY_SCHEMA_VERSION,
381
- issue_id: input.issueId,
382
- issue_identifier: input.issueIdentifier,
383
- state_path: statePath,
384
- attempts: spans.length,
385
- per_state: perState,
386
- review_rejections: rejections.length,
387
- rejection_notes: rejections,
388
- turn_budget_exhausted: perState.some((s) => s.budget_exhausted),
389
- timeouts: collectTimeouts(spans),
390
- conflict_routes: transitions
391
- .filter((t) => t.rerouted)
392
- .map((t) => ({ from_state: t.from_state, to_state: t.to_state })),
393
- terminal_state: term.state,
394
- terminal_outcome: term.outcome,
395
- pr_number: pr.number,
396
- pr_url: pr.url,
397
- first_event_at: input.entries[0]?.ts ?? null,
398
- last_event_at: input.entries[input.entries.length - 1]?.ts ?? null,
399
- wall_clock_ms_total: wallClockTotal(input.entries),
400
- generated_at: input.generatedAt ?? new Date().toISOString(),
401
- };
402
- }
403
- //# sourceMappingURL=runlog.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runlog.js","sourceRoot":"","sources":["../src/runlog.ts"],"names":[],"mappings":"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"}
package/dist/scaffold.js DELETED
@@ -1,165 +0,0 @@
1
- // First-run scaffold: write a starter WORKFLOW.md when an operator launches
2
- // `symphony` against a directory that does not have one yet. The CLI prompts
3
- // before calling in; this module is a pure file writer so it can be exercised
4
- // from tests without an interactive stdin.
5
- import { mkdir, writeFile } from 'node:fs/promises';
6
- import { existsSync } from 'node:fs';
7
- import path from 'node:path';
8
- /**
9
- * Body of the scaffolded WORKFLOW.md. Kept as an exported constant so tests can
10
- * assert against it without re-running the file write, and so future edits to
11
- * the starter shape stay in one place.
12
- *
13
- * The starter aims to run as-is once the operator has built the agent image:
14
- * `gondolin.image` is pinned to `symphony-agents:latest` (the default tag
15
- * `npm run build:image` writes), and `egress.allowed_hosts` opens the standard
16
- * dev-tooling hosts so in-VM gates (npm install, git deps) work out of the box.
17
- * The one required manual step is building that image; the runner fails fast at
18
- * boot if it is missing. `workspace.github_repo` defaults to "none" (local-only)
19
- * so a first run never pushes anywhere unexpected. See WORKFLOW.template.md for
20
- * the full annotated reference.
21
- */
22
- export const SCAFFOLD_WORKFLOW_TEMPLATE = `---
23
- # WORKFLOW.md — scaffolded by smol-symphony.
24
- #
25
- # Run: npx smol-symphony WORKFLOW.md
26
- #
27
- # See WORKFLOW.template.md for the full annotated reference:
28
- # https://github.com/dizk/smol-symphony/blob/main/WORKFLOW.template.md
29
-
30
- states:
31
- Todo:
32
- role: active
33
- Done:
34
- role: terminal
35
- # On the Done transition, push the per-issue branch and open a PR. The
36
- # \`if: $repo\` guard makes both a no-op in local-only mode (github_repo
37
- # unset/"none"); when a slug is set they run against it. Opening a PR needs
38
- # \`gh\` authenticated on the host.
39
- actions:
40
- - { kind: push_branch, remote: origin, ref: $branch, if: $repo }
41
- - kind: create_pr_if_missing
42
- base: $base_branch
43
- head: $branch
44
- title_from: $pr_title
45
- body_from: $pr_body_file
46
- if: $repo
47
- Triage:
48
- role: holding
49
-
50
- tracker:
51
- kind: local
52
- root: ./issues
53
-
54
- polling:
55
- interval_ms: 5000
56
-
57
- workspace:
58
- root: ./.symphony/workspaces
59
- # GitHub owner/repo to push the per-issue branch + open a PR against on the
60
- # Done transition (requires \`gh\` authenticated on the host; the token never
61
- # enters the VM). Leave as "none" for local-only mode — nothing is pushed.
62
- # Heads up: in local-only mode the per-issue workspace (and its \`agent/<id>\`
63
- # branch) is removed when the issue reaches a terminal state, so set a slug
64
- # here to keep the agent's work as a PR. The SYMPHONY_REPO env var, when set,
65
- # overrides this value.
66
- github_repo: none
67
-
68
- agent:
69
- max_concurrent_agents: 1
70
- max_turns: 10
71
-
72
- acp:
73
- # Adapter whose binary symphony launches inside each per-issue VM.
74
- # Credentials never enter the VM: the guest holds only a token-shaped
75
- # placeholder, and the host substitutes the real key into the outbound request
76
- # at Gondolin egress (TLS-MITM).
77
- # claude — host reads ~/.claude/.credentials.json
78
- # codex — host reads ~/.codex/auth.json (or host OPENAI_API_KEY)
79
- adapter: claude
80
-
81
- gondolin:
82
- # Per-issue microVM (Gondolin substrate). \`image\` is the agent rootfs the VM
83
- # boots. Build it once with \`npm run build:image\` (see images/agents/), which
84
- # tags \`symphony-agents:latest\` — pinned below so this file runs as-is. For an
85
- # immutable reference, replace it with the content-addressed build id the build
86
- # prints. The in-VM launcher (/opt/symphony/vm-agent.mjs) is baked into the
87
- # image, so no runtime \`volumes\` entry is needed.
88
- image: symphony-agents:latest
89
- cpus: 2
90
- mem_mib: 4096
91
-
92
- egress:
93
- # Dev-tooling hosts the in-VM agent may reach so gates can run inside the
94
- # sandbox (npm install, git-based deps, release-binary downloads). The agent
95
- # always reaches its own inference host; NO credential is ever substituted for
96
- # a host listed here — these grant plain network egress only. Keep the list
97
- # tight, and add whatever your project's build/test needs.
98
- allowed_hosts:
99
- - registry.npmjs.org
100
- - github.com
101
- - codeload.github.com
102
- - objects.githubusercontent.com
103
-
104
- server:
105
- port: 8787
106
- ---
107
- You are picking up a single issue and shepherding it through the pipeline.
108
-
109
- Issue: **{{ issue.identifier }} — {{ issue.title }}**
110
- State: {{ issue.state }}
111
- {% if issue.priority -%}Priority: {{ issue.priority }}{%- endif %}
112
- {% if issue.labels.size > 0 -%}Labels: {% for l in issue.labels %}{{ l }}{% unless forloop.last %}, {% endunless %}{% endfor %}{%- endif %}
113
-
114
- {% if issue.description -%}
115
- Description:
116
-
117
- {{ issue.description }}
118
- {%- endif %}
119
-
120
- Goals:
121
-
122
- 1. Work in the current directory only; treat it as the issue workspace.
123
- 2. Make the smallest correct change that satisfies the issue.
124
- 3. Hand off when done by calling \`symphony.transition({ to_state, notes? })\`
125
- into a declared \`role: terminal\` state (e.g. Done). The notes block is
126
- appended to the issue body and rides into the PR description.
127
- 4. If you cannot proceed without human input, call
128
- \`symphony.request_human_steering({ question, context? })\`. Your turn ends
129
- immediately; the human's reply arrives as your next prompt.
130
- 5. If you notice work out of scope for this issue, call
131
- \`symphony.propose_issue({ title, description?, labels?, priority? })\`. It
132
- lands in the first declared \`role: holding\` state directory (defaults to
133
- \`Triage/\`); the operator approves or discards from the dashboard.
134
- 6. Work as a single agent: do NOT invoke the \`Workflow\` tool or spawn nested /
135
- parallel sub-agents. A long fan-out turn can hold one streaming request open
136
- for many minutes and hit an upstream connection-reset ceiling inside the
137
- sandbox, getting discarded and re-dispatched; keep turns focused and rely on
138
- \`max_turns\` for breadth. ("workflow" / \`WORKFLOW.md\` name this state
139
- machine, not an opt-in to multi-agent orchestration.)
140
- `;
141
- export class ScaffoldError extends Error {
142
- code;
143
- constructor(code, message) {
144
- super(message);
145
- this.code = code;
146
- this.name = 'ScaffoldError';
147
- }
148
- }
149
- /**
150
- * Write a starter WORKFLOW.md at `workflowPath`. Creates the parent directory
151
- * if needed. Refuses to overwrite an existing file — callers are expected to
152
- * check for that case before prompting the operator.
153
- */
154
- export async function scaffoldWorkflow(opts) {
155
- if (!path.isAbsolute(opts.workflowPath)) {
156
- throw new ScaffoldError('scaffold_relative_path', `scaffoldWorkflow requires an absolute path (got: ${opts.workflowPath})`);
157
- }
158
- if (existsSync(opts.workflowPath)) {
159
- throw new ScaffoldError('scaffold_file_exists', `refusing to overwrite existing file: ${opts.workflowPath}`);
160
- }
161
- await mkdir(path.dirname(opts.workflowPath), { recursive: true });
162
- await writeFile(opts.workflowPath, SCAFFOLD_WORKFLOW_TEMPLATE, { flag: 'wx' });
163
- return { workflowPath: opts.workflowPath };
164
- }
165
- //# sourceMappingURL=scaffold.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,6EAA6E;AAC7E,8EAA8E;AAC9E,2CAA2C;AAE3C,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsHzC,CAAC;AAYF,MAAM,OAAO,aAAc,SAAQ,KAAK;IACnB;IAAnB,YAAmB,IAAY,EAAE,OAAe;QAC9C,KAAK,CAAC,OAAO,CAAC,CAAC;QADE,SAAI,GAAJ,IAAI,CAAQ;QAE7B,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAqB;IAC1D,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,aAAa,CACrB,wBAAwB,EACxB,oDAAoD,IAAI,CAAC,YAAY,GAAG,CACzE,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,aAAa,CACrB,sBAAsB,EACtB,wCAAwC,IAAI,CAAC,YAAY,EAAE,CAC5D,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,MAAM,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,0BAA0B,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/E,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;AAC7C,CAAC"}