looply-cli 0.0.0-stage → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +2727 -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/serve-cmd.d.ts +115 -0
- package/dist/serve-cmd.d.ts.map +1 -0
- package/dist/serve-cmd.js +505 -0
- package/dist/serve-cmd.js.map +1 -0
- package/dist/serve.d.ts +167 -0
- package/dist/serve.d.ts.map +1 -0
- package/dist/serve.js +336 -0
- package/dist/serve.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 +52 -4
- 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,242 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SHARED_GRANT_LOCK_WAIT_MS = void 0;
|
|
4
|
+
exports.sharedGrantsPath = sharedGrantsPath;
|
|
5
|
+
exports.readSharedGrants = readSharedGrants;
|
|
6
|
+
exports.liveSharedGrants = liveSharedGrants;
|
|
7
|
+
exports.grantAce = grantAce;
|
|
8
|
+
exports.removeAce = removeAce;
|
|
9
|
+
exports.ensureSharedGrant = ensureSharedGrant;
|
|
10
|
+
exports.ensureSharedAccess = ensureSharedAccess;
|
|
11
|
+
exports.releaseSharedGrants = releaseSharedGrants;
|
|
12
|
+
const node_child_process_1 = require("node:child_process");
|
|
13
|
+
const node_fs_1 = require("node:fs");
|
|
14
|
+
const node_os_1 = require("node:os");
|
|
15
|
+
const node_path_1 = require("node:path");
|
|
16
|
+
const exclusive_lock_1 = require("./exclusive-lock");
|
|
17
|
+
const untrusted_exec_1 = require("./untrusted-exec");
|
|
18
|
+
function sharedGrantsPath(home = (0, node_os_1.homedir)()) {
|
|
19
|
+
return (0, node_path_1.join)(home, '.looply', 'container-grants.jsonl');
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* F43: HOW LONG ONE GRANT WAITS FOR ANOTHER — longer than an ACL write takes.
|
|
23
|
+
*
|
|
24
|
+
* `icacls /grant (OI)(CI)` rewrites the entry on every file under the toolchain
|
|
25
|
+
* mirror, and the time grows with the list: 8–11 s on 09-15, 26–29 s on 09-26
|
|
26
|
+
* at ~1,230 entries. The shared mutex's default wait (5 s) is sized for
|
|
27
|
+
* check-and-claims that take microseconds, so a second identity arriving during
|
|
28
|
+
* a grant was refused ("could not be serialised") — a gate step or a tool call
|
|
29
|
+
* that did not run, and in the lane an inconclusive check nobody re-offers.
|
|
30
|
+
* A holder that dies is still broken at once (`withExclusiveLock`); this only
|
|
31
|
+
* bounds how long a LIVE holder is waited for.
|
|
32
|
+
*/
|
|
33
|
+
exports.SHARED_GRANT_LOCK_WAIT_MS = 300_000;
|
|
34
|
+
function lockPath(home) {
|
|
35
|
+
return (0, node_path_1.join)(home, '.looply', 'container-grants.lock');
|
|
36
|
+
}
|
|
37
|
+
/** Every row, oldest first. A row that will not parse is skipped, never fatal. */
|
|
38
|
+
function readSharedGrants(home = (0, node_os_1.homedir)()) {
|
|
39
|
+
let raw;
|
|
40
|
+
try {
|
|
41
|
+
raw = (0, node_fs_1.readFileSync)(sharedGrantsPath(home), 'utf8');
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
const out = [];
|
|
47
|
+
for (const line of raw.split('\n')) {
|
|
48
|
+
const s = line.trim();
|
|
49
|
+
if (s === '')
|
|
50
|
+
continue;
|
|
51
|
+
try {
|
|
52
|
+
const r = JSON.parse(s);
|
|
53
|
+
if (typeof r.name === 'string' && typeof r.sid === 'string' && typeof r.path === 'string') {
|
|
54
|
+
out.push(r);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
/* one unreadable row is one lost row, not a lost ledger */
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return out;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* What is still granted: the last state wins, per (sid, path).
|
|
65
|
+
*
|
|
66
|
+
* Folded rather than filtered, because a path can legitimately be granted,
|
|
67
|
+
* released, and granted again when a workspace identity is reused.
|
|
68
|
+
*/
|
|
69
|
+
function liveSharedGrants(home = (0, node_os_1.homedir)()) {
|
|
70
|
+
const last = new Map();
|
|
71
|
+
for (const r of readSharedGrants(home))
|
|
72
|
+
last.set(`${r.sid}|${r.path}`, r);
|
|
73
|
+
return [...last.values()].filter((r) => r.state === 'granted');
|
|
74
|
+
}
|
|
75
|
+
function append(home, r) {
|
|
76
|
+
const p = sharedGrantsPath(home);
|
|
77
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.join)(home, '.looply'), { recursive: true });
|
|
78
|
+
(0, node_fs_1.appendFileSync)(p, `\n${JSON.stringify(r)}`, 'utf8');
|
|
79
|
+
}
|
|
80
|
+
function icacls() {
|
|
81
|
+
return (0, node_path_1.join)((0, untrusted_exec_1.systemRoot)(), 'System32', 'icacls.exe');
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Add one inheritable read-and-execute ACE for a container SID.
|
|
85
|
+
*
|
|
86
|
+
* READ AND EXECUTE ONLY, on both shared paths, because both hold Looply's own
|
|
87
|
+
* artefacts: a container that could replace `node.exe` or the tool worker would
|
|
88
|
+
* be choosing what every later execution runs.
|
|
89
|
+
*/
|
|
90
|
+
function grantAce(path, sid) {
|
|
91
|
+
try {
|
|
92
|
+
(0, node_child_process_1.execFileSync)(icacls(), [path, '/grant', `*${sid}:(OI)(CI)(RX)`], { stdio: 'ignore' });
|
|
93
|
+
return { ok: true };
|
|
94
|
+
}
|
|
95
|
+
catch (e) {
|
|
96
|
+
return { ok: false, because: e.message };
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Remove every granted ACE for one SID from one path, and nothing else.
|
|
101
|
+
*
|
|
102
|
+
* `/remove:g` names a single principal. It cannot touch another SID's entry, an
|
|
103
|
+
* inherited entry, or the owner's own rights — which is what "without changing
|
|
104
|
+
* unrelated user permissions" has to mean in practice.
|
|
105
|
+
*/
|
|
106
|
+
function removeAce(path, sid) {
|
|
107
|
+
try {
|
|
108
|
+
(0, node_child_process_1.execFileSync)(icacls(), [path, '/remove:g', `*${sid}`], { stdio: 'ignore' });
|
|
109
|
+
return { ok: true };
|
|
110
|
+
}
|
|
111
|
+
catch (e) {
|
|
112
|
+
return { ok: false, because: e.message };
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Make sure this identity may read a shared path, recording that it now may.
|
|
117
|
+
*
|
|
118
|
+
* 🔴 THE SAME LOCK AS THE REMOVAL, WHICH IS THE POINT. `Set-Acl` and `icacls`
|
|
119
|
+
* are both read-modify-write over one DACL, so an addition racing a removal
|
|
120
|
+
* loses whichever entry it did not see. Locking only the cleanup would leave
|
|
121
|
+
* exactly that race open on every launch.
|
|
122
|
+
*
|
|
123
|
+
* ⚠️ THE CRITICAL SECTION IS THE ACL WRITE, AND NOTHING MORE. The lock is taken
|
|
124
|
+
* here and released before the caller launches anything: it is never held
|
|
125
|
+
* across a provider invocation or a gate step.
|
|
126
|
+
*
|
|
127
|
+
* Idempotent: an identity already recorded as holding this path does no ACL work
|
|
128
|
+
* at all, so the cost is paid once per identity rather than once per launch.
|
|
129
|
+
*/
|
|
130
|
+
function ensureSharedGrant(name, sid, path, deps = {}) {
|
|
131
|
+
const home = deps.home ?? (0, node_os_1.homedir)();
|
|
132
|
+
const doGrant = deps.grant ?? grantAce;
|
|
133
|
+
const now = deps.now ?? (() => new Date());
|
|
134
|
+
return (0, exclusive_lock_1.withExclusiveLock)(lockPath(home), () => {
|
|
135
|
+
const already = liveSharedGrants(home).some((r) => r.sid === sid && r.path === path);
|
|
136
|
+
if (already)
|
|
137
|
+
return { ok: true };
|
|
138
|
+
// Intent first: a crash after the ACE lands must not leave it unrecorded.
|
|
139
|
+
append(home, { name, sid, path, at: now().toISOString(), state: 'granted' });
|
|
140
|
+
const r = doGrant(path, sid);
|
|
141
|
+
if (!r.ok) {
|
|
142
|
+
// The row stays. A recorded grant whose ACE never landed is cleaned up
|
|
143
|
+
// harmlessly; an ACE with no row is the leak this module removes.
|
|
144
|
+
return r;
|
|
145
|
+
}
|
|
146
|
+
return { ok: true };
|
|
147
|
+
}, (why) => ({ ok: false, because: `the shared-grant ledger could not be serialised: ${why}` }), exports.SHARED_GRANT_LOCK_WAIT_MS);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Ensure one container identity may read the shared paths, before it launches.
|
|
151
|
+
*
|
|
152
|
+
* ⚠️ THE COMMON CASE COSTS NOTHING. An identity whose rows are already in the
|
|
153
|
+
* ledger takes no lock, makes no probe and touches no ACL — so the extra round
|
|
154
|
+
* trip is paid once per identity, not once per launch.
|
|
155
|
+
*/
|
|
156
|
+
async function ensureSharedAccess(backend, name, paths, deps = {}) {
|
|
157
|
+
/*
|
|
158
|
+
* ⚠️ NULL MEANS "NOT A WINDOWS DACL BACKEND", NOT "SKIP THE SAFETY".
|
|
159
|
+
*
|
|
160
|
+
* Shared-path grants exist because AppContainer identities accumulate ACEs on
|
|
161
|
+
* a shared directory. A backend that is not the AppContainer one — a test
|
|
162
|
+
* double, or a future non-Windows boundary — grants nothing and therefore has
|
|
163
|
+
* nothing to give back. Asking it for a container SID would fail, and turning
|
|
164
|
+
* that failure into a refused gate step would break every suite that injects a
|
|
165
|
+
* fake backend while proving nothing about the real one.
|
|
166
|
+
*/
|
|
167
|
+
if (backend === null)
|
|
168
|
+
return { ok: true };
|
|
169
|
+
const home = deps.home ?? (0, node_os_1.homedir)();
|
|
170
|
+
const wanted = paths.filter((p) => p.length > 0);
|
|
171
|
+
if (wanted.length === 0)
|
|
172
|
+
return { ok: true };
|
|
173
|
+
const live = liveSharedGrants(home).filter((r) => r.name === name);
|
|
174
|
+
const missing = wanted.filter((p) => !live.some((r) => r.path === p));
|
|
175
|
+
if (missing.length === 0)
|
|
176
|
+
return { ok: true };
|
|
177
|
+
// The numeric SID, from the same helper that derives it for a launch. Asked
|
|
178
|
+
// for only when something is actually missing.
|
|
179
|
+
let reply;
|
|
180
|
+
try {
|
|
181
|
+
reply = await backend.call({ action: 'probe', profile: name });
|
|
182
|
+
}
|
|
183
|
+
catch (e) {
|
|
184
|
+
reply = { ok: false, error: e.message };
|
|
185
|
+
}
|
|
186
|
+
const sid = reply.sid;
|
|
187
|
+
if (!reply.ok || typeof sid !== 'string' || sid.length === 0) {
|
|
188
|
+
/*
|
|
189
|
+
* 🔴 NO SID MEANS NO GRANT, WHICH MEANS LESS ACCESS — NOT MORE.
|
|
190
|
+
*
|
|
191
|
+
* This is the one place the direction of failure has to be reasoned about
|
|
192
|
+
* out loud. Refusing the launch here would be safe too, but it would turn
|
|
193
|
+
* every backend that answers `probe` differently into a broken gate. Going
|
|
194
|
+
* on without the grant cannot widen anything: the container simply is not
|
|
195
|
+
* given the shared path, and if it needs it the launch fails at the
|
|
196
|
+
* boundary rather than succeeding with authority nobody recorded.
|
|
197
|
+
*/
|
|
198
|
+
return { ok: true, because: `no shared grant: ${reply.error ?? 'the backend returned no sid'}` };
|
|
199
|
+
}
|
|
200
|
+
for (const p of missing) {
|
|
201
|
+
const r = ensureSharedGrant(name, sid, p, deps);
|
|
202
|
+
if (!r.ok)
|
|
203
|
+
return r;
|
|
204
|
+
}
|
|
205
|
+
return { ok: true };
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Give back every shared-path grant held by these identities.
|
|
209
|
+
*
|
|
210
|
+
* 🔴 CALLED ONLY FOR AN IDENTITY WHOSE WORKSPACE IS BEING RETIRED, and the
|
|
211
|
+
* caller establishes that. This function does not decide liveness; it does the
|
|
212
|
+
* ACL work for a decision already made, so a caller that skips the check cannot
|
|
213
|
+
* be rescued here.
|
|
214
|
+
*
|
|
215
|
+
* ⚠️ A FAILURE LEAVES THE ROW `granted`, DELIBERATELY. That is the truthful
|
|
216
|
+
* cleanup-pending state: the next retirement sweep finds the row and tries
|
|
217
|
+
* again, and nothing ever reports cleanup it did not do.
|
|
218
|
+
*/
|
|
219
|
+
function releaseSharedGrants(names, deps = {}) {
|
|
220
|
+
const home = deps.home ?? (0, node_os_1.homedir)();
|
|
221
|
+
const doRemove = deps.remove ?? removeAce;
|
|
222
|
+
const now = deps.now ?? (() => new Date());
|
|
223
|
+
const wanted = new Set(names);
|
|
224
|
+
return (0, exclusive_lock_1.withExclusiveLock)(lockPath(home), () => {
|
|
225
|
+
const released = [];
|
|
226
|
+
const pending = [];
|
|
227
|
+
for (const r of liveSharedGrants(home)) {
|
|
228
|
+
if (!wanted.has(r.name))
|
|
229
|
+
continue;
|
|
230
|
+
const out = doRemove(r.path, r.sid);
|
|
231
|
+
if (out.ok) {
|
|
232
|
+
append(home, { ...r, at: now().toISOString(), state: 'released' });
|
|
233
|
+
released.push({ path: r.path, sid: r.sid });
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
pending.push({ path: r.path, sid: r.sid, because: out.because ?? 'unknown' });
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return { released, pending };
|
|
240
|
+
}, (why) => ({ released: [], pending: [{ path: '(all)', sid: '(all)', because: why }] }), exports.SHARED_GRANT_LOCK_WAIT_MS);
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=shared-grants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-grants.js","sourceRoot":"","sources":["../src/shared-grants.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Signal handling (DESIGN §12 case 11): HUP, INT and TERM must end in
|
|
3
|
+
* `run.ended` with tallies and a notification, never in a silent death.
|
|
4
|
+
*
|
|
5
|
+
* Node's default disposition for all three is immediate exit — the ledger's
|
|
6
|
+
* last line stays `round.phase` forever and the phone hears nothing, which is
|
|
7
|
+
* exactly the quiet failure the notifier exists to prevent. So the watcher
|
|
8
|
+
* takes the signals over, and the runner polls `requested()` between rounds:
|
|
9
|
+
*
|
|
10
|
+
* 1st signal → graceful. The in-flight round finishes (same finish-the-round
|
|
11
|
+
* rule as a budget limit, §12 case 10), the runner stops with stopReason
|
|
12
|
+
* `signal`, emits `run.ended` with totals, and the caller notifies.
|
|
13
|
+
* 2nd signal → force, once. The escape hatch for a round that will not end.
|
|
14
|
+
* `onForce` is the caller's emergency path (best-effort run.ended + notify,
|
|
15
|
+
* then exit); it fires exactly once because that path sends a message, and
|
|
16
|
+
* an impatient thumb on Ctrl-C must not send two.
|
|
17
|
+
*
|
|
18
|
+
* On force the watcher also uninstalls itself, so a THIRD signal falls through
|
|
19
|
+
* to the default disposition and genuinely kills the process. Without this, a
|
|
20
|
+
* caller whose force path hangs leaves a process nothing short of SIGKILL can
|
|
21
|
+
* reach.
|
|
22
|
+
*
|
|
23
|
+
* Exiting is deliberately not done here: it must happen after the async
|
|
24
|
+
* run.ended append and notify, so it belongs to the caller. This module stays
|
|
25
|
+
* synchronous and injectable.
|
|
26
|
+
*/
|
|
27
|
+
export declare const STOP_SIGNALS: readonly ["SIGHUP", "SIGINT", "SIGTERM"];
|
|
28
|
+
export type StopSignal = (typeof STOP_SIGNALS)[number];
|
|
29
|
+
/** The slice of `process` the watcher needs, injectable for tests. */
|
|
30
|
+
export interface SignalSource {
|
|
31
|
+
on(signal: StopSignal, handler: () => void): void;
|
|
32
|
+
off(signal: StopSignal, handler: () => void): void;
|
|
33
|
+
}
|
|
34
|
+
export interface SignalWatcherDeps {
|
|
35
|
+
proc: SignalSource;
|
|
36
|
+
/** First signal seen. Log "finishing the round — again to force" here. */
|
|
37
|
+
onGraceful?(signal: StopSignal): void;
|
|
38
|
+
/** Second signal seen. The caller's flush-and-exit path. Called once. */
|
|
39
|
+
onForce?(signal: StopSignal): void;
|
|
40
|
+
}
|
|
41
|
+
export declare class SignalWatcher {
|
|
42
|
+
private readonly deps;
|
|
43
|
+
private readonly handlers;
|
|
44
|
+
private received;
|
|
45
|
+
private forced;
|
|
46
|
+
constructor(deps: SignalWatcherDeps);
|
|
47
|
+
install(): void;
|
|
48
|
+
uninstall(): void;
|
|
49
|
+
/** Polled by the runner between rounds. */
|
|
50
|
+
requested(): boolean;
|
|
51
|
+
get signal(): StopSignal | null;
|
|
52
|
+
private onSignal;
|
|
53
|
+
}
|
|
54
|
+
export declare function nodeSignalSource(proc?: NodeJS.Process): SignalSource;
|
|
55
|
+
//# sourceMappingURL=signals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../src/signals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,eAAO,MAAM,YAAY,0CAA2C,CAAC;AACrE,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,sEAAsE;AACtE,MAAM,WAAW,YAAY;IAC3B,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAClD,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;CACpD;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,YAAY,CAAC;IACnB,0EAA0E;IAC1E,UAAU,CAAC,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IACtC,yEAAyE;IACzE,OAAO,CAAC,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;CACpC;AAED,qBAAa,aAAa;IAKZ,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAC9D,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,MAAM,CAAS;gBAEM,IAAI,EAAE,iBAAiB;IAEpD,OAAO,IAAI,IAAI;IAWf,SAAS,IAAI,IAAI;IAKjB,2CAA2C;IAC3C,SAAS,IAAI,OAAO;IAIpB,IAAI,MAAM,IAAI,UAAU,GAAG,IAAI,CAE9B;IAED,OAAO,CAAC,QAAQ;CAcjB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,MAAM,CAAC,OAAiB,GAAG,YAAY,CAK7E"}
|
package/dist/signals.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Signal handling (DESIGN §12 case 11): HUP, INT and TERM must end in
|
|
4
|
+
* `run.ended` with tallies and a notification, never in a silent death.
|
|
5
|
+
*
|
|
6
|
+
* Node's default disposition for all three is immediate exit — the ledger's
|
|
7
|
+
* last line stays `round.phase` forever and the phone hears nothing, which is
|
|
8
|
+
* exactly the quiet failure the notifier exists to prevent. So the watcher
|
|
9
|
+
* takes the signals over, and the runner polls `requested()` between rounds:
|
|
10
|
+
*
|
|
11
|
+
* 1st signal → graceful. The in-flight round finishes (same finish-the-round
|
|
12
|
+
* rule as a budget limit, §12 case 10), the runner stops with stopReason
|
|
13
|
+
* `signal`, emits `run.ended` with totals, and the caller notifies.
|
|
14
|
+
* 2nd signal → force, once. The escape hatch for a round that will not end.
|
|
15
|
+
* `onForce` is the caller's emergency path (best-effort run.ended + notify,
|
|
16
|
+
* then exit); it fires exactly once because that path sends a message, and
|
|
17
|
+
* an impatient thumb on Ctrl-C must not send two.
|
|
18
|
+
*
|
|
19
|
+
* On force the watcher also uninstalls itself, so a THIRD signal falls through
|
|
20
|
+
* to the default disposition and genuinely kills the process. Without this, a
|
|
21
|
+
* caller whose force path hangs leaves a process nothing short of SIGKILL can
|
|
22
|
+
* reach.
|
|
23
|
+
*
|
|
24
|
+
* Exiting is deliberately not done here: it must happen after the async
|
|
25
|
+
* run.ended append and notify, so it belongs to the caller. This module stays
|
|
26
|
+
* synchronous and injectable.
|
|
27
|
+
*/
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.SignalWatcher = exports.STOP_SIGNALS = void 0;
|
|
30
|
+
exports.nodeSignalSource = nodeSignalSource;
|
|
31
|
+
exports.STOP_SIGNALS = ['SIGHUP', 'SIGINT', 'SIGTERM'];
|
|
32
|
+
class SignalWatcher {
|
|
33
|
+
deps;
|
|
34
|
+
handlers = new Map();
|
|
35
|
+
received = null;
|
|
36
|
+
forced = false;
|
|
37
|
+
constructor(deps) {
|
|
38
|
+
this.deps = deps;
|
|
39
|
+
}
|
|
40
|
+
install() {
|
|
41
|
+
// Idempotent: a double install would register two handlers per signal, and
|
|
42
|
+
// one Ctrl-C would then count as both the graceful and the force press.
|
|
43
|
+
if (this.handlers.size > 0)
|
|
44
|
+
return;
|
|
45
|
+
for (const sig of exports.STOP_SIGNALS) {
|
|
46
|
+
const handler = () => this.onSignal(sig);
|
|
47
|
+
this.handlers.set(sig, handler);
|
|
48
|
+
this.deps.proc.on(sig, handler);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
uninstall() {
|
|
52
|
+
for (const [sig, handler] of this.handlers)
|
|
53
|
+
this.deps.proc.off(sig, handler);
|
|
54
|
+
this.handlers.clear();
|
|
55
|
+
}
|
|
56
|
+
/** Polled by the runner between rounds. */
|
|
57
|
+
requested() {
|
|
58
|
+
return this.received !== null;
|
|
59
|
+
}
|
|
60
|
+
get signal() {
|
|
61
|
+
return this.received;
|
|
62
|
+
}
|
|
63
|
+
onSignal(sig) {
|
|
64
|
+
if (this.received === null) {
|
|
65
|
+
this.received = sig;
|
|
66
|
+
this.deps.onGraceful?.(sig);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (!this.forced) {
|
|
70
|
+
this.forced = true;
|
|
71
|
+
// Re-arm the default disposition BEFORE the force path runs: from here on
|
|
72
|
+
// the next signal must kill, no matter what onForce does or fails to do.
|
|
73
|
+
this.uninstall();
|
|
74
|
+
this.deps.onForce?.(sig);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.SignalWatcher = SignalWatcher;
|
|
79
|
+
function nodeSignalSource(proc = process) {
|
|
80
|
+
return {
|
|
81
|
+
on: (sig, handler) => void proc.on(sig, handler),
|
|
82
|
+
off: (sig, handler) => void proc.removeListener(sig, handler),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=signals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signals.js","sourceRoot":"","sources":["../src/signals.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;;;AAmEH,4CAKC;AAtEY,QAAA,YAAY,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAU,CAAC;AAiBrE,MAAa,aAAa;IAKK;IAJZ,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;IACtD,QAAQ,GAAsB,IAAI,CAAC;IACnC,MAAM,GAAG,KAAK,CAAC;IAEvB,YAA6B,IAAuB;QAAvB,SAAI,GAAJ,IAAI,CAAmB;IAAG,CAAC;IAExD,OAAO;QACL,2EAA2E;QAC3E,wEAAwE;QACxE,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC;YAAE,OAAO;QACnC,KAAK,MAAM,GAAG,IAAI,oBAAY,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,GAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC/C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,SAAS;QACP,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC7E,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,2CAA2C;IAC3C,SAAS;QACP,OAAO,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC;IAChC,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAEO,QAAQ,CAAC,GAAe;QAC9B,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,0EAA0E;YAC1E,yEAAyE;YACzE,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;CACF;AA9CD,sCA8CC;AAED,SAAgB,gBAAgB,CAAC,OAAuB,OAAO;IAC7D,OAAO;QACL,EAAE,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC;QAChD,GAAG,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC;KAC9D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { type Attestation, type Classification, type CoverageKind, type Disposition, type RequirementCoverage, type ProjectIndexSnapshot, type Source, type SourceKind, type SourceStatement } from '@looply/core';
|
|
2
|
+
import { type PdfTextResult } from './pdf-text';
|
|
3
|
+
import { type VerdictDeps } from './source-verdict';
|
|
4
|
+
/**
|
|
5
|
+
* `looply source` — hand a document to the project from the machine that holds it.
|
|
6
|
+
*
|
|
7
|
+
* ─────────────────────────────────────────────────────────────────────────────
|
|
8
|
+
* WHY THIS IS A CLI VERB AND NOT A PHONE SCREEN
|
|
9
|
+
*
|
|
10
|
+
* A plan lives beside the repository, on the developer's disk. Handing it over
|
|
11
|
+
* is a file operation, and the machine that holds the file is the natural
|
|
12
|
+
* caller — the same reason project creation is a machine act. The phone reads
|
|
13
|
+
* what was handed over; it does not type documents.
|
|
14
|
+
*
|
|
15
|
+
* ⚠️ LOCAL REFUSALS COME FIRST. The kind is decided from the extension, the
|
|
16
|
+
* file is read, and the same `whyUnreadable` and size bound the server applies
|
|
17
|
+
* are applied HERE, before pairing is even looked at — so a person gets the
|
|
18
|
+
* real answer ("no text layer", "this file has a NUL byte") without a network
|
|
19
|
+
* round trip, and an unpaired machine is told to pair only when the document
|
|
20
|
+
* itself was fine.
|
|
21
|
+
*
|
|
22
|
+
* A PDF is read HERE, on the machine that holds it (`pdf-text.ts`): its text
|
|
23
|
+
* layer goes to the server page by page, and the file's own sha256 travels
|
|
24
|
+
* beside it as provenance. A scanned PDF — no text layer — is refused with
|
|
25
|
+
* the reason, never sent as an empty document.
|
|
26
|
+
*
|
|
27
|
+
* 🔴 THE CONTENT IS DATA. Nothing in this file interprets the document. The
|
|
28
|
+
* text goes to the server verbatim; the server derives the statements with the
|
|
29
|
+
* same extractor the fixture tests hold to account.
|
|
30
|
+
*
|
|
31
|
+
* `clientRef` is derived from the content's sha256, so running the command
|
|
32
|
+
* twice on the same file is the same request twice — the server answers with
|
|
33
|
+
* the source it already has and this prints "already stored".
|
|
34
|
+
*
|
|
35
|
+
* `looply source reconcile <id>` measures where each requirement stands against
|
|
36
|
+
* THIS repository: the project index of HEAD's tree (the same one a run
|
|
37
|
+
* builds) is read here, `@looply/core`'s reconciler decides — absent, a
|
|
38
|
+
* candidate place to look, conflicting, or blocked — and the result is handed
|
|
39
|
+
* over keyed by the tree. Nothing here, on the machine or on the server, says
|
|
40
|
+
* "implemented": that is a person's attestation with evidence, a later verb.
|
|
41
|
+
*/
|
|
42
|
+
export declare const SOURCE_USAGE = "usage:\n looply source add <file> [--name <name>] hand a Markdown (.md), plain-text (.txt) or PDF (.pdf, with a text layer) document to this project\n looply source list what this project has been given\n looply source show <id> one source: its statements, what each one IS, where it came from, and where each requirement stands\n looply source reconcile <id> measure where each requirement stands against this repository (HEAD's tree), and record it\n looply source coverage <id> which requirements no goal serves, which are served, and which a person evidenced\n looply source plan <id> [--dry-run] propose goals from this document\u2019s requirements, grouped by its headings, and set them\n looply source verdict <id> the final verdict on the integrated tree: COMPLETE, or every unmet requirement\n";
|
|
43
|
+
/** Exit codes, in the sysexits tradition the rest of the CLI follows for 64. */
|
|
44
|
+
export declare const EXIT: {
|
|
45
|
+
readonly ok: 0;
|
|
46
|
+
readonly refused: 1;
|
|
47
|
+
readonly usage: 64;
|
|
48
|
+
readonly unreadable: 65;
|
|
49
|
+
readonly noInput: 66;
|
|
50
|
+
readonly unavailable: 69;
|
|
51
|
+
};
|
|
52
|
+
export type Identity = {
|
|
53
|
+
kind: 'unpaired';
|
|
54
|
+
} | {
|
|
55
|
+
kind: 'unregistered';
|
|
56
|
+
} | {
|
|
57
|
+
kind: 'ok';
|
|
58
|
+
serverUrl: string;
|
|
59
|
+
token: string;
|
|
60
|
+
projectId: string;
|
|
61
|
+
};
|
|
62
|
+
export interface SourceClient {
|
|
63
|
+
createSource(projectId: string, input: {
|
|
64
|
+
clientRef: string;
|
|
65
|
+
name: string;
|
|
66
|
+
kind: SourceKind;
|
|
67
|
+
content?: string;
|
|
68
|
+
pages?: {
|
|
69
|
+
page: number;
|
|
70
|
+
text: string;
|
|
71
|
+
}[];
|
|
72
|
+
originSha256?: string;
|
|
73
|
+
}): Promise<{
|
|
74
|
+
source: Source;
|
|
75
|
+
statements: SourceStatement[];
|
|
76
|
+
deduplicated: boolean;
|
|
77
|
+
}>;
|
|
78
|
+
sources(projectId: string): Promise<{
|
|
79
|
+
sources: Omit<Source, 'content'>[];
|
|
80
|
+
}>;
|
|
81
|
+
sourceDetail(projectId: string, sourceId: string): Promise<SourceDetail>;
|
|
82
|
+
reconcileSource(projectId: string, sourceId: string, input: {
|
|
83
|
+
treeSha: string;
|
|
84
|
+
reconcilerVersion: number;
|
|
85
|
+
dispositions: Disposition[];
|
|
86
|
+
}): Promise<{
|
|
87
|
+
dispositions: Disposition[];
|
|
88
|
+
treeSha: string;
|
|
89
|
+
reconcilerVersion: number;
|
|
90
|
+
created: boolean;
|
|
91
|
+
}>;
|
|
92
|
+
coverage(projectId: string, sourceId: string): Promise<SourceCoverage>;
|
|
93
|
+
createGoal(projectId: string, input: {
|
|
94
|
+
clientRef: string;
|
|
95
|
+
text: string;
|
|
96
|
+
dependsOn?: readonly string[];
|
|
97
|
+
surfaces?: readonly string[];
|
|
98
|
+
requirements?: readonly {
|
|
99
|
+
sourceId: string;
|
|
100
|
+
ordinal: number;
|
|
101
|
+
}[];
|
|
102
|
+
}): Promise<{
|
|
103
|
+
goal: {
|
|
104
|
+
id: string;
|
|
105
|
+
};
|
|
106
|
+
deduplicated: boolean;
|
|
107
|
+
}>;
|
|
108
|
+
}
|
|
109
|
+
/** What is covered and by whom, as the server answers it. */
|
|
110
|
+
export interface SourceCoverage {
|
|
111
|
+
sourceId: string;
|
|
112
|
+
name: string;
|
|
113
|
+
reconciledAt: {
|
|
114
|
+
treeSha: string;
|
|
115
|
+
reconcilerVersion: number;
|
|
116
|
+
createdAt: string;
|
|
117
|
+
} | null;
|
|
118
|
+
requirements: RequirementCoverage[];
|
|
119
|
+
tally: Record<CoverageKind, number>;
|
|
120
|
+
}
|
|
121
|
+
/** What the server answers for one source. */
|
|
122
|
+
export interface SourceDetail {
|
|
123
|
+
source: Source;
|
|
124
|
+
statements: SourceStatement[];
|
|
125
|
+
classifications: Classification[];
|
|
126
|
+
classifierVersion: number | null;
|
|
127
|
+
dispositions: Disposition[];
|
|
128
|
+
reconciledAt: {
|
|
129
|
+
treeSha: string;
|
|
130
|
+
reconcilerVersion: number;
|
|
131
|
+
createdAt: string;
|
|
132
|
+
} | null;
|
|
133
|
+
/** What people attested — the latest per statement. Read here; never written from the machine. */
|
|
134
|
+
attestations: Attestation[];
|
|
135
|
+
}
|
|
136
|
+
/** HEAD's tree and its project index, as the machine that holds the repository can produce them. */
|
|
137
|
+
export type IndexAtHead = {
|
|
138
|
+
ok: true;
|
|
139
|
+
treeSha: string;
|
|
140
|
+
snapshot: ProjectIndexSnapshot;
|
|
141
|
+
cached: boolean;
|
|
142
|
+
} | {
|
|
143
|
+
ok: false;
|
|
144
|
+
because: string;
|
|
145
|
+
};
|
|
146
|
+
export interface SourceCmdDeps {
|
|
147
|
+
cwd: () => string;
|
|
148
|
+
/** Reads a file as UTF-8; throws when it cannot. */
|
|
149
|
+
readFile: (absolutePath: string) => string;
|
|
150
|
+
/** Reads a file's bytes; throws when it cannot. */
|
|
151
|
+
readBytes: (absolutePath: string) => Uint8Array;
|
|
152
|
+
/** The PDF reader (a child process in production; a fake in tests). */
|
|
153
|
+
pdfPages: (bytes: Uint8Array) => Promise<PdfTextResult>;
|
|
154
|
+
identity: () => Identity;
|
|
155
|
+
/** The repository's index at HEAD (built or cached, as a run does it), or why there is none. */
|
|
156
|
+
index: (cwd: string) => Promise<IndexAtHead>;
|
|
157
|
+
client: (serverUrl: string, token: string) => SourceClient;
|
|
158
|
+
out: (line: string) => void;
|
|
159
|
+
err: (line: string) => void;
|
|
160
|
+
/** F32: the integration lane, git and the server, for the final verdict. Absent: this build cannot judge. */
|
|
161
|
+
verdict?: (cwd: string, who: {
|
|
162
|
+
readonly serverUrl: string;
|
|
163
|
+
readonly token: string;
|
|
164
|
+
readonly projectId: string;
|
|
165
|
+
}) => VerdictDeps;
|
|
166
|
+
}
|
|
167
|
+
/** Which kind a file is, decided from its extension alone — and by name what it is not. */
|
|
168
|
+
export declare function kindForFile(path: string): {
|
|
169
|
+
ok: true;
|
|
170
|
+
kind: SourceKind;
|
|
171
|
+
} | {
|
|
172
|
+
ok: false;
|
|
173
|
+
because: string;
|
|
174
|
+
};
|
|
175
|
+
/** The idempotency key for a document: its own bytes. */
|
|
176
|
+
export declare function clientRefFor(sha256: string): string;
|
|
177
|
+
export declare function sourceCommand(argv: string[], deps: SourceCmdDeps): Promise<number>;
|
|
178
|
+
/** Where a statement is, in the reader's own terms: `p2 L4-5` for a pdf, `L7` otherwise. */
|
|
179
|
+
export declare function anchorLabel(s: SourceStatement): string;
|
|
180
|
+
/** Where a requirement stands, on one line under it: what was found, or why nothing could be said. */
|
|
181
|
+
export declare function dispositionLabel(d: Disposition): string;
|
|
182
|
+
/** A person's word, on one line: what they said, who, at which tree, and the first place they pointed at. */
|
|
183
|
+
export declare function attestationLabel(a: Attestation, earlierTree: boolean): string;
|
|
184
|
+
/**
|
|
185
|
+
* One source, as a person reads it: requirements first (what is forbidden
|
|
186
|
+
* marked as such), then constraints, questions, exclusions (which need
|
|
187
|
+
* authority), duplicates pointing at their first occurrence, and how much is
|
|
188
|
+
* context. Every line carries its anchor so the document can be opened to it;
|
|
189
|
+
* every requirement and constraint carries where it stands against the
|
|
190
|
+
* repository, when that was measured.
|
|
191
|
+
*/
|
|
192
|
+
export declare function renderSource(detail: SourceDetail): string[];
|
|
193
|
+
/**
|
|
194
|
+
* What is covered and by whom, as a person reads it: what NOBODY serves first,
|
|
195
|
+
* then what is served but not yet evidenced, then partial, then evidenced —
|
|
196
|
+
* each with its anchor and the goals that name it. Nothing here counts a
|
|
197
|
+
* finished queue as coverage.
|
|
198
|
+
*/
|
|
199
|
+
export declare function renderCoverage(c: SourceCoverage): string[];
|
|
200
|
+
export declare function nodeSourceDeps(): SourceCmdDeps;
|
|
201
|
+
//# sourceMappingURL=source-cmd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-cmd.d.ts","sourceRoot":"","sources":["../src/source-cmd.ts"],"names":[],"mappings":"AAGA,OAAO,EAOL,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,MAAM,EACX,KAAK,UAAU,EACf,KAAK,eAAe,EAIrB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAEjE,OAAO,EAAiD,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEnG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,eAAO,MAAM,YAAY,+4BAQxB,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,IAAI;;;;;;;CAOP,CAAC;AAEX,MAAM,MAAM,QAAQ,GAChB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAExE,MAAM,WAAW,YAAY;IAC3B,YAAY,CACV,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE;QACL,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,UAAU,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QACzC,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GACA,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,eAAe,EAAE,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACrF,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAA;KAAE,CAAC,CAAC;IAC5E,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACzE,eAAe,CACb,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,WAAW,EAAE,CAAA;KAAE,GACjF,OAAO,CAAC;QAAE,YAAY,EAAE,WAAW,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC1G,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACvE,UAAU,CACR,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE;QACL,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAC9B,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAC7B,YAAY,CAAC,EAAE,SAAS;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KACjE,GACA,OAAO,CAAC;QAAE,IAAI,EAAE;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC7D;AAED,6DAA6D;AAC7D,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACvF,YAAY,EAAE,mBAAmB,EAAE,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,8CAA8C;AAC9C,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,YAAY,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACvF,kGAAkG;IAClG,YAAY,EAAE,WAAW,EAAE,CAAC;CAC7B;AAED,oGAAoG;AACpG,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,oBAAoB,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAC9E;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnC,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,oDAAoD;IACpD,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3C,mDAAmD;IACnD,SAAS,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,UAAU,CAAC;IAChD,uEAAuE;IACvE,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IACxD,QAAQ,EAAE,MAAM,QAAQ,CAAC;IACzB,gGAAgG;IAChG,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,YAAY,CAAC;IAC3D,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,6GAA6G;IAC7G,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,WAAW,CAAC;CACjI;AAED,2FAA2F;AAC3F,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAOzG;AAED,yDAAyD;AACzD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAWxF;AAyID,4FAA4F;AAC5F,wBAAgB,WAAW,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM,CAGtD;AAOD,sGAAsG;AACtG,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAyBvD;AAED,6GAA6G;AAC7G,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,GAAG,MAAM,CAM7E;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE,CA4E3D;AAuFD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,cAAc,GAAG,MAAM,EAAE,CA0C1D;AAsKD,wBAAgB,cAAc,IAAI,aAAa,CA2B9C"}
|