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,163 @@
|
|
|
1
|
+
// FCIS rewrite — shell adapter: GitHub `gh` CLI port (kind: adapter).
|
|
2
|
+
//
|
|
3
|
+
// Implements {@link GhPort} from src/types/ports. The effect-interpreter
|
|
4
|
+
// delegates every GhEffect variant here: pr_view / pr_list_for_branch use the
|
|
5
|
+
// typed read methods below; the mutating verbs (pr_create / pr_arm_auto_merge /
|
|
6
|
+
// pr_update_branch / pr_close) go through the generic `run(argv, cwd)` — the
|
|
7
|
+
// interpreter builds the argv and folds the RunResultData, so this port stays a
|
|
8
|
+
// thin shell-out and error-on-nonzero is the interpreter's call for those. The
|
|
9
|
+
// read methods still throw on nonzero/non-JSON to keep the original
|
|
10
|
+
// PR-autopilot fail-loud contract. (pr_delete_remote_branch is routed to the
|
|
11
|
+
// git port, so it is NOT a GhPort method.)
|
|
12
|
+
//
|
|
13
|
+
// Ported from `src/reconciler/pr-adapters.ts` (GhCliPrApi), which captured an
|
|
14
|
+
// `owner/repo` slug at construction and emitted `--repo <slug>`. That slug is
|
|
15
|
+
// restored here as a live `repoSlug` accessor: `withRepo` appends `--repo
|
|
16
|
+
// <slug>` to autopilot `gh pr` verbs (view/list/merge/close/update-branch) so
|
|
17
|
+
// they target the configured `workspace.github_repo` even when the host cwd's
|
|
18
|
+
// `origin` differs from it (the out-of-repo control-dir layout) or is absent.
|
|
19
|
+
// `pr create` is exempt — it runs in the per-issue workspace whose `origin` is
|
|
20
|
+
// already the target — and a null slug (local-only) infers from cwd as before.
|
|
21
|
+
// PR-autopilot gh output (json blobs) can be large; keep the historical 1 MiB
|
|
22
|
+
// clamp rather than the runner default.
|
|
23
|
+
const GH_MAX_BYTES = 1_048_576;
|
|
24
|
+
/** Default production GhPort backed by the `gh` CLI on the host. */
|
|
25
|
+
export class GhCliPort {
|
|
26
|
+
proc;
|
|
27
|
+
opts;
|
|
28
|
+
constructor(proc, opts = {}) {
|
|
29
|
+
this.proc = proc;
|
|
30
|
+
this.opts = opts;
|
|
31
|
+
}
|
|
32
|
+
/** `gh <argv>` with the historical 1 MiB clamp + configured timeout. */
|
|
33
|
+
sh(argv, cwd) {
|
|
34
|
+
return this.proc.run(['gh', ...this.withRepo(argv)], {
|
|
35
|
+
cwd,
|
|
36
|
+
timeoutMs: this.opts.timeoutMs,
|
|
37
|
+
maxBytes: GH_MAX_BYTES,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Append `--repo <slug>` to autopilot `gh pr` verbs so lookups/merges/closes
|
|
42
|
+
* hit the configured `workspace.github_repo` regardless of the cwd's `origin`.
|
|
43
|
+
* `pr create` is exempt (it runs in the workspace whose origin is the target),
|
|
44
|
+
* and a null slug (local-only) leaves argv untouched so gh infers from cwd.
|
|
45
|
+
*/
|
|
46
|
+
withRepo(argv) {
|
|
47
|
+
const slug = this.opts.repoSlug?.();
|
|
48
|
+
if (!slug || argv[0] !== 'pr' || argv[1] === 'create')
|
|
49
|
+
return argv;
|
|
50
|
+
return [...argv, '--repo', slug];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Generic gh shell-out. The interpreter passes the full argv (without the
|
|
54
|
+
* leading `gh`) and folds the returned RunResultData itself, so this method
|
|
55
|
+
* does NOT throw on nonzero — it surfaces the raw result (matching the
|
|
56
|
+
* effect-interpreter's `{ kind: 'run_result' }` contract for the mutating
|
|
57
|
+
* verbs: pr_create / pr_arm_auto_merge / pr_update_branch / pr_close).
|
|
58
|
+
*/
|
|
59
|
+
run(argv, cwd) {
|
|
60
|
+
return this.sh(argv, cwd);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* `gh pr view <n> --json ...`. Returns null only when the process itself
|
|
64
|
+
* could not run; a successful-but-empty/garbled payload still yields a
|
|
65
|
+
* best-effort PrView (the original threw on nonzero/non-JSON — preserved).
|
|
66
|
+
*/
|
|
67
|
+
async prView(cwd, prNumber) {
|
|
68
|
+
const res = await this.sh([
|
|
69
|
+
'pr',
|
|
70
|
+
'view',
|
|
71
|
+
String(prNumber),
|
|
72
|
+
'--json',
|
|
73
|
+
'number,url,state,mergeable,mergeStateStatus,baseRefName,baseRefOid,headRefName,headRefOid,reviewDecision,autoMergeRequest',
|
|
74
|
+
], cwd);
|
|
75
|
+
if (!res.ran)
|
|
76
|
+
return null;
|
|
77
|
+
if (res.exit_code !== 0) {
|
|
78
|
+
throw new Error(`gh pr view ${prNumber} failed (exit ${res.exit_code}): ${res.stderr.trim()}`);
|
|
79
|
+
}
|
|
80
|
+
return parseGhPrView(prNumber, res.stdout);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* `gh pr list --head <branch> --state all`. `--state all` so a merged /
|
|
84
|
+
* closed PR is still returned — once we have the number, cleanup drives via
|
|
85
|
+
* `view` (works against any state). An OPEN-only filter would make a
|
|
86
|
+
* post-merge or operator-closed PR invisible to the autopilot.
|
|
87
|
+
*/
|
|
88
|
+
async prListForBranch(cwd, branch) {
|
|
89
|
+
const res = await this.sh(['pr', 'list', '--head', branch, '--state', 'all', '--json', 'number,url', '--limit', '1'], cwd);
|
|
90
|
+
if (!res.ran)
|
|
91
|
+
return null;
|
|
92
|
+
if (res.exit_code !== 0) {
|
|
93
|
+
throw new Error(`gh pr list failed (exit ${res.exit_code}): ${res.stderr.trim()}`);
|
|
94
|
+
}
|
|
95
|
+
let parsed;
|
|
96
|
+
try {
|
|
97
|
+
parsed = JSON.parse(res.stdout);
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
throw new Error(`gh pr list returned non-JSON: ${err.message}`);
|
|
101
|
+
}
|
|
102
|
+
if (!Array.isArray(parsed) || parsed.length === 0)
|
|
103
|
+
return null;
|
|
104
|
+
const first = parsed[0];
|
|
105
|
+
if (typeof first.number !== 'number' || typeof first.url !== 'string')
|
|
106
|
+
return null;
|
|
107
|
+
return { number: first.number, url: first.url };
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// ─── parsers (pure; lifted verbatim from the original adapter) ───────────────
|
|
111
|
+
function parseGhPrView(prNumber, stdout) {
|
|
112
|
+
let parsed;
|
|
113
|
+
try {
|
|
114
|
+
parsed = JSON.parse(stdout);
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
throw new Error(`gh pr view returned non-JSON: ${err.message}`);
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
number: typeof parsed.number === 'number' ? parsed.number : prNumber,
|
|
121
|
+
url: typeof parsed.url === 'string' ? parsed.url : '',
|
|
122
|
+
state: normalizeState(parsed.state),
|
|
123
|
+
mergeable: normalizeMergeable(parsed.mergeable),
|
|
124
|
+
merge_state_status: normalizeMergeStateStatus(parsed.mergeStateStatus),
|
|
125
|
+
base_ref_name: typeof parsed.baseRefName === 'string' ? parsed.baseRefName : '',
|
|
126
|
+
base_ref_oid: typeof parsed.baseRefOid === 'string' ? parsed.baseRefOid : null,
|
|
127
|
+
head_ref_name: typeof parsed.headRefName === 'string' ? parsed.headRefName : '',
|
|
128
|
+
head_ref_oid: typeof parsed.headRefOid === 'string' ? parsed.headRefOid : '',
|
|
129
|
+
review_decision: normalizeReviewDecision(parsed.reviewDecision),
|
|
130
|
+
auto_merge_armed: parsed.autoMergeRequest !== null &&
|
|
131
|
+
parsed.autoMergeRequest !== undefined &&
|
|
132
|
+
typeof parsed.autoMergeRequest === 'object',
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
function normalizeState(raw) {
|
|
136
|
+
if (raw === 'OPEN' || raw === 'CLOSED' || raw === 'MERGED')
|
|
137
|
+
return raw;
|
|
138
|
+
return 'OPEN';
|
|
139
|
+
}
|
|
140
|
+
function normalizeMergeable(raw) {
|
|
141
|
+
if (raw === 'MERGEABLE' || raw === 'CONFLICTING' || raw === 'UNKNOWN')
|
|
142
|
+
return raw;
|
|
143
|
+
return 'UNKNOWN';
|
|
144
|
+
}
|
|
145
|
+
function normalizeMergeStateStatus(raw) {
|
|
146
|
+
if (raw === 'BEHIND' ||
|
|
147
|
+
raw === 'BLOCKED' ||
|
|
148
|
+
raw === 'CLEAN' ||
|
|
149
|
+
raw === 'DIRTY' ||
|
|
150
|
+
raw === 'DRAFT' ||
|
|
151
|
+
raw === 'HAS_HOOKS' ||
|
|
152
|
+
raw === 'UNKNOWN' ||
|
|
153
|
+
raw === 'UNSTABLE') {
|
|
154
|
+
return raw;
|
|
155
|
+
}
|
|
156
|
+
return 'UNKNOWN';
|
|
157
|
+
}
|
|
158
|
+
function normalizeReviewDecision(raw) {
|
|
159
|
+
if (raw === 'APPROVED' || raw === 'CHANGES_REQUESTED' || raw === 'REVIEW_REQUIRED')
|
|
160
|
+
return raw;
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=gh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gh.js","sourceRoot":"","sources":["../../../../src/shell/interp/gh.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// FCIS rewrite — git effect interpreter (kind: adapter).
|
|
2
|
+
//
|
|
3
|
+
// The {@link GitPort} (`run(argv, cwd)`) is the single git seam: the central
|
|
4
|
+
// effect-interpreter encodes each GitEffect's argv inline and drains it here.
|
|
5
|
+
// This adapter owns ONLY the spawn clamp + verb→child-process mapping; the
|
|
6
|
+
// per-effect argv (push -u, force-with-lease, fetch --no-tags, clone --local,
|
|
7
|
+
// merge --no-ff …) and the non-fast-forward fold live in the central router.
|
|
8
|
+
//
|
|
9
|
+
// Fidelity anchor (read-only reference, NOT modified): src/actions/executor.ts
|
|
10
|
+
// runCommand → `defaultCommandTimeoutMs` (5 min) so a wedged remote can't hang
|
|
11
|
+
// the loop forever.
|
|
12
|
+
//
|
|
13
|
+
// Shell rule: imports from src/types/** ONLY. The concrete child-process spawn
|
|
14
|
+
// is injected as a `ProcessRunner` port by the composition root, so spawn
|
|
15
|
+
// lifecycle (capture, kill-on-timeout) lives once in the runner adapter.
|
|
16
|
+
// Per-git-command wall-clock clamp. Mirrors the executor's
|
|
17
|
+
// `defaultCommandTimeoutMs` (5 min).
|
|
18
|
+
const DEFAULT_GIT_TIMEOUT_MS = 300_000;
|
|
19
|
+
/** Build the git adapter: a thin `git <argv>` runner clamped to `timeoutMs`. */
|
|
20
|
+
export function createGitAdapter(deps) {
|
|
21
|
+
const timeoutMs = deps.defaultTimeoutMs ?? DEFAULT_GIT_TIMEOUT_MS;
|
|
22
|
+
return {
|
|
23
|
+
run(argv, cwd) {
|
|
24
|
+
return deps.process.run(['git', ...argv], { cwd, timeoutMs });
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../../../src/shell/interp/git.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,EAAE;AACF,6EAA6E;AAC7E,8EAA8E;AAC9E,2EAA2E;AAC3E,8EAA8E;AAC9E,6EAA6E;AAC7E,EAAE;AACF,+EAA+E;AAC/E,+EAA+E;AAC/E,oBAAoB;AACpB,EAAE;AACF,+EAA+E;AAC/E,0EAA0E;AAC1E,yEAAyE;AAKzE,2DAA2D;AAC3D,qCAAqC;AACrC,MAAM,sBAAsB,GAAG,OAAO,CAAC;AASvC,gFAAgF;AAChF,MAAM,UAAU,gBAAgB,CAAC,IAAoB;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,IAAI,sBAAsB,CAAC;IAClE,OAAO;QACL,GAAG,CAAC,IAAc,EAAE,GAAW;YAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;QAChE,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
// FCIS rewrite — shell adapter: structured logger / LogEffect interpreter (kind: adapter).
|
|
2
|
+
//
|
|
3
|
+
// Interprets the LogEffect family by implementing the {@link LogSink} port from
|
|
4
|
+
// src/types/ports. The central effect-interpreter holds a `LogSink` (`deps.log`)
|
|
5
|
+
// and, for `{ family: 'log', kind: 'emit' }`, calls:
|
|
6
|
+
// (effect.issueId ? sink.withIssue(effect.issueId) : sink)
|
|
7
|
+
// .emit(effect.level, effect.message, effect.fields)
|
|
8
|
+
// So this module is the runtime behind that seam: leveled structured logging,
|
|
9
|
+
// per-issue context binding (`withIssue`), an optional persistent file sink, and
|
|
10
|
+
// a console mirror controlled by `--verbose`.
|
|
11
|
+
//
|
|
12
|
+
// Ported faithfully from the original `src/logging.ts` (read-only reference). The
|
|
13
|
+
// only shape change vs. the original is that the per-issue helper is exposed as a
|
|
14
|
+
// `LogSink.withIssue()` method (returning another `LogSink`) instead of the free
|
|
15
|
+
// `withIssue(ctx)` function, matching the port. The structured `key=value` wire
|
|
16
|
+
// format, the level gate (SYMPHONY_LOG_LEVEL), the file-sink lifecycle, and the
|
|
17
|
+
// console-routing rules (issue 118) are preserved verbatim.
|
|
18
|
+
//
|
|
19
|
+
// Sink failures never crash the orchestrator (SPEC §9.2): file-sink open/write
|
|
20
|
+
// failures emit a single stderr warning then degrade silently; stderr writes are
|
|
21
|
+
// wrapped in try/catch.
|
|
22
|
+
import { closeSync, createWriteStream, mkdirSync, openSync } from 'node:fs';
|
|
23
|
+
import path from 'node:path';
|
|
24
|
+
const ENV_LEVEL = (process.env.SYMPHONY_LOG_LEVEL ?? 'info').toLowerCase();
|
|
25
|
+
const LEVEL_RANK = { debug: 10, info: 20, warn: 30, error: 40 };
|
|
26
|
+
// Process-global sink state. The original logging module was a singleton; the
|
|
27
|
+
// rewrite keeps a single module-level sink (one orchestrator process == one log
|
|
28
|
+
// stream) so the file-sink lifecycle (`setLogFile`/`closeLogFile`) and the
|
|
29
|
+
// `--verbose` toggle remain process-wide, exactly as the composition root drives
|
|
30
|
+
// them. `buildLogSink()` hands out lightweight LogSink views over this state.
|
|
31
|
+
let fileSink = null;
|
|
32
|
+
let fileSinkBroken = false;
|
|
33
|
+
let fileSinkPath = null;
|
|
34
|
+
let verbose = false;
|
|
35
|
+
/** Render a field value, quoting (JSON) anything containing whitespace/quote/equals. */
|
|
36
|
+
function quote(v) {
|
|
37
|
+
if (v === null || v === undefined)
|
|
38
|
+
return '';
|
|
39
|
+
const s = String(v);
|
|
40
|
+
return /[\s"=]/.test(s) ? JSON.stringify(s) : s;
|
|
41
|
+
}
|
|
42
|
+
function format(level, msg, fields) {
|
|
43
|
+
const ts = new Date().toISOString();
|
|
44
|
+
const parts = [`ts=${ts}`, `level=${level}`, `msg=${quote(msg)}`];
|
|
45
|
+
for (const [k, v] of Object.entries(fields)) {
|
|
46
|
+
if (v === undefined)
|
|
47
|
+
continue;
|
|
48
|
+
parts.push(`${k}=${quote(v)}`);
|
|
49
|
+
}
|
|
50
|
+
return parts.join(' ');
|
|
51
|
+
}
|
|
52
|
+
function writeFileSink(line) {
|
|
53
|
+
if (!fileSink || fileSinkBroken)
|
|
54
|
+
return;
|
|
55
|
+
try {
|
|
56
|
+
fileSink.write(line);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// Stream errors land in the 'error' handler attached in setLogFile; a
|
|
60
|
+
// synchronous throw is unusual but not impossible — swallow it.
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function emit(level, msg, fields = {}) {
|
|
64
|
+
if (LEVEL_RANK[level] < LEVEL_RANK[ENV_LEVEL])
|
|
65
|
+
return;
|
|
66
|
+
const line = format(level, msg, fields) + '\n';
|
|
67
|
+
// Route to stderr only when no working file sink is capturing the line (so a
|
|
68
|
+
// no-log-file setup loses nothing) or when --verbose was requested
|
|
69
|
+
// (interactive debugging). A broken sink counts as inactive so its dropped
|
|
70
|
+
// writes fall back to stderr rather than vanishing. See issue 118.
|
|
71
|
+
const fileSinkActive = fileSink !== null && !fileSinkBroken;
|
|
72
|
+
if (verbose || !fileSinkActive) {
|
|
73
|
+
try {
|
|
74
|
+
process.stderr.write(line);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// SPEC §9.2: a failed sink must not crash the service.
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
writeFileSink(line);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Force structured logs back onto stderr even when a file sink is active. The
|
|
84
|
+
* `--verbose` / `--foreground` flag flips this on for interactive debugging; the
|
|
85
|
+
* default (false) keeps the console clean by routing logs to the file only
|
|
86
|
+
* whenever a sink is configured. Idempotent.
|
|
87
|
+
*/
|
|
88
|
+
export function setLogVerbose(on) {
|
|
89
|
+
verbose = on;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Enable (or replace) the persistent file sink. Pass `null`/`''` to close any
|
|
93
|
+
* currently-open file sink and revert to stderr-only.
|
|
94
|
+
*
|
|
95
|
+
* The directory is created on demand and the file opened synchronously via
|
|
96
|
+
* `openSync` so failures (EISDIR, EACCES, ENOTDIR, ENOSPC) surface here, before
|
|
97
|
+
* the sink is installed. Open failures do not throw: a single stderr warning is
|
|
98
|
+
* emitted and the function returns `null`. After a successful open, runtime
|
|
99
|
+
* stream errors flip the sink into a broken state (dropping further writes
|
|
100
|
+
* silently) so a mid-run disk-full condition cannot recursively spam stderr.
|
|
101
|
+
*
|
|
102
|
+
* Idempotent for repeated calls with the same path. Returns the absolute path
|
|
103
|
+
* actually opened, or `null` when the sink was disabled or failed to open.
|
|
104
|
+
*/
|
|
105
|
+
export function setLogFile(filePath) {
|
|
106
|
+
if (filePath === null || filePath === '') {
|
|
107
|
+
void closeLogFile();
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
const abs = path.resolve(filePath);
|
|
111
|
+
if (fileSink && fileSinkPath === abs && !fileSinkBroken)
|
|
112
|
+
return abs;
|
|
113
|
+
void closeLogFile();
|
|
114
|
+
const stream = openFileStream(abs);
|
|
115
|
+
if (!stream) {
|
|
116
|
+
fileSink = null;
|
|
117
|
+
fileSinkPath = null;
|
|
118
|
+
fileSinkBroken = false;
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
stream.on('error', (err) => {
|
|
122
|
+
if (!fileSinkBroken) {
|
|
123
|
+
fileSinkBroken = true;
|
|
124
|
+
warnToStderr('log file sink write failed', abs, err);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
fileSink = stream;
|
|
128
|
+
fileSinkPath = abs;
|
|
129
|
+
fileSinkBroken = false;
|
|
130
|
+
return abs;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Create the directory and open the append stream for `abs`. The file is opened
|
|
134
|
+
* synchronously via `openSync` so EISDIR / EACCES / ENOTDIR surface here instead
|
|
135
|
+
* of arriving asynchronously on the stream's 'error' event after setLogFile()
|
|
136
|
+
* has already returned the path; the fd is handed to createWriteStream for reuse
|
|
137
|
+
* (its close still releases the fd). On any failure a single stderr warning is
|
|
138
|
+
* emitted and `null` returned, leaving the caller to reset sink state.
|
|
139
|
+
*/
|
|
140
|
+
function openFileStream(abs) {
|
|
141
|
+
let fd;
|
|
142
|
+
try {
|
|
143
|
+
mkdirSync(path.dirname(abs), { recursive: true });
|
|
144
|
+
fd = openSync(abs, 'a');
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
warnToStderr('log file sink open failed', abs, err);
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
try {
|
|
151
|
+
return createWriteStream(abs, { encoding: 'utf8', fd, autoClose: true });
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
try {
|
|
155
|
+
closeSync(fd);
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// fd already gone; nothing to do.
|
|
159
|
+
}
|
|
160
|
+
warnToStderr('log file sink open failed', abs, err);
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function warnToStderr(msg, abs, err) {
|
|
165
|
+
try {
|
|
166
|
+
process.stderr.write(format('warn', msg, { path: abs, error: err.message }) + '\n');
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
// stderr itself failed; nothing left to do.
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Close the file sink and await the underlying stream's flush. Safe to call
|
|
174
|
+
* repeatedly. Callers that intend to `process.exit()` immediately afterwards
|
|
175
|
+
* MUST await this — `process.exit` does not drain pending WriteStream writes, so
|
|
176
|
+
* the final log lines (including the shutdown banner) would otherwise be lost.
|
|
177
|
+
*/
|
|
178
|
+
export async function closeLogFile() {
|
|
179
|
+
const sink = fileSink;
|
|
180
|
+
fileSink = null;
|
|
181
|
+
fileSinkPath = null;
|
|
182
|
+
fileSinkBroken = false;
|
|
183
|
+
if (!sink)
|
|
184
|
+
return;
|
|
185
|
+
await new Promise((resolve) => {
|
|
186
|
+
try {
|
|
187
|
+
sink.end(() => resolve());
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
resolve();
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Build a {@link LogSink} view over the process-global structured logger. The
|
|
196
|
+
* effect-interpreter holds one of these as `deps.log` and drains LogEffects
|
|
197
|
+
* through it; `withIssue(issueId)` returns a child sink that prefixes every
|
|
198
|
+
* record with `issue_id`, mirroring the original `withIssue({ issue_id })`.
|
|
199
|
+
*/
|
|
200
|
+
export function buildLogSink() {
|
|
201
|
+
return makeSink({});
|
|
202
|
+
}
|
|
203
|
+
function makeSink(ctx) {
|
|
204
|
+
return {
|
|
205
|
+
emit(level, message, fields) {
|
|
206
|
+
emit(level, message, { ...ctx, ...(fields ?? {}) });
|
|
207
|
+
},
|
|
208
|
+
withIssue(issueId) {
|
|
209
|
+
return makeSink({ ...ctx, issue_id: issueId });
|
|
210
|
+
},
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../../../src/shell/interp/log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
// FCIS rewrite — process effect interpreter (kind: adapter).
|
|
2
|
+
//
|
|
3
|
+
// Owns the host-side child-process seam in two ports:
|
|
4
|
+
//
|
|
5
|
+
// • ProcessRunner.run(argv, opts) — the single owner of spawn lifecycle for
|
|
6
|
+
// every host shell-out (git, gh, credential refreshers). Faithful port of
|
|
7
|
+
// the original `runProcess` (src/util/process.ts): pipe both streams,
|
|
8
|
+
// accumulate with a per-stream max-bytes clamp, optional timeout that
|
|
9
|
+
// SIGKILLs on overrun, optional cwd/env override, swallow pipe-level read
|
|
10
|
+
// errors on kill, guard against double-settle. Resolves, never rejects.
|
|
11
|
+
//
|
|
12
|
+
// • ProcessSignalPort.kill/probe/selfPid — the reaper's host-signal seam.
|
|
13
|
+
// Ports the signal semantics of src/agent/vm-process-registry.ts: a
|
|
14
|
+
// best-effort `process.kill(pid, signal)` that classifies ESRCH (already
|
|
15
|
+
// gone) and EPERM (no permission) instead of throwing, plus a signal-0
|
|
16
|
+
// liveness `probe`. `selfPid()` injects the host pid so core deciders never
|
|
17
|
+
// read `process.pid` directly.
|
|
18
|
+
//
|
|
19
|
+
// Fidelity anchors (read-only reference, NOT modified):
|
|
20
|
+
// • src/util/process.ts:runProcess — spawn/capture/clamp/timeout lifecycle.
|
|
21
|
+
// • src/agent/vm-process-registry.ts — kill/probe signal classification.
|
|
22
|
+
//
|
|
23
|
+
// Shell rule: imports from src/types/** ONLY. The concrete `node:child_process`
|
|
24
|
+
// spawn lives here (this IS the adapter); decisions (which pids are safe to
|
|
25
|
+
// kill, escalation order) live in core and arrive as effects.
|
|
26
|
+
import { spawn } from 'node:child_process';
|
|
27
|
+
/**
|
|
28
|
+
* Default per-stream byte clamp. Mirrors the dominant value across the wrappers
|
|
29
|
+
* the original `runProcess` replaced (workspace / agent / actions all used
|
|
30
|
+
* 65_536). Callers needing a larger buffer (a big `git`/`gh` JSON payload) pass
|
|
31
|
+
* `maxBytes` explicitly.
|
|
32
|
+
*/
|
|
33
|
+
const DEFAULT_MAX_BYTES = 65_536;
|
|
34
|
+
/**
|
|
35
|
+
* Run a process and capture its output. Single source of truth for spawn
|
|
36
|
+
* lifecycle: timeout, capture, env-merge and clamp all live here. Resolves,
|
|
37
|
+
* never rejects — failure surfaces in the result:
|
|
38
|
+
* • spawn error (ENOENT/EACCES): exit_code = null, stderr carries the OS msg.
|
|
39
|
+
* • timeout: timed_out = true, signal = 'SIGKILL'.
|
|
40
|
+
* • non-zero exit: exit_code carries the code.
|
|
41
|
+
*
|
|
42
|
+
* `argv[0]` is the binary; `argv[1..]` the args (the ProcessRunner port passes
|
|
43
|
+
* the full argv, unlike the original's `(bin, args)` split).
|
|
44
|
+
*/
|
|
45
|
+
function runProcess(argv, opts = {}) {
|
|
46
|
+
const [bin, ...args] = argv;
|
|
47
|
+
const maxBytes = opts.maxBytes ?? DEFAULT_MAX_BYTES;
|
|
48
|
+
// Merge caller env on top of the host env (matches the original's
|
|
49
|
+
// `{ ...process.env, ...opts.env }`); ambient env when no override.
|
|
50
|
+
const env = opts.env ? { ...process.env, ...opts.env } : process.env;
|
|
51
|
+
return new Promise((resolve) => {
|
|
52
|
+
// A missing binary surfaces as the child's 'error' event below; guard the
|
|
53
|
+
// pathological empty-argv case so `spawn(undefined)` can't throw synchronously.
|
|
54
|
+
if (bin === undefined) {
|
|
55
|
+
resolve({ ran: true, exit_code: null, signal: null, timed_out: false, stdout: '', stderr: 'empty argv' });
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const child = spawn(bin, args, {
|
|
59
|
+
cwd: opts.cwd,
|
|
60
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
61
|
+
env: env,
|
|
62
|
+
});
|
|
63
|
+
let stdout = '';
|
|
64
|
+
let stderr = '';
|
|
65
|
+
let timedOut = false;
|
|
66
|
+
let settled = false;
|
|
67
|
+
child.stdout?.on('data', (b) => {
|
|
68
|
+
stdout += b.toString('utf8');
|
|
69
|
+
if (stdout.length > maxBytes)
|
|
70
|
+
stdout = stdout.slice(0, maxBytes);
|
|
71
|
+
});
|
|
72
|
+
child.stderr?.on('data', (b) => {
|
|
73
|
+
stderr += b.toString('utf8');
|
|
74
|
+
if (stderr.length > maxBytes)
|
|
75
|
+
stderr = stderr.slice(0, maxBytes);
|
|
76
|
+
});
|
|
77
|
+
// SIGKILLing the child aborts any in-flight pipe read; libuv emits an
|
|
78
|
+
// 'error' (AbortError/ECONNRESET/EPIPE) on stdout/stderr. The authoritative
|
|
79
|
+
// outcome already arrives via 'close'/'error' on the child, so this is not
|
|
80
|
+
// actionable — but an EventEmitter with no 'error' listener rethrows it as
|
|
81
|
+
// an uncaughtException that crashes the host. Swallow it (issue 143).
|
|
82
|
+
const ignorePipeError = () => {
|
|
83
|
+
/* read aborted on kill — outcome comes from 'close' */
|
|
84
|
+
};
|
|
85
|
+
child.stdout?.on('error', ignorePipeError);
|
|
86
|
+
child.stderr?.on('error', ignorePipeError);
|
|
87
|
+
const timer = opts.timeoutMs && opts.timeoutMs > 0
|
|
88
|
+
? setTimeout(() => {
|
|
89
|
+
timedOut = true;
|
|
90
|
+
child.kill('SIGKILL');
|
|
91
|
+
}, opts.timeoutMs)
|
|
92
|
+
: null;
|
|
93
|
+
const finish = (r) => {
|
|
94
|
+
// Spawn failures emit both 'error' and 'close' for the same child (Node
|
|
95
|
+
// synthesizes a 'close' with code=-2 after an ENOENT 'error'). Both route
|
|
96
|
+
// here; guard against double-settling so the promise resolves once.
|
|
97
|
+
if (settled)
|
|
98
|
+
return;
|
|
99
|
+
settled = true;
|
|
100
|
+
if (timer)
|
|
101
|
+
clearTimeout(timer);
|
|
102
|
+
resolve(r);
|
|
103
|
+
};
|
|
104
|
+
child.on('error', (err) => {
|
|
105
|
+
const errStderr = `${stderr}${stderr.length > 0 ? '\n' : ''}${err.message}`;
|
|
106
|
+
finish({
|
|
107
|
+
ran: true,
|
|
108
|
+
exit_code: null,
|
|
109
|
+
signal: null,
|
|
110
|
+
timed_out: timedOut,
|
|
111
|
+
stdout,
|
|
112
|
+
stderr: errStderr.length > maxBytes ? errStderr.slice(0, maxBytes) : errStderr,
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
child.on('close', (code, signal) => {
|
|
116
|
+
finish({ ran: true, exit_code: code, signal: signal ?? null, timed_out: timedOut, stdout, stderr });
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Build the generic process runner (backs the git/gh/credential interpreters
|
|
122
|
+
* and the `process.run` effect). Thin wrapper over {@link runProcess}; all
|
|
123
|
+
* lifecycle quirks live in that function so subprocess-management changes stay
|
|
124
|
+
* one-file edits.
|
|
125
|
+
*/
|
|
126
|
+
export function createProcessRunner() {
|
|
127
|
+
return {
|
|
128
|
+
run(argv, opts) {
|
|
129
|
+
return runProcess(argv, opts ?? {});
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/** Node surfaces these as `err.code` on a failed `process.kill`. */
|
|
134
|
+
function classifyKillError(err) {
|
|
135
|
+
const code = err?.code;
|
|
136
|
+
return { gone: code === 'ESRCH', noPerm: code === 'EPERM' };
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Build the reaper's host-signal port. Mirrors vm-process-registry's
|
|
140
|
+
* best-effort signalling: a successful `kill` is `{ ok: true }`; ESRCH (the pid
|
|
141
|
+
* is already gone) and EPERM (no permission) are classified, not thrown, so a
|
|
142
|
+
* dead-or-foreign pid never wedges the SIGTERM→grace→SIGKILL escalation.
|
|
143
|
+
*
|
|
144
|
+
* `probe` is the signal-0 liveness check (kill with signal 0 sends nothing but
|
|
145
|
+
* still validates the pid exists and is signallable): no error ⇒ alive; ESRCH ⇒
|
|
146
|
+
* dead; EPERM ⇒ alive-but-unsignallable (reported via `noPerm`).
|
|
147
|
+
*/
|
|
148
|
+
export function createProcessSignalPort(deps = {}) {
|
|
149
|
+
const kill = deps.kill ?? ((pid, signal) => process.kill(pid, signal));
|
|
150
|
+
const ownPid = deps.selfPid ?? process.pid;
|
|
151
|
+
return {
|
|
152
|
+
kill(pid, signal) {
|
|
153
|
+
try {
|
|
154
|
+
kill(pid, signal);
|
|
155
|
+
return { ok: true, gone: false, noPerm: false };
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
const { gone, noPerm } = classifyKillError(err);
|
|
159
|
+
return { ok: false, gone, noPerm };
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
probe(pid) {
|
|
163
|
+
try {
|
|
164
|
+
kill(pid, 0);
|
|
165
|
+
return { alive: true, noPerm: false };
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
const { gone, noPerm } = classifyKillError(err);
|
|
169
|
+
// EPERM means the process exists but we can't signal it ⇒ still alive.
|
|
170
|
+
return { alive: noPerm, noPerm };
|
|
171
|
+
}
|
|
172
|
+
},
|
|
173
|
+
selfPid() {
|
|
174
|
+
return ownPid;
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../../../src/shell/interp/process.ts"],"names":[],"mappings":"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"}
|