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,182 @@
|
|
|
1
|
+
import type { CommandResult } from './gate';
|
|
2
|
+
import type { OwnedChildren } from './owned-children';
|
|
3
|
+
import type { Effort, RoleModels } from './model-routing';
|
|
4
|
+
/**
|
|
5
|
+
* How looply starts a coding agent.
|
|
6
|
+
*
|
|
7
|
+
* **The prompt never touches the command line.** It is written to the agent's
|
|
8
|
+
* stdin and stdin is closed; the command line carries flags only. That is the
|
|
9
|
+
* whole point of this module, and it is not a stylistic preference:
|
|
10
|
+
*
|
|
11
|
+
* - Prompts are multi-line. `spawn(cmd, { shell: true })` on Windows runs
|
|
12
|
+
* `cmd.exe /d /s /c "<cmd>"`, and cmd.exe ends the command at the first
|
|
13
|
+
* newline. Every looply agent call made before this module existed delivered
|
|
14
|
+
* only the first line of its prompt — `["-p", "You are one round of looply."]`
|
|
15
|
+
* — and dropped every flag after it. The agent, handed a sentence fragment
|
|
16
|
+
* and no contract, answered in prose or asked what it was for. That is the
|
|
17
|
+
* sole reason `looply run` had never completed a round and `scan` never
|
|
18
|
+
* produced findings.
|
|
19
|
+
* - POSIX escaping is not escaping on cmd.exe: an escaped quote or dollar sign
|
|
20
|
+
* arrives as a literal backslash, so even a one-line prompt was corrupted.
|
|
21
|
+
* - cmd.exe caps a command line at 8191 characters. The prover prompt embeds a
|
|
22
|
+
* whole diff, so it would have blown that ceiling as soon as a round changed
|
|
23
|
+
* anything substantial.
|
|
24
|
+
*
|
|
25
|
+
* Sending the prompt down stdin removes all three at once, on every platform,
|
|
26
|
+
* with no quoting layer to get wrong. The command line is built from config the
|
|
27
|
+
* user wrote and carries no round data at all, so there is nothing left to
|
|
28
|
+
* inject into.
|
|
29
|
+
*
|
|
30
|
+
* The agent is still started through a shell, because on Windows the CLI is
|
|
31
|
+
* `claude.cmd` — a batch shim Node has refused to spawn directly since 20.12.
|
|
32
|
+
* That stays safe here precisely because the command line holds no prompt.
|
|
33
|
+
*/
|
|
34
|
+
/** The seam the prover and verifier already declared: a prompt, not a command. */
|
|
35
|
+
export type AgentInvoke = (prompt: string, timeoutMs: number) => Promise<CommandResult>;
|
|
36
|
+
/** The slice of a child process this needs; callbacks may fire in any order. */
|
|
37
|
+
export interface AgentSpawnHandle {
|
|
38
|
+
pid: number | undefined;
|
|
39
|
+
onExit(cb: (code: number | null) => void): void;
|
|
40
|
+
onError(cb: (err: Error) => void): void;
|
|
41
|
+
/** Interleaved stdout + stderr, already decoded. */
|
|
42
|
+
onOutput(cb: (chunk: string) => void): void;
|
|
43
|
+
/**
|
|
44
|
+
* Write the prompt and close stdin. Must never throw: an agent that exits
|
|
45
|
+
* before reading its prompt makes this EPIPE, and that is a failed round to
|
|
46
|
+
* report, not a crash of the runner (DESIGN section 12 case 6).
|
|
47
|
+
*/
|
|
48
|
+
writePrompt(text: string): void;
|
|
49
|
+
}
|
|
50
|
+
export interface AgentExecDeps {
|
|
51
|
+
spawn(cmd: string): AgentSpawnHandle;
|
|
52
|
+
/** Must take down `pid` and every descendant, not just `pid`. */
|
|
53
|
+
killTree(pid: number): void;
|
|
54
|
+
now(): number;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Build an {@link AgentInvoke} over a fixed command line.
|
|
58
|
+
*
|
|
59
|
+
* Settlement rules match the gate's command runner deliberately — first outcome
|
|
60
|
+
* wins, and a timeout kills the tree then resolves immediately rather than
|
|
61
|
+
* waiting for an exit that may never come — so a hung agent and a hung test
|
|
62
|
+
* behave the same way and there is one story to reason about.
|
|
63
|
+
*/
|
|
64
|
+
export declare function makeAgentRunner(deps: AgentExecDeps, command: string,
|
|
65
|
+
/**
|
|
66
|
+
* Where to register the spawned process while it runs.
|
|
67
|
+
*
|
|
68
|
+
* Optional so every existing caller and test is unaffected. Given one, the
|
|
69
|
+
* run can stop its agent on the way out instead of leaving it editing the
|
|
70
|
+
* repository with no parent — measured: a hard-killed runner leaves the leaf
|
|
71
|
+
* process alive and still writing.
|
|
72
|
+
*/
|
|
73
|
+
owned?: OwnedChildren): AgentInvoke;
|
|
74
|
+
export declare function nodeAgentSpawn(cmd: string): AgentSpawnHandle;
|
|
75
|
+
/**
|
|
76
|
+
* The agent command, as configured.
|
|
77
|
+
*
|
|
78
|
+
* `command` is the invocation minus the output format, which each caller picks:
|
|
79
|
+
* the implementer, prover and verifier want the plain transcript, while `scan`
|
|
80
|
+
* reads the structured envelope. Neither ever appends anything derived from the
|
|
81
|
+
* repository, so the line stays free of round data.
|
|
82
|
+
*/
|
|
83
|
+
export interface AgentSpec {
|
|
84
|
+
command: string;
|
|
85
|
+
outputFormatFlag: string;
|
|
86
|
+
/**
|
|
87
|
+
* Which model each role runs, for the BUILT-IN provider — `--model` on the
|
|
88
|
+
* mediated invocation. `default` covers every role not named; `brain` is the
|
|
89
|
+
* one a project usually names separately. Absent means the provider's own
|
|
90
|
+
* default, which is what every project got before this existed.
|
|
91
|
+
*
|
|
92
|
+
* ⚠️ IGNORED for a configured `agent.command`, like `executable` below: looply
|
|
93
|
+
* cannot guess the flag somebody else's binary takes for a model, and a flag
|
|
94
|
+
* that silently does nothing reads exactly like one that works.
|
|
95
|
+
*
|
|
96
|
+
* A Fable model may be named for `brain` only; `parseConfig` refuses anything
|
|
97
|
+
* else, and `model-routing.ts` says why.
|
|
98
|
+
*/
|
|
99
|
+
models?: RoleModels;
|
|
100
|
+
/** `--effort` on every built-in turn. Absent leaves it to the provider. */
|
|
101
|
+
effort?: Effort;
|
|
102
|
+
/**
|
|
103
|
+
* An ABSOLUTE path to the built-in provider's executable, when it is not
|
|
104
|
+
* where `claudePackageDir` looks.
|
|
105
|
+
*
|
|
106
|
+
* 🔴 IT SELECTS A BINARY, NOT A MEDIATION. This exists so a Claude Code
|
|
107
|
+
* installed somewhere other than `node_modules/@anthropic-ai/claude-code`
|
|
108
|
+
* still goes through the MEDIATED path — the one that passes `--tools ""`,
|
|
109
|
+
* `--strict-mcp-config` and an `--allowedTools` list naming only Looply's
|
|
110
|
+
* bridge. The alternative was to configure it as a generic `agent.command`,
|
|
111
|
+
* which takes the configured branch: that appends the declared suppression
|
|
112
|
+
* arguments but wires no MCP bridge at all, so the model would end up with
|
|
113
|
+
* NO tools rather than only Looply's. A weaker configuration for a provider
|
|
114
|
+
* Looply has a purpose-built adapter for is the wrong trade.
|
|
115
|
+
*
|
|
116
|
+
* ⚠️ IGNORED unless `command` is the default. Writing an `agent.command`
|
|
117
|
+
* means "drive this as an unknown binary", and this must not quietly
|
|
118
|
+
* re-route that back through Claude's flags.
|
|
119
|
+
*/
|
|
120
|
+
executable?: string;
|
|
121
|
+
/**
|
|
122
|
+
* Directories the contained agent may read and execute from.
|
|
123
|
+
*
|
|
124
|
+
* A provider runtime usually lives OUTSIDE the repository, which is right —
|
|
125
|
+
* it is machine material, not model-editable source. A contained process can
|
|
126
|
+
* only run what it was granted, so it has to be told where that is, and told
|
|
127
|
+
* EXPLICITLY: parsing the command line to guess would put a heuristic between
|
|
128
|
+
* a config string and a filesystem permission.
|
|
129
|
+
*
|
|
130
|
+
* The built-in provider needs none of this; it resolves its own package.
|
|
131
|
+
*/
|
|
132
|
+
runtime?: readonly string[];
|
|
133
|
+
/**
|
|
134
|
+
* Environment variables to forward into the contained agent, BY NAME.
|
|
135
|
+
*
|
|
136
|
+
* A contained agent inherits nothing, which is the point — but a configured
|
|
137
|
+
* provider may genuinely need something from the environment: an API base
|
|
138
|
+
* URL, a model name, a provider key. Naming them is a deliberate act by a
|
|
139
|
+
* person, in a file the model cannot write, and it forwards the VALUE the
|
|
140
|
+
* daemon holds rather than putting a secret in the config.
|
|
141
|
+
*
|
|
142
|
+
* Nothing is forwarded unless it is named here. "The agent does not
|
|
143
|
+
* automatically inherit the daemon's environment" stays true; this is the
|
|
144
|
+
* word "automatically" doing its work.
|
|
145
|
+
*/
|
|
146
|
+
env?: readonly string[];
|
|
147
|
+
/**
|
|
148
|
+
* HOW THIS PROVIDER IS STOPPED FROM USING ITS OWN TOOLS.
|
|
149
|
+
*
|
|
150
|
+
* 🔴 THE DEFAULT PROVIDER GETS `allowedToolArgs`; A CONFIGURED ONE GOT
|
|
151
|
+
* NOTHING. "The model gets no host tools" was delivered by Claude flags on
|
|
152
|
+
* one branch and by nothing at all on the other — so a configured provider
|
|
153
|
+
* launched through `cmd.exe` with its own file, shell and network tools fully
|
|
154
|
+
* enabled, beside a daemon holding a machine token.
|
|
155
|
+
*
|
|
156
|
+
* ⚠️ AND IT CANNOT BE FIXED BY INVENTING FLAGS. Looply does not know what
|
|
157
|
+
* argument turns an unknown binary's tools off, and guessing would be worse
|
|
158
|
+
* than the gap: a flag that silently does nothing reads exactly like one that
|
|
159
|
+
* works. So the person states it, in a file the model cannot write, and a
|
|
160
|
+
* provider that states nothing is REFUSED rather than launched unmediated.
|
|
161
|
+
*
|
|
162
|
+
* The built-in provider needs none of this; it has its own branch.
|
|
163
|
+
*/
|
|
164
|
+
noHostTools?: readonly string[];
|
|
165
|
+
/**
|
|
166
|
+
* WHICH `agent.*` KEYS THE CONFIG FILE ACTUALLY CONTAINED.
|
|
167
|
+
*
|
|
168
|
+
* Set by `parseConfig` and read by `resolveProvider`, which needs to tell
|
|
169
|
+
* "the person wrote this" from "the parser defaulted it". Optional, so every
|
|
170
|
+
* hand-built spec in this tree and in every test keeps working — an absent
|
|
171
|
+
* list means "nothing is known to be explicit", which is the direction that
|
|
172
|
+
* lets a preset supply its own facts.
|
|
173
|
+
*/
|
|
174
|
+
declared?: readonly string[];
|
|
175
|
+
}
|
|
176
|
+
export declare const DEFAULT_AGENT: AgentSpec;
|
|
177
|
+
export declare function agentCommandLine(spec: AgentSpec, format: 'text' | 'json'): string;
|
|
178
|
+
/** Text transcript: the implementer, the prover and the verifier. */
|
|
179
|
+
export declare function nodeAgentRunner(spec?: AgentSpec, owned?: OwnedChildren): AgentInvoke;
|
|
180
|
+
/** Structured envelope: `scan`, which reads `result` off the JSON. */
|
|
181
|
+
export declare function nodeAgentJsonRunner(spec?: AgentSpec): AgentInvoke;
|
|
182
|
+
//# sourceMappingURL=agent-exec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-exec.d.ts","sourceRoot":"","sources":["../src/agent-exec.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,kFAAkF;AAClF,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;AAExF,gFAAgF;AAChF,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;IAChD,OAAO,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;IACxC,oDAAoD;IACpD,QAAQ,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAC5C;;;;OAIG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACrC,iEAAiE;IACjE,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,GAAG,IAAI,MAAM,CAAC;CACf;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,MAAM;AACf;;;;;;;GAOG;AACH,KAAK,CAAC,EAAE,aAAa,GACpB,WAAW,CA+Cb;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CA8B5D;AAQD;;;;;;;GAOG;AACH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;;;;;;;;;;;;OAiBG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B;;;;;;;;;;;;OAYG;IACH,GAAG,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB;;;;;;;;;;;;;;;;OAgBG;IACH,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B;AAED,eAAO,MAAM,aAAa,EAAE,SAG3B,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAEjF;AAED,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,IAAI,GAAE,SAAyB,EAAE,KAAK,CAAC,EAAE,aAAa,GAAG,WAAW,CAEnG;AAED,sEAAsE;AACtE,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,SAAyB,GAAG,WAAW,CAEhF"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_AGENT = void 0;
|
|
4
|
+
exports.makeAgentRunner = makeAgentRunner;
|
|
5
|
+
exports.nodeAgentSpawn = nodeAgentSpawn;
|
|
6
|
+
exports.agentCommandLine = agentCommandLine;
|
|
7
|
+
exports.nodeAgentRunner = nodeAgentRunner;
|
|
8
|
+
exports.nodeAgentJsonRunner = nodeAgentJsonRunner;
|
|
9
|
+
const node_child_process_1 = require("node:child_process");
|
|
10
|
+
const command_runner_1 = require("./command-runner");
|
|
11
|
+
/**
|
|
12
|
+
* Build an {@link AgentInvoke} over a fixed command line.
|
|
13
|
+
*
|
|
14
|
+
* Settlement rules match the gate's command runner deliberately — first outcome
|
|
15
|
+
* wins, and a timeout kills the tree then resolves immediately rather than
|
|
16
|
+
* waiting for an exit that may never come — so a hung agent and a hung test
|
|
17
|
+
* behave the same way and there is one story to reason about.
|
|
18
|
+
*/
|
|
19
|
+
function makeAgentRunner(deps, command,
|
|
20
|
+
/**
|
|
21
|
+
* Where to register the spawned process while it runs.
|
|
22
|
+
*
|
|
23
|
+
* Optional so every existing caller and test is unaffected. Given one, the
|
|
24
|
+
* run can stop its agent on the way out instead of leaving it editing the
|
|
25
|
+
* repository with no parent — measured: a hard-killed runner leaves the leaf
|
|
26
|
+
* process alive and still writing.
|
|
27
|
+
*/
|
|
28
|
+
owned) {
|
|
29
|
+
return (prompt, timeoutMs) => new Promise((resolve) => {
|
|
30
|
+
const started = deps.now();
|
|
31
|
+
const chunks = [];
|
|
32
|
+
let settled = false;
|
|
33
|
+
let timer;
|
|
34
|
+
let release;
|
|
35
|
+
const finish = (ok, timedOut) => {
|
|
36
|
+
if (settled)
|
|
37
|
+
return;
|
|
38
|
+
settled = true;
|
|
39
|
+
if (timer !== undefined)
|
|
40
|
+
clearTimeout(timer);
|
|
41
|
+
// Given back the moment it settles, so a finished agent is not killed
|
|
42
|
+
// later by a shutdown that thinks it is still running.
|
|
43
|
+
release?.();
|
|
44
|
+
resolve({ ok, timedOut, ms: deps.now() - started, output: chunks.join('') });
|
|
45
|
+
};
|
|
46
|
+
const handle = deps.spawn(command);
|
|
47
|
+
if (owned && handle.pid !== undefined) {
|
|
48
|
+
const pid = handle.pid;
|
|
49
|
+
release = owned.adopt({
|
|
50
|
+
pid,
|
|
51
|
+
label: 'coding agent',
|
|
52
|
+
kill: () => deps.killTree(pid),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
handle.onOutput((c) => chunks.push(c));
|
|
56
|
+
handle.onError((err) => {
|
|
57
|
+
// Kept in the output so "the agent is not installed" reads differently
|
|
58
|
+
// in the round log from "the agent disagreed".
|
|
59
|
+
chunks.push(err.message);
|
|
60
|
+
finish(false, false);
|
|
61
|
+
});
|
|
62
|
+
handle.onExit((code) => finish(code === 0, false));
|
|
63
|
+
timer = setTimeout(() => {
|
|
64
|
+
if (settled)
|
|
65
|
+
return;
|
|
66
|
+
if (handle.pid !== undefined)
|
|
67
|
+
deps.killTree(handle.pid);
|
|
68
|
+
finish(false, true);
|
|
69
|
+
}, timeoutMs);
|
|
70
|
+
// After the listeners are attached, so a synchronous EPIPE is reported
|
|
71
|
+
// through onError rather than thrown out of the promise constructor.
|
|
72
|
+
handle.writePrompt(prompt);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
function nodeAgentSpawn(cmd) {
|
|
76
|
+
const child = (0, node_child_process_1.spawn)(cmd, {
|
|
77
|
+
shell: true,
|
|
78
|
+
detached: process.platform !== 'win32',
|
|
79
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
80
|
+
});
|
|
81
|
+
const errCbs = [];
|
|
82
|
+
child.on('error', (e) => errCbs.forEach((cb) => cb(e)));
|
|
83
|
+
// A child that exits before reading its prompt raises EPIPE on the stream
|
|
84
|
+
// rather than at the write call, so the stream needs a listener of its own or
|
|
85
|
+
// Node treats it as unhandled and takes the whole run down with it.
|
|
86
|
+
child.stdin?.on('error', (e) => errCbs.forEach((cb) => cb(e)));
|
|
87
|
+
return {
|
|
88
|
+
pid: child.pid,
|
|
89
|
+
onExit: (cb) => child.on('exit', (code) => cb(code)),
|
|
90
|
+
onError: (cb) => errCbs.push(cb),
|
|
91
|
+
onOutput: (cb) => {
|
|
92
|
+
child.stdout?.on('data', (d) => cb(d.toString('utf8')));
|
|
93
|
+
child.stderr?.on('data', (d) => cb(d.toString('utf8')));
|
|
94
|
+
},
|
|
95
|
+
writePrompt: (text) => {
|
|
96
|
+
try {
|
|
97
|
+
child.stdin?.end(text);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// Already reported through the stream's own error listener above.
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
const nodeDeps = {
|
|
106
|
+
spawn: nodeAgentSpawn,
|
|
107
|
+
killTree: command_runner_1.nodeKillTree,
|
|
108
|
+
now: () => Date.now(),
|
|
109
|
+
};
|
|
110
|
+
exports.DEFAULT_AGENT = {
|
|
111
|
+
command: 'claude -p --dangerously-skip-permissions',
|
|
112
|
+
outputFormatFlag: '--output-format',
|
|
113
|
+
};
|
|
114
|
+
function agentCommandLine(spec, format) {
|
|
115
|
+
return spec.outputFormatFlag ? `${spec.command} ${spec.outputFormatFlag} ${format}` : spec.command;
|
|
116
|
+
}
|
|
117
|
+
/** Text transcript: the implementer, the prover and the verifier. */
|
|
118
|
+
function nodeAgentRunner(spec = exports.DEFAULT_AGENT, owned) {
|
|
119
|
+
return makeAgentRunner(nodeDeps, agentCommandLine(spec, 'text'), owned);
|
|
120
|
+
}
|
|
121
|
+
/** Structured envelope: `scan`, which reads `result` off the JSON. */
|
|
122
|
+
function nodeAgentJsonRunner(spec = exports.DEFAULT_AGENT) {
|
|
123
|
+
return makeAgentRunner(nodeDeps, agentCommandLine(spec, 'json'));
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=agent-exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-exec.js","sourceRoot":"","sources":["../src/agent-exec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Why this path may not be granted to untrusted execution, or null if it may.
|
|
3
|
+
*
|
|
4
|
+
* Compared as resolved paths rather than as strings: `C:\Users\x\..\x` is the
|
|
5
|
+
* same directory as `C:\Users\x`, and a check that could not see that would be
|
|
6
|
+
* a check somebody routes around by accident.
|
|
7
|
+
*/
|
|
8
|
+
export declare function unsafeRuntimeGrant(path: string, home?: string, projectDir?: string): string | null;
|
|
9
|
+
/**
|
|
10
|
+
* Validate every declared runtime path, or say which one is wrong.
|
|
11
|
+
*
|
|
12
|
+
* Fails closed on the whole list: a configuration with one unsafe entry is a
|
|
13
|
+
* configuration nobody has checked, and running with the rest of it would be
|
|
14
|
+
* obeying half of what was written.
|
|
15
|
+
*/
|
|
16
|
+
export declare function checkRuntimeGrants(paths: readonly string[], home?: string, projectDir?: string): {
|
|
17
|
+
ok: true;
|
|
18
|
+
paths: string[];
|
|
19
|
+
} | {
|
|
20
|
+
ok: false;
|
|
21
|
+
because: string;
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=agent-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-runtime.d.ts","sourceRoot":"","sources":["../src/agent-runtime.ts"],"names":[],"mappings":"AAwFA;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,MAAkB,EACxB,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,GAAG,IAAI,CA4Bf;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,IAAI,GAAE,MAAkB,EACxB,UAAU,CAAC,EAAE,MAAM,GAClB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAQhE"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.unsafeRuntimeGrant = unsafeRuntimeGrant;
|
|
4
|
+
exports.checkRuntimeGrants = checkRuntimeGrants;
|
|
5
|
+
const node_fs_1 = require("node:fs");
|
|
6
|
+
const node_os_1 = require("node:os");
|
|
7
|
+
const node_path_1 = require("node:path");
|
|
8
|
+
const untrusted_exec_1 = require("./untrusted-exec");
|
|
9
|
+
/**
|
|
10
|
+
* WHERE A CONFIGURED AGENT'S RUNTIME IS ALLOWED TO LIVE.
|
|
11
|
+
*
|
|
12
|
+
* A contained agent can only execute what it was granted, and the provider
|
|
13
|
+
* runtime is trusted machine material that generally sits OUTSIDE the
|
|
14
|
+
* model-editable repository — which is right, and which means containment needs
|
|
15
|
+
* to be told where it is.
|
|
16
|
+
*
|
|
17
|
+
* It must be TOLD, not have it inferred. A command line is not an authority
|
|
18
|
+
* description: parsing `node C:\somewhere\agent.js --flag` to guess what to
|
|
19
|
+
* grant would be a heuristic standing between untrusted input and a filesystem
|
|
20
|
+
* permission, and the first quoting surprise becomes a grant nobody intended.
|
|
21
|
+
* So the grant is a separate, explicit field a person writes.
|
|
22
|
+
*
|
|
23
|
+
* `.looply/config.yaml` is already protected from contained execution, so the
|
|
24
|
+
* model cannot edit its own next launch. That is what makes it safe to treat
|
|
25
|
+
* this as human configuration — and it is why the protection matters more now
|
|
26
|
+
* than it did when it was only about gate commands.
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* Roots too broad to grant, whatever the configuration says.
|
|
30
|
+
*
|
|
31
|
+
* Not a blocklist of paths somebody might type — a check that the grant is not
|
|
32
|
+
* a root whose whole subtree would come with it. Granting the home directory
|
|
33
|
+
* hands over `~/.looply/machine.json` and `~/.claude`; granting a drive root
|
|
34
|
+
* hands over everything.
|
|
35
|
+
*/
|
|
36
|
+
function forbiddenRoots(home = (0, node_os_1.homedir)()) {
|
|
37
|
+
const win = (0, untrusted_exec_1.systemRoot)();
|
|
38
|
+
const roots = [
|
|
39
|
+
home,
|
|
40
|
+
(0, node_path_1.resolve)(home, '.looply'),
|
|
41
|
+
(0, node_path_1.resolve)(home, '.claude'),
|
|
42
|
+
win,
|
|
43
|
+
(0, node_path_1.resolve)(win, '..'),
|
|
44
|
+
process.env['ProgramFiles'] ?? 'C:\\Program Files',
|
|
45
|
+
process.env['ProgramFiles(x86)'] ?? 'C:\\Program Files (x86)',
|
|
46
|
+
process.env['APPDATA'] ?? (0, node_path_1.resolve)(home, 'AppData', 'Roaming'),
|
|
47
|
+
process.env['LOCALAPPDATA'] ?? (0, node_path_1.resolve)(home, 'AppData', 'Local'),
|
|
48
|
+
(0, node_path_1.resolve)(home, 'AppData'),
|
|
49
|
+
];
|
|
50
|
+
return roots.map((r) => (0, node_path_1.resolve)(r));
|
|
51
|
+
}
|
|
52
|
+
/** True when `p` IS `root`, or `root` itself is inside `p`. */
|
|
53
|
+
function coversOrIs(p, root) {
|
|
54
|
+
const a = (0, node_path_1.resolve)(p);
|
|
55
|
+
const b = (0, node_path_1.resolve)(root);
|
|
56
|
+
if (a.toLowerCase() === b.toLowerCase())
|
|
57
|
+
return true;
|
|
58
|
+
// `p` is an ANCESTOR of a forbidden root — granting it grants that root too.
|
|
59
|
+
const withSep = a.endsWith(node_path_1.sep) ? a : a + node_path_1.sep;
|
|
60
|
+
return b.toLowerCase().startsWith(withSep.toLowerCase());
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Every name for this path: the lexical one, and the one it really is.
|
|
64
|
+
*
|
|
65
|
+
* A lexical check alone reads a junction as an ordinary directory. `mklink /J`
|
|
66
|
+
* needs no privilege on Windows, a junction to the home directory resolves to
|
|
67
|
+
* itself under `resolve`, and the ACL a grant writes follows the reparse point
|
|
68
|
+
* to the target — so a forbidden root would have been granted under a name that
|
|
69
|
+
* never looked like one.
|
|
70
|
+
*
|
|
71
|
+
* Both names are checked rather than only the real one, because a path can be
|
|
72
|
+
* unsafe either way round: a link that lands somewhere forbidden, or a plain
|
|
73
|
+
* forbidden path that resolves elsewhere.
|
|
74
|
+
*
|
|
75
|
+
* A path that does not exist yet has no real name, so only the lexical one is
|
|
76
|
+
* available. That gap is not closable from here: the grant is applied moments
|
|
77
|
+
* after this check, and anything that can create a junction in between can
|
|
78
|
+
* already write where the runtime lives.
|
|
79
|
+
*/
|
|
80
|
+
function bothNames(path) {
|
|
81
|
+
const lexical = (0, node_path_1.resolve)(path);
|
|
82
|
+
try {
|
|
83
|
+
const real = (0, node_path_1.resolve)(node_fs_1.realpathSync.native(lexical));
|
|
84
|
+
return real.toLowerCase() === lexical.toLowerCase() ? [lexical] : [lexical, real];
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return [lexical];
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Why this path may not be granted to untrusted execution, or null if it may.
|
|
92
|
+
*
|
|
93
|
+
* Compared as resolved paths rather than as strings: `C:\Users\x\..\x` is the
|
|
94
|
+
* same directory as `C:\Users\x`, and a check that could not see that would be
|
|
95
|
+
* a check somebody routes around by accident.
|
|
96
|
+
*/
|
|
97
|
+
function unsafeRuntimeGrant(path, home = (0, node_os_1.homedir)(), projectDir) {
|
|
98
|
+
const bad = forbiddenRoots(home);
|
|
99
|
+
for (const p of bothNames(path)) {
|
|
100
|
+
// INSIDE THE WORKTREE IS NOT A PLACE A RUNTIME MAY LIVE.
|
|
101
|
+
//
|
|
102
|
+
// This is the one place the validate-then-grant race is actually winnable.
|
|
103
|
+
// Everywhere else a declared runtime path sits outside the worktree, where
|
|
104
|
+
// contained execution holds no grant and so cannot swap a directory for a
|
|
105
|
+
// link between the check above and the moment the ACL is written. Inside
|
|
106
|
+
// the worktree the model has write access by design, so it could.
|
|
107
|
+
//
|
|
108
|
+
// Refusing costs nothing: the worktree is already granted in full, so a
|
|
109
|
+
// runtime declared there would be reachable anyway. What the declaration
|
|
110
|
+
// would add is only the race.
|
|
111
|
+
if (projectDir !== undefined && coversOrIs((0, node_path_1.resolve)(projectDir), p)) {
|
|
112
|
+
return `${path} is inside the project worktree, which the model can write`;
|
|
113
|
+
}
|
|
114
|
+
const root = (0, node_path_1.parse)(p).root;
|
|
115
|
+
if (p.toLowerCase() === (0, node_path_1.resolve)(root).toLowerCase()) {
|
|
116
|
+
return `${path} is a drive root, which would grant the whole machine`;
|
|
117
|
+
}
|
|
118
|
+
for (const b of bad) {
|
|
119
|
+
if (coversOrIs(p, b)) {
|
|
120
|
+
return `${path} covers ${b}, which holds credentials or machine state`;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Validate every declared runtime path, or say which one is wrong.
|
|
128
|
+
*
|
|
129
|
+
* Fails closed on the whole list: a configuration with one unsafe entry is a
|
|
130
|
+
* configuration nobody has checked, and running with the rest of it would be
|
|
131
|
+
* obeying half of what was written.
|
|
132
|
+
*/
|
|
133
|
+
function checkRuntimeGrants(paths, home = (0, node_os_1.homedir)(), projectDir) {
|
|
134
|
+
const out = [];
|
|
135
|
+
for (const p of paths) {
|
|
136
|
+
const bad = unsafeRuntimeGrant(p, home, projectDir);
|
|
137
|
+
if (bad !== null)
|
|
138
|
+
return { ok: false, because: `agent.runtime: ${bad}` };
|
|
139
|
+
out.push((0, node_path_1.resolve)(p));
|
|
140
|
+
}
|
|
141
|
+
return { ok: true, paths: out };
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=agent-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-runtime.js","sourceRoot":"","sources":["../src/agent-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { type ApprovalGate } from '@looply/core';
|
|
2
|
+
import type { ServerApprovalRow } from './server-client';
|
|
3
|
+
/**
|
|
4
|
+
* ASKING THE SERVER WHAT A PURSUIT IS WAITING FOR.
|
|
5
|
+
*
|
|
6
|
+
* The thin half of the gate: one HTTP read, a shape check, and the pure
|
|
7
|
+
* derivation. Everything that could be a judgement lives in
|
|
8
|
+
* `deriveApprovalGate`, so this file has no branches about what an approval
|
|
9
|
+
* MEANS — only about whether it was heard.
|
|
10
|
+
*
|
|
11
|
+
* ─────────────────────────────────────────────────────────────────────────────
|
|
12
|
+
* IT FAILS CLOSED, AND THAT IS THE WHOLE REASON IT IS NOT INLINE.
|
|
13
|
+
*
|
|
14
|
+
* The tempting shape is `catch { return { kind: 'none' } }`, and it is the one
|
|
15
|
+
* mistake that matters here. "I could not ask" and "there is nothing
|
|
16
|
+
* outstanding" arrive as the same silence and are opposite facts: the first
|
|
17
|
+
* means a person may be mid-decision, and treating it as the second is a
|
|
18
|
+
* machine carrying on past a question it simply could not see.
|
|
19
|
+
*
|
|
20
|
+
* So a read that does not produce a well-formed answer produces `unknown`,
|
|
21
|
+
* which holds — and holding is free, because the next tick asks again.
|
|
22
|
+
*/
|
|
23
|
+
/** Just enough of the client to ask. Injected so a test can fail it precisely. */
|
|
24
|
+
export interface ApprovalReader {
|
|
25
|
+
projectApprovals(projectId: string, goal: {
|
|
26
|
+
goalId: string;
|
|
27
|
+
goalVersion: number;
|
|
28
|
+
}, limit?: number): Promise<ServerApprovalRow[]>;
|
|
29
|
+
}
|
|
30
|
+
export interface ReadApprovalGateInput {
|
|
31
|
+
readonly projectId: string;
|
|
32
|
+
readonly goalId: string;
|
|
33
|
+
readonly goalVersion: number;
|
|
34
|
+
/** Milliseconds since the epoch, from the caller's clock. */
|
|
35
|
+
readonly now: number;
|
|
36
|
+
/**
|
|
37
|
+
* Which of these resolutions a resumed run has already been given.
|
|
38
|
+
*
|
|
39
|
+
* A FUNCTION, and asked with the ids that came back, because the machine
|
|
40
|
+
* cannot know which answers to look for until it has seen which exist. The
|
|
41
|
+
* claims are local: consuming a resolution is something this machine did, and
|
|
42
|
+
* the row on the server looks identical before and after.
|
|
43
|
+
*
|
|
44
|
+
* A failure here is `unknown`, like every other. A claim that could not be
|
|
45
|
+
* read is not a claim that is not there, and reading it as absent would hand
|
|
46
|
+
* the same answer to a second run.
|
|
47
|
+
*/
|
|
48
|
+
readonly consumed?: (approvalIds: readonly string[]) => Promise<{
|
|
49
|
+
ok: true;
|
|
50
|
+
consumed: ReadonlySet<string>;
|
|
51
|
+
} | {
|
|
52
|
+
ok: false;
|
|
53
|
+
because: string;
|
|
54
|
+
}>;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* How many rows to ask for.
|
|
58
|
+
*
|
|
59
|
+
* A pursuit at one version accumulates approvals slowly — a run raises at most
|
|
60
|
+
* one and then stops — so this is generous rather than tuned. It exists at all
|
|
61
|
+
* because the route's own default is 50 and silently taking the newest 50 of a
|
|
62
|
+
* larger set would be a gate that stops seeing the oldest outstanding question.
|
|
63
|
+
*/
|
|
64
|
+
export declare const APPROVAL_PAGE = 200;
|
|
65
|
+
export declare function readApprovalGate(server: ApprovalReader, input: ReadApprovalGateInput): Promise<ApprovalGate>;
|
|
66
|
+
//# sourceMappingURL=approval-gate-read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-gate-read.d.ts","sourceRoot":"","sources":["../src/approval-gate-read.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EAElB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,kFAAkF;AAClF,MAAM,WAAW,cAAc;IAC7B,gBAAgB,CACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAC7C,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,6DAA6D;IAC7D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAClB,WAAW,EAAE,SAAS,MAAM,EAAE,KAC3B,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5F;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,MAAM,CAAC;AA8EjC,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,YAAY,CAAC,CA6CvB"}
|