smol-symphony 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/bin/symphony.js +22 -786
- package/dist/bin/symphony.js.map +1 -1
- package/dist/core/actions/context.js +109 -0
- package/dist/core/actions/context.js.map +1 -0
- package/dist/{actions/parsing.js → core/actions/parse.js} +33 -114
- package/dist/core/actions/parse.js.map +1 -0
- package/dist/core/actions/plan.js +197 -0
- package/dist/core/actions/plan.js.map +1 -0
- package/dist/core/actions/predicates.js +111 -0
- package/dist/core/actions/predicates.js.map +1 -0
- package/dist/core/actions/run-fold.js +248 -0
- package/dist/core/actions/run-fold.js.map +1 -0
- package/dist/core/actions/template.js +118 -0
- package/dist/core/actions/template.js.map +1 -0
- package/dist/core/cli/args.js +116 -0
- package/dist/core/cli/args.js.map +1 -0
- package/dist/core/coerce.js +75 -0
- package/dist/core/coerce.js.map +1 -0
- package/dist/core/credential/account-id.js +20 -0
- package/dist/core/credential/account-id.js.map +1 -0
- package/dist/core/credential/adapter-config.js +136 -0
- package/dist/core/credential/adapter-config.js.map +1 -0
- package/dist/core/credential/availability.js +98 -0
- package/dist/core/credential/availability.js.map +1 -0
- package/dist/core/credential/extract.js +228 -0
- package/dist/core/credential/extract.js.map +1 -0
- package/dist/core/credential/fake-creds.js +171 -0
- package/dist/core/credential/fake-creds.js.map +1 -0
- package/dist/core/credential/identity.js +125 -0
- package/dist/core/credential/identity.js.map +1 -0
- package/dist/core/credential/shape.js +230 -0
- package/dist/core/credential/shape.js.map +1 -0
- package/dist/core/credential/strings.js +15 -0
- package/dist/core/credential/strings.js.map +1 -0
- package/dist/core/doctor/checks.js +303 -0
- package/dist/core/doctor/checks.js.map +1 -0
- package/dist/core/git/result.js +107 -0
- package/dist/core/git/result.js.map +1 -0
- package/dist/core/http/decisions.js +225 -0
- package/dist/core/http/decisions.js.map +1 -0
- package/dist/{http.js → core/http/render.js} +472 -738
- package/dist/core/http/render.js.map +1 -0
- package/dist/{http-handlers.js → core/http/routes.js} +52 -87
- package/dist/core/http/routes.js.map +1 -0
- package/dist/core/http/views.js +181 -0
- package/dist/core/http/views.js.map +1 -0
- package/dist/core/image/managed-image.js +95 -0
- package/dist/core/image/managed-image.js.map +1 -0
- package/dist/core/issue/file.js +149 -0
- package/dist/core/issue/file.js.map +1 -0
- package/dist/core/issue/parse.js +210 -0
- package/dist/core/issue/parse.js.map +1 -0
- package/dist/core/mcp/dispatch.js +239 -0
- package/dist/core/mcp/dispatch.js.map +1 -0
- package/dist/core/mcp/post-move.js +92 -0
- package/dist/core/mcp/post-move.js.map +1 -0
- package/dist/core/mcp/protocol.js +293 -0
- package/dist/core/mcp/protocol.js.map +1 -0
- package/dist/core/mcp/url.js +162 -0
- package/dist/core/mcp/url.js.map +1 -0
- package/dist/core/path.js +63 -0
- package/dist/core/path.js.map +1 -0
- package/dist/core/reconcile/image-decide.js +48 -0
- package/dist/core/reconcile/image-decide.js.map +1 -0
- package/dist/core/reconcile/ledger.js +142 -0
- package/dist/core/reconcile/ledger.js.map +1 -0
- package/dist/core/reconcile/pr-classify.js +62 -0
- package/dist/core/reconcile/pr-classify.js.map +1 -0
- package/dist/{reconciler → core/reconcile}/pr-decide.js +25 -12
- package/dist/core/reconcile/pr-decide.js.map +1 -0
- package/dist/core/reconcile/pr-loop.js +161 -0
- package/dist/core/reconcile/pr-loop.js.map +1 -0
- package/dist/core/reconcile/pr-notes.js +35 -0
- package/dist/core/reconcile/pr-notes.js.map +1 -0
- package/dist/core/reconcile/vm-decide.js +70 -0
- package/dist/core/reconcile/vm-decide.js.map +1 -0
- package/dist/core/reconcile/vm-reap.js +207 -0
- package/dist/core/reconcile/vm-reap.js.map +1 -0
- package/dist/core/reconcile/workspace-decide.js +162 -0
- package/dist/core/reconcile/workspace-decide.js.map +1 -0
- package/dist/core/runlog/summary.js +231 -0
- package/dist/core/runlog/summary.js.map +1 -0
- package/dist/core/runner/dispatch-config.js +95 -0
- package/dist/core/runner/dispatch-config.js.map +1 -0
- package/dist/core/runner/injection.js +61 -0
- package/dist/core/runner/injection.js.map +1 -0
- package/dist/core/runner/mise.js +210 -0
- package/dist/core/runner/mise.js.map +1 -0
- package/dist/core/runner/prompt.js +720 -0
- package/dist/core/runner/prompt.js.map +1 -0
- package/dist/core/runner/turn.js +242 -0
- package/dist/core/runner/turn.js.map +1 -0
- package/dist/core/runner/vm-plan.js +390 -0
- package/dist/core/runner/vm-plan.js.map +1 -0
- package/dist/core/schedule/admission.js +123 -0
- package/dist/core/schedule/admission.js.map +1 -0
- package/dist/core/schedule/circuit-breaker.js +111 -0
- package/dist/core/schedule/circuit-breaker.js.map +1 -0
- package/dist/core/schedule/eligibility.js +83 -0
- package/dist/core/schedule/eligibility.js.map +1 -0
- package/dist/core/schedule/reconcile-issue.js +82 -0
- package/dist/core/schedule/reconcile-issue.js.map +1 -0
- package/dist/core/schedule/retry.js +96 -0
- package/dist/core/schedule/retry.js.map +1 -0
- package/dist/core/schedule/sleep-cycle.js +133 -0
- package/dist/core/schedule/sleep-cycle.js.map +1 -0
- package/dist/core/schedule/slots.js +124 -0
- package/dist/core/schedule/slots.js.map +1 -0
- package/dist/core/schedule/tick.js +553 -0
- package/dist/core/schedule/tick.js.map +1 -0
- package/dist/core/schedule/token-fold.js +181 -0
- package/dist/core/schedule/token-fold.js.map +1 -0
- package/dist/core/state-resolve.js +86 -0
- package/dist/core/state-resolve.js.map +1 -0
- package/dist/core/vm-guards.js +278 -0
- package/dist/core/vm-guards.js.map +1 -0
- package/dist/core/workflow/derive.js +107 -0
- package/dist/core/workflow/derive.js.map +1 -0
- package/dist/core/workflow/parse.js +687 -0
- package/dist/core/workflow/parse.js.map +1 -0
- package/dist/core/workflow/prompt-probe.js +78 -0
- package/dist/core/workflow/prompt-probe.js.map +1 -0
- package/dist/core/workflow/validate.js +189 -0
- package/dist/core/workflow/validate.js.map +1 -0
- package/dist/core/workspace-key.js +19 -0
- package/dist/core/workspace-key.js.map +1 -0
- package/dist/shell/actions-runner.js +356 -0
- package/dist/shell/actions-runner.js.map +1 -0
- package/dist/shell/adapter/adapter-registry.js +45 -0
- package/dist/shell/adapter/adapter-registry.js.map +1 -0
- package/dist/shell/adapter/clock-random.js +96 -0
- package/dist/shell/adapter/clock-random.js.map +1 -0
- package/dist/shell/adapter/gondolin-dispatch-helpers.js +158 -0
- package/dist/shell/adapter/gondolin-dispatch-helpers.js.map +1 -0
- package/dist/shell/adapter/gondolin-dispatch.js +385 -0
- package/dist/shell/adapter/gondolin-dispatch.js.map +1 -0
- package/dist/shell/adapter/gondolin-image-converter.js +233 -0
- package/dist/shell/adapter/gondolin-image-converter.js.map +1 -0
- package/dist/shell/adapter/gondolin-image-fetch.js +180 -0
- package/dist/shell/adapter/gondolin-image-fetch.js.map +1 -0
- package/dist/shell/adapter/launcher-asset.js +57 -0
- package/dist/shell/adapter/launcher-asset.js.map +1 -0
- package/dist/shell/adapter/mise-config-asset.js +65 -0
- package/dist/shell/adapter/mise-config-asset.js.map +1 -0
- package/dist/shell/adapter/workflow-loader.js +304 -0
- package/dist/shell/adapter/workflow-loader.js.map +1 -0
- package/dist/shell/cli/doctor.js +268 -0
- package/dist/shell/cli/doctor.js.map +1 -0
- package/dist/shell/effect-interpreter-families.js +314 -0
- package/dist/shell/effect-interpreter-families.js.map +1 -0
- package/dist/shell/effect-interpreter.js +29 -0
- package/dist/shell/effect-interpreter.js.map +1 -0
- package/dist/shell/interp/acp-frame.js +137 -0
- package/dist/shell/interp/acp-frame.js.map +1 -0
- package/dist/shell/interp/acp-ws-conn.js +320 -0
- package/dist/shell/interp/acp-ws-conn.js.map +1 -0
- package/dist/shell/interp/acp-ws-frames.js +159 -0
- package/dist/shell/interp/acp-ws-frames.js.map +1 -0
- package/dist/shell/interp/acp-ws.js +197 -0
- package/dist/shell/interp/acp-ws.js.map +1 -0
- package/dist/shell/interp/acp.js +319 -0
- package/dist/shell/interp/acp.js.map +1 -0
- package/dist/shell/interp/credential-defaults.js +128 -0
- package/dist/shell/interp/credential-defaults.js.map +1 -0
- package/dist/shell/interp/credential-hooks.js +149 -0
- package/dist/shell/interp/credential-hooks.js.map +1 -0
- package/dist/shell/interp/credential-registry.js +226 -0
- package/dist/shell/interp/credential-registry.js.map +1 -0
- package/dist/shell/interp/credential.js +103 -0
- package/dist/shell/interp/credential.js.map +1 -0
- package/dist/shell/interp/gh.js +163 -0
- package/dist/shell/interp/gh.js.map +1 -0
- package/dist/shell/interp/git.js +28 -0
- package/dist/shell/interp/git.js.map +1 -0
- package/dist/shell/interp/log.js +213 -0
- package/dist/shell/interp/log.js.map +1 -0
- package/dist/shell/interp/process.js +178 -0
- package/dist/shell/interp/process.js.map +1 -0
- package/dist/shell/interp/runlog.js +193 -0
- package/dist/shell/interp/runlog.js.map +1 -0
- package/dist/shell/interp/timer.js +64 -0
- package/dist/shell/interp/timer.js.map +1 -0
- package/dist/shell/interp/tracker-disk.js +99 -0
- package/dist/shell/interp/tracker-disk.js.map +1 -0
- package/dist/shell/interp/tracker-parse.js +71 -0
- package/dist/shell/interp/tracker-parse.js.map +1 -0
- package/dist/shell/interp/tracker-scan.js +238 -0
- package/dist/shell/interp/tracker-scan.js.map +1 -0
- package/dist/shell/interp/tracker-write.js +91 -0
- package/dist/shell/interp/tracker-write.js.map +1 -0
- package/dist/shell/interp/tracker.js +41 -0
- package/dist/shell/interp/tracker.js.map +1 -0
- package/dist/shell/interp/tty.js +48 -0
- package/dist/shell/interp/tty.js.map +1 -0
- package/dist/shell/interp/vm.js +199 -0
- package/dist/shell/interp/vm.js.map +1 -0
- package/dist/shell/interp/workspace.js +310 -0
- package/dist/shell/interp/workspace.js.map +1 -0
- package/dist/shell/main-acp.js +78 -0
- package/dist/shell/main-acp.js.map +1 -0
- package/dist/shell/main-adapters.js +222 -0
- package/dist/shell/main-adapters.js.map +1 -0
- package/dist/shell/main-credential.js +122 -0
- package/dist/shell/main-credential.js.map +1 -0
- package/dist/shell/main-doctor.js +22 -0
- package/dist/shell/main-doctor.js.map +1 -0
- package/dist/shell/main-entry.js +46 -0
- package/dist/shell/main-entry.js.map +1 -0
- package/dist/shell/main-http-csrf.js +45 -0
- package/dist/shell/main-http-csrf.js.map +1 -0
- package/dist/shell/main-http-handler.js +389 -0
- package/dist/shell/main-http-handler.js.map +1 -0
- package/dist/shell/main-http-mcp.js +122 -0
- package/dist/shell/main-http-mcp.js.map +1 -0
- package/dist/shell/main-http-views.js +253 -0
- package/dist/shell/main-http-views.js.map +1 -0
- package/dist/shell/main-http.js +76 -0
- package/dist/shell/main-http.js.map +1 -0
- package/dist/shell/main-loops.js +130 -0
- package/dist/shell/main-loops.js.map +1 -0
- package/dist/shell/main-mcp.js +129 -0
- package/dist/shell/main-mcp.js.map +1 -0
- package/dist/shell/main-orchestrator.js +120 -0
- package/dist/shell/main-orchestrator.js.map +1 -0
- package/dist/shell/main-preflight.js +43 -0
- package/dist/shell/main-preflight.js.map +1 -0
- package/dist/shell/main-reconcilers-helpers.js +244 -0
- package/dist/shell/main-reconcilers-helpers.js.map +1 -0
- package/dist/shell/main-reconcilers-pr.js +148 -0
- package/dist/shell/main-reconcilers-pr.js.map +1 -0
- package/dist/shell/main-reconcilers.js +225 -0
- package/dist/shell/main-reconcilers.js.map +1 -0
- package/dist/shell/main-runner.js +355 -0
- package/dist/shell/main-runner.js.map +1 -0
- package/dist/shell/main-scaffold.js +116 -0
- package/dist/shell/main-scaffold.js.map +1 -0
- package/dist/shell/main-shutdown.js +115 -0
- package/dist/shell/main-shutdown.js.map +1 -0
- package/dist/shell/main-startup.js +48 -0
- package/dist/shell/main-startup.js.map +1 -0
- package/dist/shell/main-substrates.js +43 -0
- package/dist/shell/main-substrates.js.map +1 -0
- package/dist/shell/main.js +385 -0
- package/dist/shell/main.js.map +1 -0
- package/dist/shell/orchestrator-feedback.js +69 -0
- package/dist/shell/orchestrator-feedback.js.map +1 -0
- package/dist/shell/orchestrator-image.js +167 -0
- package/dist/shell/orchestrator-image.js.map +1 -0
- package/dist/shell/orchestrator-loop.js +468 -0
- package/dist/shell/orchestrator-loop.js.map +1 -0
- package/dist/shell/orchestrator-reconcile.js +36 -0
- package/dist/shell/orchestrator-reconcile.js.map +1 -0
- package/dist/shell/reconciler-loop.js +228 -0
- package/dist/shell/reconciler-loop.js.map +1 -0
- package/dist/shell/runner-loop-turn.js +301 -0
- package/dist/shell/runner-loop-turn.js.map +1 -0
- package/dist/shell/runner-loop.js +338 -0
- package/dist/shell/runner-loop.js.map +1 -0
- package/dist/shell/server/http.js +208 -0
- package/dist/shell/server/http.js.map +1 -0
- package/dist/shell/server/mcp-runtime-effects.js +237 -0
- package/dist/shell/server/mcp-runtime-effects.js.map +1 -0
- package/dist/shell/server/mcp-runtime.js +99 -0
- package/dist/shell/server/mcp-runtime.js.map +1 -0
- package/dist/shell/workspace-key.js +14 -0
- package/dist/shell/workspace-key.js.map +1 -0
- package/dist/types/acp.js +8 -0
- package/dist/types/acp.js.map +1 -0
- package/dist/types/actions/plan.js +6 -0
- package/dist/types/actions/plan.js.map +1 -0
- package/dist/types/actions/predicates.js +6 -0
- package/dist/types/actions/predicates.js.map +1 -0
- package/dist/types/actions/run-fold.js +8 -0
- package/dist/types/actions/run-fold.js.map +1 -0
- package/dist/types/actions.js +7 -0
- package/dist/types/actions.js.map +1 -0
- package/dist/types/adapter/clock-random.js +4 -0
- package/dist/types/adapter/clock-random.js.map +1 -0
- package/dist/types/adapter/gondolin-image-converter.js +5 -0
- package/dist/types/adapter/gondolin-image-converter.js.map +1 -0
- package/dist/types/adapter/gondolin-image-fetch.js +5 -0
- package/dist/types/adapter/gondolin-image-fetch.js.map +1 -0
- package/dist/types/adapter/workflow-loader.js +4 -0
- package/dist/types/adapter/workflow-loader.js.map +1 -0
- package/dist/types/cli/args.js +8 -0
- package/dist/types/cli/args.js.map +1 -0
- package/dist/types/config.js +8 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/credential-interp.js +6 -0
- package/dist/types/credential-interp.js.map +1 -0
- package/dist/types/credentials.js +10 -0
- package/dist/types/credentials.js.map +1 -0
- package/dist/types/doctor.js +7 -0
- package/dist/types/doctor.js.map +1 -0
- package/dist/types/domain.js +7 -0
- package/dist/types/domain.js.map +1 -0
- package/dist/types/effect.js +15 -0
- package/dist/types/effect.js.map +1 -0
- package/dist/types/errors.js +39 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/http/decisions.js +6 -0
- package/dist/types/http/decisions.js.map +1 -0
- package/dist/types/http/render.js +10 -0
- package/dist/types/http/render.js.map +1 -0
- package/dist/types/http/views.js +6 -0
- package/dist/types/http/views.js.map +1 -0
- package/dist/types/http.js +9 -0
- package/dist/types/http.js.map +1 -0
- package/dist/types/image/managed-image.js +7 -0
- package/dist/types/image/managed-image.js.map +1 -0
- package/dist/types/interp/effect-interpreter.js +8 -0
- package/dist/types/interp/effect-interpreter.js.map +1 -0
- package/dist/types/interp/tracker.js +7 -0
- package/dist/types/interp/tracker.js.map +1 -0
- package/dist/types/issue/file.js +6 -0
- package/dist/types/issue/file.js.map +1 -0
- package/dist/types/issue/parse.js +8 -0
- package/dist/types/issue/parse.js.map +1 -0
- package/dist/types/main-acp.js +13 -0
- package/dist/types/main-acp.js.map +1 -0
- package/dist/types/main-adapters.js +5 -0
- package/dist/types/main-adapters.js.map +1 -0
- package/dist/types/main-credential.js +21 -0
- package/dist/types/main-credential.js.map +1 -0
- package/dist/types/main-doctor.js +6 -0
- package/dist/types/main-doctor.js.map +1 -0
- package/dist/types/main-http-handler.js +12 -0
- package/dist/types/main-http-handler.js.map +1 -0
- package/dist/types/main-http.js +5 -0
- package/dist/types/main-http.js.map +1 -0
- package/dist/types/main-loops.js +5 -0
- package/dist/types/main-loops.js.map +1 -0
- package/dist/types/main-mcp.js +12 -0
- package/dist/types/main-mcp.js.map +1 -0
- package/dist/types/main-orchestrator.js +5 -0
- package/dist/types/main-orchestrator.js.map +1 -0
- package/dist/types/main-reconcilers.js +11 -0
- package/dist/types/main-reconcilers.js.map +1 -0
- package/dist/types/main-runner.js +13 -0
- package/dist/types/main-runner.js.map +1 -0
- package/dist/types/main-startup.js +5 -0
- package/dist/types/main-startup.js.map +1 -0
- package/dist/types/main-substrates.js +5 -0
- package/dist/types/main-substrates.js.map +1 -0
- package/dist/types/mcp/dispatch.js +4 -0
- package/dist/types/mcp/dispatch.js.map +1 -0
- package/dist/types/mcp/post-move.js +7 -0
- package/dist/types/mcp/post-move.js.map +1 -0
- package/dist/types/mcp.js +9 -0
- package/dist/types/mcp.js.map +1 -0
- package/dist/types/ports.js +12 -0
- package/dist/types/ports.js.map +1 -0
- package/dist/types/reconcile/image-decide.js +5 -0
- package/dist/types/reconcile/image-decide.js.map +1 -0
- package/dist/types/reconcile/ledger.js +7 -0
- package/dist/types/reconcile/ledger.js.map +1 -0
- package/dist/types/reconcile/pr-loop.js +8 -0
- package/dist/types/reconcile/pr-loop.js.map +1 -0
- package/dist/types/reconcile/vm-reap.js +8 -0
- package/dist/types/reconcile/vm-reap.js.map +1 -0
- package/dist/types/reconcile/workspace-decide.js +7 -0
- package/dist/types/reconcile/workspace-decide.js.map +1 -0
- package/dist/types/reconcile.js +9 -0
- package/dist/types/reconcile.js.map +1 -0
- package/dist/types/runlog.js +7 -0
- package/dist/types/runlog.js.map +1 -0
- package/dist/types/runner/actions-runner.js +12 -0
- package/dist/types/runner/actions-runner.js.map +1 -0
- package/dist/types/runner/gondolin-dispatch.js +5 -0
- package/dist/types/runner/gondolin-dispatch.js.map +1 -0
- package/dist/types/runner/injection.js +6 -0
- package/dist/types/runner/injection.js.map +1 -0
- package/dist/types/runner/runner-loop.js +5 -0
- package/dist/types/runner/runner-loop.js.map +1 -0
- package/dist/types/runner/turn.js +4 -0
- package/dist/types/runner/turn.js.map +1 -0
- package/dist/types/runner/vm-plan.js +4 -0
- package/dist/types/runner/vm-plan.js.map +1 -0
- package/dist/types/runtime.js +9 -0
- package/dist/types/runtime.js.map +1 -0
- package/dist/types/schedule/admission.js +7 -0
- package/dist/types/schedule/admission.js.map +1 -0
- package/dist/types/schedule/circuit-breaker.js +2 -0
- package/dist/types/schedule/circuit-breaker.js.map +1 -0
- package/dist/types/schedule/eligibility.js +9 -0
- package/dist/types/schedule/eligibility.js.map +1 -0
- package/dist/types/schedule/orchestrator-loop.js +10 -0
- package/dist/types/schedule/orchestrator-loop.js.map +1 -0
- package/dist/types/schedule/sleep-cycle.js +4 -0
- package/dist/types/schedule/sleep-cycle.js.map +1 -0
- package/dist/types/schedule/slots.js +8 -0
- package/dist/types/schedule/slots.js.map +1 -0
- package/dist/types/schedule/tick.js +9 -0
- package/dist/types/schedule/tick.js.map +1 -0
- package/dist/types/server/mcp-runtime.js +8 -0
- package/dist/types/server/mcp-runtime.js.map +1 -0
- package/dist/types/workflow/parse.js +4 -0
- package/dist/types/workflow/parse.js.map +1 -0
- package/package.json +22 -10
- 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/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,253 @@
|
|
|
1
|
+
// FCIS rewrite — HTTP-handler view projections (kind: shell).
|
|
2
|
+
//
|
|
3
|
+
// Sliced out of src/shell/main-http-handler.ts so the router stays under the
|
|
4
|
+
// max-lines budget. These are the thin SHELL projections between the live
|
|
5
|
+
// orchestrator runtime (RunningEntry / RetryEntry) and the pure core http view
|
|
6
|
+
// inputs (PartialInputs / SnapshotInput / IssueDetail*View / HealthView). They
|
|
7
|
+
// shape data only — no routing, no IO — but they live in the shell because they
|
|
8
|
+
// read the live-handle-carrying RunningEntry (which core never holds) and project
|
|
9
|
+
// it into the read-only views core folds over.
|
|
10
|
+
//
|
|
11
|
+
// Imports from src/types/** ONLY (no core — the pure builders arrive injected via
|
|
12
|
+
// HttpHandlerDeps.core).
|
|
13
|
+
import { accessSync, constants as fsConstants } from 'node:fs';
|
|
14
|
+
/**
|
|
15
|
+
* W_OK probe of the tracker root for the dashboard `#health` strip (REF
|
|
16
|
+
* orchestrator.probeTrackerWritable). Tri-state: null when no root is configured,
|
|
17
|
+
* true when writable, false when it exists but is read-only / missing. Best-effort —
|
|
18
|
+
* a probe failure is reported as `false`, never throws into a request. The composition
|
|
19
|
+
* root binds this as `trackerWritable` so the view stays free of fs concerns.
|
|
20
|
+
*/
|
|
21
|
+
export function probeTrackerWritable(root) {
|
|
22
|
+
if (!root)
|
|
23
|
+
return null;
|
|
24
|
+
try {
|
|
25
|
+
accessSync(root, fsConstants.W_OK);
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** Project the declared `states:` block into the compact StateView[] core reads.
|
|
33
|
+
* `allowed_transitions` is carried through so the dashboard move picker can flag
|
|
34
|
+
* off-flow targets (issue 126); absent in the config ⇒ null (open default). */
|
|
35
|
+
export function statesOf(cfg) {
|
|
36
|
+
return Object.entries(cfg.states).map(([name, c]) => ({
|
|
37
|
+
name,
|
|
38
|
+
role: c.role,
|
|
39
|
+
allowed_transitions: c.allowed_transitions ?? null,
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
/** Resolve the local tracker root (the boot gate guarantees it; '' is a safe
|
|
43
|
+
* empty-board fallback the disk reads tolerate). */
|
|
44
|
+
export function trackerRootOf(cfg) {
|
|
45
|
+
return cfg.tracker.root ?? '';
|
|
46
|
+
}
|
|
47
|
+
/** Decode an x-www-form-urlencoded operator-move body (`state`, optional
|
|
48
|
+
* `from_state`) into the object the pure decideMoveTransition reads. */
|
|
49
|
+
export function moveFormBody(raw) {
|
|
50
|
+
const params = new URLSearchParams(raw);
|
|
51
|
+
const out = {};
|
|
52
|
+
for (const key of ['state', 'from_state']) {
|
|
53
|
+
const v = params.get(key);
|
|
54
|
+
if (v !== null)
|
|
55
|
+
out[key] = v;
|
|
56
|
+
}
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
59
|
+
// Pure basename (the page chrome only needs the workflow filename). The single
|
|
60
|
+
// shell copy of core/path.ts:basename — the shell may not import core, and the
|
|
61
|
+
// line-budgeted composition root does not inject this one-call-site helper, so
|
|
62
|
+
// it is kept here verbatim (canonical home: src/core/path.ts:basename).
|
|
63
|
+
function basenameOf(p) {
|
|
64
|
+
const trimmed = p.replace(/[/\\]+$/, '');
|
|
65
|
+
const idx = Math.max(trimmed.lastIndexOf('/'), trimmed.lastIndexOf('\\'));
|
|
66
|
+
return idx >= 0 ? trimmed.slice(idx + 1) : trimmed;
|
|
67
|
+
}
|
|
68
|
+
/** Project a live RunningEntry into the read-only RunningEntryView core folds over. */
|
|
69
|
+
export function toRunningView(e) {
|
|
70
|
+
return {
|
|
71
|
+
issue_id: e.issue_id,
|
|
72
|
+
identifier: e.identifier,
|
|
73
|
+
issue: e.issue,
|
|
74
|
+
session_id: e.session_id,
|
|
75
|
+
workspace_path: e.workspace_path,
|
|
76
|
+
started_at: e.started_at,
|
|
77
|
+
turn_count: e.turn_count,
|
|
78
|
+
retry_attempt: e.retry_attempt,
|
|
79
|
+
input_tokens: e.input_tokens,
|
|
80
|
+
output_tokens: e.output_tokens,
|
|
81
|
+
total_tokens: e.total_tokens,
|
|
82
|
+
last_event: e.last_event,
|
|
83
|
+
last_event_at: e.last_event_at,
|
|
84
|
+
last_message: e.last_message,
|
|
85
|
+
recent_events: e.recent_events,
|
|
86
|
+
last_error: e.last_error,
|
|
87
|
+
transitioned: e.transitioned,
|
|
88
|
+
steering_requested: e.steering_requested,
|
|
89
|
+
steering_question: e.steering_question,
|
|
90
|
+
steering_context: e.steering_context,
|
|
91
|
+
active_tool_call_count: e.active_tool_calls.size,
|
|
92
|
+
resolved_actor: e.resolved_actor,
|
|
93
|
+
base_branch_at_dispatch: e.base_branch_at_dispatch,
|
|
94
|
+
github_repo_at_dispatch: e.github_repo_at_dispatch,
|
|
95
|
+
tracker_root_at_dispatch: e.tracker_root_at_dispatch,
|
|
96
|
+
cleanup_workspace_on_exit: e.cleanup_workspace_on_exit,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/** Project a live RunningEntry into the flat RunningRow the HTML render layer reads. */
|
|
100
|
+
function toRunningRow(e) {
|
|
101
|
+
return {
|
|
102
|
+
issue_identifier: e.identifier,
|
|
103
|
+
issue_title: e.issue.title,
|
|
104
|
+
issue_body: e.issue.description ?? '',
|
|
105
|
+
turn_count: e.turn_count,
|
|
106
|
+
last_event: e.last_event,
|
|
107
|
+
last_message: e.last_message,
|
|
108
|
+
tokens: { input_tokens: e.input_tokens, output_tokens: e.output_tokens, total_tokens: e.total_tokens },
|
|
109
|
+
steering_requested: e.steering_requested,
|
|
110
|
+
steering_question: e.steering_question,
|
|
111
|
+
steering_context: e.steering_context,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/** Project a live RetryEntry into the flat RetryRow the HTML render layer reads. */
|
|
115
|
+
function toRetryRow(e) {
|
|
116
|
+
return {
|
|
117
|
+
issue_identifier: e.identifier,
|
|
118
|
+
attempt: e.attempt,
|
|
119
|
+
due_at: new Date(e.due_at_ms).toISOString(),
|
|
120
|
+
error: e.error,
|
|
121
|
+
kind: e.kind,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/** Sum the live per-attempt token counters into the aggregate the totals footer reads. */
|
|
125
|
+
export function aggregateTotals(running) {
|
|
126
|
+
let input = 0;
|
|
127
|
+
let output = 0;
|
|
128
|
+
let total = 0;
|
|
129
|
+
for (const e of running) {
|
|
130
|
+
input += e.input_tokens;
|
|
131
|
+
output += e.output_tokens;
|
|
132
|
+
total += e.total_tokens;
|
|
133
|
+
}
|
|
134
|
+
return { input_tokens: input, output_tokens: output, total_tokens: total, seconds_running: 0 };
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Gather the per-request projection (live maps + disk listing) every view reads.
|
|
138
|
+
* The dashboard/REST router and the steering-reply handler both project off this,
|
|
139
|
+
* so it lives here (the leaf view module) rather than in either handler.
|
|
140
|
+
*/
|
|
141
|
+
export async function project(deps) {
|
|
142
|
+
const cfg = deps.getLiveCfg();
|
|
143
|
+
const diskIssues = await deps.tracker.listIssues(trackerRootOf(cfg));
|
|
144
|
+
return {
|
|
145
|
+
cfg,
|
|
146
|
+
states: statesOf(cfg),
|
|
147
|
+
running: deps.state.runningEntries(),
|
|
148
|
+
retrying: deps.state.retryEntries(),
|
|
149
|
+
diskIssues,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/** Build the per-request PartialInputs the dashboard + every partial render folds over. */
|
|
153
|
+
export function partialInputs(deps, proj) {
|
|
154
|
+
const totals = deps.core.buildSessionTotalsView(aggregateTotals(proj.running), proj.running.map((r) => r.started_at), deps.clock);
|
|
155
|
+
return {
|
|
156
|
+
workflowName: basenameOf(deps.workflowPath),
|
|
157
|
+
workflowPath: deps.workflowPath,
|
|
158
|
+
trackerRoot: trackerRootOf(proj.cfg),
|
|
159
|
+
states: proj.states,
|
|
160
|
+
snapshot: {
|
|
161
|
+
running: proj.running.map(toRunningRow),
|
|
162
|
+
retrying: proj.retrying.map(toRetryRow),
|
|
163
|
+
session_totals: {
|
|
164
|
+
input_tokens: totals.input_tokens,
|
|
165
|
+
output_tokens: totals.output_tokens,
|
|
166
|
+
total_tokens: totals.total_tokens,
|
|
167
|
+
seconds_running: totals.seconds_running,
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
diskIssues: proj.diskIssues,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
/** Build the system-health view for the `#health` strip from the live config + probe. */
|
|
174
|
+
export async function healthView(deps, proj) {
|
|
175
|
+
const cfg = proj.cfg;
|
|
176
|
+
const dispatch = proj.states
|
|
177
|
+
.filter((s) => s.role === 'active')
|
|
178
|
+
.map((s) => {
|
|
179
|
+
const sc = cfg.states[s.name];
|
|
180
|
+
return {
|
|
181
|
+
state: s.name,
|
|
182
|
+
adapter: sc?.adapter ?? cfg.acp.adapter,
|
|
183
|
+
model: sc?.model !== undefined ? sc.model : cfg.acp.model,
|
|
184
|
+
};
|
|
185
|
+
});
|
|
186
|
+
const credentials = deps.credentialHealth ? await deps.credentialHealth() : [];
|
|
187
|
+
return {
|
|
188
|
+
dispatch,
|
|
189
|
+
gondolin_image: cfg.gondolin.image,
|
|
190
|
+
credentials,
|
|
191
|
+
tracker_root: cfg.tracker.root,
|
|
192
|
+
// W_OK probe of the live tracker root (true/false/null) — the dashboard health strip
|
|
193
|
+
// renders `tracker=writable|readonly|unset` off this. Absent probe ⇒ null (unset).
|
|
194
|
+
tracker_root_writable: deps.trackerWritable ? deps.trackerWritable() : null,
|
|
195
|
+
last_poll_at: deps.state.lastPollAtIso(),
|
|
196
|
+
// One-time microVM image build (issue 206) — the health strip renders a banner
|
|
197
|
+
// while the reconcile loop is converting `gondolin.oci_image`, and a persistent
|
|
198
|
+
// failure banner if the conversion threw (dispatch stays held until it's fixed).
|
|
199
|
+
building_image: deps.state.imageBuildState ? deps.state.imageBuildState() : null,
|
|
200
|
+
failed_image: deps.state.imageFailureState ? deps.state.imageFailureState() : null,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
/** Build the §9.3 snapshot DTO core stamps for GET /api/v1/state. */
|
|
204
|
+
export function buildStateDto(deps, proj) {
|
|
205
|
+
const runningViews = proj.running.map(toRunningView);
|
|
206
|
+
const health = deps.core.buildHealthRollup({
|
|
207
|
+
runningCount: proj.running.length,
|
|
208
|
+
claimedCount: deps.state.claimedIds().size,
|
|
209
|
+
retryingCount: proj.retrying.length,
|
|
210
|
+
effectiveCap: proj.cfg.agent.max_concurrent_agents,
|
|
211
|
+
pendingContinuationCount: proj.retrying.filter((r) => r.kind === 'continuation').length,
|
|
212
|
+
memoryAdmissionEnabled: proj.cfg.agent.memory_admission_enabled,
|
|
213
|
+
});
|
|
214
|
+
return deps.core.buildSnapshot({
|
|
215
|
+
running: runningViews,
|
|
216
|
+
retrying: [...proj.retrying],
|
|
217
|
+
totals: aggregateTotals(proj.running),
|
|
218
|
+
health,
|
|
219
|
+
reconcilerResources: [],
|
|
220
|
+
}, deps.clock);
|
|
221
|
+
}
|
|
222
|
+
/** Project a live RunningEntry into the issue-detail (JSON) entry view. */
|
|
223
|
+
export function detailEntryView(e) {
|
|
224
|
+
return {
|
|
225
|
+
issue_id: e.issue_id,
|
|
226
|
+
identifier: e.identifier,
|
|
227
|
+
workspace_path: e.workspace_path,
|
|
228
|
+
session_id: e.session_id,
|
|
229
|
+
turn_count: e.turn_count,
|
|
230
|
+
state: e.issue.state,
|
|
231
|
+
started_at: e.started_at,
|
|
232
|
+
last_event: e.last_event,
|
|
233
|
+
last_message: e.last_message,
|
|
234
|
+
last_event_at: e.last_event_at,
|
|
235
|
+
input_tokens: e.input_tokens,
|
|
236
|
+
output_tokens: e.output_tokens,
|
|
237
|
+
total_tokens: e.total_tokens,
|
|
238
|
+
recent_events: e.recent_events,
|
|
239
|
+
last_error: e.last_error,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
/** Project a live RetryEntry into the issue-detail (JSON) retry view. */
|
|
243
|
+
export function detailRetryView(r) {
|
|
244
|
+
return {
|
|
245
|
+
issue_id: r.issue_id,
|
|
246
|
+
identifier: r.identifier,
|
|
247
|
+
attempt: r.attempt,
|
|
248
|
+
due_at_ms: r.due_at_ms,
|
|
249
|
+
error: r.error,
|
|
250
|
+
kind: r.kind,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=main-http-views.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main-http-views.js","sourceRoot":"","sources":["../../src/shell/main-http-views.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,EAAE;AACF,6EAA6E;AAC7E,0EAA0E;AAC1E,+EAA+E;AAC/E,+EAA+E;AAC/E,gFAAgF;AAChF,kFAAkF;AAClF,+CAA+C;AAC/C,EAAE;AACF,kFAAkF;AAClF,yBAAyB;AAEzB,OAAO,EAAE,UAAU,EAAE,SAAS,IAAI,WAAW,EAAE,MAAM,SAAS,CAAC;AAgB/D;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAmB;IACtD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,CAAC;QACH,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;gFAEgF;AAChF,MAAM,UAAU,QAAQ,CAAC,GAAkB;IACzC,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpD,IAAI;QACJ,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,mBAAmB,EAAE,CAAC,CAAC,mBAAmB,IAAI,IAAI;KACnD,CAAC,CAAC,CAAC;AACN,CAAC;AAED;qDACqD;AACrD,MAAM,UAAU,aAAa,CAAC,GAAkB;IAC9C,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;AAChC,CAAC;AAED;yEACyE;AACzE,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,CAAU,EAAE,CAAC;QACnD,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+EAA+E;AAC/E,+EAA+E;AAC/E,+EAA+E;AAC/E,wEAAwE;AACxE,SAAS,UAAU,CAAC,CAAS;IAC3B,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1E,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACrD,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,aAAa,CAAC,CAAe;IAC3C,OAAO;QACL,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,cAAc,EAAE,CAAC,CAAC,cAAc;QAChC,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,aAAa,EAAE,CAAC,CAAC,aAAa;QAC9B,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,aAAa,EAAE,CAAC,CAAC,aAAa;QAC9B,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,aAAa,EAAE,CAAC,CAAC,aAAa;QAC9B,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,aAAa,EAAE,CAAC,CAAC,aAAa;QAC9B,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,kBAAkB,EAAE,CAAC,CAAC,kBAAkB;QACxC,iBAAiB,EAAE,CAAC,CAAC,iBAAiB;QACtC,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;QACpC,sBAAsB,EAAE,CAAC,CAAC,iBAAiB,CAAC,IAAI;QAChD,cAAc,EAAE,CAAC,CAAC,cAAc;QAChC,uBAAuB,EAAE,CAAC,CAAC,uBAAuB;QAClD,uBAAuB,EAAE,CAAC,CAAC,uBAAuB;QAClD,wBAAwB,EAAE,CAAC,CAAC,wBAAwB;QACpD,yBAAyB,EAAE,CAAC,CAAC,yBAAyB;KACvD,CAAC;AACJ,CAAC;AAED,wFAAwF;AACxF,SAAS,YAAY,CAAC,CAAe;IACnC,OAAO;QACL,gBAAgB,EAAE,CAAC,CAAC,UAAU;QAC9B,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK;QAC1B,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE;QACrC,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,MAAM,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,aAAa,EAAE,CAAC,CAAC,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE;QACtG,kBAAkB,EAAE,CAAC,CAAC,kBAAkB;QACxC,iBAAiB,EAAE,CAAC,CAAC,iBAAiB;QACtC,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;KACrC,CAAC;AACJ,CAAC;AAED,oFAAoF;AACpF,SAAS,UAAU,CAAC,CAAa;IAC/B,OAAO;QACL,gBAAgB,EAAE,CAAC,CAAC,UAAU;QAC9B,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,MAAM,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;QAC3C,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,IAAI,EAAE,CAAC,CAAC,IAAI;KACb,CAAC;AACJ,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,eAAe,CAAC,OAAgC;IAC9D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,KAAK,IAAI,CAAC,CAAC,YAAY,CAAC;QACxB,MAAM,IAAI,CAAC,CAAC,aAAa,CAAC;QAC1B,KAAK,IAAI,CAAC,CAAC,YAAY,CAAC;IAC1B,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC;AACjG,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAqB;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IAC9B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;IACrE,OAAO;QACL,GAAG;QACH,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC;QACrB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;QACpC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QACnC,UAAU;KACX,CAAC;AACJ,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,aAAa,CAAC,IAAqB,EAAE,IAAuB;IAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAC7C,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAC7B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,EACrC,IAAI,CAAC,KAAK,CACX,CAAC;IACF,OAAO;QACL,YAAY,EAAE,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC;QAC3C,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,WAAW,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;QACpC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,QAAQ,EAAE;YACR,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;YACvC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;YACvC,cAAc,EAAE;gBACd,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,eAAe,EAAE,MAAM,CAAC,eAAe;aACxC;SACF;QACD,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC;AACJ,CAAC;AAED,yFAAyF;AACzF,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAqB,EAAE,IAAuB;IAC7E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM;SACzB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;SAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO;YACL,KAAK,EAAE,CAAC,CAAC,IAAI;YACb,OAAO,EAAE,EAAE,EAAE,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO;YACvC,KAAK,EAAE,EAAE,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK;SAC1D,CAAC;IACJ,CAAC,CAAC,CAAC;IACL,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/E,OAAO;QACL,QAAQ;QACR,cAAc,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK;QAClC,WAAW;QACX,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI;QAC9B,qFAAqF;QACrF,mFAAmF;QACnF,qBAAqB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,IAAI;QAC3E,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;QACxC,+EAA+E;QAC/E,gFAAgF;QAChF,iFAAiF;QACjF,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,IAAI;QAChF,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,IAAI;KACnF,CAAC;AACJ,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,aAAa,CAAC,IAAqB,EAAE,IAAuB;IAC1E,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;QACzC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;QACjC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,IAAI;QAC1C,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;QACnC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,qBAAqB;QAClD,wBAAwB,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC,MAAM;QACvF,sBAAsB,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,wBAAwB;KAChE,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAC5B;QACE,OAAO,EAAE,YAAY;QACrB,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC5B,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;QACrC,MAAM;QACN,mBAAmB,EAAE,EAAE;KACxB,EACD,IAAI,CAAC,KAAK,CACX,CAAC;AACJ,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,eAAe,CAAC,CAAe;IAC7C,OAAO;QACL,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,cAAc,EAAE,CAAC,CAAC,cAAc;QAChC,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK;QACpB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,aAAa,EAAE,CAAC,CAAC,aAAa;QAC9B,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,aAAa,EAAE,CAAC,CAAC,aAAa;QAC9B,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,aAAa,EAAE,CAAC,CAAC,aAAa;QAC9B,UAAU,EAAE,CAAC,CAAC,UAAU;KACzB,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,eAAe,CAAC,CAAa;IAC3C,OAAO;QACL,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,IAAI,EAAE,CAAC,CAAC,IAAI;KACb,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// FCIS rewrite — HTTP-bind + MCP-precondition + bail-startup cluster (shell).
|
|
2
|
+
//
|
|
3
|
+
// Sliced out of src/shell/main.ts (per arch-sweep §4c) so the composition root
|
|
4
|
+
// keeps under the max-lines budget. This is the boot-time transport bring-up: bind
|
|
5
|
+
// the unified HTTP listener (dashboard + MCP + the /acp WebSocket the guest dials
|
|
6
|
+
// back on), verify the MCP precondition, and centralize startup-failure cleanup.
|
|
7
|
+
//
|
|
8
|
+
// It imports NO core (only the root may) — the two pure decisions it needs
|
|
9
|
+
// (`resolveHttpPort`, the MCP `buildUrl`) arrive injected as `HttpBindCore`.
|
|
10
|
+
//
|
|
11
|
+
// Shell rule: imports from src/types/** ONLY (+ the sibling http server adapter).
|
|
12
|
+
import process from 'node:process';
|
|
13
|
+
import { createHttpServer } from './server/http.js';
|
|
14
|
+
/**
|
|
15
|
+
* Bind the unified HTTP server. HTTP port precedence: --port > server.port > 0
|
|
16
|
+
* (ephemeral) via core resolveHttpPort. A bind failure routes through bailStartup.
|
|
17
|
+
* Ported from REF bindHttpServer. The dashboard/REST request handler is composed
|
|
18
|
+
* in the root (buildHttpHandler over core http/routes+decisions+views+render) and
|
|
19
|
+
* passed in here; this cluster only owns the transport bring-up + the /acp upgrade.
|
|
20
|
+
*/
|
|
21
|
+
export async function bindHttp(graph, cli, core, handle) {
|
|
22
|
+
const cfg = graph.getLiveCfg();
|
|
23
|
+
const requested = core.resolveHttpPort(cli.port, cfg.server.port);
|
|
24
|
+
try {
|
|
25
|
+
const http = createHttpServer({
|
|
26
|
+
handle,
|
|
27
|
+
log: graph.log,
|
|
28
|
+
acpUpgrade: (req, socket, head) => graph.acpWs.handleUpgrade(req, socket, head),
|
|
29
|
+
// Tear the /acp registry down when the listener stops, so upgraded WebSocket
|
|
30
|
+
// sockets don't leak (and hang the drain) across shutdown.
|
|
31
|
+
acpStop: () => graph.acpWs.stop(),
|
|
32
|
+
});
|
|
33
|
+
const { port } = await http.bind(requested, cfg.server.host);
|
|
34
|
+
graph.boundPort = port;
|
|
35
|
+
return http;
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
return bailStartup(`error: failed to bind HTTP server on ${cfg.server.host}:${requested}: ${err.message}\n`, graph, core);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* MCP precondition (REF checkMcpPrecondition): with mcp.enabled (the default),
|
|
43
|
+
* every dispatch needs a reachable MCP URL. Verify at boot that one can be built
|
|
44
|
+
* (core buildUrl over the bound port) rather than failing each per-issue dispatch
|
|
45
|
+
* after VM bring-up costs are sunk. Routes failures through bailStartup.
|
|
46
|
+
*/
|
|
47
|
+
export async function checkMcpPrecondition(graph, core) {
|
|
48
|
+
const cfg = graph.getLiveCfg();
|
|
49
|
+
if (!cfg.mcp.enabled)
|
|
50
|
+
return;
|
|
51
|
+
if (graph.http === null || graph.boundPort === null) {
|
|
52
|
+
await bailStartup(`error: mcp.enabled=true but no HTTP server is configured. Symphony itself\n` +
|
|
53
|
+
`must bind a listener (set --port or server.port) so it can serve the MCP\n` +
|
|
54
|
+
`endpoint, even when mcp.host_url points the in-VM agent at a reverse proxy.\n`, graph, core);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const probeUrl = core.buildMcpUrl('startup-check', { host: cfg.mcp.host, explicit_host_url: cfg.mcp.explicit_host_url }, graph.boundPort);
|
|
58
|
+
if (probeUrl === null) {
|
|
59
|
+
await bailStartup(`error: mcp.enabled=true but no MCP URL can be constructed. Set --port, ` +
|
|
60
|
+
`server.port, or mcp.host_url so the in-VM agent can reach the symphony MCP endpoint.\n`, graph, core);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Centralized startup-failure cleanup (REF bailStartup): write the message, close
|
|
65
|
+
* any partial HTTP listener + the workflow watcher, flush the log sink, exit
|
|
66
|
+
* non-zero. Returns `never` so call sites narrow away post-call code.
|
|
67
|
+
*/
|
|
68
|
+
export async function bailStartup(message, graph, core) {
|
|
69
|
+
process.stderr.write(message);
|
|
70
|
+
if (graph.http)
|
|
71
|
+
await graph.http.stop().catch(() => undefined);
|
|
72
|
+
graph.src.stop();
|
|
73
|
+
await core.closeLog().catch(() => undefined);
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=main-http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main-http.js","sourceRoot":"","sources":["../../src/shell/main-http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
// FCIS rewrite — orchestrator + RUNNER-slice construction for the composition root
|
|
2
|
+
// (kind: shell helper). Sliced out of src/shell/main.ts so the root stays under the
|
|
3
|
+
// max-lines budget. Builds the live per-dispatch runner slice (workspace→VM→ACP→
|
|
4
|
+
// turn-loop→actions pipeline) AND the OrchestratorLoop the runner's `runWorker`
|
|
5
|
+
// drives, wiring the ACP frame-tap fold (per-issue runtime events + token usage)
|
|
6
|
+
// onto the live running entry. Imports NO core (only the root may) — the pure
|
|
7
|
+
// reducer/runner core bundles arrive pre-built in `OrchestratorCore`/`RunnerCoreParts`.
|
|
8
|
+
import { OrchestratorLoop } from './orchestrator-loop.js';
|
|
9
|
+
import { buildOrchestratorDeps, buildTickConfig } from './main-orchestrator.js';
|
|
10
|
+
import { buildPlaceholderEntry } from './main-adapters.js';
|
|
11
|
+
import { buildRunnerSlice } from './main-runner.js';
|
|
12
|
+
import { createAdapterRegistry } from './adapter/adapter-registry.js';
|
|
13
|
+
import { loadLauncherAsset } from './adapter/launcher-asset.js';
|
|
14
|
+
import { loadMiseConfigAsset } from './adapter/mise-config-asset.js';
|
|
15
|
+
import { ensureConvertedImage, probeConvertedImage } from './adapter/gondolin-image-converter.js';
|
|
16
|
+
import { ensureFetchedImage, probeFetchedImage } from './adapter/gondolin-image-fetch.js';
|
|
17
|
+
/**
|
|
18
|
+
* Build the runner slice + the OrchestratorLoop. The runner's `onWorkerExit`
|
|
19
|
+
* forward-references the orchestrator (constructed just after the runner); the
|
|
20
|
+
* closure only fires once an attempt finishes, so the reference is always live.
|
|
21
|
+
*/
|
|
22
|
+
export function buildOrchestratorWithRunner(deps) {
|
|
23
|
+
const { adapters: a, core } = deps;
|
|
24
|
+
const orchestratorCore = core.orchestrator;
|
|
25
|
+
// Nest the loose pure-core fns into the RunnerCoreParts bundle the runner closes
|
|
26
|
+
// over (kept here, not in the root, to keep main.ts under its line budget).
|
|
27
|
+
const runnerCore = {
|
|
28
|
+
loop: core.loop,
|
|
29
|
+
actions: core.actions,
|
|
30
|
+
resolveActorString: core.resolveActorString,
|
|
31
|
+
assertNoCredentialMounts: core.assertNoCredentialMounts,
|
|
32
|
+
resolveDispatchConfig: core.resolveDispatchConfig,
|
|
33
|
+
guestMcpUrl: core.guestMcpUrl,
|
|
34
|
+
byoProbeFailureMessage: core.byoProbeFailureMessage,
|
|
35
|
+
// mise toolchain-provisioning deciders (issue 209).
|
|
36
|
+
byoProbeScript: core.byoProbeScript,
|
|
37
|
+
miseInstallFailureMessage: core.miseInstallFailureMessage,
|
|
38
|
+
hasProjectMiseConfig: core.hasProjectMiseConfig,
|
|
39
|
+
};
|
|
40
|
+
let orchestrator;
|
|
41
|
+
// The managed prebuilt-image wiring (issue 224), built once in the root and injected.
|
|
42
|
+
// Its ref keys the fetch routing below + feeds the readiness path; null on an arch
|
|
43
|
+
// with no published asset (the managed source is then inert).
|
|
44
|
+
const managedWiring = deps.managedImageWiring;
|
|
45
|
+
const runner = buildRunnerSlice({
|
|
46
|
+
core: runnerCore,
|
|
47
|
+
ports: {
|
|
48
|
+
interpreter: a.interpreter, workspaces: a.workspace, tracker: a.tracker, baseVm: a.vm, acp: a.acpPort,
|
|
49
|
+
adapters: createAdapterRegistry(), credentialPort: a.credentialPort,
|
|
50
|
+
runlog: a.runlog, log: deps.log, clock: a.clock, random: a.random,
|
|
51
|
+
},
|
|
52
|
+
substrates: deps.substrates,
|
|
53
|
+
getLiveCfg: deps.getLiveCfg,
|
|
54
|
+
getWorkflow: deps.getWorkflow,
|
|
55
|
+
boundMcpPort: deps.boundMcpPort,
|
|
56
|
+
resolvedNodeBin: () => 'node',
|
|
57
|
+
launcherSource: deps.launcherSource,
|
|
58
|
+
miseSystemConfigSource: deps.miseSystemConfigSource,
|
|
59
|
+
readEnv: deps.readEnv,
|
|
60
|
+
// The asset auto-converted from `gondolin.oci_image` (issue 206), resolved at
|
|
61
|
+
// dispatch time. The orchestrator is forward-referenced (assigned just below);
|
|
62
|
+
// this closure only fires once an attempt dispatches, by which point the gate
|
|
63
|
+
// has already held until the build resolved — so the selector is live. Threaded
|
|
64
|
+
// into buildVmPlan, which boots it only when the `gondolin.image` escape hatch
|
|
65
|
+
// is unset, closing the convert→dispatch handoff for the one-key golden path.
|
|
66
|
+
resolveImageSelector: () => orchestrator.effectiveImageSelector(),
|
|
67
|
+
// The worker-exit fold owns the running-entry removal: onWorkerExit drops the
|
|
68
|
+
// entry (freeing its slot) before folding the exit through the reducer, so the
|
|
69
|
+
// composition root just hands the exit event over — no separate removeRunning poke.
|
|
70
|
+
onWorkerExit: (event) => orchestrator.onWorkerExit(event),
|
|
71
|
+
});
|
|
72
|
+
orchestrator = new OrchestratorLoop(buildOrchestratorDeps({
|
|
73
|
+
core: orchestratorCore,
|
|
74
|
+
ports: { interpreter: a.interpreter, timer: a.timer, mem: a.mem, clock: a.clock, tracker: a.tracker },
|
|
75
|
+
// Feed the managed store ref (issue 224) into the tick view; buildTickConfig
|
|
76
|
+
// gates it on `gondolin.managed_image` so it only rides the readiness path when
|
|
77
|
+
// the managed source is the active one. Null on an unsupported arch.
|
|
78
|
+
readConfig: () => buildTickConfig(deps.getLiveCfg(), orchestratorCore, managedWiring?.ref ?? null),
|
|
79
|
+
buildEntry: buildPlaceholderEntry,
|
|
80
|
+
runWorker: runner.runWorker,
|
|
81
|
+
stallTimeoutMs: () => deps.getLiveCfg().acp.stall_timeout_ms,
|
|
82
|
+
// Auto-convert + cache `gondolin.oci_image` on demand (issue 206). The loop
|
|
83
|
+
// fires this as a tracked async on the reducer's `ensure_image` effect and
|
|
84
|
+
// holds VM dispatch until it resolves; a second call for an already-converted
|
|
85
|
+
// digest is a cheap cache hit.
|
|
86
|
+
ensureImage: async (ref) => {
|
|
87
|
+
// Route the managed store ref (issue 224) to the prebuilt-asset FETCHER; every
|
|
88
|
+
// other ref is an `oci_image` for the CONVERTER. Both resolve to a runtime
|
|
89
|
+
// selector the loop threads into the VmPlan when `gondolin.image` is unset.
|
|
90
|
+
if (managedWiring && ref === managedWiring.ref) {
|
|
91
|
+
const fetched = await ensureFetchedImage(managedWiring, { log: deps.log });
|
|
92
|
+
return fetched.selector;
|
|
93
|
+
}
|
|
94
|
+
const cfg = deps.getLiveCfg();
|
|
95
|
+
const converted = await ensureConvertedImage(ref, {
|
|
96
|
+
pullPolicy: cfg.gondolin.oci_pull_policy,
|
|
97
|
+
runtime: cfg.gondolin.oci_runtime,
|
|
98
|
+
log: deps.log,
|
|
99
|
+
});
|
|
100
|
+
// The runtime selector the cached asset boots with — the loop records it so
|
|
101
|
+
// dispatch threads it into the VmPlan when `gondolin.image` is unset.
|
|
102
|
+
return converted.selector;
|
|
103
|
+
},
|
|
104
|
+
// Read-only per-tick readiness probe (issue 206 rework): resolve the ref's
|
|
105
|
+
// CURRENT local digest + its cached selector WITHOUT pulling/building, so the
|
|
106
|
+
// loop's readiness tracks the live digest. A moving tag whose underlying image
|
|
107
|
+
// changed reports not-ready (dropping the stale selector) until reconverted.
|
|
108
|
+
probeImage: (ref) => {
|
|
109
|
+
// Same routing as ensureImage: the managed ref probes the FETCHER's store
|
|
110
|
+
// (read-only, no download), every other ref the CONVERTER's local digest.
|
|
111
|
+
if (managedWiring && ref === managedWiring.ref) {
|
|
112
|
+
const p = probeFetchedImage(managedWiring);
|
|
113
|
+
return { digest: p.digest, selector: p.selector };
|
|
114
|
+
}
|
|
115
|
+
const p = probeConvertedImage(ref, { runtime: deps.getLiveCfg().gondolin.oci_runtime });
|
|
116
|
+
return { digest: p.digest, selector: p.selector };
|
|
117
|
+
},
|
|
118
|
+
}));
|
|
119
|
+
// ACP frame tap → orchestrator folds the per-issue event + token usage onto the
|
|
120
|
+
// live running entry (the dashboard totals + stall-reaper reference read these).
|
|
121
|
+
// These two are SANCTIONED direct folds, not pokes: they fire on the hot path (per
|
|
122
|
+
// tool-call / per turn), each is a pure `core/schedule/token-fold` onto one live
|
|
123
|
+
// entry with no scheduling decision, so they are exempt from the state-poke wall
|
|
124
|
+
// rather than routed through dispatch() — see scripts/check-state-pokes.mjs (issue 203).
|
|
125
|
+
a.acpPort.onEvent((issueId, ev) => orchestrator.reportRuntimeEvent(issueId, ev));
|
|
126
|
+
a.acpPort.onTokenUsage((issueId, usage) => orchestrator.reportTokenUsage(issueId, usage));
|
|
127
|
+
return orchestrator;
|
|
128
|
+
}
|
|
129
|
+
export { loadLauncherAsset, loadMiseConfigAsset };
|
|
130
|
+
//# sourceMappingURL=main-loops.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main-loops.js","sourceRoot":"","sources":["../../src/shell/main-loops.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// FCIS rewrite — MCP control-plane construction for the composition root (shell).
|
|
2
|
+
//
|
|
3
|
+
// Sliced out of src/shell/main.ts (mirroring main-adapters / main-reconcilers /
|
|
4
|
+
// main-http-handler) so the root keeps under the max-lines budget. This builds the
|
|
5
|
+
// per-issue MCP runtime (createMcpRuntime) — the in-VM agent's
|
|
6
|
+
// transition / request_human_steering / propose_issue `tools/call` control plane —
|
|
7
|
+
// plus the single `applyMcpEffect` the central effect interpreter routes the
|
|
8
|
+
// `mcp_tool` family through.
|
|
9
|
+
//
|
|
10
|
+
// It imports NO core (only the root may) — the pure deciders arrive as the
|
|
11
|
+
// injected `McpCore` bundle (validateEnvelope / routeFraming / decideToolCall /
|
|
12
|
+
// foldPostMove + the JSON-RPC error constructors/codes). The IO half is the
|
|
13
|
+
// tracker move/write surface + the deterministic seams (random/crypto/clock).
|
|
14
|
+
//
|
|
15
|
+
// The two effects the runtime actually executes (move_state, write_issue) are
|
|
16
|
+
// driven by ONE `applyMcpEffect`, shared between the runtime's McpEffectExec and
|
|
17
|
+
// the interpreter's `mcp_tool` family so a core-emitted MCP effect and a runtime
|
|
18
|
+
// tools/call land the same tracker IO. write_issue is dispatched WITHOUT an
|
|
19
|
+
// identifier so the tracker's collision-pick assigns the next free numeric id
|
|
20
|
+
// (the §2i overwrite-bug fix) rather than overwriting `<holding>/1.md`.
|
|
21
|
+
//
|
|
22
|
+
// Shell rule: imports from src/types/** ONLY (+ the sibling runtime factory).
|
|
23
|
+
import { createMcpRuntime } from './server/mcp-runtime.js';
|
|
24
|
+
/** Fold the loose pure-CORE deciders the root bound into the McpCore bundle the
|
|
25
|
+
* runtime closes over (keeps the root from hand-building the literal inline). */
|
|
26
|
+
function assembleMcpCore(parts) {
|
|
27
|
+
return {
|
|
28
|
+
validateEnvelope: parts.validateEnvelope,
|
|
29
|
+
extractId: parts.extractId,
|
|
30
|
+
routeFraming: parts.routeFraming,
|
|
31
|
+
makeError: parts.makeError,
|
|
32
|
+
decideToolCall: parts.decideToolCall,
|
|
33
|
+
foldPostMove: parts.foldPostMove,
|
|
34
|
+
IssueNotActive: parts.errorCodes.IssueNotActive,
|
|
35
|
+
InvalidToken: parts.errorCodes.InvalidToken,
|
|
36
|
+
InvalidRequest: parts.errorCodes.InvalidRequest,
|
|
37
|
+
InternalError: parts.errorCodes.InternalError,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Build the single applier the EffectInterpreter's `mcp_tool` family routes one
|
|
42
|
+
* McpEffect through, and the MCP runtime's McpEffectExec.moveState delegates to.
|
|
43
|
+
* It interprets the `move_state` effect against the tracker disk:
|
|
44
|
+
* move_state → tracker.moveIssueToState → { kind:'moved' } | { kind:'move_failed' }
|
|
45
|
+
* `write_issue` (the propose path) carries title/labels/priority but NOT the
|
|
46
|
+
* landing root/state — those are resolved by the runtime's `writeIssue` exec
|
|
47
|
+
* (the pinned tracker root + the live holding state), so a bare write_issue
|
|
48
|
+
* reaching this seam without that context cannot be served; it surfaces an honest
|
|
49
|
+
* move_failed. The remaining McpEffect kinds (stash/await/set/defer) are folded
|
|
50
|
+
* inside the interpreter and have no tracker IO.
|
|
51
|
+
*/
|
|
52
|
+
export function buildApplyMcpEffect(tracker) {
|
|
53
|
+
return async (effect) => {
|
|
54
|
+
if (effect.kind === 'move_state') {
|
|
55
|
+
try {
|
|
56
|
+
const moved = await tracker.moveIssueToState(effect.issueId, effect.toState, {
|
|
57
|
+
...(effect.fromRoot !== null ? { fromRoot: effect.fromRoot } : {}),
|
|
58
|
+
...(effect.fromState !== null ? { fromState: effect.fromState } : {}),
|
|
59
|
+
notes: effect.notes,
|
|
60
|
+
...(effect.actor !== null ? { actor: effect.actor } : {}),
|
|
61
|
+
});
|
|
62
|
+
return { kind: 'moved', fromState: moved.fromState, toState: moved.toState, newPath: moved.newPath };
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
return { kind: 'move_failed', message: err.message };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// write_issue needs the runtime-resolved landing state + pinned root (it goes
|
|
69
|
+
// through buildMcpRuntime's writeIssue exec); a context-less effect on this
|
|
70
|
+
// seam, plus stash/await/set_transitioned/defer_cleanup, have no tracker IO.
|
|
71
|
+
return { kind: 'move_failed', message: `mcp effect ${effect.kind} has no tracker IO on this seam` };
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Build the per-issue MCP runtime + the shared `applyMcpEffect`. The runtime's
|
|
76
|
+
* McpEffectExec drives the SAME tracker IO as the interpreter family, but
|
|
77
|
+
* write_issue carries the resolved landing state + pinned tracker root the bare
|
|
78
|
+
* McpEffect lacks (so the runtime supplies them explicitly here).
|
|
79
|
+
*/
|
|
80
|
+
export function buildMcpRuntime(deps) {
|
|
81
|
+
const { core: coreParts, tracker, random, crypto, clock, log, getLiveCfg, derivePrMerge } = deps;
|
|
82
|
+
const core = assembleMcpCore(coreParts);
|
|
83
|
+
const applyMcpEffect = buildApplyMcpEffect(tracker);
|
|
84
|
+
const runtime = createMcpRuntime({
|
|
85
|
+
core,
|
|
86
|
+
random,
|
|
87
|
+
crypto,
|
|
88
|
+
clock,
|
|
89
|
+
log,
|
|
90
|
+
liveStates: () => getLiveCfg().states,
|
|
91
|
+
livePrMerge: () => derivePrMerge(getLiveCfg()),
|
|
92
|
+
exec: {
|
|
93
|
+
// move_state goes through the shared applier verbatim.
|
|
94
|
+
moveState: (effect) => applyMcpEffect(effect),
|
|
95
|
+
// write_issue: the runtime resolved the landing holding state + pinned root,
|
|
96
|
+
// so dispatch an identifier-less tracker write directly (collision-pick id).
|
|
97
|
+
// Stamp the parent provenance (proposed_by from core's `proposedBy`, proposed_at
|
|
98
|
+
// from the injected clock) as front matter so a proposed issue carries its
|
|
99
|
+
// origin the same way the dashboard renders it (finding #5).
|
|
100
|
+
writeIssue: async (effect, proposedAtIso, landingState, trackerRoot) => {
|
|
101
|
+
const written = await tracker.writeIssue({
|
|
102
|
+
family: 'tracker',
|
|
103
|
+
kind: 'write_issue',
|
|
104
|
+
trackerRoot,
|
|
105
|
+
state: landingState,
|
|
106
|
+
title: effect.title,
|
|
107
|
+
...(effect.description !== null ? { description: effect.description } : {}),
|
|
108
|
+
priority: effect.priority,
|
|
109
|
+
labels: effect.labels,
|
|
110
|
+
extraFrontMatter: { proposed_by: effect.proposedBy, proposed_at: proposedAtIso },
|
|
111
|
+
});
|
|
112
|
+
// The tracker's write_issue always resolves to the write_issue EffectResult
|
|
113
|
+
// variant (it throws on failure); narrow the broad union for the fold.
|
|
114
|
+
if (!('kind' in written) || written.kind !== 'write_issue') {
|
|
115
|
+
return { kind: 'move_failed', message: 'tracker write_issue returned an unexpected result' };
|
|
116
|
+
}
|
|
117
|
+
return { kind: 'written', path: written.path, identifier: written.identifier };
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
// The HTTP control-plane surface (`McpHttpSurface`) the dashboard/REST handler
|
|
122
|
+
// dispatches the two agent-facing POST routes to is assembled by the composition
|
|
123
|
+
// root: `runtime.handleJsonRpc` for the bearer-authed tools/call JSON-RPC, plus an
|
|
124
|
+
// interpreter-backed `performSteering` for the steering-reply (the steering Effect
|
|
125
|
+
// can only be performed once the central interpreter — built after this — exists,
|
|
126
|
+
// and `runtime.steering` is injected into that interpreter's `steering` family).
|
|
127
|
+
return { runtime, applyMcpEffect };
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=main-mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main-mcp.js","sourceRoot":"","sources":["../../src/shell/main-mcp.ts"],"names":[],"mappings":"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"}
|