smol-symphony 0.2.0 → 0.3.1
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/bin/symphony.js +22 -786
- package/dist/bin/symphony.js.map +1 -1
- package/dist/core/actions/context.js +109 -0
- package/dist/core/actions/context.js.map +1 -0
- package/dist/{actions/parsing.js → core/actions/parse.js} +33 -114
- package/dist/core/actions/parse.js.map +1 -0
- package/dist/core/actions/plan.js +197 -0
- package/dist/core/actions/plan.js.map +1 -0
- package/dist/core/actions/predicates.js +111 -0
- package/dist/core/actions/predicates.js.map +1 -0
- package/dist/core/actions/run-fold.js +248 -0
- package/dist/core/actions/run-fold.js.map +1 -0
- package/dist/core/actions/template.js +118 -0
- package/dist/core/actions/template.js.map +1 -0
- package/dist/core/cli/args.js +116 -0
- package/dist/core/cli/args.js.map +1 -0
- package/dist/core/coerce.js +75 -0
- package/dist/core/coerce.js.map +1 -0
- package/dist/core/credential/account-id.js +20 -0
- package/dist/core/credential/account-id.js.map +1 -0
- package/dist/core/credential/adapter-config.js +136 -0
- package/dist/core/credential/adapter-config.js.map +1 -0
- package/dist/core/credential/availability.js +98 -0
- package/dist/core/credential/availability.js.map +1 -0
- package/dist/core/credential/extract.js +228 -0
- package/dist/core/credential/extract.js.map +1 -0
- package/dist/core/credential/fake-creds.js +171 -0
- package/dist/core/credential/fake-creds.js.map +1 -0
- package/dist/core/credential/identity.js +125 -0
- package/dist/core/credential/identity.js.map +1 -0
- package/dist/core/credential/shape.js +230 -0
- package/dist/core/credential/shape.js.map +1 -0
- package/dist/core/credential/strings.js +15 -0
- package/dist/core/credential/strings.js.map +1 -0
- package/dist/core/doctor/checks.js +303 -0
- package/dist/core/doctor/checks.js.map +1 -0
- package/dist/core/git/result.js +107 -0
- package/dist/core/git/result.js.map +1 -0
- package/dist/core/http/decisions.js +225 -0
- package/dist/core/http/decisions.js.map +1 -0
- package/dist/{http.js → core/http/render.js} +472 -738
- package/dist/core/http/render.js.map +1 -0
- package/dist/{http-handlers.js → core/http/routes.js} +52 -87
- package/dist/core/http/routes.js.map +1 -0
- package/dist/core/http/views.js +181 -0
- package/dist/core/http/views.js.map +1 -0
- package/dist/core/image/managed-image.js +95 -0
- package/dist/core/image/managed-image.js.map +1 -0
- package/dist/core/issue/file.js +149 -0
- package/dist/core/issue/file.js.map +1 -0
- package/dist/core/issue/parse.js +210 -0
- package/dist/core/issue/parse.js.map +1 -0
- package/dist/core/mcp/dispatch.js +239 -0
- package/dist/core/mcp/dispatch.js.map +1 -0
- package/dist/core/mcp/post-move.js +92 -0
- package/dist/core/mcp/post-move.js.map +1 -0
- package/dist/core/mcp/protocol.js +293 -0
- package/dist/core/mcp/protocol.js.map +1 -0
- package/dist/core/mcp/url.js +162 -0
- package/dist/core/mcp/url.js.map +1 -0
- package/dist/core/path.js +63 -0
- package/dist/core/path.js.map +1 -0
- package/dist/core/reconcile/image-decide.js +48 -0
- package/dist/core/reconcile/image-decide.js.map +1 -0
- package/dist/core/reconcile/ledger.js +142 -0
- package/dist/core/reconcile/ledger.js.map +1 -0
- package/dist/core/reconcile/pr-classify.js +62 -0
- package/dist/core/reconcile/pr-classify.js.map +1 -0
- package/dist/{reconciler → core/reconcile}/pr-decide.js +25 -12
- package/dist/core/reconcile/pr-decide.js.map +1 -0
- package/dist/core/reconcile/pr-loop.js +161 -0
- package/dist/core/reconcile/pr-loop.js.map +1 -0
- package/dist/core/reconcile/pr-notes.js +35 -0
- package/dist/core/reconcile/pr-notes.js.map +1 -0
- package/dist/core/reconcile/vm-decide.js +70 -0
- package/dist/core/reconcile/vm-decide.js.map +1 -0
- package/dist/core/reconcile/vm-reap.js +207 -0
- package/dist/core/reconcile/vm-reap.js.map +1 -0
- package/dist/core/reconcile/workspace-decide.js +162 -0
- package/dist/core/reconcile/workspace-decide.js.map +1 -0
- package/dist/core/runlog/summary.js +231 -0
- package/dist/core/runlog/summary.js.map +1 -0
- package/dist/core/runner/dispatch-config.js +95 -0
- package/dist/core/runner/dispatch-config.js.map +1 -0
- package/dist/core/runner/injection.js +61 -0
- package/dist/core/runner/injection.js.map +1 -0
- package/dist/core/runner/mise.js +210 -0
- package/dist/core/runner/mise.js.map +1 -0
- package/dist/core/runner/prompt.js +720 -0
- package/dist/core/runner/prompt.js.map +1 -0
- package/dist/core/runner/turn.js +242 -0
- package/dist/core/runner/turn.js.map +1 -0
- package/dist/core/runner/vm-plan.js +390 -0
- package/dist/core/runner/vm-plan.js.map +1 -0
- package/dist/core/schedule/admission.js +123 -0
- package/dist/core/schedule/admission.js.map +1 -0
- package/dist/core/schedule/circuit-breaker.js +111 -0
- package/dist/core/schedule/circuit-breaker.js.map +1 -0
- package/dist/core/schedule/eligibility.js +83 -0
- package/dist/core/schedule/eligibility.js.map +1 -0
- package/dist/core/schedule/reconcile-issue.js +82 -0
- package/dist/core/schedule/reconcile-issue.js.map +1 -0
- package/dist/core/schedule/retry.js +96 -0
- package/dist/core/schedule/retry.js.map +1 -0
- package/dist/core/schedule/sleep-cycle.js +133 -0
- package/dist/core/schedule/sleep-cycle.js.map +1 -0
- package/dist/core/schedule/slots.js +124 -0
- package/dist/core/schedule/slots.js.map +1 -0
- package/dist/core/schedule/tick.js +553 -0
- package/dist/core/schedule/tick.js.map +1 -0
- package/dist/core/schedule/token-fold.js +181 -0
- package/dist/core/schedule/token-fold.js.map +1 -0
- package/dist/core/state-resolve.js +86 -0
- package/dist/core/state-resolve.js.map +1 -0
- package/dist/core/vm-guards.js +278 -0
- package/dist/core/vm-guards.js.map +1 -0
- package/dist/core/workflow/derive.js +107 -0
- package/dist/core/workflow/derive.js.map +1 -0
- package/dist/core/workflow/parse.js +687 -0
- package/dist/core/workflow/parse.js.map +1 -0
- package/dist/core/workflow/prompt-probe.js +78 -0
- package/dist/core/workflow/prompt-probe.js.map +1 -0
- package/dist/core/workflow/validate.js +189 -0
- package/dist/core/workflow/validate.js.map +1 -0
- package/dist/core/workspace-key.js +19 -0
- package/dist/core/workspace-key.js.map +1 -0
- package/dist/shell/actions-runner.js +356 -0
- package/dist/shell/actions-runner.js.map +1 -0
- package/dist/shell/adapter/adapter-registry.js +45 -0
- package/dist/shell/adapter/adapter-registry.js.map +1 -0
- package/dist/shell/adapter/clock-random.js +96 -0
- package/dist/shell/adapter/clock-random.js.map +1 -0
- package/dist/shell/adapter/gondolin-dispatch-helpers.js +158 -0
- package/dist/shell/adapter/gondolin-dispatch-helpers.js.map +1 -0
- package/dist/shell/adapter/gondolin-dispatch.js +385 -0
- package/dist/shell/adapter/gondolin-dispatch.js.map +1 -0
- package/dist/shell/adapter/gondolin-image-converter.js +233 -0
- package/dist/shell/adapter/gondolin-image-converter.js.map +1 -0
- package/dist/shell/adapter/gondolin-image-fetch.js +180 -0
- package/dist/shell/adapter/gondolin-image-fetch.js.map +1 -0
- package/dist/shell/adapter/launcher-asset.js +57 -0
- package/dist/shell/adapter/launcher-asset.js.map +1 -0
- package/dist/shell/adapter/mise-config-asset.js +65 -0
- package/dist/shell/adapter/mise-config-asset.js.map +1 -0
- package/dist/shell/adapter/workflow-loader.js +304 -0
- package/dist/shell/adapter/workflow-loader.js.map +1 -0
- package/dist/shell/cli/doctor.js +268 -0
- package/dist/shell/cli/doctor.js.map +1 -0
- package/dist/shell/effect-interpreter-families.js +314 -0
- package/dist/shell/effect-interpreter-families.js.map +1 -0
- package/dist/shell/effect-interpreter.js +29 -0
- package/dist/shell/effect-interpreter.js.map +1 -0
- package/dist/shell/interp/acp-frame.js +137 -0
- package/dist/shell/interp/acp-frame.js.map +1 -0
- package/dist/shell/interp/acp-ws-conn.js +320 -0
- package/dist/shell/interp/acp-ws-conn.js.map +1 -0
- package/dist/shell/interp/acp-ws-frames.js +159 -0
- package/dist/shell/interp/acp-ws-frames.js.map +1 -0
- package/dist/shell/interp/acp-ws.js +197 -0
- package/dist/shell/interp/acp-ws.js.map +1 -0
- package/dist/shell/interp/acp.js +319 -0
- package/dist/shell/interp/acp.js.map +1 -0
- package/dist/shell/interp/credential-defaults.js +128 -0
- package/dist/shell/interp/credential-defaults.js.map +1 -0
- package/dist/shell/interp/credential-hooks.js +149 -0
- package/dist/shell/interp/credential-hooks.js.map +1 -0
- package/dist/shell/interp/credential-registry.js +226 -0
- package/dist/shell/interp/credential-registry.js.map +1 -0
- package/dist/shell/interp/credential.js +103 -0
- package/dist/shell/interp/credential.js.map +1 -0
- package/dist/shell/interp/gh.js +163 -0
- package/dist/shell/interp/gh.js.map +1 -0
- package/dist/shell/interp/git.js +28 -0
- package/dist/shell/interp/git.js.map +1 -0
- package/dist/shell/interp/log.js +213 -0
- package/dist/shell/interp/log.js.map +1 -0
- package/dist/shell/interp/process.js +178 -0
- package/dist/shell/interp/process.js.map +1 -0
- package/dist/shell/interp/runlog.js +193 -0
- package/dist/shell/interp/runlog.js.map +1 -0
- package/dist/shell/interp/timer.js +64 -0
- package/dist/shell/interp/timer.js.map +1 -0
- package/dist/shell/interp/tracker-disk.js +99 -0
- package/dist/shell/interp/tracker-disk.js.map +1 -0
- package/dist/shell/interp/tracker-parse.js +71 -0
- package/dist/shell/interp/tracker-parse.js.map +1 -0
- package/dist/shell/interp/tracker-scan.js +238 -0
- package/dist/shell/interp/tracker-scan.js.map +1 -0
- package/dist/shell/interp/tracker-write.js +91 -0
- package/dist/shell/interp/tracker-write.js.map +1 -0
- package/dist/shell/interp/tracker.js +41 -0
- package/dist/shell/interp/tracker.js.map +1 -0
- package/dist/shell/interp/tty.js +48 -0
- package/dist/shell/interp/tty.js.map +1 -0
- package/dist/shell/interp/vm.js +199 -0
- package/dist/shell/interp/vm.js.map +1 -0
- package/dist/shell/interp/workspace.js +310 -0
- package/dist/shell/interp/workspace.js.map +1 -0
- package/dist/shell/main-acp.js +78 -0
- package/dist/shell/main-acp.js.map +1 -0
- package/dist/shell/main-adapters.js +222 -0
- package/dist/shell/main-adapters.js.map +1 -0
- package/dist/shell/main-credential.js +122 -0
- package/dist/shell/main-credential.js.map +1 -0
- package/dist/shell/main-doctor.js +22 -0
- package/dist/shell/main-doctor.js.map +1 -0
- package/dist/shell/main-entry.js +46 -0
- package/dist/shell/main-entry.js.map +1 -0
- package/dist/shell/main-http-csrf.js +45 -0
- package/dist/shell/main-http-csrf.js.map +1 -0
- package/dist/shell/main-http-handler.js +389 -0
- package/dist/shell/main-http-handler.js.map +1 -0
- package/dist/shell/main-http-mcp.js +122 -0
- package/dist/shell/main-http-mcp.js.map +1 -0
- package/dist/shell/main-http-views.js +253 -0
- package/dist/shell/main-http-views.js.map +1 -0
- package/dist/shell/main-http.js +76 -0
- package/dist/shell/main-http.js.map +1 -0
- package/dist/shell/main-loops.js +130 -0
- package/dist/shell/main-loops.js.map +1 -0
- package/dist/shell/main-mcp.js +129 -0
- package/dist/shell/main-mcp.js.map +1 -0
- package/dist/shell/main-orchestrator.js +120 -0
- package/dist/shell/main-orchestrator.js.map +1 -0
- package/dist/shell/main-preflight.js +43 -0
- package/dist/shell/main-preflight.js.map +1 -0
- package/dist/shell/main-reconcilers-helpers.js +244 -0
- package/dist/shell/main-reconcilers-helpers.js.map +1 -0
- package/dist/shell/main-reconcilers-pr.js +148 -0
- package/dist/shell/main-reconcilers-pr.js.map +1 -0
- package/dist/shell/main-reconcilers.js +225 -0
- package/dist/shell/main-reconcilers.js.map +1 -0
- package/dist/shell/main-runner.js +355 -0
- package/dist/shell/main-runner.js.map +1 -0
- package/dist/shell/main-scaffold.js +116 -0
- package/dist/shell/main-scaffold.js.map +1 -0
- package/dist/shell/main-shutdown.js +115 -0
- package/dist/shell/main-shutdown.js.map +1 -0
- package/dist/shell/main-startup.js +48 -0
- package/dist/shell/main-startup.js.map +1 -0
- package/dist/shell/main-substrates.js +43 -0
- package/dist/shell/main-substrates.js.map +1 -0
- package/dist/shell/main.js +385 -0
- package/dist/shell/main.js.map +1 -0
- package/dist/shell/orchestrator-feedback.js +69 -0
- package/dist/shell/orchestrator-feedback.js.map +1 -0
- package/dist/shell/orchestrator-image.js +167 -0
- package/dist/shell/orchestrator-image.js.map +1 -0
- package/dist/shell/orchestrator-loop.js +468 -0
- package/dist/shell/orchestrator-loop.js.map +1 -0
- package/dist/shell/orchestrator-reconcile.js +36 -0
- package/dist/shell/orchestrator-reconcile.js.map +1 -0
- package/dist/shell/reconciler-loop.js +228 -0
- package/dist/shell/reconciler-loop.js.map +1 -0
- package/dist/shell/runner-loop-turn.js +301 -0
- package/dist/shell/runner-loop-turn.js.map +1 -0
- package/dist/shell/runner-loop.js +338 -0
- package/dist/shell/runner-loop.js.map +1 -0
- package/dist/shell/server/http.js +208 -0
- package/dist/shell/server/http.js.map +1 -0
- package/dist/shell/server/mcp-runtime-effects.js +237 -0
- package/dist/shell/server/mcp-runtime-effects.js.map +1 -0
- package/dist/shell/server/mcp-runtime.js +99 -0
- package/dist/shell/server/mcp-runtime.js.map +1 -0
- package/dist/shell/workspace-key.js +14 -0
- package/dist/shell/workspace-key.js.map +1 -0
- package/dist/types/acp.js +8 -0
- package/dist/types/acp.js.map +1 -0
- package/dist/types/actions/plan.js +6 -0
- package/dist/types/actions/plan.js.map +1 -0
- package/dist/types/actions/predicates.js +6 -0
- package/dist/types/actions/predicates.js.map +1 -0
- package/dist/types/actions/run-fold.js +8 -0
- package/dist/types/actions/run-fold.js.map +1 -0
- package/dist/types/actions.js +7 -0
- package/dist/types/actions.js.map +1 -0
- package/dist/types/adapter/clock-random.js +4 -0
- package/dist/types/adapter/clock-random.js.map +1 -0
- package/dist/types/adapter/gondolin-image-converter.js +5 -0
- package/dist/types/adapter/gondolin-image-converter.js.map +1 -0
- package/dist/types/adapter/gondolin-image-fetch.js +5 -0
- package/dist/types/adapter/gondolin-image-fetch.js.map +1 -0
- package/dist/types/adapter/workflow-loader.js +4 -0
- package/dist/types/adapter/workflow-loader.js.map +1 -0
- package/dist/types/cli/args.js +8 -0
- package/dist/types/cli/args.js.map +1 -0
- package/dist/types/config.js +8 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/credential-interp.js +6 -0
- package/dist/types/credential-interp.js.map +1 -0
- package/dist/types/credentials.js +10 -0
- package/dist/types/credentials.js.map +1 -0
- package/dist/types/doctor.js +7 -0
- package/dist/types/doctor.js.map +1 -0
- package/dist/types/domain.js +7 -0
- package/dist/types/domain.js.map +1 -0
- package/dist/types/effect.js +15 -0
- package/dist/types/effect.js.map +1 -0
- package/dist/types/errors.js +39 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/http/decisions.js +6 -0
- package/dist/types/http/decisions.js.map +1 -0
- package/dist/types/http/render.js +10 -0
- package/dist/types/http/render.js.map +1 -0
- package/dist/types/http/views.js +6 -0
- package/dist/types/http/views.js.map +1 -0
- package/dist/types/http.js +9 -0
- package/dist/types/http.js.map +1 -0
- package/dist/types/image/managed-image.js +7 -0
- package/dist/types/image/managed-image.js.map +1 -0
- package/dist/types/interp/effect-interpreter.js +8 -0
- package/dist/types/interp/effect-interpreter.js.map +1 -0
- package/dist/types/interp/tracker.js +7 -0
- package/dist/types/interp/tracker.js.map +1 -0
- package/dist/types/issue/file.js +6 -0
- package/dist/types/issue/file.js.map +1 -0
- package/dist/types/issue/parse.js +8 -0
- package/dist/types/issue/parse.js.map +1 -0
- package/dist/types/main-acp.js +13 -0
- package/dist/types/main-acp.js.map +1 -0
- package/dist/types/main-adapters.js +5 -0
- package/dist/types/main-adapters.js.map +1 -0
- package/dist/types/main-credential.js +21 -0
- package/dist/types/main-credential.js.map +1 -0
- package/dist/types/main-doctor.js +6 -0
- package/dist/types/main-doctor.js.map +1 -0
- package/dist/types/main-http-handler.js +12 -0
- package/dist/types/main-http-handler.js.map +1 -0
- package/dist/types/main-http.js +5 -0
- package/dist/types/main-http.js.map +1 -0
- package/dist/types/main-loops.js +5 -0
- package/dist/types/main-loops.js.map +1 -0
- package/dist/types/main-mcp.js +12 -0
- package/dist/types/main-mcp.js.map +1 -0
- package/dist/types/main-orchestrator.js +5 -0
- package/dist/types/main-orchestrator.js.map +1 -0
- package/dist/types/main-reconcilers.js +11 -0
- package/dist/types/main-reconcilers.js.map +1 -0
- package/dist/types/main-runner.js +13 -0
- package/dist/types/main-runner.js.map +1 -0
- package/dist/types/main-startup.js +5 -0
- package/dist/types/main-startup.js.map +1 -0
- package/dist/types/main-substrates.js +5 -0
- package/dist/types/main-substrates.js.map +1 -0
- package/dist/types/mcp/dispatch.js +4 -0
- package/dist/types/mcp/dispatch.js.map +1 -0
- package/dist/types/mcp/post-move.js +7 -0
- package/dist/types/mcp/post-move.js.map +1 -0
- package/dist/types/mcp.js +9 -0
- package/dist/types/mcp.js.map +1 -0
- package/dist/types/ports.js +12 -0
- package/dist/types/ports.js.map +1 -0
- package/dist/types/reconcile/image-decide.js +5 -0
- package/dist/types/reconcile/image-decide.js.map +1 -0
- package/dist/types/reconcile/ledger.js +7 -0
- package/dist/types/reconcile/ledger.js.map +1 -0
- package/dist/types/reconcile/pr-loop.js +8 -0
- package/dist/types/reconcile/pr-loop.js.map +1 -0
- package/dist/types/reconcile/vm-reap.js +8 -0
- package/dist/types/reconcile/vm-reap.js.map +1 -0
- package/dist/types/reconcile/workspace-decide.js +7 -0
- package/dist/types/reconcile/workspace-decide.js.map +1 -0
- package/dist/types/reconcile.js +9 -0
- package/dist/types/reconcile.js.map +1 -0
- package/dist/types/runlog.js +7 -0
- package/dist/types/runlog.js.map +1 -0
- package/dist/types/runner/actions-runner.js +12 -0
- package/dist/types/runner/actions-runner.js.map +1 -0
- package/dist/types/runner/gondolin-dispatch.js +5 -0
- package/dist/types/runner/gondolin-dispatch.js.map +1 -0
- package/dist/types/runner/injection.js +6 -0
- package/dist/types/runner/injection.js.map +1 -0
- package/dist/types/runner/runner-loop.js +5 -0
- package/dist/types/runner/runner-loop.js.map +1 -0
- package/dist/types/runner/turn.js +4 -0
- package/dist/types/runner/turn.js.map +1 -0
- package/dist/types/runner/vm-plan.js +4 -0
- package/dist/types/runner/vm-plan.js.map +1 -0
- package/dist/types/runtime.js +9 -0
- package/dist/types/runtime.js.map +1 -0
- package/dist/types/schedule/admission.js +7 -0
- package/dist/types/schedule/admission.js.map +1 -0
- package/dist/types/schedule/circuit-breaker.js +2 -0
- package/dist/types/schedule/circuit-breaker.js.map +1 -0
- package/dist/types/schedule/eligibility.js +9 -0
- package/dist/types/schedule/eligibility.js.map +1 -0
- package/dist/types/schedule/orchestrator-loop.js +10 -0
- package/dist/types/schedule/orchestrator-loop.js.map +1 -0
- package/dist/types/schedule/sleep-cycle.js +4 -0
- package/dist/types/schedule/sleep-cycle.js.map +1 -0
- package/dist/types/schedule/slots.js +8 -0
- package/dist/types/schedule/slots.js.map +1 -0
- package/dist/types/schedule/tick.js +9 -0
- package/dist/types/schedule/tick.js.map +1 -0
- package/dist/types/server/mcp-runtime.js +8 -0
- package/dist/types/server/mcp-runtime.js.map +1 -0
- package/dist/types/workflow/parse.js +4 -0
- package/dist/types/workflow/parse.js.map +1 -0
- package/package.json +22 -10
- 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/errors.js +0 -15
- package/dist/errors.js.map +0 -1
- package/dist/http-disk.js +0 -135
- package/dist/http-disk.js.map +0 -1
- package/dist/http-handlers.js.map +0 -1
- package/dist/http.js.map +0 -1
- package/dist/issues.js +0 -178
- package/dist/issues.js.map +0 -1
- package/dist/logging.js +0 -203
- package/dist/logging.js.map +0 -1
- package/dist/mcp.js +0 -706
- package/dist/mcp.js.map +0 -1
- package/dist/memory.js +0 -85
- package/dist/memory.js.map +0 -1
- package/dist/orchestrator-decisions.js +0 -331
- package/dist/orchestrator-decisions.js.map +0 -1
- package/dist/orchestrator.js +0 -1569
- package/dist/orchestrator.js.map +0 -1
- package/dist/prompt.js +0 -65
- package/dist/prompt.js.map +0 -1
- package/dist/reconciler/cache.js +0 -65
- package/dist/reconciler/cache.js.map +0 -1
- package/dist/reconciler/index.js +0 -448
- package/dist/reconciler/index.js.map +0 -1
- package/dist/reconciler/ledger.js +0 -131
- package/dist/reconciler/ledger.js.map +0 -1
- package/dist/reconciler/pr-adapters.js +0 -174
- package/dist/reconciler/pr-adapters.js.map +0 -1
- package/dist/reconciler/pr-decide.js.map +0 -1
- package/dist/reconciler/pr.js +0 -422
- package/dist/reconciler/pr.js.map +0 -1
- package/dist/reconciler/types.js +0 -12
- package/dist/reconciler/types.js.map +0 -1
- package/dist/reconciler/vm.js +0 -243
- package/dist/reconciler/vm.js.map +0 -1
- package/dist/reconciler/workspace-defaults.js +0 -83
- package/dist/reconciler/workspace-defaults.js.map +0 -1
- package/dist/reconciler/workspace.js +0 -272
- package/dist/reconciler/workspace.js.map +0 -1
- package/dist/runlog.js +0 -403
- package/dist/runlog.js.map +0 -1
- package/dist/scaffold.js +0 -165
- package/dist/scaffold.js.map +0 -1
- package/dist/trackers/local.js +0 -445
- package/dist/trackers/local.js.map +0 -1
- package/dist/trackers/types.js +0 -10
- package/dist/trackers/types.js.map +0 -1
- package/dist/types.js +0 -3
- package/dist/types.js.map +0 -1
- package/dist/util/clock.js +0 -12
- package/dist/util/clock.js.map +0 -1
- package/dist/util/crypto.js +0 -25
- package/dist/util/crypto.js.map +0 -1
- package/dist/util/frontmatter.js +0 -70
- package/dist/util/frontmatter.js.map +0 -1
- package/dist/util/fs-issues.js +0 -22
- package/dist/util/fs-issues.js.map +0 -1
- package/dist/util/process.js +0 -152
- package/dist/util/process.js.map +0 -1
- package/dist/util/workspace-key.js +0 -10
- package/dist/util/workspace-key.js.map +0 -1
- package/dist/workflow-loader.js +0 -147
- package/dist/workflow-loader.js.map +0 -1
- package/dist/workflow.js +0 -822
- package/dist/workflow.js.map +0 -1
- package/dist/workspace-types.js +0 -8
- package/dist/workspace-types.js.map +0 -1
- package/dist/workspace.js +0 -443
- package/dist/workspace.js.map +0 -1
package/dist/runlog.js
DELETED
|
@@ -1,403 +0,0 @@
|
|
|
1
|
-
// Per-issue JSONL run log. Captures everything crossing the host/VM boundary plus host-side
|
|
2
|
-
// hook output, so a later evaluation pass (likely another in-VM agent) can replay a run end
|
|
3
|
-
// to end. One file per issue, appended forever; each entry is a self-describing JSON object.
|
|
4
|
-
//
|
|
5
|
-
// Schema (one of):
|
|
6
|
-
// { ts, issue_id, attempt, channel: "acp", direction: "host_to_vm"|"vm_to_host", frame: <parsed JSON-RPC> }
|
|
7
|
-
// { ts, issue_id, attempt, channel: "acp", direction: ..., kind: "unparseable", raw: <string> }
|
|
8
|
-
// { ts, issue_id, attempt, channel: "stderr", text }
|
|
9
|
-
// { ts, issue_id, attempt, channel: "system", event, fields? }
|
|
10
|
-
// { ts, issue_id, attempt, channel: "hook", hook, stream: "stdout"|"stderr", text }
|
|
11
|
-
// { ts, issue_id, attempt, channel: "hook", hook, kind: "result", exit_code, signal, timed_out }
|
|
12
|
-
//
|
|
13
|
-
// Writes are best-effort: a write failure is swallowed so it can never crash the orchestrator
|
|
14
|
-
// (consistent with logging.ts §9.2). Streams are opened in append mode so concurrent symphony
|
|
15
|
-
// processes or restarts append safely to the same file.
|
|
16
|
-
import { createWriteStream, mkdirSync, writeFileSync } from 'node:fs';
|
|
17
|
-
import path from 'node:path';
|
|
18
|
-
import { sanitizeWorkspaceKey } from './util/workspace-key.js';
|
|
19
|
-
import { log } from './logging.js';
|
|
20
|
-
export class RunLog {
|
|
21
|
-
filePath;
|
|
22
|
-
issueId;
|
|
23
|
-
identifier;
|
|
24
|
-
stream;
|
|
25
|
-
currentAttempt = 0;
|
|
26
|
-
// Once a stream error fires we stop trying to write. The first error is logged at warn;
|
|
27
|
-
// subsequent attempts are silently dropped (prevents log spam if disk is full).
|
|
28
|
-
broken = false;
|
|
29
|
-
// In-memory accumulator of the low-frequency LIFECYCLE events only (system events plus
|
|
30
|
-
// the Done-state `actions:` stdout, where the PR URL surfaces). The high-frequency ACP
|
|
31
|
-
// frame / stderr stream is NOT accumulated — it stays on disk. `writeSummary` reduces
|
|
32
|
-
// this list into a compact per-issue `*.summary.json` for the reflector (issue 123), so
|
|
33
|
-
// a reflection turn never has to re-parse the multi-MB raw frame log. Bounded by the two
|
|
34
|
-
// caps below so a pathological issue can't grow the host's memory without limit.
|
|
35
|
-
lifecycle = [];
|
|
36
|
-
actionsStdout = '';
|
|
37
|
-
static LIFECYCLE_CAP = 4000;
|
|
38
|
-
static ACTIONS_STDOUT_CAP = 65_536;
|
|
39
|
-
/**
|
|
40
|
-
* `issueId` is the tracker's primary key (e.g. the local tracker's front-matter `id`)
|
|
41
|
-
* and is what each JSONL line is stamped with. `identifier` is the filename-safe display
|
|
42
|
-
* id (e.g. `ABC-123`) and is only used to derive the file path. The two coincide for
|
|
43
|
-
* local trackers today but MUST be kept separate so downstream evaluators can correlate
|
|
44
|
-
* by tracker id even on trackers where the values diverge.
|
|
45
|
-
*/
|
|
46
|
-
constructor(filePath, issueId, identifier) {
|
|
47
|
-
this.filePath = filePath;
|
|
48
|
-
this.issueId = issueId;
|
|
49
|
-
this.identifier = identifier;
|
|
50
|
-
this.stream = createWriteStream(filePath, { flags: 'a', encoding: 'utf8' });
|
|
51
|
-
this.stream.on('error', (err) => {
|
|
52
|
-
if (!this.broken) {
|
|
53
|
-
this.broken = true;
|
|
54
|
-
log.warn('runlog write failed', {
|
|
55
|
-
issue_id: this.issueId,
|
|
56
|
-
issue_identifier: this.identifier,
|
|
57
|
-
error: err.message,
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
setAttempt(n) {
|
|
63
|
-
this.currentAttempt = n;
|
|
64
|
-
}
|
|
65
|
-
attempt() {
|
|
66
|
-
return this.currentAttempt;
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Append one entry. `ts`, `issue_id`, `issue_identifier`, and `attempt` are stamped
|
|
70
|
-
* automatically and override any same-named field on the entry, so callers cannot
|
|
71
|
-
* accidentally backdate or mislabel lines. Returns nothing — writes are best-effort.
|
|
72
|
-
*
|
|
73
|
-
* The spread order below intentionally puts the auto-stamped fields AFTER the caller's
|
|
74
|
-
* entry so they win over any same-named keys the caller (often passing arbitrary fields
|
|
75
|
-
* for ad-hoc events) accidentally supplied. Reversing this would silently corrupt the
|
|
76
|
-
* canonical correlation identifiers downstream evaluation depends on.
|
|
77
|
-
*/
|
|
78
|
-
record(entry) {
|
|
79
|
-
if (this.broken)
|
|
80
|
-
return;
|
|
81
|
-
const stamped = {
|
|
82
|
-
...entry,
|
|
83
|
-
ts: new Date().toISOString(),
|
|
84
|
-
issue_id: this.issueId,
|
|
85
|
-
issue_identifier: this.identifier,
|
|
86
|
-
attempt: this.currentAttempt,
|
|
87
|
-
};
|
|
88
|
-
this.captureLifecycle(stamped);
|
|
89
|
-
let line;
|
|
90
|
-
try {
|
|
91
|
-
line = JSON.stringify(stamped);
|
|
92
|
-
}
|
|
93
|
-
catch (err) {
|
|
94
|
-
log.warn('runlog serialize failed', { issue_id: this.issueId, error: err.message });
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
try {
|
|
98
|
-
this.stream.write(line + '\n');
|
|
99
|
-
}
|
|
100
|
-
catch {
|
|
101
|
-
// Stream errors land in the 'error' handler. A synchronous throw here is unusual but
|
|
102
|
-
// not impossible (e.g. if the stream is in an invalid state); silence it.
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
/** Convenience: emit a `channel: "system"` event. */
|
|
106
|
-
system(event, fields) {
|
|
107
|
-
this.record({ channel: 'system', event, ...(fields ? { fields } : {}) });
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Fold a just-stamped entry into the in-memory lifecycle accumulator that
|
|
111
|
-
* `writeSummary` reduces over. Keeps only the cheap, low-frequency signals:
|
|
112
|
-
* every `system` event, plus the Done-state `actions:` stdout (where
|
|
113
|
-
* `gh pr create` prints the PR URL). The high-volume ACP/stderr channels are
|
|
114
|
-
* skipped so the hot path stays a single bounded string-compare.
|
|
115
|
-
*/
|
|
116
|
-
captureLifecycle(stamped) {
|
|
117
|
-
if (stamped.channel === 'system') {
|
|
118
|
-
if (this.lifecycle.length < RunLog.LIFECYCLE_CAP)
|
|
119
|
-
this.lifecycle.push(stamped);
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
if (stamped.channel === 'hook' &&
|
|
123
|
-
stamped.hook === 'actions' &&
|
|
124
|
-
stamped.stream === 'stdout' &&
|
|
125
|
-
typeof stamped.text === 'string' &&
|
|
126
|
-
this.actionsStdout.length < RunLog.ACTIONS_STDOUT_CAP) {
|
|
127
|
-
this.actionsStdout += stamped.text;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
/** Sibling path of the JSONL log: `<root>/<key>.summary.json`. */
|
|
131
|
-
summaryFilePath() {
|
|
132
|
-
return this.filePath.replace(/\.jsonl$/, '.summary.json');
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Reduce the accumulated lifecycle events into a compact per-issue summary
|
|
136
|
-
* and write it next to the JSONL log. Best-effort: a failure is logged at
|
|
137
|
-
* warn and swallowed (a missing summary is tolerated by the reflector). Pure
|
|
138
|
-
* over in-memory state, so it needs no disk read and no stream flush — the
|
|
139
|
-
* orchestrator calls it at the terminal unwind, just before closing the log.
|
|
140
|
-
*/
|
|
141
|
-
writeSummary(generatedAt) {
|
|
142
|
-
if (this.lifecycle.length === 0)
|
|
143
|
-
return;
|
|
144
|
-
try {
|
|
145
|
-
const summary = summarizeRunLog({
|
|
146
|
-
entries: this.lifecycle,
|
|
147
|
-
actionsStdout: this.actionsStdout,
|
|
148
|
-
issueId: this.issueId,
|
|
149
|
-
issueIdentifier: this.identifier,
|
|
150
|
-
generatedAt,
|
|
151
|
-
});
|
|
152
|
-
writeFileSync(this.summaryFilePath(), JSON.stringify(summary, null, 2) + '\n', 'utf8');
|
|
153
|
-
}
|
|
154
|
-
catch (err) {
|
|
155
|
-
log.warn('run summary write failed', {
|
|
156
|
-
issue_id: this.issueId,
|
|
157
|
-
issue_identifier: this.identifier,
|
|
158
|
-
error: err.message,
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
/** Closes the underlying stream. Idempotent. */
|
|
163
|
-
async close() {
|
|
164
|
-
return new Promise((resolve) => {
|
|
165
|
-
if (this.broken)
|
|
166
|
-
return resolve();
|
|
167
|
-
this.stream.end(() => resolve());
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
/**
|
|
172
|
-
* Open (or reopen, append-mode) the run log for an issue. Creates the directory tree on
|
|
173
|
-
* demand. Path is `<logsRoot>/<sanitized-identifier>.jsonl`; sanitization matches workspace
|
|
174
|
-
* keys so the same characters are escaped consistently across .symphony/ subdirs.
|
|
175
|
-
*
|
|
176
|
-
* `issueId` is the tracker's primary key and is stamped on every line as `issue_id`.
|
|
177
|
-
* `issueIdentifier` is the filename-safe display id and is used to derive the path AND
|
|
178
|
-
* is stamped as `issue_identifier`. Pass both — they may diverge on trackers where ids
|
|
179
|
-
* are opaque distinct from human-readable identifiers.
|
|
180
|
-
*/
|
|
181
|
-
export function openRunLog(logsRoot, issueId, issueIdentifier) {
|
|
182
|
-
const key = sanitizeWorkspaceKey(issueIdentifier);
|
|
183
|
-
if (key.length === 0) {
|
|
184
|
-
throw new Error(`cannot derive runlog filename from identifier: ${issueIdentifier}`);
|
|
185
|
-
}
|
|
186
|
-
mkdirSync(logsRoot, { recursive: true });
|
|
187
|
-
const filePath = path.join(logsRoot, `${key}.jsonl`);
|
|
188
|
-
return new RunLog(filePath, issueId, issueIdentifier);
|
|
189
|
-
}
|
|
190
|
-
// ===========================================================================
|
|
191
|
-
// Per-issue run summary (issue 123)
|
|
192
|
-
//
|
|
193
|
-
// The reflector (companion #122) needs to spot patterns across many finished
|
|
194
|
-
// issues. The raw `<id>.jsonl` runs to multiple MB per heavy issue, so we emit
|
|
195
|
-
// a compact, comparable per-issue OUTCOME record alongside it. The summary is a
|
|
196
|
-
// pure reduction over the LIFECYCLE events already captured in the run log — no
|
|
197
|
-
// new hot-path instrumentation; the high-frequency ACP frame stream is not
|
|
198
|
-
// touched.
|
|
199
|
-
//
|
|
200
|
-
// Schema is versioned (`schema_version`). The reflector tolerates a missing
|
|
201
|
-
// summary (issues closed before this feature shipped, or runs whose summary
|
|
202
|
-
// write failed): treat absence as "no signal for this issue", never an error.
|
|
203
|
-
// ===========================================================================
|
|
204
|
-
/** Bumped when the on-disk `*.summary.json` shape changes incompatibly. */
|
|
205
|
-
export const RUN_SUMMARY_SCHEMA_VERSION = 1;
|
|
206
|
-
const NOTE_CAP = 4000;
|
|
207
|
-
const TIMEOUT_RE = /timeout|timed out|stall|prompt_timeout|did not connect|bridge/i;
|
|
208
|
-
const PR_URL_RE = /(https?:\/\/[^\s)]+\/pull\/(\d+))/;
|
|
209
|
-
function fieldsOf(e) {
|
|
210
|
-
return e.fields && typeof e.fields === 'object' ? e.fields : {};
|
|
211
|
-
}
|
|
212
|
-
function asStr(v) {
|
|
213
|
-
return typeof v === 'string' ? v : null;
|
|
214
|
-
}
|
|
215
|
-
function asNum(v) {
|
|
216
|
-
return typeof v === 'number' && Number.isFinite(v) ? v : null;
|
|
217
|
-
}
|
|
218
|
-
function isBudgetExhausted(reason) {
|
|
219
|
-
return reason !== null && /max_turns/i.test(reason);
|
|
220
|
-
}
|
|
221
|
-
function spanDurationMs(s) {
|
|
222
|
-
if (!s.ended_at)
|
|
223
|
-
return 0;
|
|
224
|
-
const a = Date.parse(s.started_at);
|
|
225
|
-
const b = Date.parse(s.ended_at);
|
|
226
|
-
return Number.isFinite(a) && Number.isFinite(b) && b >= a ? b - a : 0;
|
|
227
|
-
}
|
|
228
|
-
/** Pair `attempt_started`/`attempt_ended` events in order into per-attempt spans. */
|
|
229
|
-
function buildAttemptSpans(entries) {
|
|
230
|
-
const spans = [];
|
|
231
|
-
for (const e of entries) {
|
|
232
|
-
if (e.channel !== 'system')
|
|
233
|
-
continue;
|
|
234
|
-
const f = fieldsOf(e);
|
|
235
|
-
if (e.event === 'attempt_started') {
|
|
236
|
-
spans.push({
|
|
237
|
-
attempt: asNum(f.attempt) ?? spans.length,
|
|
238
|
-
state: asStr(f.issue_state) ?? 'unknown',
|
|
239
|
-
max_turns: asNum(f.max_turns),
|
|
240
|
-
turns_used: 0,
|
|
241
|
-
reason: null,
|
|
242
|
-
started_at: e.ts,
|
|
243
|
-
ended_at: null,
|
|
244
|
-
});
|
|
245
|
-
}
|
|
246
|
-
else if (e.event === 'attempt_ended') {
|
|
247
|
-
const open = spans[spans.length - 1];
|
|
248
|
-
if (open && open.ended_at === null) {
|
|
249
|
-
open.turns_used = asNum(f.turns_completed) ?? 0;
|
|
250
|
-
open.reason = asStr(f.reason);
|
|
251
|
-
open.ended_at = e.ts;
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
return spans;
|
|
256
|
-
}
|
|
257
|
-
function collectTransitions(entries) {
|
|
258
|
-
const out = [];
|
|
259
|
-
for (const e of entries) {
|
|
260
|
-
if (e.channel !== 'system' || e.event !== 'transition')
|
|
261
|
-
continue;
|
|
262
|
-
const f = fieldsOf(e);
|
|
263
|
-
out.push({
|
|
264
|
-
from_state: asStr(f.from_state) ?? 'unknown',
|
|
265
|
-
to_state: asStr(f.to_state) ?? 'unknown',
|
|
266
|
-
notes: asStr(f.notes) ?? '',
|
|
267
|
-
actor: asStr(f.actor),
|
|
268
|
-
terminal: f.terminal === true,
|
|
269
|
-
rerouted: f.rerouted === true,
|
|
270
|
-
});
|
|
271
|
-
}
|
|
272
|
-
return out;
|
|
273
|
-
}
|
|
274
|
-
function collapseConsecutive(seq) {
|
|
275
|
-
const out = [];
|
|
276
|
-
for (const s of seq) {
|
|
277
|
-
if (out[out.length - 1] !== s)
|
|
278
|
-
out.push(s);
|
|
279
|
-
}
|
|
280
|
-
return out;
|
|
281
|
-
}
|
|
282
|
-
/** State path backbone is the per-attempt states (every dispatch logs one); the terminal state is appended. */
|
|
283
|
-
function buildStatePath(spans, transitions, terminalState) {
|
|
284
|
-
let path = collapseConsecutive(spans.map((s) => s.state));
|
|
285
|
-
if (path.length === 0 && transitions.length > 0) {
|
|
286
|
-
path = collapseConsecutive([transitions[0].from_state, ...transitions.map((t) => t.to_state)]);
|
|
287
|
-
}
|
|
288
|
-
if (terminalState && path[path.length - 1] !== terminalState)
|
|
289
|
-
path.push(terminalState);
|
|
290
|
-
return path;
|
|
291
|
-
}
|
|
292
|
-
function perStateStats(spans) {
|
|
293
|
-
const order = [];
|
|
294
|
-
const byState = new Map();
|
|
295
|
-
for (const s of spans) {
|
|
296
|
-
let stat = byState.get(s.state);
|
|
297
|
-
if (!stat) {
|
|
298
|
-
stat = { state: s.state, attempts: 0, turns_used: 0, max_turns: null, budget_exhausted: false, wall_clock_ms: 0 };
|
|
299
|
-
byState.set(s.state, stat);
|
|
300
|
-
order.push(s.state);
|
|
301
|
-
}
|
|
302
|
-
stat.attempts += 1;
|
|
303
|
-
stat.turns_used += s.turns_used;
|
|
304
|
-
if (s.max_turns !== null)
|
|
305
|
-
stat.max_turns = s.max_turns;
|
|
306
|
-
if (isBudgetExhausted(s.reason))
|
|
307
|
-
stat.budget_exhausted = true;
|
|
308
|
-
stat.wall_clock_ms += spanDurationMs(s);
|
|
309
|
-
}
|
|
310
|
-
return order.map((st) => byState.get(st));
|
|
311
|
-
}
|
|
312
|
-
function capNotes(notes) {
|
|
313
|
-
return notes.length > NOTE_CAP ? notes.slice(0, NOTE_CAP) + '…[truncated]' : notes;
|
|
314
|
-
}
|
|
315
|
-
/**
|
|
316
|
-
* A review rejection is a non-reroute transition back to the INITIAL implementing
|
|
317
|
-
* state (where the issue started). In the shipped Todo→Review→Done flow that is
|
|
318
|
-
* exactly a Review→Todo kick-back; the definition stays workflow-agnostic.
|
|
319
|
-
*/
|
|
320
|
-
function collectRejections(transitions, initialState) {
|
|
321
|
-
if (initialState === null)
|
|
322
|
-
return [];
|
|
323
|
-
const out = [];
|
|
324
|
-
for (const t of transitions) {
|
|
325
|
-
if (t.rerouted)
|
|
326
|
-
continue;
|
|
327
|
-
if (t.to_state === initialState && t.from_state !== t.to_state) {
|
|
328
|
-
out.push({ from_state: t.from_state, to_state: t.to_state, actor: t.actor, notes: capNotes(t.notes) });
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
return out;
|
|
332
|
-
}
|
|
333
|
-
function collectTimeouts(spans) {
|
|
334
|
-
const out = [];
|
|
335
|
-
for (const s of spans) {
|
|
336
|
-
if (s.reason !== null && TIMEOUT_RE.test(s.reason)) {
|
|
337
|
-
out.push({ attempt: s.attempt, state: s.state, reason: s.reason });
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
return out;
|
|
341
|
-
}
|
|
342
|
-
function terminalOf(transitions) {
|
|
343
|
-
let terminal = null;
|
|
344
|
-
for (const t of transitions) {
|
|
345
|
-
if (t.terminal)
|
|
346
|
-
terminal = t;
|
|
347
|
-
}
|
|
348
|
-
if (!terminal)
|
|
349
|
-
return { state: null, outcome: 'incomplete' };
|
|
350
|
-
return { state: terminal.to_state, outcome: /cancel/i.test(terminal.to_state) ? 'cancelled' : 'completed' };
|
|
351
|
-
}
|
|
352
|
-
function prFrom(actionsStdout) {
|
|
353
|
-
const m = PR_URL_RE.exec(actionsStdout);
|
|
354
|
-
if (!m)
|
|
355
|
-
return { number: null, url: null };
|
|
356
|
-
return { url: m[1], number: Number.parseInt(m[2], 10) };
|
|
357
|
-
}
|
|
358
|
-
function wallClockTotal(entries) {
|
|
359
|
-
if (entries.length === 0)
|
|
360
|
-
return null;
|
|
361
|
-
const a = Date.parse(entries[0].ts);
|
|
362
|
-
const b = Date.parse(entries[entries.length - 1].ts);
|
|
363
|
-
return Number.isFinite(a) && Number.isFinite(b) && b >= a ? b - a : null;
|
|
364
|
-
}
|
|
365
|
-
/**
|
|
366
|
-
* Reduce a per-issue lifecycle event list into a {@link RunSummary}. Pure and
|
|
367
|
-
* deterministic (pass `generatedAt` to pin the timestamp under test). Tolerant
|
|
368
|
-
* of partial streams — every field degrades to a sensible empty/null value.
|
|
369
|
-
*/
|
|
370
|
-
export function summarizeRunLog(input) {
|
|
371
|
-
const spans = buildAttemptSpans(input.entries);
|
|
372
|
-
const transitions = collectTransitions(input.entries);
|
|
373
|
-
const term = terminalOf(transitions);
|
|
374
|
-
const statePath = buildStatePath(spans, transitions, term.state);
|
|
375
|
-
const initialState = statePath[0] ?? spans[0]?.state ?? null;
|
|
376
|
-
const rejections = collectRejections(transitions, initialState);
|
|
377
|
-
const perState = perStateStats(spans);
|
|
378
|
-
const pr = prFrom(input.actionsStdout);
|
|
379
|
-
return {
|
|
380
|
-
schema_version: RUN_SUMMARY_SCHEMA_VERSION,
|
|
381
|
-
issue_id: input.issueId,
|
|
382
|
-
issue_identifier: input.issueIdentifier,
|
|
383
|
-
state_path: statePath,
|
|
384
|
-
attempts: spans.length,
|
|
385
|
-
per_state: perState,
|
|
386
|
-
review_rejections: rejections.length,
|
|
387
|
-
rejection_notes: rejections,
|
|
388
|
-
turn_budget_exhausted: perState.some((s) => s.budget_exhausted),
|
|
389
|
-
timeouts: collectTimeouts(spans),
|
|
390
|
-
conflict_routes: transitions
|
|
391
|
-
.filter((t) => t.rerouted)
|
|
392
|
-
.map((t) => ({ from_state: t.from_state, to_state: t.to_state })),
|
|
393
|
-
terminal_state: term.state,
|
|
394
|
-
terminal_outcome: term.outcome,
|
|
395
|
-
pr_number: pr.number,
|
|
396
|
-
pr_url: pr.url,
|
|
397
|
-
first_event_at: input.entries[0]?.ts ?? null,
|
|
398
|
-
last_event_at: input.entries[input.entries.length - 1]?.ts ?? null,
|
|
399
|
-
wall_clock_ms_total: wallClockTotal(input.entries),
|
|
400
|
-
generated_at: input.generatedAt ?? new Date().toISOString(),
|
|
401
|
-
};
|
|
402
|
-
}
|
|
403
|
-
//# sourceMappingURL=runlog.js.map
|
package/dist/runlog.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runlog.js","sourceRoot":"","sources":["../src/runlog.ts"],"names":[],"mappings":"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"}
|
package/dist/scaffold.js
DELETED
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
// First-run scaffold: write a starter WORKFLOW.md when an operator launches
|
|
2
|
-
// `symphony` against a directory that does not have one yet. The CLI prompts
|
|
3
|
-
// before calling in; this module is a pure file writer so it can be exercised
|
|
4
|
-
// from tests without an interactive stdin.
|
|
5
|
-
import { mkdir, writeFile } from 'node:fs/promises';
|
|
6
|
-
import { existsSync } from 'node:fs';
|
|
7
|
-
import path from 'node:path';
|
|
8
|
-
/**
|
|
9
|
-
* Body of the scaffolded WORKFLOW.md. Kept as an exported constant so tests can
|
|
10
|
-
* assert against it without re-running the file write, and so future edits to
|
|
11
|
-
* the starter shape stay in one place.
|
|
12
|
-
*
|
|
13
|
-
* The starter aims to run as-is once the operator has built the agent image:
|
|
14
|
-
* `gondolin.image` is pinned to `symphony-agents:latest` (the default tag
|
|
15
|
-
* `npm run build:image` writes), and `egress.allowed_hosts` opens the standard
|
|
16
|
-
* dev-tooling hosts so in-VM gates (npm install, git deps) work out of the box.
|
|
17
|
-
* The one required manual step is building that image; the runner fails fast at
|
|
18
|
-
* boot if it is missing. `workspace.github_repo` defaults to "none" (local-only)
|
|
19
|
-
* so a first run never pushes anywhere unexpected. See WORKFLOW.template.md for
|
|
20
|
-
* the full annotated reference.
|
|
21
|
-
*/
|
|
22
|
-
export const SCAFFOLD_WORKFLOW_TEMPLATE = `---
|
|
23
|
-
# WORKFLOW.md — scaffolded by smol-symphony.
|
|
24
|
-
#
|
|
25
|
-
# Run: npx smol-symphony WORKFLOW.md
|
|
26
|
-
#
|
|
27
|
-
# See WORKFLOW.template.md for the full annotated reference:
|
|
28
|
-
# https://github.com/dizk/smol-symphony/blob/main/WORKFLOW.template.md
|
|
29
|
-
|
|
30
|
-
states:
|
|
31
|
-
Todo:
|
|
32
|
-
role: active
|
|
33
|
-
Done:
|
|
34
|
-
role: terminal
|
|
35
|
-
# On the Done transition, push the per-issue branch and open a PR. The
|
|
36
|
-
# \`if: $repo\` guard makes both a no-op in local-only mode (github_repo
|
|
37
|
-
# unset/"none"); when a slug is set they run against it. Opening a PR needs
|
|
38
|
-
# \`gh\` authenticated on the host.
|
|
39
|
-
actions:
|
|
40
|
-
- { kind: push_branch, remote: origin, ref: $branch, if: $repo }
|
|
41
|
-
- kind: create_pr_if_missing
|
|
42
|
-
base: $base_branch
|
|
43
|
-
head: $branch
|
|
44
|
-
title_from: $pr_title
|
|
45
|
-
body_from: $pr_body_file
|
|
46
|
-
if: $repo
|
|
47
|
-
Triage:
|
|
48
|
-
role: holding
|
|
49
|
-
|
|
50
|
-
tracker:
|
|
51
|
-
kind: local
|
|
52
|
-
root: ./issues
|
|
53
|
-
|
|
54
|
-
polling:
|
|
55
|
-
interval_ms: 5000
|
|
56
|
-
|
|
57
|
-
workspace:
|
|
58
|
-
root: ./.symphony/workspaces
|
|
59
|
-
# GitHub owner/repo to push the per-issue branch + open a PR against on the
|
|
60
|
-
# Done transition (requires \`gh\` authenticated on the host; the token never
|
|
61
|
-
# enters the VM). Leave as "none" for local-only mode — nothing is pushed.
|
|
62
|
-
# Heads up: in local-only mode the per-issue workspace (and its \`agent/<id>\`
|
|
63
|
-
# branch) is removed when the issue reaches a terminal state, so set a slug
|
|
64
|
-
# here to keep the agent's work as a PR. The SYMPHONY_REPO env var, when set,
|
|
65
|
-
# overrides this value.
|
|
66
|
-
github_repo: none
|
|
67
|
-
|
|
68
|
-
agent:
|
|
69
|
-
max_concurrent_agents: 1
|
|
70
|
-
max_turns: 10
|
|
71
|
-
|
|
72
|
-
acp:
|
|
73
|
-
# Adapter whose binary symphony launches inside each per-issue VM.
|
|
74
|
-
# Credentials never enter the VM: the guest holds only a token-shaped
|
|
75
|
-
# placeholder, and the host substitutes the real key into the outbound request
|
|
76
|
-
# at Gondolin egress (TLS-MITM).
|
|
77
|
-
# claude — host reads ~/.claude/.credentials.json
|
|
78
|
-
# codex — host reads ~/.codex/auth.json (or host OPENAI_API_KEY)
|
|
79
|
-
adapter: claude
|
|
80
|
-
|
|
81
|
-
gondolin:
|
|
82
|
-
# Per-issue microVM (Gondolin substrate). \`image\` is the agent rootfs the VM
|
|
83
|
-
# boots. Build it once with \`npm run build:image\` (see images/agents/), which
|
|
84
|
-
# tags \`symphony-agents:latest\` — pinned below so this file runs as-is. For an
|
|
85
|
-
# immutable reference, replace it with the content-addressed build id the build
|
|
86
|
-
# prints. The in-VM launcher (/opt/symphony/vm-agent.mjs) is baked into the
|
|
87
|
-
# image, so no runtime \`volumes\` entry is needed.
|
|
88
|
-
image: symphony-agents:latest
|
|
89
|
-
cpus: 2
|
|
90
|
-
mem_mib: 4096
|
|
91
|
-
|
|
92
|
-
egress:
|
|
93
|
-
# Dev-tooling hosts the in-VM agent may reach so gates can run inside the
|
|
94
|
-
# sandbox (npm install, git-based deps, release-binary downloads). The agent
|
|
95
|
-
# always reaches its own inference host; NO credential is ever substituted for
|
|
96
|
-
# a host listed here — these grant plain network egress only. Keep the list
|
|
97
|
-
# tight, and add whatever your project's build/test needs.
|
|
98
|
-
allowed_hosts:
|
|
99
|
-
- registry.npmjs.org
|
|
100
|
-
- github.com
|
|
101
|
-
- codeload.github.com
|
|
102
|
-
- objects.githubusercontent.com
|
|
103
|
-
|
|
104
|
-
server:
|
|
105
|
-
port: 8787
|
|
106
|
-
---
|
|
107
|
-
You are picking up a single issue and shepherding it through the pipeline.
|
|
108
|
-
|
|
109
|
-
Issue: **{{ issue.identifier }} — {{ issue.title }}**
|
|
110
|
-
State: {{ issue.state }}
|
|
111
|
-
{% if issue.priority -%}Priority: {{ issue.priority }}{%- endif %}
|
|
112
|
-
{% if issue.labels.size > 0 -%}Labels: {% for l in issue.labels %}{{ l }}{% unless forloop.last %}, {% endunless %}{% endfor %}{%- endif %}
|
|
113
|
-
|
|
114
|
-
{% if issue.description -%}
|
|
115
|
-
Description:
|
|
116
|
-
|
|
117
|
-
{{ issue.description }}
|
|
118
|
-
{%- endif %}
|
|
119
|
-
|
|
120
|
-
Goals:
|
|
121
|
-
|
|
122
|
-
1. Work in the current directory only; treat it as the issue workspace.
|
|
123
|
-
2. Make the smallest correct change that satisfies the issue.
|
|
124
|
-
3. Hand off when done by calling \`symphony.transition({ to_state, notes? })\`
|
|
125
|
-
into a declared \`role: terminal\` state (e.g. Done). The notes block is
|
|
126
|
-
appended to the issue body and rides into the PR description.
|
|
127
|
-
4. If you cannot proceed without human input, call
|
|
128
|
-
\`symphony.request_human_steering({ question, context? })\`. Your turn ends
|
|
129
|
-
immediately; the human's reply arrives as your next prompt.
|
|
130
|
-
5. If you notice work out of scope for this issue, call
|
|
131
|
-
\`symphony.propose_issue({ title, description?, labels?, priority? })\`. It
|
|
132
|
-
lands in the first declared \`role: holding\` state directory (defaults to
|
|
133
|
-
\`Triage/\`); the operator approves or discards from the dashboard.
|
|
134
|
-
6. Work as a single agent: do NOT invoke the \`Workflow\` tool or spawn nested /
|
|
135
|
-
parallel sub-agents. A long fan-out turn can hold one streaming request open
|
|
136
|
-
for many minutes and hit an upstream connection-reset ceiling inside the
|
|
137
|
-
sandbox, getting discarded and re-dispatched; keep turns focused and rely on
|
|
138
|
-
\`max_turns\` for breadth. ("workflow" / \`WORKFLOW.md\` name this state
|
|
139
|
-
machine, not an opt-in to multi-agent orchestration.)
|
|
140
|
-
`;
|
|
141
|
-
export class ScaffoldError extends Error {
|
|
142
|
-
code;
|
|
143
|
-
constructor(code, message) {
|
|
144
|
-
super(message);
|
|
145
|
-
this.code = code;
|
|
146
|
-
this.name = 'ScaffoldError';
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Write a starter WORKFLOW.md at `workflowPath`. Creates the parent directory
|
|
151
|
-
* if needed. Refuses to overwrite an existing file — callers are expected to
|
|
152
|
-
* check for that case before prompting the operator.
|
|
153
|
-
*/
|
|
154
|
-
export async function scaffoldWorkflow(opts) {
|
|
155
|
-
if (!path.isAbsolute(opts.workflowPath)) {
|
|
156
|
-
throw new ScaffoldError('scaffold_relative_path', `scaffoldWorkflow requires an absolute path (got: ${opts.workflowPath})`);
|
|
157
|
-
}
|
|
158
|
-
if (existsSync(opts.workflowPath)) {
|
|
159
|
-
throw new ScaffoldError('scaffold_file_exists', `refusing to overwrite existing file: ${opts.workflowPath}`);
|
|
160
|
-
}
|
|
161
|
-
await mkdir(path.dirname(opts.workflowPath), { recursive: true });
|
|
162
|
-
await writeFile(opts.workflowPath, SCAFFOLD_WORKFLOW_TEMPLATE, { flag: 'wx' });
|
|
163
|
-
return { workflowPath: opts.workflowPath };
|
|
164
|
-
}
|
|
165
|
-
//# sourceMappingURL=scaffold.js.map
|
package/dist/scaffold.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,6EAA6E;AAC7E,8EAA8E;AAC9E,2CAA2C;AAE3C,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsHzC,CAAC;AAYF,MAAM,OAAO,aAAc,SAAQ,KAAK;IACnB;IAAnB,YAAmB,IAAY,EAAE,OAAe;QAC9C,KAAK,CAAC,OAAO,CAAC,CAAC;QADE,SAAI,GAAJ,IAAI,CAAQ;QAE7B,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAqB;IAC1D,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,aAAa,CACrB,wBAAwB,EACxB,oDAAoD,IAAI,CAAC,YAAY,GAAG,CACzE,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,aAAa,CACrB,sBAAsB,EACtB,wCAAwC,IAAI,CAAC,YAAY,EAAE,CAC5D,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,MAAM,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,0BAA0B,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/E,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;AAC7C,CAAC"}
|