smol-symphony 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +41 -22
- package/DESIGN.md +494 -273
- package/README.md +109 -57
- package/SPEC.md +33 -24
- package/WORKFLOW.minimal.yaml +34 -0
- package/{WORKFLOW.template.md → WORKFLOW.template.yaml} +409 -256
- package/WORKFLOW.yaml +487 -0
- package/assets/skills/symphony-issues/SKILL.md +136 -0
- package/assets/symphony-mise.system.toml +68 -0
- package/dist/src/bin/symphony.js +30 -0
- package/dist/src/bin/symphony.js.map +1 -0
- package/dist/src/core/actions/context.js +109 -0
- package/dist/src/core/actions/context.js.map +1 -0
- package/dist/{actions/parsing.js → src/core/actions/parse.js} +33 -114
- package/dist/src/core/actions/parse.js.map +1 -0
- package/dist/src/core/actions/plan.js +197 -0
- package/dist/src/core/actions/plan.js.map +1 -0
- package/dist/src/core/actions/predicates.js +111 -0
- package/dist/src/core/actions/predicates.js.map +1 -0
- package/dist/src/core/actions/run-fold.js +248 -0
- package/dist/src/core/actions/run-fold.js.map +1 -0
- package/dist/src/core/actions/template.js +118 -0
- package/dist/src/core/actions/template.js.map +1 -0
- package/dist/src/core/cli/args.js +116 -0
- package/dist/src/core/cli/args.js.map +1 -0
- package/dist/src/core/coerce.js +75 -0
- package/dist/src/core/coerce.js.map +1 -0
- package/dist/src/core/credential/account-id.js +20 -0
- package/dist/src/core/credential/account-id.js.map +1 -0
- package/dist/src/core/credential/adapter-config.js +136 -0
- package/dist/src/core/credential/adapter-config.js.map +1 -0
- package/dist/src/core/credential/availability.js +98 -0
- package/dist/src/core/credential/availability.js.map +1 -0
- package/dist/src/core/credential/extract.js +228 -0
- package/dist/src/core/credential/extract.js.map +1 -0
- package/dist/src/core/credential/fake-creds.js +171 -0
- package/dist/src/core/credential/fake-creds.js.map +1 -0
- package/dist/src/core/credential/identity.js +125 -0
- package/dist/src/core/credential/identity.js.map +1 -0
- package/dist/src/core/credential/shape.js +230 -0
- package/dist/src/core/credential/shape.js.map +1 -0
- package/dist/src/core/credential/strings.js +15 -0
- package/dist/src/core/credential/strings.js.map +1 -0
- package/dist/src/core/doctor/checks.js +303 -0
- package/dist/src/core/doctor/checks.js.map +1 -0
- package/dist/src/core/git/result.js +107 -0
- package/dist/src/core/git/result.js.map +1 -0
- package/dist/src/core/http/decisions.js +225 -0
- package/dist/src/core/http/decisions.js.map +1 -0
- package/dist/{http.js → src/core/http/render.js} +472 -738
- package/dist/src/core/http/render.js.map +1 -0
- package/dist/{http-handlers.js → src/core/http/routes.js} +52 -87
- package/dist/src/core/http/routes.js.map +1 -0
- package/dist/src/core/http/views.js +181 -0
- package/dist/src/core/http/views.js.map +1 -0
- package/dist/src/core/image/managed-image.js +95 -0
- package/dist/src/core/image/managed-image.js.map +1 -0
- package/dist/src/core/issue/file.js +149 -0
- package/dist/src/core/issue/file.js.map +1 -0
- package/dist/src/core/issue/parse.js +210 -0
- package/dist/src/core/issue/parse.js.map +1 -0
- package/dist/src/core/mcp/dispatch.js +239 -0
- package/dist/src/core/mcp/dispatch.js.map +1 -0
- package/dist/src/core/mcp/post-move.js +92 -0
- package/dist/src/core/mcp/post-move.js.map +1 -0
- package/dist/src/core/mcp/protocol.js +293 -0
- package/dist/src/core/mcp/protocol.js.map +1 -0
- package/dist/src/core/mcp/url.js +162 -0
- package/dist/src/core/mcp/url.js.map +1 -0
- package/dist/src/core/path.js +63 -0
- package/dist/src/core/path.js.map +1 -0
- package/dist/src/core/reconcile/image-decide.js +48 -0
- package/dist/src/core/reconcile/image-decide.js.map +1 -0
- package/dist/src/core/reconcile/ledger.js +142 -0
- package/dist/src/core/reconcile/ledger.js.map +1 -0
- package/dist/src/core/reconcile/pr-classify.js +62 -0
- package/dist/src/core/reconcile/pr-classify.js.map +1 -0
- package/dist/{reconciler → src/core/reconcile}/pr-decide.js +25 -12
- package/dist/src/core/reconcile/pr-decide.js.map +1 -0
- package/dist/src/core/reconcile/pr-loop.js +161 -0
- package/dist/src/core/reconcile/pr-loop.js.map +1 -0
- package/dist/src/core/reconcile/pr-notes.js +35 -0
- package/dist/src/core/reconcile/pr-notes.js.map +1 -0
- package/dist/src/core/reconcile/vm-decide.js +70 -0
- package/dist/src/core/reconcile/vm-decide.js.map +1 -0
- package/dist/src/core/reconcile/vm-reap.js +207 -0
- package/dist/src/core/reconcile/vm-reap.js.map +1 -0
- package/dist/src/core/reconcile/workspace-decide.js +162 -0
- package/dist/src/core/reconcile/workspace-decide.js.map +1 -0
- package/dist/src/core/runlog/summary.js +231 -0
- package/dist/src/core/runlog/summary.js.map +1 -0
- package/dist/src/core/runner/dispatch-config.js +95 -0
- package/dist/src/core/runner/dispatch-config.js.map +1 -0
- package/dist/src/core/runner/injection.js +61 -0
- package/dist/src/core/runner/injection.js.map +1 -0
- package/dist/src/core/runner/mise.js +210 -0
- package/dist/src/core/runner/mise.js.map +1 -0
- package/dist/src/core/runner/prompt.js +720 -0
- package/dist/src/core/runner/prompt.js.map +1 -0
- package/dist/src/core/runner/turn.js +242 -0
- package/dist/src/core/runner/turn.js.map +1 -0
- package/dist/src/core/runner/vm-plan.js +390 -0
- package/dist/src/core/runner/vm-plan.js.map +1 -0
- package/dist/src/core/schedule/admission.js +123 -0
- package/dist/src/core/schedule/admission.js.map +1 -0
- package/dist/src/core/schedule/circuit-breaker.js +111 -0
- package/dist/src/core/schedule/circuit-breaker.js.map +1 -0
- package/dist/src/core/schedule/eligibility.js +83 -0
- package/dist/src/core/schedule/eligibility.js.map +1 -0
- package/dist/src/core/schedule/reconcile-issue.js +82 -0
- package/dist/src/core/schedule/reconcile-issue.js.map +1 -0
- package/dist/src/core/schedule/retry.js +96 -0
- package/dist/src/core/schedule/retry.js.map +1 -0
- package/dist/src/core/schedule/sleep-cycle.js +133 -0
- package/dist/src/core/schedule/sleep-cycle.js.map +1 -0
- package/dist/src/core/schedule/slots.js +124 -0
- package/dist/src/core/schedule/slots.js.map +1 -0
- package/dist/src/core/schedule/tick.js +553 -0
- package/dist/src/core/schedule/tick.js.map +1 -0
- package/dist/src/core/schedule/token-fold.js +181 -0
- package/dist/src/core/schedule/token-fold.js.map +1 -0
- package/dist/src/core/state-resolve.js +86 -0
- package/dist/src/core/state-resolve.js.map +1 -0
- package/dist/src/core/vm-guards.js +278 -0
- package/dist/src/core/vm-guards.js.map +1 -0
- package/dist/src/core/workflow/derive.js +107 -0
- package/dist/src/core/workflow/derive.js.map +1 -0
- package/dist/src/core/workflow/parse.js +687 -0
- package/dist/src/core/workflow/parse.js.map +1 -0
- package/dist/src/core/workflow/prompt-probe.js +78 -0
- package/dist/src/core/workflow/prompt-probe.js.map +1 -0
- package/dist/src/core/workflow/validate.js +189 -0
- package/dist/src/core/workflow/validate.js.map +1 -0
- package/dist/src/core/workspace-key.js +19 -0
- package/dist/src/core/workspace-key.js.map +1 -0
- package/dist/src/shell/actions-runner.js +356 -0
- package/dist/src/shell/actions-runner.js.map +1 -0
- package/dist/src/shell/adapter/adapter-registry.js +45 -0
- package/dist/src/shell/adapter/adapter-registry.js.map +1 -0
- package/dist/src/shell/adapter/clock-random.js +96 -0
- package/dist/src/shell/adapter/clock-random.js.map +1 -0
- package/dist/src/shell/adapter/gondolin-dispatch-helpers.js +158 -0
- package/dist/src/shell/adapter/gondolin-dispatch-helpers.js.map +1 -0
- package/dist/src/shell/adapter/gondolin-dispatch.js +385 -0
- package/dist/src/shell/adapter/gondolin-dispatch.js.map +1 -0
- package/dist/src/shell/adapter/gondolin-image-converter.js +233 -0
- package/dist/src/shell/adapter/gondolin-image-converter.js.map +1 -0
- package/dist/src/shell/adapter/gondolin-image-fetch.js +180 -0
- package/dist/src/shell/adapter/gondolin-image-fetch.js.map +1 -0
- package/dist/src/shell/adapter/launcher-asset.js +57 -0
- package/dist/src/shell/adapter/launcher-asset.js.map +1 -0
- package/dist/src/shell/adapter/mise-config-asset.js +65 -0
- package/dist/src/shell/adapter/mise-config-asset.js.map +1 -0
- package/dist/src/shell/adapter/workflow-loader.js +304 -0
- package/dist/src/shell/adapter/workflow-loader.js.map +1 -0
- package/dist/src/shell/cli/doctor.js +268 -0
- package/dist/src/shell/cli/doctor.js.map +1 -0
- package/dist/src/shell/effect-interpreter-families.js +314 -0
- package/dist/src/shell/effect-interpreter-families.js.map +1 -0
- package/dist/src/shell/effect-interpreter.js +29 -0
- package/dist/src/shell/effect-interpreter.js.map +1 -0
- package/dist/src/shell/interp/acp-frame.js +137 -0
- package/dist/src/shell/interp/acp-frame.js.map +1 -0
- package/dist/src/shell/interp/acp-ws-conn.js +320 -0
- package/dist/src/shell/interp/acp-ws-conn.js.map +1 -0
- package/dist/src/shell/interp/acp-ws-frames.js +159 -0
- package/dist/src/shell/interp/acp-ws-frames.js.map +1 -0
- package/dist/src/shell/interp/acp-ws.js +197 -0
- package/dist/src/shell/interp/acp-ws.js.map +1 -0
- package/dist/src/shell/interp/acp.js +319 -0
- package/dist/src/shell/interp/acp.js.map +1 -0
- package/dist/src/shell/interp/credential-defaults.js +128 -0
- package/dist/src/shell/interp/credential-defaults.js.map +1 -0
- package/dist/src/shell/interp/credential-hooks.js +149 -0
- package/dist/src/shell/interp/credential-hooks.js.map +1 -0
- package/dist/src/shell/interp/credential-registry.js +226 -0
- package/dist/src/shell/interp/credential-registry.js.map +1 -0
- package/dist/src/shell/interp/credential.js +103 -0
- package/dist/src/shell/interp/credential.js.map +1 -0
- package/dist/src/shell/interp/gh.js +163 -0
- package/dist/src/shell/interp/gh.js.map +1 -0
- package/dist/src/shell/interp/git.js +28 -0
- package/dist/src/shell/interp/git.js.map +1 -0
- package/dist/src/shell/interp/log.js +213 -0
- package/dist/src/shell/interp/log.js.map +1 -0
- package/dist/src/shell/interp/process.js +178 -0
- package/dist/src/shell/interp/process.js.map +1 -0
- package/dist/src/shell/interp/runlog.js +193 -0
- package/dist/src/shell/interp/runlog.js.map +1 -0
- package/dist/src/shell/interp/timer.js +64 -0
- package/dist/src/shell/interp/timer.js.map +1 -0
- package/dist/src/shell/interp/tracker-disk.js +99 -0
- package/dist/src/shell/interp/tracker-disk.js.map +1 -0
- package/dist/src/shell/interp/tracker-parse.js +71 -0
- package/dist/src/shell/interp/tracker-parse.js.map +1 -0
- package/dist/src/shell/interp/tracker-scan.js +238 -0
- package/dist/src/shell/interp/tracker-scan.js.map +1 -0
- package/dist/src/shell/interp/tracker-write.js +91 -0
- package/dist/src/shell/interp/tracker-write.js.map +1 -0
- package/dist/src/shell/interp/tracker.js +41 -0
- package/dist/src/shell/interp/tracker.js.map +1 -0
- package/dist/src/shell/interp/tty.js +48 -0
- package/dist/src/shell/interp/tty.js.map +1 -0
- package/dist/src/shell/interp/vm.js +199 -0
- package/dist/src/shell/interp/vm.js.map +1 -0
- package/dist/src/shell/interp/workspace.js +310 -0
- package/dist/src/shell/interp/workspace.js.map +1 -0
- package/dist/src/shell/main-acp.js +78 -0
- package/dist/src/shell/main-acp.js.map +1 -0
- package/dist/src/shell/main-adapters.js +222 -0
- package/dist/src/shell/main-adapters.js.map +1 -0
- package/dist/src/shell/main-credential.js +122 -0
- package/dist/src/shell/main-credential.js.map +1 -0
- package/dist/src/shell/main-doctor.js +22 -0
- package/dist/src/shell/main-doctor.js.map +1 -0
- package/dist/src/shell/main-entry.js +46 -0
- package/dist/src/shell/main-entry.js.map +1 -0
- package/dist/src/shell/main-http-csrf.js +45 -0
- package/dist/src/shell/main-http-csrf.js.map +1 -0
- package/dist/src/shell/main-http-handler.js +389 -0
- package/dist/src/shell/main-http-handler.js.map +1 -0
- package/dist/src/shell/main-http-mcp.js +122 -0
- package/dist/src/shell/main-http-mcp.js.map +1 -0
- package/dist/src/shell/main-http-views.js +253 -0
- package/dist/src/shell/main-http-views.js.map +1 -0
- package/dist/src/shell/main-http.js +76 -0
- package/dist/src/shell/main-http.js.map +1 -0
- package/dist/src/shell/main-loops.js +130 -0
- package/dist/src/shell/main-loops.js.map +1 -0
- package/dist/src/shell/main-mcp.js +129 -0
- package/dist/src/shell/main-mcp.js.map +1 -0
- package/dist/src/shell/main-orchestrator.js +120 -0
- package/dist/src/shell/main-orchestrator.js.map +1 -0
- package/dist/src/shell/main-preflight.js +43 -0
- package/dist/src/shell/main-preflight.js.map +1 -0
- package/dist/src/shell/main-reconcilers-helpers.js +244 -0
- package/dist/src/shell/main-reconcilers-helpers.js.map +1 -0
- package/dist/src/shell/main-reconcilers-pr.js +148 -0
- package/dist/src/shell/main-reconcilers-pr.js.map +1 -0
- package/dist/src/shell/main-reconcilers.js +225 -0
- package/dist/src/shell/main-reconcilers.js.map +1 -0
- package/dist/src/shell/main-runner.js +355 -0
- package/dist/src/shell/main-runner.js.map +1 -0
- package/dist/src/shell/main-scaffold.js +116 -0
- package/dist/src/shell/main-scaffold.js.map +1 -0
- package/dist/src/shell/main-shutdown.js +115 -0
- package/dist/src/shell/main-shutdown.js.map +1 -0
- package/dist/src/shell/main-startup.js +48 -0
- package/dist/src/shell/main-startup.js.map +1 -0
- package/dist/src/shell/main-substrates.js +43 -0
- package/dist/src/shell/main-substrates.js.map +1 -0
- package/dist/src/shell/main.js +385 -0
- package/dist/src/shell/main.js.map +1 -0
- package/dist/src/shell/orchestrator-feedback.js +69 -0
- package/dist/src/shell/orchestrator-feedback.js.map +1 -0
- package/dist/src/shell/orchestrator-image.js +167 -0
- package/dist/src/shell/orchestrator-image.js.map +1 -0
- package/dist/src/shell/orchestrator-loop.js +468 -0
- package/dist/src/shell/orchestrator-loop.js.map +1 -0
- package/dist/src/shell/orchestrator-reconcile.js +36 -0
- package/dist/src/shell/orchestrator-reconcile.js.map +1 -0
- package/dist/src/shell/reconciler-loop.js +228 -0
- package/dist/src/shell/reconciler-loop.js.map +1 -0
- package/dist/src/shell/runner-loop-turn.js +301 -0
- package/dist/src/shell/runner-loop-turn.js.map +1 -0
- package/dist/src/shell/runner-loop.js +338 -0
- package/dist/src/shell/runner-loop.js.map +1 -0
- package/dist/src/shell/server/http.js +208 -0
- package/dist/src/shell/server/http.js.map +1 -0
- package/dist/src/shell/server/mcp-runtime-effects.js +237 -0
- package/dist/src/shell/server/mcp-runtime-effects.js.map +1 -0
- package/dist/src/shell/server/mcp-runtime.js +99 -0
- package/dist/src/shell/server/mcp-runtime.js.map +1 -0
- package/dist/src/shell/workspace-key.js +14 -0
- package/dist/src/shell/workspace-key.js.map +1 -0
- package/dist/src/types/acp.js +8 -0
- package/dist/src/types/acp.js.map +1 -0
- package/dist/src/types/actions/plan.js +6 -0
- package/dist/src/types/actions/plan.js.map +1 -0
- package/dist/src/types/actions/predicates.js +6 -0
- package/dist/src/types/actions/predicates.js.map +1 -0
- package/dist/src/types/actions/run-fold.js +8 -0
- package/dist/src/types/actions/run-fold.js.map +1 -0
- package/dist/src/types/actions.js +7 -0
- package/dist/src/types/actions.js.map +1 -0
- package/dist/src/types/adapter/clock-random.js +4 -0
- package/dist/src/types/adapter/clock-random.js.map +1 -0
- package/dist/src/types/adapter/gondolin-image-converter.js +5 -0
- package/dist/src/types/adapter/gondolin-image-converter.js.map +1 -0
- package/dist/src/types/adapter/gondolin-image-fetch.js +5 -0
- package/dist/src/types/adapter/gondolin-image-fetch.js.map +1 -0
- package/dist/src/types/adapter/workflow-loader.js +4 -0
- package/dist/src/types/adapter/workflow-loader.js.map +1 -0
- package/dist/src/types/cli/args.js +8 -0
- package/dist/src/types/cli/args.js.map +1 -0
- package/dist/src/types/config.js +8 -0
- package/dist/src/types/config.js.map +1 -0
- package/dist/src/types/credential-interp.js +6 -0
- package/dist/src/types/credential-interp.js.map +1 -0
- package/dist/src/types/credentials.js +10 -0
- package/dist/src/types/credentials.js.map +1 -0
- package/dist/src/types/doctor.js +7 -0
- package/dist/src/types/doctor.js.map +1 -0
- package/dist/src/types/domain.js +7 -0
- package/dist/src/types/domain.js.map +1 -0
- package/dist/src/types/effect.js +15 -0
- package/dist/src/types/effect.js.map +1 -0
- package/dist/src/types/errors.js +39 -0
- package/dist/src/types/errors.js.map +1 -0
- package/dist/src/types/http/decisions.js +6 -0
- package/dist/src/types/http/decisions.js.map +1 -0
- package/dist/src/types/http/render.js +10 -0
- package/dist/src/types/http/render.js.map +1 -0
- package/dist/src/types/http/views.js +6 -0
- package/dist/src/types/http/views.js.map +1 -0
- package/dist/src/types/http.js +9 -0
- package/dist/src/types/http.js.map +1 -0
- package/dist/src/types/image/managed-image.js +7 -0
- package/dist/src/types/image/managed-image.js.map +1 -0
- package/dist/src/types/interp/effect-interpreter.js +8 -0
- package/dist/src/types/interp/effect-interpreter.js.map +1 -0
- package/dist/src/types/interp/tracker.js +7 -0
- package/dist/src/types/interp/tracker.js.map +1 -0
- package/dist/src/types/issue/file.js +6 -0
- package/dist/src/types/issue/file.js.map +1 -0
- package/dist/src/types/issue/parse.js +8 -0
- package/dist/src/types/issue/parse.js.map +1 -0
- package/dist/src/types/main-acp.js +13 -0
- package/dist/src/types/main-acp.js.map +1 -0
- package/dist/src/types/main-adapters.js +5 -0
- package/dist/src/types/main-adapters.js.map +1 -0
- package/dist/src/types/main-credential.js +21 -0
- package/dist/src/types/main-credential.js.map +1 -0
- package/dist/src/types/main-doctor.js +6 -0
- package/dist/src/types/main-doctor.js.map +1 -0
- package/dist/src/types/main-http-handler.js +12 -0
- package/dist/src/types/main-http-handler.js.map +1 -0
- package/dist/src/types/main-http.js +5 -0
- package/dist/src/types/main-http.js.map +1 -0
- package/dist/src/types/main-loops.js +5 -0
- package/dist/src/types/main-loops.js.map +1 -0
- package/dist/src/types/main-mcp.js +12 -0
- package/dist/src/types/main-mcp.js.map +1 -0
- package/dist/src/types/main-orchestrator.js +5 -0
- package/dist/src/types/main-orchestrator.js.map +1 -0
- package/dist/src/types/main-reconcilers.js +11 -0
- package/dist/src/types/main-reconcilers.js.map +1 -0
- package/dist/src/types/main-runner.js +13 -0
- package/dist/src/types/main-runner.js.map +1 -0
- package/dist/src/types/main-startup.js +5 -0
- package/dist/src/types/main-startup.js.map +1 -0
- package/dist/src/types/main-substrates.js +5 -0
- package/dist/src/types/main-substrates.js.map +1 -0
- package/dist/src/types/mcp/dispatch.js +4 -0
- package/dist/src/types/mcp/dispatch.js.map +1 -0
- package/dist/src/types/mcp/post-move.js +7 -0
- package/dist/src/types/mcp/post-move.js.map +1 -0
- package/dist/src/types/mcp.js +9 -0
- package/dist/src/types/mcp.js.map +1 -0
- package/dist/src/types/ports.js +12 -0
- package/dist/src/types/ports.js.map +1 -0
- package/dist/src/types/reconcile/image-decide.js +5 -0
- package/dist/src/types/reconcile/image-decide.js.map +1 -0
- package/dist/src/types/reconcile/ledger.js +7 -0
- package/dist/src/types/reconcile/ledger.js.map +1 -0
- package/dist/src/types/reconcile/pr-loop.js +8 -0
- package/dist/src/types/reconcile/pr-loop.js.map +1 -0
- package/dist/src/types/reconcile/vm-reap.js +8 -0
- package/dist/src/types/reconcile/vm-reap.js.map +1 -0
- package/dist/src/types/reconcile/workspace-decide.js +7 -0
- package/dist/src/types/reconcile/workspace-decide.js.map +1 -0
- package/dist/src/types/reconcile.js +9 -0
- package/dist/src/types/reconcile.js.map +1 -0
- package/dist/src/types/runlog.js +7 -0
- package/dist/src/types/runlog.js.map +1 -0
- package/dist/src/types/runner/actions-runner.js +12 -0
- package/dist/src/types/runner/actions-runner.js.map +1 -0
- package/dist/src/types/runner/gondolin-dispatch.js +5 -0
- package/dist/src/types/runner/gondolin-dispatch.js.map +1 -0
- package/dist/src/types/runner/injection.js +6 -0
- package/dist/src/types/runner/injection.js.map +1 -0
- package/dist/src/types/runner/runner-loop.js +5 -0
- package/dist/src/types/runner/runner-loop.js.map +1 -0
- package/dist/src/types/runner/turn.js +4 -0
- package/dist/src/types/runner/turn.js.map +1 -0
- package/dist/src/types/runner/vm-plan.js +4 -0
- package/dist/src/types/runner/vm-plan.js.map +1 -0
- package/dist/src/types/runtime.js +9 -0
- package/dist/src/types/runtime.js.map +1 -0
- package/dist/src/types/schedule/admission.js +7 -0
- package/dist/src/types/schedule/admission.js.map +1 -0
- package/dist/src/types/schedule/circuit-breaker.js +2 -0
- package/dist/src/types/schedule/circuit-breaker.js.map +1 -0
- package/dist/src/types/schedule/eligibility.js +9 -0
- package/dist/src/types/schedule/eligibility.js.map +1 -0
- package/dist/src/types/schedule/orchestrator-loop.js +10 -0
- package/dist/src/types/schedule/orchestrator-loop.js.map +1 -0
- package/dist/src/types/schedule/sleep-cycle.js +4 -0
- package/dist/src/types/schedule/sleep-cycle.js.map +1 -0
- package/dist/src/types/schedule/slots.js +8 -0
- package/dist/src/types/schedule/slots.js.map +1 -0
- package/dist/src/types/schedule/tick.js +9 -0
- package/dist/src/types/schedule/tick.js.map +1 -0
- package/dist/src/types/server/mcp-runtime.js +8 -0
- package/dist/src/types/server/mcp-runtime.js.map +1 -0
- package/dist/src/types/workflow/parse.js +4 -0
- package/dist/src/types/workflow/parse.js.map +1 -0
- package/dist/tests/core/account-id.test.js +35 -0
- package/dist/tests/core/account-id.test.js.map +1 -0
- package/dist/tests/core/actions-parse.test.js +176 -0
- package/dist/tests/core/actions-parse.test.js.map +1 -0
- package/dist/tests/core/adapter-config.test.js +133 -0
- package/dist/tests/core/adapter-config.test.js.map +1 -0
- package/dist/tests/core/admission.test.js +215 -0
- package/dist/tests/core/admission.test.js.map +1 -0
- package/dist/tests/core/args.test.js +132 -0
- package/dist/tests/core/args.test.js.map +1 -0
- package/dist/tests/core/availability.test.js +62 -0
- package/dist/tests/core/availability.test.js.map +1 -0
- package/dist/tests/core/checks.test.js +395 -0
- package/dist/tests/core/checks.test.js.map +1 -0
- package/dist/tests/core/circuit-breaker.test.js +172 -0
- package/dist/tests/core/circuit-breaker.test.js.map +1 -0
- package/dist/tests/core/coerce.test.js +87 -0
- package/dist/tests/core/coerce.test.js.map +1 -0
- package/dist/tests/core/context.test.js +228 -0
- package/dist/tests/core/context.test.js.map +1 -0
- package/dist/tests/core/decisions.test.js +310 -0
- package/dist/tests/core/decisions.test.js.map +1 -0
- package/dist/tests/core/derive.test.js +205 -0
- package/dist/tests/core/derive.test.js.map +1 -0
- package/dist/tests/core/dispatch-config.test.js +164 -0
- package/dist/tests/core/dispatch-config.test.js.map +1 -0
- package/dist/tests/core/dispatch.test.js +302 -0
- package/dist/tests/core/dispatch.test.js.map +1 -0
- package/dist/tests/core/eligibility.test.js +163 -0
- package/dist/tests/core/eligibility.test.js.map +1 -0
- package/dist/tests/core/extract.test.js +139 -0
- package/dist/tests/core/extract.test.js.map +1 -0
- package/dist/tests/core/fake-creds.test.js +134 -0
- package/dist/tests/core/fake-creds.test.js.map +1 -0
- package/dist/tests/core/file.test.js +197 -0
- package/dist/tests/core/file.test.js.map +1 -0
- package/dist/tests/core/git-result.test.js +113 -0
- package/dist/tests/core/git-result.test.js.map +1 -0
- package/dist/tests/core/identity.test.js +180 -0
- package/dist/tests/core/identity.test.js.map +1 -0
- package/dist/tests/core/image-decide.test.js +59 -0
- package/dist/tests/core/image-decide.test.js.map +1 -0
- package/dist/tests/core/injection.test.js +163 -0
- package/dist/tests/core/injection.test.js.map +1 -0
- package/dist/tests/core/ledger.test.js +218 -0
- package/dist/tests/core/ledger.test.js.map +1 -0
- package/dist/tests/core/managed-image.test.js +68 -0
- package/dist/tests/core/managed-image.test.js.map +1 -0
- package/dist/tests/core/mise.test.js +138 -0
- package/dist/tests/core/mise.test.js.map +1 -0
- package/dist/tests/core/parse.test.js +174 -0
- package/dist/tests/core/parse.test.js.map +1 -0
- package/dist/tests/core/path.test.js +50 -0
- package/dist/tests/core/path.test.js.map +1 -0
- package/dist/tests/core/plan.test.js +218 -0
- package/dist/tests/core/plan.test.js.map +1 -0
- package/dist/tests/core/post-move.test.js +162 -0
- package/dist/tests/core/post-move.test.js.map +1 -0
- package/dist/tests/core/pr-classify.test.js +117 -0
- package/dist/tests/core/pr-classify.test.js.map +1 -0
- package/dist/tests/core/pr-decide.test.js +298 -0
- package/dist/tests/core/pr-decide.test.js.map +1 -0
- package/dist/tests/core/pr-loop.test.js +301 -0
- package/dist/tests/core/pr-loop.test.js.map +1 -0
- package/dist/tests/core/pr-notes.test.js +165 -0
- package/dist/tests/core/pr-notes.test.js.map +1 -0
- package/dist/tests/core/predicates.test.js +154 -0
- package/dist/tests/core/predicates.test.js.map +1 -0
- package/dist/tests/core/prompt.test.js +189 -0
- package/dist/tests/core/prompt.test.js.map +1 -0
- package/dist/tests/core/protocol.test.js +195 -0
- package/dist/tests/core/protocol.test.js.map +1 -0
- package/dist/tests/core/reconcile-issue.test.js +116 -0
- package/dist/tests/core/reconcile-issue.test.js.map +1 -0
- package/dist/tests/core/render.test.js +549 -0
- package/dist/tests/core/render.test.js.map +1 -0
- package/dist/tests/core/retry.test.js +186 -0
- package/dist/tests/core/retry.test.js.map +1 -0
- package/dist/tests/core/routes.test.js +247 -0
- package/dist/tests/core/routes.test.js.map +1 -0
- package/dist/tests/core/run-fold.test.js +299 -0
- package/dist/tests/core/run-fold.test.js.map +1 -0
- package/dist/tests/core/shape.test.js +185 -0
- package/dist/tests/core/shape.test.js.map +1 -0
- package/dist/tests/core/sleep-cycle.test.js +150 -0
- package/dist/tests/core/sleep-cycle.test.js.map +1 -0
- package/dist/tests/core/slots.test.js +201 -0
- package/dist/tests/core/slots.test.js.map +1 -0
- package/dist/tests/core/state-resolve.test.js +80 -0
- package/dist/tests/core/state-resolve.test.js.map +1 -0
- package/dist/tests/core/summary.test.js +200 -0
- package/dist/tests/core/summary.test.js.map +1 -0
- package/dist/tests/core/template.test.js +116 -0
- package/dist/tests/core/template.test.js.map +1 -0
- package/dist/tests/core/tick.test.js +558 -0
- package/dist/tests/core/tick.test.js.map +1 -0
- package/dist/tests/core/token-fold.test.js +176 -0
- package/dist/tests/core/token-fold.test.js.map +1 -0
- package/dist/tests/core/turn.test.js +388 -0
- package/dist/tests/core/turn.test.js.map +1 -0
- package/dist/tests/core/url.test.js +118 -0
- package/dist/tests/core/url.test.js.map +1 -0
- package/dist/tests/core/validate.test.js +247 -0
- package/dist/tests/core/validate.test.js.map +1 -0
- package/dist/tests/core/views.test.js +252 -0
- package/dist/tests/core/views.test.js.map +1 -0
- package/dist/tests/core/vm-decide.test.js +110 -0
- package/dist/tests/core/vm-decide.test.js.map +1 -0
- package/dist/tests/core/vm-guards.test.js +153 -0
- package/dist/tests/core/vm-guards.test.js.map +1 -0
- package/dist/tests/core/vm-plan.test.js +332 -0
- package/dist/tests/core/vm-plan.test.js.map +1 -0
- package/dist/tests/core/vm-reap.test.js +196 -0
- package/dist/tests/core/vm-reap.test.js.map +1 -0
- package/dist/tests/core/workflow-parse.test.js +493 -0
- package/dist/tests/core/workflow-parse.test.js.map +1 -0
- package/dist/tests/core/workspace-decide.test.js +236 -0
- package/dist/tests/core/workspace-decide.test.js.map +1 -0
- package/dist/tests/helpers/fixtures.js +167 -0
- package/dist/tests/helpers/fixtures.js.map +1 -0
- package/dist/tests/shell/acp-substrate.test.js +101 -0
- package/dist/tests/shell/acp-substrate.test.js.map +1 -0
- package/dist/tests/shell/actions-runner-push.test.js +203 -0
- package/dist/tests/shell/actions-runner-push.test.js.map +1 -0
- package/dist/tests/shell/credential-hooks.test.js +36 -0
- package/dist/tests/shell/credential-hooks.test.js.map +1 -0
- package/dist/tests/shell/credential-registry.test.js +165 -0
- package/dist/tests/shell/credential-registry.test.js.map +1 -0
- package/dist/tests/shell/credential-substrate.test.js +179 -0
- package/dist/tests/shell/credential-substrate.test.js.map +1 -0
- package/dist/tests/shell/dockerfile-mise-pin.test.js +51 -0
- package/dist/tests/shell/dockerfile-mise-pin.test.js.map +1 -0
- package/dist/tests/shell/doctor.test.js +101 -0
- package/dist/tests/shell/doctor.test.js.map +1 -0
- package/dist/tests/shell/effect-vm-create.test.js +52 -0
- package/dist/tests/shell/effect-vm-create.test.js.map +1 -0
- package/dist/tests/shell/gh-port.test.js +63 -0
- package/dist/tests/shell/gh-port.test.js.map +1 -0
- package/dist/tests/shell/gondolin-dispatch-guard.test.js +144 -0
- package/dist/tests/shell/gondolin-dispatch-guard.test.js.map +1 -0
- package/dist/tests/shell/gondolin-dispatch-shquote.test.js +168 -0
- package/dist/tests/shell/gondolin-dispatch-shquote.test.js.map +1 -0
- package/dist/tests/shell/gondolin-image-converter.test.js +208 -0
- package/dist/tests/shell/gondolin-image-converter.test.js.map +1 -0
- package/dist/tests/shell/gondolin-image-fetch.test.js +93 -0
- package/dist/tests/shell/gondolin-image-fetch.test.js.map +1 -0
- package/dist/tests/shell/http-handler.test.js +608 -0
- package/dist/tests/shell/http-handler.test.js.map +1 -0
- package/dist/tests/shell/http-server.test.js +53 -0
- package/dist/tests/shell/http-server.test.js.map +1 -0
- package/dist/tests/shell/mcp-runtime.test.js +366 -0
- package/dist/tests/shell/mcp-runtime.test.js.map +1 -0
- package/dist/tests/shell/mise-config-asset.test.js +87 -0
- package/dist/tests/shell/mise-config-asset.test.js.map +1 -0
- package/dist/tests/shell/orchestrator-loop.test.js +583 -0
- package/dist/tests/shell/orchestrator-loop.test.js.map +1 -0
- package/dist/tests/shell/reconciler-passes.test.js +314 -0
- package/dist/tests/shell/reconciler-passes.test.js.map +1 -0
- package/dist/tests/shell/runner-loop-turn.test.js +97 -0
- package/dist/tests/shell/runner-loop-turn.test.js.map +1 -0
- package/dist/tests/shell/runner-slice.test.js +536 -0
- package/dist/tests/shell/runner-slice.test.js.map +1 -0
- package/dist/tests/shell/scaffold.test.js +65 -0
- package/dist/tests/shell/scaffold.test.js.map +1 -0
- package/dist/tests/shell/tick-config.test.js +83 -0
- package/dist/tests/shell/tick-config.test.js.map +1 -0
- package/dist/tests/shell/tracker-parse-dates.test.js +44 -0
- package/dist/tests/shell/tracker-parse-dates.test.js.map +1 -0
- package/dist/tests/shell/tracker-write-issue.test.js +154 -0
- package/dist/tests/shell/tracker-write-issue.test.js.map +1 -0
- package/dist/tests/shell/workflow-prompt-split.test.js +208 -0
- package/dist/tests/shell/workflow-prompt-split.test.js.map +1 -0
- package/dist/tests/shell/workspace-live-config.test.js +140 -0
- package/dist/tests/shell/workspace-live-config.test.js.map +1 -0
- package/package.json +21 -9
- package/patches/@earendil-works+gondolin+0.12.0.patch +173 -0
- package/prompts/Reflect.md +91 -0
- package/prompts/Review.md +97 -0
- package/prompts/Todo.md +96 -0
- package/prompts/_footer.md +41 -0
- package/prompts/_preamble.md +42 -0
- package/prompts-minimal/Todo.md +26 -0
- package/scripts/postinstall.mjs +63 -0
- package/scripts/vm-agent.mjs +312 -90
- package/WORKFLOW.md +0 -744
- package/dist/acp-bridge.js +0 -324
- package/dist/acp-bridge.js.map +0 -1
- package/dist/actions/cache.js +0 -191
- package/dist/actions/cache.js.map +0 -1
- package/dist/actions/effects.js +0 -41
- package/dist/actions/effects.js.map +0 -1
- package/dist/actions/executor.js +0 -570
- package/dist/actions/executor.js.map +0 -1
- package/dist/actions/index.js +0 -13
- package/dist/actions/index.js.map +0 -1
- package/dist/actions/parsing.js.map +0 -1
- package/dist/actions/predicate-env.js +0 -27
- package/dist/actions/predicate-env.js.map +0 -1
- package/dist/actions/predicates.js +0 -49
- package/dist/actions/predicates.js.map +0 -1
- package/dist/actions/templating.js +0 -66
- package/dist/actions/templating.js.map +0 -1
- package/dist/actions/types.js +0 -15
- package/dist/actions/types.js.map +0 -1
- package/dist/agent/acp.js +0 -473
- package/dist/agent/acp.js.map +0 -1
- package/dist/agent/adapter-names.js +0 -159
- package/dist/agent/adapter-names.js.map +0 -1
- package/dist/agent/adapters.js +0 -511
- package/dist/agent/adapters.js.map +0 -1
- package/dist/agent/credential-extractors.js +0 -342
- package/dist/agent/credential-extractors.js.map +0 -1
- package/dist/agent/credential-secrets.js +0 -628
- package/dist/agent/credential-secrets.js.map +0 -1
- package/dist/agent/credential-ticker.js +0 -57
- package/dist/agent/credential-ticker.js.map +0 -1
- package/dist/agent/gondolin-creds-staging.js +0 -356
- package/dist/agent/gondolin-creds-staging.js.map +0 -1
- package/dist/agent/gondolin-dispatch.js +0 -375
- package/dist/agent/gondolin-dispatch.js.map +0 -1
- package/dist/agent/gondolin.js +0 -124
- package/dist/agent/gondolin.js.map +0 -1
- package/dist/agent/runner-decisions.js +0 -134
- package/dist/agent/runner-decisions.js.map +0 -1
- package/dist/agent/runner.js +0 -1456
- package/dist/agent/runner.js.map +0 -1
- package/dist/agent/tool-call-summary.js +0 -102
- package/dist/agent/tool-call-summary.js.map +0 -1
- package/dist/agent/vm-acp-mapping.js +0 -73
- package/dist/agent/vm-acp-mapping.js.map +0 -1
- package/dist/agent/vm-guards.js +0 -262
- package/dist/agent/vm-guards.js.map +0 -1
- package/dist/agent/vm-port.js +0 -22
- package/dist/agent/vm-port.js.map +0 -1
- package/dist/agent/vm-process-registry.js +0 -79
- package/dist/agent/vm-process-registry.js.map +0 -1
- package/dist/bin/cli-args.js +0 -105
- package/dist/bin/cli-args.js.map +0 -1
- package/dist/bin/symphony.js +0 -794
- package/dist/bin/symphony.js.map +0 -1
- package/dist/errors.js +0 -15
- package/dist/errors.js.map +0 -1
- package/dist/http-disk.js +0 -135
- package/dist/http-disk.js.map +0 -1
- package/dist/http-handlers.js.map +0 -1
- package/dist/http.js.map +0 -1
- package/dist/issues.js +0 -178
- package/dist/issues.js.map +0 -1
- package/dist/logging.js +0 -203
- package/dist/logging.js.map +0 -1
- package/dist/mcp.js +0 -706
- package/dist/mcp.js.map +0 -1
- package/dist/memory.js +0 -85
- package/dist/memory.js.map +0 -1
- package/dist/orchestrator-decisions.js +0 -331
- package/dist/orchestrator-decisions.js.map +0 -1
- package/dist/orchestrator.js +0 -1569
- package/dist/orchestrator.js.map +0 -1
- package/dist/prompt.js +0 -65
- package/dist/prompt.js.map +0 -1
- package/dist/reconciler/cache.js +0 -65
- package/dist/reconciler/cache.js.map +0 -1
- package/dist/reconciler/index.js +0 -448
- package/dist/reconciler/index.js.map +0 -1
- package/dist/reconciler/ledger.js +0 -131
- package/dist/reconciler/ledger.js.map +0 -1
- package/dist/reconciler/pr-adapters.js +0 -174
- package/dist/reconciler/pr-adapters.js.map +0 -1
- package/dist/reconciler/pr-decide.js.map +0 -1
- package/dist/reconciler/pr.js +0 -422
- package/dist/reconciler/pr.js.map +0 -1
- package/dist/reconciler/types.js +0 -12
- package/dist/reconciler/types.js.map +0 -1
- package/dist/reconciler/vm.js +0 -243
- package/dist/reconciler/vm.js.map +0 -1
- package/dist/reconciler/workspace-defaults.js +0 -83
- package/dist/reconciler/workspace-defaults.js.map +0 -1
- package/dist/reconciler/workspace.js +0 -272
- package/dist/reconciler/workspace.js.map +0 -1
- package/dist/runlog.js +0 -403
- package/dist/runlog.js.map +0 -1
- package/dist/scaffold.js +0 -165
- package/dist/scaffold.js.map +0 -1
- package/dist/trackers/local.js +0 -445
- package/dist/trackers/local.js.map +0 -1
- package/dist/trackers/types.js +0 -10
- package/dist/trackers/types.js.map +0 -1
- package/dist/types.js +0 -3
- package/dist/types.js.map +0 -1
- package/dist/util/clock.js +0 -12
- package/dist/util/clock.js.map +0 -1
- package/dist/util/crypto.js +0 -25
- package/dist/util/crypto.js.map +0 -1
- package/dist/util/frontmatter.js +0 -70
- package/dist/util/frontmatter.js.map +0 -1
- package/dist/util/fs-issues.js +0 -22
- package/dist/util/fs-issues.js.map +0 -1
- package/dist/util/process.js +0 -152
- package/dist/util/process.js.map +0 -1
- package/dist/util/workspace-key.js +0 -10
- package/dist/util/workspace-key.js.map +0 -1
- package/dist/workflow-loader.js +0 -147
- package/dist/workflow-loader.js.map +0 -1
- package/dist/workflow.js +0 -822
- package/dist/workflow.js.map +0 -1
- package/dist/workspace-types.js +0 -8
- package/dist/workspace-types.js.map +0 -1
- package/dist/workspace.js +0 -443
- package/dist/workspace.js.map +0 -1
package/dist/trackers/local.js
DELETED
|
@@ -1,445 +0,0 @@
|
|
|
1
|
-
// Filesystem-backed tracker that reads issues from
|
|
2
|
-
// <tracker.root>/<state>/<identifier>.md
|
|
3
|
-
//
|
|
4
|
-
// Each .md file has YAML front matter:
|
|
5
|
-
// ---
|
|
6
|
-
// id: ABC-1 # optional; defaults to basename
|
|
7
|
-
// identifier: ABC-1 # optional; defaults to basename
|
|
8
|
-
// title: ...
|
|
9
|
-
// priority: 2 # optional
|
|
10
|
-
// labels: [bug, foo] # optional
|
|
11
|
-
// blocked_by: [ABC-2] # optional, list of identifiers
|
|
12
|
-
// branch_name: feat/x # optional
|
|
13
|
-
// url: https://... # optional
|
|
14
|
-
// created_at: 2026-05-18T12:00:00Z # optional
|
|
15
|
-
// updated_at: 2026-05-18T13:00:00Z # optional
|
|
16
|
-
// ---
|
|
17
|
-
// <description body>
|
|
18
|
-
//
|
|
19
|
-
// The state of an issue is taken verbatim from the parent directory name.
|
|
20
|
-
// State comparison is case-insensitive (SPEC §3.2 "Normalized Issue State").
|
|
21
|
-
import { mkdir, open, readdir, readFile, rename, stat } from 'node:fs/promises';
|
|
22
|
-
import path from 'node:path';
|
|
23
|
-
import { parseFrontMatter, FrontMatterError } from '../util/frontmatter.js';
|
|
24
|
-
import { TrackerError } from './types.js';
|
|
25
|
-
import { activeStateNames, terminalStateNames } from '../issues.js';
|
|
26
|
-
import { log } from '../logging.js';
|
|
27
|
-
function asString(v) {
|
|
28
|
-
return typeof v === 'string' ? v : null;
|
|
29
|
-
}
|
|
30
|
-
function asStringList(v) {
|
|
31
|
-
if (Array.isArray(v))
|
|
32
|
-
return v.filter((x) => typeof x === 'string');
|
|
33
|
-
return [];
|
|
34
|
-
}
|
|
35
|
-
function asInt(v) {
|
|
36
|
-
if (typeof v === 'number' && Number.isInteger(v))
|
|
37
|
-
return v;
|
|
38
|
-
if (typeof v === 'string' && /^-?\d+$/.test(v))
|
|
39
|
-
return parseInt(v, 10);
|
|
40
|
-
return null;
|
|
41
|
-
}
|
|
42
|
-
function asTimestamp(v) {
|
|
43
|
-
if (typeof v === 'string')
|
|
44
|
-
return v;
|
|
45
|
-
if (v instanceof Date)
|
|
46
|
-
return v.toISOString();
|
|
47
|
-
return null;
|
|
48
|
-
}
|
|
49
|
-
// Compose the appended-notes body. Pure: extracted so `appendNotesBlock` stays small
|
|
50
|
-
// enough for the imperative-shell complexity budget. Guarantees a blank line between the
|
|
51
|
-
// prior body and the new header; the block itself ends with a newline so subsequent
|
|
52
|
-
// appends stay readable.
|
|
53
|
-
function buildNotesAppendedBody(original, fromState, toState, notes, actor) {
|
|
54
|
-
const who = actor && actor.length > 0 ? actor : 'unknown';
|
|
55
|
-
const ts = new Date().toISOString();
|
|
56
|
-
const header = `## ${who} — ${ts} — ${fromState} → ${toState}`;
|
|
57
|
-
const sep = original.endsWith('\n\n') ? '' : original.endsWith('\n') ? '\n' : '\n\n';
|
|
58
|
-
return `${original}${sep}${header}\n\n${notes}\n`;
|
|
59
|
-
}
|
|
60
|
-
// Thin wrapper over the shared parser. Translates FrontMatterError → TrackerError
|
|
61
|
-
// so the scanner's existing skip-and-log catch picks them up under the same code.
|
|
62
|
-
function splitFrontMatter(text) {
|
|
63
|
-
let fm;
|
|
64
|
-
try {
|
|
65
|
-
fm = parseFrontMatter(text);
|
|
66
|
-
}
|
|
67
|
-
catch (err) {
|
|
68
|
-
if (err instanceof FrontMatterError) {
|
|
69
|
-
throw new TrackerError('local_issue_parse_error', err.code === 'not_a_map' ? 'issue front matter must be a map' : `failed to parse front matter: ${err.message}`);
|
|
70
|
-
}
|
|
71
|
-
throw err;
|
|
72
|
-
}
|
|
73
|
-
return { config: fm.fields, body: fm.body };
|
|
74
|
-
}
|
|
75
|
-
export class LocalMarkdownTracker {
|
|
76
|
-
cfg;
|
|
77
|
-
constructor(cfg) {
|
|
78
|
-
this.cfg = cfg;
|
|
79
|
-
if (!cfg.root)
|
|
80
|
-
throw new TrackerError('local_no_root', 'tracker.root is required');
|
|
81
|
-
}
|
|
82
|
-
updateConfig(cfg) {
|
|
83
|
-
if (!cfg.root)
|
|
84
|
-
throw new TrackerError('local_no_root', 'tracker.root is required');
|
|
85
|
-
this.cfg = cfg;
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Eagerly create the directory for every declared state under `tracker.root`.
|
|
89
|
-
* Called from the orchestrator boot path so the operator-facing tree (and the
|
|
90
|
-
* dashboard) sees every column the workflow declared, even before any issue
|
|
91
|
-
* file lands in it. Lazy creation in writeIssueFile / moveIssueToState is left
|
|
92
|
-
* in place as a belt-and-suspenders fallback for code paths that target a
|
|
93
|
-
* state directory directly.
|
|
94
|
-
*/
|
|
95
|
-
async start() {
|
|
96
|
-
if (!this.cfg.root)
|
|
97
|
-
throw new TrackerError('local_no_root', 'tracker.root is required');
|
|
98
|
-
// `states` is canonical (the workflow parser refuses configs without it);
|
|
99
|
-
// mkdir each declared state directory so the dashboard sees every column
|
|
100
|
-
// even before issues land.
|
|
101
|
-
for (const name of Object.keys(this.cfg.states)) {
|
|
102
|
-
await mkdir(path.join(this.cfg.root, name), { recursive: true });
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
get root() {
|
|
106
|
-
return this.cfg.root;
|
|
107
|
-
}
|
|
108
|
-
async fetchCandidateIssues() {
|
|
109
|
-
// Capture root atomically at method entry. A workflow reload during the
|
|
110
|
-
// fetch I/O cannot make the returned issues and the returned snapshot
|
|
111
|
-
// disagree — both come from this single view of cfg.
|
|
112
|
-
const root = this.cfg.root;
|
|
113
|
-
const active = new Set(activeStateNames(this.cfg.states).map((s) => s.toLowerCase()));
|
|
114
|
-
const terminal = new Set(terminalStateNames(this.cfg.states).map((s) => s.toLowerCase()));
|
|
115
|
-
const all = await this.scanAllAt(root);
|
|
116
|
-
const filtered = all.filter((raw) => {
|
|
117
|
-
const s = raw.state.toLowerCase();
|
|
118
|
-
return active.has(s) && !terminal.has(s);
|
|
119
|
-
});
|
|
120
|
-
return {
|
|
121
|
-
issues: this.normalize(filtered, all),
|
|
122
|
-
root,
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
async fetchIssuesByStates(stateNames) {
|
|
126
|
-
// Empty input returns empty without an API call.
|
|
127
|
-
if (stateNames.length === 0)
|
|
128
|
-
return [];
|
|
129
|
-
const want = new Set(stateNames.map((s) => s.toLowerCase()));
|
|
130
|
-
const all = await this.scanAll();
|
|
131
|
-
const filtered = all.filter((raw) => want.has(raw.state.toLowerCase()));
|
|
132
|
-
return this.normalize(filtered, all);
|
|
133
|
-
}
|
|
134
|
-
async fetchIssueStatesByIds(issueIds) {
|
|
135
|
-
if (issueIds.length === 0)
|
|
136
|
-
return [];
|
|
137
|
-
const want = new Set(issueIds);
|
|
138
|
-
const all = await this.scanAll();
|
|
139
|
-
const found = all.filter((raw) => want.has(this.idOf(raw)));
|
|
140
|
-
return this.normalize(found, all);
|
|
141
|
-
}
|
|
142
|
-
/** Expose the current tracker root so callers can snapshot it at dispatch time. */
|
|
143
|
-
currentRoot() {
|
|
144
|
-
return this.cfg.root;
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Move an issue's .md file from its current state directory to `toState`. Used by the
|
|
148
|
-
* MCP transition tool. Atomic on the same filesystem (fs.rename); throws TrackerError
|
|
149
|
-
* with a stable code on common failure modes so the MCP layer can surface them.
|
|
150
|
-
*
|
|
151
|
-
* When `opts.notes` is a non-empty string, a notes block is appended to the issue body
|
|
152
|
-
* BEFORE the cross-directory rename: the new body is written to `<id>.md.tmp` in the
|
|
153
|
-
* source state directory, fsync'd, then atomically renamed onto `<id>.md` so the file
|
|
154
|
-
* is still in the source state directory but now carries the notes. The
|
|
155
|
-
* cross-directory rename then moves the updated file into the target state. This
|
|
156
|
-
* sequencing means a crash between the two renames leaves the notes persisted in the
|
|
157
|
-
* source directory — the next dispatch sees them on the live issue and the operator
|
|
158
|
-
* can finish the move by hand.
|
|
159
|
-
*/
|
|
160
|
-
async moveIssueToState(issueId, toState, opts) {
|
|
161
|
-
// When the caller pins a root (snapshot from dispatch time), scan there.
|
|
162
|
-
// Otherwise use whatever the live config says. This protects in-flight
|
|
163
|
-
// transition calls from a WORKFLOW.md reload that mutates tracker.root.
|
|
164
|
-
const { fromRoot, fromState, notes: rawNotes, actor } = opts ?? {};
|
|
165
|
-
const root = fromRoot ?? this.root;
|
|
166
|
-
const notes = typeof rawNotes === 'string' ? rawNotes : '';
|
|
167
|
-
const all = await this.scanAllAt(root);
|
|
168
|
-
const candidates = all.filter((raw) => this.idOf(raw) === issueId);
|
|
169
|
-
if (candidates.length === 0) {
|
|
170
|
-
throw new TrackerError('local_issue_not_found', `no issue file matches id ${issueId}`);
|
|
171
|
-
}
|
|
172
|
-
const match = this.resolveMatch(candidates, issueId, fromState);
|
|
173
|
-
if (match.state.toLowerCase() === toState.toLowerCase()) {
|
|
174
|
-
return { fromState: match.state, toState: match.state, newPath: match.filePath };
|
|
175
|
-
}
|
|
176
|
-
if (notes.length > 0) {
|
|
177
|
-
await this.appendNotesBlock(match, toState, notes, actor);
|
|
178
|
-
}
|
|
179
|
-
const targetDir = path.join(root, toState);
|
|
180
|
-
await mkdir(targetDir, { recursive: true });
|
|
181
|
-
const newPath = path.join(targetDir, path.basename(match.filePath));
|
|
182
|
-
await this.assertTargetFree(newPath);
|
|
183
|
-
await this.crossDirRename(match.filePath, newPath);
|
|
184
|
-
log.info('issue transitioned', {
|
|
185
|
-
issue_id: issueId,
|
|
186
|
-
from_state: match.state,
|
|
187
|
-
to_state: toState,
|
|
188
|
-
path: newPath,
|
|
189
|
-
});
|
|
190
|
-
return { fromState: match.state, toState, newPath };
|
|
191
|
-
}
|
|
192
|
-
async crossDirRename(srcPath, dstPath) {
|
|
193
|
-
try {
|
|
194
|
-
await rename(srcPath, dstPath);
|
|
195
|
-
}
|
|
196
|
-
catch (err) {
|
|
197
|
-
throw new TrackerError('local_issue_move_error', `failed to move ${srcPath} -> ${dstPath}: ${err.message}`);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
// Multiple files can share the same id when a stale terminal copy (e.g. an old
|
|
201
|
-
// Done/ABC-1.md from a prior cycle) survives alongside a live In Progress/ABC-1.md.
|
|
202
|
-
// `readdir` ordering is filesystem-dependent, so a blind `.find(...)` can pick the
|
|
203
|
-
// stale copy and — if its state already equals `toState` — silently no-op via the
|
|
204
|
-
// identity short-circuit in the caller, leaving the active file stranded. Prefer the
|
|
205
|
-
// copy whose state matches the caller-supplied `fromState`; if that still doesn't
|
|
206
|
-
// resolve to a single file, refuse to guess.
|
|
207
|
-
resolveMatch(candidates, issueId, fromState) {
|
|
208
|
-
if (candidates.length === 1)
|
|
209
|
-
return candidates[0];
|
|
210
|
-
const preferred = fromState
|
|
211
|
-
? candidates.filter((raw) => raw.state.toLowerCase() === fromState.toLowerCase())
|
|
212
|
-
: [];
|
|
213
|
-
if (preferred.length === 1)
|
|
214
|
-
return preferred[0];
|
|
215
|
-
const states = candidates.map((raw) => raw.state).join(', ');
|
|
216
|
-
throw new TrackerError('local_issue_ambiguous', `multiple issue files match id ${issueId} across states [${states}]; pass fromState to disambiguate`);
|
|
217
|
-
}
|
|
218
|
-
// We re-read the file (the scan parsed front-matter + body but discarded the verbatim
|
|
219
|
-
// text) so the rewrite preserves operator-visible whitespace, comments, and any
|
|
220
|
-
// trailing newlines exactly. The append block format is fixed across the tracker so the
|
|
221
|
-
// dashboard / downstream tooling can recognise it.
|
|
222
|
-
async appendNotesBlock(match, toState, notes, actor) {
|
|
223
|
-
const original = await this.readForNotesAppend(match.filePath);
|
|
224
|
-
const appended = buildNotesAppendedBody(original, match.state, toState, notes, actor);
|
|
225
|
-
await this.durablyReplaceInPlace(match.filePath, appended);
|
|
226
|
-
}
|
|
227
|
-
async readForNotesAppend(filePath) {
|
|
228
|
-
try {
|
|
229
|
-
return await readFile(filePath, 'utf8');
|
|
230
|
-
}
|
|
231
|
-
catch (err) {
|
|
232
|
-
throw new TrackerError('local_issue_notes_read_error', `failed to read ${filePath} for notes append: ${err.message}`);
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
// Write to <targetPath>.tmp in the SAME directory, fsync the file descriptor for
|
|
236
|
-
// durability, then atomic-rename onto targetPath. Same-directory rename is atomic on
|
|
237
|
-
// POSIX filesystems, so any subsequent cross-directory move operates on a single
|
|
238
|
-
// up-to-date file.
|
|
239
|
-
async durablyReplaceInPlace(targetPath, contents) {
|
|
240
|
-
const tmpPath = targetPath + '.tmp';
|
|
241
|
-
await this.writeAndFsync(tmpPath, contents);
|
|
242
|
-
try {
|
|
243
|
-
await rename(tmpPath, targetPath);
|
|
244
|
-
}
|
|
245
|
-
catch (err) {
|
|
246
|
-
throw new TrackerError('local_issue_notes_rename_error', `failed to atomic-rename ${tmpPath} -> ${targetPath}: ${err.message}`);
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
async writeAndFsync(tmpPath, contents) {
|
|
250
|
-
let fh;
|
|
251
|
-
try {
|
|
252
|
-
fh = await open(tmpPath, 'w', 0o644);
|
|
253
|
-
await fh.writeFile(contents, 'utf8');
|
|
254
|
-
await fh.sync();
|
|
255
|
-
}
|
|
256
|
-
catch (err) {
|
|
257
|
-
try {
|
|
258
|
-
if (fh)
|
|
259
|
-
await fh.close();
|
|
260
|
-
}
|
|
261
|
-
catch {
|
|
262
|
-
// best-effort close — surfacing the original error is more useful.
|
|
263
|
-
}
|
|
264
|
-
throw new TrackerError('local_issue_notes_write_error', `failed to write notes tmp file ${tmpPath}: ${err.message}`);
|
|
265
|
-
}
|
|
266
|
-
try {
|
|
267
|
-
await fh.close();
|
|
268
|
-
}
|
|
269
|
-
catch {
|
|
270
|
-
// The file is on disk and fsync'd; close failures are not load-bearing.
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
// POSIX `rename` overwrites the destination silently. Refuse to clobber a stale
|
|
274
|
-
// terminal file with the same basename (e.g. an old Done/ABC-1.md left from a prior
|
|
275
|
-
// run before this issue was recreated in In Progress). A small TOCTOU race remains
|
|
276
|
-
// — another writer can create the target between this check and the subsequent rename
|
|
277
|
-
// — but the realistic failure mode is operator-leftover files, not concurrent writes.
|
|
278
|
-
async assertTargetFree(newPath) {
|
|
279
|
-
try {
|
|
280
|
-
await stat(newPath);
|
|
281
|
-
}
|
|
282
|
-
catch (err) {
|
|
283
|
-
if (err.code === 'ENOENT')
|
|
284
|
-
return;
|
|
285
|
-
throw new TrackerError('local_issue_move_error', `failed to stat target ${newPath}: ${err.message}`);
|
|
286
|
-
}
|
|
287
|
-
throw new TrackerError('local_issue_target_exists', `refusing to overwrite existing file at ${newPath}`);
|
|
288
|
-
}
|
|
289
|
-
idOf(raw) {
|
|
290
|
-
const fmId = asString(raw.frontMatter['id']);
|
|
291
|
-
return fmId && fmId.trim().length > 0 ? fmId : raw.identifier;
|
|
292
|
-
}
|
|
293
|
-
async scanAll() {
|
|
294
|
-
return this.scanAllAt(this.root);
|
|
295
|
-
}
|
|
296
|
-
/** Variant that scans an explicit root, used by `transition` with a pinned snapshot. */
|
|
297
|
-
async scanAllAt(root) {
|
|
298
|
-
let entries;
|
|
299
|
-
try {
|
|
300
|
-
entries = await readdir(root);
|
|
301
|
-
}
|
|
302
|
-
catch (err) {
|
|
303
|
-
throw new TrackerError('local_root_read_error', `cannot read tracker.root ${root}: ${err.message}`);
|
|
304
|
-
}
|
|
305
|
-
// Match directories against the declared state map case-insensitively, the
|
|
306
|
-
// same comparison the orchestrator uses for role-based classification.
|
|
307
|
-
// Unknown directories (operator-left scratch, a state that was removed from
|
|
308
|
-
// `states:`) are ignored with a warning so a stale tree doesn't crash the
|
|
309
|
-
// dispatch loop.
|
|
310
|
-
const declared = new Map();
|
|
311
|
-
for (const name of Object.keys(this.cfg.states)) {
|
|
312
|
-
declared.set(name.toLowerCase(), name);
|
|
313
|
-
}
|
|
314
|
-
const out = [];
|
|
315
|
-
for (const dirEntry of entries) {
|
|
316
|
-
const dirPath = path.join(root, dirEntry);
|
|
317
|
-
let stats;
|
|
318
|
-
try {
|
|
319
|
-
stats = await stat(dirPath);
|
|
320
|
-
}
|
|
321
|
-
catch {
|
|
322
|
-
continue;
|
|
323
|
-
}
|
|
324
|
-
if (!stats.isDirectory())
|
|
325
|
-
continue;
|
|
326
|
-
if (!declared.has(dirEntry.toLowerCase())) {
|
|
327
|
-
log.warn('skipping undeclared state directory', { dir: dirPath });
|
|
328
|
-
continue;
|
|
329
|
-
}
|
|
330
|
-
out.push(...(await this.scanStateDir(dirPath, dirEntry)));
|
|
331
|
-
}
|
|
332
|
-
return out;
|
|
333
|
-
}
|
|
334
|
-
// Read every .md file in a single state directory. Per-file failures (unreadable,
|
|
335
|
-
// malformed front matter) are skipped with a warning so one bad file doesn't poison
|
|
336
|
-
// the whole scan; a readdir failure on the directory itself silently yields nothing
|
|
337
|
-
// for the same reason.
|
|
338
|
-
async scanStateDir(dirPath, state) {
|
|
339
|
-
let files;
|
|
340
|
-
try {
|
|
341
|
-
files = await readdir(dirPath);
|
|
342
|
-
}
|
|
343
|
-
catch {
|
|
344
|
-
return [];
|
|
345
|
-
}
|
|
346
|
-
const out = [];
|
|
347
|
-
for (const fileName of files) {
|
|
348
|
-
if (!fileName.endsWith('.md'))
|
|
349
|
-
continue;
|
|
350
|
-
const raw = await this.readIssueFile(path.join(dirPath, fileName), fileName, state);
|
|
351
|
-
if (raw)
|
|
352
|
-
out.push(raw);
|
|
353
|
-
}
|
|
354
|
-
return out;
|
|
355
|
-
}
|
|
356
|
-
async readIssueFile(filePath, fileName, state) {
|
|
357
|
-
let st;
|
|
358
|
-
try {
|
|
359
|
-
st = await stat(filePath);
|
|
360
|
-
}
|
|
361
|
-
catch {
|
|
362
|
-
return null;
|
|
363
|
-
}
|
|
364
|
-
if (!st.isFile())
|
|
365
|
-
return null;
|
|
366
|
-
let text;
|
|
367
|
-
try {
|
|
368
|
-
text = await readFile(filePath, 'utf8');
|
|
369
|
-
}
|
|
370
|
-
catch (err) {
|
|
371
|
-
log.warn('skipping unreadable issue file', { file: filePath, error: err.message });
|
|
372
|
-
return null;
|
|
373
|
-
}
|
|
374
|
-
let parsed;
|
|
375
|
-
try {
|
|
376
|
-
parsed = splitFrontMatter(text);
|
|
377
|
-
}
|
|
378
|
-
catch (err) {
|
|
379
|
-
log.warn('skipping malformed issue file', { file: filePath, error: err.message });
|
|
380
|
-
return null;
|
|
381
|
-
}
|
|
382
|
-
return {
|
|
383
|
-
filePath,
|
|
384
|
-
identifier: fileName.slice(0, -3),
|
|
385
|
-
state,
|
|
386
|
-
frontMatter: parsed.config,
|
|
387
|
-
description: parsed.body,
|
|
388
|
-
};
|
|
389
|
-
}
|
|
390
|
-
// Build normalized Issue objects. `all` is used to resolve blocker states.
|
|
391
|
-
normalize(target, all) {
|
|
392
|
-
// Resolve blockers by normalized identifier (front-matter `identifier` if set, else basename)
|
|
393
|
-
// and also by id, so users can refer to either.
|
|
394
|
-
const byKey = new Map();
|
|
395
|
-
for (const r of all) {
|
|
396
|
-
const ident = asString(r.frontMatter['identifier']) ?? r.identifier;
|
|
397
|
-
byKey.set(ident, r);
|
|
398
|
-
byKey.set(this.idOf(r), r);
|
|
399
|
-
// Also accept the basename for resilience, last-wins ordering doesn't matter.
|
|
400
|
-
byKey.set(r.identifier, r);
|
|
401
|
-
}
|
|
402
|
-
return target.map((r) => this.toIssue(r, byKey));
|
|
403
|
-
}
|
|
404
|
-
toIssue(raw, byKey) {
|
|
405
|
-
const fm = raw.frontMatter;
|
|
406
|
-
const id = this.idOf(raw);
|
|
407
|
-
const identifier = asString(fm['identifier']) ?? raw.identifier;
|
|
408
|
-
const title = asString(fm['title']) ?? identifier;
|
|
409
|
-
const priority = asInt(fm['priority']);
|
|
410
|
-
const labels = asStringList(fm['labels']).map((s) => s.toLowerCase());
|
|
411
|
-
const branch_name = asString(fm['branch_name']);
|
|
412
|
-
const url = asString(fm['url']);
|
|
413
|
-
const created_at = asTimestamp(fm['created_at']);
|
|
414
|
-
const updated_at = asTimestamp(fm['updated_at']);
|
|
415
|
-
const description = raw.description.length > 0 ? raw.description : null;
|
|
416
|
-
const blockerIdents = asStringList(fm['blocked_by']);
|
|
417
|
-
const blocked_by = blockerIdents.map((ident) => {
|
|
418
|
-
const found = byKey.get(ident);
|
|
419
|
-
if (found) {
|
|
420
|
-
const foundIdent = asString(found.frontMatter['identifier']) ?? found.identifier;
|
|
421
|
-
return {
|
|
422
|
-
id: this.idOf(found),
|
|
423
|
-
identifier: foundIdent,
|
|
424
|
-
state: found.state,
|
|
425
|
-
};
|
|
426
|
-
}
|
|
427
|
-
return { id: null, identifier: ident, state: null };
|
|
428
|
-
});
|
|
429
|
-
return {
|
|
430
|
-
id,
|
|
431
|
-
identifier,
|
|
432
|
-
title,
|
|
433
|
-
description,
|
|
434
|
-
priority,
|
|
435
|
-
state: raw.state,
|
|
436
|
-
branch_name,
|
|
437
|
-
url,
|
|
438
|
-
labels,
|
|
439
|
-
blocked_by,
|
|
440
|
-
created_at,
|
|
441
|
-
updated_at,
|
|
442
|
-
};
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
//# sourceMappingURL=local.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/trackers/local.ts"],"names":[],"mappings":"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"}
|
package/dist/trackers/types.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/trackers/types.ts"],"names":[],"mappings":"AAAA,wCAAwC;AAyExC,MAAM,OAAO,YAAa,SAAQ,KAAK;IAClB;IAAnB,YAAmB,IAAY,EAAE,OAAe;QAC9C,KAAK,CAAC,OAAO,CAAC,CAAC;QADE,SAAI,GAAJ,IAAI,CAAQ;QAE7B,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF"}
|
package/dist/types.js
DELETED
package/dist/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,+BAA+B"}
|
package/dist/util/clock.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
// Wall-clock helpers. Lives outside the functional-core lint group (see
|
|
2
|
-
// eslint.config.js) so core modules can import these instead of touching
|
|
3
|
-
// `Date.now()` / `new Date()` directly. Production defaults flow through
|
|
4
|
-
// `realClock` / `isoFromClock`; tests pin time by passing a stub `now()` to
|
|
5
|
-
// whatever core resource exposes the injection seam.
|
|
6
|
-
/** Production default: real wall clock. Adapter-layer, by design. */
|
|
7
|
-
export const realClock = () => Date.now();
|
|
8
|
-
/** Format an injected clock's reading as an ISO 8601 string. */
|
|
9
|
-
export function isoFromClock(now) {
|
|
10
|
-
return new Date(now()).toISOString();
|
|
11
|
-
}
|
|
12
|
-
//# sourceMappingURL=clock.js.map
|
package/dist/util/clock.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"clock.js","sourceRoot":"","sources":["../../src/util/clock.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,yEAAyE;AACzE,yEAAyE;AACzE,4EAA4E;AAC5E,qDAAqD;AAKrD,qEAAqE;AACrE,MAAM,CAAC,MAAM,SAAS,GAAa,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;AAEpD,gEAAgE;AAChE,MAAM,UAAU,YAAY,CAAC,GAAa;IACxC,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AACvC,CAAC"}
|
package/dist/util/crypto.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
// Crypto port + production adapter (issue 96). `McpRegistry` reaches
|
|
2
|
-
// `randomBytes` / `timingSafeEqual` through this seam so its core stays free
|
|
3
|
-
// of `node:crypto` and `node:buffer` direct imports; tests pin a
|
|
4
|
-
// deterministic `CryptoEnv` to assert against fixed token values.
|
|
5
|
-
import { randomBytes, timingSafeEqual } from 'node:crypto';
|
|
6
|
-
import { Buffer } from 'node:buffer';
|
|
7
|
-
/**
|
|
8
|
-
* Production adapter. We compare BYTE lengths after UTF-8 encoding, not JS
|
|
9
|
-
* string `.length` (which counts UTF-16 code units). An attacker-supplied
|
|
10
|
-
* non-ASCII token can match the real token's code-unit count while encoding
|
|
11
|
-
* to a different byte length; passing those buffers to `timingSafeEqual`
|
|
12
|
-
* would throw `Input buffers must have the same byte length`, surfacing as
|
|
13
|
-
* an HTTP 500 instead of a clean wrong-token rejection.
|
|
14
|
-
*/
|
|
15
|
-
export const realCrypto = {
|
|
16
|
-
newToken: () => randomBytes(24).toString('base64url'),
|
|
17
|
-
constantTimeEqual: (a, b) => {
|
|
18
|
-
const aBuf = Buffer.from(a, 'utf8');
|
|
19
|
-
const bBuf = Buffer.from(b, 'utf8');
|
|
20
|
-
if (aBuf.length !== bBuf.length)
|
|
21
|
-
return false;
|
|
22
|
-
return timingSafeEqual(aBuf, bBuf);
|
|
23
|
-
},
|
|
24
|
-
};
|
|
25
|
-
//# sourceMappingURL=crypto.js.map
|
package/dist/util/crypto.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/util/crypto.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,6EAA6E;AAC7E,iEAAiE;AACjE,kEAAkE;AAElE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAmBrC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,UAAU,GAAc;IACnC,QAAQ,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;IACrD,iBAAiB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACpC,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC9C,OAAO,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;CACF,CAAC"}
|
package/dist/util/frontmatter.js
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
// Single source of truth for YAML front-matter parsing across the orchestrator.
|
|
2
|
-
//
|
|
3
|
-
// Replaces four divergent copies that previously lived in workflow.ts,
|
|
4
|
-
// trackers/local.ts, http.ts (two copies — full parser + regex fast path), and
|
|
5
|
-
// agent/runner.ts. Edge cases like CRLF, indented `---` inside multiline YAML
|
|
6
|
-
// hook scripts, and quoted/multiline values now live in one place.
|
|
7
|
-
import { parse as parseYaml } from 'yaml';
|
|
8
|
-
export class FrontMatterError extends Error {
|
|
9
|
-
code;
|
|
10
|
-
constructor(code, message) {
|
|
11
|
-
super(message);
|
|
12
|
-
this.code = code;
|
|
13
|
-
this.name = 'FrontMatterError';
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
// First and closing fences must be exactly `---` (with optional trailing
|
|
17
|
-
// whitespace), unindented. Otherwise an indented `---` inside a multiline YAML
|
|
18
|
-
// hook script would be mistaken for the closing fence.
|
|
19
|
-
function isFence(line) {
|
|
20
|
-
return /^---\s*$/.test(line ?? '');
|
|
21
|
-
}
|
|
22
|
-
// Parses YAML front matter or throws FrontMatterError. Use when the caller
|
|
23
|
-
// wants to reject malformed input — workflow loader, tracker reader.
|
|
24
|
-
export function parseFrontMatter(text) {
|
|
25
|
-
if (!text.startsWith('---')) {
|
|
26
|
-
return { fields: {}, body: text.trim(), hadFence: false };
|
|
27
|
-
}
|
|
28
|
-
const lines = text.split(/\r?\n/);
|
|
29
|
-
if (!isFence(lines[0])) {
|
|
30
|
-
return { fields: {}, body: text.trim(), hadFence: false };
|
|
31
|
-
}
|
|
32
|
-
let endIdx = -1;
|
|
33
|
-
for (let i = 1; i < lines.length; i++) {
|
|
34
|
-
if (isFence(lines[i])) {
|
|
35
|
-
endIdx = i;
|
|
36
|
-
break;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
if (endIdx < 0) {
|
|
40
|
-
throw new FrontMatterError('unterminated', 'unterminated YAML front matter');
|
|
41
|
-
}
|
|
42
|
-
const fmText = lines.slice(1, endIdx).join('\n');
|
|
43
|
-
const body = lines.slice(endIdx + 1).join('\n').trim();
|
|
44
|
-
let parsed;
|
|
45
|
-
try {
|
|
46
|
-
parsed = fmText.trim().length === 0 ? {} : parseYaml(fmText);
|
|
47
|
-
}
|
|
48
|
-
catch (err) {
|
|
49
|
-
throw new FrontMatterError('invalid_yaml', `invalid YAML front matter: ${err.message}`);
|
|
50
|
-
}
|
|
51
|
-
if (parsed === null || parsed === undefined)
|
|
52
|
-
parsed = {};
|
|
53
|
-
if (typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
54
|
-
throw new FrontMatterError('not_a_map', 'YAML front matter must decode to a map');
|
|
55
|
-
}
|
|
56
|
-
return { fields: parsed, body, hadFence: true };
|
|
57
|
-
}
|
|
58
|
-
// Same as parseFrontMatter but never throws. Malformed input degrades to
|
|
59
|
-
// `{ fields: {}, body: text.trim(), hadFence: false }` so callers that only
|
|
60
|
-
// need the body (HTTP detail page, PR-body builder) still render something
|
|
61
|
-
// sensible for hand-edited files.
|
|
62
|
-
export function parseFrontMatterLenient(text) {
|
|
63
|
-
try {
|
|
64
|
-
return parseFrontMatter(text);
|
|
65
|
-
}
|
|
66
|
-
catch {
|
|
67
|
-
return { fields: {}, body: text.trim(), hadFence: false };
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
//# sourceMappingURL=frontmatter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/util/frontmatter.ts"],"names":[],"mappings":"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"}
|
package/dist/util/fs-issues.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
// Tiny fs port for issue-file IO. Lives outside the functional-core lint
|
|
2
|
-
// group (see eslint.config.js) so core modules can take an injected `IssueFs`
|
|
3
|
-
// instead of importing `node:fs/promises` directly. Production defaults flow
|
|
4
|
-
// through `realIssueFs`; tests pin behavior by passing a stub. Mirrors the
|
|
5
|
-
// clock seam in `src/util/clock.ts`.
|
|
6
|
-
import { mkdir, readdir, stat, writeFile } from 'node:fs/promises';
|
|
7
|
-
/** Production default: `node:fs/promises`-backed. Adapter-layer, by design. */
|
|
8
|
-
export const realIssueFs = {
|
|
9
|
-
async mkdir(p, opts) {
|
|
10
|
-
await mkdir(p, opts);
|
|
11
|
-
},
|
|
12
|
-
readdir(p) {
|
|
13
|
-
return readdir(p);
|
|
14
|
-
},
|
|
15
|
-
stat(p) {
|
|
16
|
-
return stat(p);
|
|
17
|
-
},
|
|
18
|
-
async writeFile(p, data, encoding) {
|
|
19
|
-
await writeFile(p, data, encoding);
|
|
20
|
-
},
|
|
21
|
-
};
|
|
22
|
-
//# sourceMappingURL=fs-issues.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fs-issues.js","sourceRoot":"","sources":["../../src/util/fs-issues.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,8EAA8E;AAC9E,6EAA6E;AAC7E,2EAA2E;AAC3E,qCAAqC;AAErC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAgBnE,+EAA+E;AAC/E,MAAM,CAAC,MAAM,WAAW,GAAY;IAClC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI;QACjB,MAAM,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,CAAC,CAAC;QACP,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IACD,IAAI,CAAC,CAAC;QACJ,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IACD,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ;QAC/B,MAAM,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACrC,CAAC;CACF,CAAC"}
|