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.
- package/AGENTS.md +41 -22
- package/DESIGN.md +494 -273
- package/README.md +109 -57
- package/SPEC.md +33 -24
- package/WORKFLOW.minimal.yaml +34 -0
- package/{WORKFLOW.template.md → WORKFLOW.template.yaml} +409 -256
- package/WORKFLOW.yaml +487 -0
- package/assets/skills/symphony-issues/SKILL.md +136 -0
- package/assets/symphony-mise.system.toml +68 -0
- package/dist/src/bin/symphony.js +30 -0
- package/dist/src/bin/symphony.js.map +1 -0
- package/dist/src/core/actions/context.js +109 -0
- package/dist/src/core/actions/context.js.map +1 -0
- package/dist/{actions/parsing.js → src/core/actions/parse.js} +33 -114
- package/dist/src/core/actions/parse.js.map +1 -0
- package/dist/src/core/actions/plan.js +197 -0
- package/dist/src/core/actions/plan.js.map +1 -0
- package/dist/src/core/actions/predicates.js +111 -0
- package/dist/src/core/actions/predicates.js.map +1 -0
- package/dist/src/core/actions/run-fold.js +248 -0
- package/dist/src/core/actions/run-fold.js.map +1 -0
- package/dist/src/core/actions/template.js +118 -0
- package/dist/src/core/actions/template.js.map +1 -0
- package/dist/src/core/cli/args.js +116 -0
- package/dist/src/core/cli/args.js.map +1 -0
- package/dist/src/core/coerce.js +75 -0
- package/dist/src/core/coerce.js.map +1 -0
- package/dist/src/core/credential/account-id.js +20 -0
- package/dist/src/core/credential/account-id.js.map +1 -0
- package/dist/src/core/credential/adapter-config.js +136 -0
- package/dist/src/core/credential/adapter-config.js.map +1 -0
- package/dist/src/core/credential/availability.js +98 -0
- package/dist/src/core/credential/availability.js.map +1 -0
- package/dist/src/core/credential/extract.js +228 -0
- package/dist/src/core/credential/extract.js.map +1 -0
- package/dist/src/core/credential/fake-creds.js +171 -0
- package/dist/src/core/credential/fake-creds.js.map +1 -0
- package/dist/src/core/credential/identity.js +125 -0
- package/dist/src/core/credential/identity.js.map +1 -0
- package/dist/src/core/credential/shape.js +230 -0
- package/dist/src/core/credential/shape.js.map +1 -0
- package/dist/src/core/credential/strings.js +15 -0
- package/dist/src/core/credential/strings.js.map +1 -0
- package/dist/src/core/doctor/checks.js +303 -0
- package/dist/src/core/doctor/checks.js.map +1 -0
- package/dist/src/core/git/result.js +107 -0
- package/dist/src/core/git/result.js.map +1 -0
- package/dist/src/core/http/decisions.js +225 -0
- package/dist/src/core/http/decisions.js.map +1 -0
- package/dist/{http.js → src/core/http/render.js} +472 -738
- package/dist/src/core/http/render.js.map +1 -0
- package/dist/{http-handlers.js → src/core/http/routes.js} +52 -87
- package/dist/src/core/http/routes.js.map +1 -0
- package/dist/src/core/http/views.js +181 -0
- package/dist/src/core/http/views.js.map +1 -0
- package/dist/src/core/image/managed-image.js +95 -0
- package/dist/src/core/image/managed-image.js.map +1 -0
- package/dist/src/core/issue/file.js +149 -0
- package/dist/src/core/issue/file.js.map +1 -0
- package/dist/src/core/issue/parse.js +210 -0
- package/dist/src/core/issue/parse.js.map +1 -0
- package/dist/src/core/mcp/dispatch.js +239 -0
- package/dist/src/core/mcp/dispatch.js.map +1 -0
- package/dist/src/core/mcp/post-move.js +92 -0
- package/dist/src/core/mcp/post-move.js.map +1 -0
- package/dist/src/core/mcp/protocol.js +293 -0
- package/dist/src/core/mcp/protocol.js.map +1 -0
- package/dist/src/core/mcp/url.js +162 -0
- package/dist/src/core/mcp/url.js.map +1 -0
- package/dist/src/core/path.js +63 -0
- package/dist/src/core/path.js.map +1 -0
- package/dist/src/core/reconcile/image-decide.js +48 -0
- package/dist/src/core/reconcile/image-decide.js.map +1 -0
- package/dist/src/core/reconcile/ledger.js +142 -0
- package/dist/src/core/reconcile/ledger.js.map +1 -0
- package/dist/src/core/reconcile/pr-classify.js +62 -0
- package/dist/src/core/reconcile/pr-classify.js.map +1 -0
- package/dist/{reconciler → src/core/reconcile}/pr-decide.js +25 -12
- package/dist/src/core/reconcile/pr-decide.js.map +1 -0
- package/dist/src/core/reconcile/pr-loop.js +161 -0
- package/dist/src/core/reconcile/pr-loop.js.map +1 -0
- package/dist/src/core/reconcile/pr-notes.js +35 -0
- package/dist/src/core/reconcile/pr-notes.js.map +1 -0
- package/dist/src/core/reconcile/vm-decide.js +70 -0
- package/dist/src/core/reconcile/vm-decide.js.map +1 -0
- package/dist/src/core/reconcile/vm-reap.js +207 -0
- package/dist/src/core/reconcile/vm-reap.js.map +1 -0
- package/dist/src/core/reconcile/workspace-decide.js +162 -0
- package/dist/src/core/reconcile/workspace-decide.js.map +1 -0
- package/dist/src/core/runlog/summary.js +231 -0
- package/dist/src/core/runlog/summary.js.map +1 -0
- package/dist/src/core/runner/dispatch-config.js +95 -0
- package/dist/src/core/runner/dispatch-config.js.map +1 -0
- package/dist/src/core/runner/injection.js +61 -0
- package/dist/src/core/runner/injection.js.map +1 -0
- package/dist/src/core/runner/mise.js +210 -0
- package/dist/src/core/runner/mise.js.map +1 -0
- package/dist/src/core/runner/prompt.js +720 -0
- package/dist/src/core/runner/prompt.js.map +1 -0
- package/dist/src/core/runner/turn.js +242 -0
- package/dist/src/core/runner/turn.js.map +1 -0
- package/dist/src/core/runner/vm-plan.js +390 -0
- package/dist/src/core/runner/vm-plan.js.map +1 -0
- package/dist/src/core/schedule/admission.js +123 -0
- package/dist/src/core/schedule/admission.js.map +1 -0
- package/dist/src/core/schedule/circuit-breaker.js +111 -0
- package/dist/src/core/schedule/circuit-breaker.js.map +1 -0
- package/dist/src/core/schedule/eligibility.js +83 -0
- package/dist/src/core/schedule/eligibility.js.map +1 -0
- package/dist/src/core/schedule/reconcile-issue.js +82 -0
- package/dist/src/core/schedule/reconcile-issue.js.map +1 -0
- package/dist/src/core/schedule/retry.js +96 -0
- package/dist/src/core/schedule/retry.js.map +1 -0
- package/dist/src/core/schedule/sleep-cycle.js +133 -0
- package/dist/src/core/schedule/sleep-cycle.js.map +1 -0
- package/dist/src/core/schedule/slots.js +124 -0
- package/dist/src/core/schedule/slots.js.map +1 -0
- package/dist/src/core/schedule/tick.js +553 -0
- package/dist/src/core/schedule/tick.js.map +1 -0
- package/dist/src/core/schedule/token-fold.js +181 -0
- package/dist/src/core/schedule/token-fold.js.map +1 -0
- package/dist/src/core/state-resolve.js +86 -0
- package/dist/src/core/state-resolve.js.map +1 -0
- package/dist/src/core/vm-guards.js +278 -0
- package/dist/src/core/vm-guards.js.map +1 -0
- package/dist/src/core/workflow/derive.js +107 -0
- package/dist/src/core/workflow/derive.js.map +1 -0
- package/dist/src/core/workflow/parse.js +687 -0
- package/dist/src/core/workflow/parse.js.map +1 -0
- package/dist/src/core/workflow/prompt-probe.js +78 -0
- package/dist/src/core/workflow/prompt-probe.js.map +1 -0
- package/dist/src/core/workflow/validate.js +189 -0
- package/dist/src/core/workflow/validate.js.map +1 -0
- package/dist/src/core/workspace-key.js +19 -0
- package/dist/src/core/workspace-key.js.map +1 -0
- package/dist/src/shell/actions-runner.js +356 -0
- package/dist/src/shell/actions-runner.js.map +1 -0
- package/dist/src/shell/adapter/adapter-registry.js +45 -0
- package/dist/src/shell/adapter/adapter-registry.js.map +1 -0
- package/dist/src/shell/adapter/clock-random.js +96 -0
- package/dist/src/shell/adapter/clock-random.js.map +1 -0
- package/dist/src/shell/adapter/gondolin-dispatch-helpers.js +158 -0
- package/dist/src/shell/adapter/gondolin-dispatch-helpers.js.map +1 -0
- package/dist/src/shell/adapter/gondolin-dispatch.js +385 -0
- package/dist/src/shell/adapter/gondolin-dispatch.js.map +1 -0
- package/dist/src/shell/adapter/gondolin-image-converter.js +233 -0
- package/dist/src/shell/adapter/gondolin-image-converter.js.map +1 -0
- package/dist/src/shell/adapter/gondolin-image-fetch.js +180 -0
- package/dist/src/shell/adapter/gondolin-image-fetch.js.map +1 -0
- package/dist/src/shell/adapter/launcher-asset.js +57 -0
- package/dist/src/shell/adapter/launcher-asset.js.map +1 -0
- package/dist/src/shell/adapter/mise-config-asset.js +65 -0
- package/dist/src/shell/adapter/mise-config-asset.js.map +1 -0
- package/dist/src/shell/adapter/workflow-loader.js +304 -0
- package/dist/src/shell/adapter/workflow-loader.js.map +1 -0
- package/dist/src/shell/cli/doctor.js +268 -0
- package/dist/src/shell/cli/doctor.js.map +1 -0
- package/dist/src/shell/effect-interpreter-families.js +314 -0
- package/dist/src/shell/effect-interpreter-families.js.map +1 -0
- package/dist/src/shell/effect-interpreter.js +29 -0
- package/dist/src/shell/effect-interpreter.js.map +1 -0
- package/dist/src/shell/interp/acp-frame.js +137 -0
- package/dist/src/shell/interp/acp-frame.js.map +1 -0
- package/dist/src/shell/interp/acp-ws-conn.js +320 -0
- package/dist/src/shell/interp/acp-ws-conn.js.map +1 -0
- package/dist/src/shell/interp/acp-ws-frames.js +159 -0
- package/dist/src/shell/interp/acp-ws-frames.js.map +1 -0
- package/dist/src/shell/interp/acp-ws.js +197 -0
- package/dist/src/shell/interp/acp-ws.js.map +1 -0
- package/dist/src/shell/interp/acp.js +319 -0
- package/dist/src/shell/interp/acp.js.map +1 -0
- package/dist/src/shell/interp/credential-defaults.js +128 -0
- package/dist/src/shell/interp/credential-defaults.js.map +1 -0
- package/dist/src/shell/interp/credential-hooks.js +149 -0
- package/dist/src/shell/interp/credential-hooks.js.map +1 -0
- package/dist/src/shell/interp/credential-registry.js +226 -0
- package/dist/src/shell/interp/credential-registry.js.map +1 -0
- package/dist/src/shell/interp/credential.js +103 -0
- package/dist/src/shell/interp/credential.js.map +1 -0
- package/dist/src/shell/interp/gh.js +163 -0
- package/dist/src/shell/interp/gh.js.map +1 -0
- package/dist/src/shell/interp/git.js +28 -0
- package/dist/src/shell/interp/git.js.map +1 -0
- package/dist/src/shell/interp/log.js +213 -0
- package/dist/src/shell/interp/log.js.map +1 -0
- package/dist/src/shell/interp/process.js +178 -0
- package/dist/src/shell/interp/process.js.map +1 -0
- package/dist/src/shell/interp/runlog.js +193 -0
- package/dist/src/shell/interp/runlog.js.map +1 -0
- package/dist/src/shell/interp/timer.js +64 -0
- package/dist/src/shell/interp/timer.js.map +1 -0
- package/dist/src/shell/interp/tracker-disk.js +99 -0
- package/dist/src/shell/interp/tracker-disk.js.map +1 -0
- package/dist/src/shell/interp/tracker-parse.js +71 -0
- package/dist/src/shell/interp/tracker-parse.js.map +1 -0
- package/dist/src/shell/interp/tracker-scan.js +238 -0
- package/dist/src/shell/interp/tracker-scan.js.map +1 -0
- package/dist/src/shell/interp/tracker-write.js +91 -0
- package/dist/src/shell/interp/tracker-write.js.map +1 -0
- package/dist/src/shell/interp/tracker.js +41 -0
- package/dist/src/shell/interp/tracker.js.map +1 -0
- package/dist/src/shell/interp/tty.js +48 -0
- package/dist/src/shell/interp/tty.js.map +1 -0
- package/dist/src/shell/interp/vm.js +199 -0
- package/dist/src/shell/interp/vm.js.map +1 -0
- package/dist/src/shell/interp/workspace.js +310 -0
- package/dist/src/shell/interp/workspace.js.map +1 -0
- package/dist/src/shell/main-acp.js +78 -0
- package/dist/src/shell/main-acp.js.map +1 -0
- package/dist/src/shell/main-adapters.js +222 -0
- package/dist/src/shell/main-adapters.js.map +1 -0
- package/dist/src/shell/main-credential.js +122 -0
- package/dist/src/shell/main-credential.js.map +1 -0
- package/dist/src/shell/main-doctor.js +22 -0
- package/dist/src/shell/main-doctor.js.map +1 -0
- package/dist/src/shell/main-entry.js +46 -0
- package/dist/src/shell/main-entry.js.map +1 -0
- package/dist/src/shell/main-http-csrf.js +45 -0
- package/dist/src/shell/main-http-csrf.js.map +1 -0
- package/dist/src/shell/main-http-handler.js +389 -0
- package/dist/src/shell/main-http-handler.js.map +1 -0
- package/dist/src/shell/main-http-mcp.js +122 -0
- package/dist/src/shell/main-http-mcp.js.map +1 -0
- package/dist/src/shell/main-http-views.js +253 -0
- package/dist/src/shell/main-http-views.js.map +1 -0
- package/dist/src/shell/main-http.js +76 -0
- package/dist/src/shell/main-http.js.map +1 -0
- package/dist/src/shell/main-loops.js +130 -0
- package/dist/src/shell/main-loops.js.map +1 -0
- package/dist/src/shell/main-mcp.js +129 -0
- package/dist/src/shell/main-mcp.js.map +1 -0
- package/dist/src/shell/main-orchestrator.js +120 -0
- package/dist/src/shell/main-orchestrator.js.map +1 -0
- package/dist/src/shell/main-preflight.js +43 -0
- package/dist/src/shell/main-preflight.js.map +1 -0
- package/dist/src/shell/main-reconcilers-helpers.js +244 -0
- package/dist/src/shell/main-reconcilers-helpers.js.map +1 -0
- package/dist/src/shell/main-reconcilers-pr.js +148 -0
- package/dist/src/shell/main-reconcilers-pr.js.map +1 -0
- package/dist/src/shell/main-reconcilers.js +225 -0
- package/dist/src/shell/main-reconcilers.js.map +1 -0
- package/dist/src/shell/main-runner.js +355 -0
- package/dist/src/shell/main-runner.js.map +1 -0
- package/dist/src/shell/main-scaffold.js +116 -0
- package/dist/src/shell/main-scaffold.js.map +1 -0
- package/dist/src/shell/main-shutdown.js +115 -0
- package/dist/src/shell/main-shutdown.js.map +1 -0
- package/dist/src/shell/main-startup.js +48 -0
- package/dist/src/shell/main-startup.js.map +1 -0
- package/dist/src/shell/main-substrates.js +43 -0
- package/dist/src/shell/main-substrates.js.map +1 -0
- package/dist/src/shell/main.js +385 -0
- package/dist/src/shell/main.js.map +1 -0
- package/dist/src/shell/orchestrator-feedback.js +69 -0
- package/dist/src/shell/orchestrator-feedback.js.map +1 -0
- package/dist/src/shell/orchestrator-image.js +167 -0
- package/dist/src/shell/orchestrator-image.js.map +1 -0
- package/dist/src/shell/orchestrator-loop.js +468 -0
- package/dist/src/shell/orchestrator-loop.js.map +1 -0
- package/dist/src/shell/orchestrator-reconcile.js +36 -0
- package/dist/src/shell/orchestrator-reconcile.js.map +1 -0
- package/dist/src/shell/reconciler-loop.js +228 -0
- package/dist/src/shell/reconciler-loop.js.map +1 -0
- package/dist/src/shell/runner-loop-turn.js +301 -0
- package/dist/src/shell/runner-loop-turn.js.map +1 -0
- package/dist/src/shell/runner-loop.js +338 -0
- package/dist/src/shell/runner-loop.js.map +1 -0
- package/dist/src/shell/server/http.js +208 -0
- package/dist/src/shell/server/http.js.map +1 -0
- package/dist/src/shell/server/mcp-runtime-effects.js +237 -0
- package/dist/src/shell/server/mcp-runtime-effects.js.map +1 -0
- package/dist/src/shell/server/mcp-runtime.js +99 -0
- package/dist/src/shell/server/mcp-runtime.js.map +1 -0
- package/dist/src/shell/workspace-key.js +14 -0
- package/dist/src/shell/workspace-key.js.map +1 -0
- package/dist/src/types/acp.js +8 -0
- package/dist/src/types/acp.js.map +1 -0
- package/dist/src/types/actions/plan.js +6 -0
- package/dist/src/types/actions/plan.js.map +1 -0
- package/dist/src/types/actions/predicates.js +6 -0
- package/dist/src/types/actions/predicates.js.map +1 -0
- package/dist/src/types/actions/run-fold.js +8 -0
- package/dist/src/types/actions/run-fold.js.map +1 -0
- package/dist/src/types/actions.js +7 -0
- package/dist/src/types/actions.js.map +1 -0
- package/dist/src/types/adapter/clock-random.js +4 -0
- package/dist/src/types/adapter/clock-random.js.map +1 -0
- package/dist/src/types/adapter/gondolin-image-converter.js +5 -0
- package/dist/src/types/adapter/gondolin-image-converter.js.map +1 -0
- package/dist/src/types/adapter/gondolin-image-fetch.js +5 -0
- package/dist/src/types/adapter/gondolin-image-fetch.js.map +1 -0
- package/dist/src/types/adapter/workflow-loader.js +4 -0
- package/dist/src/types/adapter/workflow-loader.js.map +1 -0
- package/dist/src/types/cli/args.js +8 -0
- package/dist/src/types/cli/args.js.map +1 -0
- package/dist/src/types/config.js +8 -0
- package/dist/src/types/config.js.map +1 -0
- package/dist/src/types/credential-interp.js +6 -0
- package/dist/src/types/credential-interp.js.map +1 -0
- package/dist/src/types/credentials.js +10 -0
- package/dist/src/types/credentials.js.map +1 -0
- package/dist/src/types/doctor.js +7 -0
- package/dist/src/types/doctor.js.map +1 -0
- package/dist/src/types/domain.js +7 -0
- package/dist/src/types/domain.js.map +1 -0
- package/dist/src/types/effect.js +15 -0
- package/dist/src/types/effect.js.map +1 -0
- package/dist/src/types/errors.js +39 -0
- package/dist/src/types/errors.js.map +1 -0
- package/dist/src/types/http/decisions.js +6 -0
- package/dist/src/types/http/decisions.js.map +1 -0
- package/dist/src/types/http/render.js +10 -0
- package/dist/src/types/http/render.js.map +1 -0
- package/dist/src/types/http/views.js +6 -0
- package/dist/src/types/http/views.js.map +1 -0
- package/dist/src/types/http.js +9 -0
- package/dist/src/types/http.js.map +1 -0
- package/dist/src/types/image/managed-image.js +7 -0
- package/dist/src/types/image/managed-image.js.map +1 -0
- package/dist/src/types/interp/effect-interpreter.js +8 -0
- package/dist/src/types/interp/effect-interpreter.js.map +1 -0
- package/dist/src/types/interp/tracker.js +7 -0
- package/dist/src/types/interp/tracker.js.map +1 -0
- package/dist/src/types/issue/file.js +6 -0
- package/dist/src/types/issue/file.js.map +1 -0
- package/dist/src/types/issue/parse.js +8 -0
- package/dist/src/types/issue/parse.js.map +1 -0
- package/dist/src/types/main-acp.js +13 -0
- package/dist/src/types/main-acp.js.map +1 -0
- package/dist/src/types/main-adapters.js +5 -0
- package/dist/src/types/main-adapters.js.map +1 -0
- package/dist/src/types/main-credential.js +21 -0
- package/dist/src/types/main-credential.js.map +1 -0
- package/dist/src/types/main-doctor.js +6 -0
- package/dist/src/types/main-doctor.js.map +1 -0
- package/dist/src/types/main-http-handler.js +12 -0
- package/dist/src/types/main-http-handler.js.map +1 -0
- package/dist/src/types/main-http.js +5 -0
- package/dist/src/types/main-http.js.map +1 -0
- package/dist/src/types/main-loops.js +5 -0
- package/dist/src/types/main-loops.js.map +1 -0
- package/dist/src/types/main-mcp.js +12 -0
- package/dist/src/types/main-mcp.js.map +1 -0
- package/dist/src/types/main-orchestrator.js +5 -0
- package/dist/src/types/main-orchestrator.js.map +1 -0
- package/dist/src/types/main-reconcilers.js +11 -0
- package/dist/src/types/main-reconcilers.js.map +1 -0
- package/dist/src/types/main-runner.js +13 -0
- package/dist/src/types/main-runner.js.map +1 -0
- package/dist/src/types/main-startup.js +5 -0
- package/dist/src/types/main-startup.js.map +1 -0
- package/dist/src/types/main-substrates.js +5 -0
- package/dist/src/types/main-substrates.js.map +1 -0
- package/dist/src/types/mcp/dispatch.js +4 -0
- package/dist/src/types/mcp/dispatch.js.map +1 -0
- package/dist/src/types/mcp/post-move.js +7 -0
- package/dist/src/types/mcp/post-move.js.map +1 -0
- package/dist/src/types/mcp.js +9 -0
- package/dist/src/types/mcp.js.map +1 -0
- package/dist/src/types/ports.js +12 -0
- package/dist/src/types/ports.js.map +1 -0
- package/dist/src/types/reconcile/image-decide.js +5 -0
- package/dist/src/types/reconcile/image-decide.js.map +1 -0
- package/dist/src/types/reconcile/ledger.js +7 -0
- package/dist/src/types/reconcile/ledger.js.map +1 -0
- package/dist/src/types/reconcile/pr-loop.js +8 -0
- package/dist/src/types/reconcile/pr-loop.js.map +1 -0
- package/dist/src/types/reconcile/vm-reap.js +8 -0
- package/dist/src/types/reconcile/vm-reap.js.map +1 -0
- package/dist/src/types/reconcile/workspace-decide.js +7 -0
- package/dist/src/types/reconcile/workspace-decide.js.map +1 -0
- package/dist/src/types/reconcile.js +9 -0
- package/dist/src/types/reconcile.js.map +1 -0
- package/dist/src/types/runlog.js +7 -0
- package/dist/src/types/runlog.js.map +1 -0
- package/dist/src/types/runner/actions-runner.js +12 -0
- package/dist/src/types/runner/actions-runner.js.map +1 -0
- package/dist/src/types/runner/gondolin-dispatch.js +5 -0
- package/dist/src/types/runner/gondolin-dispatch.js.map +1 -0
- package/dist/src/types/runner/injection.js +6 -0
- package/dist/src/types/runner/injection.js.map +1 -0
- package/dist/src/types/runner/runner-loop.js +5 -0
- package/dist/src/types/runner/runner-loop.js.map +1 -0
- package/dist/src/types/runner/turn.js +4 -0
- package/dist/src/types/runner/turn.js.map +1 -0
- package/dist/src/types/runner/vm-plan.js +4 -0
- package/dist/src/types/runner/vm-plan.js.map +1 -0
- package/dist/src/types/runtime.js +9 -0
- package/dist/src/types/runtime.js.map +1 -0
- package/dist/src/types/schedule/admission.js +7 -0
- package/dist/src/types/schedule/admission.js.map +1 -0
- package/dist/src/types/schedule/circuit-breaker.js +2 -0
- package/dist/src/types/schedule/circuit-breaker.js.map +1 -0
- package/dist/src/types/schedule/eligibility.js +9 -0
- package/dist/src/types/schedule/eligibility.js.map +1 -0
- package/dist/src/types/schedule/orchestrator-loop.js +10 -0
- package/dist/src/types/schedule/orchestrator-loop.js.map +1 -0
- package/dist/src/types/schedule/sleep-cycle.js +4 -0
- package/dist/src/types/schedule/sleep-cycle.js.map +1 -0
- package/dist/src/types/schedule/slots.js +8 -0
- package/dist/src/types/schedule/slots.js.map +1 -0
- package/dist/src/types/schedule/tick.js +9 -0
- package/dist/src/types/schedule/tick.js.map +1 -0
- package/dist/src/types/server/mcp-runtime.js +8 -0
- package/dist/src/types/server/mcp-runtime.js.map +1 -0
- package/dist/src/types/workflow/parse.js +4 -0
- package/dist/src/types/workflow/parse.js.map +1 -0
- package/dist/tests/core/account-id.test.js +35 -0
- package/dist/tests/core/account-id.test.js.map +1 -0
- package/dist/tests/core/actions-parse.test.js +176 -0
- package/dist/tests/core/actions-parse.test.js.map +1 -0
- package/dist/tests/core/adapter-config.test.js +133 -0
- package/dist/tests/core/adapter-config.test.js.map +1 -0
- package/dist/tests/core/admission.test.js +215 -0
- package/dist/tests/core/admission.test.js.map +1 -0
- package/dist/tests/core/args.test.js +132 -0
- package/dist/tests/core/args.test.js.map +1 -0
- package/dist/tests/core/availability.test.js +62 -0
- package/dist/tests/core/availability.test.js.map +1 -0
- package/dist/tests/core/checks.test.js +395 -0
- package/dist/tests/core/checks.test.js.map +1 -0
- package/dist/tests/core/circuit-breaker.test.js +172 -0
- package/dist/tests/core/circuit-breaker.test.js.map +1 -0
- package/dist/tests/core/coerce.test.js +87 -0
- package/dist/tests/core/coerce.test.js.map +1 -0
- package/dist/tests/core/context.test.js +228 -0
- package/dist/tests/core/context.test.js.map +1 -0
- package/dist/tests/core/decisions.test.js +310 -0
- package/dist/tests/core/decisions.test.js.map +1 -0
- package/dist/tests/core/derive.test.js +205 -0
- package/dist/tests/core/derive.test.js.map +1 -0
- package/dist/tests/core/dispatch-config.test.js +164 -0
- package/dist/tests/core/dispatch-config.test.js.map +1 -0
- package/dist/tests/core/dispatch.test.js +302 -0
- package/dist/tests/core/dispatch.test.js.map +1 -0
- package/dist/tests/core/eligibility.test.js +163 -0
- package/dist/tests/core/eligibility.test.js.map +1 -0
- package/dist/tests/core/extract.test.js +139 -0
- package/dist/tests/core/extract.test.js.map +1 -0
- package/dist/tests/core/fake-creds.test.js +134 -0
- package/dist/tests/core/fake-creds.test.js.map +1 -0
- package/dist/tests/core/file.test.js +197 -0
- package/dist/tests/core/file.test.js.map +1 -0
- package/dist/tests/core/git-result.test.js +113 -0
- package/dist/tests/core/git-result.test.js.map +1 -0
- package/dist/tests/core/identity.test.js +180 -0
- package/dist/tests/core/identity.test.js.map +1 -0
- package/dist/tests/core/image-decide.test.js +59 -0
- package/dist/tests/core/image-decide.test.js.map +1 -0
- package/dist/tests/core/injection.test.js +163 -0
- package/dist/tests/core/injection.test.js.map +1 -0
- package/dist/tests/core/ledger.test.js +218 -0
- package/dist/tests/core/ledger.test.js.map +1 -0
- package/dist/tests/core/managed-image.test.js +68 -0
- package/dist/tests/core/managed-image.test.js.map +1 -0
- package/dist/tests/core/mise.test.js +138 -0
- package/dist/tests/core/mise.test.js.map +1 -0
- package/dist/tests/core/parse.test.js +174 -0
- package/dist/tests/core/parse.test.js.map +1 -0
- package/dist/tests/core/path.test.js +50 -0
- package/dist/tests/core/path.test.js.map +1 -0
- package/dist/tests/core/plan.test.js +218 -0
- package/dist/tests/core/plan.test.js.map +1 -0
- package/dist/tests/core/post-move.test.js +162 -0
- package/dist/tests/core/post-move.test.js.map +1 -0
- package/dist/tests/core/pr-classify.test.js +117 -0
- package/dist/tests/core/pr-classify.test.js.map +1 -0
- package/dist/tests/core/pr-decide.test.js +298 -0
- package/dist/tests/core/pr-decide.test.js.map +1 -0
- package/dist/tests/core/pr-loop.test.js +301 -0
- package/dist/tests/core/pr-loop.test.js.map +1 -0
- package/dist/tests/core/pr-notes.test.js +165 -0
- package/dist/tests/core/pr-notes.test.js.map +1 -0
- package/dist/tests/core/predicates.test.js +154 -0
- package/dist/tests/core/predicates.test.js.map +1 -0
- package/dist/tests/core/prompt.test.js +189 -0
- package/dist/tests/core/prompt.test.js.map +1 -0
- package/dist/tests/core/protocol.test.js +195 -0
- package/dist/tests/core/protocol.test.js.map +1 -0
- package/dist/tests/core/reconcile-issue.test.js +116 -0
- package/dist/tests/core/reconcile-issue.test.js.map +1 -0
- package/dist/tests/core/render.test.js +549 -0
- package/dist/tests/core/render.test.js.map +1 -0
- package/dist/tests/core/retry.test.js +186 -0
- package/dist/tests/core/retry.test.js.map +1 -0
- package/dist/tests/core/routes.test.js +247 -0
- package/dist/tests/core/routes.test.js.map +1 -0
- package/dist/tests/core/run-fold.test.js +299 -0
- package/dist/tests/core/run-fold.test.js.map +1 -0
- package/dist/tests/core/shape.test.js +185 -0
- package/dist/tests/core/shape.test.js.map +1 -0
- package/dist/tests/core/sleep-cycle.test.js +150 -0
- package/dist/tests/core/sleep-cycle.test.js.map +1 -0
- package/dist/tests/core/slots.test.js +201 -0
- package/dist/tests/core/slots.test.js.map +1 -0
- package/dist/tests/core/state-resolve.test.js +80 -0
- package/dist/tests/core/state-resolve.test.js.map +1 -0
- package/dist/tests/core/summary.test.js +200 -0
- package/dist/tests/core/summary.test.js.map +1 -0
- package/dist/tests/core/template.test.js +116 -0
- package/dist/tests/core/template.test.js.map +1 -0
- package/dist/tests/core/tick.test.js +558 -0
- package/dist/tests/core/tick.test.js.map +1 -0
- package/dist/tests/core/token-fold.test.js +176 -0
- package/dist/tests/core/token-fold.test.js.map +1 -0
- package/dist/tests/core/turn.test.js +388 -0
- package/dist/tests/core/turn.test.js.map +1 -0
- package/dist/tests/core/url.test.js +118 -0
- package/dist/tests/core/url.test.js.map +1 -0
- package/dist/tests/core/validate.test.js +247 -0
- package/dist/tests/core/validate.test.js.map +1 -0
- package/dist/tests/core/views.test.js +252 -0
- package/dist/tests/core/views.test.js.map +1 -0
- package/dist/tests/core/vm-decide.test.js +110 -0
- package/dist/tests/core/vm-decide.test.js.map +1 -0
- package/dist/tests/core/vm-guards.test.js +153 -0
- package/dist/tests/core/vm-guards.test.js.map +1 -0
- package/dist/tests/core/vm-plan.test.js +332 -0
- package/dist/tests/core/vm-plan.test.js.map +1 -0
- package/dist/tests/core/vm-reap.test.js +196 -0
- package/dist/tests/core/vm-reap.test.js.map +1 -0
- package/dist/tests/core/workflow-parse.test.js +493 -0
- package/dist/tests/core/workflow-parse.test.js.map +1 -0
- package/dist/tests/core/workspace-decide.test.js +236 -0
- package/dist/tests/core/workspace-decide.test.js.map +1 -0
- package/dist/tests/helpers/fixtures.js +167 -0
- package/dist/tests/helpers/fixtures.js.map +1 -0
- package/dist/tests/shell/acp-substrate.test.js +101 -0
- package/dist/tests/shell/acp-substrate.test.js.map +1 -0
- package/dist/tests/shell/actions-runner-push.test.js +203 -0
- package/dist/tests/shell/actions-runner-push.test.js.map +1 -0
- package/dist/tests/shell/credential-hooks.test.js +36 -0
- package/dist/tests/shell/credential-hooks.test.js.map +1 -0
- package/dist/tests/shell/credential-registry.test.js +165 -0
- package/dist/tests/shell/credential-registry.test.js.map +1 -0
- package/dist/tests/shell/credential-substrate.test.js +179 -0
- package/dist/tests/shell/credential-substrate.test.js.map +1 -0
- package/dist/tests/shell/dockerfile-mise-pin.test.js +51 -0
- package/dist/tests/shell/dockerfile-mise-pin.test.js.map +1 -0
- package/dist/tests/shell/doctor.test.js +101 -0
- package/dist/tests/shell/doctor.test.js.map +1 -0
- package/dist/tests/shell/effect-vm-create.test.js +52 -0
- package/dist/tests/shell/effect-vm-create.test.js.map +1 -0
- package/dist/tests/shell/gh-port.test.js +63 -0
- package/dist/tests/shell/gh-port.test.js.map +1 -0
- package/dist/tests/shell/gondolin-dispatch-guard.test.js +144 -0
- package/dist/tests/shell/gondolin-dispatch-guard.test.js.map +1 -0
- package/dist/tests/shell/gondolin-dispatch-shquote.test.js +168 -0
- package/dist/tests/shell/gondolin-dispatch-shquote.test.js.map +1 -0
- package/dist/tests/shell/gondolin-image-converter.test.js +208 -0
- package/dist/tests/shell/gondolin-image-converter.test.js.map +1 -0
- package/dist/tests/shell/gondolin-image-fetch.test.js +93 -0
- package/dist/tests/shell/gondolin-image-fetch.test.js.map +1 -0
- package/dist/tests/shell/http-handler.test.js +608 -0
- package/dist/tests/shell/http-handler.test.js.map +1 -0
- package/dist/tests/shell/http-server.test.js +53 -0
- package/dist/tests/shell/http-server.test.js.map +1 -0
- package/dist/tests/shell/mcp-runtime.test.js +366 -0
- package/dist/tests/shell/mcp-runtime.test.js.map +1 -0
- package/dist/tests/shell/mise-config-asset.test.js +87 -0
- package/dist/tests/shell/mise-config-asset.test.js.map +1 -0
- package/dist/tests/shell/orchestrator-loop.test.js +583 -0
- package/dist/tests/shell/orchestrator-loop.test.js.map +1 -0
- package/dist/tests/shell/reconciler-passes.test.js +314 -0
- package/dist/tests/shell/reconciler-passes.test.js.map +1 -0
- package/dist/tests/shell/runner-loop-turn.test.js +97 -0
- package/dist/tests/shell/runner-loop-turn.test.js.map +1 -0
- package/dist/tests/shell/runner-slice.test.js +536 -0
- package/dist/tests/shell/runner-slice.test.js.map +1 -0
- package/dist/tests/shell/scaffold.test.js +65 -0
- package/dist/tests/shell/scaffold.test.js.map +1 -0
- package/dist/tests/shell/tick-config.test.js +83 -0
- package/dist/tests/shell/tick-config.test.js.map +1 -0
- package/dist/tests/shell/tracker-parse-dates.test.js +44 -0
- package/dist/tests/shell/tracker-parse-dates.test.js.map +1 -0
- package/dist/tests/shell/tracker-write-issue.test.js +154 -0
- package/dist/tests/shell/tracker-write-issue.test.js.map +1 -0
- package/dist/tests/shell/workflow-prompt-split.test.js +208 -0
- package/dist/tests/shell/workflow-prompt-split.test.js.map +1 -0
- package/dist/tests/shell/workspace-live-config.test.js +140 -0
- package/dist/tests/shell/workspace-live-config.test.js.map +1 -0
- package/package.json +21 -9
- package/patches/@earendil-works+gondolin+0.12.0.patch +173 -0
- package/prompts/Reflect.md +91 -0
- package/prompts/Review.md +97 -0
- package/prompts/Todo.md +96 -0
- package/prompts/_footer.md +41 -0
- package/prompts/_preamble.md +42 -0
- package/prompts-minimal/Todo.md +26 -0
- package/scripts/postinstall.mjs +63 -0
- package/scripts/vm-agent.mjs +312 -90
- package/WORKFLOW.md +0 -744
- package/dist/acp-bridge.js +0 -324
- package/dist/acp-bridge.js.map +0 -1
- package/dist/actions/cache.js +0 -191
- package/dist/actions/cache.js.map +0 -1
- package/dist/actions/effects.js +0 -41
- package/dist/actions/effects.js.map +0 -1
- package/dist/actions/executor.js +0 -570
- package/dist/actions/executor.js.map +0 -1
- package/dist/actions/index.js +0 -13
- package/dist/actions/index.js.map +0 -1
- package/dist/actions/parsing.js.map +0 -1
- package/dist/actions/predicate-env.js +0 -27
- package/dist/actions/predicate-env.js.map +0 -1
- package/dist/actions/predicates.js +0 -49
- package/dist/actions/predicates.js.map +0 -1
- package/dist/actions/templating.js +0 -66
- package/dist/actions/templating.js.map +0 -1
- package/dist/actions/types.js +0 -15
- package/dist/actions/types.js.map +0 -1
- package/dist/agent/acp.js +0 -473
- package/dist/agent/acp.js.map +0 -1
- package/dist/agent/adapter-names.js +0 -159
- package/dist/agent/adapter-names.js.map +0 -1
- package/dist/agent/adapters.js +0 -511
- package/dist/agent/adapters.js.map +0 -1
- package/dist/agent/credential-extractors.js +0 -342
- package/dist/agent/credential-extractors.js.map +0 -1
- package/dist/agent/credential-secrets.js +0 -628
- package/dist/agent/credential-secrets.js.map +0 -1
- package/dist/agent/credential-ticker.js +0 -57
- package/dist/agent/credential-ticker.js.map +0 -1
- package/dist/agent/gondolin-creds-staging.js +0 -356
- package/dist/agent/gondolin-creds-staging.js.map +0 -1
- package/dist/agent/gondolin-dispatch.js +0 -375
- package/dist/agent/gondolin-dispatch.js.map +0 -1
- package/dist/agent/gondolin.js +0 -124
- package/dist/agent/gondolin.js.map +0 -1
- package/dist/agent/runner-decisions.js +0 -134
- package/dist/agent/runner-decisions.js.map +0 -1
- package/dist/agent/runner.js +0 -1456
- package/dist/agent/runner.js.map +0 -1
- package/dist/agent/tool-call-summary.js +0 -102
- package/dist/agent/tool-call-summary.js.map +0 -1
- package/dist/agent/vm-acp-mapping.js +0 -73
- package/dist/agent/vm-acp-mapping.js.map +0 -1
- package/dist/agent/vm-guards.js +0 -262
- package/dist/agent/vm-guards.js.map +0 -1
- package/dist/agent/vm-port.js +0 -22
- package/dist/agent/vm-port.js.map +0 -1
- package/dist/agent/vm-process-registry.js +0 -79
- package/dist/agent/vm-process-registry.js.map +0 -1
- package/dist/bin/cli-args.js +0 -105
- package/dist/bin/cli-args.js.map +0 -1
- package/dist/bin/symphony.js +0 -794
- package/dist/bin/symphony.js.map +0 -1
- package/dist/errors.js +0 -15
- package/dist/errors.js.map +0 -1
- package/dist/http-disk.js +0 -135
- package/dist/http-disk.js.map +0 -1
- package/dist/http-handlers.js.map +0 -1
- package/dist/http.js.map +0 -1
- package/dist/issues.js +0 -178
- package/dist/issues.js.map +0 -1
- package/dist/logging.js +0 -203
- package/dist/logging.js.map +0 -1
- package/dist/mcp.js +0 -706
- package/dist/mcp.js.map +0 -1
- package/dist/memory.js +0 -85
- package/dist/memory.js.map +0 -1
- package/dist/orchestrator-decisions.js +0 -331
- package/dist/orchestrator-decisions.js.map +0 -1
- package/dist/orchestrator.js +0 -1569
- package/dist/orchestrator.js.map +0 -1
- package/dist/prompt.js +0 -65
- package/dist/prompt.js.map +0 -1
- package/dist/reconciler/cache.js +0 -65
- package/dist/reconciler/cache.js.map +0 -1
- package/dist/reconciler/index.js +0 -448
- package/dist/reconciler/index.js.map +0 -1
- package/dist/reconciler/ledger.js +0 -131
- package/dist/reconciler/ledger.js.map +0 -1
- package/dist/reconciler/pr-adapters.js +0 -174
- package/dist/reconciler/pr-adapters.js.map +0 -1
- package/dist/reconciler/pr-decide.js.map +0 -1
- package/dist/reconciler/pr.js +0 -422
- package/dist/reconciler/pr.js.map +0 -1
- package/dist/reconciler/types.js +0 -12
- package/dist/reconciler/types.js.map +0 -1
- package/dist/reconciler/vm.js +0 -243
- package/dist/reconciler/vm.js.map +0 -1
- package/dist/reconciler/workspace-defaults.js +0 -83
- package/dist/reconciler/workspace-defaults.js.map +0 -1
- package/dist/reconciler/workspace.js +0 -272
- package/dist/reconciler/workspace.js.map +0 -1
- package/dist/runlog.js +0 -403
- package/dist/runlog.js.map +0 -1
- package/dist/scaffold.js +0 -165
- package/dist/scaffold.js.map +0 -1
- package/dist/trackers/local.js +0 -445
- package/dist/trackers/local.js.map +0 -1
- package/dist/trackers/types.js +0 -10
- package/dist/trackers/types.js.map +0 -1
- package/dist/types.js +0 -3
- package/dist/types.js.map +0 -1
- package/dist/util/clock.js +0 -12
- package/dist/util/clock.js.map +0 -1
- package/dist/util/crypto.js +0 -25
- package/dist/util/crypto.js.map +0 -1
- package/dist/util/frontmatter.js +0 -70
- package/dist/util/frontmatter.js.map +0 -1
- package/dist/util/fs-issues.js +0 -22
- package/dist/util/fs-issues.js.map +0 -1
- package/dist/util/process.js +0 -152
- package/dist/util/process.js.map +0 -1
- package/dist/util/workspace-key.js +0 -10
- package/dist/util/workspace-key.js.map +0 -1
- package/dist/workflow-loader.js +0 -147
- package/dist/workflow-loader.js.map +0 -1
- package/dist/workflow.js +0 -822
- package/dist/workflow.js.map +0 -1
- package/dist/workspace-types.js +0 -8
- package/dist/workspace-types.js.map +0 -1
- package/dist/workspace.js +0 -443
- 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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"}
|