smol-symphony 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (716) hide show
  1. package/AGENTS.md +41 -22
  2. package/DESIGN.md +494 -273
  3. package/README.md +109 -57
  4. package/SPEC.md +33 -24
  5. package/WORKFLOW.minimal.yaml +34 -0
  6. package/{WORKFLOW.template.md → WORKFLOW.template.yaml} +409 -256
  7. package/WORKFLOW.yaml +487 -0
  8. package/assets/skills/symphony-issues/SKILL.md +136 -0
  9. package/assets/symphony-mise.system.toml +68 -0
  10. package/dist/src/bin/symphony.js +30 -0
  11. package/dist/src/bin/symphony.js.map +1 -0
  12. package/dist/src/core/actions/context.js +109 -0
  13. package/dist/src/core/actions/context.js.map +1 -0
  14. package/dist/{actions/parsing.js → src/core/actions/parse.js} +33 -114
  15. package/dist/src/core/actions/parse.js.map +1 -0
  16. package/dist/src/core/actions/plan.js +197 -0
  17. package/dist/src/core/actions/plan.js.map +1 -0
  18. package/dist/src/core/actions/predicates.js +111 -0
  19. package/dist/src/core/actions/predicates.js.map +1 -0
  20. package/dist/src/core/actions/run-fold.js +248 -0
  21. package/dist/src/core/actions/run-fold.js.map +1 -0
  22. package/dist/src/core/actions/template.js +118 -0
  23. package/dist/src/core/actions/template.js.map +1 -0
  24. package/dist/src/core/cli/args.js +116 -0
  25. package/dist/src/core/cli/args.js.map +1 -0
  26. package/dist/src/core/coerce.js +75 -0
  27. package/dist/src/core/coerce.js.map +1 -0
  28. package/dist/src/core/credential/account-id.js +20 -0
  29. package/dist/src/core/credential/account-id.js.map +1 -0
  30. package/dist/src/core/credential/adapter-config.js +136 -0
  31. package/dist/src/core/credential/adapter-config.js.map +1 -0
  32. package/dist/src/core/credential/availability.js +98 -0
  33. package/dist/src/core/credential/availability.js.map +1 -0
  34. package/dist/src/core/credential/extract.js +228 -0
  35. package/dist/src/core/credential/extract.js.map +1 -0
  36. package/dist/src/core/credential/fake-creds.js +171 -0
  37. package/dist/src/core/credential/fake-creds.js.map +1 -0
  38. package/dist/src/core/credential/identity.js +125 -0
  39. package/dist/src/core/credential/identity.js.map +1 -0
  40. package/dist/src/core/credential/shape.js +230 -0
  41. package/dist/src/core/credential/shape.js.map +1 -0
  42. package/dist/src/core/credential/strings.js +15 -0
  43. package/dist/src/core/credential/strings.js.map +1 -0
  44. package/dist/src/core/doctor/checks.js +303 -0
  45. package/dist/src/core/doctor/checks.js.map +1 -0
  46. package/dist/src/core/git/result.js +107 -0
  47. package/dist/src/core/git/result.js.map +1 -0
  48. package/dist/src/core/http/decisions.js +225 -0
  49. package/dist/src/core/http/decisions.js.map +1 -0
  50. package/dist/{http.js → src/core/http/render.js} +472 -738
  51. package/dist/src/core/http/render.js.map +1 -0
  52. package/dist/{http-handlers.js → src/core/http/routes.js} +52 -87
  53. package/dist/src/core/http/routes.js.map +1 -0
  54. package/dist/src/core/http/views.js +181 -0
  55. package/dist/src/core/http/views.js.map +1 -0
  56. package/dist/src/core/image/managed-image.js +95 -0
  57. package/dist/src/core/image/managed-image.js.map +1 -0
  58. package/dist/src/core/issue/file.js +149 -0
  59. package/dist/src/core/issue/file.js.map +1 -0
  60. package/dist/src/core/issue/parse.js +210 -0
  61. package/dist/src/core/issue/parse.js.map +1 -0
  62. package/dist/src/core/mcp/dispatch.js +239 -0
  63. package/dist/src/core/mcp/dispatch.js.map +1 -0
  64. package/dist/src/core/mcp/post-move.js +92 -0
  65. package/dist/src/core/mcp/post-move.js.map +1 -0
  66. package/dist/src/core/mcp/protocol.js +293 -0
  67. package/dist/src/core/mcp/protocol.js.map +1 -0
  68. package/dist/src/core/mcp/url.js +162 -0
  69. package/dist/src/core/mcp/url.js.map +1 -0
  70. package/dist/src/core/path.js +63 -0
  71. package/dist/src/core/path.js.map +1 -0
  72. package/dist/src/core/reconcile/image-decide.js +48 -0
  73. package/dist/src/core/reconcile/image-decide.js.map +1 -0
  74. package/dist/src/core/reconcile/ledger.js +142 -0
  75. package/dist/src/core/reconcile/ledger.js.map +1 -0
  76. package/dist/src/core/reconcile/pr-classify.js +62 -0
  77. package/dist/src/core/reconcile/pr-classify.js.map +1 -0
  78. package/dist/{reconciler → src/core/reconcile}/pr-decide.js +25 -12
  79. package/dist/src/core/reconcile/pr-decide.js.map +1 -0
  80. package/dist/src/core/reconcile/pr-loop.js +161 -0
  81. package/dist/src/core/reconcile/pr-loop.js.map +1 -0
  82. package/dist/src/core/reconcile/pr-notes.js +35 -0
  83. package/dist/src/core/reconcile/pr-notes.js.map +1 -0
  84. package/dist/src/core/reconcile/vm-decide.js +70 -0
  85. package/dist/src/core/reconcile/vm-decide.js.map +1 -0
  86. package/dist/src/core/reconcile/vm-reap.js +207 -0
  87. package/dist/src/core/reconcile/vm-reap.js.map +1 -0
  88. package/dist/src/core/reconcile/workspace-decide.js +162 -0
  89. package/dist/src/core/reconcile/workspace-decide.js.map +1 -0
  90. package/dist/src/core/runlog/summary.js +231 -0
  91. package/dist/src/core/runlog/summary.js.map +1 -0
  92. package/dist/src/core/runner/dispatch-config.js +95 -0
  93. package/dist/src/core/runner/dispatch-config.js.map +1 -0
  94. package/dist/src/core/runner/injection.js +61 -0
  95. package/dist/src/core/runner/injection.js.map +1 -0
  96. package/dist/src/core/runner/mise.js +210 -0
  97. package/dist/src/core/runner/mise.js.map +1 -0
  98. package/dist/src/core/runner/prompt.js +720 -0
  99. package/dist/src/core/runner/prompt.js.map +1 -0
  100. package/dist/src/core/runner/turn.js +242 -0
  101. package/dist/src/core/runner/turn.js.map +1 -0
  102. package/dist/src/core/runner/vm-plan.js +390 -0
  103. package/dist/src/core/runner/vm-plan.js.map +1 -0
  104. package/dist/src/core/schedule/admission.js +123 -0
  105. package/dist/src/core/schedule/admission.js.map +1 -0
  106. package/dist/src/core/schedule/circuit-breaker.js +111 -0
  107. package/dist/src/core/schedule/circuit-breaker.js.map +1 -0
  108. package/dist/src/core/schedule/eligibility.js +83 -0
  109. package/dist/src/core/schedule/eligibility.js.map +1 -0
  110. package/dist/src/core/schedule/reconcile-issue.js +82 -0
  111. package/dist/src/core/schedule/reconcile-issue.js.map +1 -0
  112. package/dist/src/core/schedule/retry.js +96 -0
  113. package/dist/src/core/schedule/retry.js.map +1 -0
  114. package/dist/src/core/schedule/sleep-cycle.js +133 -0
  115. package/dist/src/core/schedule/sleep-cycle.js.map +1 -0
  116. package/dist/src/core/schedule/slots.js +124 -0
  117. package/dist/src/core/schedule/slots.js.map +1 -0
  118. package/dist/src/core/schedule/tick.js +553 -0
  119. package/dist/src/core/schedule/tick.js.map +1 -0
  120. package/dist/src/core/schedule/token-fold.js +181 -0
  121. package/dist/src/core/schedule/token-fold.js.map +1 -0
  122. package/dist/src/core/state-resolve.js +86 -0
  123. package/dist/src/core/state-resolve.js.map +1 -0
  124. package/dist/src/core/vm-guards.js +278 -0
  125. package/dist/src/core/vm-guards.js.map +1 -0
  126. package/dist/src/core/workflow/derive.js +107 -0
  127. package/dist/src/core/workflow/derive.js.map +1 -0
  128. package/dist/src/core/workflow/parse.js +687 -0
  129. package/dist/src/core/workflow/parse.js.map +1 -0
  130. package/dist/src/core/workflow/prompt-probe.js +78 -0
  131. package/dist/src/core/workflow/prompt-probe.js.map +1 -0
  132. package/dist/src/core/workflow/validate.js +189 -0
  133. package/dist/src/core/workflow/validate.js.map +1 -0
  134. package/dist/src/core/workspace-key.js +19 -0
  135. package/dist/src/core/workspace-key.js.map +1 -0
  136. package/dist/src/shell/actions-runner.js +356 -0
  137. package/dist/src/shell/actions-runner.js.map +1 -0
  138. package/dist/src/shell/adapter/adapter-registry.js +45 -0
  139. package/dist/src/shell/adapter/adapter-registry.js.map +1 -0
  140. package/dist/src/shell/adapter/clock-random.js +96 -0
  141. package/dist/src/shell/adapter/clock-random.js.map +1 -0
  142. package/dist/src/shell/adapter/gondolin-dispatch-helpers.js +158 -0
  143. package/dist/src/shell/adapter/gondolin-dispatch-helpers.js.map +1 -0
  144. package/dist/src/shell/adapter/gondolin-dispatch.js +385 -0
  145. package/dist/src/shell/adapter/gondolin-dispatch.js.map +1 -0
  146. package/dist/src/shell/adapter/gondolin-image-converter.js +233 -0
  147. package/dist/src/shell/adapter/gondolin-image-converter.js.map +1 -0
  148. package/dist/src/shell/adapter/gondolin-image-fetch.js +180 -0
  149. package/dist/src/shell/adapter/gondolin-image-fetch.js.map +1 -0
  150. package/dist/src/shell/adapter/launcher-asset.js +57 -0
  151. package/dist/src/shell/adapter/launcher-asset.js.map +1 -0
  152. package/dist/src/shell/adapter/mise-config-asset.js +65 -0
  153. package/dist/src/shell/adapter/mise-config-asset.js.map +1 -0
  154. package/dist/src/shell/adapter/workflow-loader.js +304 -0
  155. package/dist/src/shell/adapter/workflow-loader.js.map +1 -0
  156. package/dist/src/shell/cli/doctor.js +268 -0
  157. package/dist/src/shell/cli/doctor.js.map +1 -0
  158. package/dist/src/shell/effect-interpreter-families.js +314 -0
  159. package/dist/src/shell/effect-interpreter-families.js.map +1 -0
  160. package/dist/src/shell/effect-interpreter.js +29 -0
  161. package/dist/src/shell/effect-interpreter.js.map +1 -0
  162. package/dist/src/shell/interp/acp-frame.js +137 -0
  163. package/dist/src/shell/interp/acp-frame.js.map +1 -0
  164. package/dist/src/shell/interp/acp-ws-conn.js +320 -0
  165. package/dist/src/shell/interp/acp-ws-conn.js.map +1 -0
  166. package/dist/src/shell/interp/acp-ws-frames.js +159 -0
  167. package/dist/src/shell/interp/acp-ws-frames.js.map +1 -0
  168. package/dist/src/shell/interp/acp-ws.js +197 -0
  169. package/dist/src/shell/interp/acp-ws.js.map +1 -0
  170. package/dist/src/shell/interp/acp.js +319 -0
  171. package/dist/src/shell/interp/acp.js.map +1 -0
  172. package/dist/src/shell/interp/credential-defaults.js +128 -0
  173. package/dist/src/shell/interp/credential-defaults.js.map +1 -0
  174. package/dist/src/shell/interp/credential-hooks.js +149 -0
  175. package/dist/src/shell/interp/credential-hooks.js.map +1 -0
  176. package/dist/src/shell/interp/credential-registry.js +226 -0
  177. package/dist/src/shell/interp/credential-registry.js.map +1 -0
  178. package/dist/src/shell/interp/credential.js +103 -0
  179. package/dist/src/shell/interp/credential.js.map +1 -0
  180. package/dist/src/shell/interp/gh.js +163 -0
  181. package/dist/src/shell/interp/gh.js.map +1 -0
  182. package/dist/src/shell/interp/git.js +28 -0
  183. package/dist/src/shell/interp/git.js.map +1 -0
  184. package/dist/src/shell/interp/log.js +213 -0
  185. package/dist/src/shell/interp/log.js.map +1 -0
  186. package/dist/src/shell/interp/process.js +178 -0
  187. package/dist/src/shell/interp/process.js.map +1 -0
  188. package/dist/src/shell/interp/runlog.js +193 -0
  189. package/dist/src/shell/interp/runlog.js.map +1 -0
  190. package/dist/src/shell/interp/timer.js +64 -0
  191. package/dist/src/shell/interp/timer.js.map +1 -0
  192. package/dist/src/shell/interp/tracker-disk.js +99 -0
  193. package/dist/src/shell/interp/tracker-disk.js.map +1 -0
  194. package/dist/src/shell/interp/tracker-parse.js +71 -0
  195. package/dist/src/shell/interp/tracker-parse.js.map +1 -0
  196. package/dist/src/shell/interp/tracker-scan.js +238 -0
  197. package/dist/src/shell/interp/tracker-scan.js.map +1 -0
  198. package/dist/src/shell/interp/tracker-write.js +91 -0
  199. package/dist/src/shell/interp/tracker-write.js.map +1 -0
  200. package/dist/src/shell/interp/tracker.js +41 -0
  201. package/dist/src/shell/interp/tracker.js.map +1 -0
  202. package/dist/src/shell/interp/tty.js +48 -0
  203. package/dist/src/shell/interp/tty.js.map +1 -0
  204. package/dist/src/shell/interp/vm.js +199 -0
  205. package/dist/src/shell/interp/vm.js.map +1 -0
  206. package/dist/src/shell/interp/workspace.js +310 -0
  207. package/dist/src/shell/interp/workspace.js.map +1 -0
  208. package/dist/src/shell/main-acp.js +78 -0
  209. package/dist/src/shell/main-acp.js.map +1 -0
  210. package/dist/src/shell/main-adapters.js +222 -0
  211. package/dist/src/shell/main-adapters.js.map +1 -0
  212. package/dist/src/shell/main-credential.js +122 -0
  213. package/dist/src/shell/main-credential.js.map +1 -0
  214. package/dist/src/shell/main-doctor.js +22 -0
  215. package/dist/src/shell/main-doctor.js.map +1 -0
  216. package/dist/src/shell/main-entry.js +46 -0
  217. package/dist/src/shell/main-entry.js.map +1 -0
  218. package/dist/src/shell/main-http-csrf.js +45 -0
  219. package/dist/src/shell/main-http-csrf.js.map +1 -0
  220. package/dist/src/shell/main-http-handler.js +389 -0
  221. package/dist/src/shell/main-http-handler.js.map +1 -0
  222. package/dist/src/shell/main-http-mcp.js +122 -0
  223. package/dist/src/shell/main-http-mcp.js.map +1 -0
  224. package/dist/src/shell/main-http-views.js +253 -0
  225. package/dist/src/shell/main-http-views.js.map +1 -0
  226. package/dist/src/shell/main-http.js +76 -0
  227. package/dist/src/shell/main-http.js.map +1 -0
  228. package/dist/src/shell/main-loops.js +130 -0
  229. package/dist/src/shell/main-loops.js.map +1 -0
  230. package/dist/src/shell/main-mcp.js +129 -0
  231. package/dist/src/shell/main-mcp.js.map +1 -0
  232. package/dist/src/shell/main-orchestrator.js +120 -0
  233. package/dist/src/shell/main-orchestrator.js.map +1 -0
  234. package/dist/src/shell/main-preflight.js +43 -0
  235. package/dist/src/shell/main-preflight.js.map +1 -0
  236. package/dist/src/shell/main-reconcilers-helpers.js +244 -0
  237. package/dist/src/shell/main-reconcilers-helpers.js.map +1 -0
  238. package/dist/src/shell/main-reconcilers-pr.js +148 -0
  239. package/dist/src/shell/main-reconcilers-pr.js.map +1 -0
  240. package/dist/src/shell/main-reconcilers.js +225 -0
  241. package/dist/src/shell/main-reconcilers.js.map +1 -0
  242. package/dist/src/shell/main-runner.js +355 -0
  243. package/dist/src/shell/main-runner.js.map +1 -0
  244. package/dist/src/shell/main-scaffold.js +116 -0
  245. package/dist/src/shell/main-scaffold.js.map +1 -0
  246. package/dist/src/shell/main-shutdown.js +115 -0
  247. package/dist/src/shell/main-shutdown.js.map +1 -0
  248. package/dist/src/shell/main-startup.js +48 -0
  249. package/dist/src/shell/main-startup.js.map +1 -0
  250. package/dist/src/shell/main-substrates.js +43 -0
  251. package/dist/src/shell/main-substrates.js.map +1 -0
  252. package/dist/src/shell/main.js +385 -0
  253. package/dist/src/shell/main.js.map +1 -0
  254. package/dist/src/shell/orchestrator-feedback.js +69 -0
  255. package/dist/src/shell/orchestrator-feedback.js.map +1 -0
  256. package/dist/src/shell/orchestrator-image.js +167 -0
  257. package/dist/src/shell/orchestrator-image.js.map +1 -0
  258. package/dist/src/shell/orchestrator-loop.js +468 -0
  259. package/dist/src/shell/orchestrator-loop.js.map +1 -0
  260. package/dist/src/shell/orchestrator-reconcile.js +36 -0
  261. package/dist/src/shell/orchestrator-reconcile.js.map +1 -0
  262. package/dist/src/shell/reconciler-loop.js +228 -0
  263. package/dist/src/shell/reconciler-loop.js.map +1 -0
  264. package/dist/src/shell/runner-loop-turn.js +301 -0
  265. package/dist/src/shell/runner-loop-turn.js.map +1 -0
  266. package/dist/src/shell/runner-loop.js +338 -0
  267. package/dist/src/shell/runner-loop.js.map +1 -0
  268. package/dist/src/shell/server/http.js +208 -0
  269. package/dist/src/shell/server/http.js.map +1 -0
  270. package/dist/src/shell/server/mcp-runtime-effects.js +237 -0
  271. package/dist/src/shell/server/mcp-runtime-effects.js.map +1 -0
  272. package/dist/src/shell/server/mcp-runtime.js +99 -0
  273. package/dist/src/shell/server/mcp-runtime.js.map +1 -0
  274. package/dist/src/shell/workspace-key.js +14 -0
  275. package/dist/src/shell/workspace-key.js.map +1 -0
  276. package/dist/src/types/acp.js +8 -0
  277. package/dist/src/types/acp.js.map +1 -0
  278. package/dist/src/types/actions/plan.js +6 -0
  279. package/dist/src/types/actions/plan.js.map +1 -0
  280. package/dist/src/types/actions/predicates.js +6 -0
  281. package/dist/src/types/actions/predicates.js.map +1 -0
  282. package/dist/src/types/actions/run-fold.js +8 -0
  283. package/dist/src/types/actions/run-fold.js.map +1 -0
  284. package/dist/src/types/actions.js +7 -0
  285. package/dist/src/types/actions.js.map +1 -0
  286. package/dist/src/types/adapter/clock-random.js +4 -0
  287. package/dist/src/types/adapter/clock-random.js.map +1 -0
  288. package/dist/src/types/adapter/gondolin-image-converter.js +5 -0
  289. package/dist/src/types/adapter/gondolin-image-converter.js.map +1 -0
  290. package/dist/src/types/adapter/gondolin-image-fetch.js +5 -0
  291. package/dist/src/types/adapter/gondolin-image-fetch.js.map +1 -0
  292. package/dist/src/types/adapter/workflow-loader.js +4 -0
  293. package/dist/src/types/adapter/workflow-loader.js.map +1 -0
  294. package/dist/src/types/cli/args.js +8 -0
  295. package/dist/src/types/cli/args.js.map +1 -0
  296. package/dist/src/types/config.js +8 -0
  297. package/dist/src/types/config.js.map +1 -0
  298. package/dist/src/types/credential-interp.js +6 -0
  299. package/dist/src/types/credential-interp.js.map +1 -0
  300. package/dist/src/types/credentials.js +10 -0
  301. package/dist/src/types/credentials.js.map +1 -0
  302. package/dist/src/types/doctor.js +7 -0
  303. package/dist/src/types/doctor.js.map +1 -0
  304. package/dist/src/types/domain.js +7 -0
  305. package/dist/src/types/domain.js.map +1 -0
  306. package/dist/src/types/effect.js +15 -0
  307. package/dist/src/types/effect.js.map +1 -0
  308. package/dist/src/types/errors.js +39 -0
  309. package/dist/src/types/errors.js.map +1 -0
  310. package/dist/src/types/http/decisions.js +6 -0
  311. package/dist/src/types/http/decisions.js.map +1 -0
  312. package/dist/src/types/http/render.js +10 -0
  313. package/dist/src/types/http/render.js.map +1 -0
  314. package/dist/src/types/http/views.js +6 -0
  315. package/dist/src/types/http/views.js.map +1 -0
  316. package/dist/src/types/http.js +9 -0
  317. package/dist/src/types/http.js.map +1 -0
  318. package/dist/src/types/image/managed-image.js +7 -0
  319. package/dist/src/types/image/managed-image.js.map +1 -0
  320. package/dist/src/types/interp/effect-interpreter.js +8 -0
  321. package/dist/src/types/interp/effect-interpreter.js.map +1 -0
  322. package/dist/src/types/interp/tracker.js +7 -0
  323. package/dist/src/types/interp/tracker.js.map +1 -0
  324. package/dist/src/types/issue/file.js +6 -0
  325. package/dist/src/types/issue/file.js.map +1 -0
  326. package/dist/src/types/issue/parse.js +8 -0
  327. package/dist/src/types/issue/parse.js.map +1 -0
  328. package/dist/src/types/main-acp.js +13 -0
  329. package/dist/src/types/main-acp.js.map +1 -0
  330. package/dist/src/types/main-adapters.js +5 -0
  331. package/dist/src/types/main-adapters.js.map +1 -0
  332. package/dist/src/types/main-credential.js +21 -0
  333. package/dist/src/types/main-credential.js.map +1 -0
  334. package/dist/src/types/main-doctor.js +6 -0
  335. package/dist/src/types/main-doctor.js.map +1 -0
  336. package/dist/src/types/main-http-handler.js +12 -0
  337. package/dist/src/types/main-http-handler.js.map +1 -0
  338. package/dist/src/types/main-http.js +5 -0
  339. package/dist/src/types/main-http.js.map +1 -0
  340. package/dist/src/types/main-loops.js +5 -0
  341. package/dist/src/types/main-loops.js.map +1 -0
  342. package/dist/src/types/main-mcp.js +12 -0
  343. package/dist/src/types/main-mcp.js.map +1 -0
  344. package/dist/src/types/main-orchestrator.js +5 -0
  345. package/dist/src/types/main-orchestrator.js.map +1 -0
  346. package/dist/src/types/main-reconcilers.js +11 -0
  347. package/dist/src/types/main-reconcilers.js.map +1 -0
  348. package/dist/src/types/main-runner.js +13 -0
  349. package/dist/src/types/main-runner.js.map +1 -0
  350. package/dist/src/types/main-startup.js +5 -0
  351. package/dist/src/types/main-startup.js.map +1 -0
  352. package/dist/src/types/main-substrates.js +5 -0
  353. package/dist/src/types/main-substrates.js.map +1 -0
  354. package/dist/src/types/mcp/dispatch.js +4 -0
  355. package/dist/src/types/mcp/dispatch.js.map +1 -0
  356. package/dist/src/types/mcp/post-move.js +7 -0
  357. package/dist/src/types/mcp/post-move.js.map +1 -0
  358. package/dist/src/types/mcp.js +9 -0
  359. package/dist/src/types/mcp.js.map +1 -0
  360. package/dist/src/types/ports.js +12 -0
  361. package/dist/src/types/ports.js.map +1 -0
  362. package/dist/src/types/reconcile/image-decide.js +5 -0
  363. package/dist/src/types/reconcile/image-decide.js.map +1 -0
  364. package/dist/src/types/reconcile/ledger.js +7 -0
  365. package/dist/src/types/reconcile/ledger.js.map +1 -0
  366. package/dist/src/types/reconcile/pr-loop.js +8 -0
  367. package/dist/src/types/reconcile/pr-loop.js.map +1 -0
  368. package/dist/src/types/reconcile/vm-reap.js +8 -0
  369. package/dist/src/types/reconcile/vm-reap.js.map +1 -0
  370. package/dist/src/types/reconcile/workspace-decide.js +7 -0
  371. package/dist/src/types/reconcile/workspace-decide.js.map +1 -0
  372. package/dist/src/types/reconcile.js +9 -0
  373. package/dist/src/types/reconcile.js.map +1 -0
  374. package/dist/src/types/runlog.js +7 -0
  375. package/dist/src/types/runlog.js.map +1 -0
  376. package/dist/src/types/runner/actions-runner.js +12 -0
  377. package/dist/src/types/runner/actions-runner.js.map +1 -0
  378. package/dist/src/types/runner/gondolin-dispatch.js +5 -0
  379. package/dist/src/types/runner/gondolin-dispatch.js.map +1 -0
  380. package/dist/src/types/runner/injection.js +6 -0
  381. package/dist/src/types/runner/injection.js.map +1 -0
  382. package/dist/src/types/runner/runner-loop.js +5 -0
  383. package/dist/src/types/runner/runner-loop.js.map +1 -0
  384. package/dist/src/types/runner/turn.js +4 -0
  385. package/dist/src/types/runner/turn.js.map +1 -0
  386. package/dist/src/types/runner/vm-plan.js +4 -0
  387. package/dist/src/types/runner/vm-plan.js.map +1 -0
  388. package/dist/src/types/runtime.js +9 -0
  389. package/dist/src/types/runtime.js.map +1 -0
  390. package/dist/src/types/schedule/admission.js +7 -0
  391. package/dist/src/types/schedule/admission.js.map +1 -0
  392. package/dist/src/types/schedule/circuit-breaker.js +2 -0
  393. package/dist/src/types/schedule/circuit-breaker.js.map +1 -0
  394. package/dist/src/types/schedule/eligibility.js +9 -0
  395. package/dist/src/types/schedule/eligibility.js.map +1 -0
  396. package/dist/src/types/schedule/orchestrator-loop.js +10 -0
  397. package/dist/src/types/schedule/orchestrator-loop.js.map +1 -0
  398. package/dist/src/types/schedule/sleep-cycle.js +4 -0
  399. package/dist/src/types/schedule/sleep-cycle.js.map +1 -0
  400. package/dist/src/types/schedule/slots.js +8 -0
  401. package/dist/src/types/schedule/slots.js.map +1 -0
  402. package/dist/src/types/schedule/tick.js +9 -0
  403. package/dist/src/types/schedule/tick.js.map +1 -0
  404. package/dist/src/types/server/mcp-runtime.js +8 -0
  405. package/dist/src/types/server/mcp-runtime.js.map +1 -0
  406. package/dist/src/types/workflow/parse.js +4 -0
  407. package/dist/src/types/workflow/parse.js.map +1 -0
  408. package/dist/tests/core/account-id.test.js +35 -0
  409. package/dist/tests/core/account-id.test.js.map +1 -0
  410. package/dist/tests/core/actions-parse.test.js +176 -0
  411. package/dist/tests/core/actions-parse.test.js.map +1 -0
  412. package/dist/tests/core/adapter-config.test.js +133 -0
  413. package/dist/tests/core/adapter-config.test.js.map +1 -0
  414. package/dist/tests/core/admission.test.js +215 -0
  415. package/dist/tests/core/admission.test.js.map +1 -0
  416. package/dist/tests/core/args.test.js +132 -0
  417. package/dist/tests/core/args.test.js.map +1 -0
  418. package/dist/tests/core/availability.test.js +62 -0
  419. package/dist/tests/core/availability.test.js.map +1 -0
  420. package/dist/tests/core/checks.test.js +395 -0
  421. package/dist/tests/core/checks.test.js.map +1 -0
  422. package/dist/tests/core/circuit-breaker.test.js +172 -0
  423. package/dist/tests/core/circuit-breaker.test.js.map +1 -0
  424. package/dist/tests/core/coerce.test.js +87 -0
  425. package/dist/tests/core/coerce.test.js.map +1 -0
  426. package/dist/tests/core/context.test.js +228 -0
  427. package/dist/tests/core/context.test.js.map +1 -0
  428. package/dist/tests/core/decisions.test.js +310 -0
  429. package/dist/tests/core/decisions.test.js.map +1 -0
  430. package/dist/tests/core/derive.test.js +205 -0
  431. package/dist/tests/core/derive.test.js.map +1 -0
  432. package/dist/tests/core/dispatch-config.test.js +164 -0
  433. package/dist/tests/core/dispatch-config.test.js.map +1 -0
  434. package/dist/tests/core/dispatch.test.js +302 -0
  435. package/dist/tests/core/dispatch.test.js.map +1 -0
  436. package/dist/tests/core/eligibility.test.js +163 -0
  437. package/dist/tests/core/eligibility.test.js.map +1 -0
  438. package/dist/tests/core/extract.test.js +139 -0
  439. package/dist/tests/core/extract.test.js.map +1 -0
  440. package/dist/tests/core/fake-creds.test.js +134 -0
  441. package/dist/tests/core/fake-creds.test.js.map +1 -0
  442. package/dist/tests/core/file.test.js +197 -0
  443. package/dist/tests/core/file.test.js.map +1 -0
  444. package/dist/tests/core/git-result.test.js +113 -0
  445. package/dist/tests/core/git-result.test.js.map +1 -0
  446. package/dist/tests/core/identity.test.js +180 -0
  447. package/dist/tests/core/identity.test.js.map +1 -0
  448. package/dist/tests/core/image-decide.test.js +59 -0
  449. package/dist/tests/core/image-decide.test.js.map +1 -0
  450. package/dist/tests/core/injection.test.js +163 -0
  451. package/dist/tests/core/injection.test.js.map +1 -0
  452. package/dist/tests/core/ledger.test.js +218 -0
  453. package/dist/tests/core/ledger.test.js.map +1 -0
  454. package/dist/tests/core/managed-image.test.js +68 -0
  455. package/dist/tests/core/managed-image.test.js.map +1 -0
  456. package/dist/tests/core/mise.test.js +138 -0
  457. package/dist/tests/core/mise.test.js.map +1 -0
  458. package/dist/tests/core/parse.test.js +174 -0
  459. package/dist/tests/core/parse.test.js.map +1 -0
  460. package/dist/tests/core/path.test.js +50 -0
  461. package/dist/tests/core/path.test.js.map +1 -0
  462. package/dist/tests/core/plan.test.js +218 -0
  463. package/dist/tests/core/plan.test.js.map +1 -0
  464. package/dist/tests/core/post-move.test.js +162 -0
  465. package/dist/tests/core/post-move.test.js.map +1 -0
  466. package/dist/tests/core/pr-classify.test.js +117 -0
  467. package/dist/tests/core/pr-classify.test.js.map +1 -0
  468. package/dist/tests/core/pr-decide.test.js +298 -0
  469. package/dist/tests/core/pr-decide.test.js.map +1 -0
  470. package/dist/tests/core/pr-loop.test.js +301 -0
  471. package/dist/tests/core/pr-loop.test.js.map +1 -0
  472. package/dist/tests/core/pr-notes.test.js +165 -0
  473. package/dist/tests/core/pr-notes.test.js.map +1 -0
  474. package/dist/tests/core/predicates.test.js +154 -0
  475. package/dist/tests/core/predicates.test.js.map +1 -0
  476. package/dist/tests/core/prompt.test.js +189 -0
  477. package/dist/tests/core/prompt.test.js.map +1 -0
  478. package/dist/tests/core/protocol.test.js +195 -0
  479. package/dist/tests/core/protocol.test.js.map +1 -0
  480. package/dist/tests/core/reconcile-issue.test.js +116 -0
  481. package/dist/tests/core/reconcile-issue.test.js.map +1 -0
  482. package/dist/tests/core/render.test.js +549 -0
  483. package/dist/tests/core/render.test.js.map +1 -0
  484. package/dist/tests/core/retry.test.js +186 -0
  485. package/dist/tests/core/retry.test.js.map +1 -0
  486. package/dist/tests/core/routes.test.js +247 -0
  487. package/dist/tests/core/routes.test.js.map +1 -0
  488. package/dist/tests/core/run-fold.test.js +299 -0
  489. package/dist/tests/core/run-fold.test.js.map +1 -0
  490. package/dist/tests/core/shape.test.js +185 -0
  491. package/dist/tests/core/shape.test.js.map +1 -0
  492. package/dist/tests/core/sleep-cycle.test.js +150 -0
  493. package/dist/tests/core/sleep-cycle.test.js.map +1 -0
  494. package/dist/tests/core/slots.test.js +201 -0
  495. package/dist/tests/core/slots.test.js.map +1 -0
  496. package/dist/tests/core/state-resolve.test.js +80 -0
  497. package/dist/tests/core/state-resolve.test.js.map +1 -0
  498. package/dist/tests/core/summary.test.js +200 -0
  499. package/dist/tests/core/summary.test.js.map +1 -0
  500. package/dist/tests/core/template.test.js +116 -0
  501. package/dist/tests/core/template.test.js.map +1 -0
  502. package/dist/tests/core/tick.test.js +558 -0
  503. package/dist/tests/core/tick.test.js.map +1 -0
  504. package/dist/tests/core/token-fold.test.js +176 -0
  505. package/dist/tests/core/token-fold.test.js.map +1 -0
  506. package/dist/tests/core/turn.test.js +388 -0
  507. package/dist/tests/core/turn.test.js.map +1 -0
  508. package/dist/tests/core/url.test.js +118 -0
  509. package/dist/tests/core/url.test.js.map +1 -0
  510. package/dist/tests/core/validate.test.js +247 -0
  511. package/dist/tests/core/validate.test.js.map +1 -0
  512. package/dist/tests/core/views.test.js +252 -0
  513. package/dist/tests/core/views.test.js.map +1 -0
  514. package/dist/tests/core/vm-decide.test.js +110 -0
  515. package/dist/tests/core/vm-decide.test.js.map +1 -0
  516. package/dist/tests/core/vm-guards.test.js +153 -0
  517. package/dist/tests/core/vm-guards.test.js.map +1 -0
  518. package/dist/tests/core/vm-plan.test.js +332 -0
  519. package/dist/tests/core/vm-plan.test.js.map +1 -0
  520. package/dist/tests/core/vm-reap.test.js +196 -0
  521. package/dist/tests/core/vm-reap.test.js.map +1 -0
  522. package/dist/tests/core/workflow-parse.test.js +493 -0
  523. package/dist/tests/core/workflow-parse.test.js.map +1 -0
  524. package/dist/tests/core/workspace-decide.test.js +236 -0
  525. package/dist/tests/core/workspace-decide.test.js.map +1 -0
  526. package/dist/tests/helpers/fixtures.js +167 -0
  527. package/dist/tests/helpers/fixtures.js.map +1 -0
  528. package/dist/tests/shell/acp-substrate.test.js +101 -0
  529. package/dist/tests/shell/acp-substrate.test.js.map +1 -0
  530. package/dist/tests/shell/actions-runner-push.test.js +203 -0
  531. package/dist/tests/shell/actions-runner-push.test.js.map +1 -0
  532. package/dist/tests/shell/credential-hooks.test.js +36 -0
  533. package/dist/tests/shell/credential-hooks.test.js.map +1 -0
  534. package/dist/tests/shell/credential-registry.test.js +165 -0
  535. package/dist/tests/shell/credential-registry.test.js.map +1 -0
  536. package/dist/tests/shell/credential-substrate.test.js +179 -0
  537. package/dist/tests/shell/credential-substrate.test.js.map +1 -0
  538. package/dist/tests/shell/dockerfile-mise-pin.test.js +51 -0
  539. package/dist/tests/shell/dockerfile-mise-pin.test.js.map +1 -0
  540. package/dist/tests/shell/doctor.test.js +101 -0
  541. package/dist/tests/shell/doctor.test.js.map +1 -0
  542. package/dist/tests/shell/effect-vm-create.test.js +52 -0
  543. package/dist/tests/shell/effect-vm-create.test.js.map +1 -0
  544. package/dist/tests/shell/gh-port.test.js +63 -0
  545. package/dist/tests/shell/gh-port.test.js.map +1 -0
  546. package/dist/tests/shell/gondolin-dispatch-guard.test.js +144 -0
  547. package/dist/tests/shell/gondolin-dispatch-guard.test.js.map +1 -0
  548. package/dist/tests/shell/gondolin-dispatch-shquote.test.js +168 -0
  549. package/dist/tests/shell/gondolin-dispatch-shquote.test.js.map +1 -0
  550. package/dist/tests/shell/gondolin-image-converter.test.js +208 -0
  551. package/dist/tests/shell/gondolin-image-converter.test.js.map +1 -0
  552. package/dist/tests/shell/gondolin-image-fetch.test.js +93 -0
  553. package/dist/tests/shell/gondolin-image-fetch.test.js.map +1 -0
  554. package/dist/tests/shell/http-handler.test.js +608 -0
  555. package/dist/tests/shell/http-handler.test.js.map +1 -0
  556. package/dist/tests/shell/http-server.test.js +53 -0
  557. package/dist/tests/shell/http-server.test.js.map +1 -0
  558. package/dist/tests/shell/mcp-runtime.test.js +366 -0
  559. package/dist/tests/shell/mcp-runtime.test.js.map +1 -0
  560. package/dist/tests/shell/mise-config-asset.test.js +87 -0
  561. package/dist/tests/shell/mise-config-asset.test.js.map +1 -0
  562. package/dist/tests/shell/orchestrator-loop.test.js +583 -0
  563. package/dist/tests/shell/orchestrator-loop.test.js.map +1 -0
  564. package/dist/tests/shell/reconciler-passes.test.js +314 -0
  565. package/dist/tests/shell/reconciler-passes.test.js.map +1 -0
  566. package/dist/tests/shell/runner-loop-turn.test.js +97 -0
  567. package/dist/tests/shell/runner-loop-turn.test.js.map +1 -0
  568. package/dist/tests/shell/runner-slice.test.js +536 -0
  569. package/dist/tests/shell/runner-slice.test.js.map +1 -0
  570. package/dist/tests/shell/scaffold.test.js +65 -0
  571. package/dist/tests/shell/scaffold.test.js.map +1 -0
  572. package/dist/tests/shell/tick-config.test.js +83 -0
  573. package/dist/tests/shell/tick-config.test.js.map +1 -0
  574. package/dist/tests/shell/tracker-parse-dates.test.js +44 -0
  575. package/dist/tests/shell/tracker-parse-dates.test.js.map +1 -0
  576. package/dist/tests/shell/tracker-write-issue.test.js +154 -0
  577. package/dist/tests/shell/tracker-write-issue.test.js.map +1 -0
  578. package/dist/tests/shell/workflow-prompt-split.test.js +208 -0
  579. package/dist/tests/shell/workflow-prompt-split.test.js.map +1 -0
  580. package/dist/tests/shell/workspace-live-config.test.js +140 -0
  581. package/dist/tests/shell/workspace-live-config.test.js.map +1 -0
  582. package/package.json +21 -9
  583. package/patches/@earendil-works+gondolin+0.12.0.patch +173 -0
  584. package/prompts/Reflect.md +91 -0
  585. package/prompts/Review.md +97 -0
  586. package/prompts/Todo.md +96 -0
  587. package/prompts/_footer.md +41 -0
  588. package/prompts/_preamble.md +42 -0
  589. package/prompts-minimal/Todo.md +26 -0
  590. package/scripts/postinstall.mjs +63 -0
  591. package/scripts/vm-agent.mjs +312 -90
  592. package/WORKFLOW.md +0 -744
  593. package/dist/acp-bridge.js +0 -324
  594. package/dist/acp-bridge.js.map +0 -1
  595. package/dist/actions/cache.js +0 -191
  596. package/dist/actions/cache.js.map +0 -1
  597. package/dist/actions/effects.js +0 -41
  598. package/dist/actions/effects.js.map +0 -1
  599. package/dist/actions/executor.js +0 -570
  600. package/dist/actions/executor.js.map +0 -1
  601. package/dist/actions/index.js +0 -13
  602. package/dist/actions/index.js.map +0 -1
  603. package/dist/actions/parsing.js.map +0 -1
  604. package/dist/actions/predicate-env.js +0 -27
  605. package/dist/actions/predicate-env.js.map +0 -1
  606. package/dist/actions/predicates.js +0 -49
  607. package/dist/actions/predicates.js.map +0 -1
  608. package/dist/actions/templating.js +0 -66
  609. package/dist/actions/templating.js.map +0 -1
  610. package/dist/actions/types.js +0 -15
  611. package/dist/actions/types.js.map +0 -1
  612. package/dist/agent/acp.js +0 -473
  613. package/dist/agent/acp.js.map +0 -1
  614. package/dist/agent/adapter-names.js +0 -159
  615. package/dist/agent/adapter-names.js.map +0 -1
  616. package/dist/agent/adapters.js +0 -511
  617. package/dist/agent/adapters.js.map +0 -1
  618. package/dist/agent/credential-extractors.js +0 -342
  619. package/dist/agent/credential-extractors.js.map +0 -1
  620. package/dist/agent/credential-secrets.js +0 -628
  621. package/dist/agent/credential-secrets.js.map +0 -1
  622. package/dist/agent/credential-ticker.js +0 -57
  623. package/dist/agent/credential-ticker.js.map +0 -1
  624. package/dist/agent/gondolin-creds-staging.js +0 -356
  625. package/dist/agent/gondolin-creds-staging.js.map +0 -1
  626. package/dist/agent/gondolin-dispatch.js +0 -375
  627. package/dist/agent/gondolin-dispatch.js.map +0 -1
  628. package/dist/agent/gondolin.js +0 -124
  629. package/dist/agent/gondolin.js.map +0 -1
  630. package/dist/agent/runner-decisions.js +0 -134
  631. package/dist/agent/runner-decisions.js.map +0 -1
  632. package/dist/agent/runner.js +0 -1456
  633. package/dist/agent/runner.js.map +0 -1
  634. package/dist/agent/tool-call-summary.js +0 -102
  635. package/dist/agent/tool-call-summary.js.map +0 -1
  636. package/dist/agent/vm-acp-mapping.js +0 -73
  637. package/dist/agent/vm-acp-mapping.js.map +0 -1
  638. package/dist/agent/vm-guards.js +0 -262
  639. package/dist/agent/vm-guards.js.map +0 -1
  640. package/dist/agent/vm-port.js +0 -22
  641. package/dist/agent/vm-port.js.map +0 -1
  642. package/dist/agent/vm-process-registry.js +0 -79
  643. package/dist/agent/vm-process-registry.js.map +0 -1
  644. package/dist/bin/cli-args.js +0 -105
  645. package/dist/bin/cli-args.js.map +0 -1
  646. package/dist/bin/symphony.js +0 -794
  647. package/dist/bin/symphony.js.map +0 -1
  648. package/dist/errors.js +0 -15
  649. package/dist/errors.js.map +0 -1
  650. package/dist/http-disk.js +0 -135
  651. package/dist/http-disk.js.map +0 -1
  652. package/dist/http-handlers.js.map +0 -1
  653. package/dist/http.js.map +0 -1
  654. package/dist/issues.js +0 -178
  655. package/dist/issues.js.map +0 -1
  656. package/dist/logging.js +0 -203
  657. package/dist/logging.js.map +0 -1
  658. package/dist/mcp.js +0 -706
  659. package/dist/mcp.js.map +0 -1
  660. package/dist/memory.js +0 -85
  661. package/dist/memory.js.map +0 -1
  662. package/dist/orchestrator-decisions.js +0 -331
  663. package/dist/orchestrator-decisions.js.map +0 -1
  664. package/dist/orchestrator.js +0 -1569
  665. package/dist/orchestrator.js.map +0 -1
  666. package/dist/prompt.js +0 -65
  667. package/dist/prompt.js.map +0 -1
  668. package/dist/reconciler/cache.js +0 -65
  669. package/dist/reconciler/cache.js.map +0 -1
  670. package/dist/reconciler/index.js +0 -448
  671. package/dist/reconciler/index.js.map +0 -1
  672. package/dist/reconciler/ledger.js +0 -131
  673. package/dist/reconciler/ledger.js.map +0 -1
  674. package/dist/reconciler/pr-adapters.js +0 -174
  675. package/dist/reconciler/pr-adapters.js.map +0 -1
  676. package/dist/reconciler/pr-decide.js.map +0 -1
  677. package/dist/reconciler/pr.js +0 -422
  678. package/dist/reconciler/pr.js.map +0 -1
  679. package/dist/reconciler/types.js +0 -12
  680. package/dist/reconciler/types.js.map +0 -1
  681. package/dist/reconciler/vm.js +0 -243
  682. package/dist/reconciler/vm.js.map +0 -1
  683. package/dist/reconciler/workspace-defaults.js +0 -83
  684. package/dist/reconciler/workspace-defaults.js.map +0 -1
  685. package/dist/reconciler/workspace.js +0 -272
  686. package/dist/reconciler/workspace.js.map +0 -1
  687. package/dist/runlog.js +0 -403
  688. package/dist/runlog.js.map +0 -1
  689. package/dist/scaffold.js +0 -165
  690. package/dist/scaffold.js.map +0 -1
  691. package/dist/trackers/local.js +0 -445
  692. package/dist/trackers/local.js.map +0 -1
  693. package/dist/trackers/types.js +0 -10
  694. package/dist/trackers/types.js.map +0 -1
  695. package/dist/types.js +0 -3
  696. package/dist/types.js.map +0 -1
  697. package/dist/util/clock.js +0 -12
  698. package/dist/util/clock.js.map +0 -1
  699. package/dist/util/crypto.js +0 -25
  700. package/dist/util/crypto.js.map +0 -1
  701. package/dist/util/frontmatter.js +0 -70
  702. package/dist/util/frontmatter.js.map +0 -1
  703. package/dist/util/fs-issues.js +0 -22
  704. package/dist/util/fs-issues.js.map +0 -1
  705. package/dist/util/process.js +0 -152
  706. package/dist/util/process.js.map +0 -1
  707. package/dist/util/workspace-key.js +0 -10
  708. package/dist/util/workspace-key.js.map +0 -1
  709. package/dist/workflow-loader.js +0 -147
  710. package/dist/workflow-loader.js.map +0 -1
  711. package/dist/workflow.js +0 -822
  712. package/dist/workflow.js.map +0 -1
  713. package/dist/workspace-types.js +0 -8
  714. package/dist/workspace-types.js.map +0 -1
  715. package/dist/workspace.js +0 -443
  716. package/dist/workspace.js.map +0 -1
