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,553 @@
|
|
|
1
|
+
// FCIS rewrite — the orchestrator scheduler reducer (the functional core's
|
|
2
|
+
// top-level tick).
|
|
3
|
+
//
|
|
4
|
+
// REF (read-only, do not modify): src/orchestrator.ts — `tick()`,
|
|
5
|
+
// `dispatchSorted()`, `onWorkerExit()` / `updateCircuitBreaker()`, `onRetryTimer()`
|
|
6
|
+
// / `handleRetryIneligible()`, and `maybeArmSleepCycle()` / `recordSleepCycleProgress()`.
|
|
7
|
+
//
|
|
8
|
+
// The reference orchestrator folds three distinct runtime events over one
|
|
9
|
+
// in-memory snapshot (running / claimed / retry maps + circuit-breaker streaks +
|
|
10
|
+
// the sleep-cycle counter):
|
|
11
|
+
//
|
|
12
|
+
// 1. a POLL tick — fetch candidates, sort, dispatch up to the slot ceiling,
|
|
13
|
+
// then maybe arm the sleep cycle and reschedule the poll.
|
|
14
|
+
// 2. a WORKER EXIT — fold the exit into the circuit breaker; trip-to-holding
|
|
15
|
+
// or schedule a retry/continuation.
|
|
16
|
+
// 3. a RETRY TIMER — re-poll, re-check eligibility, redispatch or release.
|
|
17
|
+
//
|
|
18
|
+
// This module re-expresses that fold as ONE pure, synchronous reducer:
|
|
19
|
+
// `tick(event, snapshot) -> TickResult`. Every nondeterministic input (the
|
|
20
|
+
// tracker candidate list, the memory probe reading, the prior clamp flag, the
|
|
21
|
+
// running/claimed/retry projections, "now") is passed in as plain data on the
|
|
22
|
+
// snapshot/event; every side effect the original performed (dispatch, arm a
|
|
23
|
+
// retry timer, reap a VM, move-to-holding, log, reschedule the poll) is RETURNED
|
|
24
|
+
// as data — a `DispatchPlan[]` + an `Effect[]` the shell executes.
|
|
25
|
+
//
|
|
26
|
+
// It COMPOSES the sibling deciders rather than re-deriving them:
|
|
27
|
+
// - admission.ts → computeMemoryAdmission / decideAvailableGlobalSlots
|
|
28
|
+
// - slots.ts → sortForDispatch / hasGlobalSlot / hasPerStateSlot
|
|
29
|
+
// - eligibility.ts → computeEligibilityReason
|
|
30
|
+
// - retry.ts → decideExitRetry / decideRetryAfterIneligible / scheduleRetryEffect
|
|
31
|
+
// - circuit-breaker.ts → decideCircuitBreaker / tripToHoldingEffect
|
|
32
|
+
// - sleep-cycle.ts → decideSpawn / recordSleepCycleProgress
|
|
33
|
+
//
|
|
34
|
+
// 100% SYNCHRONOUS. No async/await/Promise, no IO, no node: imports, no wall
|
|
35
|
+
// clock / randomness. `now` (epoch ms, the ISO `lastPollAt` stamp) and the
|
|
36
|
+
// memory-probe reading are injected. Imports only from src/types and sibling core
|
|
37
|
+
// modules under src/core/schedule. (NodeNext ESM: .js on every relative import.)
|
|
38
|
+
import { computeMemoryAdmission, decideAvailableGlobalSlots } from './admission.js';
|
|
39
|
+
import { sortForDispatch, hasPerStateSlot } from './slots.js';
|
|
40
|
+
import { computeEligibilityReason } from './eligibility.js';
|
|
41
|
+
import { decideExitRetry, decideRetryAfterIneligible, scheduleRetryEffect } from './retry.js';
|
|
42
|
+
import { decideCircuitBreaker, tripToHoldingEffect } from './circuit-breaker.js';
|
|
43
|
+
import { decideSpawn, recordSleepCycleProgress } from './sleep-cycle.js';
|
|
44
|
+
import { decideImageReadiness } from '../reconcile/image-decide.js';
|
|
45
|
+
import { decideReconcileForState } from './reconcile-issue.js';
|
|
46
|
+
// ─── timing constants (REF: src/orchestrator.ts) ─────────────────────────────
|
|
47
|
+
/** Slot-holding follow-up delay after a clean exit (REF: `CONTINUATION_DELAY_MS`). */
|
|
48
|
+
export const CONTINUATION_DELAY_MS = 1_000;
|
|
49
|
+
/** Base delay for the first failure backoff (REF: `FAILURE_BASE_MS`). */
|
|
50
|
+
export const FAILURE_BASE_MS = 10_000;
|
|
51
|
+
/** Stable timer id the poll-tick reschedule arms (REF: the orchestrator's poll timer). */
|
|
52
|
+
export const POLL_TIMER_ID = 'orchestrator_poll';
|
|
53
|
+
/** Actor stamped on the orchestrator-driven sleep-cycle spawn (the create effect + its log). */
|
|
54
|
+
export const SPAWN_CYCLE_ACTOR = 'symphony/sleep-cycle';
|
|
55
|
+
// ─── shared slot/eligibility helpers ─────────────────────────────────────────
|
|
56
|
+
/** Count pending retries that hold a slot (continuations only). */
|
|
57
|
+
function pendingContinuationCount(retries) {
|
|
58
|
+
let n = 0;
|
|
59
|
+
for (const r of retries)
|
|
60
|
+
if (r.kind === 'continuation')
|
|
61
|
+
n++;
|
|
62
|
+
return n;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Count DISTINCT issues currently live in `stateName` across the post-dispatch
|
|
66
|
+
* running set + the on-disk candidate scan (case-insensitive). A running issue is
|
|
67
|
+
* still on disk in its state dir, so the candidate scan already covers running /
|
|
68
|
+
* claimed / a prior-poll mint; the running set is unioned for belt-and-braces.
|
|
69
|
+
* Drives the sleep-cycle `max_in_flight` guard.
|
|
70
|
+
*/
|
|
71
|
+
function countLiveInState(running, candidates, stateName) {
|
|
72
|
+
const key = stateName.toLowerCase();
|
|
73
|
+
const ids = new Set();
|
|
74
|
+
for (const c of candidates)
|
|
75
|
+
if (c.state.toLowerCase() === key)
|
|
76
|
+
ids.add(c.id);
|
|
77
|
+
for (const r of running)
|
|
78
|
+
if (r.state.toLowerCase() === key)
|
|
79
|
+
ids.add(r.issue_id);
|
|
80
|
+
return ids.size;
|
|
81
|
+
}
|
|
82
|
+
/** Build the slot-accounting snapshot for a given effective cap + claimed/running set. */
|
|
83
|
+
function buildSlotSnapshot(snapshot, effectiveCap, running, retries) {
|
|
84
|
+
return {
|
|
85
|
+
effectiveCap,
|
|
86
|
+
runningCount: running.length,
|
|
87
|
+
runningStates: running.map((r) => r.state),
|
|
88
|
+
pendingRetries: retries.map((r) => ({ kind: r.kind, target_state: r.target_state })),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Fold the memory probe + running count + config into the admission summary and
|
|
93
|
+
* the clamp-transition log decision (REF: `computeAdmission()` +
|
|
94
|
+
* `availableGlobalSlots()`'s inline clamp logging).
|
|
95
|
+
*/
|
|
96
|
+
function resolveAdmission(snapshot) {
|
|
97
|
+
const admission = computeMemoryAdmission({
|
|
98
|
+
enabled: snapshot.cfg.memoryAdmissionEnabled,
|
|
99
|
+
staticCap: snapshot.cfg.staticCap,
|
|
100
|
+
running: snapshot.running.length,
|
|
101
|
+
probe: snapshot.memoryProbe,
|
|
102
|
+
reserveMib: snapshot.cfg.hostMemoryReserveMib,
|
|
103
|
+
perVmMib: snapshot.cfg.perVmMib,
|
|
104
|
+
});
|
|
105
|
+
const slots = decideAvailableGlobalSlots({
|
|
106
|
+
admission,
|
|
107
|
+
running: snapshot.running.length,
|
|
108
|
+
pendingContinuations: pendingContinuationCount(snapshot.retries),
|
|
109
|
+
previousClampActive: snapshot.previousClampActive,
|
|
110
|
+
});
|
|
111
|
+
return {
|
|
112
|
+
admission,
|
|
113
|
+
availableSlots: slots.availableSlots,
|
|
114
|
+
nextClampActive: slots.nextClampActive,
|
|
115
|
+
logs: slots.logs,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/** Arm the poll timer after `ms` (REF: `scheduleTick(ms)`). The poll tick reschedules
|
|
119
|
+
* at `cfg.pollIntervalMs`; an operator nudge re-arms at `0` to poll now. */
|
|
120
|
+
function pollTimerEffect(ms) {
|
|
121
|
+
return { family: 'timer', kind: 'set_timer', id: POLL_TIMER_ID, ms };
|
|
122
|
+
}
|
|
123
|
+
/** The reschedule-the-poll timer effect (REF: `scheduleTick(interval_ms)`). */
|
|
124
|
+
function rescheduleEffect(cfg) {
|
|
125
|
+
return pollTimerEffect(cfg.pollIntervalMs);
|
|
126
|
+
}
|
|
127
|
+
// ─── the reducer ───────────────────────────────────────────────────────────────
|
|
128
|
+
/**
|
|
129
|
+
* Fold one runtime event over the orchestrator snapshot. Pure and synchronous:
|
|
130
|
+
* returns the next-state deltas + the Effect[] the shell executes. Dispatches to
|
|
131
|
+
* the per-event reducer below.
|
|
132
|
+
*/
|
|
133
|
+
export function tick(event, snapshot) {
|
|
134
|
+
switch (event.kind) {
|
|
135
|
+
case 'poll':
|
|
136
|
+
return reducePoll(event, snapshot);
|
|
137
|
+
case 'worker_exit':
|
|
138
|
+
return reduceWorkerExit(event, snapshot);
|
|
139
|
+
case 'retry_timer':
|
|
140
|
+
return reduceRetryTimer(event, snapshot);
|
|
141
|
+
case 'operator_nudge':
|
|
142
|
+
return reduceOperatorNudge();
|
|
143
|
+
case 'operator_move':
|
|
144
|
+
return reduceOperatorMove(event, snapshot);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Operator nudge (REF: the operator `triggerRefresh` side-door, now an event):
|
|
149
|
+
* coalesce an immediate poll. Folds to a single `set_timer(POLL_TIMER_ID, 0)`
|
|
150
|
+
* effect — the same poll-reschedule the poll tick arms, but at `ms: 0` so the
|
|
151
|
+
* next poll runs now. No claim / dispatch / breaker deltas (an otherwise-empty
|
|
152
|
+
* TickResult); the shell's existing `set_timer`-with-`pollTimerId` branch re-arms
|
|
153
|
+
* the poll exactly as the old `triggerRefresh` did.
|
|
154
|
+
*/
|
|
155
|
+
function reduceOperatorNudge() {
|
|
156
|
+
return { dispatch: [], effects: [pollTimerEffect(0)], claim: [], release: [] };
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Operator move (REF: the old `cancelLiveAttemptOnMove` shell side-door, now an
|
|
160
|
+
* event). The tracker move already landed; fold the cancel/cleanup/release
|
|
161
|
+
* decision against the live running/retry projections:
|
|
162
|
+
* - a running attempt backs the issue → EMIT a `worker.cancel` effect (the loop
|
|
163
|
+
* performs it; core holds no live handles). `cleanupWorkspace = toTerminal`:
|
|
164
|
+
* a terminal target reaps the workspace, an active target keeps it so the
|
|
165
|
+
* post-exit continuation redispatches fresh on the agent/<id> branch.
|
|
166
|
+
* - else a pending retry backs it → RELEASE the claim (TickResult.release, which
|
|
167
|
+
* the loop routes to releaseClaim: clears the armed backoff timer + claim +
|
|
168
|
+
* breaker streak), freeing it now instead of waiting the backoff out.
|
|
169
|
+
* (running/retry are mutually exclusive — a dispatch clears any pending retry,
|
|
170
|
+
* a retry is only armed once the worker has exited — so running wins.)
|
|
171
|
+
* - `toActive` → also re-arm the poll at 0ms (the same nudge `operator_nudge`
|
|
172
|
+
* emits) so an active target is picked up immediately. A settled-row move with
|
|
173
|
+
* no live attempt is just this nudge (or nothing for a holding/terminal target).
|
|
174
|
+
* Pure; no mutation.
|
|
175
|
+
*/
|
|
176
|
+
function reduceOperatorMove(event, snapshot) {
|
|
177
|
+
const effects = [];
|
|
178
|
+
const release = [];
|
|
179
|
+
if (snapshot.running.some((r) => r.issue_id === event.issueId)) {
|
|
180
|
+
// Source the cancel/cleanup decision from the SAME pure decider the poll-loop's
|
|
181
|
+
// move-reconcile net runs (`decideReconcileForState`), so a dashboard move and a
|
|
182
|
+
// disk/external move can't drift on the workspace-cleanup flag (issue 211). An
|
|
183
|
+
// operator move ALWAYS cancels a live attempt — even onto another active state,
|
|
184
|
+
// where the decider returns `refresh` — because the operator explicitly relocated
|
|
185
|
+
// it; only the cleanup flag is the decider's (terminal target ⇒ reap, active /
|
|
186
|
+
// holding ⇒ keep the workspace for the post-exit redispatch).
|
|
187
|
+
const action = decideReconcileForState(event.toState, snapshot.cfg.states);
|
|
188
|
+
effects.push({
|
|
189
|
+
family: 'worker',
|
|
190
|
+
kind: 'cancel',
|
|
191
|
+
issueId: event.issueId,
|
|
192
|
+
cleanupWorkspace: action.kind === 'terminate' && action.cleanup,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
else if (snapshot.retries.some((r) => r.issue_id === event.issueId)) {
|
|
196
|
+
release.push(event.issueId);
|
|
197
|
+
}
|
|
198
|
+
if (event.toActive)
|
|
199
|
+
effects.push(pollTimerEffect(0));
|
|
200
|
+
return { dispatch: [], effects, claim: [], release };
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Poll tick (REF: `tick()` → `dispatchSorted()` → `maybeArmSleepCycle()` →
|
|
204
|
+
* `scheduleTick()`). Sort the candidates, dispatch eligible ones until the slot
|
|
205
|
+
* ceiling is exhausted (decrementing the running set as each is claimed so the
|
|
206
|
+
* per-state + global gates see the in-tick allocations), then maybe arm the
|
|
207
|
+
* sleep cycle and reschedule the poll.
|
|
208
|
+
*/
|
|
209
|
+
function reducePoll(event, snapshot) {
|
|
210
|
+
const { cfg } = snapshot;
|
|
211
|
+
const { admission, availableSlots, nextClampActive, logs } = resolveAdmission(snapshot);
|
|
212
|
+
const effects = [...logs];
|
|
213
|
+
const dispatch = [];
|
|
214
|
+
const claim = [];
|
|
215
|
+
// Image-readiness gate (issue 206): when `gondolin.oci_image` is configured but
|
|
216
|
+
// its asset isn't converted yet, HOLD VM dispatch this tick and emit an
|
|
217
|
+
// `ensure_image` to kick the one-time build (the loop runs it as a tracked async
|
|
218
|
+
// and clears the hold once cached). This runs BEFORE the dispatch loop so a
|
|
219
|
+
// VM-needing candidate is never admitted against a missing image. The
|
|
220
|
+
// `gondolin.image` escape hatch wins the runtime selector when set
|
|
221
|
+
// (`resolveImagePath`), so it short-circuits the gate — never holding dispatch on
|
|
222
|
+
// `oci_image` readiness — tested the same way `resolveImagePath` tests it.
|
|
223
|
+
const escapeHatchConfigured = !!(cfg.image && cfg.image.length > 0);
|
|
224
|
+
const imageDecision = decideImageReadiness(snapshot.image, escapeHatchConfigured);
|
|
225
|
+
effects.push(...imageDecision.effects);
|
|
226
|
+
// Mutable in-tick projections: as we claim an issue we add it to `running` and
|
|
227
|
+
// `claimed` so the slot/eligibility gates see the just-made allocation (REF's
|
|
228
|
+
// loop re-reads `availableGlobalSlots()` / `running` after each dispatch).
|
|
229
|
+
const running = [...snapshot.running];
|
|
230
|
+
const claimedSet = new Set(snapshot.claimed);
|
|
231
|
+
let remaining = imageDecision.holdDispatch ? 0 : availableSlots;
|
|
232
|
+
const sorted = sortForDispatch(event.candidates);
|
|
233
|
+
for (const issue of sorted) {
|
|
234
|
+
if (remaining <= 0)
|
|
235
|
+
break;
|
|
236
|
+
const slotSnapshot = buildSlotSnapshot(snapshot, admission.effectiveCap, running, snapshot.retries);
|
|
237
|
+
const reason = computeEligibilityReason(issue, /*ignoreOwnClaim*/ false, {
|
|
238
|
+
active: cfg.activeStates,
|
|
239
|
+
terminal: cfg.terminalStates,
|
|
240
|
+
running: new Set(running.map((r) => r.issue_id)),
|
|
241
|
+
claimed: claimedSet,
|
|
242
|
+
perStateSlot: (state) => hasPerStateSlot(state, slotSnapshot, cfg.states),
|
|
243
|
+
});
|
|
244
|
+
if (reason !== null)
|
|
245
|
+
continue;
|
|
246
|
+
dispatch.push({ issue, attempt: null, trackerRoot: event.trackerRoot });
|
|
247
|
+
claim.push(issue.id);
|
|
248
|
+
claimedSet.add(issue.id);
|
|
249
|
+
running.push({ issue_id: issue.id, state: issue.state });
|
|
250
|
+
remaining--;
|
|
251
|
+
}
|
|
252
|
+
// Sleep-cycle recurring spawn. The orchestrator-idle signal is: no active
|
|
253
|
+
// candidates this poll AND nothing running/claimed/pending. Use the
|
|
254
|
+
// POST-dispatch running/claimed projections so a poll that just dispatched is
|
|
255
|
+
// correctly non-idle. A trigger MINTS a fresh ephemeral reflection issue (a
|
|
256
|
+
// create effect the shell executes) instead of re-arming one immortal ticket.
|
|
257
|
+
// Requires a resolved tracker root to write into — skip the spawn when null.
|
|
258
|
+
const noActiveCandidates = event.candidates.length === 0;
|
|
259
|
+
let doneSinceReflect;
|
|
260
|
+
if (cfg.spawn.spawnState && event.trackerRoot !== null) {
|
|
261
|
+
const idle = noActiveCandidates &&
|
|
262
|
+
running.length === 0 &&
|
|
263
|
+
claimedSet.size === 0 &&
|
|
264
|
+
snapshot.retries.length === 0;
|
|
265
|
+
// In-flight count for the `max_in_flight` guard: how many issues are already
|
|
266
|
+
// live in the spawn state right now. Counted across the on-disk candidate scan
|
|
267
|
+
// (every running/claimed/just-minted-prior-poll reflection is still on disk in
|
|
268
|
+
// the spawn dir until it transitions) UNION the post-dispatch running set, so a
|
|
269
|
+
// busy-stretch `after_terminal` trigger can't mint a second while one is live.
|
|
270
|
+
// PLUS the shell's pending mints: a `write_issue` the shell already started but
|
|
271
|
+
// hasn't yet written is invisible to both projections above, so a worker exit +
|
|
272
|
+
// poll racing between emit and landing would otherwise slip past the cap.
|
|
273
|
+
const inFlight = countLiveInState(running, event.candidates, cfg.spawn.spawnState) +
|
|
274
|
+
(snapshot.pendingSpawnMints ?? 0);
|
|
275
|
+
const decision = decideSpawn({
|
|
276
|
+
enabled: true,
|
|
277
|
+
onIdle: cfg.spawn.onIdle,
|
|
278
|
+
afterTerminal: cfg.spawn.afterTerminal,
|
|
279
|
+
doneSinceReflect: snapshot.doneSinceReflect,
|
|
280
|
+
idle,
|
|
281
|
+
inFlight,
|
|
282
|
+
maxInFlight: cfg.spawn.maxInFlight,
|
|
283
|
+
nowIso: snapshot.nowIso,
|
|
284
|
+
titleTemplate: cfg.spawn.title,
|
|
285
|
+
bodyLeadIn: cfg.spawn.body,
|
|
286
|
+
});
|
|
287
|
+
if (decision) {
|
|
288
|
+
// Mint a fresh reflection issue. The shell executes the create through a
|
|
289
|
+
// guarded path (keyed on the actor) that resets the counter only on a
|
|
290
|
+
// successful mint and restores the prior count if the mint fails. Core
|
|
291
|
+
// optimistically returns a 0 counter here so a poll that fires the create
|
|
292
|
+
// can't re-fire it before the write lands.
|
|
293
|
+
effects.push({
|
|
294
|
+
family: 'tracker',
|
|
295
|
+
kind: 'write_issue',
|
|
296
|
+
trackerRoot: event.trackerRoot,
|
|
297
|
+
state: cfg.spawn.spawnState,
|
|
298
|
+
title: decision.title,
|
|
299
|
+
description: decision.body,
|
|
300
|
+
actor: SPAWN_CYCLE_ACTOR,
|
|
301
|
+
});
|
|
302
|
+
doneSinceReflect = 0;
|
|
303
|
+
effects.push({
|
|
304
|
+
family: 'log',
|
|
305
|
+
kind: 'emit',
|
|
306
|
+
level: 'info',
|
|
307
|
+
message: 'sleep cycle spawned reflection',
|
|
308
|
+
fields: {
|
|
309
|
+
trigger: decision.trigger,
|
|
310
|
+
done_since_reflect: snapshot.doneSinceReflect,
|
|
311
|
+
spawn_state: cfg.spawn.spawnState,
|
|
312
|
+
actor: SPAWN_CYCLE_ACTOR,
|
|
313
|
+
},
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
effects.push(rescheduleEffect(cfg));
|
|
318
|
+
const result = {
|
|
319
|
+
dispatch,
|
|
320
|
+
effects,
|
|
321
|
+
claim,
|
|
322
|
+
release: [],
|
|
323
|
+
clampActive: nextClampActive,
|
|
324
|
+
lastPollAt: snapshot.nowIso,
|
|
325
|
+
admission,
|
|
326
|
+
};
|
|
327
|
+
if (doneSinceReflect !== undefined)
|
|
328
|
+
result.doneSinceReflect = doneSinceReflect;
|
|
329
|
+
return result;
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Worker exit (REF: `onWorkerExit()` → `updateCircuitBreaker()` →
|
|
333
|
+
* `decideExitRetry()` → `scheduleRetry()`). The exited issue is already removed
|
|
334
|
+
* from `running` by the shell; this reducer folds the exit into the breaker, the
|
|
335
|
+
* sleep-cycle counter, and the retry schedule.
|
|
336
|
+
*/
|
|
337
|
+
function reduceWorkerExit(event, snapshot) {
|
|
338
|
+
const { cfg } = snapshot;
|
|
339
|
+
const effects = [];
|
|
340
|
+
// Sleep-cycle progress (`recordSleepCycleProgress`) — fold the exit into the
|
|
341
|
+
// terminal-transition counter. Excludes a finished reflection's own terminal
|
|
342
|
+
// move structurally (a terminal transition out of the spawn state).
|
|
343
|
+
const nextDone = recordSleepCycleProgress(snapshot.doneSinceReflect, event.progress, cfg.spawn.spawnState);
|
|
344
|
+
const doneSinceReflect = nextDone !== snapshot.doneSinceReflect ? nextDone : undefined;
|
|
345
|
+
// Circuit breaker (REF: `updateCircuitBreaker`). Fold the exit into the streak.
|
|
346
|
+
const decision = decideCircuitBreaker({
|
|
347
|
+
normal: event.normal,
|
|
348
|
+
reason: event.reason,
|
|
349
|
+
prior: snapshot.circuitBreakers.get(event.issueId) ?? null,
|
|
350
|
+
threshold: cfg.circuitBreakerThreshold,
|
|
351
|
+
});
|
|
352
|
+
if (decision.kind === 'continue') {
|
|
353
|
+
// Under threshold — persist the streak and schedule the failure retry.
|
|
354
|
+
return buildRetryExit(event, cfg, {
|
|
355
|
+
op: 'set',
|
|
356
|
+
issueId: event.issueId,
|
|
357
|
+
state: { normalizedReason: decision.normalizedReason, count: decision.count },
|
|
358
|
+
}, doneSinceReflect);
|
|
359
|
+
}
|
|
360
|
+
if (decision.kind === 'trip') {
|
|
361
|
+
// Threshold reached. Clear the streak; route to holding (when one is declared)
|
|
362
|
+
// and do NOT schedule a retry (REF: `tripCircuitBreaker` returns true).
|
|
363
|
+
effects.push({
|
|
364
|
+
family: 'runlog',
|
|
365
|
+
kind: 'system',
|
|
366
|
+
issueId: event.issueId,
|
|
367
|
+
event: 'circuit_breaker_tripped',
|
|
368
|
+
fields: { reason: event.reason, consecutive_failures: decision.count },
|
|
369
|
+
});
|
|
370
|
+
effects.push({
|
|
371
|
+
family: 'log',
|
|
372
|
+
kind: 'emit',
|
|
373
|
+
level: 'error',
|
|
374
|
+
message: 'circuit breaker tripped; halting retries',
|
|
375
|
+
fields: { reason: event.reason, consecutive_failures: decision.count },
|
|
376
|
+
issueId: event.issueId,
|
|
377
|
+
});
|
|
378
|
+
if (cfg.holdingState) {
|
|
379
|
+
effects.push(tripToHoldingEffect({
|
|
380
|
+
issueId: event.issueId,
|
|
381
|
+
holdingState: cfg.holdingState,
|
|
382
|
+
fromState: event.targetState,
|
|
383
|
+
fromRoot: event.trackerRootAtDispatch,
|
|
384
|
+
actor: event.resolvedActor,
|
|
385
|
+
reason: event.reason,
|
|
386
|
+
count: decision.count,
|
|
387
|
+
}));
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
// No holding state declared — REF retains the claim to halt the loop and
|
|
391
|
+
// logs loudly. We do NOT release the claim; the breaker is cleared but the
|
|
392
|
+
// issue stays claimed so the eligibility gate keeps blocking it this session.
|
|
393
|
+
effects.push({
|
|
394
|
+
family: 'log',
|
|
395
|
+
kind: 'emit',
|
|
396
|
+
level: 'error',
|
|
397
|
+
message: 'no holding state declared; retaining claim to halt the retry loop',
|
|
398
|
+
fields: { reason: event.reason },
|
|
399
|
+
issueId: event.issueId,
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
const result = {
|
|
403
|
+
dispatch: [],
|
|
404
|
+
effects,
|
|
405
|
+
claim: [],
|
|
406
|
+
// Release the claim only when the move succeeds; the shell decides that on
|
|
407
|
+
// the move's EffectResult. Core proposes the clear and lets the shell hold
|
|
408
|
+
// the claim if the move is declined (matches REF's success-gated release).
|
|
409
|
+
release: cfg.holdingState ? [event.issueId] : [],
|
|
410
|
+
breaker: { op: 'clear', issueId: event.issueId },
|
|
411
|
+
};
|
|
412
|
+
if (doneSinceReflect !== undefined)
|
|
413
|
+
result.doneSinceReflect = doneSinceReflect;
|
|
414
|
+
return result;
|
|
415
|
+
}
|
|
416
|
+
// kind === 'reset': clean exit. Clear any streak and schedule the continuation.
|
|
417
|
+
return buildRetryExit(event, cfg, { op: 'clear', issueId: event.issueId }, doneSinceReflect);
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Build the schedule-a-retry-and-exit result shared by the breaker's `continue`
|
|
421
|
+
* (set the streak) and `reset` (clear the streak) branches: compute the
|
|
422
|
+
* retry/continuation plan via `decideExitRetry`, emit the schedule + exit-log
|
|
423
|
+
* effects, and assemble the TickResult — parameterized by the `breaker` delta
|
|
424
|
+
* the branch needs. (Both branches enter with an empty effect list, so the
|
|
425
|
+
* result carries exactly the two effects emitted here.)
|
|
426
|
+
*/
|
|
427
|
+
function buildRetryExit(event, cfg, breaker, doneSinceReflect) {
|
|
428
|
+
const plan = decideExitRetry({
|
|
429
|
+
normal: event.normal,
|
|
430
|
+
reason: event.reason,
|
|
431
|
+
priorAttempt: event.priorAttempt,
|
|
432
|
+
targetState: event.targetState,
|
|
433
|
+
continuationDelayMs: CONTINUATION_DELAY_MS,
|
|
434
|
+
failureBaseMs: FAILURE_BASE_MS,
|
|
435
|
+
maxBackoffMs: cfg.maxRetryBackoffMs,
|
|
436
|
+
});
|
|
437
|
+
const effects = [
|
|
438
|
+
scheduleRetryEffect(event.issueId, event.identifier, plan),
|
|
439
|
+
exitLog(event, plan.attempt, plan.delayMs),
|
|
440
|
+
];
|
|
441
|
+
const result = { dispatch: [], effects, claim: [], release: [], breaker };
|
|
442
|
+
if (doneSinceReflect !== undefined)
|
|
443
|
+
result.doneSinceReflect = doneSinceReflect;
|
|
444
|
+
return result;
|
|
445
|
+
}
|
|
446
|
+
/** The worker-exit log line (REF: `onWorkerExit`'s normal/abnormal log). */
|
|
447
|
+
function exitLog(event, nextAttempt, delayMs) {
|
|
448
|
+
if (event.normal) {
|
|
449
|
+
return {
|
|
450
|
+
family: 'log',
|
|
451
|
+
kind: 'emit',
|
|
452
|
+
level: 'info',
|
|
453
|
+
message: 'worker exited (normal)',
|
|
454
|
+
fields: { reason: event.reason },
|
|
455
|
+
issueId: event.issueId,
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
return {
|
|
459
|
+
family: 'log',
|
|
460
|
+
kind: 'emit',
|
|
461
|
+
level: 'warn',
|
|
462
|
+
message: 'worker exited (abnormal)',
|
|
463
|
+
fields: { reason: event.reason, next_attempt: nextAttempt, delay_ms: delayMs },
|
|
464
|
+
issueId: event.issueId,
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Retry timer (REF: `onRetryTimer()` → eligibility re-check →
|
|
469
|
+
* `handleRetryIneligible()` / redispatch). The shell already deleted the retry
|
|
470
|
+
* entry and re-polled candidates. Find the issue in the fresh candidate set,
|
|
471
|
+
* re-check eligibility ignoring its OWN claim, and decide:
|
|
472
|
+
* - not in candidates → release the claim.
|
|
473
|
+
* - eligible → redispatch (carrying the retry's attempt number).
|
|
474
|
+
* - ineligible (no slot) → reschedule a failure backoff.
|
|
475
|
+
* - ineligible (other) → release the claim.
|
|
476
|
+
*/
|
|
477
|
+
function reduceRetryTimer(event, snapshot) {
|
|
478
|
+
const { cfg } = snapshot;
|
|
479
|
+
const issue = event.candidates.find((i) => i.id === event.issueId);
|
|
480
|
+
if (!issue) {
|
|
481
|
+
return {
|
|
482
|
+
dispatch: [],
|
|
483
|
+
effects: [
|
|
484
|
+
{
|
|
485
|
+
family: 'log',
|
|
486
|
+
kind: 'emit',
|
|
487
|
+
level: 'info',
|
|
488
|
+
message: 'retry releasing claim (not in candidates)',
|
|
489
|
+
fields: { issue_id: event.issueId, issue_identifier: event.identifier },
|
|
490
|
+
issueId: event.issueId,
|
|
491
|
+
},
|
|
492
|
+
],
|
|
493
|
+
claim: [],
|
|
494
|
+
release: [event.issueId],
|
|
495
|
+
breaker: { op: 'clear', issueId: event.issueId },
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
const { admission, availableSlots } = resolveAdmission(snapshot);
|
|
499
|
+
const slotSnapshot = buildSlotSnapshot(snapshot, admission.effectiveCap, snapshot.running, snapshot.retries);
|
|
500
|
+
// `availableSlots` already factors running + pending continuations; the slot
|
|
501
|
+
// snapshot's per-state gate reuses the same effective cap so the global and
|
|
502
|
+
// per-state checks agree (REF: `eligibilityReason(issue, /*ignoreOwnClaim*/ true)`).
|
|
503
|
+
void availableSlots;
|
|
504
|
+
const reason = computeEligibilityReason(issue, /*ignoreOwnClaim*/ true, {
|
|
505
|
+
active: cfg.activeStates,
|
|
506
|
+
terminal: cfg.terminalStates,
|
|
507
|
+
running: new Set(snapshot.running.map((r) => r.issue_id)),
|
|
508
|
+
claimed: snapshot.claimed,
|
|
509
|
+
perStateSlot: (state) => hasPerStateSlot(state, slotSnapshot, cfg.states),
|
|
510
|
+
});
|
|
511
|
+
if (reason === null) {
|
|
512
|
+
// Eligible — redispatch carrying the retry's attempt number.
|
|
513
|
+
return {
|
|
514
|
+
dispatch: [{ issue, attempt: event.attempt, trackerRoot: event.trackerRoot }],
|
|
515
|
+
effects: [],
|
|
516
|
+
claim: [issue.id],
|
|
517
|
+
release: [],
|
|
518
|
+
};
|
|
519
|
+
}
|
|
520
|
+
const action = decideRetryAfterIneligible({
|
|
521
|
+
reason,
|
|
522
|
+
priorAttempt: event.attempt,
|
|
523
|
+
targetState: issue.state,
|
|
524
|
+
failureBaseMs: FAILURE_BASE_MS,
|
|
525
|
+
maxBackoffMs: cfg.maxRetryBackoffMs,
|
|
526
|
+
});
|
|
527
|
+
if (action.kind === 'reschedule') {
|
|
528
|
+
return {
|
|
529
|
+
dispatch: [],
|
|
530
|
+
effects: [scheduleRetryEffect(issue.id, issue.identifier, action.plan)],
|
|
531
|
+
claim: [],
|
|
532
|
+
release: [],
|
|
533
|
+
};
|
|
534
|
+
}
|
|
535
|
+
// release
|
|
536
|
+
return {
|
|
537
|
+
dispatch: [],
|
|
538
|
+
effects: [
|
|
539
|
+
{
|
|
540
|
+
family: 'log',
|
|
541
|
+
kind: 'emit',
|
|
542
|
+
level: 'info',
|
|
543
|
+
message: 'retry releasing claim (ineligible)',
|
|
544
|
+
fields: { issue_id: issue.id, issue_identifier: issue.identifier, reason },
|
|
545
|
+
issueId: issue.id,
|
|
546
|
+
},
|
|
547
|
+
],
|
|
548
|
+
claim: [],
|
|
549
|
+
release: [issue.id],
|
|
550
|
+
breaker: { op: 'clear', issueId: issue.id },
|
|
551
|
+
};
|
|
552
|
+
}
|
|
553
|
+
//# sourceMappingURL=tick.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tick.js","sourceRoot":"","sources":["../../../../src/core/schedule/tick.ts"],"names":[],"mappings":"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"}
|