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,536 @@
|
|
|
1
|
+
// Integration tests for the composed RUNNER slice (the capstone wiring): drive
|
|
2
|
+
// `buildRunnerSlice(...).runWorker(plan, entry, cancel)` over FAKE workspace /
|
|
3
|
+
// dispatcher (vmClient) / acp / mcp / actions ports through a full happy-path
|
|
4
|
+
// attempt AND a transport-error retry path. The REAL pure core deciders are wired
|
|
5
|
+
// (the same bundles main.ts injects) so the assertions exercise the genuine
|
|
6
|
+
// produce/consume + bracket behaviour, not a mock of it.
|
|
7
|
+
//
|
|
8
|
+
// Asserts (per the task):
|
|
9
|
+
// • the §2a credential-mount guard is invoked BEFORE createVm.
|
|
10
|
+
// • MCP activate/deactivate bracket the attempt.
|
|
11
|
+
// • ACP dispatch context register/deregister bracket the attempt.
|
|
12
|
+
// • ACP token deltas fold into the running entry's totals (dashboard §2c).
|
|
13
|
+
// • a `run_in_vm` terminal action execs (uncached) on the live VM.
|
|
14
|
+
// • a transport_error attempt reports an ABNORMAL worker exit (retry path).
|
|
15
|
+
import { test } from 'node:test';
|
|
16
|
+
import assert from 'node:assert/strict';
|
|
17
|
+
import { buildRunnerSlice } from '../../src/shell/main-runner.js';
|
|
18
|
+
import { createEffectInterpreter } from '../../src/shell/effect-interpreter.js';
|
|
19
|
+
import { buildPlaceholderEntry } from '../../src/shell/main-adapters.js';
|
|
20
|
+
import { createAdapterRegistry } from '../../src/shell/adapter/adapter-registry.js';
|
|
21
|
+
// REAL pure core (the same fns main.ts injects).
|
|
22
|
+
import { resolveDispatchConfig } from '../../src/core/runner/dispatch-config.js';
|
|
23
|
+
import { applyRuntimeInjections } from '../../src/core/runner/injection.js';
|
|
24
|
+
import { buildVmPlan, byoProbeFailureMessage } from '../../src/core/runner/vm-plan.js';
|
|
25
|
+
import { buildByoProbeScript, miseInstallFailureMessage, hasProjectMiseConfig } from '../../src/core/runner/mise.js';
|
|
26
|
+
import { selectPromptKind, renderPrompt, buildSteeringReplyPrompt, continuationPrompt } from '../../src/core/runner/prompt.js';
|
|
27
|
+
import { classifyTurnOutcome, decideTurnContinuation, decideAttemptOutcome, decideRecovery } from '../../src/core/runner/turn.js';
|
|
28
|
+
import { activeStateNames, selectIssuesByIds } from '../../src/core/issue/parse.js';
|
|
29
|
+
import { resolveActorString } from '../../src/core/schedule/eligibility.js';
|
|
30
|
+
import { assertNoCredentialMounts } from '../../src/core/vm-guards.js';
|
|
31
|
+
import { guestMcpUrl } from '../../src/core/mcp/url.js';
|
|
32
|
+
import { resolveActionsForState } from '../../src/core/workflow/derive.js';
|
|
33
|
+
import { deriveActionContext } from '../../src/core/actions/context.js';
|
|
34
|
+
import { planActions } from '../../src/core/actions/plan.js';
|
|
35
|
+
import { foldPredicateProbe } from '../../src/core/actions/predicates.js';
|
|
36
|
+
import { beginAction, foldActionOutcome, foldRenderFailed, foldSkipped, foldPredicateError, summarizeRun } from '../../src/core/actions/run-fold.js';
|
|
37
|
+
import { describeHandoffFailure } from '../../src/core/git/result.js';
|
|
38
|
+
import { foldTokenUsage } from '../../src/core/schedule/token-fold.js';
|
|
39
|
+
import { makeServiceConfig, makeIssue } from '../helpers/fixtures.js';
|
|
40
|
+
function newRec() {
|
|
41
|
+
return { order: [], guardMounts: 0, createVmCalled: false, createVmImagePath: null, mcpActivated: [], mcpDeactivated: [], acpRegistered: [], acpDeregistered: [], vmExecs: [], launchEnvs: [], acpWsRegistered: [], acpCtxAccepted: [], workerExits: [], specsBuilt: [], fakeCredsPlaceholder: null, perVmHooks: [], steeringCancels: [], handoffMarked: [] };
|
|
42
|
+
}
|
|
43
|
+
// ─── fakes ──────────────────────────────────────────────────────────────────────
|
|
44
|
+
const noopLog = { emit: () => undefined, withIssue() { return noopLog; } };
|
|
45
|
+
const fixedClock = { now: () => 1_000, iso: () => '1970-01-01T00:00:01.000Z' };
|
|
46
|
+
const fixedRandom = { newToken: () => 'tok-fixed' };
|
|
47
|
+
function fakeRunlog() {
|
|
48
|
+
return { open: () => undefined, setAttempt: () => undefined, record: () => undefined, system: () => undefined, writeSummary: () => undefined, close: () => undefined };
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* A fake guest exec. Because the runner now brings the VM up through the REAL
|
|
52
|
+
* GondolinDispatcher (the single path — stage guest files → BYO probe → launch),
|
|
53
|
+
* the fake must answer the probe: when the command is the BYO probe (`/bin/sh -c`
|
|
54
|
+
* with a `command -v` chain), emit the two resolved absolute paths (node + adapter)
|
|
55
|
+
* on stdout so the probe parses them. Staging/launch execs just exit 0.
|
|
56
|
+
*/
|
|
57
|
+
function fakeVmExec(command) {
|
|
58
|
+
const isProbe = command[0] === '/bin/sh' && /command -v/.test(command[2] ?? '');
|
|
59
|
+
const stdoutText = isProbe ? '/usr/local/bin/node\n/usr/local/bin/claude\n' : '';
|
|
60
|
+
// A `run_in_vm` sentinel that exits non-zero, so a test can drive a FAILED phase-8
|
|
61
|
+
// handoff (issue 234) without a real git/gh push.
|
|
62
|
+
const code = command[0] === 'boom' ? 1 : 0;
|
|
63
|
+
return {
|
|
64
|
+
stdin: { write: () => undefined, end: () => undefined },
|
|
65
|
+
stdout: makeReadable(stdoutText),
|
|
66
|
+
stderr: makeReadable(''),
|
|
67
|
+
pid: 4242,
|
|
68
|
+
exit: Promise.resolve({ code, signal: null }),
|
|
69
|
+
kill: () => undefined,
|
|
70
|
+
};
|
|
71
|
+
function makeReadable(text) {
|
|
72
|
+
// Minimal Readable-ish: setEncoding + on('data') that synchronously replays the
|
|
73
|
+
// canned text (the dispatcher's tapStream reads it after exec.exit resolves).
|
|
74
|
+
const r = {
|
|
75
|
+
setEncoding: () => r,
|
|
76
|
+
on: (ev, cb) => {
|
|
77
|
+
if (ev === 'data' && text)
|
|
78
|
+
cb(text);
|
|
79
|
+
return r;
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
return r;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function fakeBaseVm(rec) {
|
|
86
|
+
return {
|
|
87
|
+
createVm: async (opts) => {
|
|
88
|
+
rec.order.push('createVm');
|
|
89
|
+
rec.createVmCalled = true;
|
|
90
|
+
rec.createVmImagePath = opts.imagePath;
|
|
91
|
+
return {
|
|
92
|
+
id: 'vm-1',
|
|
93
|
+
exec: (o) => {
|
|
94
|
+
rec.vmExecs.push(o.command);
|
|
95
|
+
// The launch exec is [<resolved-node>, <launcher-path>]; capture its env so the
|
|
96
|
+
// test can assert SYMPHONY_ACP_TOKEN == the WS-registered token.
|
|
97
|
+
const isLaunch = o.command.length === 2 && (o.command[0] ?? '').endsWith('/node');
|
|
98
|
+
if (isLaunch && o.env) {
|
|
99
|
+
rec.order.push('agent.launch');
|
|
100
|
+
rec.launchEnvs.push(o.env);
|
|
101
|
+
}
|
|
102
|
+
return fakeVmExec(o.command);
|
|
103
|
+
},
|
|
104
|
+
close: async () => { rec.order.push('vm.close'); },
|
|
105
|
+
};
|
|
106
|
+
},
|
|
107
|
+
listSessions: async () => [],
|
|
108
|
+
gc: async () => 0,
|
|
109
|
+
killAllVms: () => 0,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function fakeWorkspace(rec) {
|
|
113
|
+
return {
|
|
114
|
+
ensureFor: async () => ({ path: '/ws/issue-1', created: true }),
|
|
115
|
+
fetchBaseInWorkspace: async () => undefined,
|
|
116
|
+
remove: async () => undefined,
|
|
117
|
+
workspacePathFor: () => '/ws/issue-1',
|
|
118
|
+
inspect: async () => ({ exists: true, drifted: false, branch: null, baseSha: null, headSha: null }),
|
|
119
|
+
list: async () => [],
|
|
120
|
+
markHandoffPending: async (identifier) => { rec.handoffMarked.push(identifier); },
|
|
121
|
+
hasHandoffPendingMarker: async () => false,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* A fake ACP port. `outcome` controls the turn results: a single PromptOutcome repeats
|
|
126
|
+
* every call, or an ARRAY is consumed one-per-call (the LAST element then repeats) so a
|
|
127
|
+
* test can stage a transient-then-recovered sequence (issue 213). `opts.alive` backs the
|
|
128
|
+
* `sessionAlive` liveness probe the in-session recovery path consults (default: alive).
|
|
129
|
+
*/
|
|
130
|
+
function fakeAcp(rec, outcome, opts = {}) {
|
|
131
|
+
const queue = Array.isArray(outcome) ? [...outcome] : null;
|
|
132
|
+
return {
|
|
133
|
+
sessionNew: async () => ({ sessionId: 'sess-1' }),
|
|
134
|
+
runPrompt: async () => {
|
|
135
|
+
rec.order.push('runPrompt');
|
|
136
|
+
if (queue)
|
|
137
|
+
return queue.length > 1 ? queue.shift() : queue[0];
|
|
138
|
+
return outcome;
|
|
139
|
+
},
|
|
140
|
+
cancel: async () => undefined,
|
|
141
|
+
sessionAlive: () => opts.alive ?? true,
|
|
142
|
+
onEvent: () => undefined,
|
|
143
|
+
onTokenUsage: () => undefined,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
function fakeSubstrates(rec) {
|
|
147
|
+
// buildAdapterSpec mints a FRESH random-ish placeholder each call (a counter) —
|
|
148
|
+
// exactly like the real core's randomized placeholder. So if the slice called it
|
|
149
|
+
// twice in one dispatch (once for guest staging, once for egress), the guest +
|
|
150
|
+
// egress placeholders would DIVERGE; the one-spec memo keeps them identical.
|
|
151
|
+
let specSeq = 0;
|
|
152
|
+
const credential = {
|
|
153
|
+
port: {},
|
|
154
|
+
registry: { register: async () => { rec.order.push('secret.register'); return { deregister: () => rec.order.push('secret.deregister') }; } },
|
|
155
|
+
ticker: { start: () => undefined, stop: () => undefined },
|
|
156
|
+
refreshCredential: async (adapter) => { rec.order.push(`credential.refresh:${adapter}`); return true; },
|
|
157
|
+
buildPerVmHooks: (input) => {
|
|
158
|
+
rec.perVmHooks.push({ adapterId: input.adapterId, placeholder: input.placeholder, token: input.token });
|
|
159
|
+
return ({ httpHooks: {}, secretManager: {} });
|
|
160
|
+
},
|
|
161
|
+
buildAdapterSpec: (adapter) => {
|
|
162
|
+
const placeholder = `ph-${adapter}-${specSeq++}`;
|
|
163
|
+
rec.specsBuilt.push({ adapter, placeholder });
|
|
164
|
+
return { adapter, placeholder, secretName: `SECRET_${adapter}`, substitutionHosts: ['api.example.com'] };
|
|
165
|
+
},
|
|
166
|
+
buildHooksConfig: (specs) => ({ specs: [...specs], allowedHosts: ['api.example.com'] }),
|
|
167
|
+
buildFakeCreds: (fakeInput) => { rec.fakeCredsPlaceholder = fakeInput.placeholder; return { files: [], env: {} }; },
|
|
168
|
+
};
|
|
169
|
+
const acpContext = {
|
|
170
|
+
register: (vmId, ctx) => {
|
|
171
|
+
rec.order.push('acpCtx.register');
|
|
172
|
+
rec.acpRegistered.push(vmId);
|
|
173
|
+
// Capture the token threaded into the launch env so the test can assert it equals
|
|
174
|
+
// the WS-registration token (and that the WS registration happened before launch).
|
|
175
|
+
rec.acpCtxAccepted.push(ctx.accepted);
|
|
176
|
+
},
|
|
177
|
+
deregister: (vmId) => { rec.order.push('acpCtx.deregister'); rec.acpDeregistered.push(vmId); },
|
|
178
|
+
contextForVm: () => undefined,
|
|
179
|
+
};
|
|
180
|
+
// The host `/acp` WS registry: the runner registers it EARLY (before bring-up). Mint a
|
|
181
|
+
// deterministic token and record the registration so the test can prove the launch-env
|
|
182
|
+
// token == the registered token AND register-happens-before-launch.
|
|
183
|
+
const acpRegistry = {
|
|
184
|
+
register: (issueId, identifier) => {
|
|
185
|
+
rec.order.push('acpWs.register');
|
|
186
|
+
const token = `acp-tok-${issueId}`;
|
|
187
|
+
rec.acpWsRegistered.push({ issueId, identifier, token });
|
|
188
|
+
return { token, accepted: Promise.resolve({}), cancel: () => { rec.order.push('acpWs.cancel'); } };
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
// The runner now reaches MCP activate/deactivate through the central interpreter
|
|
192
|
+
// (the `mcp` effect family — see fakeInterpreter's mcpLifecycle below), NOT through
|
|
193
|
+
// this substrate. The substrate is narrowed to the steering awaiter the turn loop
|
|
194
|
+
// parks on, mirroring the production `Pick<McpRuntime, 'steering'>` surface.
|
|
195
|
+
const mcp = {
|
|
196
|
+
steering: { await: () => new Promise(() => { }), resolve: () => false, cancel: () => undefined },
|
|
197
|
+
};
|
|
198
|
+
return { credential, acpContext, acpRegistry, mcp };
|
|
199
|
+
}
|
|
200
|
+
/** Build the effect interpreter over fakes — only the families the actions runner
|
|
201
|
+
* drives need real behaviour; the rest are inert. The `steering` adapter records
|
|
202
|
+
* cancels so the teardown test can prove the worker unwind EMITS a steering.cancel
|
|
203
|
+
* Effect through THIS interpreter (issue 200), not a poke. The `mcpLifecycle` adapter
|
|
204
|
+
* records activate/deactivate so the bracket tests prove the runner reaches them
|
|
205
|
+
* through THIS interpreter (the `mcp` family — issue 201), not a poke. */
|
|
206
|
+
function fakeInterpreter(rec, vmHandles) {
|
|
207
|
+
const adapters = {
|
|
208
|
+
vmHandleFor: (id) => vmHandles.get(id),
|
|
209
|
+
log: noopLog,
|
|
210
|
+
runlog: fakeRunlog(),
|
|
211
|
+
timer: { sleep: async () => undefined, setTimer: () => undefined, clearTimer: () => undefined },
|
|
212
|
+
steering: { await: () => new Promise(() => { }), resolve: () => false, cancel: (id) => { rec.steeringCancels.push(id); } },
|
|
213
|
+
// The MCP worker-lifecycle seam the runner's `mcp` activate/deactivate effects route
|
|
214
|
+
// through (replaces the old direct substrate poke). Records the bracket so the
|
|
215
|
+
// happy-path / transport-error tests can assert activate-before-deactivate and that
|
|
216
|
+
// activate's minted bearer rides back on the EffectResult.
|
|
217
|
+
mcpLifecycle: {
|
|
218
|
+
activate: (entry) => { rec.order.push('mcp.activate'); rec.mcpActivated.push(entry.identifier); return 'mcp-bearer'; },
|
|
219
|
+
deactivate: (identifier) => { rec.order.push('mcp.deactivate'); rec.mcpDeactivated.push(identifier); },
|
|
220
|
+
},
|
|
221
|
+
};
|
|
222
|
+
return createEffectInterpreter(adapters);
|
|
223
|
+
}
|
|
224
|
+
// ─── config / workflow / issue fixtures ─────────────────────────────────────────
|
|
225
|
+
const RUN_IN_VM_STATE = 'Done';
|
|
226
|
+
function baseConfig(states) {
|
|
227
|
+
return makeServiceConfig({ states });
|
|
228
|
+
}
|
|
229
|
+
/** A config whose terminal `Done` state declares ONE run_in_vm action. */
|
|
230
|
+
function configWithRunInVm() {
|
|
231
|
+
return baseConfig({
|
|
232
|
+
Todo: { role: 'active' },
|
|
233
|
+
[RUN_IN_VM_STATE]: {
|
|
234
|
+
role: 'terminal',
|
|
235
|
+
actions: [{ kind: 'run_in_vm', name: 'smoke', cmd: ['echo', 'hi'] }],
|
|
236
|
+
},
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
/** A config whose terminal `Done` state declares a run_in_vm action that FAILS
|
|
240
|
+
* (exits non-zero, no `route_to`) — a non-routed phase-8 handoff failure (234).
|
|
241
|
+
* `on_error.retry.count: 0` so it aborts on the first attempt (no backoff sleeps). */
|
|
242
|
+
function configWithFailingAction() {
|
|
243
|
+
return baseConfig({
|
|
244
|
+
Todo: { role: 'active' },
|
|
245
|
+
[RUN_IN_VM_STATE]: {
|
|
246
|
+
role: 'terminal',
|
|
247
|
+
actions: [{ kind: 'run_in_vm', name: 'handoff', cmd: ['boom'], on_error: { retry: { count: 0, backoff_ms: 0 } } }],
|
|
248
|
+
},
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
const WORKFLOW = {
|
|
252
|
+
config: {},
|
|
253
|
+
prompt_templates: { Todo: 'Work on {{ issue.id }}.', Done: 'Work on {{ issue.id }}.' },
|
|
254
|
+
};
|
|
255
|
+
function fakeIssue(state) {
|
|
256
|
+
return makeIssue({ id: 'ISSUE-1', identifier: 'issue-1', title: 'Smoke', description: 'body', state });
|
|
257
|
+
}
|
|
258
|
+
// ─── slice construction over the fakes ──────────────────────────────────────────
|
|
259
|
+
function buildSlice(rec, cfg, outcome, opts = {}) {
|
|
260
|
+
const vmHandles = new Map();
|
|
261
|
+
const interpreter = fakeInterpreter(rec, vmHandles);
|
|
262
|
+
const recordingGuard = (mounts, opts) => {
|
|
263
|
+
rec.order.push('guard');
|
|
264
|
+
rec.guardMounts = mounts.length;
|
|
265
|
+
assertNoCredentialMounts(mounts, opts);
|
|
266
|
+
};
|
|
267
|
+
const core = {
|
|
268
|
+
loop: {
|
|
269
|
+
resolveDispatchConfig, applyRuntimeInjections, buildVmPlan, selectPromptKind,
|
|
270
|
+
classifyTurnOutcome, decideTurnContinuation, decideAttemptOutcome,
|
|
271
|
+
// Tiny base backoff (1ms) keeps the recovery sleeps near-instant in tests (issue 213).
|
|
272
|
+
decideRecovery: ({ recoveryAttempts }) => decideRecovery({ recoveryAttempts, maxRecoveryAttempts: 3, baseBackoffMs: 1 }),
|
|
273
|
+
renderInitialPrompt: renderPrompt,
|
|
274
|
+
renderSteeringPrompt: ({ question, context, reply }) => buildSteeringReplyPrompt(question, context, reply),
|
|
275
|
+
continuationPrompt, activeStateNames, selectIssuesByIds,
|
|
276
|
+
},
|
|
277
|
+
actions: {
|
|
278
|
+
resolveActionsForState, deriveActionContext, planActions, foldPredicateProbe, beginAction, foldActionOutcome,
|
|
279
|
+
foldRenderFailed, foldSkipped, foldPredicateError, summarizeRun, describeHandoffFailure,
|
|
280
|
+
},
|
|
281
|
+
resolveActorString, assertNoCredentialMounts: recordingGuard, resolveDispatchConfig, guestMcpUrl, byoProbeFailureMessage,
|
|
282
|
+
byoProbeScript: buildByoProbeScript, miseInstallFailureMessage, hasProjectMiseConfig,
|
|
283
|
+
};
|
|
284
|
+
const ports = {
|
|
285
|
+
interpreter, workspaces: fakeWorkspace(rec),
|
|
286
|
+
tracker: { loadAllIssues: async () => ({ raw: [], root: '/trk' }) },
|
|
287
|
+
baseVm: fakeBaseVm(rec), acp: fakeAcp(rec, outcome, { alive: opts.acpAlive }), adapters: createAdapterRegistry(),
|
|
288
|
+
credentialPort: {
|
|
289
|
+
readClaudeIdentity: async () => null,
|
|
290
|
+
readCodexIdentity: async () => null,
|
|
291
|
+
// probe() resolves the LIVE token the bring-up keys the codex route on; the
|
|
292
|
+
// recorder captures the placeholder threaded into the egress hooks below.
|
|
293
|
+
probe: async () => ({ accessToken: 'live-secret-token', expiresAtMs: null }),
|
|
294
|
+
},
|
|
295
|
+
runlog: fakeRunlog(), log: noopLog, clock: fixedClock, random: fixedRandom,
|
|
296
|
+
};
|
|
297
|
+
const slice = buildRunnerSlice({
|
|
298
|
+
core, ports, substrates: fakeSubstrates(rec),
|
|
299
|
+
getLiveCfg: () => cfg, getWorkflow: () => WORKFLOW,
|
|
300
|
+
boundMcpPort: () => 8787, resolvedNodeBin: () => 'node',
|
|
301
|
+
launcherSource: 'export const x = 1;', miseSystemConfigSource: '[tools]\nnode = "24"\n', readEnv: () => undefined,
|
|
302
|
+
resolveImageSelector: opts.resolveImageSelector,
|
|
303
|
+
onWorkerExit: (event) => { rec.order.push('onWorkerExit'); rec.workerExits.push(event); },
|
|
304
|
+
});
|
|
305
|
+
return { slice };
|
|
306
|
+
}
|
|
307
|
+
function runningEntry(state) {
|
|
308
|
+
return buildPlaceholderEntry({ issue: fakeIssue(state), attempt: null, trackerRoot: '/trk' }, () => undefined);
|
|
309
|
+
}
|
|
310
|
+
// ─── tests ──────────────────────────────────────────────────────────────────────
|
|
311
|
+
test('happy path: guard→createVm, MCP+ACP bracket, run_in_vm execs on the live VM', async () => {
|
|
312
|
+
const rec = newRec();
|
|
313
|
+
const cfg = configWithRunInVm();
|
|
314
|
+
// end_turn → the turn loop refreshes the issue; an empty tracker means the issue
|
|
315
|
+
// is "no longer present" → the loop breaks cleanly after one turn.
|
|
316
|
+
const { slice } = buildSlice(rec, cfg, { reason: 'end_turn', message: 'done' });
|
|
317
|
+
const entry = runningEntry(RUN_IN_VM_STATE);
|
|
318
|
+
await slice.runWorker({ issue: entry.issue, attempt: null, trackerRoot: '/trk' }, entry, { cancelled: false });
|
|
319
|
+
// 1. the mount guard ran BEFORE createVm.
|
|
320
|
+
const gi = rec.order.indexOf('guard');
|
|
321
|
+
const ci = rec.order.indexOf('createVm');
|
|
322
|
+
assert.ok(gi >= 0 && ci >= 0 && gi < ci, `guard(${gi}) must precede createVm(${ci})`);
|
|
323
|
+
// 2. MCP activate/deactivate bracket the attempt.
|
|
324
|
+
assert.deepEqual(rec.mcpActivated, ['issue-1']);
|
|
325
|
+
assert.deepEqual(rec.mcpDeactivated, ['issue-1']);
|
|
326
|
+
assert.ok(rec.order.indexOf('mcp.activate') < rec.order.indexOf('mcp.deactivate'));
|
|
327
|
+
// 3. ACP dispatch context register/deregister bracket the attempt.
|
|
328
|
+
assert.deepEqual(rec.acpRegistered, ['vm-1']);
|
|
329
|
+
assert.deepEqual(rec.acpDeregistered, ['vm-1']);
|
|
330
|
+
assert.ok(rec.order.indexOf('acpCtx.register') < rec.order.indexOf('acpCtx.deregister'));
|
|
331
|
+
// 4. the run_in_vm action exec'd its command on the live VM (uncached).
|
|
332
|
+
assert.ok(rec.vmExecs.some((cmd) => cmd.length === 2 && cmd[0] === 'echo' && cmd[1] === 'hi'), `run_in_vm cmd must exec on the VM; saw: ${JSON.stringify(rec.vmExecs)}`);
|
|
333
|
+
// 5. a clean worker exit was reported.
|
|
334
|
+
assert.equal(rec.workerExits.length, 1);
|
|
335
|
+
assert.equal(rec.workerExits[0].normal, true);
|
|
336
|
+
// 6. (234 no-regression) a SUCCESSFUL handoff drops NO handoff-pending marker, so the
|
|
337
|
+
// janitor reaps the terminal workspace exactly as today.
|
|
338
|
+
assert.deepEqual(rec.handoffMarked, []);
|
|
339
|
+
});
|
|
340
|
+
test('FAILED terminal handoff: the runner drops a handoff-pending marker so the janitor retains the workspace (234)', async () => {
|
|
341
|
+
const rec = newRec();
|
|
342
|
+
const cfg = configWithFailingAction();
|
|
343
|
+
const { slice } = buildSlice(rec, cfg, { reason: 'end_turn', message: 'done' });
|
|
344
|
+
const entry = runningEntry(RUN_IN_VM_STATE);
|
|
345
|
+
await slice.runWorker({ issue: entry.issue, attempt: null, trackerRoot: '/trk' }, entry, { cancelled: false });
|
|
346
|
+
// The failing run_in_vm exec'd (and aborted, not routed) → the runner marked the
|
|
347
|
+
// workspace handoff-pending for the dispatched identifier.
|
|
348
|
+
assert.ok(rec.vmExecs.some((cmd) => cmd[0] === 'boom'), 'the failing handoff action must have exec\'d');
|
|
349
|
+
assert.deepEqual(rec.handoffMarked, ['issue-1']);
|
|
350
|
+
});
|
|
351
|
+
test('dispatcher path: single spec threaded + live-token egress route + launcher staged (codex CRITICAL/HIGH)', async () => {
|
|
352
|
+
const rec = newRec();
|
|
353
|
+
const cfg = configWithRunInVm();
|
|
354
|
+
const { slice } = buildSlice(rec, cfg, { reason: 'end_turn', message: 'done' });
|
|
355
|
+
const entry = runningEntry(RUN_IN_VM_STATE);
|
|
356
|
+
await slice.runWorker({ issue: entry.issue, attempt: null, trackerRoot: '/trk' }, entry, { cancelled: false });
|
|
357
|
+
// (#4) ONE AdapterCredentialSpec per dispatch: buildAdapterSpec was called for ONE
|
|
358
|
+
// adapter and every call returned the SAME placeholder (the memo) — so the guest
|
|
359
|
+
// fake-creds placeholder and the egress-hooks placeholder cannot diverge.
|
|
360
|
+
const distinctPlaceholders = new Set(rec.specsBuilt.map((s) => s.placeholder));
|
|
361
|
+
assert.equal(distinctPlaceholders.size, 1, `exactly one placeholder threaded, saw: ${[...distinctPlaceholders].join(', ')}`);
|
|
362
|
+
const onePlaceholder = [...distinctPlaceholders][0];
|
|
363
|
+
assert.equal(rec.fakeCredsPlaceholder, onePlaceholder, 'guest staging uses the ONE spec placeholder');
|
|
364
|
+
assert.equal(rec.perVmHooks.length, 1, 'per-VM egress hooks built exactly once');
|
|
365
|
+
assert.equal(rec.perVmHooks[0].placeholder, onePlaceholder, 'egress substitution uses the SAME placeholder as the guest');
|
|
366
|
+
// (#2) the per-VM hooks received the LIVE TokenInfo (probe()) — NOT null — so the
|
|
367
|
+
// codex chatgpt-backend route hook is keyed on a real credential (was inert: token:null).
|
|
368
|
+
assert.ok(rec.perVmHooks[0].token !== null, 'per-VM hooks must receive the live token (codex route active)');
|
|
369
|
+
assert.deepEqual(rec.perVmHooks[0].token, { accessToken: 'live-secret-token', expiresAtMs: null });
|
|
370
|
+
// (#1) guest staging went through the REAL dispatcher: the launcher asset
|
|
371
|
+
// (/opt/symphony/vm-agent.mjs) is written into the guest via a base64-pipe write
|
|
372
|
+
// exec BEFORE the agent launches. Find the write-exec whose script targets it.
|
|
373
|
+
const guestAgentPath = cfg.gondolin.guest_agent_path;
|
|
374
|
+
const stagedLauncher = rec.vmExecs.some((cmd) => cmd[0] === '/bin/sh' && (cmd[2] ?? '').includes(guestAgentPath));
|
|
375
|
+
assert.ok(stagedLauncher, `the launcher ${guestAgentPath} must be staged into the guest (a write exec references it)`);
|
|
376
|
+
// And the in-VM agent was actually launched: the probe resolved node + launcher and
|
|
377
|
+
// an exec ran [<resolved-node>, <launcher-path>].
|
|
378
|
+
const launched = rec.vmExecs.some((cmd) => cmd.length === 2 && cmd[1] === guestAgentPath && cmd[0].endsWith('/node'));
|
|
379
|
+
assert.ok(launched, 'the in-VM agent process must be launched as [resolvedNode, launcherPath]');
|
|
380
|
+
});
|
|
381
|
+
test('convert→dispatch: oci_image alone boots the converted selector when gondolin.image is null (#206)', async () => {
|
|
382
|
+
// The blocker the reviewer flagged: with a workflow that sets ONLY `gondolin.oci_image`,
|
|
383
|
+
// reconcile converts + caches the asset and resolves its runtime selector; dispatch must
|
|
384
|
+
// boot THAT selector, not the empty `imagePath` the old `cfg.gondolin.image ?? ''` left.
|
|
385
|
+
const rec = newRec();
|
|
386
|
+
const cfg = makeServiceConfig({
|
|
387
|
+
states: {
|
|
388
|
+
Todo: { role: 'active' },
|
|
389
|
+
[RUN_IN_VM_STATE]: { role: 'terminal', actions: [{ kind: 'run_in_vm', name: 'smoke', cmd: ['echo', 'hi'] }] },
|
|
390
|
+
},
|
|
391
|
+
gondolin: { image: null, oci_image: 'ghcr.io/acme/agent:1' },
|
|
392
|
+
});
|
|
393
|
+
const { slice } = buildSlice(rec, cfg, { reason: 'end_turn', message: 'done' }, {
|
|
394
|
+
resolveImageSelector: () => 'converted-build-id',
|
|
395
|
+
});
|
|
396
|
+
const entry = runningEntry(RUN_IN_VM_STATE);
|
|
397
|
+
await slice.runWorker({ issue: entry.issue, attempt: null, trackerRoot: '/trk' }, entry, { cancelled: false });
|
|
398
|
+
assert.equal(rec.createVmCalled, true, 'the VM was brought up');
|
|
399
|
+
assert.equal(rec.createVmImagePath, 'converted-build-id', 'dispatch booted the auto-converted selector, not an empty imagePath');
|
|
400
|
+
});
|
|
401
|
+
test('convert→dispatch: the `gondolin.image` escape hatch still wins over a converted selector (#206)', async () => {
|
|
402
|
+
// When both are set the pre-converted escape hatch boots; the converted selector is ignored.
|
|
403
|
+
const rec = newRec();
|
|
404
|
+
const cfg = makeServiceConfig({
|
|
405
|
+
states: {
|
|
406
|
+
Todo: { role: 'active' },
|
|
407
|
+
[RUN_IN_VM_STATE]: { role: 'terminal', actions: [{ kind: 'run_in_vm', name: 'smoke', cmd: ['echo', 'hi'] }] },
|
|
408
|
+
},
|
|
409
|
+
gondolin: { image: 'sym:pinned', oci_image: 'ghcr.io/acme/agent:1' },
|
|
410
|
+
});
|
|
411
|
+
const { slice } = buildSlice(rec, cfg, { reason: 'end_turn', message: 'done' }, {
|
|
412
|
+
resolveImageSelector: () => 'converted-build-id',
|
|
413
|
+
});
|
|
414
|
+
const entry = runningEntry(RUN_IN_VM_STATE);
|
|
415
|
+
await slice.runWorker({ issue: entry.issue, attempt: null, trackerRoot: '/trk' }, entry, { cancelled: false });
|
|
416
|
+
assert.equal(rec.createVmImagePath, 'sym:pinned', 'the escape hatch wins when both are set');
|
|
417
|
+
});
|
|
418
|
+
test('ACP token unified: launch-env SYMPHONY_ACP_TOKEN == the WS-registered token, registered BEFORE launch', async () => {
|
|
419
|
+
// The reproducible dogfood failure (issue 167): the runner minted TWO independent ACP
|
|
420
|
+
// tokens — one in the launch env, a DIFFERENT one in sessionNew's late registration —
|
|
421
|
+
// so the guest's dial-back (presenting the launch-env token) never matched the pending
|
|
422
|
+
// registration and was rejected. The fix: ONE token, registered with the AcpWsRegistry
|
|
423
|
+
// BEFORE the agent launches, threaded into the launch env, and CONSUMED (not re-minted)
|
|
424
|
+
// by sessionNew. This test pins both halves: same token + register-before-launch.
|
|
425
|
+
const rec = newRec();
|
|
426
|
+
const cfg = configWithRunInVm();
|
|
427
|
+
const { slice } = buildSlice(rec, cfg, { reason: 'end_turn', message: 'done' });
|
|
428
|
+
const entry = runningEntry(RUN_IN_VM_STATE);
|
|
429
|
+
await slice.runWorker({ issue: entry.issue, attempt: null, trackerRoot: '/trk' }, entry, { cancelled: false });
|
|
430
|
+
// 1. exactly ONE WS registration was made on the host /acp registry.
|
|
431
|
+
assert.equal(rec.acpWsRegistered.length, 1, 'one WS registration per dispatch');
|
|
432
|
+
const registeredToken = rec.acpWsRegistered[0].token;
|
|
433
|
+
assert.equal(rec.acpWsRegistered[0].issueId, entry.issue_id);
|
|
434
|
+
// 2. the agent launched with SYMPHONY_ACP_TOKEN == the registered token (ONE token).
|
|
435
|
+
assert.equal(rec.launchEnvs.length, 1, 'the agent was launched exactly once');
|
|
436
|
+
assert.equal(rec.launchEnvs[0].SYMPHONY_ACP_TOKEN, registeredToken, 'the launch-env bearer the guest dials back with MUST equal the registered token');
|
|
437
|
+
// 3. the WS registration happened BEFORE the agent launch (so the dial-back, which
|
|
438
|
+
// fires immediately on launch, finds a pending registration).
|
|
439
|
+
const regIdx = rec.order.indexOf('acpWs.register');
|
|
440
|
+
const launchIdx = rec.order.indexOf('agent.launch');
|
|
441
|
+
assert.ok(regIdx >= 0 && launchIdx >= 0, 'both register + launch were recorded');
|
|
442
|
+
assert.ok(regIdx < launchIdx, `WS register(${regIdx}) must precede agent launch(${launchIdx})`);
|
|
443
|
+
// 4. the ACP dispatch context carried the registration's dial-back stream (so
|
|
444
|
+
// sessionNew consumes it rather than registering a second token).
|
|
445
|
+
assert.equal(rec.acpCtxAccepted.length, 1, 'the dispatch context carried the dial-back stream');
|
|
446
|
+
});
|
|
447
|
+
test('token deltas fold into the running entry totals (§2c dashboard)', () => {
|
|
448
|
+
// The orchestrator folds ABSOLUTE ACP usage onto the entry via core foldTokenUsage.
|
|
449
|
+
const entry = runningEntry('Todo');
|
|
450
|
+
const apply = (usage) => {
|
|
451
|
+
const d = foldTokenUsage({ last_reported_input: entry.last_reported_input_tokens, last_reported_output: entry.last_reported_output_tokens, last_reported_total: entry.last_reported_total_tokens }, usage);
|
|
452
|
+
entry.input_tokens = usage.input_tokens;
|
|
453
|
+
entry.output_tokens = usage.output_tokens;
|
|
454
|
+
entry.total_tokens = usage.total_tokens;
|
|
455
|
+
entry.last_reported_input_tokens = d.last_reported_input;
|
|
456
|
+
entry.last_reported_output_tokens = d.last_reported_output;
|
|
457
|
+
entry.last_reported_total_tokens = d.last_reported_total;
|
|
458
|
+
};
|
|
459
|
+
apply({ input_tokens: 10, output_tokens: 4, total_tokens: 14 });
|
|
460
|
+
assert.deepEqual([entry.input_tokens, entry.output_tokens, entry.total_tokens], [10, 4, 14]);
|
|
461
|
+
// A re-report of the SAME absolute total is de-duplicated (no double count).
|
|
462
|
+
apply({ input_tokens: 10, output_tokens: 4, total_tokens: 14 });
|
|
463
|
+
assert.deepEqual([entry.input_tokens, entry.output_tokens, entry.total_tokens], [10, 4, 14]);
|
|
464
|
+
// A higher absolute total advances the visible counters.
|
|
465
|
+
apply({ input_tokens: 25, output_tokens: 9, total_tokens: 34 });
|
|
466
|
+
assert.deepEqual([entry.input_tokens, entry.output_tokens, entry.total_tokens], [25, 9, 34]);
|
|
467
|
+
});
|
|
468
|
+
test('transport-error path, DEAD session: no recovery → abnormal worker exit + MCP/ACP deregistered', async () => {
|
|
469
|
+
const rec = newRec();
|
|
470
|
+
const cfg = configWithRunInVm();
|
|
471
|
+
// A transport_error is RECOVERABLE (issue 213) — but only when the host↔guest ACP link
|
|
472
|
+
// is still alive. Here the WS itself died (sessionAlive=false), so in-session recovery
|
|
473
|
+
// is skipped: the turn falls straight through to the abnormal-exit / re-dispatch path.
|
|
474
|
+
const { slice } = buildSlice(rec, cfg, { reason: 'transport_error', message: 'ECONNRESET' }, { acpAlive: false });
|
|
475
|
+
const entry = runningEntry(RUN_IN_VM_STATE);
|
|
476
|
+
await slice.runWorker({ issue: entry.issue, attempt: 1, trackerRoot: '/trk' }, entry, { cancelled: false });
|
|
477
|
+
// The session was dead → NO re-prompt: exactly one runPrompt before falling back.
|
|
478
|
+
assert.equal(rec.order.filter((o) => o === 'runPrompt').length, 1, 'dead session → no recovery re-prompt');
|
|
479
|
+
assert.equal(rec.workerExits.length, 1);
|
|
480
|
+
assert.equal(rec.workerExits[0].normal, false, 'dead-session transport_error → abnormal exit (retry path)');
|
|
481
|
+
assert.match(rec.workerExits[0].reason, /transport|ECONNRESET/i);
|
|
482
|
+
// The bracket still unwinds: MCP deactivated + ACP context deregistered.
|
|
483
|
+
assert.deepEqual(rec.mcpDeactivated, ['issue-1']);
|
|
484
|
+
assert.deepEqual(rec.acpDeregistered, ['vm-1']);
|
|
485
|
+
// The VM was torn down on the failure path.
|
|
486
|
+
assert.ok(rec.order.includes('vm.close'));
|
|
487
|
+
});
|
|
488
|
+
test('in-session recovery: a 529 overload on a LIVE session re-prompts the SAME session and recovers', async () => {
|
|
489
|
+
const rec = newRec();
|
|
490
|
+
const cfg = configWithRunInVm();
|
|
491
|
+
// First turn is a transient overload refusal; the session is alive → recover. The
|
|
492
|
+
// re-prompt then ends cleanly (end_turn). The whole VM attempt is NOT discarded.
|
|
493
|
+
const { slice } = buildSlice(rec, cfg, [
|
|
494
|
+
{ reason: 'refusal', message: 'API Error: Repeated 529 Overloaded errors. The API is at capacity' },
|
|
495
|
+
{ reason: 'end_turn', message: 'done' },
|
|
496
|
+
]);
|
|
497
|
+
const entry = runningEntry(RUN_IN_VM_STATE);
|
|
498
|
+
await slice.runWorker({ issue: entry.issue, attempt: 1, trackerRoot: '/trk' }, entry, { cancelled: false });
|
|
499
|
+
// Re-prompted the SAME session exactly once (two runPrompt calls), NO teardown between.
|
|
500
|
+
assert.equal(rec.order.filter((o) => o === 'runPrompt').length, 2, 'one recovery re-prompt on the same session');
|
|
501
|
+
assert.equal(rec.order.filter((o) => o === 'vm.close').length, 1, 'VM torn down only ONCE, at the end (no mid-recovery teardown)');
|
|
502
|
+
// The recovered turn counts as ONE turn — the re-prompt did NOT increment max_turns.
|
|
503
|
+
assert.equal(entry.turn_count, 1, 'recovery re-prompt is free (no max_turns increment)');
|
|
504
|
+
// A clean worker exit (recovered), NOT an abnormal re-dispatch.
|
|
505
|
+
assert.equal(rec.workerExits.length, 1);
|
|
506
|
+
assert.equal(rec.workerExits[0].normal, true, 'recovered turn → clean worker exit (no full VM re-dispatch)');
|
|
507
|
+
});
|
|
508
|
+
test('in-session recovery: budget exhausted on a persistently-overloaded LIVE session falls back to ending the attempt', async () => {
|
|
509
|
+
const rec = newRec();
|
|
510
|
+
const cfg = configWithRunInVm();
|
|
511
|
+
// Every prompt overloads and the session stays alive: recovery re-prompts up to the
|
|
512
|
+
// budget (3), then gives up → abnormal exit (the orchestrator re-dispatches as a last resort).
|
|
513
|
+
const { slice } = buildSlice(rec, cfg, { reason: 'refusal', message: 'overloaded: at capacity' });
|
|
514
|
+
const entry = runningEntry(RUN_IN_VM_STATE);
|
|
515
|
+
await slice.runWorker({ issue: entry.issue, attempt: 1, trackerRoot: '/trk' }, entry, { cancelled: false });
|
|
516
|
+
// initial prompt + 3 recovery re-prompts (the budget) = 4 calls, then give_up.
|
|
517
|
+
assert.equal(rec.order.filter((o) => o === 'runPrompt').length, 4, 'initial + 3 recovery re-prompts, then give up');
|
|
518
|
+
assert.equal(rec.workerExits.length, 1);
|
|
519
|
+
assert.equal(rec.workerExits[0].normal, false, 'exhausted recovery → abnormal exit (fall back to re-dispatch)');
|
|
520
|
+
assert.match(rec.workerExits[0].reason, /overloaded|capacity|refusal/i);
|
|
521
|
+
});
|
|
522
|
+
test('teardown emits a steering.cancel Effect through the central interpreter', async () => {
|
|
523
|
+
// The worker unwind must break a parked steering wait so a cancelled/finished attempt
|
|
524
|
+
// exits cleanly. Issue 200 routes that cancel through the SAME central interpreter the
|
|
525
|
+
// HTTP reply path uses (deps.performSteering → ports.interpreter.execute), never poking
|
|
526
|
+
// the awaiter — fakeInterpreter's `steering` family records the cancel it performs.
|
|
527
|
+
const rec = newRec();
|
|
528
|
+
const cfg = configWithRunInVm();
|
|
529
|
+
const { slice } = buildSlice(rec, cfg, { reason: 'end_turn', message: 'done' });
|
|
530
|
+
const entry = runningEntry(RUN_IN_VM_STATE);
|
|
531
|
+
await slice.runWorker({ issue: entry.issue, attempt: null, trackerRoot: '/trk' }, entry, { cancelled: false });
|
|
532
|
+
// The teardown emitted exactly one steering.cancel Effect, for THIS attempt's identifier
|
|
533
|
+
// (fails if the unwind stops issuing it, or pokes the awaiter off the interpreter seam).
|
|
534
|
+
assert.deepEqual(rec.steeringCancels, ['issue-1'], 'teardown must emit steering.cancel for the attempt');
|
|
535
|
+
});
|
|
536
|
+
//# sourceMappingURL=runner-slice.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner-slice.test.js","sourceRoot":"","sources":["../../../tests/shell/runner-slice.test.ts"],"names":[],"mappings":"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"}
|