looply-cli 0.0.0-stage → 0.2.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/LICENSE +21 -0
- package/README.md +137 -3
- package/dist/.src-hash +1 -0
- package/dist/acceptance-observe.d.ts +108 -0
- package/dist/acceptance-observe.d.ts.map +1 -0
- package/dist/acceptance-observe.js +152 -0
- package/dist/acceptance-observe.js.map +1 -0
- package/dist/agent-cmd.d.ts +131 -0
- package/dist/agent-cmd.d.ts.map +1 -0
- package/dist/agent-cmd.js +154 -0
- package/dist/agent-cmd.js.map +1 -0
- package/dist/agent-contained.d.ts +114 -0
- package/dist/agent-contained.d.ts.map +1 -0
- package/dist/agent-contained.js +292 -0
- package/dist/agent-contained.js.map +1 -0
- package/dist/agent-driver.d.ts +130 -0
- package/dist/agent-driver.d.ts.map +1 -0
- package/dist/agent-driver.js +170 -0
- package/dist/agent-driver.js.map +1 -0
- package/dist/agent-envelope.d.ts +94 -0
- package/dist/agent-envelope.d.ts.map +1 -0
- package/dist/agent-envelope.js +214 -0
- package/dist/agent-envelope.js.map +1 -0
- package/dist/agent-exec.d.ts +182 -0
- package/dist/agent-exec.d.ts.map +1 -0
- package/dist/agent-exec.js +125 -0
- package/dist/agent-exec.js.map +1 -0
- package/dist/agent-runtime.d.ts +23 -0
- package/dist/agent-runtime.d.ts.map +1 -0
- package/dist/agent-runtime.js +143 -0
- package/dist/agent-runtime.js.map +1 -0
- package/dist/approval-gate-read.d.ts +66 -0
- package/dist/approval-gate-read.d.ts.map +1 -0
- package/dist/approval-gate-read.js +138 -0
- package/dist/approval-gate-read.js.map +1 -0
- package/dist/approval-resolution.d.ts +87 -0
- package/dist/approval-resolution.d.ts.map +1 -0
- package/dist/approval-resolution.js +100 -0
- package/dist/approval-resolution.js.map +1 -0
- package/dist/approval-resumes.d.ts +102 -0
- package/dist/approval-resumes.d.ts.map +1 -0
- package/dist/approval-resumes.js +167 -0
- package/dist/approval-resumes.js.map +1 -0
- package/dist/ask-brain.d.ts +167 -0
- package/dist/ask-brain.d.ts.map +1 -0
- package/dist/ask-brain.js +355 -0
- package/dist/ask-brain.js.map +1 -0
- package/dist/autonomy-authority.d.ts +80 -0
- package/dist/autonomy-authority.d.ts.map +1 -0
- package/dist/autonomy-authority.js +82 -0
- package/dist/autonomy-authority.js.map +1 -0
- package/dist/autonomy-controller.d.ts +321 -0
- package/dist/autonomy-controller.d.ts.map +1 -0
- package/dist/autonomy-controller.js +517 -0
- package/dist/autonomy-controller.js.map +1 -0
- package/dist/autonomy-store.d.ts +327 -0
- package/dist/autonomy-store.d.ts.map +1 -0
- package/dist/autonomy-store.js +581 -0
- package/dist/autonomy-store.js.map +1 -0
- package/dist/autonomy-tick.d.ts +257 -0
- package/dist/autonomy-tick.d.ts.map +1 -0
- package/dist/autonomy-tick.js +616 -0
- package/dist/autonomy-tick.js.map +1 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +2719 -0
- package/dist/bin.js.map +1 -0
- package/dist/brain-advice.d.ts +21 -0
- package/dist/brain-advice.d.ts.map +1 -0
- package/dist/brain-advice.js +51 -0
- package/dist/brain-advice.js.map +1 -0
- package/dist/candidate-replay-runtime.d.ts +125 -0
- package/dist/candidate-replay-runtime.d.ts.map +1 -0
- package/dist/candidate-replay-runtime.js +188 -0
- package/dist/candidate-replay-runtime.js.map +1 -0
- package/dist/checkout-carry.d.ts +76 -0
- package/dist/checkout-carry.d.ts.map +1 -0
- package/dist/checkout-carry.js +125 -0
- package/dist/checkout-carry.js.map +1 -0
- package/dist/citation-readers.d.ts +26 -0
- package/dist/citation-readers.d.ts.map +1 -0
- package/dist/citation-readers.js +102 -0
- package/dist/citation-readers.js.map +1 -0
- package/dist/command-receipts.d.ts +79 -0
- package/dist/command-receipts.d.ts.map +1 -0
- package/dist/command-receipts.js +143 -0
- package/dist/command-receipts.js.map +1 -0
- package/dist/command-runner.d.ts +32 -0
- package/dist/command-runner.d.ts.map +1 -0
- package/dist/command-runner.js +108 -0
- package/dist/command-runner.js.map +1 -0
- package/dist/compatible-sets.d.ts +67 -0
- package/dist/compatible-sets.d.ts.map +1 -0
- package/dist/compatible-sets.js +81 -0
- package/dist/compatible-sets.js.map +1 -0
- package/dist/compile-check.d.ts +31 -0
- package/dist/compile-check.d.ts.map +1 -0
- package/dist/compile-check.js +34 -0
- package/dist/compile-check.js.map +1 -0
- package/dist/compile-store.d.ts +16 -0
- package/dist/compile-store.d.ts.map +1 -0
- package/dist/compile-store.js +21 -0
- package/dist/compile-store.js.map +1 -0
- package/dist/completion.d.ts +106 -0
- package/dist/completion.d.ts.map +1 -0
- package/dist/completion.js +131 -0
- package/dist/completion.js.map +1 -0
- package/dist/config.d.ts +549 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +763 -0
- package/dist/config.js.map +1 -0
- package/dist/control-file.d.ts +142 -0
- package/dist/control-file.d.ts.map +1 -0
- package/dist/control-file.js +144 -0
- package/dist/control-file.js.map +1 -0
- package/dist/coordinator-state.d.ts +131 -0
- package/dist/coordinator-state.d.ts.map +1 -0
- package/dist/coordinator-state.js +380 -0
- package/dist/coordinator-state.js.map +1 -0
- package/dist/coordinator.d.ts +95 -0
- package/dist/coordinator.d.ts.map +1 -0
- package/dist/coordinator.js +97 -0
- package/dist/coordinator.js.map +1 -0
- package/dist/cursor-store.d.ts +53 -0
- package/dist/cursor-store.d.ts.map +1 -0
- package/dist/cursor-store.js +98 -0
- package/dist/cursor-store.js.map +1 -0
- package/dist/daemon-cmd.d.ts +239 -0
- package/dist/daemon-cmd.d.ts.map +1 -0
- package/dist/daemon-cmd.js +1751 -0
- package/dist/daemon-cmd.js.map +1 -0
- package/dist/daemon-lock.d.ts +140 -0
- package/dist/daemon-lock.d.ts.map +1 -0
- package/dist/daemon-lock.js +352 -0
- package/dist/daemon-lock.js.map +1 -0
- package/dist/daemon-recovery.d.ts +78 -0
- package/dist/daemon-recovery.d.ts.map +1 -0
- package/dist/daemon-recovery.js +161 -0
- package/dist/daemon-recovery.js.map +1 -0
- package/dist/daemon.d.ts +368 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +601 -0
- package/dist/daemon.js.map +1 -0
- package/dist/declared-response-shape.d.ts +93 -0
- package/dist/declared-response-shape.d.ts.map +1 -0
- package/dist/declared-response-shape.js +200 -0
- package/dist/declared-response-shape.js.map +1 -0
- package/dist/declared-surfaces.d.ts +16 -0
- package/dist/declared-surfaces.d.ts.map +1 -0
- package/dist/declared-surfaces.js +19 -0
- package/dist/declared-surfaces.js.map +1 -0
- package/dist/depends-review.d.ts +113 -0
- package/dist/depends-review.d.ts.map +1 -0
- package/dist/depends-review.js +110 -0
- package/dist/depends-review.js.map +1 -0
- package/dist/doctor.d.ts +91 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +71 -0
- package/dist/doctor.js.map +1 -0
- package/dist/edge-approval.d.ts +105 -0
- package/dist/edge-approval.d.ts.map +1 -0
- package/dist/edge-approval.js +100 -0
- package/dist/edge-approval.js.map +1 -0
- package/dist/evidence-cache.d.ts +45 -0
- package/dist/evidence-cache.d.ts.map +1 -0
- package/dist/evidence-cache.js +90 -0
- package/dist/evidence-cache.js.map +1 -0
- package/dist/evidence-cmd.d.ts +133 -0
- package/dist/evidence-cmd.d.ts.map +1 -0
- package/dist/evidence-cmd.js +347 -0
- package/dist/evidence-cmd.js.map +1 -0
- package/dist/evidence-facts.d.ts +40 -0
- package/dist/evidence-facts.d.ts.map +1 -0
- package/dist/evidence-facts.js +114 -0
- package/dist/evidence-facts.js.map +1 -0
- package/dist/exclusive-lock.d.ts +52 -0
- package/dist/exclusive-lock.d.ts.map +1 -0
- package/dist/exclusive-lock.js +150 -0
- package/dist/exclusive-lock.js.map +1 -0
- package/dist/exec-domains.d.ts +140 -0
- package/dist/exec-domains.d.ts.map +1 -0
- package/dist/exec-domains.js +287 -0
- package/dist/exec-domains.js.map +1 -0
- package/dist/exemption-store.d.ts +197 -0
- package/dist/exemption-store.d.ts.map +1 -0
- package/dist/exemption-store.js +266 -0
- package/dist/exemption-store.js.map +1 -0
- package/dist/explicit-start-gate.d.ts +96 -0
- package/dist/explicit-start-gate.d.ts.map +1 -0
- package/dist/explicit-start-gate.js +103 -0
- package/dist/explicit-start-gate.js.map +1 -0
- package/dist/fs-trouble.d.ts +70 -0
- package/dist/fs-trouble.d.ts.map +1 -0
- package/dist/fs-trouble.js +98 -0
- package/dist/fs-trouble.js.map +1 -0
- package/dist/gate.d.ts +278 -0
- package/dist/gate.d.ts.map +1 -0
- package/dist/gate.js +278 -0
- package/dist/gate.js.map +1 -0
- package/dist/git-driver.d.ts +519 -0
- package/dist/git-driver.d.ts.map +1 -0
- package/dist/git-driver.js +900 -0
- package/dist/git-driver.js.map +1 -0
- package/dist/git-push-executor.d.ts +41 -0
- package/dist/git-push-executor.d.ts.map +1 -0
- package/dist/git-push-executor.js +142 -0
- package/dist/git-push-executor.js.map +1 -0
- package/dist/glob.d.ts +26 -0
- package/dist/glob.d.ts.map +1 -0
- package/dist/glob.js +93 -0
- package/dist/glob.js.map +1 -0
- package/dist/goal-adaptive.d.ts +295 -0
- package/dist/goal-adaptive.d.ts.map +1 -0
- package/dist/goal-adaptive.js +393 -0
- package/dist/goal-adaptive.js.map +1 -0
- package/dist/goal-compile.d.ts +342 -0
- package/dist/goal-compile.d.ts.map +1 -0
- package/dist/goal-compile.js +444 -0
- package/dist/goal-compile.js.map +1 -0
- package/dist/goal-depends-executor.d.ts +55 -0
- package/dist/goal-depends-executor.d.ts.map +1 -0
- package/dist/goal-depends-executor.js +202 -0
- package/dist/goal-depends-executor.js.map +1 -0
- package/dist/goal-execution-evidence.d.ts +135 -0
- package/dist/goal-execution-evidence.d.ts.map +1 -0
- package/dist/goal-execution-evidence.js +159 -0
- package/dist/goal-execution-evidence.js.map +1 -0
- package/dist/goal-gap.d.ts +140 -0
- package/dist/goal-gap.d.ts.map +1 -0
- package/dist/goal-gap.js +197 -0
- package/dist/goal-gap.js.map +1 -0
- package/dist/goal-met-target.d.ts +98 -0
- package/dist/goal-met-target.d.ts.map +1 -0
- package/dist/goal-met-target.js +92 -0
- package/dist/goal-met-target.js.map +1 -0
- package/dist/goal-ownership.d.ts +416 -0
- package/dist/goal-ownership.d.ts.map +1 -0
- package/dist/goal-ownership.js +576 -0
- package/dist/goal-ownership.js.map +1 -0
- package/dist/goal-runs.d.ts +82 -0
- package/dist/goal-runs.d.ts.map +1 -0
- package/dist/goal-runs.js +120 -0
- package/dist/goal-runs.js.map +1 -0
- package/dist/goal-store.d.ts +146 -0
- package/dist/goal-store.d.ts.map +1 -0
- package/dist/goal-store.js +294 -0
- package/dist/goal-store.js.map +1 -0
- package/dist/goal-view.d.ts +156 -0
- package/dist/goal-view.d.ts.map +1 -0
- package/dist/goal-view.js +499 -0
- package/dist/goal-view.js.map +1 -0
- package/dist/governed-approvals.d.ts +152 -0
- package/dist/governed-approvals.d.ts.map +1 -0
- package/dist/governed-approvals.js +246 -0
- package/dist/governed-approvals.js.map +1 -0
- package/dist/governed-broker.d.ts +169 -0
- package/dist/governed-broker.d.ts.map +1 -0
- package/dist/governed-broker.js +196 -0
- package/dist/governed-broker.js.map +1 -0
- package/dist/governed-run.d.ts +220 -0
- package/dist/governed-run.d.ts.map +1 -0
- package/dist/governed-run.js +406 -0
- package/dist/governed-run.js.map +1 -0
- package/dist/grant-reconcile.d.ts +63 -0
- package/dist/grant-reconcile.d.ts.map +1 -0
- package/dist/grant-reconcile.js +121 -0
- package/dist/grant-reconcile.js.map +1 -0
- package/dist/index-for-head.d.ts +56 -0
- package/dist/index-for-head.d.ts.map +1 -0
- package/dist/index-for-head.js +103 -0
- package/dist/index-for-head.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +55 -0
- package/dist/index.js.map +1 -0
- package/dist/init-detect.d.ts +39 -0
- package/dist/init-detect.d.ts.map +1 -0
- package/dist/init-detect.js +188 -0
- package/dist/init-detect.js.map +1 -0
- package/dist/integration-deps.d.ts +62 -0
- package/dist/integration-deps.d.ts.map +1 -0
- package/dist/integration-deps.js +251 -0
- package/dist/integration-deps.js.map +1 -0
- package/dist/integration-runtime.d.ts +458 -0
- package/dist/integration-runtime.d.ts.map +1 -0
- package/dist/integration-runtime.js +681 -0
- package/dist/integration-runtime.js.map +1 -0
- package/dist/integration.d.ts +45 -0
- package/dist/integration.d.ts.map +1 -0
- package/dist/integration.js +87 -0
- package/dist/integration.js.map +1 -0
- package/dist/integrator.d.ts +84 -0
- package/dist/integrator.d.ts.map +1 -0
- package/dist/integrator.js +193 -0
- package/dist/integrator.js.map +1 -0
- package/dist/lane-claims.d.ts +174 -0
- package/dist/lane-claims.d.ts.map +1 -0
- package/dist/lane-claims.js +218 -0
- package/dist/lane-claims.js.map +1 -0
- package/dist/lane-coverage.d.ts +87 -0
- package/dist/lane-coverage.d.ts.map +1 -0
- package/dist/lane-coverage.js +129 -0
- package/dist/lane-coverage.js.map +1 -0
- package/dist/ledger-replay.d.ts +115 -0
- package/dist/ledger-replay.d.ts.map +1 -0
- package/dist/ledger-replay.js +155 -0
- package/dist/ledger-replay.js.map +1 -0
- package/dist/ledger-store.d.ts +68 -0
- package/dist/ledger-store.d.ts.map +1 -0
- package/dist/ledger-store.js +111 -0
- package/dist/ledger-store.js.map +1 -0
- package/dist/loop-safety-observer.d.ts +132 -0
- package/dist/loop-safety-observer.d.ts.map +1 -0
- package/dist/loop-safety-observer.js +76 -0
- package/dist/loop-safety-observer.js.map +1 -0
- package/dist/loop-safety-store.d.ts +339 -0
- package/dist/loop-safety-store.d.ts.map +1 -0
- package/dist/loop-safety-store.js +800 -0
- package/dist/loop-safety-store.js.map +1 -0
- package/dist/machine-store.d.ts +54 -0
- package/dist/machine-store.d.ts.map +1 -0
- package/dist/machine-store.js +149 -0
- package/dist/machine-store.js.map +1 -0
- package/dist/mcp-main.d.ts +2 -0
- package/dist/mcp-main.d.ts.map +1 -0
- package/dist/mcp-main.js +116 -0
- package/dist/mcp-main.js.map +1 -0
- package/dist/mcp-server.d.ts +72 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +259 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/model-routing.d.ts +75 -0
- package/dist/model-routing.d.ts.map +1 -0
- package/dist/model-routing.js +108 -0
- package/dist/model-routing.js.map +1 -0
- package/dist/model-transport.d.ts +188 -0
- package/dist/model-transport.d.ts.map +1 -0
- package/dist/model-transport.js +625 -0
- package/dist/model-transport.js.map +1 -0
- package/dist/notify-cadence.d.ts +55 -0
- package/dist/notify-cadence.d.ts.map +1 -0
- package/dist/notify-cadence.js +68 -0
- package/dist/notify-cadence.js.map +1 -0
- package/dist/notify-channel.d.ts +69 -0
- package/dist/notify-channel.d.ts.map +1 -0
- package/dist/notify-channel.js +151 -0
- package/dist/notify-channel.js.map +1 -0
- package/dist/notify.d.ts +71 -0
- package/dist/notify.d.ts.map +1 -0
- package/dist/notify.js +125 -0
- package/dist/notify.js.map +1 -0
- package/dist/observation-inventory.d.ts +65 -0
- package/dist/observation-inventory.d.ts.map +1 -0
- package/dist/observation-inventory.js +139 -0
- package/dist/observation-inventory.js.map +1 -0
- package/dist/owned-children.d.ts +45 -0
- package/dist/owned-children.d.ts.map +1 -0
- package/dist/owned-children.js +64 -0
- package/dist/owned-children.js.map +1 -0
- package/dist/packet-for-goal.d.ts +19 -0
- package/dist/packet-for-goal.d.ts.map +1 -0
- package/dist/packet-for-goal.js +32 -0
- package/dist/packet-for-goal.js.map +1 -0
- package/dist/pair-cmd.d.ts +85 -0
- package/dist/pair-cmd.d.ts.map +1 -0
- package/dist/pair-cmd.js +205 -0
- package/dist/pair-cmd.js.map +1 -0
- package/dist/partial-asker.d.ts +96 -0
- package/dist/partial-asker.d.ts.map +1 -0
- package/dist/partial-asker.js +117 -0
- package/dist/partial-asker.js.map +1 -0
- package/dist/pdf-text-lines.d.ts +17 -0
- package/dist/pdf-text-lines.d.ts.map +1 -0
- package/dist/pdf-text-lines.js +70 -0
- package/dist/pdf-text-lines.js.map +1 -0
- package/dist/pdf-text-worker.d.ts +2 -0
- package/dist/pdf-text-worker.d.ts.map +1 -0
- package/dist/pdf-text-worker.js +81 -0
- package/dist/pdf-text-worker.js.map +1 -0
- package/dist/pdf-text.d.ts +56 -0
- package/dist/pdf-text.d.ts.map +1 -0
- package/dist/pdf-text.js +64 -0
- package/dist/pdf-text.js.map +1 -0
- package/dist/pending-action.d.ts +154 -0
- package/dist/pending-action.d.ts.map +1 -0
- package/dist/pending-action.js +148 -0
- package/dist/pending-action.js.map +1 -0
- package/dist/preemptor.d.ts +40 -0
- package/dist/preemptor.d.ts.map +1 -0
- package/dist/preemptor.js +49 -0
- package/dist/preemptor.js.map +1 -0
- package/dist/programme-mode.d.ts +29 -0
- package/dist/programme-mode.d.ts.map +1 -0
- package/dist/programme-mode.js +50 -0
- package/dist/programme-mode.js.map +1 -0
- package/dist/progress-view.d.ts +14 -0
- package/dist/progress-view.d.ts.map +1 -0
- package/dist/progress-view.js +114 -0
- package/dist/progress-view.js.map +1 -0
- package/dist/project-graph-builder.d.ts +81 -0
- package/dist/project-graph-builder.d.ts.map +1 -0
- package/dist/project-graph-builder.js +246 -0
- package/dist/project-graph-builder.js.map +1 -0
- package/dist/project-graph-runtime.d.ts +86 -0
- package/dist/project-graph-runtime.d.ts.map +1 -0
- package/dist/project-graph-runtime.js +112 -0
- package/dist/project-graph-runtime.js.map +1 -0
- package/dist/project-index-builder.d.ts +96 -0
- package/dist/project-index-builder.d.ts.map +1 -0
- package/dist/project-index-builder.js +298 -0
- package/dist/project-index-builder.js.map +1 -0
- package/dist/project-index-facts.d.ts +51 -0
- package/dist/project-index-facts.d.ts.map +1 -0
- package/dist/project-index-facts.js +117 -0
- package/dist/project-index-facts.js.map +1 -0
- package/dist/project-index-store.d.ts +97 -0
- package/dist/project-index-store.d.ts.map +1 -0
- package/dist/project-index-store.js +140 -0
- package/dist/project-index-store.js.map +1 -0
- package/dist/project-memory-store.d.ts +127 -0
- package/dist/project-memory-store.d.ts.map +1 -0
- package/dist/project-memory-store.js +302 -0
- package/dist/project-memory-store.js.map +1 -0
- package/dist/proposal-store.d.ts +14 -0
- package/dist/proposal-store.d.ts.map +1 -0
- package/dist/proposal-store.js +19 -0
- package/dist/proposal-store.js.map +1 -0
- package/dist/prover.d.ts +80 -0
- package/dist/prover.d.ts.map +1 -0
- package/dist/prover.js +137 -0
- package/dist/prover.js.map +1 -0
- package/dist/provider-identity-store.d.ts +34 -0
- package/dist/provider-identity-store.d.ts.map +1 -0
- package/dist/provider-identity-store.js +72 -0
- package/dist/provider-identity-store.js.map +1 -0
- package/dist/provider-identity.d.ts +104 -0
- package/dist/provider-identity.d.ts.map +1 -0
- package/dist/provider-identity.js +167 -0
- package/dist/provider-identity.js.map +1 -0
- package/dist/provider-limit.d.ts +79 -0
- package/dist/provider-limit.d.ts.map +1 -0
- package/dist/provider-limit.js +148 -0
- package/dist/provider-limit.js.map +1 -0
- package/dist/provider-preflight.d.ts +171 -0
- package/dist/provider-preflight.d.ts.map +1 -0
- package/dist/provider-preflight.js +395 -0
- package/dist/provider-preflight.js.map +1 -0
- package/dist/provider-state.d.ts +120 -0
- package/dist/provider-state.d.ts.map +1 -0
- package/dist/provider-state.js +182 -0
- package/dist/provider-state.js.map +1 -0
- package/dist/providers.d.ts +132 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +161 -0
- package/dist/providers.js.map +1 -0
- package/dist/publication-recorder.d.ts +117 -0
- package/dist/publication-recorder.d.ts.map +1 -0
- package/dist/publication-recorder.js +124 -0
- package/dist/publication-recorder.js.map +1 -0
- package/dist/pursuit-delivery.d.ts +24 -0
- package/dist/pursuit-delivery.d.ts.map +1 -0
- package/dist/pursuit-delivery.js +38 -0
- package/dist/pursuit-delivery.js.map +1 -0
- package/dist/queue-store.d.ts +132 -0
- package/dist/queue-store.d.ts.map +1 -0
- package/dist/queue-store.js +185 -0
- package/dist/queue-store.js.map +1 -0
- package/dist/queue-summary.d.ts +14 -0
- package/dist/queue-summary.d.ts.map +1 -0
- package/dist/queue-summary.js +82 -0
- package/dist/queue-summary.js.map +1 -0
- package/dist/queue-view.d.ts +20 -0
- package/dist/queue-view.d.ts.map +1 -0
- package/dist/queue-view.js +163 -0
- package/dist/queue-view.js.map +1 -0
- package/dist/queue-write-lease.d.ts +106 -0
- package/dist/queue-write-lease.d.ts.map +1 -0
- package/dist/queue-write-lease.js +282 -0
- package/dist/queue-write-lease.js.map +1 -0
- package/dist/rails-home.d.ts +162 -0
- package/dist/rails-home.d.ts.map +1 -0
- package/dist/rails-home.js +452 -0
- package/dist/rails-home.js.map +1 -0
- package/dist/rails-migrations.d.ts +75 -0
- package/dist/rails-migrations.d.ts.map +1 -0
- package/dist/rails-migrations.js +199 -0
- package/dist/rails-migrations.js.map +1 -0
- package/dist/rails-stores.d.ts +49 -0
- package/dist/rails-stores.d.ts.map +1 -0
- package/dist/rails-stores.js +100 -0
- package/dist/rails-stores.js.map +1 -0
- package/dist/reaper.d.ts +69 -0
- package/dist/reaper.d.ts.map +1 -0
- package/dist/reaper.js +152 -0
- package/dist/reaper.js.map +1 -0
- package/dist/record-store.d.ts +36 -0
- package/dist/record-store.d.ts.map +1 -0
- package/dist/record-store.js +78 -0
- package/dist/record-store.js.map +1 -0
- package/dist/recovery-io.d.ts +50 -0
- package/dist/recovery-io.d.ts.map +1 -0
- package/dist/recovery-io.js +122 -0
- package/dist/recovery-io.js.map +1 -0
- package/dist/recovery.d.ts +146 -0
- package/dist/recovery.d.ts.map +1 -0
- package/dist/recovery.js +110 -0
- package/dist/recovery.js.map +1 -0
- package/dist/redraw.d.ts +34 -0
- package/dist/redraw.d.ts.map +1 -0
- package/dist/redraw.js +62 -0
- package/dist/redraw.js.map +1 -0
- package/dist/rejected-evidence.d.ts +255 -0
- package/dist/rejected-evidence.d.ts.map +1 -0
- package/dist/rejected-evidence.js +324 -0
- package/dist/rejected-evidence.js.map +1 -0
- package/dist/report-cmd.d.ts +32 -0
- package/dist/report-cmd.d.ts.map +1 -0
- package/dist/report-cmd.js +201 -0
- package/dist/report-cmd.js.map +1 -0
- package/dist/repos-cmd.d.ts +80 -0
- package/dist/repos-cmd.d.ts.map +1 -0
- package/dist/repos-cmd.js +240 -0
- package/dist/repos-cmd.js.map +1 -0
- package/dist/request-body-shape.d.ts +93 -0
- package/dist/request-body-shape.d.ts.map +1 -0
- package/dist/request-body-shape.js +407 -0
- package/dist/request-body-shape.js.map +1 -0
- package/dist/requirement-claims.d.ts +89 -0
- package/dist/requirement-claims.d.ts.map +1 -0
- package/dist/requirement-claims.js +92 -0
- package/dist/requirement-claims.js.map +1 -0
- package/dist/retention-apply-runtime.d.ts +105 -0
- package/dist/retention-apply-runtime.d.ts.map +1 -0
- package/dist/retention-apply-runtime.js +269 -0
- package/dist/retention-apply-runtime.js.map +1 -0
- package/dist/reverify.d.ts +41 -0
- package/dist/reverify.d.ts.map +1 -0
- package/dist/reverify.js +69 -0
- package/dist/reverify.js.map +1 -0
- package/dist/round-records.d.ts +65 -0
- package/dist/round-records.d.ts.map +1 -0
- package/dist/round-records.js +61 -0
- package/dist/round-records.js.map +1 -0
- package/dist/round-runner.d.ts +924 -0
- package/dist/round-runner.d.ts.map +1 -0
- package/dist/round-runner.js +1693 -0
- package/dist/round-runner.js.map +1 -0
- package/dist/run-approval.d.ts +180 -0
- package/dist/run-approval.d.ts.map +1 -0
- package/dist/run-approval.js +199 -0
- package/dist/run-approval.js.map +1 -0
- package/dist/run-cmd.d.ts +359 -0
- package/dist/run-cmd.d.ts.map +1 -0
- package/dist/run-cmd.js +4418 -0
- package/dist/run-cmd.js.map +1 -0
- package/dist/run-delivery.d.ts +71 -0
- package/dist/run-delivery.d.ts.map +1 -0
- package/dist/run-delivery.js +104 -0
- package/dist/run-delivery.js.map +1 -0
- package/dist/run-ended.d.ts +75 -0
- package/dist/run-ended.d.ts.map +1 -0
- package/dist/run-ended.js +27 -0
- package/dist/run-ended.js.map +1 -0
- package/dist/run-ending-locator.d.ts +125 -0
- package/dist/run-ending-locator.d.ts.map +1 -0
- package/dist/run-ending-locator.js +133 -0
- package/dist/run-ending-locator.js.map +1 -0
- package/dist/run-launcher.d.ts +459 -0
- package/dist/run-launcher.d.ts.map +1 -0
- package/dist/run-launcher.js +652 -0
- package/dist/run-launcher.js.map +1 -0
- package/dist/run-lease.d.ts +208 -0
- package/dist/run-lease.d.ts.map +1 -0
- package/dist/run-lease.js +301 -0
- package/dist/run-lease.js.map +1 -0
- package/dist/run-refusal-marks.d.ts +189 -0
- package/dist/run-refusal-marks.d.ts.map +1 -0
- package/dist/run-refusal-marks.js +249 -0
- package/dist/run-refusal-marks.js.map +1 -0
- package/dist/run-start-marks.d.ts +153 -0
- package/dist/run-start-marks.d.ts.map +1 -0
- package/dist/run-start-marks.js +269 -0
- package/dist/run-start-marks.js.map +1 -0
- package/dist/scan-cmd.d.ts +14 -0
- package/dist/scan-cmd.d.ts.map +1 -0
- package/dist/scan-cmd.js +270 -0
- package/dist/scan-cmd.js.map +1 -0
- package/dist/scan-events.d.ts +50 -0
- package/dist/scan-events.d.ts.map +1 -0
- package/dist/scan-events.js +91 -0
- package/dist/scan-events.js.map +1 -0
- package/dist/scan.d.ts +191 -0
- package/dist/scan.d.ts.map +1 -0
- package/dist/scan.js +417 -0
- package/dist/scan.js.map +1 -0
- package/dist/scope-rule.d.ts +148 -0
- package/dist/scope-rule.d.ts.map +1 -0
- package/dist/scope-rule.js +121 -0
- package/dist/scope-rule.js.map +1 -0
- package/dist/self-repo-id.d.ts +18 -0
- package/dist/self-repo-id.d.ts.map +1 -0
- package/dist/self-repo-id.js +70 -0
- package/dist/self-repo-id.js.map +1 -0
- package/dist/server-client.d.ts +766 -0
- package/dist/server-client.d.ts.map +1 -0
- package/dist/server-client.js +475 -0
- package/dist/server-client.js.map +1 -0
- package/dist/session-adapter-runtime.d.ts +195 -0
- package/dist/session-adapter-runtime.d.ts.map +1 -0
- package/dist/session-adapter-runtime.js +373 -0
- package/dist/session-adapter-runtime.js.map +1 -0
- package/dist/session-checkpoint-runtime.d.ts +62 -0
- package/dist/session-checkpoint-runtime.d.ts.map +1 -0
- package/dist/session-checkpoint-runtime.js +268 -0
- package/dist/session-checkpoint-runtime.js.map +1 -0
- package/dist/session-control-transport.d.ts +106 -0
- package/dist/session-control-transport.d.ts.map +1 -0
- package/dist/session-control-transport.js +232 -0
- package/dist/session-control-transport.js.map +1 -0
- package/dist/session-observation-store.d.ts +98 -0
- package/dist/session-observation-store.d.ts.map +1 -0
- package/dist/session-observation-store.js +155 -0
- package/dist/session-observation-store.js.map +1 -0
- package/dist/session-observe-runtime.d.ts +123 -0
- package/dist/session-observe-runtime.d.ts.map +1 -0
- package/dist/session-observe-runtime.js +317 -0
- package/dist/session-observe-runtime.js.map +1 -0
- package/dist/session-store.d.ts +98 -0
- package/dist/session-store.d.ts.map +1 -0
- package/dist/session-store.js +116 -0
- package/dist/session-store.js.map +1 -0
- package/dist/sessions-cmd.d.ts +202 -0
- package/dist/sessions-cmd.d.ts.map +1 -0
- package/dist/sessions-cmd.js +609 -0
- package/dist/sessions-cmd.js.map +1 -0
- package/dist/settings-overlay.d.ts +53 -0
- package/dist/settings-overlay.d.ts.map +1 -0
- package/dist/settings-overlay.js +175 -0
- package/dist/settings-overlay.js.map +1 -0
- package/dist/setup-prompt.d.ts +34 -0
- package/dist/setup-prompt.d.ts.map +1 -0
- package/dist/setup-prompt.js +92 -0
- package/dist/setup-prompt.js.map +1 -0
- package/dist/setup.d.ts +103 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +283 -0
- package/dist/setup.js.map +1 -0
- package/dist/shared-grants.d.ts +164 -0
- package/dist/shared-grants.d.ts.map +1 -0
- package/dist/shared-grants.js +242 -0
- package/dist/shared-grants.js.map +1 -0
- package/dist/signals.d.ts +55 -0
- package/dist/signals.d.ts.map +1 -0
- package/dist/signals.js +85 -0
- package/dist/signals.js.map +1 -0
- package/dist/source-cmd.d.ts +201 -0
- package/dist/source-cmd.d.ts.map +1 -0
- package/dist/source-cmd.js +684 -0
- package/dist/source-cmd.js.map +1 -0
- package/dist/source-verdict.d.ts +99 -0
- package/dist/source-verdict.d.ts.map +1 -0
- package/dist/source-verdict.js +182 -0
- package/dist/source-verdict.js.map +1 -0
- package/dist/spend-ledger.d.ts +350 -0
- package/dist/spend-ledger.d.ts.map +1 -0
- package/dist/spend-ledger.js +546 -0
- package/dist/spend-ledger.js.map +1 -0
- package/dist/stale-run-sweep.d.ts +79 -0
- package/dist/stale-run-sweep.d.ts.map +1 -0
- package/dist/stale-run-sweep.js +116 -0
- package/dist/stale-run-sweep.js.map +1 -0
- package/dist/start-attempts.d.ts +385 -0
- package/dist/start-attempts.d.ts.map +1 -0
- package/dist/start-attempts.js +613 -0
- package/dist/start-attempts.js.map +1 -0
- package/dist/status-cmd.d.ts +28 -0
- package/dist/status-cmd.d.ts.map +1 -0
- package/dist/status-cmd.js +116 -0
- package/dist/status-cmd.js.map +1 -0
- package/dist/stop-follow-up.d.ts +107 -0
- package/dist/stop-follow-up.d.ts.map +1 -0
- package/dist/stop-follow-up.js +172 -0
- package/dist/stop-follow-up.js.map +1 -0
- package/dist/surface-lease.d.ts +118 -0
- package/dist/surface-lease.d.ts.map +1 -0
- package/dist/surface-lease.js +485 -0
- package/dist/surface-lease.js.map +1 -0
- package/dist/sync.d.ts +54 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +93 -0
- package/dist/sync.js.map +1 -0
- package/dist/syncing-ledger.d.ts +45 -0
- package/dist/syncing-ledger.d.ts.map +1 -0
- package/dist/syncing-ledger.js +53 -0
- package/dist/syncing-ledger.js.map +1 -0
- package/dist/temp-fixtures.d.ts +68 -0
- package/dist/temp-fixtures.d.ts.map +1 -0
- package/dist/temp-fixtures.js +38 -0
- package/dist/temp-fixtures.js.map +1 -0
- package/dist/token-window.d.ts +84 -0
- package/dist/token-window.d.ts.map +1 -0
- package/dist/token-window.js +143 -0
- package/dist/token-window.js.map +1 -0
- package/dist/tool-bridge.d.ts +177 -0
- package/dist/tool-bridge.d.ts.map +1 -0
- package/dist/tool-bridge.js +329 -0
- package/dist/tool-bridge.js.map +1 -0
- package/dist/tool-call-record.d.ts +197 -0
- package/dist/tool-call-record.d.ts.map +1 -0
- package/dist/tool-call-record.js +276 -0
- package/dist/tool-call-record.js.map +1 -0
- package/dist/tool-protocol.d.ts +135 -0
- package/dist/tool-protocol.d.ts.map +1 -0
- package/dist/tool-protocol.js +104 -0
- package/dist/tool-protocol.js.map +1 -0
- package/dist/tool-worker.d.ts +3 -0
- package/dist/tool-worker.d.ts.map +1 -0
- package/dist/tool-worker.js +478 -0
- package/dist/tool-worker.js.map +1 -0
- package/dist/toolchain-mirror.d.ts +86 -0
- package/dist/toolchain-mirror.d.ts.map +1 -0
- package/dist/toolchain-mirror.js +307 -0
- package/dist/toolchain-mirror.js.map +1 -0
- package/dist/trusted-git.d.ts +243 -0
- package/dist/trusted-git.d.ts.map +1 -0
- package/dist/trusted-git.js +920 -0
- package/dist/trusted-git.js.map +1 -0
- package/dist/ui.d.ts +76 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +118 -0
- package/dist/ui.js.map +1 -0
- package/dist/untrusted-exec.d.ts +275 -0
- package/dist/untrusted-exec.d.ts.map +1 -0
- package/dist/untrusted-exec.js +479 -0
- package/dist/untrusted-exec.js.map +1 -0
- package/dist/untrusted-gate.d.ts +73 -0
- package/dist/untrusted-gate.d.ts.map +1 -0
- package/dist/untrusted-gate.js +226 -0
- package/dist/untrusted-gate.js.map +1 -0
- package/dist/uploader.d.ts +153 -0
- package/dist/uploader.d.ts.map +1 -0
- package/dist/uploader.js +204 -0
- package/dist/uploader.js.map +1 -0
- package/dist/verifier.d.ts +66 -0
- package/dist/verifier.d.ts.map +1 -0
- package/dist/verifier.js +170 -0
- package/dist/verifier.js.map +1 -0
- package/dist/verify-apply.d.ts +26 -0
- package/dist/verify-apply.d.ts.map +1 -0
- package/dist/verify-apply.js +36 -0
- package/dist/verify-apply.js.map +1 -0
- package/dist/verify-cmd.d.ts +44 -0
- package/dist/verify-cmd.d.ts.map +1 -0
- package/dist/verify-cmd.js +125 -0
- package/dist/verify-cmd.js.map +1 -0
- package/dist/verify-pass.d.ts +73 -0
- package/dist/verify-pass.d.ts.map +1 -0
- package/dist/verify-pass.js +103 -0
- package/dist/verify-pass.js.map +1 -0
- package/dist/welcome.d.ts +43 -0
- package/dist/welcome.d.ts.map +1 -0
- package/dist/welcome.js +116 -0
- package/dist/welcome.js.map +1 -0
- package/dist/workspace-provisioner.d.ts +65 -0
- package/dist/workspace-provisioner.d.ts.map +1 -0
- package/dist/workspace-provisioner.js +66 -0
- package/dist/workspace-provisioner.js.map +1 -0
- package/dist/workspace-quarantine.d.ts +64 -0
- package/dist/workspace-quarantine.d.ts.map +1 -0
- package/dist/workspace-quarantine.js +156 -0
- package/dist/workspace-quarantine.js.map +1 -0
- package/dist/workspace-residue-sweep.d.ts +113 -0
- package/dist/workspace-residue-sweep.d.ts.map +1 -0
- package/dist/workspace-residue-sweep.js +158 -0
- package/dist/workspace-residue-sweep.js.map +1 -0
- package/dist/workspace.d.ts +639 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +2026 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +54 -6
- package/win/CredProbe.cs +64 -0
- package/win/FakeClaude.cs +56 -0
- package/win/HandleProbe.cs +116 -0
- package/win/TokenProbe.cs +53 -0
- package/win/appcontainer.ps1 +500 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Item } from '@looply/core';
|
|
2
|
+
/** `path:line` for the first piece of evidence, which is where a round starts. */
|
|
3
|
+
export declare function whereOf(item: Pick<Item, 'evidence'>): string | null;
|
|
4
|
+
/**
|
|
5
|
+
* Why this item is where it is, in a few words.
|
|
6
|
+
*
|
|
7
|
+
* An item sitting in a non-pickable state without a reason beside it is the
|
|
8
|
+
* thing that makes a queue feel arbitrary — and the reason is always recorded,
|
|
9
|
+
* so there is no excuse for not printing it.
|
|
10
|
+
*/
|
|
11
|
+
export declare function reasonOf(item: Item): string | null;
|
|
12
|
+
export interface QueueViewOptions {
|
|
13
|
+
/** Show every state, not just the ones worth acting on. */
|
|
14
|
+
all?: boolean;
|
|
15
|
+
width?: number;
|
|
16
|
+
}
|
|
17
|
+
export declare function renderQueue(items: readonly Item[], opts?: QueueViewOptions): string[];
|
|
18
|
+
/** The one-line answer `looply stop` gives, which depends on what is running. */
|
|
19
|
+
export declare function stopMessage(runLive: boolean, kind: 'pause' | 'stop' | 'resume'): string;
|
|
20
|
+
//# sourceMappingURL=queue-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-view.d.ts","sourceRoot":"","sources":["../src/queue-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAa,MAAM,cAAc,CAAC;AAqDpD,kFAAkF;AAClF,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,MAAM,GAAG,IAAI,CAInE;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAKlD;AAED,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,EAAE,IAAI,GAAE,gBAAqB,GAAG,MAAM,EAAE,CAkDzF;AAED,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAgCvF"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.whereOf = whereOf;
|
|
4
|
+
exports.reasonOf = reasonOf;
|
|
5
|
+
exports.renderQueue = renderQueue;
|
|
6
|
+
exports.stopMessage = stopMessage;
|
|
7
|
+
const ui_1 = require("./ui");
|
|
8
|
+
/**
|
|
9
|
+
* `looply queue` — everything waiting, and why.
|
|
10
|
+
*
|
|
11
|
+
* Rendering is pure and takes items, so what the terminal shows is testable
|
|
12
|
+
* without a filesystem. The point of the screen is the *why*: a queue of
|
|
13
|
+
* fifteen items where twelve are stale, blocked or duplicates is a queue with
|
|
14
|
+
* three items, and a count alone hides that.
|
|
15
|
+
*/
|
|
16
|
+
/** Triage order: what you can work on, then what needs you, then what is done. */
|
|
17
|
+
const ORDER = [
|
|
18
|
+
'ready',
|
|
19
|
+
'in_progress',
|
|
20
|
+
'verifying',
|
|
21
|
+
'draft',
|
|
22
|
+
'blocked',
|
|
23
|
+
'split',
|
|
24
|
+
'duplicate',
|
|
25
|
+
'stale',
|
|
26
|
+
'done',
|
|
27
|
+
'closed',
|
|
28
|
+
];
|
|
29
|
+
const HEADINGS = {
|
|
30
|
+
ready: 'ready to pick',
|
|
31
|
+
// Only true while a runner is alive. After a crash the item sits here with
|
|
32
|
+
// nothing working on it, which is precisely when the old wording misled.
|
|
33
|
+
in_progress: 'picked up by a run — recovered automatically if that run died',
|
|
34
|
+
verifying: 'being checked',
|
|
35
|
+
draft: 'not checked yet — a run confirms these before picking',
|
|
36
|
+
blocked: 'blocked — needs you',
|
|
37
|
+
split: 'too big — needs breaking up',
|
|
38
|
+
duplicate: 'merged into another item',
|
|
39
|
+
stale: 'already fixed, so nothing to do',
|
|
40
|
+
done: 'kept',
|
|
41
|
+
closed: 'closed without landing',
|
|
42
|
+
};
|
|
43
|
+
function tone(state) {
|
|
44
|
+
if (state === 'ready' || state === 'done')
|
|
45
|
+
return ui_1.volt;
|
|
46
|
+
if (state === 'in_progress' || state === 'verifying')
|
|
47
|
+
return ui_1.white;
|
|
48
|
+
if (state === 'blocked' || state === 'split')
|
|
49
|
+
return ui_1.amber;
|
|
50
|
+
if (state === 'closed')
|
|
51
|
+
return ui_1.red;
|
|
52
|
+
return ui_1.grey;
|
|
53
|
+
}
|
|
54
|
+
function clip(s, n) {
|
|
55
|
+
return s.length <= n ? s : `${s.slice(0, n - 1)}…`;
|
|
56
|
+
}
|
|
57
|
+
/** `path:line` for the first piece of evidence, which is where a round starts. */
|
|
58
|
+
function whereOf(item) {
|
|
59
|
+
const first = item.evidence[0];
|
|
60
|
+
if (!first)
|
|
61
|
+
return null;
|
|
62
|
+
return first.line ? `${first.path}:${first.line}` : first.path;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Why this item is where it is, in a few words.
|
|
66
|
+
*
|
|
67
|
+
* An item sitting in a non-pickable state without a reason beside it is the
|
|
68
|
+
* thing that makes a queue feel arbitrary — and the reason is always recorded,
|
|
69
|
+
* so there is no excuse for not printing it.
|
|
70
|
+
*/
|
|
71
|
+
function reasonOf(item) {
|
|
72
|
+
if (item.state === 'blocked' && item.blockedReason)
|
|
73
|
+
return item.blockedReason;
|
|
74
|
+
if (item.state === 'duplicate' && item.duplicateOf)
|
|
75
|
+
return `duplicate of ${item.duplicateOf}`;
|
|
76
|
+
if (item.lastFailure)
|
|
77
|
+
return `last attempt: ${item.lastFailure}`;
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
function renderQueue(items, opts = {}) {
|
|
81
|
+
const width = opts.width ?? 78;
|
|
82
|
+
const out = [];
|
|
83
|
+
if (items.length === 0) {
|
|
84
|
+
return ['', ` ${(0, ui_1.grey)('the queue is empty.')}`, '', ` ${(0, ui_1.dim)('looply scan')} ${(0, ui_1.grey)('reads the code and fills it')}`, ''];
|
|
85
|
+
}
|
|
86
|
+
// Everything past `done` is history: shown on request, never by default, or
|
|
87
|
+
// a queue that has been worked for a night buries its own live items.
|
|
88
|
+
const shown = opts.all ? ORDER : ORDER.filter((s) => s !== 'done' && s !== 'closed' && s !== 'stale' && s !== 'duplicate');
|
|
89
|
+
out.push('');
|
|
90
|
+
let printed = 0;
|
|
91
|
+
for (const state of shown) {
|
|
92
|
+
const group = items.filter((i) => i.state === state);
|
|
93
|
+
if (!group.length)
|
|
94
|
+
continue;
|
|
95
|
+
const paint = tone(state);
|
|
96
|
+
out.push(` ${paint(String(group.length).padStart(2))} ${paint(HEADINGS[state])}`);
|
|
97
|
+
for (const item of group) {
|
|
98
|
+
printed += 1;
|
|
99
|
+
out.push(` ${(0, ui_1.grey)(item.id.slice(0, 12))} ${clip(item.title, width - 20)}`);
|
|
100
|
+
const where = whereOf(item);
|
|
101
|
+
const reason = reasonOf(item);
|
|
102
|
+
const meta = [];
|
|
103
|
+
if (where)
|
|
104
|
+
meta.push(where);
|
|
105
|
+
if (item.attempts > 0)
|
|
106
|
+
meta.push(`${item.attempts} attempt${item.attempts === 1 ? '' : 's'}`);
|
|
107
|
+
if (meta.length)
|
|
108
|
+
out.push(` ${(0, ui_1.dim)(' '.repeat(12))} ${(0, ui_1.dim)(meta.join(' · '))}`);
|
|
109
|
+
if (reason)
|
|
110
|
+
out.push(` ${(0, ui_1.dim)(' '.repeat(12))} ${paint(clip(reason, width - 20))}`);
|
|
111
|
+
}
|
|
112
|
+
out.push('');
|
|
113
|
+
}
|
|
114
|
+
const hidden = items.length - printed;
|
|
115
|
+
if (hidden > 0 && !opts.all) {
|
|
116
|
+
out.push(` ${(0, ui_1.grey)(`${hidden} more already dealt with`)} ${(0, ui_1.dim)('— looply queue --all')}`);
|
|
117
|
+
out.push('');
|
|
118
|
+
}
|
|
119
|
+
const ready = items.filter((i) => i.state === 'ready').length;
|
|
120
|
+
const drafts = items.filter((i) => i.state === 'draft').length;
|
|
121
|
+
if (ready === 0 && drafts > 0) {
|
|
122
|
+
out.push(` ${(0, ui_1.grey)('nothing is pickable yet.')} ${(0, ui_1.dim)('looply verify')} ${(0, ui_1.grey)('checks the drafts against the code.')}`);
|
|
123
|
+
out.push('');
|
|
124
|
+
}
|
|
125
|
+
return out;
|
|
126
|
+
}
|
|
127
|
+
/** The one-line answer `looply stop` gives, which depends on what is running. */
|
|
128
|
+
function stopMessage(runLive, kind) {
|
|
129
|
+
if (!runLive) {
|
|
130
|
+
/**
|
|
131
|
+
* 🔴 "NOTHING TO RESUME" WAS FALSE, AND IT WAS THE FALSE HALF OF A
|
|
132
|
+
* DEADLOCK.
|
|
133
|
+
*
|
|
134
|
+
* The old comment here said nothing is written because "a run clears any
|
|
135
|
+
* pending request as it starts". That is true of a RUN and says nothing
|
|
136
|
+
* about the DAEMON, which reads the same project `control.json` to decide
|
|
137
|
+
* whether a person has asked the machine to hold — and holds. So a pause
|
|
138
|
+
* that outlived its run held the machine, and the command named after
|
|
139
|
+
* releasing it printed this line and wrote nothing.
|
|
140
|
+
*
|
|
141
|
+
* `stop` keeps the old answer, because it addresses a run and there is no
|
|
142
|
+
* run. The other two address a standing hold, which exists whether or not
|
|
143
|
+
* anything is running.
|
|
144
|
+
*/
|
|
145
|
+
if (kind === 'stop')
|
|
146
|
+
return `${(0, ui_1.bad)('no run is going')} — nothing to stop.`;
|
|
147
|
+
return kind === 'pause'
|
|
148
|
+
? `${(0, ui_1.volt)('holding')} — no run is going, and the machine will not start one until you resume.`
|
|
149
|
+
: `${(0, ui_1.volt)('hold cleared')} — no run is going; the machine may start one again.`;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* ⚠️ `resume` SAYS SOMETHING DIFFERENT, because it is the only one of the
|
|
153
|
+
* three that does not make the run wait. Reusing the pause wording would tell
|
|
154
|
+
* a person the round in flight finishes first, which is true and completely
|
|
155
|
+
* beside the point of what they just asked for.
|
|
156
|
+
*/
|
|
157
|
+
if (kind === 'resume')
|
|
158
|
+
return `${(0, ui_1.volt)('resuming')} — the run carries on from its next round.`;
|
|
159
|
+
return kind === 'stop'
|
|
160
|
+
? `${(0, ui_1.volt)('stopping')} — the round in flight finishes first, then the run ends.`
|
|
161
|
+
: `${(0, ui_1.volt)('pausing')} — the round in flight finishes first, then the run holds.`;
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=queue-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-view.js","sourceRoot":"","sources":["../src/queue-view.ts"],"names":[],"mappings":";;AAsDA,0BAIC;AASD,4BAKC;AAQD,kCAkDC;AAGD,kCAgCC;AApKD,6BAA+D;AAE/D;;;;;;;GAOG;AAEH,kFAAkF;AAClF,MAAM,KAAK,GAAyB;IAClC,OAAO;IACP,aAAa;IACb,WAAW;IACX,OAAO;IACP,SAAS;IACT,OAAO;IACP,WAAW;IACX,OAAO;IACP,MAAM;IACN,QAAQ;CACT,CAAC;AAEF,MAAM,QAAQ,GAA8B;IAC1C,KAAK,EAAE,eAAe;IACtB,2EAA2E;IAC3E,yEAAyE;IACzE,WAAW,EAAE,+DAA+D;IAC5E,SAAS,EAAE,eAAe;IAC1B,KAAK,EAAE,uDAAuD;IAC9D,OAAO,EAAE,qBAAqB;IAC9B,KAAK,EAAE,6BAA6B;IACpC,SAAS,EAAE,0BAA0B;IACrC,KAAK,EAAE,iCAAiC;IACxC,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,wBAAwB;CACjC,CAAC;AAEF,SAAS,IAAI,CAAC,KAAgB;IAC5B,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,SAAI,CAAC;IACvD,IAAI,KAAK,KAAK,aAAa,IAAI,KAAK,KAAK,WAAW;QAAE,OAAO,UAAK,CAAC;IACnE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,UAAK,CAAC;IAC3D,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO,QAAG,CAAC;IACnC,OAAO,SAAI,CAAC;AACd,CAAC;AAED,SAAS,IAAI,CAAC,CAAS,EAAE,CAAS;IAChC,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;AACrD,CAAC;AAED,kFAAkF;AAClF,SAAgB,OAAO,CAAC,IAA4B;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;AACjE,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,QAAQ,CAAC,IAAU;IACjC,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9E,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,IAAI,IAAI,CAAC,WAAW;QAAE,OAAO,gBAAgB,IAAI,CAAC,WAAW,EAAE,CAAC;IAC9F,IAAI,IAAI,CAAC,WAAW;QAAE,OAAO,iBAAiB,IAAI,CAAC,WAAW,EAAE,CAAC;IACjE,OAAO,IAAI,CAAC;AACd,CAAC;AAQD,SAAgB,WAAW,CAAC,KAAsB,EAAE,OAAyB,EAAE;IAC7E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAa,EAAE,CAAC;IAEzB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,EAAE,EAAE,KAAK,IAAA,SAAI,EAAC,qBAAqB,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,IAAA,QAAG,EAAC,aAAa,CAAC,KAAK,IAAA,SAAI,EAAC,6BAA6B,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7H,CAAC;IAED,4EAA4E;IAC5E,sEAAsE;IACtE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,WAAW,CAAC,CAAC;IAE3H,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACb,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;QACrD,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,SAAS;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAE1B,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACnF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAA,SAAI,EAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAEhF,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YAC5B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,IAAI,GAAa,EAAE,CAAC;YAC1B,IAAI,KAAK;gBAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5B,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,WAAW,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YAC9F,IAAI,IAAI,CAAC,MAAM;gBAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAA,QAAG,EAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,IAAA,QAAG,EAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;YACrF,IAAI,MAAM;gBAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAA,QAAG,EAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC;IACtC,IAAI,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5B,GAAG,CAAC,IAAI,CAAC,KAAK,IAAA,SAAI,EAAC,GAAG,MAAM,0BAA0B,CAAC,IAAI,IAAA,QAAG,EAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;QAC1F,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IAC9D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IAC/D,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,GAAG,CAAC,IAAI,CAAC,KAAK,IAAA,SAAI,EAAC,0BAA0B,CAAC,IAAI,IAAA,QAAG,EAAC,eAAe,CAAC,IAAI,IAAA,SAAI,EAAC,qCAAqC,CAAC,EAAE,CAAC,CAAC;QACzH,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,iFAAiF;AACjF,SAAgB,WAAW,CAAC,OAAgB,EAAE,IAAiC;IAC7E,IAAI,CAAC,OAAO,EAAE,CAAC;QACb;;;;;;;;;;;;;;WAcG;QACH,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO,GAAG,IAAA,QAAG,EAAC,iBAAiB,CAAC,qBAAqB,CAAC;QAC3E,OAAO,IAAI,KAAK,OAAO;YACrB,CAAC,CAAC,GAAG,IAAA,SAAI,EAAC,SAAS,CAAC,0EAA0E;YAC9F,CAAC,CAAC,GAAG,IAAA,SAAI,EAAC,cAAc,CAAC,sDAAsD,CAAC;IACpF,CAAC;IACD;;;;;OAKG;IACH,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,GAAG,IAAA,SAAI,EAAC,UAAU,CAAC,4CAA4C,CAAC;IAC9F,OAAO,IAAI,KAAK,MAAM;QACpB,CAAC,CAAC,GAAG,IAAA,SAAI,EAAC,UAAU,CAAC,2DAA2D;QAChF,CAAC,CAAC,GAAG,IAAA,SAAI,EAAC,SAAS,CAAC,4DAA4D,CAAC;AACrF,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { type LeaseState } from './run-lease';
|
|
2
|
+
/**
|
|
3
|
+
* WRITING `queue.json` WHILE A RUN IS GOING CORRUPTS IT, AND BOTH COMMANDS DID.
|
|
4
|
+
*
|
|
5
|
+
* 🔴 THE MECHANISM, WHICH IS NOT A NARROW RACE.
|
|
6
|
+
*
|
|
7
|
+
* `QueueStore` reads disk exactly once, in `open()`, and answers every later
|
|
8
|
+
* question from an in-memory map. `persist()` is `writeList(this.list())` — the
|
|
9
|
+
* WHOLE map, temp-then-renamed over the file. A run opens the queue at its
|
|
10
|
+
* first second and holds that map for hours.
|
|
11
|
+
*
|
|
12
|
+
* So `looply scan` inserting five items during a run is not a torn write that a
|
|
13
|
+
* lock would fix. The scan's five items land on disk, and then the run's very
|
|
14
|
+
* next `persist()` writes its own hours-old snapshot over them. The items are
|
|
15
|
+
* gone, nothing errors, and the scan reported success.
|
|
16
|
+
*
|
|
17
|
+
* ─────────────────────────────────────────────────────────────────────────────
|
|
18
|
+
* 🔴 THE FIRST VERSION OF THIS FILE TOOK THE RUN LEASE, AND THAT WAS WRONG IN
|
|
19
|
+
* THREE MEASURED WAYS. THE FIX IS TO OBSERVE IT AND NEVER TAKE IT.
|
|
20
|
+
*
|
|
21
|
+
* It called `RunLeaseStore.acquire` with a minted runId and
|
|
22
|
+
* `branch: '(a scan)'`. That lease is read by five other things, and it lied to
|
|
23
|
+
* all of them:
|
|
24
|
+
*
|
|
25
|
+
* 1. `classifyRecovery` blocks whenever the checkout's branch differs from
|
|
26
|
+
* the lease's — and a real branch can never equal `(a scan)`. So a
|
|
27
|
+
* Ctrl-C'd verify (no signal handler runs the `finally`; a pass can last
|
|
28
|
+
* half an hour) wedged EVERY later `looply run` in that checkout behind
|
|
29
|
+
* "a previous run was working on (a verify pass)", and drove a daemon to
|
|
30
|
+
* spawn a doomed run every poll for the full one-hour redelivery window.
|
|
31
|
+
* 2. `refuseStart` compares what the lease says it is working on against
|
|
32
|
+
* what the Start asks for. A scan lease says nothing, so a bound Start
|
|
33
|
+
* from a phone was acked TERMINALLY refused, with a sentence naming a
|
|
34
|
+
* run that does not exist — advice neither `looply stop` nor `looply
|
|
35
|
+
* runs` can act on.
|
|
36
|
+
* 3. `acquire` TAKES OVER a dead lease. A crashed run's lease is the only
|
|
37
|
+
* durable record that the run needs closing, and a scan silently consumed
|
|
38
|
+
* it, after which nothing ever emits `run.ended` and the server's Run row
|
|
39
|
+
* stays open for ever — the exact harm `daemon-recovery.ts` exists to
|
|
40
|
+
* prevent.
|
|
41
|
+
*
|
|
42
|
+
* None of that was necessary. What these commands actually need is two things,
|
|
43
|
+
* and neither is the run lease:
|
|
44
|
+
*
|
|
45
|
+
* - REFUSE WHILE A RUN IS LIVE. That is a READ of the run lease. Reading it
|
|
46
|
+
* tells nothing a lie and destroys nothing.
|
|
47
|
+
* - DO NOT COLLIDE WITH ANOTHER SCAN. That is a lock of their own, in their
|
|
48
|
+
* own file, that no run-lease consumer has ever heard of.
|
|
49
|
+
*/
|
|
50
|
+
export declare class QueueBusy extends Error {
|
|
51
|
+
readonly what: string;
|
|
52
|
+
readonly because: string;
|
|
53
|
+
constructor(what: string, because: string);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* One sentence a person can act on.
|
|
57
|
+
*
|
|
58
|
+
* ⚠️ COMPOSED HERE RATHER THAN IN `describeLease`, which four other call sites
|
|
59
|
+
* consume verbatim — widening it to name `acquiredAt` would change all of their
|
|
60
|
+
* messages too. And `ambiguous` may carry NO lease at all (an unreadable file,
|
|
61
|
+
* a foreign host), which is exactly the case a person most needs a clear
|
|
62
|
+
* sentence for and the one an `err.state.lease` reference prints `undefined` in.
|
|
63
|
+
*/
|
|
64
|
+
export declare function refusalFor(what: string, state: LeaseState, stateDir?: string): string;
|
|
65
|
+
export interface QueueLease {
|
|
66
|
+
/** Give it back. Safe to call twice. */
|
|
67
|
+
release(): Promise<void>;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Take the right to write `queue.json` in this checkout.
|
|
71
|
+
*
|
|
72
|
+
* ⚠️ CALLED AT THE WRITE, NOT AT THE TOP OF THE COMMAND. `looply scan --dry-run`
|
|
73
|
+
* "answers a question and changes nothing" by its own contract, and a lock taken
|
|
74
|
+
* on entry would make it refusable while a run is going — turning a read-only
|
|
75
|
+
* question into one that needs the machine to be idle.
|
|
76
|
+
*
|
|
77
|
+
* ⚠️ THE EXECUTION DIRECTORY, NEVER THE PROJECT'S. A lock at the project state
|
|
78
|
+
* directory would be one lock for N worktrees, which is the opposite of the
|
|
79
|
+
* Phase 1 model: two people scanning two different workspaces must not block
|
|
80
|
+
* each other.
|
|
81
|
+
*/
|
|
82
|
+
/**
|
|
83
|
+
* Is a queue write in progress in this checkout?
|
|
84
|
+
*
|
|
85
|
+
* 🔴 THE LOCK WAS ONE-SIDED, AND A MEASUREMENT SHOWED WHAT THAT COSTS.
|
|
86
|
+
*
|
|
87
|
+
* Scan and verify took it; nothing else had heard of it. So a run started
|
|
88
|
+
* DURING a verify pass — by the daemon's poll, by a phone Start, by a second
|
|
89
|
+
* terminal, all of which consult only the run lease, which is free — acquired
|
|
90
|
+
* the lease, re-opened the queue, and wrote its hours-old snapshot back over
|
|
91
|
+
* every verdict the pass produced from that moment on. Measured: two items
|
|
92
|
+
* confirmed by the pass, one silently reverted to `draft` by the run, no error
|
|
93
|
+
* on either side, and the agent time that produced the verdict gone.
|
|
94
|
+
*
|
|
95
|
+
* `verify` is the worse half, because it holds the lock for the WHOLE pass —
|
|
96
|
+
* uncapped without `--max`, at up to five minutes a draft — which is precisely
|
|
97
|
+
* why it takes the lock early.
|
|
98
|
+
*/
|
|
99
|
+
export declare function queueWriteInProgress(cwd: string): {
|
|
100
|
+
readonly busy: false;
|
|
101
|
+
} | {
|
|
102
|
+
readonly busy: true;
|
|
103
|
+
readonly because: string;
|
|
104
|
+
};
|
|
105
|
+
export declare function takeQueueWriteLease(cwd: string, what: string): Promise<QueueLease>;
|
|
106
|
+
//# sourceMappingURL=queue-write-lease.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-write-lease.d.ts","sourceRoot":"","sources":["../src/queue-write-lease.ts"],"names":[],"mappings":"AAIA,OAAO,EAAyC,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAErF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,qBAAa,SAAU,SAAQ,KAAK;IAEhC,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM;gBADf,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM;CAK3B;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAyBrF;AAED,MAAM,WAAW,UAAU;IACzB,wCAAwC;IACxC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAoBD;;;;;;;;;;;;GAYG;AACH;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,GACV;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAmB9E;AAED,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAoHxF"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QueueBusy = void 0;
|
|
4
|
+
exports.refusalFor = refusalFor;
|
|
5
|
+
exports.queueWriteInProgress = queueWriteInProgress;
|
|
6
|
+
exports.takeQueueWriteLease = takeQueueWriteLease;
|
|
7
|
+
const node_fs_1 = require("node:fs");
|
|
8
|
+
const node_os_1 = require("node:os");
|
|
9
|
+
const node_path_1 = require("node:path");
|
|
10
|
+
const git_driver_1 = require("./git-driver");
|
|
11
|
+
const run_lease_1 = require("./run-lease");
|
|
12
|
+
/**
|
|
13
|
+
* WRITING `queue.json` WHILE A RUN IS GOING CORRUPTS IT, AND BOTH COMMANDS DID.
|
|
14
|
+
*
|
|
15
|
+
* 🔴 THE MECHANISM, WHICH IS NOT A NARROW RACE.
|
|
16
|
+
*
|
|
17
|
+
* `QueueStore` reads disk exactly once, in `open()`, and answers every later
|
|
18
|
+
* question from an in-memory map. `persist()` is `writeList(this.list())` — the
|
|
19
|
+
* WHOLE map, temp-then-renamed over the file. A run opens the queue at its
|
|
20
|
+
* first second and holds that map for hours.
|
|
21
|
+
*
|
|
22
|
+
* So `looply scan` inserting five items during a run is not a torn write that a
|
|
23
|
+
* lock would fix. The scan's five items land on disk, and then the run's very
|
|
24
|
+
* next `persist()` writes its own hours-old snapshot over them. The items are
|
|
25
|
+
* gone, nothing errors, and the scan reported success.
|
|
26
|
+
*
|
|
27
|
+
* ─────────────────────────────────────────────────────────────────────────────
|
|
28
|
+
* 🔴 THE FIRST VERSION OF THIS FILE TOOK THE RUN LEASE, AND THAT WAS WRONG IN
|
|
29
|
+
* THREE MEASURED WAYS. THE FIX IS TO OBSERVE IT AND NEVER TAKE IT.
|
|
30
|
+
*
|
|
31
|
+
* It called `RunLeaseStore.acquire` with a minted runId and
|
|
32
|
+
* `branch: '(a scan)'`. That lease is read by five other things, and it lied to
|
|
33
|
+
* all of them:
|
|
34
|
+
*
|
|
35
|
+
* 1. `classifyRecovery` blocks whenever the checkout's branch differs from
|
|
36
|
+
* the lease's — and a real branch can never equal `(a scan)`. So a
|
|
37
|
+
* Ctrl-C'd verify (no signal handler runs the `finally`; a pass can last
|
|
38
|
+
* half an hour) wedged EVERY later `looply run` in that checkout behind
|
|
39
|
+
* "a previous run was working on (a verify pass)", and drove a daemon to
|
|
40
|
+
* spawn a doomed run every poll for the full one-hour redelivery window.
|
|
41
|
+
* 2. `refuseStart` compares what the lease says it is working on against
|
|
42
|
+
* what the Start asks for. A scan lease says nothing, so a bound Start
|
|
43
|
+
* from a phone was acked TERMINALLY refused, with a sentence naming a
|
|
44
|
+
* run that does not exist — advice neither `looply stop` nor `looply
|
|
45
|
+
* runs` can act on.
|
|
46
|
+
* 3. `acquire` TAKES OVER a dead lease. A crashed run's lease is the only
|
|
47
|
+
* durable record that the run needs closing, and a scan silently consumed
|
|
48
|
+
* it, after which nothing ever emits `run.ended` and the server's Run row
|
|
49
|
+
* stays open for ever — the exact harm `daemon-recovery.ts` exists to
|
|
50
|
+
* prevent.
|
|
51
|
+
*
|
|
52
|
+
* None of that was necessary. What these commands actually need is two things,
|
|
53
|
+
* and neither is the run lease:
|
|
54
|
+
*
|
|
55
|
+
* - REFUSE WHILE A RUN IS LIVE. That is a READ of the run lease. Reading it
|
|
56
|
+
* tells nothing a lie and destroys nothing.
|
|
57
|
+
* - DO NOT COLLIDE WITH ANOTHER SCAN. That is a lock of their own, in their
|
|
58
|
+
* own file, that no run-lease consumer has ever heard of.
|
|
59
|
+
*/
|
|
60
|
+
class QueueBusy extends Error {
|
|
61
|
+
what;
|
|
62
|
+
because;
|
|
63
|
+
constructor(what, because) {
|
|
64
|
+
super(because);
|
|
65
|
+
this.what = what;
|
|
66
|
+
this.because = because;
|
|
67
|
+
this.name = 'QueueBusy';
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.QueueBusy = QueueBusy;
|
|
71
|
+
/**
|
|
72
|
+
* One sentence a person can act on.
|
|
73
|
+
*
|
|
74
|
+
* ⚠️ COMPOSED HERE RATHER THAN IN `describeLease`, which four other call sites
|
|
75
|
+
* consume verbatim — widening it to name `acquiredAt` would change all of their
|
|
76
|
+
* messages too. And `ambiguous` may carry NO lease at all (an unreadable file,
|
|
77
|
+
* a foreign host), which is exactly the case a person most needs a clear
|
|
78
|
+
* sentence for and the one an `err.state.lease` reference prints `undefined` in.
|
|
79
|
+
*/
|
|
80
|
+
function refusalFor(what, state, stateDir) {
|
|
81
|
+
if (state.kind === 'active') {
|
|
82
|
+
return (`a run is working in this checkout — ${state.lease.runId} (pid ${state.lease.pid}, ` +
|
|
83
|
+
`branch ${state.lease.branch}) since ${state.lease.acquiredAt}. ${what} would write ` +
|
|
84
|
+
'queue.json, and that run holds the whole queue in memory, so its next round would ' +
|
|
85
|
+
'write its own copy back over yours. Wait for it, or `looply stop` it, then try again.');
|
|
86
|
+
}
|
|
87
|
+
if (state.kind === 'ambiguous') {
|
|
88
|
+
return (`cannot tell whether a run is working in this checkout: ${state.reason}. ` +
|
|
89
|
+
`${what} would write queue.json, and guessing wrong loses somebody's work — so this ` +
|
|
90
|
+
'refuses rather than guesses. ' +
|
|
91
|
+
/**
|
|
92
|
+
* ⚠️ IT NAMES THE FILE. The first version sent the person to `looply runs`,
|
|
93
|
+
* which reads the registry and the workspaces root and never looks at the
|
|
94
|
+
* current checkout's lease — so in Simple Mode it answered "nothing
|
|
95
|
+
* running, and nothing left behind" about the very file that was refusing
|
|
96
|
+
* them, and there was no next step.
|
|
97
|
+
*/
|
|
98
|
+
`The file is ${stateDir === undefined ? 'run.lease.json' : (0, node_path_1.join)(stateDir, 'run.lease.json')}.`);
|
|
99
|
+
}
|
|
100
|
+
return `${what} could not take this checkout's write lease`;
|
|
101
|
+
}
|
|
102
|
+
function readClaim(path) {
|
|
103
|
+
try {
|
|
104
|
+
const parsed = JSON.parse((0, node_fs_1.readFileSync)(path, 'utf8'));
|
|
105
|
+
if (typeof parsed.pid !== 'number' || typeof parsed.host !== 'string')
|
|
106
|
+
return null;
|
|
107
|
+
return parsed;
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Take the right to write `queue.json` in this checkout.
|
|
115
|
+
*
|
|
116
|
+
* ⚠️ CALLED AT THE WRITE, NOT AT THE TOP OF THE COMMAND. `looply scan --dry-run`
|
|
117
|
+
* "answers a question and changes nothing" by its own contract, and a lock taken
|
|
118
|
+
* on entry would make it refusable while a run is going — turning a read-only
|
|
119
|
+
* question into one that needs the machine to be idle.
|
|
120
|
+
*
|
|
121
|
+
* ⚠️ THE EXECUTION DIRECTORY, NEVER THE PROJECT'S. A lock at the project state
|
|
122
|
+
* directory would be one lock for N worktrees, which is the opposite of the
|
|
123
|
+
* Phase 1 model: two people scanning two different workspaces must not block
|
|
124
|
+
* each other.
|
|
125
|
+
*/
|
|
126
|
+
/**
|
|
127
|
+
* Is a queue write in progress in this checkout?
|
|
128
|
+
*
|
|
129
|
+
* 🔴 THE LOCK WAS ONE-SIDED, AND A MEASUREMENT SHOWED WHAT THAT COSTS.
|
|
130
|
+
*
|
|
131
|
+
* Scan and verify took it; nothing else had heard of it. So a run started
|
|
132
|
+
* DURING a verify pass — by the daemon's poll, by a phone Start, by a second
|
|
133
|
+
* terminal, all of which consult only the run lease, which is free — acquired
|
|
134
|
+
* the lease, re-opened the queue, and wrote its hours-old snapshot back over
|
|
135
|
+
* every verdict the pass produced from that moment on. Measured: two items
|
|
136
|
+
* confirmed by the pass, one silently reverted to `draft` by the run, no error
|
|
137
|
+
* on either side, and the agent time that produced the verdict gone.
|
|
138
|
+
*
|
|
139
|
+
* `verify` is the worse half, because it holds the lock for the WHOLE pass —
|
|
140
|
+
* uncapped without `--max`, at up to five minutes a draft — which is precisely
|
|
141
|
+
* why it takes the lock early.
|
|
142
|
+
*/
|
|
143
|
+
function queueWriteInProgress(cwd) {
|
|
144
|
+
const lock = (0, node_path_1.join)((0, git_driver_1.executionStateDir)(cwd), 'queue.write.lock');
|
|
145
|
+
if (!(0, node_fs_1.existsSync)(lock))
|
|
146
|
+
return { busy: false };
|
|
147
|
+
const held = readClaim(lock);
|
|
148
|
+
if (held === null) {
|
|
149
|
+
return { busy: true, because: `a queue write is in progress and its claim cannot be read (${lock})` };
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* ⚠️ ONLY A LIVE, SAME-HOST HOLDER BLOCKS. A dead one is left for the next
|
|
153
|
+
* scan or verify to break — a run has no business breaking a lock it does
|
|
154
|
+
* not take, and refusing on a stale one would wedge the central command.
|
|
155
|
+
*/
|
|
156
|
+
if (held.host !== (0, node_os_1.hostname)() || (0, run_lease_1.nodeProbe)(held.pid) !== 'alive')
|
|
157
|
+
return { busy: false };
|
|
158
|
+
return {
|
|
159
|
+
busy: true,
|
|
160
|
+
because: `${held.what} is writing this checkout's queue (pid ${held.pid}, since ${held.at}). ` +
|
|
161
|
+
'A run holds the whole queue in memory and would write its own copy back over that work',
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
async function takeQueueWriteLease(cwd, what) {
|
|
165
|
+
const stateDir = (0, git_driver_1.executionStateDir)(cwd);
|
|
166
|
+
const lock = (0, node_path_1.join)(stateDir, 'queue.write.lock');
|
|
167
|
+
/**
|
|
168
|
+
* 🔴 THE RUN LEASE IS READ AND NEVER TAKEN. See the header. `inspect()` has no
|
|
169
|
+
* side effect: it does not claim, it does not reap a dead lease, and it leaves
|
|
170
|
+
* a crashed run's evidence exactly where recovery needs to find it.
|
|
171
|
+
*/
|
|
172
|
+
const runLease = new run_lease_1.RunLeaseStore(stateDir, run_lease_1.nodeLeaseFs);
|
|
173
|
+
const before = await runLease.inspect();
|
|
174
|
+
if (before.kind === 'active' || before.kind === 'ambiguous') {
|
|
175
|
+
throw new QueueBusy(what, refusalFor(what, before, stateDir));
|
|
176
|
+
}
|
|
177
|
+
(0, node_fs_1.mkdirSync)(stateDir, { recursive: true });
|
|
178
|
+
const mine = { pid: process.pid, host: (0, node_os_1.hostname)(), what, at: new Date().toISOString() };
|
|
179
|
+
const body = `${JSON.stringify(mine, null, 2)}\n`;
|
|
180
|
+
const claim = () => {
|
|
181
|
+
try {
|
|
182
|
+
(0, node_fs_1.writeFileSync)(lock, body, { encoding: 'utf8', flag: 'wx' });
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
catch (e) {
|
|
186
|
+
const code = e.code;
|
|
187
|
+
// Windows answers EPERM rather than EEXIST against a pending-delete file.
|
|
188
|
+
if (code === 'EEXIST' || code === 'EPERM')
|
|
189
|
+
return false;
|
|
190
|
+
throw e;
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
if (!claim()) {
|
|
194
|
+
/**
|
|
195
|
+
* ⚠️ A LOCK WHOSE OWNER IS GONE IS BROKEN, NOT OBEYED — and broken by
|
|
196
|
+
* CONTENT MATCH, which is the discipline Phase 1 settled on after measuring
|
|
197
|
+
* what removing a token by path does: a process that had already lost its
|
|
198
|
+
* claim deleted the winner's, and four processes then held one lock.
|
|
199
|
+
*
|
|
200
|
+
* A lock from ANOTHER HOST is never broken. This file lives in a checkout
|
|
201
|
+
* that could be on a network share, and a pid means nothing across machines.
|
|
202
|
+
*/
|
|
203
|
+
const held = readClaim(lock);
|
|
204
|
+
/**
|
|
205
|
+
* ⚠️ GUARDED. An ENOENT between the `existsSync` and the read — which is
|
|
206
|
+
* exactly what a competing process doing this same dead-lock break causes —
|
|
207
|
+
* used to throw a raw filesystem error out of here, past `bin.ts`'s
|
|
208
|
+
* QueueBusy handling, printing an internal path and exiting 1 instead of 2.
|
|
209
|
+
*/
|
|
210
|
+
let raw;
|
|
211
|
+
try {
|
|
212
|
+
raw = (0, node_fs_1.readFileSync)(lock, 'utf8');
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
raw = null;
|
|
216
|
+
}
|
|
217
|
+
const dead = held !== null && held.host === (0, node_os_1.hostname)() && (0, run_lease_1.nodeProbe)(held.pid) === 'dead';
|
|
218
|
+
if (!dead || raw === null) {
|
|
219
|
+
/**
|
|
220
|
+
* ⚠️ IT NAMES THE FILE. A lock left by a crashed command whose pid has
|
|
221
|
+
* since been recycled — or belongs to another user, so the probe answers
|
|
222
|
+
* `unknown` — refuses every later scan and verify in that checkout for
|
|
223
|
+
* ever, in the present tense, about a month-old file. Since those two are
|
|
224
|
+
* the only ways items enter and get confirmed, that checkout can never
|
|
225
|
+
* take on new work again; and `looply runs`, `--reap`, `doctor` and
|
|
226
|
+
* `status` all say there is nothing left behind. The remedy is deleting
|
|
227
|
+
* one file, so the sentence says which.
|
|
228
|
+
*/
|
|
229
|
+
throw new QueueBusy(what, (held === null
|
|
230
|
+
? `another command is writing this checkout's queue, and this cannot read its claim`
|
|
231
|
+
: `${held.what} is writing this checkout's queue (pid ${held.pid} on ${held.host}, since ${held.at})`) +
|
|
232
|
+
`. If nothing is, delete ${lock}`);
|
|
233
|
+
}
|
|
234
|
+
try {
|
|
235
|
+
if ((0, node_fs_1.readFileSync)(lock, 'utf8') === raw)
|
|
236
|
+
(0, node_fs_1.unlinkSync)(lock);
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
/* somebody else got there; the claim below will say so */
|
|
240
|
+
}
|
|
241
|
+
if (!claim()) {
|
|
242
|
+
throw new QueueBusy(what, `another command took this checkout's queue write lock first (${lock})`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* 🔴 RE-READ THE RUN LEASE AFTER CLAIMING. Between the first read and the
|
|
247
|
+
* claim a run can have started: it takes the run lease, sees no reason to
|
|
248
|
+
* care about this lock, and opens the queue. Checking once would let the scan
|
|
249
|
+
* write into exactly the window it exists to avoid.
|
|
250
|
+
*
|
|
251
|
+
* ⚠️ AND IT GIVES THE LOCK BACK BEFORE REFUSING, or a refusal would leave the
|
|
252
|
+
* checkout locked by a command that did nothing.
|
|
253
|
+
*/
|
|
254
|
+
const after = await runLease.inspect();
|
|
255
|
+
if (after.kind === 'active' || after.kind === 'ambiguous') {
|
|
256
|
+
try {
|
|
257
|
+
if ((0, node_fs_1.readFileSync)(lock, 'utf8') === body)
|
|
258
|
+
(0, node_fs_1.unlinkSync)(lock);
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
/* already gone */
|
|
262
|
+
}
|
|
263
|
+
throw new QueueBusy(what, refusalFor(what, after, stateDir));
|
|
264
|
+
}
|
|
265
|
+
let given = false;
|
|
266
|
+
return {
|
|
267
|
+
release: async () => {
|
|
268
|
+
if (given)
|
|
269
|
+
return;
|
|
270
|
+
given = true;
|
|
271
|
+
try {
|
|
272
|
+
// Only ours: the same compare-before-remove rule as above.
|
|
273
|
+
if ((0, node_fs_1.readFileSync)(lock, 'utf8') === body)
|
|
274
|
+
(0, node_fs_1.unlinkSync)(lock);
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
/* already gone, or somebody broke it because we looked dead */
|
|
278
|
+
}
|
|
279
|
+
},
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=queue-write-lease.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-write-lease.js","sourceRoot":"","sources":["../src/queue-write-lease.ts"],"names":[],"mappings":"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"}
|