smol-symphony 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +41 -22
- package/DESIGN.md +494 -273
- package/README.md +109 -57
- package/SPEC.md +33 -24
- package/WORKFLOW.minimal.yaml +34 -0
- package/{WORKFLOW.template.md → WORKFLOW.template.yaml} +409 -256
- package/WORKFLOW.yaml +487 -0
- package/assets/skills/symphony-issues/SKILL.md +136 -0
- package/assets/symphony-mise.system.toml +68 -0
- package/dist/bin/symphony.js +22 -786
- package/dist/bin/symphony.js.map +1 -1
- package/dist/core/actions/context.js +109 -0
- package/dist/core/actions/context.js.map +1 -0
- package/dist/{actions/parsing.js → core/actions/parse.js} +33 -114
- package/dist/core/actions/parse.js.map +1 -0
- package/dist/core/actions/plan.js +197 -0
- package/dist/core/actions/plan.js.map +1 -0
- package/dist/core/actions/predicates.js +111 -0
- package/dist/core/actions/predicates.js.map +1 -0
- package/dist/core/actions/run-fold.js +248 -0
- package/dist/core/actions/run-fold.js.map +1 -0
- package/dist/core/actions/template.js +118 -0
- package/dist/core/actions/template.js.map +1 -0
- package/dist/core/cli/args.js +116 -0
- package/dist/core/cli/args.js.map +1 -0
- package/dist/core/coerce.js +75 -0
- package/dist/core/coerce.js.map +1 -0
- package/dist/core/credential/account-id.js +20 -0
- package/dist/core/credential/account-id.js.map +1 -0
- package/dist/core/credential/adapter-config.js +136 -0
- package/dist/core/credential/adapter-config.js.map +1 -0
- package/dist/core/credential/availability.js +98 -0
- package/dist/core/credential/availability.js.map +1 -0
- package/dist/core/credential/extract.js +228 -0
- package/dist/core/credential/extract.js.map +1 -0
- package/dist/core/credential/fake-creds.js +171 -0
- package/dist/core/credential/fake-creds.js.map +1 -0
- package/dist/core/credential/identity.js +125 -0
- package/dist/core/credential/identity.js.map +1 -0
- package/dist/core/credential/shape.js +230 -0
- package/dist/core/credential/shape.js.map +1 -0
- package/dist/core/credential/strings.js +15 -0
- package/dist/core/credential/strings.js.map +1 -0
- package/dist/core/doctor/checks.js +303 -0
- package/dist/core/doctor/checks.js.map +1 -0
- package/dist/core/git/result.js +107 -0
- package/dist/core/git/result.js.map +1 -0
- package/dist/core/http/decisions.js +225 -0
- package/dist/core/http/decisions.js.map +1 -0
- package/dist/{http.js → core/http/render.js} +472 -738
- package/dist/core/http/render.js.map +1 -0
- package/dist/{http-handlers.js → core/http/routes.js} +52 -87
- package/dist/core/http/routes.js.map +1 -0
- package/dist/core/http/views.js +181 -0
- package/dist/core/http/views.js.map +1 -0
- package/dist/core/image/managed-image.js +95 -0
- package/dist/core/image/managed-image.js.map +1 -0
- package/dist/core/issue/file.js +149 -0
- package/dist/core/issue/file.js.map +1 -0
- package/dist/core/issue/parse.js +210 -0
- package/dist/core/issue/parse.js.map +1 -0
- package/dist/core/mcp/dispatch.js +239 -0
- package/dist/core/mcp/dispatch.js.map +1 -0
- package/dist/core/mcp/post-move.js +92 -0
- package/dist/core/mcp/post-move.js.map +1 -0
- package/dist/core/mcp/protocol.js +293 -0
- package/dist/core/mcp/protocol.js.map +1 -0
- package/dist/core/mcp/url.js +162 -0
- package/dist/core/mcp/url.js.map +1 -0
- package/dist/core/path.js +63 -0
- package/dist/core/path.js.map +1 -0
- package/dist/core/reconcile/image-decide.js +48 -0
- package/dist/core/reconcile/image-decide.js.map +1 -0
- package/dist/core/reconcile/ledger.js +142 -0
- package/dist/core/reconcile/ledger.js.map +1 -0
- package/dist/core/reconcile/pr-classify.js +62 -0
- package/dist/core/reconcile/pr-classify.js.map +1 -0
- package/dist/{reconciler → core/reconcile}/pr-decide.js +25 -12
- package/dist/core/reconcile/pr-decide.js.map +1 -0
- package/dist/core/reconcile/pr-loop.js +161 -0
- package/dist/core/reconcile/pr-loop.js.map +1 -0
- package/dist/core/reconcile/pr-notes.js +35 -0
- package/dist/core/reconcile/pr-notes.js.map +1 -0
- package/dist/core/reconcile/vm-decide.js +70 -0
- package/dist/core/reconcile/vm-decide.js.map +1 -0
- package/dist/core/reconcile/vm-reap.js +207 -0
- package/dist/core/reconcile/vm-reap.js.map +1 -0
- package/dist/core/reconcile/workspace-decide.js +162 -0
- package/dist/core/reconcile/workspace-decide.js.map +1 -0
- package/dist/core/runlog/summary.js +231 -0
- package/dist/core/runlog/summary.js.map +1 -0
- package/dist/core/runner/dispatch-config.js +95 -0
- package/dist/core/runner/dispatch-config.js.map +1 -0
- package/dist/core/runner/injection.js +61 -0
- package/dist/core/runner/injection.js.map +1 -0
- package/dist/core/runner/mise.js +210 -0
- package/dist/core/runner/mise.js.map +1 -0
- package/dist/core/runner/prompt.js +720 -0
- package/dist/core/runner/prompt.js.map +1 -0
- package/dist/core/runner/turn.js +242 -0
- package/dist/core/runner/turn.js.map +1 -0
- package/dist/core/runner/vm-plan.js +390 -0
- package/dist/core/runner/vm-plan.js.map +1 -0
- package/dist/core/schedule/admission.js +123 -0
- package/dist/core/schedule/admission.js.map +1 -0
- package/dist/core/schedule/circuit-breaker.js +111 -0
- package/dist/core/schedule/circuit-breaker.js.map +1 -0
- package/dist/core/schedule/eligibility.js +83 -0
- package/dist/core/schedule/eligibility.js.map +1 -0
- package/dist/core/schedule/reconcile-issue.js +82 -0
- package/dist/core/schedule/reconcile-issue.js.map +1 -0
- package/dist/core/schedule/retry.js +96 -0
- package/dist/core/schedule/retry.js.map +1 -0
- package/dist/core/schedule/sleep-cycle.js +133 -0
- package/dist/core/schedule/sleep-cycle.js.map +1 -0
- package/dist/core/schedule/slots.js +124 -0
- package/dist/core/schedule/slots.js.map +1 -0
- package/dist/core/schedule/tick.js +553 -0
- package/dist/core/schedule/tick.js.map +1 -0
- package/dist/core/schedule/token-fold.js +181 -0
- package/dist/core/schedule/token-fold.js.map +1 -0
- package/dist/core/state-resolve.js +86 -0
- package/dist/core/state-resolve.js.map +1 -0
- package/dist/core/vm-guards.js +278 -0
- package/dist/core/vm-guards.js.map +1 -0
- package/dist/core/workflow/derive.js +107 -0
- package/dist/core/workflow/derive.js.map +1 -0
- package/dist/core/workflow/parse.js +687 -0
- package/dist/core/workflow/parse.js.map +1 -0
- package/dist/core/workflow/prompt-probe.js +78 -0
- package/dist/core/workflow/prompt-probe.js.map +1 -0
- package/dist/core/workflow/validate.js +189 -0
- package/dist/core/workflow/validate.js.map +1 -0
- package/dist/core/workspace-key.js +19 -0
- package/dist/core/workspace-key.js.map +1 -0
- package/dist/shell/actions-runner.js +356 -0
- package/dist/shell/actions-runner.js.map +1 -0
- package/dist/shell/adapter/adapter-registry.js +45 -0
- package/dist/shell/adapter/adapter-registry.js.map +1 -0
- package/dist/shell/adapter/clock-random.js +96 -0
- package/dist/shell/adapter/clock-random.js.map +1 -0
- package/dist/shell/adapter/gondolin-dispatch-helpers.js +158 -0
- package/dist/shell/adapter/gondolin-dispatch-helpers.js.map +1 -0
- package/dist/shell/adapter/gondolin-dispatch.js +385 -0
- package/dist/shell/adapter/gondolin-dispatch.js.map +1 -0
- package/dist/shell/adapter/gondolin-image-converter.js +233 -0
- package/dist/shell/adapter/gondolin-image-converter.js.map +1 -0
- package/dist/shell/adapter/gondolin-image-fetch.js +180 -0
- package/dist/shell/adapter/gondolin-image-fetch.js.map +1 -0
- package/dist/shell/adapter/launcher-asset.js +57 -0
- package/dist/shell/adapter/launcher-asset.js.map +1 -0
- package/dist/shell/adapter/mise-config-asset.js +65 -0
- package/dist/shell/adapter/mise-config-asset.js.map +1 -0
- package/dist/shell/adapter/workflow-loader.js +304 -0
- package/dist/shell/adapter/workflow-loader.js.map +1 -0
- package/dist/shell/cli/doctor.js +268 -0
- package/dist/shell/cli/doctor.js.map +1 -0
- package/dist/shell/effect-interpreter-families.js +314 -0
- package/dist/shell/effect-interpreter-families.js.map +1 -0
- package/dist/shell/effect-interpreter.js +29 -0
- package/dist/shell/effect-interpreter.js.map +1 -0
- package/dist/shell/interp/acp-frame.js +137 -0
- package/dist/shell/interp/acp-frame.js.map +1 -0
- package/dist/shell/interp/acp-ws-conn.js +320 -0
- package/dist/shell/interp/acp-ws-conn.js.map +1 -0
- package/dist/shell/interp/acp-ws-frames.js +159 -0
- package/dist/shell/interp/acp-ws-frames.js.map +1 -0
- package/dist/shell/interp/acp-ws.js +197 -0
- package/dist/shell/interp/acp-ws.js.map +1 -0
- package/dist/shell/interp/acp.js +319 -0
- package/dist/shell/interp/acp.js.map +1 -0
- package/dist/shell/interp/credential-defaults.js +128 -0
- package/dist/shell/interp/credential-defaults.js.map +1 -0
- package/dist/shell/interp/credential-hooks.js +149 -0
- package/dist/shell/interp/credential-hooks.js.map +1 -0
- package/dist/shell/interp/credential-registry.js +226 -0
- package/dist/shell/interp/credential-registry.js.map +1 -0
- package/dist/shell/interp/credential.js +103 -0
- package/dist/shell/interp/credential.js.map +1 -0
- package/dist/shell/interp/gh.js +163 -0
- package/dist/shell/interp/gh.js.map +1 -0
- package/dist/shell/interp/git.js +28 -0
- package/dist/shell/interp/git.js.map +1 -0
- package/dist/shell/interp/log.js +213 -0
- package/dist/shell/interp/log.js.map +1 -0
- package/dist/shell/interp/process.js +178 -0
- package/dist/shell/interp/process.js.map +1 -0
- package/dist/shell/interp/runlog.js +193 -0
- package/dist/shell/interp/runlog.js.map +1 -0
- package/dist/shell/interp/timer.js +64 -0
- package/dist/shell/interp/timer.js.map +1 -0
- package/dist/shell/interp/tracker-disk.js +99 -0
- package/dist/shell/interp/tracker-disk.js.map +1 -0
- package/dist/shell/interp/tracker-parse.js +71 -0
- package/dist/shell/interp/tracker-parse.js.map +1 -0
- package/dist/shell/interp/tracker-scan.js +238 -0
- package/dist/shell/interp/tracker-scan.js.map +1 -0
- package/dist/shell/interp/tracker-write.js +91 -0
- package/dist/shell/interp/tracker-write.js.map +1 -0
- package/dist/shell/interp/tracker.js +41 -0
- package/dist/shell/interp/tracker.js.map +1 -0
- package/dist/shell/interp/tty.js +48 -0
- package/dist/shell/interp/tty.js.map +1 -0
- package/dist/shell/interp/vm.js +199 -0
- package/dist/shell/interp/vm.js.map +1 -0
- package/dist/shell/interp/workspace.js +310 -0
- package/dist/shell/interp/workspace.js.map +1 -0
- package/dist/shell/main-acp.js +78 -0
- package/dist/shell/main-acp.js.map +1 -0
- package/dist/shell/main-adapters.js +222 -0
- package/dist/shell/main-adapters.js.map +1 -0
- package/dist/shell/main-credential.js +122 -0
- package/dist/shell/main-credential.js.map +1 -0
- package/dist/shell/main-doctor.js +22 -0
- package/dist/shell/main-doctor.js.map +1 -0
- package/dist/shell/main-entry.js +46 -0
- package/dist/shell/main-entry.js.map +1 -0
- package/dist/shell/main-http-csrf.js +45 -0
- package/dist/shell/main-http-csrf.js.map +1 -0
- package/dist/shell/main-http-handler.js +389 -0
- package/dist/shell/main-http-handler.js.map +1 -0
- package/dist/shell/main-http-mcp.js +122 -0
- package/dist/shell/main-http-mcp.js.map +1 -0
- package/dist/shell/main-http-views.js +253 -0
- package/dist/shell/main-http-views.js.map +1 -0
- package/dist/shell/main-http.js +76 -0
- package/dist/shell/main-http.js.map +1 -0
- package/dist/shell/main-loops.js +130 -0
- package/dist/shell/main-loops.js.map +1 -0
- package/dist/shell/main-mcp.js +129 -0
- package/dist/shell/main-mcp.js.map +1 -0
- package/dist/shell/main-orchestrator.js +120 -0
- package/dist/shell/main-orchestrator.js.map +1 -0
- package/dist/shell/main-preflight.js +43 -0
- package/dist/shell/main-preflight.js.map +1 -0
- package/dist/shell/main-reconcilers-helpers.js +244 -0
- package/dist/shell/main-reconcilers-helpers.js.map +1 -0
- package/dist/shell/main-reconcilers-pr.js +148 -0
- package/dist/shell/main-reconcilers-pr.js.map +1 -0
- package/dist/shell/main-reconcilers.js +225 -0
- package/dist/shell/main-reconcilers.js.map +1 -0
- package/dist/shell/main-runner.js +355 -0
- package/dist/shell/main-runner.js.map +1 -0
- package/dist/shell/main-scaffold.js +116 -0
- package/dist/shell/main-scaffold.js.map +1 -0
- package/dist/shell/main-shutdown.js +115 -0
- package/dist/shell/main-shutdown.js.map +1 -0
- package/dist/shell/main-startup.js +48 -0
- package/dist/shell/main-startup.js.map +1 -0
- package/dist/shell/main-substrates.js +43 -0
- package/dist/shell/main-substrates.js.map +1 -0
- package/dist/shell/main.js +385 -0
- package/dist/shell/main.js.map +1 -0
- package/dist/shell/orchestrator-feedback.js +69 -0
- package/dist/shell/orchestrator-feedback.js.map +1 -0
- package/dist/shell/orchestrator-image.js +167 -0
- package/dist/shell/orchestrator-image.js.map +1 -0
- package/dist/shell/orchestrator-loop.js +468 -0
- package/dist/shell/orchestrator-loop.js.map +1 -0
- package/dist/shell/orchestrator-reconcile.js +36 -0
- package/dist/shell/orchestrator-reconcile.js.map +1 -0
- package/dist/shell/reconciler-loop.js +228 -0
- package/dist/shell/reconciler-loop.js.map +1 -0
- package/dist/shell/runner-loop-turn.js +301 -0
- package/dist/shell/runner-loop-turn.js.map +1 -0
- package/dist/shell/runner-loop.js +338 -0
- package/dist/shell/runner-loop.js.map +1 -0
- package/dist/shell/server/http.js +208 -0
- package/dist/shell/server/http.js.map +1 -0
- package/dist/shell/server/mcp-runtime-effects.js +237 -0
- package/dist/shell/server/mcp-runtime-effects.js.map +1 -0
- package/dist/shell/server/mcp-runtime.js +99 -0
- package/dist/shell/server/mcp-runtime.js.map +1 -0
- package/dist/shell/workspace-key.js +14 -0
- package/dist/shell/workspace-key.js.map +1 -0
- package/dist/types/acp.js +8 -0
- package/dist/types/acp.js.map +1 -0
- package/dist/types/actions/plan.js +6 -0
- package/dist/types/actions/plan.js.map +1 -0
- package/dist/types/actions/predicates.js +6 -0
- package/dist/types/actions/predicates.js.map +1 -0
- package/dist/types/actions/run-fold.js +8 -0
- package/dist/types/actions/run-fold.js.map +1 -0
- package/dist/types/actions.js +7 -0
- package/dist/types/actions.js.map +1 -0
- package/dist/types/adapter/clock-random.js +4 -0
- package/dist/types/adapter/clock-random.js.map +1 -0
- package/dist/types/adapter/gondolin-image-converter.js +5 -0
- package/dist/types/adapter/gondolin-image-converter.js.map +1 -0
- package/dist/types/adapter/gondolin-image-fetch.js +5 -0
- package/dist/types/adapter/gondolin-image-fetch.js.map +1 -0
- package/dist/types/adapter/workflow-loader.js +4 -0
- package/dist/types/adapter/workflow-loader.js.map +1 -0
- package/dist/types/cli/args.js +8 -0
- package/dist/types/cli/args.js.map +1 -0
- package/dist/types/config.js +8 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/credential-interp.js +6 -0
- package/dist/types/credential-interp.js.map +1 -0
- package/dist/types/credentials.js +10 -0
- package/dist/types/credentials.js.map +1 -0
- package/dist/types/doctor.js +7 -0
- package/dist/types/doctor.js.map +1 -0
- package/dist/types/domain.js +7 -0
- package/dist/types/domain.js.map +1 -0
- package/dist/types/effect.js +15 -0
- package/dist/types/effect.js.map +1 -0
- package/dist/types/errors.js +39 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/http/decisions.js +6 -0
- package/dist/types/http/decisions.js.map +1 -0
- package/dist/types/http/render.js +10 -0
- package/dist/types/http/render.js.map +1 -0
- package/dist/types/http/views.js +6 -0
- package/dist/types/http/views.js.map +1 -0
- package/dist/types/http.js +9 -0
- package/dist/types/http.js.map +1 -0
- package/dist/types/image/managed-image.js +7 -0
- package/dist/types/image/managed-image.js.map +1 -0
- package/dist/types/interp/effect-interpreter.js +8 -0
- package/dist/types/interp/effect-interpreter.js.map +1 -0
- package/dist/types/interp/tracker.js +7 -0
- package/dist/types/interp/tracker.js.map +1 -0
- package/dist/types/issue/file.js +6 -0
- package/dist/types/issue/file.js.map +1 -0
- package/dist/types/issue/parse.js +8 -0
- package/dist/types/issue/parse.js.map +1 -0
- package/dist/types/main-acp.js +13 -0
- package/dist/types/main-acp.js.map +1 -0
- package/dist/types/main-adapters.js +5 -0
- package/dist/types/main-adapters.js.map +1 -0
- package/dist/types/main-credential.js +21 -0
- package/dist/types/main-credential.js.map +1 -0
- package/dist/types/main-doctor.js +6 -0
- package/dist/types/main-doctor.js.map +1 -0
- package/dist/types/main-http-handler.js +12 -0
- package/dist/types/main-http-handler.js.map +1 -0
- package/dist/types/main-http.js +5 -0
- package/dist/types/main-http.js.map +1 -0
- package/dist/types/main-loops.js +5 -0
- package/dist/types/main-loops.js.map +1 -0
- package/dist/types/main-mcp.js +12 -0
- package/dist/types/main-mcp.js.map +1 -0
- package/dist/types/main-orchestrator.js +5 -0
- package/dist/types/main-orchestrator.js.map +1 -0
- package/dist/types/main-reconcilers.js +11 -0
- package/dist/types/main-reconcilers.js.map +1 -0
- package/dist/types/main-runner.js +13 -0
- package/dist/types/main-runner.js.map +1 -0
- package/dist/types/main-startup.js +5 -0
- package/dist/types/main-startup.js.map +1 -0
- package/dist/types/main-substrates.js +5 -0
- package/dist/types/main-substrates.js.map +1 -0
- package/dist/types/mcp/dispatch.js +4 -0
- package/dist/types/mcp/dispatch.js.map +1 -0
- package/dist/types/mcp/post-move.js +7 -0
- package/dist/types/mcp/post-move.js.map +1 -0
- package/dist/types/mcp.js +9 -0
- package/dist/types/mcp.js.map +1 -0
- package/dist/types/ports.js +12 -0
- package/dist/types/ports.js.map +1 -0
- package/dist/types/reconcile/image-decide.js +5 -0
- package/dist/types/reconcile/image-decide.js.map +1 -0
- package/dist/types/reconcile/ledger.js +7 -0
- package/dist/types/reconcile/ledger.js.map +1 -0
- package/dist/types/reconcile/pr-loop.js +8 -0
- package/dist/types/reconcile/pr-loop.js.map +1 -0
- package/dist/types/reconcile/vm-reap.js +8 -0
- package/dist/types/reconcile/vm-reap.js.map +1 -0
- package/dist/types/reconcile/workspace-decide.js +7 -0
- package/dist/types/reconcile/workspace-decide.js.map +1 -0
- package/dist/types/reconcile.js +9 -0
- package/dist/types/reconcile.js.map +1 -0
- package/dist/types/runlog.js +7 -0
- package/dist/types/runlog.js.map +1 -0
- package/dist/types/runner/actions-runner.js +12 -0
- package/dist/types/runner/actions-runner.js.map +1 -0
- package/dist/types/runner/gondolin-dispatch.js +5 -0
- package/dist/types/runner/gondolin-dispatch.js.map +1 -0
- package/dist/types/runner/injection.js +6 -0
- package/dist/types/runner/injection.js.map +1 -0
- package/dist/types/runner/runner-loop.js +5 -0
- package/dist/types/runner/runner-loop.js.map +1 -0
- package/dist/types/runner/turn.js +4 -0
- package/dist/types/runner/turn.js.map +1 -0
- package/dist/types/runner/vm-plan.js +4 -0
- package/dist/types/runner/vm-plan.js.map +1 -0
- package/dist/types/runtime.js +9 -0
- package/dist/types/runtime.js.map +1 -0
- package/dist/types/schedule/admission.js +7 -0
- package/dist/types/schedule/admission.js.map +1 -0
- package/dist/types/schedule/circuit-breaker.js +2 -0
- package/dist/types/schedule/circuit-breaker.js.map +1 -0
- package/dist/types/schedule/eligibility.js +9 -0
- package/dist/types/schedule/eligibility.js.map +1 -0
- package/dist/types/schedule/orchestrator-loop.js +10 -0
- package/dist/types/schedule/orchestrator-loop.js.map +1 -0
- package/dist/types/schedule/sleep-cycle.js +4 -0
- package/dist/types/schedule/sleep-cycle.js.map +1 -0
- package/dist/types/schedule/slots.js +8 -0
- package/dist/types/schedule/slots.js.map +1 -0
- package/dist/types/schedule/tick.js +9 -0
- package/dist/types/schedule/tick.js.map +1 -0
- package/dist/types/server/mcp-runtime.js +8 -0
- package/dist/types/server/mcp-runtime.js.map +1 -0
- package/dist/types/workflow/parse.js +4 -0
- package/dist/types/workflow/parse.js.map +1 -0
- package/package.json +22 -10
- package/patches/@earendil-works+gondolin+0.12.0.patch +173 -0
- package/prompts/Reflect.md +91 -0
- package/prompts/Review.md +97 -0
- package/prompts/Todo.md +96 -0
- package/prompts/_footer.md +41 -0
- package/prompts/_preamble.md +42 -0
- package/prompts-minimal/Todo.md +26 -0
- package/scripts/postinstall.mjs +63 -0
- package/scripts/vm-agent.mjs +312 -90
- package/WORKFLOW.md +0 -744
- package/dist/acp-bridge.js +0 -324
- package/dist/acp-bridge.js.map +0 -1
- package/dist/actions/cache.js +0 -191
- package/dist/actions/cache.js.map +0 -1
- package/dist/actions/effects.js +0 -41
- package/dist/actions/effects.js.map +0 -1
- package/dist/actions/executor.js +0 -570
- package/dist/actions/executor.js.map +0 -1
- package/dist/actions/index.js +0 -13
- package/dist/actions/index.js.map +0 -1
- package/dist/actions/parsing.js.map +0 -1
- package/dist/actions/predicate-env.js +0 -27
- package/dist/actions/predicate-env.js.map +0 -1
- package/dist/actions/predicates.js +0 -49
- package/dist/actions/predicates.js.map +0 -1
- package/dist/actions/templating.js +0 -66
- package/dist/actions/templating.js.map +0 -1
- package/dist/actions/types.js +0 -15
- package/dist/actions/types.js.map +0 -1
- package/dist/agent/acp.js +0 -473
- package/dist/agent/acp.js.map +0 -1
- package/dist/agent/adapter-names.js +0 -159
- package/dist/agent/adapter-names.js.map +0 -1
- package/dist/agent/adapters.js +0 -511
- package/dist/agent/adapters.js.map +0 -1
- package/dist/agent/credential-extractors.js +0 -342
- package/dist/agent/credential-extractors.js.map +0 -1
- package/dist/agent/credential-secrets.js +0 -628
- package/dist/agent/credential-secrets.js.map +0 -1
- package/dist/agent/credential-ticker.js +0 -57
- package/dist/agent/credential-ticker.js.map +0 -1
- package/dist/agent/gondolin-creds-staging.js +0 -356
- package/dist/agent/gondolin-creds-staging.js.map +0 -1
- package/dist/agent/gondolin-dispatch.js +0 -375
- package/dist/agent/gondolin-dispatch.js.map +0 -1
- package/dist/agent/gondolin.js +0 -124
- package/dist/agent/gondolin.js.map +0 -1
- package/dist/agent/runner-decisions.js +0 -134
- package/dist/agent/runner-decisions.js.map +0 -1
- package/dist/agent/runner.js +0 -1456
- package/dist/agent/runner.js.map +0 -1
- package/dist/agent/tool-call-summary.js +0 -102
- package/dist/agent/tool-call-summary.js.map +0 -1
- package/dist/agent/vm-acp-mapping.js +0 -73
- package/dist/agent/vm-acp-mapping.js.map +0 -1
- package/dist/agent/vm-guards.js +0 -262
- package/dist/agent/vm-guards.js.map +0 -1
- package/dist/agent/vm-port.js +0 -22
- package/dist/agent/vm-port.js.map +0 -1
- package/dist/agent/vm-process-registry.js +0 -79
- package/dist/agent/vm-process-registry.js.map +0 -1
- package/dist/bin/cli-args.js +0 -105
- package/dist/bin/cli-args.js.map +0 -1
- package/dist/errors.js +0 -15
- package/dist/errors.js.map +0 -1
- package/dist/http-disk.js +0 -135
- package/dist/http-disk.js.map +0 -1
- package/dist/http-handlers.js.map +0 -1
- package/dist/http.js.map +0 -1
- package/dist/issues.js +0 -178
- package/dist/issues.js.map +0 -1
- package/dist/logging.js +0 -203
- package/dist/logging.js.map +0 -1
- package/dist/mcp.js +0 -706
- package/dist/mcp.js.map +0 -1
- package/dist/memory.js +0 -85
- package/dist/memory.js.map +0 -1
- package/dist/orchestrator-decisions.js +0 -331
- package/dist/orchestrator-decisions.js.map +0 -1
- package/dist/orchestrator.js +0 -1569
- package/dist/orchestrator.js.map +0 -1
- package/dist/prompt.js +0 -65
- package/dist/prompt.js.map +0 -1
- package/dist/reconciler/cache.js +0 -65
- package/dist/reconciler/cache.js.map +0 -1
- package/dist/reconciler/index.js +0 -448
- package/dist/reconciler/index.js.map +0 -1
- package/dist/reconciler/ledger.js +0 -131
- package/dist/reconciler/ledger.js.map +0 -1
- package/dist/reconciler/pr-adapters.js +0 -174
- package/dist/reconciler/pr-adapters.js.map +0 -1
- package/dist/reconciler/pr-decide.js.map +0 -1
- package/dist/reconciler/pr.js +0 -422
- package/dist/reconciler/pr.js.map +0 -1
- package/dist/reconciler/types.js +0 -12
- package/dist/reconciler/types.js.map +0 -1
- package/dist/reconciler/vm.js +0 -243
- package/dist/reconciler/vm.js.map +0 -1
- package/dist/reconciler/workspace-defaults.js +0 -83
- package/dist/reconciler/workspace-defaults.js.map +0 -1
- package/dist/reconciler/workspace.js +0 -272
- package/dist/reconciler/workspace.js.map +0 -1
- package/dist/runlog.js +0 -403
- package/dist/runlog.js.map +0 -1
- package/dist/scaffold.js +0 -165
- package/dist/scaffold.js.map +0 -1
- package/dist/trackers/local.js +0 -445
- package/dist/trackers/local.js.map +0 -1
- package/dist/trackers/types.js +0 -10
- package/dist/trackers/types.js.map +0 -1
- package/dist/types.js +0 -3
- package/dist/types.js.map +0 -1
- package/dist/util/clock.js +0 -12
- package/dist/util/clock.js.map +0 -1
- package/dist/util/crypto.js +0 -25
- package/dist/util/crypto.js.map +0 -1
- package/dist/util/frontmatter.js +0 -70
- package/dist/util/frontmatter.js.map +0 -1
- package/dist/util/fs-issues.js +0 -22
- package/dist/util/fs-issues.js.map +0 -1
- package/dist/util/process.js +0 -152
- package/dist/util/process.js.map +0 -1
- package/dist/util/workspace-key.js +0 -10
- package/dist/util/workspace-key.js.map +0 -1
- package/dist/workflow-loader.js +0 -147
- package/dist/workflow-loader.js.map +0 -1
- package/dist/workflow.js +0 -822
- package/dist/workflow.js.map +0 -1
- package/dist/workspace-types.js +0 -8
- package/dist/workspace-types.js.map +0 -1
- package/dist/workspace.js +0 -443
- package/dist/workspace.js.map +0 -1
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
// FCIS rewrite — shell adapter: per-issue JSONL run log (kind: adapter).
|
|
2
|
+
//
|
|
3
|
+
// Implements {@link RunLogStore} from src/types/ports. The central
|
|
4
|
+
// effect-interpreter delegates every RunLogEffect variant here:
|
|
5
|
+
// open → createWriteStream(append) keyed by issueId
|
|
6
|
+
// set_attempt → stamp future lines with this attempt number
|
|
7
|
+
// record → append one stamped JSONL line (ts/issue_id/issue_identifier/attempt)
|
|
8
|
+
// system → convenience for a `channel: "system"` line
|
|
9
|
+
// write_summary → persist the core-computed RunSummary to the sibling *.summary.json
|
|
10
|
+
// close → end the underlying stream (idempotent)
|
|
11
|
+
//
|
|
12
|
+
// Ported from the original `src/runlog.ts` (RunLog + openRunLog). Two deliberate
|
|
13
|
+
// shape changes vs. the original:
|
|
14
|
+
// 1. The interpreter hands in the logs-root directory as `filePath`; this adapter
|
|
15
|
+
// owns the original `<dir>/<sanitizeWorkspaceKey(identifier)>.jsonl` filename
|
|
16
|
+
// contract itself (so the contract can't drift from the caller). The directory
|
|
17
|
+
// tree is created on demand and the empty-key guard is preserved as a warn+skip
|
|
18
|
+
// (the original threw, but this port is fire-and-forget and must never crash
|
|
19
|
+
// the orchestrator).
|
|
20
|
+
// 2. summarizeRunLog now runs in core; the in-memory lifecycle accumulation +
|
|
21
|
+
// reduction that the original RunLog did internally is GONE from the shell.
|
|
22
|
+
// This adapter only PERSISTS the already-computed RunSummary it is handed.
|
|
23
|
+
//
|
|
24
|
+
// Writes are best-effort: a write/serialize/summary failure is logged at warn
|
|
25
|
+
// (once per stream) and swallowed so it can never crash the orchestrator.
|
|
26
|
+
// Streams open in append mode so concurrent processes / restarts append safely.
|
|
27
|
+
import { createWriteStream, mkdirSync, writeFileSync } from 'node:fs';
|
|
28
|
+
import path from 'node:path';
|
|
29
|
+
import { sanitizeWorkspaceKey } from '../workspace-key.js';
|
|
30
|
+
/**
|
|
31
|
+
* Default production RunLogStore backed by per-issue JSONL append streams on the
|
|
32
|
+
* host filesystem. Each method is keyed by `issueId` (the tracker primary key);
|
|
33
|
+
* the open call also records the filename-safe `identifier` for stamping.
|
|
34
|
+
*/
|
|
35
|
+
export class FsRunLogStore {
|
|
36
|
+
log;
|
|
37
|
+
logs = new Map();
|
|
38
|
+
constructor(log) {
|
|
39
|
+
this.log = log;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Open (or reopen, append-mode) the run log for an issue. `filePath` is the
|
|
43
|
+
* interpreter's `<logsRoot>/<identifier>.jsonl`; this adapter owns the original
|
|
44
|
+
* flat `<logsRoot>/<sanitizeWorkspaceKey(identifier)>.jsonl` filename contract,
|
|
45
|
+
* so it recovers `logsRoot` and re-derives the sanitized name (an identifier
|
|
46
|
+
* with separators would otherwise leak spurious subdirs). The directory tree is
|
|
47
|
+
* created on demand. A non-derivable (empty) key is warned and skipped
|
|
48
|
+
* (best-effort). Idempotent: a second open for the same issueId ends the prior
|
|
49
|
+
* stream first.
|
|
50
|
+
*/
|
|
51
|
+
open(issueId, identifier, filePath) {
|
|
52
|
+
const key = sanitizeWorkspaceKey(identifier);
|
|
53
|
+
if (key.length === 0) {
|
|
54
|
+
this.log.emit('warn', 'runlog open skipped: empty filename key', {
|
|
55
|
+
issue_id: issueId,
|
|
56
|
+
issue_identifier: identifier,
|
|
57
|
+
});
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const resolved = path.join(logsRootOf(filePath, identifier), `${key}.jsonl`);
|
|
61
|
+
const existing = this.logs.get(issueId);
|
|
62
|
+
if (existing) {
|
|
63
|
+
// Reopen: tear down the prior stream so we don't leak it.
|
|
64
|
+
try {
|
|
65
|
+
existing.stream.end();
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
/* best-effort */
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
mkdirSync(path.dirname(resolved), { recursive: true });
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
this.log.emit('warn', 'runlog mkdir failed', {
|
|
76
|
+
issue_id: issueId,
|
|
77
|
+
issue_identifier: identifier,
|
|
78
|
+
error: err.message,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
const stream = createWriteStream(resolved, { flags: 'a', encoding: 'utf8' });
|
|
82
|
+
const entry = { filePath: resolved, identifier, stream, attempt: 0, broken: false };
|
|
83
|
+
stream.on('error', (err) => {
|
|
84
|
+
if (!entry.broken) {
|
|
85
|
+
entry.broken = true;
|
|
86
|
+
this.log.emit('warn', 'runlog write failed', {
|
|
87
|
+
issue_id: issueId,
|
|
88
|
+
issue_identifier: identifier,
|
|
89
|
+
error: err.message,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
this.logs.set(issueId, entry);
|
|
94
|
+
}
|
|
95
|
+
setAttempt(issueId, attempt) {
|
|
96
|
+
const entry = this.logs.get(issueId);
|
|
97
|
+
if (entry)
|
|
98
|
+
entry.attempt = attempt;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Append one entry. `ts`, `issue_id`, `issue_identifier`, and `attempt` are
|
|
102
|
+
* stamped automatically and override any same-named field on the entry, so
|
|
103
|
+
* callers cannot accidentally backdate or mislabel lines (the spread order
|
|
104
|
+
* intentionally puts the auto-stamped fields LAST so they win). Best-effort.
|
|
105
|
+
*/
|
|
106
|
+
record(issueId, entry) {
|
|
107
|
+
const log = this.logs.get(issueId);
|
|
108
|
+
if (!log || log.broken)
|
|
109
|
+
return;
|
|
110
|
+
const stamped = {
|
|
111
|
+
...entry,
|
|
112
|
+
ts: new Date().toISOString(),
|
|
113
|
+
issue_id: issueId,
|
|
114
|
+
issue_identifier: log.identifier,
|
|
115
|
+
attempt: log.attempt,
|
|
116
|
+
};
|
|
117
|
+
let line;
|
|
118
|
+
try {
|
|
119
|
+
line = JSON.stringify(stamped);
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
this.log.emit('warn', 'runlog serialize failed', {
|
|
123
|
+
issue_id: issueId,
|
|
124
|
+
error: err.message,
|
|
125
|
+
});
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
try {
|
|
129
|
+
log.stream.write(line + '\n');
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// Stream errors land in the 'error' handler. A synchronous throw here is
|
|
133
|
+
// unusual but not impossible (invalid stream state); silence it.
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/** Convenience: emit a `channel: "system"` event. */
|
|
137
|
+
system(issueId, event, fields) {
|
|
138
|
+
this.record(issueId, { channel: 'system', event, ...(fields ? { fields } : {}) });
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Persist the core-computed {@link RunSummary} next to the JSONL log
|
|
142
|
+
* (`<root>/<key>.summary.json`). Best-effort: a failure is logged at warn and
|
|
143
|
+
* swallowed (the reflector tolerates a missing summary). Unlike the original
|
|
144
|
+
* this performs NO reduction — summarizeRunLog already ran in core.
|
|
145
|
+
*/
|
|
146
|
+
writeSummary(issueId, summary) {
|
|
147
|
+
const log = this.logs.get(issueId);
|
|
148
|
+
if (!log)
|
|
149
|
+
return;
|
|
150
|
+
try {
|
|
151
|
+
const summaryPath = log.filePath.replace(/\.jsonl$/, '.summary.json');
|
|
152
|
+
writeFileSync(summaryPath, JSON.stringify(summary, null, 2) + '\n', 'utf8');
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
this.log.emit('warn', 'run summary write failed', {
|
|
156
|
+
issue_id: issueId,
|
|
157
|
+
issue_identifier: log.identifier,
|
|
158
|
+
error: err.message,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Close the underlying stream and drop it from the map. Idempotent — closing
|
|
164
|
+
* an unknown / already-closed issueId is a no-op. The original `close()`
|
|
165
|
+
* returned a Promise that resolved on stream-end; the RunLogStore port is
|
|
166
|
+
* fire-and-forget (best-effort), so we end the stream without awaiting it.
|
|
167
|
+
*/
|
|
168
|
+
close(issueId) {
|
|
169
|
+
const log = this.logs.get(issueId);
|
|
170
|
+
if (!log)
|
|
171
|
+
return;
|
|
172
|
+
this.logs.delete(issueId);
|
|
173
|
+
if (log.broken)
|
|
174
|
+
return;
|
|
175
|
+
try {
|
|
176
|
+
log.stream.end();
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
/* best-effort */
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// Recover `logsRoot` from the interpreter's `path.join(logsRoot, identifier + '.jsonl')`
|
|
184
|
+
// by stripping the segments that the (unsanitized) identifier + extension contributed.
|
|
185
|
+
// Exact inverse of runlogPathFor; lets us re-flatten an identifier that held separators.
|
|
186
|
+
function logsRootOf(filePath, identifier) {
|
|
187
|
+
const segments = path.join(`${identifier}.jsonl`).split(path.sep).length;
|
|
188
|
+
let root = filePath;
|
|
189
|
+
for (let i = 0; i < segments; i++)
|
|
190
|
+
root = path.dirname(root);
|
|
191
|
+
return root;
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=runlog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runlog.js","sourceRoot":"","sources":["../../../src/shell/interp/runlog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// FCIS rewrite — timer port (kind: adapter).
|
|
2
|
+
//
|
|
3
|
+
// Node-backed `TimerPort`: the sequencing seam for every `TimerEffect` variant.
|
|
4
|
+
// • sleep — pause the calling loop for `ms` (action-retry backoff,
|
|
5
|
+
// reaper grace). REF: `await sleep(ms)` call sites.
|
|
6
|
+
// • setTimer — register a NAMED one-shot that re-enters the owning reducer
|
|
7
|
+
// via `fire` when it expires. REF: `scheduleTick()` (POLL_TIMER)
|
|
8
|
+
// + the stall/backstop/retry ticks in src/orchestrator.ts.
|
|
9
|
+
// • clearTimer — cancel + forget a named timer. REF: `clearTimeout()`.
|
|
10
|
+
//
|
|
11
|
+
// Fidelity anchors (read-only reference, NOT modified):
|
|
12
|
+
// • src/orchestrator.ts — scheduleTick / scheduleRetry / onRetryTimer /
|
|
13
|
+
// detectStalls use bare `setTimeout`/`clearTimeout`; a re-arm for the SAME
|
|
14
|
+
// handle always clears the prior one first, and a fired one-shot is dropped
|
|
15
|
+
// from its map BEFORE the callback runs (so a re-arm inside the callback
|
|
16
|
+
// registers cleanly). This adapter preserves both invariants.
|
|
17
|
+
// • src/util/clock.ts — wall-clock reading lives behind the `Clock` port
|
|
18
|
+
// (src/shell/clock.ts), NOT here; timers are purely sequencing.
|
|
19
|
+
//
|
|
20
|
+
// The central effect-interpreter routes the `timer` family to this port
|
|
21
|
+
// (src/shell/effect-interpreter-families.ts); `schedule_retry` is owned by the
|
|
22
|
+
// orchestrator loop's retry scheduler, not this adapter. ZERO decisions live
|
|
23
|
+
// here — delay computation, attempt counting, and breaker tripping are all core.
|
|
24
|
+
//
|
|
25
|
+
// Shell rule: imports from src/types/** ONLY.
|
|
26
|
+
/**
|
|
27
|
+
* Node-backed `TimerPort`. Holds a registry of live `setTimeout` handles keyed
|
|
28
|
+
* by the named-timer id so a re-arm (or shutdown clear) can cancel the prior
|
|
29
|
+
* one-shot. Timers are NOT `unref()`'d: the orchestrator's self-sustaining poll
|
|
30
|
+
* loop must keep the event loop alive (REF: the bare `setTimeout` in
|
|
31
|
+
* `scheduleTick`); the shutdown path explicitly clears every named timer.
|
|
32
|
+
*/
|
|
33
|
+
export function createTimerPort() {
|
|
34
|
+
// One slot per id. A re-arm for an existing id replaces the slot; a fired
|
|
35
|
+
// one-shot deletes its OWN slot before invoking `fire` so a re-arm inside the
|
|
36
|
+
// callback (the poll loop's tail-reschedule) is not immediately clobbered.
|
|
37
|
+
const handles = new Map();
|
|
38
|
+
function clearTimer(id) {
|
|
39
|
+
const existing = handles.get(id);
|
|
40
|
+
if (existing !== undefined) {
|
|
41
|
+
clearTimeout(existing);
|
|
42
|
+
handles.delete(id);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function setTimer(id, ms, fire) {
|
|
46
|
+
// Replace any prior timer for this id (REF: `if (this.tickTimer)
|
|
47
|
+
// clearTimeout(...)` / `if (existing) clearTimeout(existing.timer_handle)`).
|
|
48
|
+
clearTimer(id);
|
|
49
|
+
const handle = setTimeout(() => {
|
|
50
|
+
// Drop the slot BEFORE firing so the callback may re-arm the same id.
|
|
51
|
+
// Guard against a slot already replaced by a racing setTimer in the same
|
|
52
|
+
// macrotask — only delete if it's still ours.
|
|
53
|
+
if (handles.get(id) === handle)
|
|
54
|
+
handles.delete(id);
|
|
55
|
+
fire();
|
|
56
|
+
}, Math.max(0, ms));
|
|
57
|
+
handles.set(id, handle);
|
|
58
|
+
}
|
|
59
|
+
// Bare (ref'd) timeout, matching REF's `await sleep(ms)`: the pending sleep
|
|
60
|
+
// keeps the loop alive until the backoff/grace elapses.
|
|
61
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, Math.max(0, ms)));
|
|
62
|
+
return { sleep, setTimer, clearTimer };
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=timer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timer.js","sourceRoot":"","sources":["../../../src/shell/interp/timer.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,EAAE;AACF,gFAAgF;AAChF,2EAA2E;AAC3E,sEAAsE;AACtE,gFAAgF;AAChF,mFAAmF;AACnF,6EAA6E;AAC7E,0EAA0E;AAC1E,EAAE;AACF,wDAAwD;AACxD,0EAA0E;AAC1E,+EAA+E;AAC/E,gFAAgF;AAChF,6EAA6E;AAC7E,kEAAkE;AAClE,2EAA2E;AAC3E,oEAAoE;AACpE,EAAE;AACF,wEAAwE;AACxE,+EAA+E;AAC/E,6EAA6E;AAC7E,iFAAiF;AACjF,EAAE;AACF,8CAA8C;AAI9C;;;;;;GAMG;AACH,MAAM,UAAU,eAAe;IAC7B,0EAA0E;IAC1E,8EAA8E;IAC9E,2EAA2E;IAC3E,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyC,CAAC;IAEjE,SAAS,UAAU,CAAC,EAAU;QAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,YAAY,CAAC,QAAQ,CAAC,CAAC;YACvB,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,SAAS,QAAQ,CAAC,EAAU,EAAE,EAAU,EAAE,IAAgB;QACxD,iEAAiE;QACjE,6EAA6E;QAC7E,UAAU,CAAC,EAAE,CAAC,CAAC;QACf,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE;YAC7B,sEAAsE;YACtE,yEAAyE;YACzE,8CAA8C;YAC9C,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,MAAM;gBAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACnD,IAAI,EAAE,CAAC;QACT,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED,4EAA4E;IAC5E,wDAAwD;IACxD,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CAC1C,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAEjE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// DiskTrackerPort: direct-disk dashboard reads split out of tracker.ts
|
|
2
|
+
// (kind: adapter). Faithful to src/http-disk.ts (listIssuesFromDisk /
|
|
3
|
+
// readIssueFromDisk). Stateless — no closure deps — so it lives outside the
|
|
4
|
+
// adapter factory. tracker.ts re-exports listIssues/readIssue.
|
|
5
|
+
import { readdir, readFile, stat } from 'node:fs/promises';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import { lenientFrontMatter } from './tracker-parse.js';
|
|
8
|
+
const nonEmpty = (v) => (typeof v === 'string' && v.length > 0 ? v : null);
|
|
9
|
+
const isDir = async (p) => {
|
|
10
|
+
try {
|
|
11
|
+
return (await stat(p)).isDirectory();
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
async function* iterIssueFiles(trackerRoot) {
|
|
18
|
+
let entries;
|
|
19
|
+
try {
|
|
20
|
+
entries = await readdir(trackerRoot);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
for (const stateDir of entries) {
|
|
26
|
+
const dirPath = path.join(trackerRoot, stateDir);
|
|
27
|
+
if (!(await isDir(dirPath)))
|
|
28
|
+
continue;
|
|
29
|
+
let files;
|
|
30
|
+
try {
|
|
31
|
+
files = await readdir(dirPath);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
for (const f of files) {
|
|
37
|
+
if (!f.endsWith('.md'))
|
|
38
|
+
continue;
|
|
39
|
+
const filePath = path.join(dirPath, f);
|
|
40
|
+
let text;
|
|
41
|
+
try {
|
|
42
|
+
text = await readFile(filePath, 'utf8');
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
yield { stateDir, baseName: f.slice(0, -3), filePath, text };
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export async function listIssues(trackerRoot) {
|
|
52
|
+
const out = [];
|
|
53
|
+
for await (const file of iterIssueFiles(trackerRoot)) {
|
|
54
|
+
const { fields } = lenientFrontMatter(file.text);
|
|
55
|
+
out.push({
|
|
56
|
+
identifier: nonEmpty(fields['identifier']) ?? file.baseName,
|
|
57
|
+
state: file.stateDir,
|
|
58
|
+
title: nonEmpty(fields['title']) ?? file.baseName,
|
|
59
|
+
proposed_by: nonEmpty(fields['proposed_by']),
|
|
60
|
+
proposed_at: nonEmpty(fields['proposed_at']),
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
out.sort((a, b) => a.identifier.localeCompare(b.identifier));
|
|
64
|
+
return out;
|
|
65
|
+
}
|
|
66
|
+
export async function readIssue(trackerRoot, identifier) {
|
|
67
|
+
const target = `${identifier}.md`;
|
|
68
|
+
// Fast path: try the obvious filename in every state dir before any scan.
|
|
69
|
+
let entries = [];
|
|
70
|
+
try {
|
|
71
|
+
entries = await readdir(trackerRoot);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
for (const stateDir of entries) {
|
|
77
|
+
const dirPath = path.join(trackerRoot, stateDir);
|
|
78
|
+
if (!(await isDir(dirPath)))
|
|
79
|
+
continue;
|
|
80
|
+
let text;
|
|
81
|
+
try {
|
|
82
|
+
text = await readFile(path.join(dirPath, target), 'utf8');
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
const { fields, body } = lenientFrontMatter(text);
|
|
88
|
+
return { identifier, state: stateDir, filePath: path.join(dirPath, target), frontMatter: fields, body };
|
|
89
|
+
}
|
|
90
|
+
// Slow path: resolve by front-matter `identifier:` (matches normalize()).
|
|
91
|
+
for await (const file of iterIssueFiles(trackerRoot)) {
|
|
92
|
+
const { fields, body } = lenientFrontMatter(file.text);
|
|
93
|
+
if (nonEmpty(fields['identifier']) !== identifier)
|
|
94
|
+
continue;
|
|
95
|
+
return { identifier, state: file.stateDir, filePath: file.filePath, frontMatter: fields, body };
|
|
96
|
+
}
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=tracker-disk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracker-disk.js","sourceRoot":"","sources":["../../../src/shell/interp/tracker-disk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// Tracker parsing helpers split out of tracker.ts (kind: adapter).
|
|
2
|
+
//
|
|
3
|
+
// Front-matter DECODE only (needs the `yaml` userland lib, which core may not
|
|
4
|
+
// import). The new-issue YAML RENDER used to live here too but was a duplicate of
|
|
5
|
+
// the pure core serializer `core/issue/file.ts:composeIssueFile`; the write_issue
|
|
6
|
+
// IO now renders via that injected core fn, so the render half is gone.
|
|
7
|
+
// normalize/coerce/idOf are likewise the pure core's job (core/issue/parse.ts),
|
|
8
|
+
// reached via tracker.loadAllIssues + the injected core selectors.
|
|
9
|
+
//
|
|
10
|
+
// Fidelity: mirrors src/util/frontmatter.ts (split).
|
|
11
|
+
import { parse as parseYaml } from 'yaml';
|
|
12
|
+
import { TrackerError } from '../../types/errors.js';
|
|
13
|
+
const isFence = (line) => /^---\s*$/.test(line ?? '');
|
|
14
|
+
function findClosingFence(lines) {
|
|
15
|
+
for (let i = 1; i < lines.length; i++) {
|
|
16
|
+
if (isFence(lines[i]))
|
|
17
|
+
return i;
|
|
18
|
+
}
|
|
19
|
+
return -1;
|
|
20
|
+
}
|
|
21
|
+
// The `yaml` lib auto-decodes an ISO-8601 timestamp scalar to a JS `Date`. Core
|
|
22
|
+
// coercers operate over PLAIN DATA only, so normalize any decoded `Date` to its ISO
|
|
23
|
+
// string HERE (the shell decode boundary) — core's `asTimestamp` then only ever
|
|
24
|
+
// sees a `string`. Applies to top-level scalars and array elements (the only shapes
|
|
25
|
+
// front matter uses); behaviour is identical to the old core `instanceof Date`
|
|
26
|
+
// branch (a Date front-matter value still becomes its ISO string).
|
|
27
|
+
function normalizeDates(map) {
|
|
28
|
+
const out = {};
|
|
29
|
+
for (const [k, v] of Object.entries(map)) {
|
|
30
|
+
if (v instanceof Date)
|
|
31
|
+
out[k] = v.toISOString();
|
|
32
|
+
else if (Array.isArray(v))
|
|
33
|
+
out[k] = v.map((x) => (x instanceof Date ? x.toISOString() : x));
|
|
34
|
+
else
|
|
35
|
+
out[k] = v;
|
|
36
|
+
}
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
function decodeFields(fmText) {
|
|
40
|
+
let parsed;
|
|
41
|
+
try {
|
|
42
|
+
parsed = fmText.trim().length === 0 ? {} : parseYaml(fmText);
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
throw new TrackerError('local_issue_parse_error', `failed to parse front matter: ${err.message}`);
|
|
46
|
+
}
|
|
47
|
+
if (parsed === null || parsed === undefined)
|
|
48
|
+
return {};
|
|
49
|
+
if (typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
50
|
+
throw new TrackerError('local_issue_parse_error', 'issue front matter must be a map');
|
|
51
|
+
}
|
|
52
|
+
return normalizeDates(parsed);
|
|
53
|
+
}
|
|
54
|
+
export function splitFrontMatter(text) {
|
|
55
|
+
const lines = text.split(/\r?\n/);
|
|
56
|
+
if (!text.startsWith('---') || !isFence(lines[0]))
|
|
57
|
+
return { fields: {}, body: text.trim() };
|
|
58
|
+
const endIdx = findClosingFence(lines);
|
|
59
|
+
if (endIdx < 0)
|
|
60
|
+
throw new TrackerError('local_issue_parse_error', 'unterminated YAML front matter');
|
|
61
|
+
return { fields: decodeFields(lines.slice(1, endIdx).join('\n')), body: lines.slice(endIdx + 1).join('\n').trim() };
|
|
62
|
+
}
|
|
63
|
+
export function lenientFrontMatter(text) {
|
|
64
|
+
try {
|
|
65
|
+
return splitFrontMatter(text);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return { fields: {}, body: text.trim() };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=tracker-parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracker-parse.js","sourceRoot":"","sources":["../../../src/shell/interp/tracker-parse.ts"],"names":[],"mappings":"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"}
|