smol-symphony 0.3.0 → 0.3.2
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/dist/bin/symphony.js.map +1 -0
- package/dist/core/actions/context.js.map +1 -0
- package/dist/core/actions/parse.js.map +1 -0
- package/dist/core/actions/plan.js.map +1 -0
- package/dist/core/actions/predicates.js.map +1 -0
- package/dist/core/actions/run-fold.js.map +1 -0
- package/dist/core/actions/template.js.map +1 -0
- package/dist/core/cli/args.js.map +1 -0
- package/dist/core/coerce.js.map +1 -0
- package/dist/core/credential/account-id.js.map +1 -0
- package/dist/core/credential/adapter-config.js.map +1 -0
- package/dist/core/credential/availability.js.map +1 -0
- package/dist/core/credential/extract.js.map +1 -0
- package/dist/core/credential/fake-creds.js.map +1 -0
- package/dist/core/credential/identity.js.map +1 -0
- package/dist/core/credential/shape.js.map +1 -0
- package/dist/core/credential/strings.js.map +1 -0
- package/dist/core/doctor/checks.js.map +1 -0
- package/dist/core/git/result.js.map +1 -0
- package/dist/core/http/decisions.js.map +1 -0
- package/dist/core/http/render.js.map +1 -0
- package/dist/core/http/routes.js.map +1 -0
- package/dist/core/http/views.js.map +1 -0
- package/dist/core/image/managed-image.js.map +1 -0
- package/dist/core/issue/file.js.map +1 -0
- package/dist/core/issue/parse.js.map +1 -0
- package/dist/core/mcp/dispatch.js.map +1 -0
- package/dist/core/mcp/post-move.js.map +1 -0
- package/dist/core/mcp/protocol.js.map +1 -0
- package/dist/core/mcp/url.js.map +1 -0
- package/dist/core/path.js.map +1 -0
- package/dist/core/reconcile/image-decide.js.map +1 -0
- package/dist/core/reconcile/ledger.js.map +1 -0
- package/dist/core/reconcile/pr-classify.js.map +1 -0
- package/dist/core/reconcile/pr-decide.js.map +1 -0
- package/dist/core/reconcile/pr-loop.js.map +1 -0
- package/dist/core/reconcile/pr-notes.js.map +1 -0
- package/dist/core/reconcile/vm-decide.js.map +1 -0
- package/dist/core/reconcile/vm-reap.js.map +1 -0
- package/dist/core/reconcile/workspace-decide.js.map +1 -0
- package/dist/core/runlog/summary.js.map +1 -0
- package/dist/core/runner/dispatch-config.js.map +1 -0
- package/dist/core/runner/injection.js.map +1 -0
- package/dist/core/runner/mise.js.map +1 -0
- package/dist/core/runner/prompt.js.map +1 -0
- package/dist/core/runner/turn.js.map +1 -0
- package/dist/core/runner/vm-plan.js.map +1 -0
- package/dist/core/schedule/admission.js.map +1 -0
- package/dist/core/schedule/circuit-breaker.js.map +1 -0
- package/dist/core/schedule/eligibility.js.map +1 -0
- package/dist/core/schedule/reconcile-issue.js.map +1 -0
- package/dist/core/schedule/retry.js.map +1 -0
- package/dist/core/schedule/sleep-cycle.js.map +1 -0
- package/dist/core/schedule/slots.js.map +1 -0
- package/dist/core/schedule/tick.js.map +1 -0
- package/dist/core/schedule/token-fold.js.map +1 -0
- package/dist/core/state-resolve.js.map +1 -0
- package/dist/core/vm-guards.js.map +1 -0
- package/dist/core/workflow/derive.js.map +1 -0
- package/dist/core/workflow/parse.js.map +1 -0
- package/dist/core/workflow/prompt-probe.js.map +1 -0
- package/dist/core/workflow/validate.js.map +1 -0
- package/dist/core/workspace-key.js.map +1 -0
- package/dist/shell/actions-runner.js.map +1 -0
- package/dist/shell/adapter/adapter-registry.js.map +1 -0
- package/dist/shell/adapter/clock-random.js.map +1 -0
- package/dist/shell/adapter/gondolin-dispatch-helpers.js.map +1 -0
- package/dist/shell/adapter/gondolin-dispatch.js.map +1 -0
- package/dist/shell/adapter/gondolin-image-converter.js.map +1 -0
- package/dist/shell/adapter/gondolin-image-fetch.js.map +1 -0
- package/dist/shell/adapter/launcher-asset.js.map +1 -0
- package/dist/shell/adapter/mise-config-asset.js.map +1 -0
- package/dist/shell/adapter/workflow-loader.js.map +1 -0
- package/dist/shell/cli/doctor.js.map +1 -0
- package/dist/shell/effect-interpreter-families.js.map +1 -0
- package/dist/shell/effect-interpreter.js.map +1 -0
- package/dist/shell/interp/acp-frame.js.map +1 -0
- package/dist/shell/interp/acp-ws-conn.js.map +1 -0
- package/dist/shell/interp/acp-ws-frames.js.map +1 -0
- package/dist/shell/interp/acp-ws.js.map +1 -0
- package/dist/shell/interp/acp.js.map +1 -0
- package/dist/shell/interp/credential-defaults.js.map +1 -0
- package/dist/shell/interp/credential-hooks.js.map +1 -0
- package/dist/shell/interp/credential-registry.js.map +1 -0
- package/dist/shell/interp/credential.js.map +1 -0
- package/dist/shell/interp/gh.js.map +1 -0
- package/dist/shell/interp/git.js.map +1 -0
- package/dist/shell/interp/log.js.map +1 -0
- package/dist/shell/interp/process.js.map +1 -0
- package/dist/shell/interp/runlog.js.map +1 -0
- package/dist/shell/interp/timer.js.map +1 -0
- package/dist/shell/interp/tracker-disk.js.map +1 -0
- package/dist/shell/interp/tracker-parse.js.map +1 -0
- package/dist/shell/interp/tracker-scan.js.map +1 -0
- package/dist/shell/interp/tracker-write.js.map +1 -0
- package/dist/shell/interp/tracker.js.map +1 -0
- package/dist/shell/interp/tty.js.map +1 -0
- package/dist/shell/interp/vm.js.map +1 -0
- package/dist/shell/interp/workspace.js.map +1 -0
- package/dist/shell/main-acp.js.map +1 -0
- package/dist/shell/main-adapters.js.map +1 -0
- package/dist/shell/main-credential.js.map +1 -0
- package/dist/shell/main-doctor.js.map +1 -0
- package/dist/shell/main-entry.js.map +1 -0
- package/dist/shell/main-http-csrf.js.map +1 -0
- package/dist/shell/main-http-handler.js.map +1 -0
- package/dist/shell/main-http-mcp.js.map +1 -0
- package/dist/shell/main-http-views.js.map +1 -0
- package/dist/shell/main-http.js.map +1 -0
- package/dist/shell/main-loops.js.map +1 -0
- package/dist/shell/main-mcp.js.map +1 -0
- package/dist/shell/main-orchestrator.js.map +1 -0
- package/dist/shell/main-preflight.js.map +1 -0
- package/dist/shell/main-reconcilers-helpers.js.map +1 -0
- package/dist/shell/main-reconcilers-pr.js.map +1 -0
- package/dist/shell/main-reconcilers.js.map +1 -0
- package/dist/shell/main-runner.js.map +1 -0
- package/dist/shell/main-scaffold.js.map +1 -0
- package/dist/shell/main-shutdown.js.map +1 -0
- package/dist/shell/main-startup.js.map +1 -0
- package/dist/shell/main-substrates.js.map +1 -0
- package/dist/shell/main.js.map +1 -0
- package/dist/shell/orchestrator-feedback.js.map +1 -0
- package/dist/shell/orchestrator-image.js.map +1 -0
- package/dist/shell/orchestrator-loop.js.map +1 -0
- package/dist/shell/orchestrator-reconcile.js.map +1 -0
- package/dist/shell/reconciler-loop.js.map +1 -0
- package/dist/shell/runner-loop-turn.js.map +1 -0
- package/dist/shell/runner-loop.js.map +1 -0
- package/dist/shell/server/http.js.map +1 -0
- package/dist/shell/server/mcp-runtime-effects.js.map +1 -0
- package/dist/shell/server/mcp-runtime.js.map +1 -0
- package/dist/shell/workspace-key.js.map +1 -0
- package/dist/types/acp.js.map +1 -0
- package/dist/types/actions/plan.js.map +1 -0
- package/dist/types/actions/predicates.js.map +1 -0
- package/dist/types/actions/run-fold.js.map +1 -0
- package/dist/types/actions.js.map +1 -0
- package/dist/types/adapter/clock-random.js.map +1 -0
- package/dist/types/adapter/gondolin-image-converter.js.map +1 -0
- package/dist/types/adapter/gondolin-image-fetch.js.map +1 -0
- package/dist/types/adapter/workflow-loader.js.map +1 -0
- package/dist/types/cli/args.js.map +1 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/credential-interp.js.map +1 -0
- package/dist/types/credentials.js.map +1 -0
- package/dist/types/doctor.js.map +1 -0
- package/dist/types/domain.js.map +1 -0
- package/dist/types/effect.js.map +1 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/http/decisions.js.map +1 -0
- package/dist/types/http/render.js.map +1 -0
- package/dist/types/http/views.js.map +1 -0
- package/dist/types/http.js.map +1 -0
- package/dist/types/image/managed-image.js.map +1 -0
- package/dist/types/interp/effect-interpreter.js.map +1 -0
- package/dist/types/interp/tracker.js.map +1 -0
- package/dist/types/issue/file.js.map +1 -0
- package/dist/types/issue/parse.js.map +1 -0
- package/dist/types/main-acp.js.map +1 -0
- package/dist/types/main-adapters.js.map +1 -0
- package/dist/types/main-credential.js.map +1 -0
- package/dist/types/main-doctor.js.map +1 -0
- package/dist/types/main-http-handler.js.map +1 -0
- package/dist/types/main-http.js.map +1 -0
- package/dist/types/main-loops.js.map +1 -0
- package/dist/types/main-mcp.js.map +1 -0
- package/dist/types/main-orchestrator.js.map +1 -0
- package/dist/types/main-reconcilers.js.map +1 -0
- package/dist/types/main-runner.js.map +1 -0
- package/dist/types/main-startup.js.map +1 -0
- package/dist/types/main-substrates.js.map +1 -0
- package/dist/types/mcp/dispatch.js.map +1 -0
- package/dist/types/mcp/post-move.js.map +1 -0
- package/dist/types/mcp.js.map +1 -0
- package/dist/types/ports.js.map +1 -0
- package/dist/types/reconcile/image-decide.js.map +1 -0
- package/dist/types/reconcile/ledger.js.map +1 -0
- package/dist/types/reconcile/pr-loop.js.map +1 -0
- package/dist/types/reconcile/vm-reap.js.map +1 -0
- package/dist/types/reconcile/workspace-decide.js.map +1 -0
- package/dist/types/reconcile.js.map +1 -0
- package/dist/types/runlog.js.map +1 -0
- package/dist/types/runner/actions-runner.js.map +1 -0
- package/dist/types/runner/gondolin-dispatch.js.map +1 -0
- package/dist/types/runner/injection.js.map +1 -0
- package/dist/types/runner/runner-loop.js.map +1 -0
- package/dist/types/runner/turn.js.map +1 -0
- package/dist/types/runner/vm-plan.js.map +1 -0
- package/dist/types/runtime.js.map +1 -0
- package/dist/types/schedule/admission.js.map +1 -0
- package/dist/types/schedule/circuit-breaker.js.map +1 -0
- package/dist/types/schedule/eligibility.js.map +1 -0
- package/dist/types/schedule/orchestrator-loop.js.map +1 -0
- package/dist/types/schedule/sleep-cycle.js.map +1 -0
- package/dist/types/schedule/slots.js.map +1 -0
- package/dist/types/schedule/tick.js.map +1 -0
- package/dist/types/server/mcp-runtime.js.map +1 -0
- package/dist/types/workflow/parse.js.map +1 -0
- package/package.json +3 -3
- package/scripts/postinstall.mjs +24 -1
- package/dist/src/bin/symphony.js.map +0 -1
- package/dist/src/core/actions/context.js.map +0 -1
- package/dist/src/core/actions/parse.js.map +0 -1
- package/dist/src/core/actions/plan.js.map +0 -1
- package/dist/src/core/actions/predicates.js.map +0 -1
- package/dist/src/core/actions/run-fold.js.map +0 -1
- package/dist/src/core/actions/template.js.map +0 -1
- package/dist/src/core/cli/args.js.map +0 -1
- package/dist/src/core/coerce.js.map +0 -1
- package/dist/src/core/credential/account-id.js.map +0 -1
- package/dist/src/core/credential/adapter-config.js.map +0 -1
- package/dist/src/core/credential/availability.js.map +0 -1
- package/dist/src/core/credential/extract.js.map +0 -1
- package/dist/src/core/credential/fake-creds.js.map +0 -1
- package/dist/src/core/credential/identity.js.map +0 -1
- package/dist/src/core/credential/shape.js.map +0 -1
- package/dist/src/core/credential/strings.js.map +0 -1
- package/dist/src/core/doctor/checks.js.map +0 -1
- package/dist/src/core/git/result.js.map +0 -1
- package/dist/src/core/http/decisions.js.map +0 -1
- package/dist/src/core/http/render.js.map +0 -1
- package/dist/src/core/http/routes.js.map +0 -1
- package/dist/src/core/http/views.js.map +0 -1
- package/dist/src/core/image/managed-image.js.map +0 -1
- package/dist/src/core/issue/file.js.map +0 -1
- package/dist/src/core/issue/parse.js.map +0 -1
- package/dist/src/core/mcp/dispatch.js.map +0 -1
- package/dist/src/core/mcp/post-move.js.map +0 -1
- package/dist/src/core/mcp/protocol.js.map +0 -1
- package/dist/src/core/mcp/url.js.map +0 -1
- package/dist/src/core/path.js.map +0 -1
- package/dist/src/core/reconcile/image-decide.js.map +0 -1
- package/dist/src/core/reconcile/ledger.js.map +0 -1
- package/dist/src/core/reconcile/pr-classify.js.map +0 -1
- package/dist/src/core/reconcile/pr-decide.js.map +0 -1
- package/dist/src/core/reconcile/pr-loop.js.map +0 -1
- package/dist/src/core/reconcile/pr-notes.js.map +0 -1
- package/dist/src/core/reconcile/vm-decide.js.map +0 -1
- package/dist/src/core/reconcile/vm-reap.js.map +0 -1
- package/dist/src/core/reconcile/workspace-decide.js.map +0 -1
- package/dist/src/core/runlog/summary.js.map +0 -1
- package/dist/src/core/runner/dispatch-config.js.map +0 -1
- package/dist/src/core/runner/injection.js.map +0 -1
- package/dist/src/core/runner/mise.js.map +0 -1
- package/dist/src/core/runner/prompt.js.map +0 -1
- package/dist/src/core/runner/turn.js.map +0 -1
- package/dist/src/core/runner/vm-plan.js.map +0 -1
- package/dist/src/core/schedule/admission.js.map +0 -1
- package/dist/src/core/schedule/circuit-breaker.js.map +0 -1
- package/dist/src/core/schedule/eligibility.js.map +0 -1
- package/dist/src/core/schedule/reconcile-issue.js.map +0 -1
- package/dist/src/core/schedule/retry.js.map +0 -1
- package/dist/src/core/schedule/sleep-cycle.js.map +0 -1
- package/dist/src/core/schedule/slots.js.map +0 -1
- package/dist/src/core/schedule/tick.js.map +0 -1
- package/dist/src/core/schedule/token-fold.js.map +0 -1
- package/dist/src/core/state-resolve.js.map +0 -1
- package/dist/src/core/vm-guards.js.map +0 -1
- package/dist/src/core/workflow/derive.js.map +0 -1
- package/dist/src/core/workflow/parse.js.map +0 -1
- package/dist/src/core/workflow/prompt-probe.js.map +0 -1
- package/dist/src/core/workflow/validate.js.map +0 -1
- package/dist/src/core/workspace-key.js.map +0 -1
- package/dist/src/shell/actions-runner.js.map +0 -1
- package/dist/src/shell/adapter/adapter-registry.js.map +0 -1
- package/dist/src/shell/adapter/clock-random.js.map +0 -1
- package/dist/src/shell/adapter/gondolin-dispatch-helpers.js.map +0 -1
- package/dist/src/shell/adapter/gondolin-dispatch.js.map +0 -1
- package/dist/src/shell/adapter/gondolin-image-converter.js.map +0 -1
- package/dist/src/shell/adapter/gondolin-image-fetch.js.map +0 -1
- package/dist/src/shell/adapter/launcher-asset.js.map +0 -1
- package/dist/src/shell/adapter/mise-config-asset.js.map +0 -1
- package/dist/src/shell/adapter/workflow-loader.js.map +0 -1
- package/dist/src/shell/cli/doctor.js.map +0 -1
- package/dist/src/shell/effect-interpreter-families.js.map +0 -1
- package/dist/src/shell/effect-interpreter.js.map +0 -1
- package/dist/src/shell/interp/acp-frame.js.map +0 -1
- package/dist/src/shell/interp/acp-ws-conn.js.map +0 -1
- package/dist/src/shell/interp/acp-ws-frames.js.map +0 -1
- package/dist/src/shell/interp/acp-ws.js.map +0 -1
- package/dist/src/shell/interp/acp.js.map +0 -1
- package/dist/src/shell/interp/credential-defaults.js.map +0 -1
- package/dist/src/shell/interp/credential-hooks.js.map +0 -1
- package/dist/src/shell/interp/credential-registry.js.map +0 -1
- package/dist/src/shell/interp/credential.js.map +0 -1
- package/dist/src/shell/interp/gh.js.map +0 -1
- package/dist/src/shell/interp/git.js.map +0 -1
- package/dist/src/shell/interp/log.js.map +0 -1
- package/dist/src/shell/interp/process.js.map +0 -1
- package/dist/src/shell/interp/runlog.js.map +0 -1
- package/dist/src/shell/interp/timer.js.map +0 -1
- package/dist/src/shell/interp/tracker-disk.js.map +0 -1
- package/dist/src/shell/interp/tracker-parse.js.map +0 -1
- package/dist/src/shell/interp/tracker-scan.js.map +0 -1
- package/dist/src/shell/interp/tracker-write.js.map +0 -1
- package/dist/src/shell/interp/tracker.js.map +0 -1
- package/dist/src/shell/interp/tty.js.map +0 -1
- package/dist/src/shell/interp/vm.js.map +0 -1
- package/dist/src/shell/interp/workspace.js.map +0 -1
- package/dist/src/shell/main-acp.js.map +0 -1
- package/dist/src/shell/main-adapters.js.map +0 -1
- package/dist/src/shell/main-credential.js.map +0 -1
- package/dist/src/shell/main-doctor.js.map +0 -1
- package/dist/src/shell/main-entry.js.map +0 -1
- package/dist/src/shell/main-http-csrf.js.map +0 -1
- package/dist/src/shell/main-http-handler.js.map +0 -1
- package/dist/src/shell/main-http-mcp.js.map +0 -1
- package/dist/src/shell/main-http-views.js.map +0 -1
- package/dist/src/shell/main-http.js.map +0 -1
- package/dist/src/shell/main-loops.js.map +0 -1
- package/dist/src/shell/main-mcp.js.map +0 -1
- package/dist/src/shell/main-orchestrator.js.map +0 -1
- package/dist/src/shell/main-preflight.js.map +0 -1
- package/dist/src/shell/main-reconcilers-helpers.js.map +0 -1
- package/dist/src/shell/main-reconcilers-pr.js.map +0 -1
- package/dist/src/shell/main-reconcilers.js.map +0 -1
- package/dist/src/shell/main-runner.js.map +0 -1
- package/dist/src/shell/main-scaffold.js.map +0 -1
- package/dist/src/shell/main-shutdown.js.map +0 -1
- package/dist/src/shell/main-startup.js.map +0 -1
- package/dist/src/shell/main-substrates.js.map +0 -1
- package/dist/src/shell/main.js.map +0 -1
- package/dist/src/shell/orchestrator-feedback.js.map +0 -1
- package/dist/src/shell/orchestrator-image.js.map +0 -1
- package/dist/src/shell/orchestrator-loop.js.map +0 -1
- package/dist/src/shell/orchestrator-reconcile.js.map +0 -1
- package/dist/src/shell/reconciler-loop.js.map +0 -1
- package/dist/src/shell/runner-loop-turn.js.map +0 -1
- package/dist/src/shell/runner-loop.js.map +0 -1
- package/dist/src/shell/server/http.js.map +0 -1
- package/dist/src/shell/server/mcp-runtime-effects.js.map +0 -1
- package/dist/src/shell/server/mcp-runtime.js.map +0 -1
- package/dist/src/shell/workspace-key.js.map +0 -1
- package/dist/src/types/acp.js.map +0 -1
- package/dist/src/types/actions/plan.js.map +0 -1
- package/dist/src/types/actions/predicates.js.map +0 -1
- package/dist/src/types/actions/run-fold.js.map +0 -1
- package/dist/src/types/actions.js.map +0 -1
- package/dist/src/types/adapter/clock-random.js.map +0 -1
- package/dist/src/types/adapter/gondolin-image-converter.js.map +0 -1
- package/dist/src/types/adapter/gondolin-image-fetch.js.map +0 -1
- package/dist/src/types/adapter/workflow-loader.js.map +0 -1
- package/dist/src/types/cli/args.js.map +0 -1
- package/dist/src/types/config.js.map +0 -1
- package/dist/src/types/credential-interp.js.map +0 -1
- package/dist/src/types/credentials.js.map +0 -1
- package/dist/src/types/doctor.js.map +0 -1
- package/dist/src/types/domain.js.map +0 -1
- package/dist/src/types/effect.js.map +0 -1
- package/dist/src/types/errors.js.map +0 -1
- package/dist/src/types/http/decisions.js.map +0 -1
- package/dist/src/types/http/render.js.map +0 -1
- package/dist/src/types/http/views.js.map +0 -1
- package/dist/src/types/http.js.map +0 -1
- package/dist/src/types/image/managed-image.js.map +0 -1
- package/dist/src/types/interp/effect-interpreter.js.map +0 -1
- package/dist/src/types/interp/tracker.js.map +0 -1
- package/dist/src/types/issue/file.js.map +0 -1
- package/dist/src/types/issue/parse.js.map +0 -1
- package/dist/src/types/main-acp.js.map +0 -1
- package/dist/src/types/main-adapters.js.map +0 -1
- package/dist/src/types/main-credential.js.map +0 -1
- package/dist/src/types/main-doctor.js.map +0 -1
- package/dist/src/types/main-http-handler.js.map +0 -1
- package/dist/src/types/main-http.js.map +0 -1
- package/dist/src/types/main-loops.js.map +0 -1
- package/dist/src/types/main-mcp.js.map +0 -1
- package/dist/src/types/main-orchestrator.js.map +0 -1
- package/dist/src/types/main-reconcilers.js.map +0 -1
- package/dist/src/types/main-runner.js.map +0 -1
- package/dist/src/types/main-startup.js.map +0 -1
- package/dist/src/types/main-substrates.js.map +0 -1
- package/dist/src/types/mcp/dispatch.js.map +0 -1
- package/dist/src/types/mcp/post-move.js.map +0 -1
- package/dist/src/types/mcp.js.map +0 -1
- package/dist/src/types/ports.js.map +0 -1
- package/dist/src/types/reconcile/image-decide.js.map +0 -1
- package/dist/src/types/reconcile/ledger.js.map +0 -1
- package/dist/src/types/reconcile/pr-loop.js.map +0 -1
- package/dist/src/types/reconcile/vm-reap.js.map +0 -1
- package/dist/src/types/reconcile/workspace-decide.js.map +0 -1
- package/dist/src/types/reconcile.js.map +0 -1
- package/dist/src/types/runlog.js.map +0 -1
- package/dist/src/types/runner/actions-runner.js.map +0 -1
- package/dist/src/types/runner/gondolin-dispatch.js.map +0 -1
- package/dist/src/types/runner/injection.js.map +0 -1
- package/dist/src/types/runner/runner-loop.js.map +0 -1
- package/dist/src/types/runner/turn.js.map +0 -1
- package/dist/src/types/runner/vm-plan.js.map +0 -1
- package/dist/src/types/runtime.js.map +0 -1
- package/dist/src/types/schedule/admission.js.map +0 -1
- package/dist/src/types/schedule/circuit-breaker.js.map +0 -1
- package/dist/src/types/schedule/eligibility.js.map +0 -1
- package/dist/src/types/schedule/orchestrator-loop.js.map +0 -1
- package/dist/src/types/schedule/sleep-cycle.js.map +0 -1
- package/dist/src/types/schedule/slots.js.map +0 -1
- package/dist/src/types/schedule/tick.js.map +0 -1
- package/dist/src/types/server/mcp-runtime.js.map +0 -1
- package/dist/src/types/workflow/parse.js.map +0 -1
- package/dist/tests/core/account-id.test.js +0 -35
- package/dist/tests/core/account-id.test.js.map +0 -1
- package/dist/tests/core/actions-parse.test.js +0 -176
- package/dist/tests/core/actions-parse.test.js.map +0 -1
- package/dist/tests/core/adapter-config.test.js +0 -133
- package/dist/tests/core/adapter-config.test.js.map +0 -1
- package/dist/tests/core/admission.test.js +0 -215
- package/dist/tests/core/admission.test.js.map +0 -1
- package/dist/tests/core/args.test.js +0 -132
- package/dist/tests/core/args.test.js.map +0 -1
- package/dist/tests/core/availability.test.js +0 -62
- package/dist/tests/core/availability.test.js.map +0 -1
- package/dist/tests/core/checks.test.js +0 -395
- package/dist/tests/core/checks.test.js.map +0 -1
- package/dist/tests/core/circuit-breaker.test.js +0 -172
- package/dist/tests/core/circuit-breaker.test.js.map +0 -1
- package/dist/tests/core/coerce.test.js +0 -87
- package/dist/tests/core/coerce.test.js.map +0 -1
- package/dist/tests/core/context.test.js +0 -228
- package/dist/tests/core/context.test.js.map +0 -1
- package/dist/tests/core/decisions.test.js +0 -310
- package/dist/tests/core/decisions.test.js.map +0 -1
- package/dist/tests/core/derive.test.js +0 -205
- package/dist/tests/core/derive.test.js.map +0 -1
- package/dist/tests/core/dispatch-config.test.js +0 -164
- package/dist/tests/core/dispatch-config.test.js.map +0 -1
- package/dist/tests/core/dispatch.test.js +0 -302
- package/dist/tests/core/dispatch.test.js.map +0 -1
- package/dist/tests/core/eligibility.test.js +0 -163
- package/dist/tests/core/eligibility.test.js.map +0 -1
- package/dist/tests/core/extract.test.js +0 -139
- package/dist/tests/core/extract.test.js.map +0 -1
- package/dist/tests/core/fake-creds.test.js +0 -134
- package/dist/tests/core/fake-creds.test.js.map +0 -1
- package/dist/tests/core/file.test.js +0 -197
- package/dist/tests/core/file.test.js.map +0 -1
- package/dist/tests/core/git-result.test.js +0 -113
- package/dist/tests/core/git-result.test.js.map +0 -1
- package/dist/tests/core/identity.test.js +0 -180
- package/dist/tests/core/identity.test.js.map +0 -1
- package/dist/tests/core/image-decide.test.js +0 -59
- package/dist/tests/core/image-decide.test.js.map +0 -1
- package/dist/tests/core/injection.test.js +0 -163
- package/dist/tests/core/injection.test.js.map +0 -1
- package/dist/tests/core/ledger.test.js +0 -218
- package/dist/tests/core/ledger.test.js.map +0 -1
- package/dist/tests/core/managed-image.test.js +0 -68
- package/dist/tests/core/managed-image.test.js.map +0 -1
- package/dist/tests/core/mise.test.js +0 -138
- package/dist/tests/core/mise.test.js.map +0 -1
- package/dist/tests/core/parse.test.js +0 -174
- package/dist/tests/core/parse.test.js.map +0 -1
- package/dist/tests/core/path.test.js +0 -50
- package/dist/tests/core/path.test.js.map +0 -1
- package/dist/tests/core/plan.test.js +0 -218
- package/dist/tests/core/plan.test.js.map +0 -1
- package/dist/tests/core/post-move.test.js +0 -162
- package/dist/tests/core/post-move.test.js.map +0 -1
- package/dist/tests/core/pr-classify.test.js +0 -117
- package/dist/tests/core/pr-classify.test.js.map +0 -1
- package/dist/tests/core/pr-decide.test.js +0 -298
- package/dist/tests/core/pr-decide.test.js.map +0 -1
- package/dist/tests/core/pr-loop.test.js +0 -301
- package/dist/tests/core/pr-loop.test.js.map +0 -1
- package/dist/tests/core/pr-notes.test.js +0 -165
- package/dist/tests/core/pr-notes.test.js.map +0 -1
- package/dist/tests/core/predicates.test.js +0 -154
- package/dist/tests/core/predicates.test.js.map +0 -1
- package/dist/tests/core/prompt.test.js +0 -189
- package/dist/tests/core/prompt.test.js.map +0 -1
- package/dist/tests/core/protocol.test.js +0 -195
- package/dist/tests/core/protocol.test.js.map +0 -1
- package/dist/tests/core/reconcile-issue.test.js +0 -116
- package/dist/tests/core/reconcile-issue.test.js.map +0 -1
- package/dist/tests/core/render.test.js +0 -549
- package/dist/tests/core/render.test.js.map +0 -1
- package/dist/tests/core/retry.test.js +0 -186
- package/dist/tests/core/retry.test.js.map +0 -1
- package/dist/tests/core/routes.test.js +0 -247
- package/dist/tests/core/routes.test.js.map +0 -1
- package/dist/tests/core/run-fold.test.js +0 -299
- package/dist/tests/core/run-fold.test.js.map +0 -1
- package/dist/tests/core/shape.test.js +0 -185
- package/dist/tests/core/shape.test.js.map +0 -1
- package/dist/tests/core/sleep-cycle.test.js +0 -150
- package/dist/tests/core/sleep-cycle.test.js.map +0 -1
- package/dist/tests/core/slots.test.js +0 -201
- package/dist/tests/core/slots.test.js.map +0 -1
- package/dist/tests/core/state-resolve.test.js +0 -80
- package/dist/tests/core/state-resolve.test.js.map +0 -1
- package/dist/tests/core/summary.test.js +0 -200
- package/dist/tests/core/summary.test.js.map +0 -1
- package/dist/tests/core/template.test.js +0 -116
- package/dist/tests/core/template.test.js.map +0 -1
- package/dist/tests/core/tick.test.js +0 -558
- package/dist/tests/core/tick.test.js.map +0 -1
- package/dist/tests/core/token-fold.test.js +0 -176
- package/dist/tests/core/token-fold.test.js.map +0 -1
- package/dist/tests/core/turn.test.js +0 -388
- package/dist/tests/core/turn.test.js.map +0 -1
- package/dist/tests/core/url.test.js +0 -118
- package/dist/tests/core/url.test.js.map +0 -1
- package/dist/tests/core/validate.test.js +0 -247
- package/dist/tests/core/validate.test.js.map +0 -1
- package/dist/tests/core/views.test.js +0 -252
- package/dist/tests/core/views.test.js.map +0 -1
- package/dist/tests/core/vm-decide.test.js +0 -110
- package/dist/tests/core/vm-decide.test.js.map +0 -1
- package/dist/tests/core/vm-guards.test.js +0 -153
- package/dist/tests/core/vm-guards.test.js.map +0 -1
- package/dist/tests/core/vm-plan.test.js +0 -332
- package/dist/tests/core/vm-plan.test.js.map +0 -1
- package/dist/tests/core/vm-reap.test.js +0 -196
- package/dist/tests/core/vm-reap.test.js.map +0 -1
- package/dist/tests/core/workflow-parse.test.js +0 -493
- package/dist/tests/core/workflow-parse.test.js.map +0 -1
- package/dist/tests/core/workspace-decide.test.js +0 -236
- package/dist/tests/core/workspace-decide.test.js.map +0 -1
- package/dist/tests/helpers/fixtures.js +0 -167
- package/dist/tests/helpers/fixtures.js.map +0 -1
- package/dist/tests/shell/acp-substrate.test.js +0 -101
- package/dist/tests/shell/acp-substrate.test.js.map +0 -1
- package/dist/tests/shell/actions-runner-push.test.js +0 -203
- package/dist/tests/shell/actions-runner-push.test.js.map +0 -1
- package/dist/tests/shell/credential-hooks.test.js +0 -36
- package/dist/tests/shell/credential-hooks.test.js.map +0 -1
- package/dist/tests/shell/credential-registry.test.js +0 -165
- package/dist/tests/shell/credential-registry.test.js.map +0 -1
- package/dist/tests/shell/credential-substrate.test.js +0 -179
- package/dist/tests/shell/credential-substrate.test.js.map +0 -1
- package/dist/tests/shell/dockerfile-mise-pin.test.js +0 -51
- package/dist/tests/shell/dockerfile-mise-pin.test.js.map +0 -1
- package/dist/tests/shell/doctor.test.js +0 -101
- package/dist/tests/shell/doctor.test.js.map +0 -1
- package/dist/tests/shell/effect-vm-create.test.js +0 -52
- package/dist/tests/shell/effect-vm-create.test.js.map +0 -1
- package/dist/tests/shell/gh-port.test.js +0 -63
- package/dist/tests/shell/gh-port.test.js.map +0 -1
- package/dist/tests/shell/gondolin-dispatch-guard.test.js +0 -144
- package/dist/tests/shell/gondolin-dispatch-guard.test.js.map +0 -1
- package/dist/tests/shell/gondolin-dispatch-shquote.test.js +0 -168
- package/dist/tests/shell/gondolin-dispatch-shquote.test.js.map +0 -1
- package/dist/tests/shell/gondolin-image-converter.test.js +0 -208
- package/dist/tests/shell/gondolin-image-converter.test.js.map +0 -1
- package/dist/tests/shell/gondolin-image-fetch.test.js +0 -93
- package/dist/tests/shell/gondolin-image-fetch.test.js.map +0 -1
- package/dist/tests/shell/http-handler.test.js +0 -608
- package/dist/tests/shell/http-handler.test.js.map +0 -1
- package/dist/tests/shell/http-server.test.js +0 -53
- package/dist/tests/shell/http-server.test.js.map +0 -1
- package/dist/tests/shell/mcp-runtime.test.js +0 -366
- package/dist/tests/shell/mcp-runtime.test.js.map +0 -1
- package/dist/tests/shell/mise-config-asset.test.js +0 -87
- package/dist/tests/shell/mise-config-asset.test.js.map +0 -1
- package/dist/tests/shell/orchestrator-loop.test.js +0 -583
- package/dist/tests/shell/orchestrator-loop.test.js.map +0 -1
- package/dist/tests/shell/reconciler-passes.test.js +0 -314
- package/dist/tests/shell/reconciler-passes.test.js.map +0 -1
- package/dist/tests/shell/runner-loop-turn.test.js +0 -97
- package/dist/tests/shell/runner-loop-turn.test.js.map +0 -1
- package/dist/tests/shell/runner-slice.test.js +0 -536
- package/dist/tests/shell/runner-slice.test.js.map +0 -1
- package/dist/tests/shell/scaffold.test.js +0 -65
- package/dist/tests/shell/scaffold.test.js.map +0 -1
- package/dist/tests/shell/tick-config.test.js +0 -83
- package/dist/tests/shell/tick-config.test.js.map +0 -1
- package/dist/tests/shell/tracker-parse-dates.test.js +0 -44
- package/dist/tests/shell/tracker-parse-dates.test.js.map +0 -1
- package/dist/tests/shell/tracker-write-issue.test.js +0 -154
- package/dist/tests/shell/tracker-write-issue.test.js.map +0 -1
- package/dist/tests/shell/workflow-prompt-split.test.js +0 -208
- package/dist/tests/shell/workflow-prompt-split.test.js.map +0 -1
- package/dist/tests/shell/workspace-live-config.test.js +0 -140
- package/dist/tests/shell/workspace-live-config.test.js.map +0 -1
- /package/dist/{src/bin → bin}/symphony.js +0 -0
- /package/dist/{src/core → core}/actions/context.js +0 -0
- /package/dist/{src/core → core}/actions/parse.js +0 -0
- /package/dist/{src/core → core}/actions/plan.js +0 -0
- /package/dist/{src/core → core}/actions/predicates.js +0 -0
- /package/dist/{src/core → core}/actions/run-fold.js +0 -0
- /package/dist/{src/core → core}/actions/template.js +0 -0
- /package/dist/{src/core → core}/cli/args.js +0 -0
- /package/dist/{src/core → core}/coerce.js +0 -0
- /package/dist/{src/core → core}/credential/account-id.js +0 -0
- /package/dist/{src/core → core}/credential/adapter-config.js +0 -0
- /package/dist/{src/core → core}/credential/availability.js +0 -0
- /package/dist/{src/core → core}/credential/extract.js +0 -0
- /package/dist/{src/core → core}/credential/fake-creds.js +0 -0
- /package/dist/{src/core → core}/credential/identity.js +0 -0
- /package/dist/{src/core → core}/credential/shape.js +0 -0
- /package/dist/{src/core → core}/credential/strings.js +0 -0
- /package/dist/{src/core → core}/doctor/checks.js +0 -0
- /package/dist/{src/core → core}/git/result.js +0 -0
- /package/dist/{src/core → core}/http/decisions.js +0 -0
- /package/dist/{src/core → core}/http/render.js +0 -0
- /package/dist/{src/core → core}/http/routes.js +0 -0
- /package/dist/{src/core → core}/http/views.js +0 -0
- /package/dist/{src/core → core}/image/managed-image.js +0 -0
- /package/dist/{src/core → core}/issue/file.js +0 -0
- /package/dist/{src/core → core}/issue/parse.js +0 -0
- /package/dist/{src/core → core}/mcp/dispatch.js +0 -0
- /package/dist/{src/core → core}/mcp/post-move.js +0 -0
- /package/dist/{src/core → core}/mcp/protocol.js +0 -0
- /package/dist/{src/core → core}/mcp/url.js +0 -0
- /package/dist/{src/core → core}/path.js +0 -0
- /package/dist/{src/core → core}/reconcile/image-decide.js +0 -0
- /package/dist/{src/core → core}/reconcile/ledger.js +0 -0
- /package/dist/{src/core → core}/reconcile/pr-classify.js +0 -0
- /package/dist/{src/core → core}/reconcile/pr-decide.js +0 -0
- /package/dist/{src/core → core}/reconcile/pr-loop.js +0 -0
- /package/dist/{src/core → core}/reconcile/pr-notes.js +0 -0
- /package/dist/{src/core → core}/reconcile/vm-decide.js +0 -0
- /package/dist/{src/core → core}/reconcile/vm-reap.js +0 -0
- /package/dist/{src/core → core}/reconcile/workspace-decide.js +0 -0
- /package/dist/{src/core → core}/runlog/summary.js +0 -0
- /package/dist/{src/core → core}/runner/dispatch-config.js +0 -0
- /package/dist/{src/core → core}/runner/injection.js +0 -0
- /package/dist/{src/core → core}/runner/mise.js +0 -0
- /package/dist/{src/core → core}/runner/prompt.js +0 -0
- /package/dist/{src/core → core}/runner/turn.js +0 -0
- /package/dist/{src/core → core}/runner/vm-plan.js +0 -0
- /package/dist/{src/core → core}/schedule/admission.js +0 -0
- /package/dist/{src/core → core}/schedule/circuit-breaker.js +0 -0
- /package/dist/{src/core → core}/schedule/eligibility.js +0 -0
- /package/dist/{src/core → core}/schedule/reconcile-issue.js +0 -0
- /package/dist/{src/core → core}/schedule/retry.js +0 -0
- /package/dist/{src/core → core}/schedule/sleep-cycle.js +0 -0
- /package/dist/{src/core → core}/schedule/slots.js +0 -0
- /package/dist/{src/core → core}/schedule/tick.js +0 -0
- /package/dist/{src/core → core}/schedule/token-fold.js +0 -0
- /package/dist/{src/core → core}/state-resolve.js +0 -0
- /package/dist/{src/core → core}/vm-guards.js +0 -0
- /package/dist/{src/core → core}/workflow/derive.js +0 -0
- /package/dist/{src/core → core}/workflow/parse.js +0 -0
- /package/dist/{src/core → core}/workflow/prompt-probe.js +0 -0
- /package/dist/{src/core → core}/workflow/validate.js +0 -0
- /package/dist/{src/core → core}/workspace-key.js +0 -0
- /package/dist/{src/shell → shell}/actions-runner.js +0 -0
- /package/dist/{src/shell → shell}/adapter/adapter-registry.js +0 -0
- /package/dist/{src/shell → shell}/adapter/clock-random.js +0 -0
- /package/dist/{src/shell → shell}/adapter/gondolin-dispatch-helpers.js +0 -0
- /package/dist/{src/shell → shell}/adapter/gondolin-dispatch.js +0 -0
- /package/dist/{src/shell → shell}/adapter/gondolin-image-converter.js +0 -0
- /package/dist/{src/shell → shell}/adapter/gondolin-image-fetch.js +0 -0
- /package/dist/{src/shell → shell}/adapter/launcher-asset.js +0 -0
- /package/dist/{src/shell → shell}/adapter/mise-config-asset.js +0 -0
- /package/dist/{src/shell → shell}/adapter/workflow-loader.js +0 -0
- /package/dist/{src/shell → shell}/cli/doctor.js +0 -0
- /package/dist/{src/shell → shell}/effect-interpreter-families.js +0 -0
- /package/dist/{src/shell → shell}/effect-interpreter.js +0 -0
- /package/dist/{src/shell → shell}/interp/acp-frame.js +0 -0
- /package/dist/{src/shell → shell}/interp/acp-ws-conn.js +0 -0
- /package/dist/{src/shell → shell}/interp/acp-ws-frames.js +0 -0
- /package/dist/{src/shell → shell}/interp/acp-ws.js +0 -0
- /package/dist/{src/shell → shell}/interp/acp.js +0 -0
- /package/dist/{src/shell → shell}/interp/credential-defaults.js +0 -0
- /package/dist/{src/shell → shell}/interp/credential-hooks.js +0 -0
- /package/dist/{src/shell → shell}/interp/credential-registry.js +0 -0
- /package/dist/{src/shell → shell}/interp/credential.js +0 -0
- /package/dist/{src/shell → shell}/interp/gh.js +0 -0
- /package/dist/{src/shell → shell}/interp/git.js +0 -0
- /package/dist/{src/shell → shell}/interp/log.js +0 -0
- /package/dist/{src/shell → shell}/interp/process.js +0 -0
- /package/dist/{src/shell → shell}/interp/runlog.js +0 -0
- /package/dist/{src/shell → shell}/interp/timer.js +0 -0
- /package/dist/{src/shell → shell}/interp/tracker-disk.js +0 -0
- /package/dist/{src/shell → shell}/interp/tracker-parse.js +0 -0
- /package/dist/{src/shell → shell}/interp/tracker-scan.js +0 -0
- /package/dist/{src/shell → shell}/interp/tracker-write.js +0 -0
- /package/dist/{src/shell → shell}/interp/tracker.js +0 -0
- /package/dist/{src/shell → shell}/interp/tty.js +0 -0
- /package/dist/{src/shell → shell}/interp/vm.js +0 -0
- /package/dist/{src/shell → shell}/interp/workspace.js +0 -0
- /package/dist/{src/shell → shell}/main-acp.js +0 -0
- /package/dist/{src/shell → shell}/main-adapters.js +0 -0
- /package/dist/{src/shell → shell}/main-credential.js +0 -0
- /package/dist/{src/shell → shell}/main-doctor.js +0 -0
- /package/dist/{src/shell → shell}/main-entry.js +0 -0
- /package/dist/{src/shell → shell}/main-http-csrf.js +0 -0
- /package/dist/{src/shell → shell}/main-http-handler.js +0 -0
- /package/dist/{src/shell → shell}/main-http-mcp.js +0 -0
- /package/dist/{src/shell → shell}/main-http-views.js +0 -0
- /package/dist/{src/shell → shell}/main-http.js +0 -0
- /package/dist/{src/shell → shell}/main-loops.js +0 -0
- /package/dist/{src/shell → shell}/main-mcp.js +0 -0
- /package/dist/{src/shell → shell}/main-orchestrator.js +0 -0
- /package/dist/{src/shell → shell}/main-preflight.js +0 -0
- /package/dist/{src/shell → shell}/main-reconcilers-helpers.js +0 -0
- /package/dist/{src/shell → shell}/main-reconcilers-pr.js +0 -0
- /package/dist/{src/shell → shell}/main-reconcilers.js +0 -0
- /package/dist/{src/shell → shell}/main-runner.js +0 -0
- /package/dist/{src/shell → shell}/main-scaffold.js +0 -0
- /package/dist/{src/shell → shell}/main-shutdown.js +0 -0
- /package/dist/{src/shell → shell}/main-startup.js +0 -0
- /package/dist/{src/shell → shell}/main-substrates.js +0 -0
- /package/dist/{src/shell → shell}/main.js +0 -0
- /package/dist/{src/shell → shell}/orchestrator-feedback.js +0 -0
- /package/dist/{src/shell → shell}/orchestrator-image.js +0 -0
- /package/dist/{src/shell → shell}/orchestrator-loop.js +0 -0
- /package/dist/{src/shell → shell}/orchestrator-reconcile.js +0 -0
- /package/dist/{src/shell → shell}/reconciler-loop.js +0 -0
- /package/dist/{src/shell → shell}/runner-loop-turn.js +0 -0
- /package/dist/{src/shell → shell}/runner-loop.js +0 -0
- /package/dist/{src/shell → shell}/server/http.js +0 -0
- /package/dist/{src/shell → shell}/server/mcp-runtime-effects.js +0 -0
- /package/dist/{src/shell → shell}/server/mcp-runtime.js +0 -0
- /package/dist/{src/shell → shell}/workspace-key.js +0 -0
- /package/dist/{src/types → types}/acp.js +0 -0
- /package/dist/{src/types → types}/actions/plan.js +0 -0
- /package/dist/{src/types → types}/actions/predicates.js +0 -0
- /package/dist/{src/types → types}/actions/run-fold.js +0 -0
- /package/dist/{src/types → types}/actions.js +0 -0
- /package/dist/{src/types → types}/adapter/clock-random.js +0 -0
- /package/dist/{src/types → types}/adapter/gondolin-image-converter.js +0 -0
- /package/dist/{src/types → types}/adapter/gondolin-image-fetch.js +0 -0
- /package/dist/{src/types → types}/adapter/workflow-loader.js +0 -0
- /package/dist/{src/types → types}/cli/args.js +0 -0
- /package/dist/{src/types → types}/config.js +0 -0
- /package/dist/{src/types → types}/credential-interp.js +0 -0
- /package/dist/{src/types → types}/credentials.js +0 -0
- /package/dist/{src/types → types}/doctor.js +0 -0
- /package/dist/{src/types → types}/domain.js +0 -0
- /package/dist/{src/types → types}/effect.js +0 -0
- /package/dist/{src/types → types}/errors.js +0 -0
- /package/dist/{src/types → types}/http/decisions.js +0 -0
- /package/dist/{src/types → types}/http/render.js +0 -0
- /package/dist/{src/types → types}/http/views.js +0 -0
- /package/dist/{src/types → types}/http.js +0 -0
- /package/dist/{src/types → types}/image/managed-image.js +0 -0
- /package/dist/{src/types → types}/interp/effect-interpreter.js +0 -0
- /package/dist/{src/types → types}/interp/tracker.js +0 -0
- /package/dist/{src/types → types}/issue/file.js +0 -0
- /package/dist/{src/types → types}/issue/parse.js +0 -0
- /package/dist/{src/types → types}/main-acp.js +0 -0
- /package/dist/{src/types → types}/main-adapters.js +0 -0
- /package/dist/{src/types → types}/main-credential.js +0 -0
- /package/dist/{src/types → types}/main-doctor.js +0 -0
- /package/dist/{src/types → types}/main-http-handler.js +0 -0
- /package/dist/{src/types → types}/main-http.js +0 -0
- /package/dist/{src/types → types}/main-loops.js +0 -0
- /package/dist/{src/types → types}/main-mcp.js +0 -0
- /package/dist/{src/types → types}/main-orchestrator.js +0 -0
- /package/dist/{src/types → types}/main-reconcilers.js +0 -0
- /package/dist/{src/types → types}/main-runner.js +0 -0
- /package/dist/{src/types → types}/main-startup.js +0 -0
- /package/dist/{src/types → types}/main-substrates.js +0 -0
- /package/dist/{src/types → types}/mcp/dispatch.js +0 -0
- /package/dist/{src/types → types}/mcp/post-move.js +0 -0
- /package/dist/{src/types → types}/mcp.js +0 -0
- /package/dist/{src/types → types}/ports.js +0 -0
- /package/dist/{src/types → types}/reconcile/image-decide.js +0 -0
- /package/dist/{src/types → types}/reconcile/ledger.js +0 -0
- /package/dist/{src/types → types}/reconcile/pr-loop.js +0 -0
- /package/dist/{src/types → types}/reconcile/vm-reap.js +0 -0
- /package/dist/{src/types → types}/reconcile/workspace-decide.js +0 -0
- /package/dist/{src/types → types}/reconcile.js +0 -0
- /package/dist/{src/types → types}/runlog.js +0 -0
- /package/dist/{src/types → types}/runner/actions-runner.js +0 -0
- /package/dist/{src/types → types}/runner/gondolin-dispatch.js +0 -0
- /package/dist/{src/types → types}/runner/injection.js +0 -0
- /package/dist/{src/types → types}/runner/runner-loop.js +0 -0
- /package/dist/{src/types → types}/runner/turn.js +0 -0
- /package/dist/{src/types → types}/runner/vm-plan.js +0 -0
- /package/dist/{src/types → types}/runtime.js +0 -0
- /package/dist/{src/types → types}/schedule/admission.js +0 -0
- /package/dist/{src/types → types}/schedule/circuit-breaker.js +0 -0
- /package/dist/{src/types → types}/schedule/eligibility.js +0 -0
- /package/dist/{src/types → types}/schedule/orchestrator-loop.js +0 -0
- /package/dist/{src/types → types}/schedule/sleep-cycle.js +0 -0
- /package/dist/{src/types → types}/schedule/slots.js +0 -0
- /package/dist/{src/types → types}/schedule/tick.js +0 -0
- /package/dist/{src/types → types}/server/mcp-runtime.js +0 -0
- /package/dist/{src/types → types}/workflow/parse.js +0 -0
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
// Focused tests for the first-run scaffold writers (src/shell/main-scaffold.ts).
|
|
2
|
-
//
|
|
3
|
-
// Covers scaffoldSkill — the issue-filing skill installer that twins
|
|
4
|
-
// scaffoldWorkflow: it writes the bundled assets/skills/symphony-issues/SKILL.md
|
|
5
|
-
// asset into <projectDir>/.claude/skills/symphony-issues/, refuses to overwrite
|
|
6
|
-
// an existing one, and (being best-effort onboarding sugar) returns false
|
|
7
|
-
// without throwing so it can never abort the WORKFLOW scaffold or the relaunch.
|
|
8
|
-
import { test } from 'node:test';
|
|
9
|
-
import assert from 'node:assert/strict';
|
|
10
|
-
import { mkdtemp, mkdir, readFile, writeFile, rm } from 'node:fs/promises';
|
|
11
|
-
import { existsSync } from 'node:fs';
|
|
12
|
-
import os from 'node:os';
|
|
13
|
-
import path from 'node:path';
|
|
14
|
-
import { scaffoldSkill } from '../../src/shell/main-scaffold.js';
|
|
15
|
-
const SKILL_REL = path.join('.claude', 'skills', 'symphony-issues', 'SKILL.md');
|
|
16
|
-
async function withProjectDir(fn) {
|
|
17
|
-
const dir = await mkdtemp(path.join(os.tmpdir(), 'symphony-scaffold-'));
|
|
18
|
-
try {
|
|
19
|
-
await fn(dir);
|
|
20
|
-
}
|
|
21
|
-
finally {
|
|
22
|
-
await rm(dir, { recursive: true, force: true });
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
test('scaffoldSkill writes the bundled SKILL.md under .claude/skills/symphony-issues/', async () => {
|
|
26
|
-
await withProjectDir(async (dir) => {
|
|
27
|
-
const wrote = await scaffoldSkill(dir);
|
|
28
|
-
assert.equal(wrote, true, 'a fresh install returns true');
|
|
29
|
-
const skillPath = path.join(dir, SKILL_REL);
|
|
30
|
-
assert.ok(existsSync(skillPath), 'SKILL.md exists at the expected path');
|
|
31
|
-
const body = await readFile(skillPath, 'utf8');
|
|
32
|
-
// Resolved from the real bundled asset (validates the src/-layout resolution).
|
|
33
|
-
assert.match(body, /name: symphony-issues/, 'has the skill frontmatter name');
|
|
34
|
-
// Project-agnostic guard: must not leak this repo's own name into adopters.
|
|
35
|
-
assert.doesNotMatch(body, /smol-symphony/, 'is project-agnostic');
|
|
36
|
-
// Covers the durable content the issue requires.
|
|
37
|
-
assert.match(body, /Problem/);
|
|
38
|
-
assert.match(body, /allowed_paths/);
|
|
39
|
-
assert.match(body, /Acceptance/);
|
|
40
|
-
assert.match(body, /blocked_by/);
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
test('scaffoldSkill refuses to overwrite an existing skill (returns false, no throw)', async () => {
|
|
44
|
-
await withProjectDir(async (dir) => {
|
|
45
|
-
const skillPath = path.join(dir, SKILL_REL);
|
|
46
|
-
await mkdir(path.dirname(skillPath), { recursive: true });
|
|
47
|
-
await writeFile(skillPath, 'PRE-EXISTING SKILL — do not clobber\n', 'utf8');
|
|
48
|
-
// Best-effort: an already-present skill returns false WITHOUT throwing, so
|
|
49
|
-
// the caller (after a successful scaffoldWorkflow) is never aborted.
|
|
50
|
-
const wrote = await scaffoldSkill(dir);
|
|
51
|
-
assert.equal(wrote, false, 'an existing skill is left as-is and returns false');
|
|
52
|
-
const survived = await readFile(skillPath, 'utf8');
|
|
53
|
-
assert.match(survived, /PRE-EXISTING SKILL/, 'the existing skill content survived');
|
|
54
|
-
assert.doesNotMatch(survived, /name: symphony-issues/, 'no overwrite happened');
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
test('scaffoldSkill creates the nested .claude/skills tree when absent', async () => {
|
|
58
|
-
await withProjectDir(async (dir) => {
|
|
59
|
-
assert.ok(!existsSync(path.join(dir, '.claude')), 'starts with no .claude dir');
|
|
60
|
-
const wrote = await scaffoldSkill(dir);
|
|
61
|
-
assert.equal(wrote, true);
|
|
62
|
-
assert.ok(existsSync(path.join(dir, SKILL_REL)), 'mkdir -p created the full path');
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
//# sourceMappingURL=scaffold.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.test.js","sourceRoot":"","sources":["../../../tests/shell/scaffold.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
// Tests for the composition-root `buildTickConfig` projection (§4a consolidation):
|
|
2
|
-
// it now derives the active/terminal role sets + the holding-state pick via the
|
|
3
|
-
// CANONICAL core fns (injected on `core`) instead of re-scanning the states map
|
|
4
|
-
// by hand. The REAL core fns are wired here (the same ones main.ts injects), so
|
|
5
|
-
// these assertions exercise the genuine consolidation — including the throwing
|
|
6
|
-
// `pickHoldingState` → `holdingState: null` mapping.
|
|
7
|
-
import { test } from 'node:test';
|
|
8
|
-
import assert from 'node:assert/strict';
|
|
9
|
-
import { buildTickConfig } from '../../src/shell/main-orchestrator.js';
|
|
10
|
-
import { activeStateNames, terminalStateNames, pickHoldingState } from '../../src/core/issue/parse.js';
|
|
11
|
-
import { deriveSpawnRouting } from '../../src/core/workflow/derive.js';
|
|
12
|
-
import { makeCoreServiceConfig } from '../helpers/fixtures.js';
|
|
13
|
-
// The injected core bundle slice buildTickConfig consumes — the REAL core fns.
|
|
14
|
-
const CORE = { deriveSpawnRouting, activeStateNames, terminalStateNames, pickHoldingState };
|
|
15
|
-
function makeCfg(states) {
|
|
16
|
-
return makeCoreServiceConfig({
|
|
17
|
-
tracker: { states },
|
|
18
|
-
agent: {
|
|
19
|
-
max_concurrent_agents: 4,
|
|
20
|
-
max_turns: 42,
|
|
21
|
-
max_retry_backoff_ms: 5000,
|
|
22
|
-
memory_admission_enabled: true,
|
|
23
|
-
host_memory_reserve_mib: 256,
|
|
24
|
-
circuit_breaker_threshold: 3,
|
|
25
|
-
},
|
|
26
|
-
acp: { model: 'sonnet', effort: 'medium' },
|
|
27
|
-
states,
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
const STATES = {
|
|
31
|
-
Triage: { role: 'holding' },
|
|
32
|
-
Todo: { role: 'active' },
|
|
33
|
-
Doing: { role: 'active' },
|
|
34
|
-
Done: { role: 'terminal' },
|
|
35
|
-
Discarded: { role: 'terminal' },
|
|
36
|
-
Parking: { role: 'holding' },
|
|
37
|
-
};
|
|
38
|
-
test('buildTickConfig derives lowercased role sets via the canonical core fns', () => {
|
|
39
|
-
const tc = buildTickConfig(makeCfg(STATES), CORE);
|
|
40
|
-
assert.deepEqual([...tc.activeStates].sort(), ['doing', 'todo']);
|
|
41
|
-
assert.deepEqual([...tc.terminalStates].sort(), ['discarded', 'done']);
|
|
42
|
-
});
|
|
43
|
-
test('buildTickConfig picks the FIRST declared holding state', () => {
|
|
44
|
-
const tc = buildTickConfig(makeCfg(STATES), CORE);
|
|
45
|
-
assert.equal(tc.holdingState, 'Triage');
|
|
46
|
-
});
|
|
47
|
-
test('buildTickConfig maps a throwing pickHoldingState (no holding state) to holdingState: null', () => {
|
|
48
|
-
const noHolding = {
|
|
49
|
-
Todo: { role: 'active' },
|
|
50
|
-
Done: { role: 'terminal' },
|
|
51
|
-
};
|
|
52
|
-
const tc = buildTickConfig(makeCfg(noHolding), CORE);
|
|
53
|
-
assert.equal(tc.holdingState, null);
|
|
54
|
-
assert.deepEqual([...tc.activeStates], ['todo']);
|
|
55
|
-
assert.deepEqual([...tc.terminalStates], ['done']);
|
|
56
|
-
});
|
|
57
|
-
test('buildTickConfig carries the scalar polling/agent knobs + derived spawn routing', () => {
|
|
58
|
-
const tc = buildTickConfig(makeCfg(STATES), CORE);
|
|
59
|
-
assert.equal(tc.pollIntervalMs, 1000);
|
|
60
|
-
assert.equal(tc.staticCap, 4);
|
|
61
|
-
assert.equal(tc.memoryAdmissionEnabled, true);
|
|
62
|
-
assert.equal(tc.hostMemoryReserveMib, 256);
|
|
63
|
-
assert.equal(tc.perVmMib, 1024);
|
|
64
|
-
assert.equal(tc.maxRetryBackoffMs, 5000);
|
|
65
|
-
assert.equal(tc.circuitBreakerThreshold, 3);
|
|
66
|
-
// No active state declares `spawn:` → spawning disabled.
|
|
67
|
-
assert.equal(tc.spawn.spawnState, null);
|
|
68
|
-
// The full per-state config is carried through untouched (per-state slot caps).
|
|
69
|
-
assert.deepEqual(tc.states, STATES);
|
|
70
|
-
});
|
|
71
|
-
test('buildTickConfig carries the gondolin image selectors (escape hatch + oci_image)', () => {
|
|
72
|
-
// The escape-hatch `image` is projected so the poll tick's image gate can mirror
|
|
73
|
-
// runtime precedence (issue 206); `oci_image` drives the auto-convert readiness.
|
|
74
|
-
const base = makeCfg(STATES);
|
|
75
|
-
const cfg = {
|
|
76
|
-
...base,
|
|
77
|
-
gondolin: { ...base.gondolin, image: 'prebuilt-asset:1', oci_image: 'ghcr.io/acme/agent:1' },
|
|
78
|
-
};
|
|
79
|
-
const tc = buildTickConfig(cfg, CORE);
|
|
80
|
-
assert.equal(tc.image, 'prebuilt-asset:1');
|
|
81
|
-
assert.equal(tc.ociImage, 'ghcr.io/acme/agent:1');
|
|
82
|
-
});
|
|
83
|
-
//# sourceMappingURL=tick-config.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tick-config.test.js","sourceRoot":"","sources":["../../../tests/shell/tick-config.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
// Focused test for finding #6: the Date→ISO-string normalization for YAML
|
|
2
|
-
// timestamps lives at the SHELL decode boundary (tracker-parse.ts), so core's
|
|
3
|
-
// `asTimestamp` only ever sees a plain `string`.
|
|
4
|
-
//
|
|
5
|
-
// The `yaml` lib's default (1.2 core) schema already decodes an ISO timestamp
|
|
6
|
-
// scalar to a STRING, so the production path never yields a `Date`. The shell's
|
|
7
|
-
// `normalizeDates` is the defensive boundary guard for any decoder that WOULD
|
|
8
|
-
// (older 1.1 `!!timestamp`, a custom schema). These tests pin the end-to-end
|
|
9
|
-
// contract: a front-matter timestamp survives decode as an ISO string that core's
|
|
10
|
-
// `asTimestamp` accepts — and core no longer carries the `instanceof Date` branch.
|
|
11
|
-
import { test } from 'node:test';
|
|
12
|
-
import assert from 'node:assert/strict';
|
|
13
|
-
import { splitFrontMatter, lenientFrontMatter } from '../../src/shell/interp/tracker-parse.js';
|
|
14
|
-
import { asTimestamp } from '../../src/core/coerce.js';
|
|
15
|
-
test('a front-matter timestamp decodes to a plain ISO string core asTimestamp accepts', () => {
|
|
16
|
-
const text = [
|
|
17
|
-
'---',
|
|
18
|
-
'id: 7',
|
|
19
|
-
'created_at: 2026-01-02T03:04:05.000Z',
|
|
20
|
-
'updated_at: 2026-01-02T03:04:05.000Z',
|
|
21
|
-
'---',
|
|
22
|
-
'body',
|
|
23
|
-
].join('\n');
|
|
24
|
-
const { fields, body } = splitFrontMatter(text);
|
|
25
|
-
// Decoded as a plain string (no Date leaking out of the shell boundary).
|
|
26
|
-
assert.equal(typeof fields.created_at, 'string');
|
|
27
|
-
assert.ok(!(fields.created_at instanceof Date));
|
|
28
|
-
// Core's plain-data coercer accepts it unchanged.
|
|
29
|
-
assert.equal(asTimestamp(fields.created_at), '2026-01-02T03:04:05.000Z');
|
|
30
|
-
assert.equal(asTimestamp(fields.updated_at), '2026-01-02T03:04:05.000Z');
|
|
31
|
-
assert.equal(body, 'body');
|
|
32
|
-
});
|
|
33
|
-
test('lenient decode likewise yields a plain-string timestamp', () => {
|
|
34
|
-
const { fields } = lenientFrontMatter('---\ncreated_at: 2025-12-31T23:59:59.000Z\n---\n');
|
|
35
|
-
assert.equal(typeof fields.created_at, 'string');
|
|
36
|
-
assert.equal(asTimestamp(fields.created_at), '2025-12-31T23:59:59.000Z');
|
|
37
|
-
});
|
|
38
|
-
// Pin the core invariant the fix established: core's asTimestamp is plain-data only
|
|
39
|
-
// (a Date is NOT a timestamp at the core boundary — it is normalized in the shell).
|
|
40
|
-
test('core asTimestamp no longer special-cases Date (plain-data only)', () => {
|
|
41
|
-
assert.equal(asTimestamp(new Date('2026-01-02T03:04:05.000Z')), null);
|
|
42
|
-
assert.equal(asTimestamp('2026-01-02T03:04:05.000Z'), '2026-01-02T03:04:05.000Z');
|
|
43
|
-
});
|
|
44
|
-
//# sourceMappingURL=tracker-parse-dates.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tracker-parse-dates.test.js","sourceRoot":"","sources":["../../../tests/shell/tracker-parse-dates.test.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,8EAA8E;AAC9E,iDAAiD;AACjD,EAAE;AACF,8EAA8E;AAC9E,gFAAgF;AAChF,8EAA8E;AAC9E,6EAA6E;AAC7E,kFAAkF;AAClF,mFAAmF;AACnF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,IAAI,CAAC,iFAAiF,EAAE,GAAG,EAAE;IAC3F,MAAM,IAAI,GAAG;QACX,KAAK;QACL,OAAO;QACP,sCAAsC;QACtC,sCAAsC;QACtC,KAAK;QACL,MAAM;KACP,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAChD,yEAAyE;IACzE,MAAM,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACjD,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,YAAY,IAAI,CAAC,CAAC,CAAC;IAChD,kDAAkD;IAClD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,0BAA0B,CAAC,CAAC;IACzE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,0BAA0B,CAAC,CAAC;IACzE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yDAAyD,EAAE,GAAG,EAAE;IACnE,MAAM,EAAE,MAAM,EAAE,GAAG,kBAAkB,CAAC,kDAAkD,CAAC,CAAC;IAC1F,MAAM,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACjD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,0BAA0B,CAAC,CAAC;AAC3E,CAAC,CAAC,CAAC;AAEH,oFAAoF;AACpF,oFAAoF;AACpF,IAAI,CAAC,iEAAiE,EAAE,GAAG,EAAE;IAC3E,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,0BAA0B,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACtE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,0BAA0B,CAAC,EAAE,0BAA0B,CAAC,CAAC;AACpF,CAAC,CAAC,CAAC"}
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
// Focused tests for the shell tracker write_issue path (§2i overwrite bug fix):
|
|
2
|
-
// an identifier-less write_issue (the MCP propose_issue path) must collision-pick
|
|
3
|
-
// the next free numeric id from a readdir scan instead of overwriting `1.md`.
|
|
4
|
-
//
|
|
5
|
-
// Wires the REAL pure core (composeIssueFile + pickNextNumericIdentifier) into the
|
|
6
|
-
// shell adapter against a real temp tracker root — exactly how main.ts wires it.
|
|
7
|
-
import { test } from 'node:test';
|
|
8
|
-
import assert from 'node:assert/strict';
|
|
9
|
-
import { mkdtemp, mkdir, readdir, readFile, writeFile, rm } from 'node:fs/promises';
|
|
10
|
-
import os from 'node:os';
|
|
11
|
-
import path from 'node:path';
|
|
12
|
-
import { createTrackerAdapter } from '../../src/shell/interp/tracker.js';
|
|
13
|
-
import { composeIssueFile } from '../../src/core/issue/file.js';
|
|
14
|
-
import { pickNextNumericIdentifier, resolveMatch, matchingCandidates } from '../../src/core/issue/parse.js';
|
|
15
|
-
function asWriteIssue(r) {
|
|
16
|
-
assert.equal('kind' in r ? r.kind : '(no kind)', 'write_issue');
|
|
17
|
-
return r;
|
|
18
|
-
}
|
|
19
|
-
const STATES = {
|
|
20
|
-
Holding: { role: 'holding' },
|
|
21
|
-
Doing: { role: 'active' },
|
|
22
|
-
Done: { role: 'terminal' },
|
|
23
|
-
};
|
|
24
|
-
function makeAdapter(root) {
|
|
25
|
-
const config = () => ({ kind: 'local', states: STATES, root });
|
|
26
|
-
return createTrackerAdapter({
|
|
27
|
-
config,
|
|
28
|
-
resolveMatch: (all, issueId, fromState) => resolveMatch(matchingCandidates(all, issueId), issueId, fromState),
|
|
29
|
-
composeIssueFile,
|
|
30
|
-
pickNextNumericIdentifier,
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
function writeIssueEffect(trackerRoot, title, identifier) {
|
|
34
|
-
return {
|
|
35
|
-
family: 'tracker',
|
|
36
|
-
kind: 'write_issue',
|
|
37
|
-
trackerRoot,
|
|
38
|
-
state: 'Holding',
|
|
39
|
-
title,
|
|
40
|
-
...(identifier !== undefined ? { identifier } : {}),
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
async function withRoot(fn) {
|
|
44
|
-
const root = await mkdtemp(path.join(os.tmpdir(), 'symphony-tracker-'));
|
|
45
|
-
try {
|
|
46
|
-
for (const name of Object.keys(STATES))
|
|
47
|
-
await mkdir(path.join(root, name), { recursive: true });
|
|
48
|
-
await fn(root);
|
|
49
|
-
}
|
|
50
|
-
finally {
|
|
51
|
-
await rm(root, { recursive: true, force: true });
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
test('write_issue WITHOUT an identifier collision-picks 1 then 2 (no overwrite)', async () => {
|
|
55
|
-
await withRoot(async (root) => {
|
|
56
|
-
const tracker = makeAdapter(root);
|
|
57
|
-
const r1 = asWriteIssue(await tracker.writeIssue(writeIssueEffect(root, 'first proposal')));
|
|
58
|
-
const r2 = asWriteIssue(await tracker.writeIssue(writeIssueEffect(root, 'second proposal')));
|
|
59
|
-
// The two proposals must land at DISTINCT numeric ids (1 then 2) — the bug was
|
|
60
|
-
// both overwriting `1.md`.
|
|
61
|
-
assert.equal(r1.identifier, '1');
|
|
62
|
-
assert.equal(r2.identifier, '2');
|
|
63
|
-
const holdingFiles = (await readdir(path.join(root, 'Holding'))).filter((f) => f.endsWith('.md')).sort();
|
|
64
|
-
assert.deepEqual(holdingFiles, ['1.md', '2.md']);
|
|
65
|
-
// The first file's content must survive the second write (no overwrite).
|
|
66
|
-
const first = await readFile(path.join(root, 'Holding', '1.md'), 'utf8');
|
|
67
|
-
assert.match(first, /first proposal/);
|
|
68
|
-
const second = await readFile(path.join(root, 'Holding', '2.md'), 'utf8');
|
|
69
|
-
assert.match(second, /second proposal/);
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
test('loadAllIssues treats a not-yet-created tracker root as EMPTY, not an error', async () => {
|
|
73
|
-
// A fresh `scaffold → run` has no tracker dir until the first issue is filed;
|
|
74
|
-
// the poll loop's scan must return empty rather than throw local_root_read_error.
|
|
75
|
-
const base = await mkdtemp(path.join(os.tmpdir(), 'symphony-tracker-'));
|
|
76
|
-
try {
|
|
77
|
-
const tracker = makeAdapter(path.join(base, 'not-created-yet'));
|
|
78
|
-
const res = await tracker.loadAllIssues();
|
|
79
|
-
assert.deepEqual(res.raw, []);
|
|
80
|
-
}
|
|
81
|
-
finally {
|
|
82
|
-
await rm(base, { recursive: true, force: true });
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
test('write_issue collision-pick counts existing numeric ids across ALL state dirs', async () => {
|
|
86
|
-
await withRoot(async (root) => {
|
|
87
|
-
// Pre-seed taken numeric ids in DIFFERENT state dirs: Holding/1.md, Done/2.md.
|
|
88
|
-
await writeFile(path.join(root, 'Holding', '1.md'), '---\nid: 1\n---\n', 'utf8');
|
|
89
|
-
await writeFile(path.join(root, 'Done', '2.md'), '---\nid: 2\n---\n', 'utf8');
|
|
90
|
-
const tracker = makeAdapter(root);
|
|
91
|
-
const r = asWriteIssue(await tracker.writeIssue(writeIssueEffect(root, 'next free is 3')));
|
|
92
|
-
// 1 (Holding) and 2 (Done) are both taken → next free numeric is 3, not 2.
|
|
93
|
-
assert.equal(r.identifier, '3');
|
|
94
|
-
assert.equal(path.basename(r.path), '3.md');
|
|
95
|
-
});
|
|
96
|
-
});
|
|
97
|
-
test('write_issue WITH an explicit FREE identifier is written (no collision pick)', async () => {
|
|
98
|
-
await withRoot(async (root) => {
|
|
99
|
-
const tracker = makeAdapter(root);
|
|
100
|
-
const r = asWriteIssue(await tracker.writeIssue(writeIssueEffect(root, 'explicit id', '42')));
|
|
101
|
-
assert.equal(r.identifier, '42');
|
|
102
|
-
const files = (await readdir(path.join(root, 'Holding'))).filter((f) => f.endsWith('.md'));
|
|
103
|
-
assert.deepEqual(files, ['42.md']);
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
test('write_issue WITH an explicit OCCUPIED identifier is REJECTED (no overwrite, 409 contract)', async () => {
|
|
107
|
-
await withRoot(async (root) => {
|
|
108
|
-
const tracker = makeAdapter(root);
|
|
109
|
-
// Seed an existing issue at the explicit target with distinctive content.
|
|
110
|
-
await writeFile(path.join(root, 'Holding', '42.md'), '---\nid: 42\ntitle: "original"\n---\noriginal body\n', 'utf8');
|
|
111
|
-
// A second write_issue at the SAME explicit id must throw (create-409 contract),
|
|
112
|
-
// not silently overwrite the live file via durablyReplaceInPlace.
|
|
113
|
-
await assert.rejects(tracker.writeIssue(writeIssueEffect(root, 'attempted overwrite', '42')), (err) => {
|
|
114
|
-
assert.equal(err.code, 'local_issue_target_exists');
|
|
115
|
-
return true;
|
|
116
|
-
});
|
|
117
|
-
// The original file's content survived (no overwrite happened).
|
|
118
|
-
const survived = await readFile(path.join(root, 'Holding', '42.md'), 'utf8');
|
|
119
|
-
assert.match(survived, /original body/);
|
|
120
|
-
assert.doesNotMatch(survived, /attempted overwrite/);
|
|
121
|
-
// No stray duplicate landed.
|
|
122
|
-
const files = (await readdir(path.join(root, 'Holding'))).filter((f) => f.endsWith('.md')).sort();
|
|
123
|
-
assert.deepEqual(files, ['42.md']);
|
|
124
|
-
});
|
|
125
|
-
});
|
|
126
|
-
test('two CONCURRENT creates of the SAME identifier → exactly one wins, the other 409s (no corruption)', async () => {
|
|
127
|
-
await withRoot(async (root) => {
|
|
128
|
-
const tracker = makeAdapter(root);
|
|
129
|
-
// Fire both writes for id "7" at once. The scan-based collision check is a TOCTOU
|
|
130
|
-
// window — pre-fix both could pass it and then both tmp+rename, clobbering/corrupting
|
|
131
|
-
// the file. With the exclusive (O_EXCL) create, exactly one wins; the other gets
|
|
132
|
-
// EEXIST → local_issue_target_exists (the create-409 contract).
|
|
133
|
-
const results = await Promise.allSettled([
|
|
134
|
-
tracker.writeIssue(writeIssueEffect(root, 'racer A', '7')),
|
|
135
|
-
tracker.writeIssue(writeIssueEffect(root, 'racer B', '7')),
|
|
136
|
-
]);
|
|
137
|
-
const fulfilled = results.filter((r) => r.status === 'fulfilled');
|
|
138
|
-
const rejected = results.filter((r) => r.status === 'rejected');
|
|
139
|
-
assert.equal(fulfilled.length, 1, 'exactly one create must succeed');
|
|
140
|
-
assert.equal(rejected.length, 1, 'exactly one create must be rejected');
|
|
141
|
-
// The loser failed with the 409 contract code (HTTP layer maps it to 409).
|
|
142
|
-
const loser = rejected[0];
|
|
143
|
-
assert.equal(loser.reason.code, 'local_issue_target_exists');
|
|
144
|
-
// Exactly one file exists, no stray tmp, and its content is one whole winner's
|
|
145
|
-
// body — NOT a corrupt interleave of both writers.
|
|
146
|
-
const allFiles = (await readdir(path.join(root, 'Holding'))).sort();
|
|
147
|
-
assert.deepEqual(allFiles, ['7.md'], 'exactly one file, no leftover .tmp');
|
|
148
|
-
const body = await readFile(path.join(root, 'Holding', '7.md'), 'utf8');
|
|
149
|
-
const sawA = /racer A/.test(body);
|
|
150
|
-
const sawB = /racer B/.test(body);
|
|
151
|
-
assert.ok(sawA !== sawB, 'file is one whole winner, not a corrupt mix of both writers');
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
//# sourceMappingURL=tracker-write-issue.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tracker-write-issue.test.js","sourceRoot":"","sources":["../../../tests/shell/tracker-write-issue.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
// Shell tests for the per-state prompt split (WORKFLOW.yaml prompt_file).
|
|
2
|
-
//
|
|
3
|
-
// Wire the REAL pure parser (parseWorkflow + yaml.parse) into the REAL shell
|
|
4
|
-
// loader (loadWorkflowSource / watchWorkflowSource) — exactly how main.ts wires
|
|
5
|
-
// it — against on-disk fixtures + temp dirs. The loader assembles each state's
|
|
6
|
-
// `prompt_file` (wrapped in the shared preamble/footer) into a per-state template;
|
|
7
|
-
// the golden test proves that assembly renders byte-identical to the inline
|
|
8
|
-
// `{% case issue.state %}` body it replaces.
|
|
9
|
-
import { test } from 'node:test';
|
|
10
|
-
import assert from 'node:assert/strict';
|
|
11
|
-
import { mkdtemp, mkdir, writeFile, rm } from 'node:fs/promises';
|
|
12
|
-
import { readFileSync } from 'node:fs';
|
|
13
|
-
import os from 'node:os';
|
|
14
|
-
import path from 'node:path';
|
|
15
|
-
import { fileURLToPath } from 'node:url';
|
|
16
|
-
import { parse as parseYaml } from 'yaml';
|
|
17
|
-
import { parseWorkflow } from '../../src/core/workflow/parse.js';
|
|
18
|
-
import { renderPrompt } from '../../src/core/runner/prompt.js';
|
|
19
|
-
import { probePromptTemplates } from '../../src/core/workflow/prompt-probe.js';
|
|
20
|
-
import { loadWorkflowSource, loadWorkflowProbed, watchWorkflowSource, } from '../../src/shell/adapter/workflow-loader.js';
|
|
21
|
-
import { WorkflowError } from '../../src/types/errors.js';
|
|
22
|
-
const parse = (text, workflowPath) => {
|
|
23
|
-
const { config, definition } = parseWorkflow(text, workflowPath, { parseYaml }, process.env);
|
|
24
|
-
return { config, definition };
|
|
25
|
-
};
|
|
26
|
-
const FIXTURE_DIR = fileURLToPath(new URL('../fixtures/prompt-split/', import.meta.url));
|
|
27
|
-
const INLINE_BODY = readFileSync(path.join(FIXTURE_DIR, 'inline-body.md'), 'utf8');
|
|
28
|
-
const SPLIT_STATES = ['Todo', 'Review', 'Reflect'];
|
|
29
|
-
function makeIssue(state) {
|
|
30
|
-
return {
|
|
31
|
-
id: '42',
|
|
32
|
-
identifier: '42',
|
|
33
|
-
title: 'Example title',
|
|
34
|
-
description: 'Some description body.',
|
|
35
|
-
priority: 3,
|
|
36
|
-
state,
|
|
37
|
-
branch_name: null,
|
|
38
|
-
url: null,
|
|
39
|
-
labels: ['harness', 'workflow'],
|
|
40
|
-
blocked_by: [],
|
|
41
|
-
created_at: null,
|
|
42
|
-
updated_at: null,
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
// ─── golden: split renders byte-identical to the inline {% case %} body ────────
|
|
46
|
-
test('per-state prompt_file renders byte-identical to the inline case body', async () => {
|
|
47
|
-
const src = await watchWorkflowSource(path.join(FIXTURE_DIR, 'split.yaml'), parse, { watch: false });
|
|
48
|
-
const def = src.current().definition;
|
|
49
|
-
src.stop();
|
|
50
|
-
assert.deepEqual(Object.keys(def.prompt_templates ?? {}).sort(), [...SPLIT_STATES].sort());
|
|
51
|
-
for (const state of SPLIT_STATES) {
|
|
52
|
-
for (const attempt of [null, 1, 2]) {
|
|
53
|
-
const issue = makeIssue(state);
|
|
54
|
-
const split = renderPrompt({ template: def.prompt_templates[state], issue, attempt });
|
|
55
|
-
const inline = renderPrompt({ template: INLINE_BODY, issue, attempt });
|
|
56
|
-
assert.equal(split, inline, `state ${state} attempt ${attempt} should be byte-identical`);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
// ─── preflight: a missing prompt_file fails loudly at load (not at dispatch) ────
|
|
61
|
-
test('a missing prompt_file throws missing_prompt_file at load', async () => {
|
|
62
|
-
const dir = await mkdtemp(path.join(os.tmpdir(), 'sym-missing-'));
|
|
63
|
-
try {
|
|
64
|
-
const wf = path.join(dir, 'WORKFLOW.yaml');
|
|
65
|
-
await writeFile(wf, [
|
|
66
|
-
'tracker:',
|
|
67
|
-
' kind: local',
|
|
68
|
-
'states:',
|
|
69
|
-
' Todo:',
|
|
70
|
-
' role: active',
|
|
71
|
-
' prompt_file: prompts/Todo.md', // intentionally never created
|
|
72
|
-
' Done:',
|
|
73
|
-
' role: terminal',
|
|
74
|
-
' Triage:',
|
|
75
|
-
' role: holding',
|
|
76
|
-
].join('\n'));
|
|
77
|
-
await assert.rejects(() => loadWorkflowSource(wf, parse), (err) => err instanceof WorkflowError && err.code === 'missing_prompt_file');
|
|
78
|
-
}
|
|
79
|
-
finally {
|
|
80
|
-
await rm(dir, { recursive: true, force: true });
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
// ─── preflight: an UNPARSEABLE prompt_file fails the render-probe at load ───────
|
|
84
|
-
//
|
|
85
|
-
// A missing file throws at read time (above); a file that exists but contains an
|
|
86
|
-
// unknown Liquid tag reads fine, so plain loadWorkflowSource succeeds — only the
|
|
87
|
-
// injected render-probe catches it. loadWorkflowProbed (the doctor's load path)
|
|
88
|
-
// re-throws it as `invalid_prompt_template`, so it fails at preflight/doctor.
|
|
89
|
-
test('an unparseable prompt_file throws invalid_prompt_template via loadWorkflowProbed', async () => {
|
|
90
|
-
const dir = await mkdtemp(path.join(os.tmpdir(), 'sym-bad-prompt-'));
|
|
91
|
-
try {
|
|
92
|
-
await mkdir(path.join(dir, 'prompts'), { recursive: true });
|
|
93
|
-
// `{% include %}` is the canonical no-include escape hatch: the strict-Liquid
|
|
94
|
-
// subset has no such tag, so renderPrompt throws PromptError on it.
|
|
95
|
-
await writeFile(path.join(dir, 'prompts', 'Todo.md'), 'Body with a bad tag: {% include "other.md" %}');
|
|
96
|
-
const wf = path.join(dir, 'WORKFLOW.yaml');
|
|
97
|
-
await writeFile(wf, [
|
|
98
|
-
'tracker:',
|
|
99
|
-
' kind: local',
|
|
100
|
-
'states:',
|
|
101
|
-
' Todo:',
|
|
102
|
-
' role: active',
|
|
103
|
-
' prompt_file: prompts/Todo.md',
|
|
104
|
-
' Done:',
|
|
105
|
-
' role: terminal',
|
|
106
|
-
' Triage:',
|
|
107
|
-
' role: holding',
|
|
108
|
-
].join('\n'));
|
|
109
|
-
// The raw loader reads the file fine (no throw); the render-probe is what catches it.
|
|
110
|
-
await assert.doesNotReject(() => loadWorkflowSource(wf, parse));
|
|
111
|
-
await assert.rejects(() => loadWorkflowProbed(wf, parse, probePromptTemplates), (err) => err instanceof WorkflowError &&
|
|
112
|
-
err.code === 'invalid_prompt_template' &&
|
|
113
|
-
// Error attribution: the failure names the offending SOURCE FILE (absolute
|
|
114
|
-
// path of the per-state prompt_file), not just the assembled blob/state.
|
|
115
|
-
err.message.includes(path.join(dir, 'prompts', 'Todo.md')) &&
|
|
116
|
-
/failed to render/.test(err.message));
|
|
117
|
-
}
|
|
118
|
-
finally {
|
|
119
|
-
await rm(dir, { recursive: true, force: true });
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
// ─── attribution: a bad SHARED preamble names the preamble file, not a state ────
|
|
123
|
-
//
|
|
124
|
-
// The per-state bodies are fine; only the shared preamble has a bad Liquid tag.
|
|
125
|
-
// The probe must attribute the failure to `prompt.preamble_file` (the shared file
|
|
126
|
-
// that actually contains the bad Liquid), NOT to the first state whose assembled
|
|
127
|
-
// render happened to surface it.
|
|
128
|
-
test('a bad shared preamble is attributed to the preamble file, not the first state', async () => {
|
|
129
|
-
const dir = await mkdtemp(path.join(os.tmpdir(), 'sym-bad-preamble-'));
|
|
130
|
-
try {
|
|
131
|
-
await mkdir(path.join(dir, 'prompts'), { recursive: true });
|
|
132
|
-
// Bad Liquid lives in the SHARED preamble; the per-state bodies are clean.
|
|
133
|
-
await writeFile(path.join(dir, 'prompts', '_preamble.md'), 'Header {% include "x.md" %}');
|
|
134
|
-
await writeFile(path.join(dir, 'prompts', 'Todo.md'), 'Todo body (clean).');
|
|
135
|
-
await writeFile(path.join(dir, 'prompts', 'Review.md'), 'Review body (clean).');
|
|
136
|
-
const wf = path.join(dir, 'WORKFLOW.yaml');
|
|
137
|
-
await writeFile(wf, [
|
|
138
|
-
'tracker:',
|
|
139
|
-
' kind: local',
|
|
140
|
-
'prompt:',
|
|
141
|
-
' preamble_file: prompts/_preamble.md',
|
|
142
|
-
'states:',
|
|
143
|
-
' Todo:',
|
|
144
|
-
' role: active',
|
|
145
|
-
' prompt_file: prompts/Todo.md',
|
|
146
|
-
' Review:',
|
|
147
|
-
' role: active',
|
|
148
|
-
' prompt_file: prompts/Review.md',
|
|
149
|
-
' Done:',
|
|
150
|
-
' role: terminal',
|
|
151
|
-
' Triage:',
|
|
152
|
-
' role: holding',
|
|
153
|
-
].join('\n'));
|
|
154
|
-
await assert.rejects(() => loadWorkflowProbed(wf, parse, probePromptTemplates), (err) => err instanceof WorkflowError &&
|
|
155
|
-
err.code === 'invalid_prompt_template' &&
|
|
156
|
-
// The SHARED preamble file is named; neither per-state body file is.
|
|
157
|
-
err.message.includes(path.join(dir, 'prompts', '_preamble.md')) &&
|
|
158
|
-
!err.message.includes('Todo.md') &&
|
|
159
|
-
!err.message.includes('Review.md'));
|
|
160
|
-
}
|
|
161
|
-
finally {
|
|
162
|
-
await rm(dir, { recursive: true, force: true });
|
|
163
|
-
}
|
|
164
|
-
});
|
|
165
|
-
// ─── hot reload: editing a prompts/*.md file reloads the per-state template ─────
|
|
166
|
-
test('editing a prompt file fires onChange with the updated template', async () => {
|
|
167
|
-
const dir = await mkdtemp(path.join(os.tmpdir(), 'sym-reload-'));
|
|
168
|
-
try {
|
|
169
|
-
await mkdir(path.join(dir, 'prompts'), { recursive: true });
|
|
170
|
-
await writeFile(path.join(dir, 'prompts', 'Todo.md'), 'FIRST body');
|
|
171
|
-
const wf = path.join(dir, 'WORKFLOW.yaml');
|
|
172
|
-
await writeFile(wf, [
|
|
173
|
-
'tracker:',
|
|
174
|
-
' kind: local',
|
|
175
|
-
'states:',
|
|
176
|
-
' Todo:',
|
|
177
|
-
' role: active',
|
|
178
|
-
' prompt_file: prompts/Todo.md',
|
|
179
|
-
' Done:',
|
|
180
|
-
' role: terminal',
|
|
181
|
-
' Triage:',
|
|
182
|
-
' role: holding',
|
|
183
|
-
].join('\n'));
|
|
184
|
-
const src = await watchWorkflowSource(wf, parse, { watch: true });
|
|
185
|
-
try {
|
|
186
|
-
assert.match(src.current().definition.prompt_templates['Todo'], /FIRST body/);
|
|
187
|
-
const changed = new Promise((resolve) => {
|
|
188
|
-
src.onChange((_cfg, definition) => {
|
|
189
|
-
if (definition.prompt_templates?.['Todo']?.includes('SECOND body'))
|
|
190
|
-
resolve();
|
|
191
|
-
});
|
|
192
|
-
});
|
|
193
|
-
// Give chokidar a beat to arm its watchers before the edit.
|
|
194
|
-
await new Promise((r) => setTimeout(r, 200));
|
|
195
|
-
await writeFile(path.join(dir, 'prompts', 'Todo.md'), 'SECOND body');
|
|
196
|
-
const timeout = new Promise((_, reject) => setTimeout(() => reject(new Error('onChange did not fire for the prompt-file edit')), 8000));
|
|
197
|
-
await Promise.race([changed, timeout]);
|
|
198
|
-
assert.match(src.current().definition.prompt_templates['Todo'], /SECOND body/);
|
|
199
|
-
}
|
|
200
|
-
finally {
|
|
201
|
-
src.stop();
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
finally {
|
|
205
|
-
await rm(dir, { recursive: true, force: true });
|
|
206
|
-
}
|
|
207
|
-
});
|
|
208
|
-
//# sourceMappingURL=workflow-prompt-split.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-prompt-split.test.js","sourceRoot":"","sources":["../../../tests/shell/workflow-prompt-split.test.ts"],"names":[],"mappings":"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"}
|