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
package/dist/doctor.d.ts
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { AbortResult, CommandRunner } from './gate';
|
|
2
|
+
import type { LooplyConfig } from './config';
|
|
3
|
+
import type { ContainmentProbe } from './untrusted-exec';
|
|
4
|
+
/**
|
|
5
|
+
* `looply doctor` — the interlocks and one full gate pass with **no agent call**
|
|
6
|
+
* (DESIGN §5.2), so a wrong `tsc` command is found in ninety seconds rather than
|
|
7
|
+
* at round 1 of an overnight run.
|
|
8
|
+
*
|
|
9
|
+
* This is deliberately not `runGate`. The gate skips `when:`-filtered steps
|
|
10
|
+
* against the diff and stops at the first red because later steps are
|
|
11
|
+
* uninformative about *this round*. Doctor answers a different question — does
|
|
12
|
+
* every configured command exist and run? — so every step runs (there is no
|
|
13
|
+
* diff to filter on) and a failure does not stop the pass: one doctor run
|
|
14
|
+
* should name every broken command, not the first one per invocation.
|
|
15
|
+
*/
|
|
16
|
+
export interface DoctorStepReport {
|
|
17
|
+
step: string;
|
|
18
|
+
run: string;
|
|
19
|
+
ok: boolean;
|
|
20
|
+
ms: number;
|
|
21
|
+
timedOut?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* The step NEVER RAN — the environment could not start it (`CommandResult.unavailable`).
|
|
24
|
+
* Not a verdict about the code, and a reader that needs one must not take `ok: false` for one.
|
|
25
|
+
*/
|
|
26
|
+
unavailable?: boolean;
|
|
27
|
+
/** Command output, kept only on failure — that is when someone reads it. */
|
|
28
|
+
output?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface DoctorReport {
|
|
31
|
+
/** Non-null when an interlock tripped; no step has run in that case. */
|
|
32
|
+
abort: AbortResult | null;
|
|
33
|
+
steps: DoctorStepReport[];
|
|
34
|
+
ok: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Whether this machine can contain untrusted execution at all, or null when
|
|
37
|
+
* nothing asked.
|
|
38
|
+
*
|
|
39
|
+
* 🔴 REPORTED, NOT ENFORCED — and it is reported because it was previously
|
|
40
|
+
* knowable and unknown. `AppContainerBackend.probe()` existed, was correct,
|
|
41
|
+
* and had NO CALLER anywhere: the one function that answers "is there a
|
|
42
|
+
* boundary on this machine" was never asked. A person on a platform with no
|
|
43
|
+
* AppContainer learned it from a gate step failing mid-run, if at all.
|
|
44
|
+
*
|
|
45
|
+
* It does not gate the doctor pass. A machine without containment cannot run
|
|
46
|
+
* a gate step at all — `run()` refuses rather than degrading — so the step
|
|
47
|
+
* failures below already say so loudly. What this adds is the REASON, before
|
|
48
|
+
* the failures, in one line.
|
|
49
|
+
*/
|
|
50
|
+
containment: ContainmentProbe | null;
|
|
51
|
+
}
|
|
52
|
+
export interface DoctorDeps {
|
|
53
|
+
runner: CommandRunner;
|
|
54
|
+
/**
|
|
55
|
+
* Ask whether untrusted execution can be contained here.
|
|
56
|
+
*
|
|
57
|
+
* Optional so every existing caller and fixture keeps working, and absent
|
|
58
|
+
* means "nobody asked" rather than "no boundary" — two different facts, and
|
|
59
|
+
* only one of them is a finding.
|
|
60
|
+
*/
|
|
61
|
+
probeContainment?: () => Promise<ContainmentProbe>;
|
|
62
|
+
/** Contents of an env file, or null when it does not exist (not an error). */
|
|
63
|
+
readEnvFile(path: string): string | null;
|
|
64
|
+
/** The live environment; values are matched against `rails.prod_patterns`. */
|
|
65
|
+
env: Readonly<Record<string, string | undefined>>;
|
|
66
|
+
}
|
|
67
|
+
export declare function runDoctorGate(cfg: LooplyConfig, deps: DoctorDeps): Promise<DoctorReport>;
|
|
68
|
+
/**
|
|
69
|
+
* THE INTEGRATION REF, ASKED BEFORE A START IS SPENT FINDING OUT (M6-12).
|
|
70
|
+
*
|
|
71
|
+
* With `run.integration` on — by hand, or by the umbrella, which turns it on
|
|
72
|
+
* for every project under `machine.programme: { on: true }` — a run checks
|
|
73
|
+
* after each round that its base is still current against
|
|
74
|
+
* `looply/integration`. When that ref does not exist the check cannot answer
|
|
75
|
+
* and the run halts `aborted` after its first round (run-cmd's `baseStale`;
|
|
76
|
+
* `baseFreshness` → `uninitialised`). Correct — and found live in M6-11 by a
|
|
77
|
+
* placed run that spent its round to learn it, with doctor having said "all
|
|
78
|
+
* gate steps pass" moments before. Doctor now says it first.
|
|
79
|
+
*
|
|
80
|
+
* A WARNING, NOT A GATE FAILURE: creating the ref is the owner's act
|
|
81
|
+
* (`looply integrate --init <ref>`), and a project that has not chosen its
|
|
82
|
+
* base yet is not broken — its runs simply cannot converge until it does.
|
|
83
|
+
* `null` when integration is off, when nobody supplied a git to ask (the
|
|
84
|
+
* lane's candidate check has no business asking), or when the ref exists.
|
|
85
|
+
* A git that cannot answer is said out loud rather than read as "exists".
|
|
86
|
+
*/
|
|
87
|
+
export interface IntegrationRefGit {
|
|
88
|
+
refExists(ref: string): Promise<boolean>;
|
|
89
|
+
}
|
|
90
|
+
export declare function integrationRefWarning(cfg: LooplyConfig, git: IntegrationRefGit | undefined): Promise<string | null>;
|
|
91
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGzD;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,OAAO,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,wEAAwE;IACxE,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ;;;;;;;;;;;;;;OAcG;IACH,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,aAAa,CAAC;IACtB;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACnD,8EAA8E;IAC9E,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACzC,8EAA8E;IAC9E,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;CACnD;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CA6C9F;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1C;AAED,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,YAAY,EACjB,GAAG,EAAE,iBAAiB,GAAG,SAAS,GACjC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiBxB"}
|
package/dist/doctor.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runDoctorGate = runDoctorGate;
|
|
4
|
+
exports.integrationRefWarning = integrationRefWarning;
|
|
5
|
+
const gate_1 = require("./gate");
|
|
6
|
+
const integration_1 = require("./integration");
|
|
7
|
+
async function runDoctorGate(cfg, deps) {
|
|
8
|
+
const envValues = [];
|
|
9
|
+
for (const file of cfg.rails.prodEnvFiles) {
|
|
10
|
+
const text = deps.readEnvFile(file);
|
|
11
|
+
if (text !== null)
|
|
12
|
+
envValues.push(text);
|
|
13
|
+
}
|
|
14
|
+
for (const value of Object.values(deps.env)) {
|
|
15
|
+
if (value)
|
|
16
|
+
envValues.push(value);
|
|
17
|
+
}
|
|
18
|
+
// Same interlock the run uses, with an empty diff: doctor proves the prod
|
|
19
|
+
// check itself, and a reachable production database must stop everything
|
|
20
|
+
// before a single command runs — exactly as it would mid-run.
|
|
21
|
+
/**
|
|
22
|
+
* Asked BEFORE the interlocks, so the answer survives an abort. A machine
|
|
23
|
+
* with no boundary is worth saying so on the way out, not only on the happy
|
|
24
|
+
* path — and a probe that failed would otherwise be reported as nothing.
|
|
25
|
+
*/
|
|
26
|
+
const containment = deps.probeContainment
|
|
27
|
+
? await deps.probeContainment().catch((e) => ({
|
|
28
|
+
available: false,
|
|
29
|
+
backend: 'unknown',
|
|
30
|
+
because: `the probe itself failed: ${e?.message ?? String(e)}`,
|
|
31
|
+
}))
|
|
32
|
+
: null;
|
|
33
|
+
const abort = (0, gate_1.checkInterlocks)({ changedPaths: [], rails: cfg.rails, envValues });
|
|
34
|
+
if (abort)
|
|
35
|
+
return { abort, steps: [], ok: false, containment };
|
|
36
|
+
const steps = [];
|
|
37
|
+
for (const step of cfg.gates) {
|
|
38
|
+
// The step's own timeout, identical to the gate's: a doctor pass that used
|
|
39
|
+
// a different budget would prove a run the real gate never executes.
|
|
40
|
+
const timeoutMs = (step.timeoutS ?? gate_1.DEFAULT_TIMEOUT_S) * 1000;
|
|
41
|
+
const r = await deps.runner(step.run, timeoutMs);
|
|
42
|
+
const report = { step: step.name, run: step.run, ok: r.ok, ms: r.ms };
|
|
43
|
+
if (r.timedOut)
|
|
44
|
+
report.timedOut = true;
|
|
45
|
+
if (r.unavailable === true)
|
|
46
|
+
report.unavailable = true;
|
|
47
|
+
if (!r.ok && r.output)
|
|
48
|
+
report.output = r.output;
|
|
49
|
+
steps.push(report);
|
|
50
|
+
}
|
|
51
|
+
return { abort: null, steps, ok: steps.every((s) => s.ok), containment };
|
|
52
|
+
}
|
|
53
|
+
async function integrationRefWarning(cfg, git) {
|
|
54
|
+
if (cfg.run.integration !== true)
|
|
55
|
+
return null;
|
|
56
|
+
if (git === undefined)
|
|
57
|
+
return null;
|
|
58
|
+
let exists;
|
|
59
|
+
try {
|
|
60
|
+
exists = await git.refExists(integration_1.INTEGRATION_BRANCH);
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
return (`could not tell whether ${integration_1.INTEGRATION_BRANCH} exists (${e?.message ?? String(e)}) — ` +
|
|
64
|
+
'with run.integration on, a run that cannot tell will end aborted after its first round');
|
|
65
|
+
}
|
|
66
|
+
if (exists)
|
|
67
|
+
return null;
|
|
68
|
+
return (`run.integration is on and ${integration_1.INTEGRATION_BRANCH} does not exist — every run will end aborted after its ` +
|
|
69
|
+
'first round until it is created (looply integrate --init <ref>)');
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { buildActionRequest, type ActionRequest, type DependsVerdict, type ProposedDependency, type TrustedActionContext } from '@looply/core';
|
|
2
|
+
/**
|
|
3
|
+
* TURNING A JUDGED EDGE INTO A QUESTION FOR A PERSON.
|
|
4
|
+
*
|
|
5
|
+
* ─────────────────────────────────────────────────────────────────────────────
|
|
6
|
+
* 🔴 THE ONLY VERDICT THAT MAY BE FILED IS `accepted`, AND THAT IS THE FENCE'S
|
|
7
|
+
* ENTIRE PURPOSE.
|
|
8
|
+
*
|
|
9
|
+
* A stale edge, a refused one, or one nothing could be established about must
|
|
10
|
+
* never reach somebody's phone. The fence exists so a person is asked about
|
|
11
|
+
* edges that passed every check a machine can make — asking about the others
|
|
12
|
+
* would spend the one resource this system cannot replace, which is somebody's
|
|
13
|
+
* willingness to read the next question carefully.
|
|
14
|
+
*
|
|
15
|
+
* ─────────────────────────────────────────────────────────────────────────────
|
|
16
|
+
* 🔴 THE IDEMPOTENCY KEY IS THE FINGERPRINT, NOT A COUNTER OR A CLOCK.
|
|
17
|
+
*
|
|
18
|
+
* The same edge, at the same goal versions, read from the same source, is the
|
|
19
|
+
* same request — and must become at most one approval however many cadences
|
|
20
|
+
* propose it. A key derived from time would file a new question every tick for
|
|
21
|
+
* as long as the brain kept suggesting it, which is how an approval queue
|
|
22
|
+
* becomes something a person scrolls past.
|
|
23
|
+
*
|
|
24
|
+
* ─────────────────────────────────────────────────────────────────────────────
|
|
25
|
+
* ⚠️ HOW MANY OF THESE CAN ARRIVE IS BOUNDED UPSTREAM, AND IT IS WORTH SAYING
|
|
26
|
+
* WHERE. `MAX_ASKS_PER_TICK` is 1: one NEW question to the brain per cadence,
|
|
27
|
+
* so at most one new edge proposal per cadence can exist to file. Nothing here
|
|
28
|
+
* needs its own throttle, and if that constant ever moves, this is the sentence
|
|
29
|
+
* that should be read again.
|
|
30
|
+
*
|
|
31
|
+
* ─────────────────────────────────────────────────────────────────────────────
|
|
32
|
+
* 🔴 FILING IS NOT APPROVING. Nothing in this module decides anything. It
|
|
33
|
+
* builds a request, hands it to the approvals surface, and stops.
|
|
34
|
+
*/
|
|
35
|
+
/** What this needs from the server, and nothing wider. */
|
|
36
|
+
export interface EdgeApprovalCapability {
|
|
37
|
+
createApproval(projectId: string, input: {
|
|
38
|
+
clientRef: string;
|
|
39
|
+
actionRequest: unknown;
|
|
40
|
+
context?: {
|
|
41
|
+
goalId: string;
|
|
42
|
+
goalVersion: number;
|
|
43
|
+
};
|
|
44
|
+
validForMs?: number;
|
|
45
|
+
}): Promise<{
|
|
46
|
+
deduplicated: boolean;
|
|
47
|
+
}>;
|
|
48
|
+
}
|
|
49
|
+
export type FiledEdge =
|
|
50
|
+
/** A question is on record for a person. */
|
|
51
|
+
{
|
|
52
|
+
readonly kind: 'filed';
|
|
53
|
+
readonly clientRef: string;
|
|
54
|
+
readonly display: string;
|
|
55
|
+
readonly deduplicated: boolean;
|
|
56
|
+
}
|
|
57
|
+
/** It was not `accepted`, so it is not something to ask anybody about. */
|
|
58
|
+
| {
|
|
59
|
+
readonly kind: 'not-asked';
|
|
60
|
+
readonly because: string;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 🔴 THE REQUEST COULD NOT EVEN BE BUILT. Distinct from `not-asked`: that one
|
|
64
|
+
* is a judgement about the edge, and this is a shape the action registry
|
|
65
|
+
* refuses. A caller that reported them alike would tell somebody their
|
|
66
|
+
* proposal was stale when the truth is that it was malformed.
|
|
67
|
+
*/
|
|
68
|
+
| {
|
|
69
|
+
readonly kind: 'unbuildable';
|
|
70
|
+
readonly because: string;
|
|
71
|
+
}
|
|
72
|
+
/** The surface could not be reached. Nothing was established, and nothing filed. */
|
|
73
|
+
| {
|
|
74
|
+
readonly kind: 'unreachable';
|
|
75
|
+
readonly because: string;
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* The action an accepted edge becomes.
|
|
79
|
+
*
|
|
80
|
+
* ⚠️ `requestedBy` IS THE CALLER'S, AND A MACHINE IS RECORDED AS A MACHINE.
|
|
81
|
+
* This is the two-key rule's first key: a machine raises the request and a
|
|
82
|
+
* person turns the second. Passing a person's actor here would be a machine
|
|
83
|
+
* signing somebody else's name on the thing they are about to be asked to
|
|
84
|
+
* approve.
|
|
85
|
+
*/
|
|
86
|
+
export declare function edgeActionFor(edge: ProposedDependency, ctx: TrustedActionContext): ReturnType<typeof buildActionRequest>;
|
|
87
|
+
/**
|
|
88
|
+
* ⚠️ DERIVED FROM THE FINGERPRINT, WHICH ALREADY CONTAINS EVERY FIELD THAT
|
|
89
|
+
* MATTERS — both goals, both versions, the source and its hash. Re-deriving a
|
|
90
|
+
* key from those fields by hand would be a second definition of "the same
|
|
91
|
+
* request" that could drift from the first.
|
|
92
|
+
*/
|
|
93
|
+
export declare function edgeClientRef(request: ActionRequest): string;
|
|
94
|
+
/**
|
|
95
|
+
* File one judged edge, if it is one anybody should be asked about.
|
|
96
|
+
*/
|
|
97
|
+
export declare function fileEdge(edge: ProposedDependency, verdict: DependsVerdict, ctx: TrustedActionContext, approvals: EdgeApprovalCapability): Promise<FiledEdge>;
|
|
98
|
+
/**
|
|
99
|
+
* One line for a person.
|
|
100
|
+
*
|
|
101
|
+
* 🔴 A FILED EDGE SAYS IT IS WAITING, NOT THAT IT HAPPENED. The word "approval"
|
|
102
|
+
* on its own reads to a tired person as a thing that was approved.
|
|
103
|
+
*/
|
|
104
|
+
export declare function describeFiled(filed: FiledEdge): string;
|
|
105
|
+
//# sourceMappingURL=edge-approval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edge-approval.d.ts","sourceRoot":"","sources":["../src/edge-approval.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAElB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EAC1B,MAAM,cAAc,CAAC;AAEtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,0DAA0D;AAC1D,MAAM,WAAW,sBAAsB;IACrC,cAAc,CACZ,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE;QACL,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,OAAO,CAAC;QACvB,OAAO,CAAC,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE,CAAC;QAClD,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GACA,OAAO,CAAC;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACvC;AAED,MAAM,MAAM,SAAS;AACnB,4CAA4C;AAC1C;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;CAAE;AAClH,0EAA0E;GACxE;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAC1D;;;;;GAKG;GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAC5D,oFAAoF;GAClF;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,kBAAkB,EAAE,GAAG,EAAE,oBAAoB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAmBxH;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAE5D;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,kBAAkB,EACxB,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE,oBAAoB,EACzB,SAAS,EAAE,sBAAsB,GAChC,OAAO,CAAC,SAAS,CAAC,CAmCpB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAatD"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.edgeActionFor = edgeActionFor;
|
|
4
|
+
exports.edgeClientRef = edgeClientRef;
|
|
5
|
+
exports.fileEdge = fileEdge;
|
|
6
|
+
exports.describeFiled = describeFiled;
|
|
7
|
+
const core_1 = require("@looply/core");
|
|
8
|
+
/**
|
|
9
|
+
* The action an accepted edge becomes.
|
|
10
|
+
*
|
|
11
|
+
* ⚠️ `requestedBy` IS THE CALLER'S, AND A MACHINE IS RECORDED AS A MACHINE.
|
|
12
|
+
* This is the two-key rule's first key: a machine raises the request and a
|
|
13
|
+
* person turns the second. Passing a person's actor here would be a machine
|
|
14
|
+
* signing somebody else's name on the thing they are about to be asked to
|
|
15
|
+
* approve.
|
|
16
|
+
*/
|
|
17
|
+
function edgeActionFor(edge, ctx) {
|
|
18
|
+
return (0, core_1.buildActionRequest)('goal.depends', {
|
|
19
|
+
goalId: edge.goalId,
|
|
20
|
+
dependsOnId: edge.dependsOnId,
|
|
21
|
+
goalVersion: edge.readAt.goalVersion,
|
|
22
|
+
dependsOnVersion: edge.readAt.dependsOnVersion,
|
|
23
|
+
sourceId: edge.readAt.sourceId,
|
|
24
|
+
sourceSha: edge.readAt.sourceSha,
|
|
25
|
+
}, ctx,
|
|
26
|
+
/**
|
|
27
|
+
* ⚠️ THE MODEL'S SENTENCE TRAVELS AS A NOTE, WHICH CARRIES NO WEIGHT. It is
|
|
28
|
+
* outside the fingerprint by the action registry's design: approving means
|
|
29
|
+
* approving the action, not the wording of its excuse.
|
|
30
|
+
*/
|
|
31
|
+
edge.because);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* ⚠️ DERIVED FROM THE FINGERPRINT, WHICH ALREADY CONTAINS EVERY FIELD THAT
|
|
35
|
+
* MATTERS — both goals, both versions, the source and its hash. Re-deriving a
|
|
36
|
+
* key from those fields by hand would be a second definition of "the same
|
|
37
|
+
* request" that could drift from the first.
|
|
38
|
+
*/
|
|
39
|
+
function edgeClientRef(request) {
|
|
40
|
+
return `edge-${request.fingerprint.slice(0, 32)}`;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* File one judged edge, if it is one anybody should be asked about.
|
|
44
|
+
*/
|
|
45
|
+
async function fileEdge(edge, verdict, ctx, approvals) {
|
|
46
|
+
if (verdict.kind !== 'accepted') {
|
|
47
|
+
return {
|
|
48
|
+
kind: 'not-asked',
|
|
49
|
+
because: verdict.kind === 'unmeasurable'
|
|
50
|
+
? `nothing was established about it (${verdict.because})`
|
|
51
|
+
: `it is ${verdict.kind}: ${verdict.because}`,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
const built = edgeActionFor(edge, ctx);
|
|
55
|
+
if (!built.ok)
|
|
56
|
+
return { kind: 'unbuildable', because: `${built.code}: ${built.because}` };
|
|
57
|
+
const clientRef = edgeClientRef(built.request);
|
|
58
|
+
try {
|
|
59
|
+
/**
|
|
60
|
+
* 🔴 FILED UNDER THE GOAL THAT WILL WAIT, OR NOTHING CAN EVER CARRY IT OUT.
|
|
61
|
+
* Runs find their approvals by goal@version; an edge filed with no pursuit
|
|
62
|
+
* was approved and then claimed by nobody, for ever. The pursuit is the
|
|
63
|
+
* action's own goal@version — the server accepts it without a run for
|
|
64
|
+
* `goal.depends` only, and only when it is exactly that (F12). It also
|
|
65
|
+
* HOLDS that goal while the question is open: a pursuit with a pending
|
|
66
|
+
* approval is waiting on a person, so it does not start work that the
|
|
67
|
+
* edge might be about to make premature.
|
|
68
|
+
*/
|
|
69
|
+
const r = await approvals.createApproval(ctx.projectId, {
|
|
70
|
+
clientRef,
|
|
71
|
+
actionRequest: built.request,
|
|
72
|
+
context: { goalId: edge.goalId, goalVersion: edge.readAt.goalVersion },
|
|
73
|
+
});
|
|
74
|
+
return { kind: 'filed', clientRef, display: (0, core_1.displayAction)(built.request), deduplicated: r.deduplicated };
|
|
75
|
+
}
|
|
76
|
+
catch (e) {
|
|
77
|
+
return { kind: 'unreachable', because: `the approvals surface could not be reached (${e.message})` };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* One line for a person.
|
|
82
|
+
*
|
|
83
|
+
* 🔴 A FILED EDGE SAYS IT IS WAITING, NOT THAT IT HAPPENED. The word "approval"
|
|
84
|
+
* on its own reads to a tired person as a thing that was approved.
|
|
85
|
+
*/
|
|
86
|
+
function describeFiled(filed) {
|
|
87
|
+
switch (filed.kind) {
|
|
88
|
+
case 'filed':
|
|
89
|
+
return filed.deduplicated
|
|
90
|
+
? `already waiting for a decision: ${filed.display}`
|
|
91
|
+
: `waiting for your decision: ${filed.display}`;
|
|
92
|
+
case 'not-asked':
|
|
93
|
+
return `not put to anybody: ${filed.because}`;
|
|
94
|
+
case 'unbuildable':
|
|
95
|
+
return `could not be made into a request: ${filed.because}`;
|
|
96
|
+
case 'unreachable':
|
|
97
|
+
return `${filed.because}. Nothing was filed, and nothing was decided.`;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=edge-approval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edge-approval.js","sourceRoot":"","sources":["../src/edge-approval.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { Evidence } from '@looply/core';
|
|
2
|
+
import type { LedgerFs } from './ledger-store';
|
|
3
|
+
export type EvidenceLookup =
|
|
4
|
+
/** Recorded at exactly this HEAD — safe to put in the implementation prompt. */
|
|
5
|
+
{
|
|
6
|
+
kind: 'hit';
|
|
7
|
+
evidence: Evidence[];
|
|
8
|
+
}
|
|
9
|
+
/** Recorded at another HEAD; the caller owns the reuse-or-reverify decision. */
|
|
10
|
+
| {
|
|
11
|
+
kind: 'moved';
|
|
12
|
+
cachedHead: string;
|
|
13
|
+
evidence: Evidence[];
|
|
14
|
+
} | {
|
|
15
|
+
kind: 'miss';
|
|
16
|
+
};
|
|
17
|
+
export declare class EvidenceCache {
|
|
18
|
+
private readonly stateDir;
|
|
19
|
+
private readonly fs;
|
|
20
|
+
/** Distinguishes two writes from ONE process; the pid distinguishes processes. */
|
|
21
|
+
private static writes;
|
|
22
|
+
private entries;
|
|
23
|
+
private opened;
|
|
24
|
+
constructor(stateDir: string, fs: LedgerFs);
|
|
25
|
+
private get cachePath();
|
|
26
|
+
/**
|
|
27
|
+
* Load whatever is on disk. Missing file → empty cache (first run); corrupt
|
|
28
|
+
* file → loud failure, same rationale as the queue store: the file only ever
|
|
29
|
+
* lands whole, so corrupt means something else touched it, and starting empty
|
|
30
|
+
* would throw away a night of verification the next persist makes permanent.
|
|
31
|
+
*/
|
|
32
|
+
open(): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Record a confirmed item's evidence at the HEAD it was verified against.
|
|
35
|
+
* One entry per item: a re-verify at a new HEAD replaces the old claim —
|
|
36
|
+
* keeping both would let a later lookup "hit" on a tree that no longer exists.
|
|
37
|
+
*/
|
|
38
|
+
put(itemId: string, head: string, evidence: readonly Evidence[]): Promise<void>;
|
|
39
|
+
lookup(itemId: string, head: string): EvidenceLookup;
|
|
40
|
+
/** Drop an item's entry. §12 case 19: a discard always invalidates — the round may have mangled the very paths the evidence points at. */
|
|
41
|
+
invalidate(itemId: string): Promise<void>;
|
|
42
|
+
private assertOpened;
|
|
43
|
+
private persist;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=evidence-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-cache.d.ts","sourceRoot":"","sources":["../src/evidence-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AA6B/C,MAAM,MAAM,cAAc;AACxB,gFAAgF;AAC9E;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,QAAQ,EAAE,CAAA;CAAE;AACvC,gFAAgF;GAC9E;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,QAAQ,EAAE,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErB,qBAAa,aAAa;IAQtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,EAAE;IARrB,kFAAkF;IAClF,OAAO,CAAC,MAAM,CAAC,MAAM,CAAK;IAE1B,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,MAAM,CAAS;gBAGJ,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,QAAQ;IAG/B,OAAO,KAAK,SAAS,GAEpB;IAED;;;;;OAKG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B;;;;OAIG;IACG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAWrF,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc;IASpD,0IAA0I;IACpI,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/C,OAAO,CAAC,YAAY;YAMN,OAAO;CAWtB"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EvidenceCache = void 0;
|
|
4
|
+
class EvidenceCache {
|
|
5
|
+
stateDir;
|
|
6
|
+
fs;
|
|
7
|
+
/** Distinguishes two writes from ONE process; the pid distinguishes processes. */
|
|
8
|
+
static writes = 0;
|
|
9
|
+
entries = new Map();
|
|
10
|
+
opened = false;
|
|
11
|
+
constructor(stateDir, fs) {
|
|
12
|
+
this.stateDir = stateDir;
|
|
13
|
+
this.fs = fs;
|
|
14
|
+
}
|
|
15
|
+
get cachePath() {
|
|
16
|
+
return `${this.stateDir}/evidence.json`;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Load whatever is on disk. Missing file → empty cache (first run); corrupt
|
|
20
|
+
* file → loud failure, same rationale as the queue store: the file only ever
|
|
21
|
+
* lands whole, so corrupt means something else touched it, and starting empty
|
|
22
|
+
* would throw away a night of verification the next persist makes permanent.
|
|
23
|
+
*/
|
|
24
|
+
async open() {
|
|
25
|
+
await this.fs.mkdir(this.stateDir);
|
|
26
|
+
const text = await this.fs.readFile(this.cachePath);
|
|
27
|
+
if (text !== null) {
|
|
28
|
+
const parsed = JSON.parse(text);
|
|
29
|
+
this.entries = new Map(Object.entries(parsed));
|
|
30
|
+
}
|
|
31
|
+
this.opened = true;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Record a confirmed item's evidence at the HEAD it was verified against.
|
|
35
|
+
* One entry per item: a re-verify at a new HEAD replaces the old claim —
|
|
36
|
+
* keeping both would let a later lookup "hit" on a tree that no longer exists.
|
|
37
|
+
*/
|
|
38
|
+
async put(itemId, head, evidence) {
|
|
39
|
+
this.assertOpened();
|
|
40
|
+
if (itemId === '' || head === '') {
|
|
41
|
+
// An empty half of the key would silently collide every caller that
|
|
42
|
+
// forgot to thread it — better to fail at the write than mix items up.
|
|
43
|
+
throw new Error('evidence cache: itemId and head must be non-empty');
|
|
44
|
+
}
|
|
45
|
+
this.entries.set(itemId, { head, evidence: copyEvidence(evidence) });
|
|
46
|
+
await this.persist();
|
|
47
|
+
}
|
|
48
|
+
lookup(itemId, head) {
|
|
49
|
+
const entry = this.entries.get(itemId);
|
|
50
|
+
if (entry === undefined)
|
|
51
|
+
return { kind: 'miss' };
|
|
52
|
+
if (entry.head !== head) {
|
|
53
|
+
return { kind: 'moved', cachedHead: entry.head, evidence: copyEvidence(entry.evidence) };
|
|
54
|
+
}
|
|
55
|
+
return { kind: 'hit', evidence: copyEvidence(entry.evidence) };
|
|
56
|
+
}
|
|
57
|
+
/** Drop an item's entry. §12 case 19: a discard always invalidates — the round may have mangled the very paths the evidence points at. */
|
|
58
|
+
async invalidate(itemId) {
|
|
59
|
+
this.assertOpened();
|
|
60
|
+
if (this.entries.delete(itemId)) {
|
|
61
|
+
await this.persist();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
assertOpened() {
|
|
65
|
+
if (!this.opened) {
|
|
66
|
+
throw new Error('evidence cache: write before open() — would overwrite the cache on disk');
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async persist() {
|
|
70
|
+
// Temp-then-rename, same contract as status.json and queue.json.
|
|
71
|
+
// The temp name is PRIVATE TO THIS WRITER. A shared `evidence.json.tmp` is
|
|
72
|
+
// two processes writing one path: the second truncates and rewrites what
|
|
73
|
+
// the first is midway through, and then both rename it into place. The
|
|
74
|
+
// rename is atomic and the file it renames is a splice of two writes, and
|
|
75
|
+
// nothing downstream can tell.
|
|
76
|
+
const tmp = `${this.cachePath}.${process.pid}.${(EvidenceCache.writes += 1)}.tmp`;
|
|
77
|
+
await this.fs.writeFile(tmp, JSON.stringify(Object.fromEntries(this.entries), null, 2) + '\n');
|
|
78
|
+
await this.fs.rename(tmp, this.cachePath);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.EvidenceCache = EvidenceCache;
|
|
82
|
+
/**
|
|
83
|
+
* Copies on the way in and out: the cache holds a *record* of what verify saw,
|
|
84
|
+
* and a caller mutating the array it handed over (or got back) must not be able
|
|
85
|
+
* to rewrite that record without going through `put`.
|
|
86
|
+
*/
|
|
87
|
+
function copyEvidence(evidence) {
|
|
88
|
+
return evidence.map((e) => ({ ...e }));
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=evidence-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-cache.js","sourceRoot":"","sources":["../src/evidence-cache.ts"],"names":[],"mappings":"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"}
|