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,237 @@
1
+ // FCIS rewrite — shell: the per-issue MCP tools/call effect interpreter.
2
+ //
3
+ // Sibling of src/shell/server/mcp-runtime.ts, split out to keep that file's
4
+ // public surface lean. This owns the stateful tools/call pipeline:
5
+ // decide (pure, injected core) → execute McpEffect[] (injected exec) →
6
+ // fold the resolved move (pure) → build the success tool-result the pre-move
7
+ // decider could not (it depends on the resolved {fromState,toState}).
8
+ //
9
+ // Shell rule: imports from src/types/** ONLY. The McpEffectCtx (resolved core +
10
+ // exec + clock/log + live projectors) is handed in by the runtime factory.
11
+ // ── live entry registration ──────────────────────────────────────────────────
12
+ // Reset the entry's transition/steering flags and register an ActiveEntry under
13
+ // the given token. The dispatch-time tracker-root is pinned VERBATIM: reading
14
+ // the live tracker root here would be wrong — activate runs after workspace + VM
15
+ // bring-up, a window in which a WORKFLOW.yaml reload can mutate tracker.root.
16
+ export function registerEntry(byIdentifier, entry, token, log) {
17
+ entry.mcp_token = token;
18
+ entry.transitioned = false;
19
+ entry.steering_requested = false;
20
+ entry.steering_question = null;
21
+ entry.steering_context = null;
22
+ byIdentifier.set(entry.identifier, {
23
+ issueId: entry.issue_id,
24
+ identifier: entry.identifier,
25
+ entry,
26
+ token,
27
+ trackerRootSnapshot: entry.tracker_root_at_dispatch,
28
+ pendingReply: null,
29
+ });
30
+ log.emit('debug', 'mcp activated', {
31
+ issue_identifier: entry.identifier,
32
+ tracker_root: entry.tracker_root_at_dispatch,
33
+ });
34
+ return token;
35
+ }
36
+ // ── live state projection (re-read each call so a reload is picked up) ────────
37
+ export function projectStatesView(states) {
38
+ const order = Object.keys(states);
39
+ const views = {};
40
+ for (const name of order) {
41
+ const c = states[name];
42
+ views[name] = { name, role: c.role, allowed_transitions: c.allowed_transitions ?? null };
43
+ }
44
+ return { views, order };
45
+ }
46
+ // ── steering awaiter (the ONE parked Promise; coupled to steering_requested) ──
47
+ // `steering_requested` (the dashboard reply-box flag) is flipped ON the instant
48
+ // the awaiter goes live and cleared in `finally`, so a delivered reply, a cancel,
49
+ // or a deactivate-reject all retract the box in lockstep (issue 151).
50
+ export function createSteeringAwaiter(byIdentifier) {
51
+ return {
52
+ async await(identifier) {
53
+ const active = byIdentifier.get(identifier);
54
+ if (!active)
55
+ throw new Error('mcp not active for this issue');
56
+ if (active.pendingReply)
57
+ throw new Error('steering reply already being awaited for this issue');
58
+ active.entry.steering_requested = true;
59
+ try {
60
+ return await new Promise((resolve, reject) => {
61
+ active.pendingReply = { resolve, reject };
62
+ });
63
+ }
64
+ finally {
65
+ active.entry.steering_requested = false;
66
+ }
67
+ },
68
+ resolve(identifier, text) {
69
+ const active = byIdentifier.get(identifier);
70
+ if (!active?.pendingReply)
71
+ return false;
72
+ const { resolve } = active.pendingReply;
73
+ active.pendingReply = null;
74
+ resolve(text);
75
+ return true;
76
+ },
77
+ cancel(identifier) {
78
+ const active = byIdentifier.get(identifier);
79
+ if (!active?.pendingReply)
80
+ return;
81
+ const { reject } = active.pendingReply;
82
+ active.pendingReply = null;
83
+ reject(new Error('steering awaiter cancelled'));
84
+ },
85
+ };
86
+ }
87
+ // ── tools/call: decide → execute effects → fold → respond ────────────────────
88
+ export async function dispatchToolCall(ctx, active, id, toolName, args) {
89
+ const states = ctx.statesView();
90
+ const view = {
91
+ issueId: active.issueId,
92
+ identifier: active.identifier,
93
+ fromState: active.entry.issue.state,
94
+ actor: active.entry.resolved_actor,
95
+ // The original propose_issue path fell back to tracker.currentRoot(); the
96
+ // dispatch snapshot is the pinned value and the decider treats null as the
97
+ // genuine "no root" rejection.
98
+ trackerRootSnapshot: active.trackerRootSnapshot,
99
+ steeringPending: active.entry.steering_question !== null,
100
+ trackerSupportsMove: true,
101
+ };
102
+ const decision = ctx.core.decideToolCall(id, toolName, args, view, states);
103
+ // A rejection / ready ack already carries the terminal response. Execute any
104
+ // effects it emitted (steering stash+await, or — when response is null — the
105
+ // move/write the success response depends on); runEffects builds that result.
106
+ const built = await runEffects(ctx, active, id, decision.effects, states);
107
+ return decision.response ?? built;
108
+ }
109
+ // ── McpEffect interpreter ────────────────────────────────────────────────────
110
+ // Returns the success response when the emitted effects produced one (the
111
+ // transition / propose happy paths); null otherwise.
112
+ async function runEffects(ctx, active, id, effects, states) {
113
+ let built = null;
114
+ for (const effect of effects) {
115
+ switch (effect.kind) {
116
+ case 'move_state': {
117
+ const result = await ctx.exec.moveState(effect);
118
+ built = foldAndRespondTransition(ctx, active, id, effect, result, states);
119
+ break;
120
+ }
121
+ case 'set_transitioned':
122
+ active.entry.transitioned = true;
123
+ break;
124
+ case 'stash_steering':
125
+ active.entry.steering_question = effect.question;
126
+ active.entry.steering_context = effect.context;
127
+ break;
128
+ case 'write_issue':
129
+ built = await respondPropose(ctx, active, id, effect);
130
+ break;
131
+ // `defer_cleanup` (the post-move cleanup gate lives in foldPostMove, so the
132
+ // current decider never emits it) and `await_steering` (the awaiter Promise
133
+ // is parked by the runtime's steering.await, coupled to liveness) are no-ops
134
+ // here — nothing to do in the interpreter.
135
+ }
136
+ }
137
+ return built;
138
+ }
139
+ // ── transition happy path: fold the resolved move, build the success result ──
140
+ function foldAndRespondTransition(ctx, active, id, effect, result, states) {
141
+ if (result.kind === 'move_failed') {
142
+ return ctx.core.makeError(id, ctx.core.InternalError, `failed to transition: ${result.message}`);
143
+ }
144
+ if (result.kind !== 'moved') {
145
+ return ctx.core.makeError(id, ctx.core.InternalError, 'unexpected transition result');
146
+ }
147
+ // Resolve the canonical target view for the role lookup (null ⇒ non-terminal
148
+ // fall-through, matching the original canonicalName === null branch).
149
+ const fold = ctx.core.foldPostMove({
150
+ result,
151
+ targetState: states.views[effect.toState] ?? null,
152
+ prMerge: ctx.livePrMerge(),
153
+ fromState: effect.fromState ?? '',
154
+ notes: effect.notes,
155
+ actor: effect.actor,
156
+ nowIso: ctx.clock.iso(),
157
+ });
158
+ // Apply the fold to the live entry (the imperative half the original did
159
+ // inline in performTransition).
160
+ active.entry.transitioned = true;
161
+ active.entry.cleanup_workspace_on_exit = fold.cleanupWorkspaceOnExit;
162
+ if (fold.toState !== null)
163
+ active.entry.issue.state = fold.toState;
164
+ active.entry.last_transition = fold.transitionRecord;
165
+ ctx.log.emit('info', 'mcp transition', {
166
+ issue_identifier: active.identifier,
167
+ from: result.fromState,
168
+ to: result.toState,
169
+ notes_len: effect.notes.length,
170
+ actor: effect.actor,
171
+ cleanup: fold.cleanupWorkspaceOnExit,
172
+ });
173
+ const resolvedTo = fold.toState ?? result.toState;
174
+ const notesSuffix = effect.notes.length > 0 ? ` with notes (${effect.notes.length} chars) appended` : '';
175
+ return {
176
+ jsonrpc: '2.0',
177
+ id,
178
+ result: {
179
+ content: [
180
+ {
181
+ type: 'text',
182
+ text: `Transitioned ${active.identifier} from ${result.fromState} to ${resolvedTo}${notesSuffix}. End this turn now; the next dispatch will pick up under the new state.`,
183
+ },
184
+ ],
185
+ isError: false,
186
+ structuredContent: {
187
+ from_state: result.fromState,
188
+ to_state: resolvedTo,
189
+ cleanup_workspace_on_exit: fold.cleanupWorkspaceOnExit,
190
+ notes_appended: effect.notes.length > 0,
191
+ },
192
+ },
193
+ };
194
+ }
195
+ // ── propose_issue happy path: write the file, build the success result ───────
196
+ async function respondPropose(ctx, active, id, effect) {
197
+ // The landing holding state was resolved by core's strict `pickHoldingState` at
198
+ // decision time and carried on the effect — use it verbatim. (The old inline
199
+ // re-resolution forked a `?? firstState ?? 'Triage'` fallback core never uses,
200
+ // so a config core treats as invalid could silently land an issue.) (§4a)
201
+ const landingState = effect.landingState;
202
+ const root = active.trackerRootSnapshot;
203
+ if (!root) {
204
+ return ctx.core.makeError(id, ctx.core.InternalError, 'tracker root is not available; cannot create issue files');
205
+ }
206
+ try {
207
+ const result = await ctx.exec.writeIssue(effect, ctx.clock.iso(), landingState, root);
208
+ if (result.kind !== 'written') {
209
+ return ctx.core.makeError(id, ctx.core.InternalError, 'unexpected propose result');
210
+ }
211
+ ctx.log.emit('info', 'mcp propose_issue', {
212
+ proposed_by: active.identifier,
213
+ identifier: result.identifier,
214
+ state: landingState,
215
+ title: effect.title,
216
+ description_chars: (effect.description ?? '').length,
217
+ });
218
+ return {
219
+ jsonrpc: '2.0',
220
+ id,
221
+ result: {
222
+ content: [
223
+ {
224
+ type: 'text',
225
+ text: `Proposed issue ${result.identifier} in ${landingState}/. The operator will approve or discard from the dashboard; do not wait for it. Continue your current task.`,
226
+ },
227
+ ],
228
+ isError: false,
229
+ structuredContent: { identifier: result.identifier, state: landingState, path: result.path },
230
+ },
231
+ };
232
+ }
233
+ catch (err) {
234
+ return ctx.core.makeError(id, ctx.core.InternalError, `failed to propose issue: ${err.message}`);
235
+ }
236
+ }
237
+ //# sourceMappingURL=mcp-runtime-effects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-runtime-effects.js","sourceRoot":"","sources":["../../../src/shell/server/mcp-runtime-effects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ // FCIS rewrite — shell server: the per-issue MCP registry + steering awaiter.
2
+ //
3
+ // The IMPERATIVE SHELL behind the per-dispatch MCP control plane: the runtime the
4
+ // unified HTTP server hands an inbound JSON-RPC envelope to once it has routed
5
+ // `/api/v1/issues/<id>/mcp`. It owns the stateful / IO half the pure core does not:
6
+ //
7
+ // • activate / deactivate per-dispatch ACTIVE ENTRIES — mint the per-dispatch
8
+ // bearer token (RandomSource), pin the dispatch-time tracker-root snapshot,
9
+ // and reset the entry's `transitioned` / `steering_*` flags at registration.
10
+ // • AUTH — registry membership + constant-time bearer compare.
11
+ // • FRAMING — token/active checks, then delegate envelope validation + the
12
+ // static initialize / tools/list / ping / notification routing to the injected
13
+ // pure core (core/mcp/protocol).
14
+ // • TOOLS/CALL — delegated to ./mcp-runtime-effects (decide → execute → fold →
15
+ // respond), keeping this file the registry + awaiter only.
16
+ // • THE STEERING AWAITER — the ONE place a parked Promise legitimately lives.
17
+ // `steering_requested` is flipped ON here and ONLY here, coupled to
18
+ // awaiter-liveness, and cleared in lockstep when the awaiter settles
19
+ // (mustFix issue 151 — the flag/awaiter desync).
20
+ //
21
+ // Port behavior reference (read-only): src/mcp.ts McpRegistry + awaitSteeringReply.
22
+ // vs. the original: the awaiter rejects synchronously on cancel/deactivate (the
23
+ // runner treats reject as cancelled) rather than polling a cancelSignal every
24
+ // 250ms — behaviourally equivalent, no timer.
25
+ //
26
+ // Shell rule: imports from src/types/** ONLY (+ the sibling interpreter). The
27
+ // composition root (main.ts) wires the McpEffectExec seam + the live
28
+ // state/prMerge providers and injects the pure core deciders.
29
+ import { dispatchToolCall, createSteeringAwaiter, projectStatesView, registerEntry, } from './mcp-runtime-effects.js';
30
+ export function createMcpRuntime(deps) {
31
+ const { core, crypto, random, clock, log } = deps;
32
+ const byIdentifier = new Map();
33
+ // ── live entry registration ────────────────────────────────────────────────
34
+ // Mint the per-dispatch bearer token, reset the entry's transition/steering
35
+ // flags, and register it; registerEntry (sibling) owns the snapshot-pinning.
36
+ const activate = (entry) => registerEntry(byIdentifier, entry, random.newToken(), log);
37
+ function deactivate(identifier) {
38
+ const active = byIdentifier.get(identifier);
39
+ if (!active)
40
+ return;
41
+ // Reject any waiter so the runner unblocks instead of hanging.
42
+ if (active.pendingReply) {
43
+ active.pendingReply.reject(new Error('mcp deactivated while awaiting human reply'));
44
+ active.pendingReply = null;
45
+ }
46
+ byIdentifier.delete(identifier);
47
+ log.emit('debug', 'mcp deactivated', { issue_identifier: identifier });
48
+ }
49
+ function isActive(identifier, token) {
50
+ const active = byIdentifier.get(identifier);
51
+ return !!active && crypto.constantTimeEqual(active.token, token);
52
+ }
53
+ // The ONE parked Promise lives in the awaiter; its flag/liveness coupling and
54
+ // the live-state projector are in ./mcp-runtime-effects.
55
+ const steering = createSteeringAwaiter(byIdentifier);
56
+ // The interpreter context (resolved deps + the live-states projector) handed to
57
+ // the tools/call pipeline in ./mcp-runtime-effects.
58
+ const ctx = {
59
+ core,
60
+ exec: deps.exec,
61
+ clock,
62
+ log,
63
+ liveStates: deps.liveStates,
64
+ livePrMerge: deps.livePrMerge,
65
+ statesView: () => projectStatesView(deps.liveStates()),
66
+ };
67
+ // ── JSON-RPC entrypoint ─────────────────────────────────────────────────────
68
+ async function handleJsonRpc(identifier, token, body) {
69
+ const active = byIdentifier.get(identifier);
70
+ if (!active)
71
+ return core.makeError(core.extractId(body), core.IssueNotActive, 'issue not active');
72
+ if (!crypto.constantTimeEqual(active.token, token)) {
73
+ return core.makeError(core.extractId(body), core.InvalidToken, 'invalid token');
74
+ }
75
+ if (!core.validateEnvelope(body)) {
76
+ return core.makeError(core.extractId(body), core.InvalidRequest, 'invalid JSON-RPC request');
77
+ }
78
+ const req = body;
79
+ try {
80
+ const framed = core.routeFraming(req);
81
+ if (framed.kind === 'none')
82
+ return null;
83
+ if (framed.kind === 'respond')
84
+ return framed.response;
85
+ // framed.kind === 'dispatch' — a stateful tools/call.
86
+ return await dispatchToolCall(ctx, active, framed.id, framed.toolName, framed.args);
87
+ }
88
+ catch (err) {
89
+ log.emit('warn', 'mcp handler error', {
90
+ issue_identifier: identifier,
91
+ method: req.method,
92
+ error: err.message,
93
+ });
94
+ return core.makeError(req.id ?? null, core.InternalError, err.message);
95
+ }
96
+ }
97
+ return { activate, deactivate, isActive, handleJsonRpc, steering };
98
+ }
99
+ //# sourceMappingURL=mcp-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-runtime.js","sourceRoot":"","sources":["../../../src/shell/server/mcp-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ // FCIS rewrite — the SINGLE shell-side copy of the workspace-key sanitizer.
2
+ //
3
+ // The canonical home is the pure core util (src/core/workspace-key.ts), but the
4
+ // shell may not import core, so this is the one shell mirror every shell module
5
+ // (the reconciler helpers, the runlog adapter, the workspace adapter) imports
6
+ // instead of inlining its own — collapsing the former 3 shell copies onto one.
7
+ // Keep byte-identical to src/core/workspace-key.ts:sanitizeWorkspaceKey.
8
+ //
9
+ // kind: shell (imports nothing — a pure string transform).
10
+ /** SPEC §5.5 Invariant 3: collapse every char outside `[A-Za-z0-9._-]` to `_`. */
11
+ export function sanitizeWorkspaceKey(identifier) {
12
+ return identifier.replace(/[^A-Za-z0-9._-]/g, '_');
13
+ }
14
+ //# sourceMappingURL=workspace-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-key.js","sourceRoot":"","sources":["../../src/shell/workspace-key.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,EAAE;AACF,gFAAgF;AAChF,gFAAgF;AAChF,8EAA8E;AAC9E,+EAA+E;AAC/E,yEAAyE;AACzE,EAAE;AACF,2DAA2D;AAE3D,kFAAkF;AAClF,MAAM,UAAU,oBAAoB,CAAC,UAAkB;IACrD,OAAO,UAAU,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,8 @@
1
+ // FCIS rewrite — ACP turn-loop + transport types.
2
+ //
3
+ // The ACP client is a SHELL adapter (WebSocket, streams). Core consumes the
4
+ // PromptOutcome union and folds it into turn decisions. PromptOutcome is the
5
+ // input to classifyTurnOutcome and feeds the transport_error → circuit-breaker
6
+ // path (isTransportError classification).
7
+ export {};
8
+ //# sourceMappingURL=acp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp.js","sourceRoot":"","sources":["../../src/types/acp.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,EAAE;AACF,4EAA4E;AAC5E,6EAA6E;AAC7E,+EAA+E;AAC/E,0CAA0C"}
@@ -0,0 +1,6 @@
1
+ // FCIS rewrite — output vocabulary of the pure action planner (src/core/actions/
2
+ // plan.ts). Declarations only (src/types holds no runtime logic). The planner
3
+ // re-exports these so importers keep the original `core/actions/plan.js`
4
+ // specifier.
5
+ export {};
6
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../src/types/actions/plan.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,8EAA8E;AAC9E,yEAAyE;AACzE,aAAa"}
@@ -0,0 +1,6 @@
1
+ // FCIS rewrite — type-only home for the `if:` predicate decider's decision
2
+ // shape. Lives in src/types (declarations only) because exported types must not
3
+ // be declared in core; src/core/actions/predicates.ts re-exports this so its
4
+ // importers keep their original specifier.
5
+ export {};
6
+ //# sourceMappingURL=predicates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predicates.js","sourceRoot":"","sources":["../../../src/types/actions/predicates.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,gFAAgF;AAChF,6EAA6E;AAC7E,2CAA2C"}
@@ -0,0 +1,8 @@
1
+ // FCIS rewrite — result shape for a finished action cleanup run.
2
+ //
3
+ // Pure declaration. The core run-fold reducer (src/core/actions/run-fold.ts)
4
+ // aggregates a finished loop into this shape; the shell embeds it in a
5
+ // Snapshot. Lives in src/types so both layers can name it without core
6
+ // exporting a type.
7
+ export {};
8
+ //# sourceMappingURL=run-fold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-fold.js","sourceRoot":"","sources":["../../../src/types/actions/run-fold.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,EAAE;AACF,6EAA6E;AAC7E,uEAAuE;AACvE,uEAAuE;AACvE,oBAAoB"}
@@ -0,0 +1,7 @@
1
+ // FCIS rewrite — typed action DAG (issue 36; per-state `actions:` blocks).
2
+ //
3
+ // Action records are pure data. The core planner (action/plan.ts) renders them
4
+ // into Effects; the core run-fold reducer (action/run-fold.ts) folds outcomes
5
+ // into retry/route/abort decisions. The shell only executes the emitted Effects.
6
+ export {};
7
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/types/actions.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,EAAE;AACF,+EAA+E;AAC/E,8EAA8E;AAC9E,iFAAiF"}
@@ -0,0 +1,4 @@
1
+ // Type declarations for the deterministic-seam adapters (src/shell/adapter/clock-random.ts).
2
+ // Co-located in src/types because exported types may not live in the shell ring.
3
+ export {};
4
+ //# sourceMappingURL=clock-random.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clock-random.js","sourceRoot":"","sources":["../../../src/types/adapter/clock-random.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,iFAAiF"}
@@ -0,0 +1,5 @@
1
+ // FCIS rewrite — types for the OCI→gondolin image converter (src/shell/adapter/
2
+ // gondolin-image-converter.ts, issue 206). Declarations only; the adapter re-exports
3
+ // them so importers keep the original specifier.
4
+ export {};
5
+ //# sourceMappingURL=gondolin-image-converter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gondolin-image-converter.js","sourceRoot":"","sources":["../../../src/types/adapter/gondolin-image-converter.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,qFAAqF;AACrF,iDAAiD"}
@@ -0,0 +1,5 @@
1
+ // FCIS rewrite — types for the managed prebuilt-image fetcher (src/shell/adapter/
2
+ // gondolin-image-fetch.ts, issue 224). Declarations only; the adapter re-exports them
3
+ // so importers keep the original specifier. Mirrors gondolin-image-converter's types.
4
+ export {};
5
+ //# sourceMappingURL=gondolin-image-fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gondolin-image-fetch.js","sourceRoot":"","sources":["../../../src/types/adapter/gondolin-image-fetch.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,sFAAsF;AACtF,sFAAsF"}
@@ -0,0 +1,4 @@
1
+ // Type declarations for the WORKFLOW.yaml load/watch adapter (src/shell/adapter/workflow-loader.ts).
2
+ // Co-located in src/types because exported types may not live in the shell ring.
3
+ export {};
4
+ //# sourceMappingURL=workflow-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-loader.js","sourceRoot":"","sources":["../../../src/types/adapter/workflow-loader.ts"],"names":[],"mappings":"AAAA,qGAAqG;AACrG,iFAAiF"}
@@ -0,0 +1,8 @@
1
+ // Result types for the pure CLI parser (src/core/cli/args.ts).
2
+ //
3
+ // These are declarations only (per the types-layer contract). The parser
4
+ // returns a CliResult directive the shell interprets: `ok` carries the typed
5
+ // Cli command, `help`/`error` carry a message + exit code the shell writes to
6
+ // the matching stream before exiting.
7
+ export {};
8
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../../src/types/cli/args.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,EAAE;AACF,yEAAyE;AACzE,6EAA6E;AAC7E,8EAA8E;AAC9E,sCAAsC"}
@@ -0,0 +1,8 @@
1
+ // FCIS rewrite — service configuration (parsed from the WORKFLOW.yaml config).
2
+ //
3
+ // Pure declarations. The whole config tree the parser/validator/derivers in
4
+ // src/core/workflow produce. Split out of domain.ts (per the synthesis: a
5
+ // dedicated config.ts is the most navigable home for the ~20 config
6
+ // interfaces) so the data-model file stays small.
7
+ export {};
8
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,EAAE;AACF,4EAA4E;AAC5E,0EAA0E;AAC1E,oEAAoE;AACpE,kDAAkD"}
@@ -0,0 +1,6 @@
1
+ // FCIS rewrite — pure type declarations for the host-only credential adapter
2
+ // (shell/interp/credential.ts + its credential-* siblings). The shell modules hold
3
+ // runtime logic only and re-export these as types, so every exported credential
4
+ // interface lives in src/types per the hexagonal rule.
5
+ export {};
6
+ //# sourceMappingURL=credential-interp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-interp.js","sourceRoot":"","sources":["../../src/types/credential-interp.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,mFAAmF;AACnF,gFAAgF;AAChF,uDAAuD"}
@@ -0,0 +1,10 @@
1
+ // FCIS rewrite — credential + adapter-staging types.
2
+ //
3
+ // SECURITY-LOAD-BEARING. Split (per the synthesis): the PURE half (token/JWT-exp
4
+ // extraction, placeholder-JWT assembly, adapter specs, egress-allowlist union,
5
+ // host-identity EXTRACTORS over already-parsed JSON, vm-guards) lives in core;
6
+ // the IMPURE half (host file reads, flock, refresher spawn, egress secret
7
+ // substitution via createHttpHooks) lives in the shell. The invariant:
8
+ // host-only refresh / placeholder-only guest.
9
+ export {};
10
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/types/credentials.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,EAAE;AACF,iFAAiF;AACjF,+EAA+E;AAC/E,+EAA+E;AAC/E,0EAA0E;AAC1E,uEAAuE;AACvE,8CAA8C"}
@@ -0,0 +1,7 @@
1
+ // FCIS rewrite — doctor preflight + CLI + dispatch-pipeline (vm-plan) types.
2
+ //
3
+ // The doctor IO probes live in the shell; the pure checks turn each raw
4
+ // observation into a typed DoctorCheck row and render the aligned report.
5
+ // The CLI + startup banner shapes live here too.
6
+ export {};
7
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/types/doctor.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,EAAE;AACF,wEAAwE;AACxE,0EAA0E;AAC1E,iDAAiD"}
@@ -0,0 +1,7 @@
1
+ // FCIS rewrite — domain data model (SPEC §3).
2
+ //
3
+ // Pure declarations only. Zero runtime logic. Imported by core and shell.
4
+ // The domain types are the nouns the system reasons about: issues, blockers,
5
+ // workspaces, runtime events, transitions, token totals.
6
+ export {};
7
+ //# sourceMappingURL=domain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain.js","sourceRoot":"","sources":["../../src/types/domain.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,EAAE;AACF,0EAA0E;AAC1E,6EAA6E;AAC7E,yDAAyD"}
@@ -0,0 +1,15 @@
1
+ // FCIS rewrite — the Effect discriminated union (the CENTRAL vocabulary).
2
+ //
3
+ // Every side effect the system performs is a discriminated Effect variant. Core
4
+ // RETURNS Effect[]; the shell EXECUTES them and folds the EffectResult back into
5
+ // the owning per-loop reducer. The synthesis rule on non-determinism: SLEEP and
6
+ // TIMERS (sequencing-sensitive — the action-retry backoff, the reaper grace, the
7
+ // orchestrator stall/poll timers) are MODELED AS EFFECTS so the loops stay
8
+ // pure-testable; trivial reads (clock.now, random token, crypto-eq, hash) are
9
+ // supplied to deciders as injected PORT readings/snapshot values (see ports.ts),
10
+ // avoiding interpreter round-trips. Everything below that touches the network,
11
+ // the filesystem, a child process, a VM, the tracker, or a socket is an Effect.
12
+ //
13
+ // Naming: `<family>.<verb>`. Each family has exactly ONE shell interpreter.
14
+ export {};
15
+ //# sourceMappingURL=effect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect.js","sourceRoot":"","sources":["../../src/types/effect.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,EAAE;AACF,gFAAgF;AAChF,iFAAiF;AACjF,gFAAgF;AAChF,iFAAiF;AACjF,2EAA2E;AAC3E,8EAA8E;AAC9E,iFAAiF;AACjF,+EAA+E;AAC/E,gFAAgF;AAChF,EAAE;AACF,4EAA4E"}
@@ -0,0 +1,39 @@
1
+ // FCIS rewrite — typed error classes shared across layers.
2
+ //
3
+ // Coded errors carry a `code` so callers can branch on the failure category as
4
+ // data. Core modules construct these (pure value objects); the shell catches
5
+ // them at IO boundaries. They live here (with everyone's other types) so every
6
+ // layer can import them without crossing the hexagonal boundary.
7
+ //
8
+ // They are defined as class *expressions* via factories — not `class`
9
+ // declarations — so the file stays free of the runtime-logic ban on `src/types`
10
+ // while still exporting real, `instanceof`-able error values. Each export pairs
11
+ // a value (the class) with a same-named type alias so the symbol resolves in
12
+ // both value and type position.
13
+ /** A class carrying a `code` discriminator alongside the message. */
14
+ const codedError = (name) => class extends Error {
15
+ code;
16
+ constructor(code, message) {
17
+ super(message);
18
+ this.code = code;
19
+ this.name = name;
20
+ }
21
+ };
22
+ /** A plain message-only error class. */
23
+ const plainError = (name) => class extends Error {
24
+ constructor(message) {
25
+ super(message);
26
+ this.name = name;
27
+ }
28
+ };
29
+ /** A WORKFLOW.yaml parse / validation failure. */
30
+ export const WorkflowError = codedError('WorkflowError');
31
+ /** A prompt-render failure (unknown variable / filter). */
32
+ export const PromptError = codedError('PromptError');
33
+ /** A tracker IO failure (carried out of the shell tracker adapter). */
34
+ export const TrackerError = codedError('TrackerError');
35
+ /** No holding state declared (triage from-state cannot be resolved). */
36
+ export const NoHoldingStateError = plainError('NoHoldingStateError');
37
+ /** A credential-mount guard rejection (a credential path was about to be mounted into the guest). */
38
+ export const CredentialMountError = plainError('CredentialMountError');
39
+ //# sourceMappingURL=errors.js.map