@@ -0,0 +1,389 @@
1
+ // FCIS rewrite — the dashboard + REST/HTMX HTTP request router (kind: shell).
2
+ //
3
+ // Sliced out of the composition root: this is the real `handle(req)` the node:http
4
+ // server (src/shell/server/http.ts) calls, replacing the boot-time 503 stub. It
5
+ // imports NO core (only the root may) — every pure router/decider/render/view
6
+ // function arrives injected as `HttpHandlerCore`, and the live runtime + tracker
7
+ // IO arrive as `HttpHandlerState` / `HttpHandlerTracker`. The root wires all three
8
+ // in main.ts.
9
+ //
10
+ // Per-request flow (faithful to the reference src/http.ts handleRequest):
11
+ // 1. matchRoute(pathname) → a typed Route.
12
+ // 2. method-gate (GET reads vs POST commands).
13
+ // 3. gather the IO the route needs (the live snapshot projection + tracker disk
14
+ // reads, in main-http-views), call the pure core decision/render, return the
15
+ // HttpResponseSpec.
16
+ // 4. CSRF-guarded POSTs (create-issue / operator move) run the core decider,
17
+ // then APPLY the result through the injected tracker writer.
18
+ //
19
+ // The two agent-facing MCP routes (POST /api/v1/issues/<id>/mcp + …/steering-reply)
20
+ // live in the sibling main-http-mcp.ts (size budget); they dispatch to the
21
+ // injected MCP runtime surface (arch-sweep §2d, createMcpRuntime / buildMcpRuntime).
22
+ // When the runtime is absent (an mcp.enabled=false build) both routes 503.
23
+ //
24
+ // Shell rule: imports from src/types/** ONLY (+ the view-projection sibling). Async
25
+ // + IO live here; all decisions are core.
26
+ import { isHtmxRequest, isSameOrigin } from './main-http-csrf.js';
27
+ import { statesOf, trackerRootOf, project, partialInputs, healthView, buildStateDto, detailEntryView, detailRetryView, probeTrackerWritable, moveFormBody, } from './main-http-views.js';
28
+ // Re-export the tracker-writable probe so the composition root binds it from this
29
+ // module's single import (avoids a separate main-http-views import in main.ts).
30
+ export { probeTrackerWritable };
31
+ import { handleMcp, handleSteering } from './main-http-mcp.js';
32
+ const HTML = 'text/html; charset=utf-8';
33
+ const JSON_CT = 'application/json; charset=utf-8';
34
+ /** Build a `text/html` response spec. */
35
+ function html(body, status = 200) {
36
+ return { status, contentType: HTML, body };
37
+ }
38
+ /** Build a JSON response spec from an already-serialisable value. */
39
+ function json(value, status = 200) {
40
+ return { status, contentType: JSON_CT, body: JSON.stringify(value) };
41
+ }
42
+ /** The reference `{ error: { code, message } }` JSON error body. */
43
+ function jsonError(status, code, message) {
44
+ return { status, contentType: JSON_CT, body: JSON.stringify({ error: { code, message } }) };
45
+ }
46
+ /** A 405 with the allowed methods, in the shared JSON error shape. */
47
+ function methodNotAllowed(allow) {
48
+ return {
49
+ status: 405,
50
+ contentType: JSON_CT,
51
+ body: JSON.stringify({ error: { code: 'method_not_allowed', message: `allowed methods: ${allow}` } }),
52
+ headers: { allow },
53
+ };
54
+ }
55
+ // ── header-derived request facts (CSRF / HTMX gating) ────────────────────────
56
+ // The same-origin gate helpers (isHtmxRequest / isSameOrigin / originHost) live in
57
+ // the shared main-http-csrf.ts so this module and main-http-mcp.ts gate identically.
58
+ /** Parse a JSON body, returning `undefined` on any parse failure (core treats it as a bad body). */
59
+ function parseJson(raw) {
60
+ if (raw.trim() === '')
61
+ return undefined;
62
+ try {
63
+ return JSON.parse(raw);
64
+ }
65
+ catch {
66
+ return undefined;
67
+ }
68
+ }
69
+ // ── GET route handlers ───────────────────────────────────────────────────────
70
+ /** GET / — the full dashboard page. */
71
+ async function handleDashboard(deps) {
72
+ const proj = await project(deps);
73
+ const p = partialInputs(deps, proj);
74
+ const hv = await healthView(deps, proj);
75
+ return html(deps.core.renderDashboardHtml(p, hv));
76
+ }
77
+ /** GET /api/v1/partials/<slug> — one HTMX fragment. */
78
+ async function handlePartial(deps, slug) {
79
+ const core = deps.core;
80
+ const name = core.resolvePartialName(slug);
81
+ if (!name)
82
+ return jsonError(404, 'not_found', `unknown partial: ${slug}`);
83
+ const proj = await project(deps);
84
+ const p = partialInputs(deps, proj);
85
+ switch (name) {
86
+ case 'header':
87
+ return html(core.renderHeaderPartial(p));
88
+ case 'attention':
89
+ return html(core.renderAttentionPartial(p));
90
+ case 'board':
91
+ return html(core.renderBoardPartial(p));
92
+ case 'totals':
93
+ return html(core.renderTotalsPartial(p));
94
+ case 'health':
95
+ return html(core.renderHealthPartial(await healthView(deps, proj)));
96
+ }
97
+ }
98
+ /** GET /api/v1/state — the §9.3 snapshot DTO. */
99
+ async function handleState(deps) {
100
+ return json(buildStateDto(deps, await project(deps)));
101
+ }
102
+ /** GET /api/v1/issues — the disk issue listing (the dashboard's source of truth). */
103
+ async function handleIssues(deps) {
104
+ const issues = await deps.tracker.listIssues(trackerRootOf(deps.getLiveCfg()));
105
+ return json({ issues });
106
+ }
107
+ /** GET /issues/<id> — the issue-detail HTML page (disk-backed). */
108
+ async function handleDetailHtml(deps, identifier) {
109
+ const cfg = deps.getLiveCfg();
110
+ const issue = await deps.tracker.readIssue(trackerRootOf(cfg), identifier);
111
+ const view = { workflowPath: deps.workflowPath, states: statesOf(cfg) };
112
+ if (!issue)
113
+ return html(deps.core.renderIssueNotFoundPage(identifier, view), 404);
114
+ return html(deps.core.renderIssueDetailPage(issue, view));
115
+ }
116
+ /** GET /api/v1/<id> — the live issue-detail DTO (running/retrying point query). */
117
+ function handleDetailJson(deps, identifier) {
118
+ const running = deps.state.runningEntries().find((e) => e.identifier === identifier);
119
+ const retry = deps.state.retryEntries().find((r) => r.identifier === identifier);
120
+ const dto = deps.core.buildIssueDetailDto(identifier, running ? detailEntryView(running) : null, retry ? detailRetryView(retry) : null);
121
+ if (!dto)
122
+ return jsonError(404, 'not_found', `no running or retrying attempt for ${identifier}`);
123
+ return json(dto);
124
+ }
125
+ // ── POST route handlers ──────────────────────────────────────────────────────
126
+ /** POST /api/v1/refresh — coalesce an operator refresh into an immediate poll. */
127
+ function handleRefresh(deps) {
128
+ deps.state.dispatch({ kind: 'operator_nudge' });
129
+ // HTMX swaps nothing; return an empty 204 the dashboard ignores.
130
+ return { status: 204, contentType: HTML, body: '' };
131
+ }
132
+ /** Decode an x-www-form-urlencoded create-issue body into the object the decider reads. */
133
+ function formBody(raw) {
134
+ const params = new URLSearchParams(raw);
135
+ const out = {};
136
+ for (const key of ['identifier', 'title', 'state', 'description']) {
137
+ const v = params.get(key);
138
+ if (v !== null)
139
+ out[key] = v;
140
+ }
141
+ const priority = params.get('priority');
142
+ if (priority !== null && priority.trim() !== '') {
143
+ const n = Number(priority);
144
+ if (Number.isFinite(n))
145
+ out.priority = n;
146
+ }
147
+ const labels = params.getAll('labels').filter((s) => s !== '');
148
+ if (labels.length > 0)
149
+ out.labels = labels;
150
+ return out;
151
+ }
152
+ /**
153
+ * Shared CSRF preamble for the create-issue / triage POST handlers: classify the
154
+ * request content-type and run the core triage same-origin gate over the
155
+ * header-derived facts. Returns the classified content-type on pass, or a
156
+ * populated jsonError spec the caller returns verbatim on refusal.
157
+ */
158
+ function guardTriageCsrf(core, view) {
159
+ const ctype = core.classifyContentType(view.headers['content-type']);
160
+ const csrf = core.checkTriageCsrf(ctype, isHtmxRequest(view.headers), isSameOrigin(view.headers));
161
+ if (!csrf.ok)
162
+ return { ok: false, res: jsonError(csrf.status, csrf.code, csrf.message) };
163
+ return { ok: true, ctype };
164
+ }
165
+ /** POST /api/v1/issues — create a new issue (CSRF-guarded). */
166
+ async function handleCreateIssue(deps, view) {
167
+ const core = deps.core;
168
+ const gate = guardTriageCsrf(core, view);
169
+ if (!gate.ok)
170
+ return gate.res;
171
+ const body = gate.ctype.isJsonBody ? parseJson(view.rawBody) : formBody(view.rawBody);
172
+ const cfg = deps.getLiveCfg();
173
+ const decision = core.decideCreateIssue(body, statesOf(cfg));
174
+ if (!decision.ok)
175
+ return jsonError(decision.status, decision.code, decision.message);
176
+ try {
177
+ const written = await deps.tracker.writeIssue({
178
+ family: 'tracker',
179
+ kind: 'write_issue',
180
+ trackerRoot: trackerRootOf(cfg),
181
+ ...(decision.identifier ? { identifier: decision.identifier } : {}),
182
+ state: decision.state,
183
+ title: decision.title,
184
+ ...(decision.description !== undefined ? { description: decision.description } : {}),
185
+ priority: decision.priority,
186
+ labels: decision.labels,
187
+ blocked_by: decision.blocked_by,
188
+ });
189
+ deps.state.dispatch({ kind: 'operator_nudge' });
190
+ return json({ identifier: written.identifier, state: written.state }, 201);
191
+ }
192
+ catch (err) {
193
+ // An explicit identifier whose target file already exists is a CONFLICT, not a
194
+ // server fault: the tracker writer raises `local_issue_target_exists` (the
195
+ // create-409 contract) rather than silently overwriting the live file.
196
+ if (isTargetExistsError(err)) {
197
+ return jsonError(409, 'already_exists', err.message);
198
+ }
199
+ return jsonError(500, 'write_failed', err.message);
200
+ }
201
+ }
202
+ /** True when a tracker write failed because the target identifier/path is occupied
203
+ * (the create-409 conflict the shell maps to HTTP 409). */
204
+ function isTargetExistsError(err) {
205
+ return (typeof err === 'object' &&
206
+ err !== null &&
207
+ err.code === 'local_issue_target_exists');
208
+ }
209
+ /**
210
+ * The canonical issue id for a move event: the front-matter `id` (the local
211
+ * tracker stamps it), falling back to the identifier when absent — mirrors core's
212
+ * `idOf`, so the value equals the live running/retry entry's `issue_id` the
213
+ * reducer matches against.
214
+ */
215
+ function issueIdOf(detail, identifier) {
216
+ const id = detail.frontMatter['id'];
217
+ return typeof id === 'string' && id.trim() !== '' ? id : identifier;
218
+ }
219
+ /**
220
+ * POST /api/v1/issues/<id>/move — operator move to any declared state (issue 126,
221
+ * replaces the fixed approve/discard pair). The move is only WARNED on (never
222
+ * blocked) when off-flow; the from-state is resolved from the file's actual
223
+ * directory, so the right file moves and a stale/forged claim is refused 409. A
224
+ * move that lands on a live attempt also cancels the run (issue 189): the
225
+ * cancel/cleanup/release decision is the reducer's, driven by the `operator_move`
226
+ * event dispatched after the tracker move (issue 199).
227
+ */
228
+ async function handleMove(deps, view, identifier) {
229
+ const core = deps.core;
230
+ const gate = guardTriageCsrf(core, view);
231
+ if (!gate.ok)
232
+ return gate.res;
233
+ const cfg = deps.getLiveCfg();
234
+ // The file's ACTUAL directory is both the from-state mismatch guard input and
235
+ // the from-state the move uses (so the right file moves).
236
+ const detail = await deps.tracker.readIssue(trackerRootOf(cfg), identifier);
237
+ if (!detail)
238
+ return jsonError(404, 'not_found', `no issue ${identifier} on disk`);
239
+ const body = gate.ctype.isJsonBody ? parseJson(view.rawBody) : moveFormBody(view.rawBody);
240
+ const states = statesOf(cfg);
241
+ const decision = core.decideMoveTransition(body, states, detail.state);
242
+ if (!decision.ok)
243
+ return jsonError(decision.status, decision.code, decision.message);
244
+ try {
245
+ const moved = await deps.tracker.moveIssueToState(identifier, decision.toState, {
246
+ fromState: decision.fromState,
247
+ actor: 'symphony/operator',
248
+ });
249
+ // Hand the cancel/cleanup/release decision to the reducer's single write door
250
+ // (issue 199): a running attempt backing the issue is cancelled (terminal ⇒
251
+ // reap workspace, active ⇒ keep it for the redispatch), a pending retry is
252
+ // released, and an active target re-arms the poll — the same immediate-pickup
253
+ // nudge the old inline path dispatched separately.
254
+ deps.state.dispatch({
255
+ kind: 'operator_move',
256
+ issueId: issueIdOf(detail, identifier),
257
+ identifier,
258
+ toState: decision.toState,
259
+ toTerminal: states.some((s) => s.name === decision.toState && s.role === 'terminal'),
260
+ toActive: states.some((s) => s.name === decision.toState && s.role === 'active'),
261
+ });
262
+ // Unpark a parked steering awaiter so an attempt the operator is cancelling
263
+ // breaks out of its steering wait and exits cleanly (issue 189). A safe no-op
264
+ // when nothing is parked; it's an MCP-runtime concern (not an app-db mutation),
265
+ // so the shell EMITS a typed `steering.cancel` Effect through the central interpreter
266
+ // (issue 200) rather than poking the awaiter — one seam, no direct method reach.
267
+ // Fire-and-forget: the cancel has no reply and execute() never rejects.
268
+ void deps.mcp?.performSteering({ family: 'steering', kind: 'cancel', identifier });
269
+ return json({ identifier, from_state: moved.fromState, to_state: moved.toState, off_flow: decision.offFlow });
270
+ }
271
+ catch (err) {
272
+ return jsonError(404, 'not_found', `failed to move ${identifier}: ${err.message}`);
273
+ }
274
+ }
275
+ // ── route dispatch (split by method to keep each branch flat) ────────────────
276
+ /** Resolve a GET/HEAD route to its handler (returns null when the route is not a GET route). */
277
+ function dispatchGet(deps, route) {
278
+ switch (route.kind) {
279
+ case 'dashboard':
280
+ return handleDashboard(deps);
281
+ case 'partial':
282
+ return handlePartial(deps, route.slug);
283
+ case 'state':
284
+ return handleState(deps);
285
+ case 'issues':
286
+ return handleIssues(deps);
287
+ case 'detail_html':
288
+ return handleDetailHtml(deps, route.identifier);
289
+ case 'detail_json':
290
+ return handleDetailJson(deps, route.identifier);
291
+ case 'preview':
292
+ // Optional dev affordance; treat absence as 404 (honest without a baked file).
293
+ return jsonError(404, 'not_found', 'preview asset not configured');
294
+ default:
295
+ return null;
296
+ }
297
+ }
298
+ /** Resolve a POST route to its handler (returns null when the route is not a POST route). */
299
+ function dispatchPost(deps, route, req) {
300
+ switch (route.kind) {
301
+ case 'refresh':
302
+ return handleRefresh(deps);
303
+ case 'issues':
304
+ return handleCreateIssue(deps, req);
305
+ case 'move':
306
+ return handleMove(deps, req, route.identifier);
307
+ case 'mcp':
308
+ return handleMcp(deps, req, route.identifier);
309
+ case 'steering':
310
+ return handleSteering(deps, req, route.identifier);
311
+ default:
312
+ return null;
313
+ }
314
+ }
315
+ /** Per-route Allow header for a method-mismatch 405. */
316
+ function allowFor(route) {
317
+ if (route.kind === 'issues')
318
+ return 'GET, POST';
319
+ if (route.kind === 'refresh' || route.kind === 'move' || route.kind === 'mcp' || route.kind === 'steering') {
320
+ return 'POST';
321
+ }
322
+ return 'GET';
323
+ }
324
+ // ── the single `handle` seam ─────────────────────────────────────────────────
325
+ /**
326
+ * Build the `handle(req) -> HttpResponseSpec` the node:http server calls. The
327
+ * returned closure never throws for a well-formed request — it owns its own
328
+ * error→spec mapping (the server treats a throw as a 500).
329
+ */
330
+ export function buildHttpHandler(deps) {
331
+ return async (req) => {
332
+ const route = deps.core.matchRoute(req.pathname);
333
+ if (route.kind === 'not_found')
334
+ return jsonError(404, 'not_found', `no route for ${req.pathname}`);
335
+ const method = req.method.toUpperCase();
336
+ if (method === 'GET' || method === 'HEAD') {
337
+ const r = dispatchGet(deps, route);
338
+ return r ?? methodNotAllowed(allowFor(route));
339
+ }
340
+ if (method === 'POST') {
341
+ const r = dispatchPost(deps, route, req);
342
+ return r ?? methodNotAllowed(allowFor(route));
343
+ }
344
+ return methodNotAllowed(allowFor(route));
345
+ };
346
+ }
347
+ /**
348
+ * Wire the dashboard/REST `handle` from the composition root's injected core
349
+ * bundle + the live orchestrator read-surface + the tracker adapter. Keeps the
350
+ * closure-building out of main.ts's line budget. The orchestrator owns the
351
+ * running/retrying maps the snapshot projects; the tracker owns the direct-disk
352
+ * dashboard reads + the create-issue / operator-move write paths.
353
+ */
354
+ export function wireHttpHandler(d) {
355
+ return buildHttpHandler({
356
+ core: d.core,
357
+ state: {
358
+ runningEntries: () => d.orchestrator.runningEntries(),
359
+ retryEntries: () => d.orchestrator.retryEntries(),
360
+ claimedIds: () => d.orchestrator.claimedIds(),
361
+ lastPollAtIso: () => d.orchestrator.lastPollAtIso(),
362
+ // One-time OCI→gondolin image build banners (issue 206): forward the in-flight
363
+ // build + the failed-build accessors so the `#health` strip can render them.
364
+ // (Without these the banner state never reaches the dashboard — the orchestrator
365
+ // tracks it but the read-surface dropped it.)
366
+ ...(d.orchestrator.imageBuildState ? { imageBuildState: () => d.orchestrator.imageBuildState() } : {}),
367
+ ...(d.orchestrator.imageFailureState ? { imageFailureState: () => d.orchestrator.imageFailureState() } : {}),
368
+ dispatch: (e) => d.orchestrator.dispatch(e),
369
+ },
370
+ tracker: {
371
+ listIssues: (root) => d.tracker.listIssues(root),
372
+ readIssue: (root, identifier) => d.tracker.readIssue(root, identifier),
373
+ // writeIssue always resolves to the `write_issue` EffectResult variant (it
374
+ // throws on failure); narrow the broad EffectResult union for the handler.
375
+ writeIssue: async (effect) => (await d.tracker.writeIssue(effect)),
376
+ // The local tracker always provides moveIssueToState (typed optional on the
377
+ // base IssueTracker for non-local trackers; this build is local-only).
378
+ moveIssueToState: (id, to, opts) => d.tracker.moveIssueToState(id, to, opts),
379
+ },
380
+ clock: d.clock,
381
+ log: d.log,
382
+ getLiveCfg: d.getLiveCfg,
383
+ workflowPath: d.workflowPath,
384
+ ...(d.credentialHealth ? { credentialHealth: d.credentialHealth } : {}),
385
+ ...(d.trackerWritable ? { trackerWritable: d.trackerWritable } : {}),
386
+ ...(d.mcp ? { mcp: d.mcp } : {}),
387
+ });
388
+ }
389
+ //# sourceMappingURL=main-http-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main-http-handler.js","sourceRoot":"","sources":["../../../src/shell/main-http-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ // FCIS rewrite — the two agent-facing MCP HTTP routes (kind: shell).
2
+ //
3
+ // Sliced out of src/shell/main-http-handler.ts (per the size budget) so the
4
+ // dashboard/REST router keeps under max-lines. These are the in-VM agent's
5
+ // control-plane POSTs the unified HTTP server answers:
6
+ // • POST /api/v1/issues/<id>/mcp — the JSON-RPC `tools/call` plane.
7
+ // • POST /api/v1/issues/<id>/steering-reply — the operator's reply to a parked
8
+ // request_human_steering.
9
+ //
10
+ // Both dispatch to the injected MCP runtime surface (buildMcpRuntime → main-mcp).
11
+ // The `/mcp` route is bearer-authed INSIDE the runtime's handleJsonRpc (it owns
12
+ // the not-active / invalid-token / invalid-envelope responses and never throws),
13
+ // so the route only extracts the token + body and relays. The steering-reply
14
+ // route is CSRF-gated here (a cross-site form POST is refused) then resolves the
15
+ // parked awaiter; a 409 (no desync) when none is pending.
16
+ //
17
+ // Shell rule: imports from src/types/** ONLY (+ the view-projection sibling, the
18
+ // way the dashboard router does). The pure core (bearer/CSRF/text extraction +
19
+ // renderAttentionPartial) arrives on `deps.core`; the runtime on `deps.mcp`.
20
+ import { project, partialInputs } from './main-http-views.js';
21
+ import { isHtmxRequest, isSameOrigin } from './main-http-csrf.js';
22
+ const JSON_CT = 'application/json; charset=utf-8';
23
+ const HTML_CT = 'text/html; charset=utf-8';
24
+ function json(value, status = 200) {
25
+ return { status, contentType: JSON_CT, body: JSON.stringify(value) };
26
+ }
27
+ function jsonError(status, code, message) {
28
+ return { status, contentType: JSON_CT, body: JSON.stringify({ error: { code, message } }) };
29
+ }
30
+ function html(body, status = 200) {
31
+ return { status, contentType: HTML_CT, body };
32
+ }
33
+ /**
34
+ * Re-gather the per-request projection and render the attention ticker partial —
35
+ * the `#ticker` morph target the inline steering-reply form posts into. `opts`
36
+ * threads through `renderAttentionPartial`'s inline error chip.
37
+ */
38
+ async function renderAttention(deps, opts) {
39
+ const proj = await project(deps);
40
+ return deps.core.renderAttentionPartial(partialInputs(deps, proj), opts);
41
+ }
42
+ /**
43
+ * HTMX does not swap content on a 4xx, so returning a bare JSON error would leave
44
+ * `#ticker` stale (or, worse, paint the JSON body into it). For HTMX callers we
45
+ * answer 200 with the attention ticker plus an inline error chip; the reply form
46
+ * lives in the `#board` morph cycle (not `#ticker`), and the operator's in-flight
47
+ * draft is value-preserved there by the board's `ignoreActiveValue` morph config,
48
+ * so it stays untouched. Non-HTMX API clients get the structured JSON error at its
49
+ * real status.
50
+ */
51
+ async function htmxOrJsonError(deps, isHtmx, status, code, message) {
52
+ if (isHtmx)
53
+ return html(await renderAttention(deps, { errorMessage: message }));
54
+ return jsonError(status, code, message);
55
+ }
56
+ // The same-origin gate helpers (isHtmxRequest / isSameOrigin / originHost) live in
57
+ // the shared main-http-csrf.ts so this module and main-http-handler.ts gate identically.
58
+ /** Parse a JSON body, returning `undefined` on any parse failure. */
59
+ function parseJson(raw) {
60
+ if (raw.trim() === '')
61
+ return undefined;
62
+ try {
63
+ return JSON.parse(raw);
64
+ }
65
+ catch {
66
+ return undefined;
67
+ }
68
+ }
69
+ /**
70
+ * POST /api/v1/issues/<id>/mcp — the in-VM agent's JSON-RPC `tools/call` control
71
+ * plane. Bearer-authed: the per-dispatch token the runtime minted at activation
72
+ * arrives in `Authorization: Bearer <token>`; `handleJsonRpc` owns the auth +
73
+ * envelope error responses, so this route only relays. A notification (`null`
74
+ * response) answers 204.
75
+ */
76
+ export async function handleMcp(deps, view, identifier) {
77
+ if (!deps.mcp)
78
+ return jsonError(503, 'mcp_not_wired', 'MCP control plane not composed in this build');
79
+ const token = deps.core.extractBearerToken(view.headers['authorization']);
80
+ const response = await deps.mcp.handleJsonRpc(identifier, token, parseJson(view.rawBody));
81
+ if (response === null)
82
+ return { status: 204, contentType: JSON_CT, body: '' };
83
+ return json(response);
84
+ }
85
+ /**
86
+ * POST /api/v1/issues/<id>/steering-reply — the operator's reply to a parked
87
+ * `request_human_steering`. CSRF-gated (form-urlencoded or application/json),
88
+ * resolves the parked awaiter; 409 when none is pending (no desync — the awaiter
89
+ * only exists once the turn ended and the agent parked it).
90
+ *
91
+ * Content-negotiated like the reference handler (issue 174): the dashboard's inline
92
+ * reply form posts with `hx-target="#ticker"`, so HTMX requests get the rendered
93
+ * attention partial (HTML idiomorph paints into #ticker) on both success and error;
94
+ * non-HTMX API clients get the structured JSON ack / error. A bare-JSON response to
95
+ * an HTMX post would briefly flash the JSON body into the ticker until the next poll.
96
+ */
97
+ export async function handleSteering(deps, view, identifier) {
98
+ if (!deps.mcp)
99
+ return jsonError(503, 'mcp_not_wired', 'steering-reply awaiter not composed in this build');
100
+ const core = deps.core;
101
+ const isHtmx = isHtmxRequest(view.headers);
102
+ const ctype = core.classifyContentType(view.headers['content-type']);
103
+ const csrf = core.checkSteeringCsrf(ctype, isHtmx, isSameOrigin(view.headers));
104
+ if (!csrf.ok)
105
+ return jsonError(csrf.status, csrf.code, csrf.message);
106
+ const text = ctype.isJsonBody ? core.extractJsonText(parseJson(view.rawBody)) : core.extractFormText(view.rawBody);
107
+ if (text === '') {
108
+ return htmxOrJsonError(deps, isHtmx, 400, 'bad_request', 'reply text is required and must be non-empty');
109
+ }
110
+ // EMIT a steering.resolve Effect through the central interpreter (via performSteering);
111
+ // its `delivered` outcome drives the 200/409 — false ⇒ no awaiter was parked.
112
+ const resolved = await deps.mcp.performSteering({ family: 'steering', kind: 'resolve', identifier, text });
113
+ if (!('kind' in resolved) || resolved.kind !== 'steering_resolved' || !resolved.delivered) {
114
+ return htmxOrJsonError(deps, isHtmx, 409, 'no_pending_steering', `no steering request is pending for ${identifier}`);
115
+ }
116
+ // Success: HTMX morphs the refreshed attention ticker into #ticker; non-HTMX
117
+ // API clients get the structured JSON ack.
118
+ if (isHtmx)
119
+ return html(await renderAttention(deps));
120
+ return json({ identifier, delivered: true });
121
+ }
122
+ //# sourceMappingURL=main-http-mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main-http-mcp.js","sourceRoot":"","sources":["../../../src/shell/main-http-mcp.ts"],"names":[],"mappings":"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"}