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,120 @@
|
|
|
1
|
+
// FCIS rewrite — OrchestratorLoop deps construction (shell). Sliced out of
|
|
2
|
+
// src/shell/main.ts so the composition root stays under the max-lines budget.
|
|
3
|
+
//
|
|
4
|
+
// Builds the OrchestratorLoopDeps bundle: the pure scheduler reducer (tick) is
|
|
5
|
+
// injected as the loop's reducer; the loop owns the live running/claimed/retry
|
|
6
|
+
// maps and drives the returned effects through the interpreter. `runWorker` (the
|
|
7
|
+
// per-attempt runner pipeline) is owned by the runner slice and wired through the
|
|
8
|
+
// root once it's stood up; until then a dispatch claims its slot then frees it,
|
|
9
|
+
// exercising the reducer + slot accounting end-to-end without a live worker.
|
|
10
|
+
//
|
|
11
|
+
// It imports NO core (only the root may) — the pure reducer + the candidate
|
|
12
|
+
// selector + the token-fold trio arrive injected as `OrchestratorCore`.
|
|
13
|
+
//
|
|
14
|
+
// Shell rule: imports from src/types/** ONLY (+ shell sibling type surfaces).
|
|
15
|
+
import { NoHoldingStateError } from '../types/errors.js';
|
|
16
|
+
/**
|
|
17
|
+
* Project the live config into the pure TickConfig the scheduler reducer folds
|
|
18
|
+
* over. The shell pre-resolves derived routing (spawn) + lowercased role sets so
|
|
19
|
+
* core never walks the config tree for derived data (REF buildReloadHandler).
|
|
20
|
+
*
|
|
21
|
+
* The role sets + the holding-state pick are derived by the CANONICAL core fns
|
|
22
|
+
* (`activeStateNames` / `terminalStateNames` / `pickHoldingState`), injected on
|
|
23
|
+
* `core`, rather than re-scanned by hand here (§4a). `pickHoldingState` THROWS
|
|
24
|
+
* `NoHoldingStateError` when none is declared; we catch that and project
|
|
25
|
+
* `holdingState: null` — the circuit-breaker then retains the claim instead of
|
|
26
|
+
* moving the issue (REF: pickHoldingState throwing → retain).
|
|
27
|
+
*/
|
|
28
|
+
export function buildTickConfig(cfg, core,
|
|
29
|
+
// The managed prebuilt-image store ref for this host (issue 224), or null when the
|
|
30
|
+
// host arch has no published asset. Gated on `gondolin.managed_image` below so it
|
|
31
|
+
// only rides the readiness path when the managed source is the active one.
|
|
32
|
+
managedImageRef = null) {
|
|
33
|
+
const lc = (names) => new Set(names.map((n) => n.toLowerCase()));
|
|
34
|
+
let holdingState;
|
|
35
|
+
try {
|
|
36
|
+
holdingState = core.pickHoldingState(cfg.states);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
if (!(err instanceof NoHoldingStateError))
|
|
40
|
+
throw err;
|
|
41
|
+
holdingState = null;
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
pollIntervalMs: cfg.polling.interval_ms,
|
|
45
|
+
staticCap: cfg.agent.max_concurrent_agents,
|
|
46
|
+
memoryAdmissionEnabled: cfg.agent.memory_admission_enabled,
|
|
47
|
+
hostMemoryReserveMib: cfg.agent.host_memory_reserve_mib,
|
|
48
|
+
perVmMib: cfg.gondolin.mem_mib,
|
|
49
|
+
maxRetryBackoffMs: cfg.agent.max_retry_backoff_ms,
|
|
50
|
+
circuitBreakerThreshold: cfg.agent.circuit_breaker_threshold,
|
|
51
|
+
activeStates: lc(core.activeStateNames(cfg.states)),
|
|
52
|
+
terminalStates: lc(core.terminalStateNames(cfg.states)),
|
|
53
|
+
states: cfg.states,
|
|
54
|
+
spawn: core.deriveSpawnRouting(cfg.states),
|
|
55
|
+
holdingState,
|
|
56
|
+
// The auto-convert-on-reconcile OCI ref (issue 206); the loop reads it to
|
|
57
|
+
// compute the image-readiness projection it folds onto the snapshot. The
|
|
58
|
+
// escape-hatch `image` rides alongside so core's gate mirrors runtime precedence.
|
|
59
|
+
ociImage: cfg.gondolin.oci_image,
|
|
60
|
+
image: cfg.gondolin.image,
|
|
61
|
+
// The managed source (issue 224) rides the same readiness path as oci_image, but
|
|
62
|
+
// only when it's the active source — an explicit `image`/`oci_image` keeps
|
|
63
|
+
// `managed_image` false in parse, so this is null whenever one of those wins.
|
|
64
|
+
managedImageRef: cfg.gondolin.managed_image ? managedImageRef : null,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/** Build the OrchestratorLoopDeps from the injected core fns + the live ports. */
|
|
68
|
+
export function buildOrchestratorDeps(opts) {
|
|
69
|
+
const { core, ports, readConfig } = opts;
|
|
70
|
+
return {
|
|
71
|
+
tick: core.tick,
|
|
72
|
+
interpreter: ports.interpreter,
|
|
73
|
+
timers: ports.timer,
|
|
74
|
+
memProbe: ports.mem,
|
|
75
|
+
clock: ports.clock,
|
|
76
|
+
readConfig,
|
|
77
|
+
// ONE tracker read → the pure core picks the active-but-not-terminal
|
|
78
|
+
// candidates (core/issue/parse.ts:selectCandidateIssues). null on any IO miss.
|
|
79
|
+
fetchCandidates: async () => {
|
|
80
|
+
try {
|
|
81
|
+
const { raw, root } = await ports.tracker.loadAllIssues();
|
|
82
|
+
return { issues: core.selectCandidateIssues(raw, readConfig().states), root };
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
// The pure cancel-on-move decider shared with the operator-move reducer (issue 211).
|
|
89
|
+
reconcileIssue: core.decideReconcileForIssue,
|
|
90
|
+
// FRESH per-running tracker view across ALL states — the candidate scan above
|
|
91
|
+
// excludes an issue moved to a holding/terminal state, so the move-reconcile net
|
|
92
|
+
// needs its own by-id read. Keyed by canonical id; null on an IO miss so the loop
|
|
93
|
+
// skips the reconcile rather than spuriously terminating a live attempt.
|
|
94
|
+
fetchRunningViews: async (ids) => {
|
|
95
|
+
if (ids.length === 0)
|
|
96
|
+
return new Map();
|
|
97
|
+
try {
|
|
98
|
+
const { raw } = await ports.tracker.loadAllIssues();
|
|
99
|
+
return new Map(core.selectIssuesByIds(raw, [...ids]).map((i) => [i.id, i]));
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
runWorker: opts.runWorker ?? (async () => undefined),
|
|
106
|
+
buildEntry: opts.buildEntry,
|
|
107
|
+
tokenFold: core.tokenFold,
|
|
108
|
+
stall: { detectStall: core.detectStall, stallTimeoutMs: opts.stallTimeoutMs },
|
|
109
|
+
// Pure failure backoff pinned at the core base, so the loop's re-poll-failed
|
|
110
|
+
// path cannot fork the policy core uses for the same attempt (§4a).
|
|
111
|
+
backoff: (attempt, maxBackoffMs) => core.backoffDelayMs(attempt, core.failureBaseMs, maxBackoffMs),
|
|
112
|
+
// The poll-timer id + sleep-cycle spawn actor are the core constants, injected so
|
|
113
|
+
// the loop matches the ids/actors core stamps on its Effects (§4b — no hardcoded twin).
|
|
114
|
+
pollTimerId: core.pollTimerId,
|
|
115
|
+
spawnActor: core.spawnActor,
|
|
116
|
+
ensureImage: opts.ensureImage,
|
|
117
|
+
probeImage: opts.probeImage,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=main-orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main-orchestrator.js","sourceRoot":"","sources":["../../../src/shell/main-orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// FCIS rewrite — early-exit preflight subcommands (kind: shell helper).
|
|
2
|
+
//
|
|
3
|
+
// Sliced out of the composition root so the root keeps only its core-wiring under
|
|
4
|
+
// the max-lines budget. Owns the subcommands that DON'T enter the orchestrator
|
|
5
|
+
// graph: doctor (delegated to the injected runner) and a missing workflow file
|
|
6
|
+
// (scaffold-on-interactive-serve, else fail). Ported 1:1 from REF handlePreflight.
|
|
7
|
+
//
|
|
8
|
+
// Shell rule: imports from src/types/** ONLY. The doctor runner is INJECTED by the
|
|
9
|
+
// root (the one file allowed to import core).
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
import process from 'node:process';
|
|
12
|
+
import { existsSync } from 'node:fs';
|
|
13
|
+
import { promptYesNo, isInteractive } from './interp/tty.js';
|
|
14
|
+
import { scaffoldWorkflow, scaffoldSkill } from './main-scaffold.js';
|
|
15
|
+
/**
|
|
16
|
+
* Handle the early-exit subcommands that don't enter the orchestrator graph.
|
|
17
|
+
* Returns only on the happy path of serve/reconcile against an existing workflow;
|
|
18
|
+
* every other branch exits the process. Ported from REF handlePreflight.
|
|
19
|
+
*/
|
|
20
|
+
export async function handlePreflight(cli, workflowPath, deps) {
|
|
21
|
+
if (cli.subcommand === 'doctor') {
|
|
22
|
+
process.exit(await deps.runDoctor(workflowPath, cli.port));
|
|
23
|
+
}
|
|
24
|
+
if (!existsSync(workflowPath)) {
|
|
25
|
+
// Prompt only on the bare `serve` path (reconcile needs an existing workflow).
|
|
26
|
+
// A confirmed yes writes the bundled minimal scaffold then exits 0 so the
|
|
27
|
+
// operator can fill in gondolin.* before relaunching.
|
|
28
|
+
if (cli.subcommand === 'serve' && isInteractive()) {
|
|
29
|
+
const accept = await promptYesNo(`WORKFLOW.yaml not found at ${workflowPath}.\nScaffold a starter workflow file here? [Y/n] `);
|
|
30
|
+
if (accept && (await scaffoldWorkflow(workflowPath))) {
|
|
31
|
+
// Best-effort onboarding sugar: also install the issue-filing skill next
|
|
32
|
+
// to the new WORKFLOW.yaml. A failure / already-present skill must NOT
|
|
33
|
+
// block the workflow scaffold or the relaunch (scaffoldSkill never
|
|
34
|
+
// throws), so exit 0 regardless.
|
|
35
|
+
await scaffoldSkill(path.dirname(workflowPath));
|
|
36
|
+
process.exit(0);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
process.stderr.write(`error: workflow file not found: ${workflowPath}\n`);
|
|
40
|
+
process.exit(2);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=main-preflight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main-preflight.js","sourceRoot":"","sources":["../../../src/shell/main-preflight.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,EAAE;AACF,kFAAkF;AAClF,+EAA+E;AAC/E,+EAA+E;AAC/E,mFAAmF;AACnF,EAAE;AACF,mFAAmF;AACnF,8CAA8C;AAE9C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAIrC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AASrE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAQ,EAAE,YAAoB,EAAE,IAAmB;IACvF,IAAI,GAAG,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,+EAA+E;QAC/E,0EAA0E;QAC1E,sDAAsD;QACtD,IAAI,GAAG,CAAC,UAAU,KAAK,OAAO,IAAI,aAAa,EAAE,EAAE,CAAC;YAClD,MAAM,MAAM,GAAG,MAAM,WAAW,CAC9B,8BAA8B,YAAY,kDAAkD,CAC7F,CAAC;YACF,IAAI,MAAM,IAAI,CAAC,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;gBACrD,yEAAyE;gBACzE,uEAAuE;gBACvE,mEAAmE;gBACnE,iCAAiC;gBACjC,MAAM,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;gBAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,YAAY,IAAI,CAAC,CAAC;QAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
// FCIS rewrite — reconciler-pass IO helpers (shell). Sliced out of
|
|
2
|
+
// main-reconcilers.ts to keep each file under the shell line/complexity budgets.
|
|
3
|
+
//
|
|
4
|
+
// These are the OBSERVE / APPLY-one-step / project-ledger primitives the three
|
|
5
|
+
// passes compose. Each reads a live port or the injected clock; ZERO pure
|
|
6
|
+
// decisions live here (those are the injected core deciders the passes call).
|
|
7
|
+
//
|
|
8
|
+
// Shell rule: imports from src/types/** ONLY. Ports are injected.
|
|
9
|
+
import { sanitizeWorkspaceKey } from './workspace-key.js';
|
|
10
|
+
/** Every `symphony-*` VM the orchestrator labels its dispatches with (matches the
|
|
11
|
+
* runner's `sessionLabel`); the VM reaper compares the live session set to it. */
|
|
12
|
+
const SYMPHONY_VM_PREFIX = 'symphony-';
|
|
13
|
+
/**
|
|
14
|
+
* Project the orchestrator's live running + claimed dispatches into the
|
|
15
|
+
* reconciler's intended set. Running entries carry full pinned dispatch data
|
|
16
|
+
* (issue/state/branch/base/repo); a bare claim (claimed-but-not-yet-running) is
|
|
17
|
+
* carried with the live config's base/repo + a null issue so the VM reaper and
|
|
18
|
+
* workspace janitor still treat its `symphony-<id>` label + workspace as intended
|
|
19
|
+
* (covers the window between claim and the tracker reflecting it). The PR pass
|
|
20
|
+
* skips null-issue entries (it needs the issue's state to classify an intent).
|
|
21
|
+
*/
|
|
22
|
+
export function inFlightEntries(orchestrator, cfg) {
|
|
23
|
+
const out = [];
|
|
24
|
+
const seen = new Set();
|
|
25
|
+
for (const e of orchestrator.runningEntries()) {
|
|
26
|
+
seen.add(e.issue_id);
|
|
27
|
+
out.push({
|
|
28
|
+
identifier: e.identifier,
|
|
29
|
+
state: e.issue.state,
|
|
30
|
+
sessionLabel: `${SYMPHONY_VM_PREFIX}${e.identifier}`,
|
|
31
|
+
issue: { identifier: e.identifier, state: e.issue.state, branch_name: e.issue.branch_name },
|
|
32
|
+
baseBranch: e.base_branch_at_dispatch || cfg.workspace.base_branch,
|
|
33
|
+
githubRepo: e.github_repo_at_dispatch ?? cfg.workspace.github_repo,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
for (const id of orchestrator.claimedIds()) {
|
|
37
|
+
if (seen.has(id))
|
|
38
|
+
continue;
|
|
39
|
+
out.push({ identifier: id, state: null, sessionLabel: `${SYMPHONY_VM_PREFIX}${id}`, issue: null, baseBranch: cfg.workspace.base_branch, githubRepo: cfg.workspace.github_repo });
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
// The workspace-key sanitizer lives in the single shell home (mirror of the
|
|
44
|
+
// core util); re-exported so this module's importers keep their specifier
|
|
45
|
+
// (imported above for this module's own internal use).
|
|
46
|
+
export { sanitizeWorkspaceKey };
|
|
47
|
+
/**
|
|
48
|
+
* Build the `applyKillStep` applier: ONE step's host IO → the observed
|
|
49
|
+
* `KillStepResult` the pure `foldKillStep` consumes.
|
|
50
|
+
* • signal → ProcessSignalPort.kill → signalled / gone(ESRCH) / no_perm(EPERM)
|
|
51
|
+
* • wait_grace → TimerPort.sleep(ms) → signalled (the fold advances to probe)
|
|
52
|
+
* • probe → ProcessSignalPort.probe (signal 0) → alive / gone / no_perm
|
|
53
|
+
* • done → terminal no-op
|
|
54
|
+
*/
|
|
55
|
+
export function buildApplyKillStep(deps) {
|
|
56
|
+
return async (step) => {
|
|
57
|
+
switch (step.kind) {
|
|
58
|
+
case 'signal': {
|
|
59
|
+
const r = deps.signal.kill(step.pid, step.signal);
|
|
60
|
+
if (r.ok)
|
|
61
|
+
return { kind: 'signalled' };
|
|
62
|
+
if (r.noPerm)
|
|
63
|
+
return { kind: 'no_perm' };
|
|
64
|
+
return { kind: 'gone' };
|
|
65
|
+
}
|
|
66
|
+
case 'wait_grace':
|
|
67
|
+
await deps.timer.sleep(step.ms);
|
|
68
|
+
return { kind: 'signalled' };
|
|
69
|
+
case 'probe': {
|
|
70
|
+
const r = deps.signal.probe(step.pid);
|
|
71
|
+
if (!r.alive)
|
|
72
|
+
return { kind: 'gone' };
|
|
73
|
+
if (r.noPerm)
|
|
74
|
+
return { kind: 'no_perm' };
|
|
75
|
+
return { kind: 'alive' };
|
|
76
|
+
}
|
|
77
|
+
case 'done':
|
|
78
|
+
return { kind: 'signalled' };
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/** Fold one kill-step ledger op into the vm ledger (the clock is injected). */
|
|
83
|
+
export function applyKillLedger(ledger, decision, core, clock) {
|
|
84
|
+
const op = decision.ledger;
|
|
85
|
+
const at = clock.iso();
|
|
86
|
+
if (op.op === 'start')
|
|
87
|
+
return core.ledgerStart(ledger, op.key, at);
|
|
88
|
+
if (op.op === 'done')
|
|
89
|
+
return core.ledgerDone(ledger, op.key, at);
|
|
90
|
+
if (op.op === 'error')
|
|
91
|
+
return core.ledgerError(ledger, op.key, op.message, at);
|
|
92
|
+
return ledger;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Enumerate PR-autopilot candidates by scanning the TRACKER for issues in the
|
|
96
|
+
* merge/close states — NOT the live-dispatch (`intended.inFlight()`) set.
|
|
97
|
+
*
|
|
98
|
+
* The merge state (e.g. `Done`) is terminal: its issues are never in-flight, so
|
|
99
|
+
* an in-flight scan surfaces zero merge intents and the autopilot never arms a
|
|
100
|
+
* single auto-merge (the issue-173 FCIS rewrite regressed exactly here — open
|
|
101
|
+
* PRs sat un-armed forever). This restores the pre-rewrite `prIntended()`
|
|
102
|
+
* tracker-state scan.
|
|
103
|
+
*
|
|
104
|
+
* The per-issue workspace is no longer consulted: the autopilot stopped
|
|
105
|
+
* rebasing from it (that is the dispatched agent's job now), and terminal-state
|
|
106
|
+
* workspaces are reaped by the janitor — so `gh`/`git` PR ops run from the
|
|
107
|
+
* stable source repo (`deps.sourceRepo()`), which always exists and carries the
|
|
108
|
+
* `origin` remote the verbs resolve the repository from. We hand that path in
|
|
109
|
+
* as `mergeWorkspacePath` so the intent's `workspace_path` (and thus `cwdFor`)
|
|
110
|
+
* points there.
|
|
111
|
+
*/
|
|
112
|
+
export async function collectPrIntents(deps, cfg, routing) {
|
|
113
|
+
const states = [routing.mergeState, routing.closeState].filter((s) => s !== null);
|
|
114
|
+
if (states.length === 0)
|
|
115
|
+
return [];
|
|
116
|
+
const repo = deps.sourceRepo();
|
|
117
|
+
const { raw } = await deps.tracker.loadAllIssues();
|
|
118
|
+
// selectIssuesByStates filters by state (case-insensitive) AND normalizes each
|
|
119
|
+
// raw file into an Issue — so `issue.identifier`/`issue.branch_name` are the
|
|
120
|
+
// canonical front-matter values dispatch/actions used to push the branch, not
|
|
121
|
+
// the bare filename stem. Mirrors the pre-rewrite `fetchIssuesByStates` feed.
|
|
122
|
+
const out = [];
|
|
123
|
+
const seen = new Set();
|
|
124
|
+
for (const issue of deps.core.selectIssuesByStates(raw, states)) {
|
|
125
|
+
if (seen.has(issue.identifier))
|
|
126
|
+
continue;
|
|
127
|
+
const intent = deps.core.classifyPrIntent({
|
|
128
|
+
issue,
|
|
129
|
+
// A null mergeState (close-only routing) must never match — pass a sentinel
|
|
130
|
+
// the tracker state can't equal (classify lower-cases both sides).
|
|
131
|
+
mergeState: routing.mergeState ?? ' no-merge-state ',
|
|
132
|
+
closeState: routing.closeState,
|
|
133
|
+
baseBranch: cfg.workspace.base_branch,
|
|
134
|
+
mergeWorkspacePath: repo,
|
|
135
|
+
});
|
|
136
|
+
if (!intent)
|
|
137
|
+
continue;
|
|
138
|
+
out.push(intent);
|
|
139
|
+
seen.add(issue.identifier);
|
|
140
|
+
}
|
|
141
|
+
return out;
|
|
142
|
+
}
|
|
143
|
+
/** First declared active state (the conflict-route fallback when none is configured). */
|
|
144
|
+
export function firstActiveState(cfg) {
|
|
145
|
+
for (const [name, sc] of Object.entries(cfg.states))
|
|
146
|
+
if (sc.role === 'active')
|
|
147
|
+
return name;
|
|
148
|
+
return 'Todo';
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Observe the desired workspace set: in-flight (orchestrator) first, then active
|
|
152
|
+
* (tracker) — active wins on overlap (decideWorkspace last-write-wins reproduces
|
|
153
|
+
* the precedence). Throws on the tracker read (the pass fails closed: it must NOT
|
|
154
|
+
* treat the empty set as desired — reaping every workspace on a transient hiccup
|
|
155
|
+
* is the regression this contract closes).
|
|
156
|
+
*/
|
|
157
|
+
export async function observeDesiredWorkspaces(deps, cfg) {
|
|
158
|
+
const out = [];
|
|
159
|
+
for (const e of deps.intended.inFlight())
|
|
160
|
+
out.push({ identifier: e.identifier, state: e.state });
|
|
161
|
+
const { raw } = await deps.tracker.loadAllIssues();
|
|
162
|
+
const activeStates = new Set(Object.entries(cfg.states).filter(([, c]) => c.role === 'active').map(([n]) => n.toLowerCase()));
|
|
163
|
+
for (const f of raw) {
|
|
164
|
+
if (activeStates.has(f.state.toLowerCase()))
|
|
165
|
+
out.push({ identifier: f.identifier, state: f.state });
|
|
166
|
+
}
|
|
167
|
+
return out;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Sanitized dir names whose terminal issue left a handoff-pending marker (issue
|
|
171
|
+
* 234). Only the reap CANDIDATES (dirs NOT in the desired set) can carry one — a
|
|
172
|
+
* wanted dir is never reaped, so its marker is irrelevant — so we stat only those.
|
|
173
|
+
* A stat error reads as "no marker" (the dir reaps as today).
|
|
174
|
+
*/
|
|
175
|
+
export async function observeHandoffMarkers(deps, desired, observed) {
|
|
176
|
+
const out = new Set();
|
|
177
|
+
const wanted = new Set(desired.map((d) => sanitizeWorkspaceKey(d.identifier)));
|
|
178
|
+
for (const { name, path } of observed) {
|
|
179
|
+
if (wanted.has(name))
|
|
180
|
+
continue;
|
|
181
|
+
try {
|
|
182
|
+
if (await deps.workspace.hasHandoffPendingMarker(path))
|
|
183
|
+
out.add(name);
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
// stat failed → treat as no marker (decider reaps as today).
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return out;
|
|
190
|
+
}
|
|
191
|
+
/** Per-dir git inspection for the wanted dirs on disk (drift detection). */
|
|
192
|
+
export async function observeInspections(deps, cfg, desired, observed) {
|
|
193
|
+
const inspections = {};
|
|
194
|
+
const wanted = new Set(desired.map((d) => sanitizeWorkspaceKey(d.identifier)));
|
|
195
|
+
for (const { name, path } of observed) {
|
|
196
|
+
if (!wanted.has(name))
|
|
197
|
+
continue;
|
|
198
|
+
try {
|
|
199
|
+
inspections[name] = await deps.workspace.inspect(path, cfg.workspace.base_branch);
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
// inspect failed → omit (decider skips drift for a missing inspection).
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return inspections;
|
|
206
|
+
}
|
|
207
|
+
/** Source repo's current base-branch SHA (drift anchor); null skips drift detection. */
|
|
208
|
+
export async function resolveBaseRefSha(deps, cfg) {
|
|
209
|
+
try {
|
|
210
|
+
const r = await deps.git.run(['rev-parse', cfg.workspace.base_branch], deps.sourceRepo());
|
|
211
|
+
if (r.exit_code === 0 && r.stdout.trim().length > 0)
|
|
212
|
+
return r.stdout.trim();
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
// fall through → null (drift detection skipped; orphan removal still fires)
|
|
216
|
+
}
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
/** Ledger the mutating PR verbs (mirror the reference's per-action keys). */
|
|
220
|
+
export function recordPrLedger(ledger, effect, phase, clock, core) {
|
|
221
|
+
const key = prActionKey(effect);
|
|
222
|
+
if (key === null)
|
|
223
|
+
return ledger;
|
|
224
|
+
return phase === 'start' ? core.ledgerStart(ledger, key, clock.iso()) : core.ledgerDone(ledger, key, clock.iso());
|
|
225
|
+
}
|
|
226
|
+
function prActionKey(effect) {
|
|
227
|
+
switch (effect.kind) {
|
|
228
|
+
case 'arm_auto_merge':
|
|
229
|
+
return `arm_auto_merge:${effect.prNumber}`;
|
|
230
|
+
case 'update_branch':
|
|
231
|
+
return `update_branch:${effect.prNumber}`;
|
|
232
|
+
case 'close_pr':
|
|
233
|
+
return `close_pr:${effect.prNumber}`;
|
|
234
|
+
case 'delete_remote_branch':
|
|
235
|
+
return `delete_remote_branch:${effect.branch}`;
|
|
236
|
+
case 'cleanup_workspace':
|
|
237
|
+
return `cleanup_workspace:${effect.identifier}`;
|
|
238
|
+
case 'route_conflict':
|
|
239
|
+
return `route_to_conflict:${effect.identifier}:${effect.toState.toLowerCase()}`;
|
|
240
|
+
default:
|
|
241
|
+
return null;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=main-reconcilers-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main-reconcilers-helpers.js","sourceRoot":"","sources":["../../../src/shell/main-reconcilers-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
// FCIS rewrite — PR-autopilot effect applier (shell side of the reconciler PR
|
|
2
|
+
// pass). Sliced out of main-reconcilers.ts to keep each file under the shell
|
|
3
|
+
// line/complexity budgets.
|
|
4
|
+
//
|
|
5
|
+
// Runs the gh/git/tracker IO for one `PrEffect` against the live per-issue sticky
|
|
6
|
+
// cache (issue 70: a FOUND PR is sticky forever; the `gh pr view` TTL is
|
|
7
|
+
// independent of the cache-miss re-poll) and returns the `PrEffectOutcome` the
|
|
8
|
+
// pure `foldPrEffectOutcome` consumes. The PR pass drives the
|
|
9
|
+
// decide→apply→re-decide loop directly with `apply` so the cache stays
|
|
10
|
+
// single-owner; `applyFamily` is the interpreter's `pr`-family fallback (it
|
|
11
|
+
// reconstructs the last-seen intent for a core-emitted bare `pr` Effect).
|
|
12
|
+
//
|
|
13
|
+
// Shell rule: imports from src/types/** ONLY. Ports are injected.
|
|
14
|
+
function initPrState() {
|
|
15
|
+
return { prSummary: undefined, lastLookupAt: 0, prView: null, lastViewAt: 0, lastObservedHeadSha: null, armed: false, completed: false };
|
|
16
|
+
}
|
|
17
|
+
function cacheViewOf(st) {
|
|
18
|
+
return { completed: st.completed, armed: st.armed, lastObservedHeadSha: st.lastObservedHeadSha };
|
|
19
|
+
}
|
|
20
|
+
export const EMPTY_PR_CACHE = { completed: false, armed: false, lastObservedHeadSha: null };
|
|
21
|
+
const pollMs = (ctx) => ctx.deps.getCfg().pr.poll_interval_ms;
|
|
22
|
+
// gh/git PR ops run from the stable source repo (it always exists and carries
|
|
23
|
+
// the `origin` remote the verbs resolve the repository from). The per-issue
|
|
24
|
+
// workspace is NOT used: the autopilot no longer rebases from it and terminal
|
|
25
|
+
// workspaces are reaped, so a workspace cwd would ENOENT on `gh` spawn.
|
|
26
|
+
const cwdFor = (ctx) => ctx.deps.sourceRepo();
|
|
27
|
+
function getOrInit(ctx, id) {
|
|
28
|
+
let st = ctx.states.get(id);
|
|
29
|
+
if (!st) {
|
|
30
|
+
st = initPrState();
|
|
31
|
+
ctx.states.set(id, st);
|
|
32
|
+
}
|
|
33
|
+
return st;
|
|
34
|
+
}
|
|
35
|
+
async function observeSummary(ctx, intent, st) {
|
|
36
|
+
const fresh = ctx.deps.core.decidePrSummaryFreshness({ summary: st.prSummary, now: ctx.deps.clock.now(), lastLookupAt: st.lastLookupAt, pollIntervalMs: pollMs(ctx) });
|
|
37
|
+
if (fresh.kind === 'reuse')
|
|
38
|
+
return fresh.summary;
|
|
39
|
+
if (fresh.kind === 'defer')
|
|
40
|
+
return null;
|
|
41
|
+
const summary = await ctx.deps.gh.prListForBranch(cwdFor(ctx), intent.branch);
|
|
42
|
+
st.prSummary = summary;
|
|
43
|
+
st.lastLookupAt = ctx.deps.clock.now();
|
|
44
|
+
return summary;
|
|
45
|
+
}
|
|
46
|
+
async function fetchView(ctx, intent, prNumber, st) {
|
|
47
|
+
const fresh = ctx.deps.core.decidePrViewFreshness({ view: st.prView, now: ctx.deps.clock.now(), lastViewAt: st.lastViewAt, pollIntervalMs: pollMs(ctx) });
|
|
48
|
+
if (fresh.kind === 'reuse')
|
|
49
|
+
return fresh.view;
|
|
50
|
+
const view = await ctx.deps.gh.prView(cwdFor(ctx), prNumber);
|
|
51
|
+
if (view !== null) {
|
|
52
|
+
st.prView = view;
|
|
53
|
+
st.lastViewAt = ctx.deps.clock.now();
|
|
54
|
+
st.lastObservedHeadSha = view.head_ref_oid;
|
|
55
|
+
st.armed = view.auto_merge_armed;
|
|
56
|
+
}
|
|
57
|
+
return view;
|
|
58
|
+
}
|
|
59
|
+
async function routeConflict(ctx, e) {
|
|
60
|
+
if (!ctx.deps.tracker.moveIssueToState)
|
|
61
|
+
return;
|
|
62
|
+
await ctx.deps.tracker.moveIssueToState(e.identifier, e.toState, { fromState: e.fromState, notes: e.notes, actor: ctx.actor });
|
|
63
|
+
}
|
|
64
|
+
/** gh/git mutating verbs (arm/update/close/delete/cleanup/route). */
|
|
65
|
+
async function applyGhVerb(ctx, effect, st, cwd) {
|
|
66
|
+
const gh = ctx.deps.gh;
|
|
67
|
+
switch (effect.kind) {
|
|
68
|
+
case 'arm_auto_merge':
|
|
69
|
+
await gh.run(['pr', 'merge', String(effect.prNumber), '--auto', `--${effect.strategy}`, '--delete-branch'], cwd);
|
|
70
|
+
st.armed = true;
|
|
71
|
+
return { kind: 'cache', cache: cacheViewOf(st) };
|
|
72
|
+
case 'update_branch':
|
|
73
|
+
await gh.run(['pr', 'update-branch', String(effect.prNumber)], cwd);
|
|
74
|
+
return { kind: 'halted' };
|
|
75
|
+
case 'close_pr':
|
|
76
|
+
return { kind: 'close', ok: (await gh.run(['pr', 'close', String(effect.prNumber)], cwd)).exit_code === 0 };
|
|
77
|
+
case 'delete_remote_branch': {
|
|
78
|
+
// Scope deletion to the configured PR repo so it matches the gh `--repo`
|
|
79
|
+
// targeting (the out-of-repo / origin-less layout): `gh api DELETE` uses
|
|
80
|
+
// host auth, not cwd `origin`, so it can't push to the wrong remote. A
|
|
81
|
+
// 404 from an already-deleted branch (e.g. `--delete-branch` on merge) is
|
|
82
|
+
// ignored — the result is not folded. Local-only (no slug) → `git push`.
|
|
83
|
+
const slug = ctx.deps.getCfg().workspace.github_repo;
|
|
84
|
+
if (slug)
|
|
85
|
+
await gh.run(['api', '--method', 'DELETE', `repos/${slug}/git/refs/heads/${effect.branch}`], cwd);
|
|
86
|
+
else
|
|
87
|
+
await ctx.deps.git.run(['push', 'origin', '--delete', effect.branch], cwd);
|
|
88
|
+
return { kind: 'none' };
|
|
89
|
+
}
|
|
90
|
+
case 'cleanup_workspace':
|
|
91
|
+
await ctx.deps.workspace.remove(effect.identifier, 'stale_issue');
|
|
92
|
+
return { kind: 'none' };
|
|
93
|
+
case 'route_conflict':
|
|
94
|
+
await routeConflict(ctx, effect);
|
|
95
|
+
return { kind: 'halted' };
|
|
96
|
+
default:
|
|
97
|
+
return { kind: 'none' };
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/** Cache-mutating latches that touch no port (update_observed_head/mark/reset). */
|
|
101
|
+
function applyCacheLatch(ctx, effect, st) {
|
|
102
|
+
switch (effect.kind) {
|
|
103
|
+
case 'update_observed_head':
|
|
104
|
+
st.lastObservedHeadSha = effect.sha;
|
|
105
|
+
return { kind: 'cache', cache: cacheViewOf(st) };
|
|
106
|
+
case 'mark_completed':
|
|
107
|
+
st.completed = true;
|
|
108
|
+
return { kind: 'cache', cache: cacheViewOf(st) };
|
|
109
|
+
case 'reset_transient': {
|
|
110
|
+
// Wipe everything (reference resetTransient) so the next return re-resolves.
|
|
111
|
+
if (ctx.states.has(effect.identifier))
|
|
112
|
+
ctx.states.set(effect.identifier, initPrState());
|
|
113
|
+
const next = ctx.states.get(effect.identifier);
|
|
114
|
+
return { kind: 'cache', cache: next ? cacheViewOf(next) : EMPTY_PR_CACHE };
|
|
115
|
+
}
|
|
116
|
+
default:
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
async function apply(ctx, intent, effect) {
|
|
121
|
+
ctx.intents.set(intent.identifier, intent);
|
|
122
|
+
const st = getOrInit(ctx, intent.identifier);
|
|
123
|
+
if (effect.kind === 'observe_summary')
|
|
124
|
+
return { kind: 'summary', summary: await observeSummary(ctx, intent, st), cache: cacheViewOf(st) };
|
|
125
|
+
if (effect.kind === 'observe_view')
|
|
126
|
+
return { kind: 'view', view: await fetchView(ctx, intent, effect.prNumber, st), cache: cacheViewOf(st) };
|
|
127
|
+
return applyCacheLatch(ctx, effect, st) ?? applyGhVerb(ctx, effect, st, cwdFor(ctx));
|
|
128
|
+
}
|
|
129
|
+
export function buildPrApplier(deps) {
|
|
130
|
+
const ctx = { deps, states: new Map(), intents: new Map(), actor: deps.actor ?? 'pr-autopilot' };
|
|
131
|
+
const applyFamily = async (effect) => {
|
|
132
|
+
const intent = ctx.intents.get(effect.identifier);
|
|
133
|
+
if (!intent)
|
|
134
|
+
return { ok: false, error: 'pr effect for unknown intent (no live PR pass observation)' };
|
|
135
|
+
await apply(ctx, intent, effect);
|
|
136
|
+
return { ok: true };
|
|
137
|
+
};
|
|
138
|
+
const dropExcept = (wanted) => {
|
|
139
|
+
for (const id of [...ctx.states.keys()])
|
|
140
|
+
if (!wanted.has(id))
|
|
141
|
+
ctx.states.delete(id);
|
|
142
|
+
for (const id of [...ctx.intents.keys()])
|
|
143
|
+
if (!wanted.has(id))
|
|
144
|
+
ctx.intents.delete(id);
|
|
145
|
+
};
|
|
146
|
+
return { apply: (intent, effect) => apply(ctx, intent, effect), applyFamily, dropExcept };
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=main-reconcilers-pr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main-reconcilers-pr.js","sourceRoot":"","sources":["../../../src/shell/main-reconcilers-pr.ts"],"names":[],"mappings":"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"}
|