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
package/dist/reconciler/index.js
DELETED
|
@@ -1,448 +0,0 @@
|
|
|
1
|
-
// Reconciler (issue 32). Owns the resource DAG that converges managed external
|
|
2
|
-
// resources toward their declared desired state.
|
|
3
|
-
//
|
|
4
|
-
// Resources: the VM reaper (Gondolin session GC), the workspace janitor, and PR
|
|
5
|
-
// autopilot. The DAG walker, per-action ledger, and dispatch-gating predicate
|
|
6
|
-
// are written generically so additional resources can plug in by registering.
|
|
7
|
-
// (The earlier per-issue image-bake resource was removed in the Gondolin
|
|
8
|
-
// migration — the agent image is built once via `images/agents`, not baked per
|
|
9
|
-
// issue.)
|
|
10
|
-
//
|
|
11
|
-
// Triggers (per issue 31 sketch):
|
|
12
|
-
// • startup — orchestrator calls reconcile() before the first dispatch.
|
|
13
|
-
// • config-watcher — orchestrator's onConfigReloaded calls reconcile().
|
|
14
|
-
// • tracker-state — left to a future stage (no tracker-driven resources in v1).
|
|
15
|
-
// • backstop tick — internal timer fires reconcile() every
|
|
16
|
-
// `backstopIntervalMs` so a missed signal can't park the
|
|
17
|
-
// reconciler forever.
|
|
18
|
-
//
|
|
19
|
-
// `reconcile --force` (CLI flag) propagates `{ force: true }` through, requesting
|
|
20
|
-
// an immediate reconcile pass instead of waiting on the backstop tick.
|
|
21
|
-
import { VmResource } from './vm.js';
|
|
22
|
-
import { WorkspaceResource, } from './workspace.js';
|
|
23
|
-
import { defaultInspectWorkspace, defaultListWorkspaceDirs, defaultRemoveWorkspace, } from './workspace-defaults.js';
|
|
24
|
-
import { PrResource, } from './pr.js';
|
|
25
|
-
import { GhCliPrApi } from './pr-adapters.js';
|
|
26
|
-
import { derivePrRouting } from '../workflow.js';
|
|
27
|
-
import { log } from '../logging.js';
|
|
28
|
-
export class Reconciler {
|
|
29
|
-
cfg;
|
|
30
|
-
backstopIntervalMs;
|
|
31
|
-
// VM reaper. Built at construction when a VmClient + intended provider are
|
|
32
|
-
// already wired; otherwise lazily constructed via setIntendedVmProvider
|
|
33
|
-
// (the production path — bin/symphony.ts builds the Reconciler before the
|
|
34
|
-
// Orchestrator, then plugs the Orchestrator in as the intended-VM source).
|
|
35
|
-
vm = null;
|
|
36
|
-
vmClient = null;
|
|
37
|
-
vmListSessions;
|
|
38
|
-
vmGc;
|
|
39
|
-
vmKillProcess;
|
|
40
|
-
vmKillGraceMs;
|
|
41
|
-
vmSelfPid;
|
|
42
|
-
// Workspace janitor (issue 34). Constructed when an intended-set provider is
|
|
43
|
-
// wired; without one there's no desired set to compare against, so the
|
|
44
|
-
// resource is null and the reconcile pass skips it.
|
|
45
|
-
workspace = null;
|
|
46
|
-
workspaceInspect;
|
|
47
|
-
workspaceRemove;
|
|
48
|
-
workspaceCreate;
|
|
49
|
-
workspaceBaseRef;
|
|
50
|
-
workspaceIntended = null;
|
|
51
|
-
// PR autopilot (issue 38). Built only when the PR engine (`pr.enabled`) is on
|
|
52
|
-
// and providers have been wired. Null otherwise; reconcile() skips the pass.
|
|
53
|
-
pr = null;
|
|
54
|
-
prIntended = null;
|
|
55
|
-
prApi = null;
|
|
56
|
-
prTransition = null;
|
|
57
|
-
prCleanup = null;
|
|
58
|
-
backstopTimer = null;
|
|
59
|
-
stopped = false;
|
|
60
|
-
// Single-flight: collapse concurrent reconcile() calls into one ongoing pass so
|
|
61
|
-
// an event burst (config reload + backstop + manual trigger landing within ms
|
|
62
|
-
// of each other) doesn't kick off three overlapping reconcile passes.
|
|
63
|
-
inFlight = null;
|
|
64
|
-
rerunRequested = false;
|
|
65
|
-
constructor(cfg, opts = {}) {
|
|
66
|
-
this.cfg = cfg;
|
|
67
|
-
this.backstopIntervalMs = opts.backstopIntervalMs ?? 5 * 60_000;
|
|
68
|
-
this.initVm(opts);
|
|
69
|
-
this.initWorkspace(opts);
|
|
70
|
-
this.initPrProviders(opts);
|
|
71
|
-
this.pr = this.buildPrResource();
|
|
72
|
-
}
|
|
73
|
-
initVm(opts) {
|
|
74
|
-
this.vmClient = opts.vmClient ?? null;
|
|
75
|
-
this.vmListSessions = opts.listSessions;
|
|
76
|
-
this.vmGc = opts.gc;
|
|
77
|
-
this.vmKillProcess = opts.killProcess;
|
|
78
|
-
this.vmKillGraceMs = opts.killGraceMs;
|
|
79
|
-
this.vmSelfPid = opts.selfPid;
|
|
80
|
-
// Build eagerly only when a session source AND an intended provider are
|
|
81
|
-
// both already wired. The session source is either the VmClient or the
|
|
82
|
-
// explicit `listSessions` test hook; `setIntendedVmProvider` rebuilds once
|
|
83
|
-
// the orchestrator lands.
|
|
84
|
-
if ((this.vmClient || this.vmListSessions) && opts.vmIntendedProvider) {
|
|
85
|
-
this.vm = this.buildVmResource(opts.vmIntendedProvider);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Assemble the {@link VmResource} options against the wired Gondolin session
|
|
90
|
-
* source. `listSessions`/`gc` resolve from explicit test hooks first, then
|
|
91
|
-
* fall back to the {@link VmClient} (the production path) — the shell adapts
|
|
92
|
-
* `VmClient.listSessions()` (`VmSession[]`) into the reaper's local
|
|
93
|
-
* `ReaperSession` shape so vm.ts never imports the port/adapter.
|
|
94
|
-
*/
|
|
95
|
-
buildVmResource(intended) {
|
|
96
|
-
const client = this.vmClient;
|
|
97
|
-
const listSessions = this.vmSessionLister();
|
|
98
|
-
const gc = this.vmGc ?? (client ? () => client.gc() : null);
|
|
99
|
-
if (!listSessions || !gc) {
|
|
100
|
-
throw new Error('vm reaper: no session source wired (need vmClient or listSessions+gc)');
|
|
101
|
-
}
|
|
102
|
-
return new VmResource({
|
|
103
|
-
intended,
|
|
104
|
-
listSessions,
|
|
105
|
-
gc,
|
|
106
|
-
killProcess: this.vmKillProcess ?? defaultKillProcess,
|
|
107
|
-
killGraceMs: this.vmKillGraceMs,
|
|
108
|
-
// The reaper's own pid, injected so the pure core can exclude it (and so
|
|
109
|
-
// the shell can never `process.kill` itself). Sourced here in the shell —
|
|
110
|
-
// vm.ts must not read `process`.
|
|
111
|
-
selfPid: this.vmSelfPid ?? process.pid,
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
initWorkspace(opts) {
|
|
115
|
-
this.workspaceInspect = opts.workspaceInspect;
|
|
116
|
-
this.workspaceRemove = opts.workspaceRemove;
|
|
117
|
-
this.workspaceCreate = opts.workspaceCreate;
|
|
118
|
-
this.workspaceBaseRef = opts.workspaceBaseRef;
|
|
119
|
-
if (opts.workspaceIntendedProvider) {
|
|
120
|
-
this.workspaceIntended = opts.workspaceIntendedProvider;
|
|
121
|
-
this.workspace = this.buildWorkspaceResource();
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
initPrProviders(opts) {
|
|
125
|
-
if (opts.prIntendedProvider)
|
|
126
|
-
this.prIntended = opts.prIntendedProvider;
|
|
127
|
-
if (opts.prApi)
|
|
128
|
-
this.prApi = opts.prApi;
|
|
129
|
-
if (opts.prTransition)
|
|
130
|
-
this.prTransition = opts.prTransition;
|
|
131
|
-
if (opts.prCleanup)
|
|
132
|
-
this.prCleanup = opts.prCleanup;
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Construct (or rebuild) the PR autopilot resource against the current
|
|
136
|
-
* config + wired providers. Returns null when the PR engine (`pr.enabled`) is
|
|
137
|
-
* false OR any required provider is missing — the latter happens on the
|
|
138
|
-
* production path during the brief window between Reconciler construction
|
|
139
|
-
* and the orchestrator wiring its callbacks via {@link setPrAutopilotProviders}.
|
|
140
|
-
*
|
|
141
|
-
* The auto-merge strategy and conflict-route target are derived by scanning
|
|
142
|
-
* states for the per-state `pr:` field (issue 139); only the engine on/off +
|
|
143
|
-
* poll TTL are read from the top-level `pr:` block.
|
|
144
|
-
*/
|
|
145
|
-
buildPrResource() {
|
|
146
|
-
if (!this.cfg.pr.enabled)
|
|
147
|
-
return null;
|
|
148
|
-
if (!this.prIntended || !this.prApi || !this.prTransition || !this.prCleanup) {
|
|
149
|
-
return null;
|
|
150
|
-
}
|
|
151
|
-
const routing = derivePrRouting(this.cfg.states);
|
|
152
|
-
const conflictRouteTo = routing.conflictRouteTo ?? defaultConflictRouteTo(this.cfg);
|
|
153
|
-
return new PrResource({
|
|
154
|
-
intended: this.prIntended,
|
|
155
|
-
pr: this.prApi,
|
|
156
|
-
transition: this.prTransition,
|
|
157
|
-
cleanup: this.prCleanup,
|
|
158
|
-
strategy: routing.strategy,
|
|
159
|
-
conflictRouteTo,
|
|
160
|
-
pollIntervalMs: this.cfg.pr.poll_interval_ms,
|
|
161
|
-
actor: 'pr-autopilot',
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
buildWorkspaceResource() {
|
|
165
|
-
if (!this.workspaceIntended)
|
|
166
|
-
return null;
|
|
167
|
-
const root = this.cfg.workspace.root;
|
|
168
|
-
return new WorkspaceResource({
|
|
169
|
-
intended: this.workspaceIntended,
|
|
170
|
-
baseRef: this.workspaceBaseRef,
|
|
171
|
-
listWorkspaces: () => defaultListWorkspaceDirs(root),
|
|
172
|
-
inspect: this.workspaceInspect ?? defaultInspectWorkspace,
|
|
173
|
-
remove: this.workspaceRemove ?? ((identifier) => defaultRemoveWorkspace(root, identifier)),
|
|
174
|
-
create: this.workspaceCreate,
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* Wire the VM resource against an intended-VM source after construction.
|
|
179
|
-
* The orchestrator is the intended-VM provider in production (it owns the
|
|
180
|
-
* `running` map) but is constructed AFTER the Reconciler because the runner
|
|
181
|
-
* needs the Reconciler at construction time. Calling this is idempotent —
|
|
182
|
-
* the resource is replaced wholesale.
|
|
183
|
-
*
|
|
184
|
-
* No-op when no session source (VmClient or explicit `listSessions` hook)
|
|
185
|
-
* was wired at Reconciler construction; without one, the reaper has nothing
|
|
186
|
-
* to enumerate Gondolin's session set with.
|
|
187
|
-
*/
|
|
188
|
-
setIntendedVmProvider(provider) {
|
|
189
|
-
if (!this.vmClient && !this.vmListSessions)
|
|
190
|
-
return;
|
|
191
|
-
this.vm = this.buildVmResource(provider);
|
|
192
|
-
}
|
|
193
|
-
/**
|
|
194
|
-
* Wire the PR autopilot resource after construction. Same ordering reason
|
|
195
|
-
* as the VM and workspace janitors: the orchestrator implements every
|
|
196
|
-
* provider but is built after the Reconciler. Idempotent — the resource
|
|
197
|
-
* is rebuilt against the latest providers on each call.
|
|
198
|
-
*
|
|
199
|
-
* Calling this with the PR engine (`pr.enabled`) false in the live config is
|
|
200
|
-
* a no-op (the resource stays null).
|
|
201
|
-
*/
|
|
202
|
-
setPrAutopilotProviders(opts) {
|
|
203
|
-
this.prIntended = opts.intended;
|
|
204
|
-
this.prApi = opts.pr;
|
|
205
|
-
this.prTransition = opts.transition;
|
|
206
|
-
this.prCleanup = opts.cleanup;
|
|
207
|
-
this.pr = this.buildPrResource();
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Wire the workspace janitor after construction. Same construction-ordering
|
|
211
|
-
* reason as `setIntendedVmProvider`: the orchestrator is the intended
|
|
212
|
-
* provider in production but is built after the Reconciler. Idempotent —
|
|
213
|
-
* the resource is replaced wholesale on each call.
|
|
214
|
-
*/
|
|
215
|
-
setWorkspaceProviders(intended, opts = {}) {
|
|
216
|
-
this.workspaceIntended = intended;
|
|
217
|
-
if (opts.baseRef !== undefined)
|
|
218
|
-
this.workspaceBaseRef = opts.baseRef;
|
|
219
|
-
if (opts.remove !== undefined)
|
|
220
|
-
this.workspaceRemove = opts.remove;
|
|
221
|
-
if (opts.create !== undefined)
|
|
222
|
-
this.workspaceCreate = opts.create;
|
|
223
|
-
this.workspace = this.buildWorkspaceResource();
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* Run the workspace reaper outside the normal reconcile() walk. Used by the
|
|
227
|
-
* orchestrator at startup to take over from the deleted `startupTerminalCleanup`
|
|
228
|
-
* sweep: a single awaited pass before the first dispatch tick removes
|
|
229
|
-
* leftover dirs from a prior run so a brand-new dispatch doesn't reuse
|
|
230
|
-
* stale state. No-op when the resource isn't wired.
|
|
231
|
-
*/
|
|
232
|
-
async reapWorkspaces() {
|
|
233
|
-
if (!this.workspace)
|
|
234
|
-
return;
|
|
235
|
-
try {
|
|
236
|
-
await this.workspace.reconcile();
|
|
237
|
-
}
|
|
238
|
-
catch (err) {
|
|
239
|
-
log.warn('workspace reap pass threw', { error: err.message });
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
/**
|
|
243
|
-
* Run the VM reaper outside the normal reconcile() walk. Used by the
|
|
244
|
-
* orchestrator at:
|
|
245
|
-
* • startup (after `start()` — initial sweep of leftover symphony-* VMs).
|
|
246
|
-
* • shutdown (`stop()` clears `running` first so desired = ∅).
|
|
247
|
-
* • non-clean worker exit (the per-attempt destroy may not have fired).
|
|
248
|
-
*
|
|
249
|
-
* Decoupled from `reconcile()` so VM reaping can run on its own cadence
|
|
250
|
-
* (startup/shutdown/worker-exit) without waiting on a full reconcile pass.
|
|
251
|
-
* Returns immediately when the vm resource isn't wired.
|
|
252
|
-
*/
|
|
253
|
-
async reapVms() {
|
|
254
|
-
if (!this.vm)
|
|
255
|
-
return;
|
|
256
|
-
try {
|
|
257
|
-
await this.vm.reconcile();
|
|
258
|
-
}
|
|
259
|
-
catch (err) {
|
|
260
|
-
log.warn('vm reap pass threw', { error: err.message });
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
/**
|
|
264
|
-
* Resolve the session enumerator: the explicit `listSessions` test hook if
|
|
265
|
-
* set, else an adapter over `VmClient.listSessions()` (alive-only,
|
|
266
|
-
* `ReaperSession`-shaped), else null when no source is wired.
|
|
267
|
-
*
|
|
268
|
-
* NOTE: the session registry records the *creating* process's pid — for
|
|
269
|
-
* symphony's in-process VMs that is the orchestrator's own pid, not the
|
|
270
|
-
* backing qemu's. So this enumerator drives the convergence reaper (which
|
|
271
|
-
* compares labels against the intended set), NOT forced qemu teardown on exit:
|
|
272
|
-
* that is `VmClient.killAllVms()`, which signals each VM's `getHostPid()`
|
|
273
|
-
* directly (issue 152).
|
|
274
|
-
*/
|
|
275
|
-
vmSessionLister() {
|
|
276
|
-
if (this.vmListSessions)
|
|
277
|
-
return this.vmListSessions;
|
|
278
|
-
const client = this.vmClient;
|
|
279
|
-
if (!client)
|
|
280
|
-
return null;
|
|
281
|
-
return async () => adaptSessions(await client.listSessions());
|
|
282
|
-
}
|
|
283
|
-
// Re-bind config-dependent resources against the freshly-reloaded config.
|
|
284
|
-
updateConfig(cfg) {
|
|
285
|
-
this.cfg = cfg;
|
|
286
|
-
// Workspace janitor reads `workspace.root` at construction; rebind so a
|
|
287
|
-
// workflow reload that moved the workspace root takes effect on the next
|
|
288
|
-
// pass. Preserves the held intended/integration providers — they're
|
|
289
|
-
// referenced indirectly via the orchestrator's identity, which doesn't
|
|
290
|
-
// change on reload.
|
|
291
|
-
if (this.workspace) {
|
|
292
|
-
this.workspace = this.buildWorkspaceResource();
|
|
293
|
-
}
|
|
294
|
-
// PR autopilot reads strategy / route-state fields from cfg at
|
|
295
|
-
// construction. Rebuild so a reload that flips `enabled` or changes any
|
|
296
|
-
// field takes effect on the next pass.
|
|
297
|
-
this.pr = this.buildPrResource();
|
|
298
|
-
void this.reconcile().catch((err) => log.warn('reconcile after config reload failed', { error: err.message }));
|
|
299
|
-
}
|
|
300
|
-
start() {
|
|
301
|
-
if (this.backstopTimer)
|
|
302
|
-
return;
|
|
303
|
-
this.backstopTimer = setInterval(() => {
|
|
304
|
-
void this.reconcile().catch((err) => log.debug('backstop reconcile failed', { error: err.message }));
|
|
305
|
-
}, this.backstopIntervalMs);
|
|
306
|
-
this.backstopTimer.unref();
|
|
307
|
-
}
|
|
308
|
-
async stop() {
|
|
309
|
-
this.stopped = true;
|
|
310
|
-
if (this.backstopTimer) {
|
|
311
|
-
clearInterval(this.backstopTimer);
|
|
312
|
-
this.backstopTimer = null;
|
|
313
|
-
}
|
|
314
|
-
// Don't block shutdown on an in-flight reconcile pass — the janitors are
|
|
315
|
-
// idempotent and re-run on the next start. Surface awaitInFlight() as an
|
|
316
|
-
// explicit call for tests that need deterministic completion.
|
|
317
|
-
}
|
|
318
|
-
// Await the current reconcile pass (if any). Used by tests that trigger a
|
|
319
|
-
// background reconcile (e.g. via updateConfig) and need it settled before
|
|
320
|
-
// asserting. Resolves immediately when no pass is in flight.
|
|
321
|
-
async awaitInFlight() {
|
|
322
|
-
if (this.inFlight)
|
|
323
|
-
await this.inFlight;
|
|
324
|
-
}
|
|
325
|
-
// Trigger a reconcile pass. Idempotent across overlapping callers (single-flight);
|
|
326
|
-
// if a pass is in progress when called, a re-run is scheduled to fire once it
|
|
327
|
-
// completes so the latest config is always observed.
|
|
328
|
-
//
|
|
329
|
-
// `force` requests an immediate pass (the CLI `reconcile --force` entry point);
|
|
330
|
-
// it no longer has resource-specific semantics now that the bake is gone, but
|
|
331
|
-
// the parameter is threaded so existing callers keep compiling and the rerun
|
|
332
|
-
// coalescing below still guarantees a fresh pass observes the latest state.
|
|
333
|
-
async reconcile(opts = {}) {
|
|
334
|
-
if (this.stopped)
|
|
335
|
-
return;
|
|
336
|
-
if (this.inFlight) {
|
|
337
|
-
this.rerunRequested = true;
|
|
338
|
-
await this.inFlight;
|
|
339
|
-
if (this.rerunRequested) {
|
|
340
|
-
this.rerunRequested = false;
|
|
341
|
-
await this.runPass();
|
|
342
|
-
}
|
|
343
|
-
return;
|
|
344
|
-
}
|
|
345
|
-
await this.runPass();
|
|
346
|
-
while (this.rerunRequested && !this.stopped) {
|
|
347
|
-
this.rerunRequested = false;
|
|
348
|
-
await this.runPass();
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
async runPass() {
|
|
352
|
-
this.inFlight = (async () => {
|
|
353
|
-
try {
|
|
354
|
-
// Independent janitors: vm reaper, workspace janitor, PR autopilot. Each
|
|
355
|
-
// is idempotent / cheap when there's no work to do — the passes return
|
|
356
|
-
// immediately when desired == actual.
|
|
357
|
-
if (this.vm) {
|
|
358
|
-
try {
|
|
359
|
-
await this.vm.reconcile();
|
|
360
|
-
}
|
|
361
|
-
catch (err) {
|
|
362
|
-
log.warn('vm reconcile pass threw', { error: err.message });
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
if (this.workspace) {
|
|
366
|
-
try {
|
|
367
|
-
await this.workspace.reconcile();
|
|
368
|
-
}
|
|
369
|
-
catch (err) {
|
|
370
|
-
log.warn('workspace reconcile pass threw', { error: err.message });
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
if (this.pr) {
|
|
374
|
-
try {
|
|
375
|
-
await this.pr.reconcile();
|
|
376
|
-
}
|
|
377
|
-
catch (err) {
|
|
378
|
-
log.warn('pr reconcile pass threw', { error: err.message });
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
catch (err) {
|
|
383
|
-
log.warn('reconcile pass threw', { error: err.message });
|
|
384
|
-
}
|
|
385
|
-
finally {
|
|
386
|
-
this.inFlight = null;
|
|
387
|
-
}
|
|
388
|
-
})();
|
|
389
|
-
await this.inFlight;
|
|
390
|
-
}
|
|
391
|
-
// Public predicate the orchestrator's dispatch loop calls before claiming an issue.
|
|
392
|
-
// True iff every resource the dispatch flow depends on is ready. The bake was
|
|
393
|
-
// the only dispatch-gating prerequisite; with the image built ahead of time
|
|
394
|
-
// (not per issue) there is nothing left to gate on, so dispatch is always ready.
|
|
395
|
-
dispatchReady() {
|
|
396
|
-
return true;
|
|
397
|
-
}
|
|
398
|
-
snapshot() {
|
|
399
|
-
const resources = [];
|
|
400
|
-
if (this.vm)
|
|
401
|
-
resources.push(this.vm.snapshot());
|
|
402
|
-
if (this.workspace)
|
|
403
|
-
resources.push(this.workspace.snapshot());
|
|
404
|
-
if (this.pr)
|
|
405
|
-
resources.push(this.pr.snapshot());
|
|
406
|
-
return { resources };
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
/**
|
|
410
|
-
* First declared active state, used as the default `conflict_route_to` when
|
|
411
|
-
* the workflow doesn't pin one. Mirrors symphony's convention of routing
|
|
412
|
-
* conflict-handling work to "Todo" without hardcoding the name.
|
|
413
|
-
*/
|
|
414
|
-
function defaultConflictRouteTo(cfg) {
|
|
415
|
-
for (const [name, sc] of Object.entries(cfg.states)) {
|
|
416
|
-
if (sc.role === 'active')
|
|
417
|
-
return name;
|
|
418
|
-
}
|
|
419
|
-
// Validation already rejects workflows with no active state, but keep a
|
|
420
|
-
// sentinel just in case so the PrResource can construct without throwing.
|
|
421
|
-
return 'Todo';
|
|
422
|
-
}
|
|
423
|
-
/**
|
|
424
|
-
* Adapt Gondolin's `VmSession[]` (from `VmClient.listSessions()`) into the
|
|
425
|
-
* reaper's local `ReaperSession` shape. Keeping this projection in the shell
|
|
426
|
-
* lets `vm.ts` (the functional core) stay free of any `vm-port`/adapter import:
|
|
427
|
-
* the core only ever sees the minimal `{ pid, label? }` it acts on.
|
|
428
|
-
*
|
|
429
|
-
* Safety: only `alive === true` sessions are forwarded to the core. A STALE
|
|
430
|
-
* (dead-pid, `alive: false`) session is Gondolin `gc()`'s job; if it reached the
|
|
431
|
-
* core it could be SIGTERM'd as a "live orphan" even though its recorded `pid`
|
|
432
|
-
* may since have been REUSED by an unrelated host process — signalling that pid
|
|
433
|
-
* would hit the wrong process. Dropping dead sessions here keeps the core
|
|
434
|
-
* minimal (it never needs an `alive` flag) and guarantees `decideVm` only ever
|
|
435
|
-
* sees genuinely-live pids.
|
|
436
|
-
*/
|
|
437
|
-
function adaptSessions(sessions) {
|
|
438
|
-
return sessions
|
|
439
|
-
.filter((s) => s.alive === true)
|
|
440
|
-
.map((s) => ({ pid: s.pid, label: s.label }));
|
|
441
|
-
}
|
|
442
|
-
function defaultKillProcess(pid, signal) {
|
|
443
|
-
process.kill(pid, signal);
|
|
444
|
-
}
|
|
445
|
-
export { decideVm } from './vm.js';
|
|
446
|
-
export { PrResource } from './pr.js';
|
|
447
|
-
export { GhCliPrApi } from './pr-adapters.js';
|
|
448
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reconciler/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
// Shared action ledger for reconciler resources (issue 43).
|
|
2
|
-
//
|
|
3
|
-
// Each resource (bake, vm, workspace, pr, …) carries a most-recent-first buffer
|
|
4
|
-
// of `ActionStatus` rows so the dashboard can render "what is this resource
|
|
5
|
-
// currently doing / what did it just try." Every resource used to inline its
|
|
6
|
-
// own copy of the push/done/error/snapshot plumbing — four identical
|
|
7
|
-
// implementations modulo the action-key shape (bake keys by hash, the rest key
|
|
8
|
-
// by an opaque string). This module centralizes that plumbing so adding a new
|
|
9
|
-
// ledger field (per-action duration, structured logging, ring-buffer policy)
|
|
10
|
-
// is a one-file change.
|
|
11
|
-
//
|
|
12
|
-
// Semantics preserved verbatim from the prior inline implementations:
|
|
13
|
-
// • start(action) — unshifts an `in_progress` row.
|
|
14
|
-
// • done(action) — flips the most-recent matching `in_progress` row to
|
|
15
|
-
// `done`. Idempotent: a second call (or a call with no
|
|
16
|
-
// matching row) is a no-op.
|
|
17
|
-
// • error(action) — flips the matching `in_progress` row to `error`; when
|
|
18
|
-
// no in-progress row exists, pushes a fresh orphan-error
|
|
19
|
-
// row with `started_at === finished_at`.
|
|
20
|
-
// • record(action) — pushes a one-shot already-terminal annotation (used by
|
|
21
|
-
// workspace's mark_stale/mark_stuck and the vm reaper's
|
|
22
|
-
// kill_session path).
|
|
23
|
-
// • run(action, fn) — convenience wrapper: start → await → done/error.
|
|
24
|
-
//
|
|
25
|
-
// The buffer is capped at `maxHistory * 2` rows; `snapshot()` exposes the
|
|
26
|
-
// first `maxHistory` for the dashboard. The over-cap headroom matches the
|
|
27
|
-
// pre-refactor behavior: the underlying array keeps a small lookback for
|
|
28
|
-
// late-arriving `done`/`error` calls whose `in_progress` row was created
|
|
29
|
-
// shortly before a flood of newer actions.
|
|
30
|
-
const DEFAULT_MAX_HISTORY = 32;
|
|
31
|
-
export class ResourceActionLedger {
|
|
32
|
-
resource;
|
|
33
|
-
nowFn;
|
|
34
|
-
maxHistory;
|
|
35
|
-
buf = [];
|
|
36
|
-
constructor(resource, opts = {}) {
|
|
37
|
-
this.resource = resource;
|
|
38
|
-
this.nowFn = opts.now ?? (() => Date.now());
|
|
39
|
-
this.maxHistory = opts.maxHistory ?? DEFAULT_MAX_HISTORY;
|
|
40
|
-
}
|
|
41
|
-
start(action) {
|
|
42
|
-
this.push({
|
|
43
|
-
resource: this.resource,
|
|
44
|
-
action,
|
|
45
|
-
state: 'in_progress',
|
|
46
|
-
started_at: this.iso(),
|
|
47
|
-
finished_at: null,
|
|
48
|
-
error: null,
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
done(action) {
|
|
52
|
-
const idx = this.findInProgress(action);
|
|
53
|
-
if (idx < 0)
|
|
54
|
-
return;
|
|
55
|
-
this.buf[idx] = { ...this.buf[idx], state: 'done', finished_at: this.iso() };
|
|
56
|
-
}
|
|
57
|
-
error(action, msg) {
|
|
58
|
-
const idx = this.findInProgress(action);
|
|
59
|
-
const finished = this.iso();
|
|
60
|
-
if (idx >= 0) {
|
|
61
|
-
this.buf[idx] = {
|
|
62
|
-
...this.buf[idx],
|
|
63
|
-
state: 'error',
|
|
64
|
-
finished_at: finished,
|
|
65
|
-
error: msg,
|
|
66
|
-
};
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
this.push({
|
|
70
|
-
resource: this.resource,
|
|
71
|
-
action,
|
|
72
|
-
state: 'error',
|
|
73
|
-
started_at: finished,
|
|
74
|
-
finished_at: finished,
|
|
75
|
-
error: msg,
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* One-shot terminal annotation. The action is pushed already-finished;
|
|
80
|
-
* `started_at === finished_at`. Used for state that has no meaningful
|
|
81
|
-
* in-progress phase (workspace drift annotations, vm kill_session errors).
|
|
82
|
-
*/
|
|
83
|
-
record(action, state, error = null) {
|
|
84
|
-
const now = this.iso();
|
|
85
|
-
this.push({
|
|
86
|
-
resource: this.resource,
|
|
87
|
-
action,
|
|
88
|
-
state,
|
|
89
|
-
started_at: now,
|
|
90
|
-
finished_at: now,
|
|
91
|
-
error,
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Convenience: start the action, await the promise, then done/error based on
|
|
96
|
-
* outcome. Returns the wrapped result so callers can still branch on the
|
|
97
|
-
* value or message without rethrowing. Errors are converted to their
|
|
98
|
-
* `.message` string — matching every existing resource's `(err as Error).message`
|
|
99
|
-
* extraction.
|
|
100
|
-
*/
|
|
101
|
-
async run(action, fn) {
|
|
102
|
-
this.start(action);
|
|
103
|
-
try {
|
|
104
|
-
const value = await fn();
|
|
105
|
-
this.done(action);
|
|
106
|
-
return { ok: true, value };
|
|
107
|
-
}
|
|
108
|
-
catch (err) {
|
|
109
|
-
const msg = err.message;
|
|
110
|
-
this.error(action, msg);
|
|
111
|
-
return { ok: false, error: msg };
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
/** Most-recent-first slice of action statuses, capped at `maxItems`. */
|
|
115
|
-
snapshot(maxItems) {
|
|
116
|
-
return this.buf.slice(0, maxItems ?? this.maxHistory);
|
|
117
|
-
}
|
|
118
|
-
findInProgress(action) {
|
|
119
|
-
return this.buf.findIndex((a) => a.action === action && a.state === 'in_progress');
|
|
120
|
-
}
|
|
121
|
-
push(status) {
|
|
122
|
-
this.buf.unshift(status);
|
|
123
|
-
if (this.buf.length > this.maxHistory * 2) {
|
|
124
|
-
this.buf.length = this.maxHistory * 2;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
iso() {
|
|
128
|
-
return new Date(this.nowFn()).toISOString();
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
//# sourceMappingURL=ledger.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../src/reconciler/ledger.ts"],"names":[],"mappings":"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"}
|