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
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 vuedale
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,137 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
# looply
|
|
2
|
+
|
|
3
|
+
**looply does not write your code.** Your coding agent does — Claude Code, or whichever
|
|
4
|
+
one you already use. looply is the harness around it: it decides what the agent works
|
|
5
|
+
on, refuses the paths you named, runs your checks, has a *second* agent prove the change
|
|
6
|
+
against the task, and then keeps it or throws it away.
|
|
7
|
+
|
|
8
|
+
Your code never leaves your machine.
|
|
9
|
+
|
|
10
|
+
```sh
|
|
11
|
+
npx looply-cli init # read the repo, ask the few things it cannot infer
|
|
12
|
+
npx looply-cli doctor # run every check once — no agent calls, no cost
|
|
13
|
+
npx looply-cli scan # fill the queue with findings tied to a file and a line
|
|
14
|
+
npx looply-cli verify # confirm each finding against the code as it stands
|
|
15
|
+
npx looply-cli run --hours 4
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## The two-key rule
|
|
19
|
+
|
|
20
|
+
A round commits only if **both** keys turn:
|
|
21
|
+
|
|
22
|
+
| | |
|
|
23
|
+
|---|---|
|
|
24
|
+
| **Key one** | your own checks — typecheck, tests, build — in the order you wrote them |
|
|
25
|
+
| **Key two** | a second agent reads the diff against the task. It did not write the code, and it never sees the first agent's account of what it did. |
|
|
26
|
+
|
|
27
|
+
Either one fails and the work is discarded, the tree is cleaned, and the task goes back
|
|
28
|
+
in the queue carrying the reason — so the next attempt starts knowing what went wrong
|
|
29
|
+
with the last one.
|
|
30
|
+
|
|
31
|
+
This exists because of a measured failure. An earlier version of this harness ran 166
|
|
32
|
+
unattended rounds and kept all 166, because the checks it ran were the same checks the
|
|
33
|
+
agent had already run before finishing. A green build is not evidence. **A prover that
|
|
34
|
+
never rejects anything is not checking.**
|
|
35
|
+
|
|
36
|
+
## What one round is
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
pick → implement → check → prove → keep or discard
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
- **pick** — the top item whose premise still holds. If the code moved under it, it goes
|
|
43
|
+
back through verification first: an item describing a bug somebody already fixed is
|
|
44
|
+
worse than no item at all.
|
|
45
|
+
- **implement** — your agent, starting at the file and line the item already located.
|
|
46
|
+
- **check** — your gates, cheapest first, stopping at the first failure.
|
|
47
|
+
- **prove** — the second agent.
|
|
48
|
+
- **keep or discard** — a commit on the run branch with a trailer naming only the checks
|
|
49
|
+
that actually ran, or nothing at all.
|
|
50
|
+
|
|
51
|
+
## Rails
|
|
52
|
+
|
|
53
|
+
Name the paths the agent must never touch. looply reports what it finds there and
|
|
54
|
+
refuses the edit; a task that genuinely needs one becomes a question, for that one file,
|
|
55
|
+
once.
|
|
56
|
+
|
|
57
|
+
```yaml
|
|
58
|
+
rails:
|
|
59
|
+
forbidden_paths: ["prisma/", "src/auth/", "src/modules/payments/"]
|
|
60
|
+
prod_patterns: [herokuapp, amazonaws, ".render.com"]
|
|
61
|
+
exemptions: ask # or never
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
A railed path or a reachable production database **aborts** the round before a single
|
|
65
|
+
check runs. That is a different thing from a failing check, and it is reported
|
|
66
|
+
differently.
|
|
67
|
+
|
|
68
|
+
## Commands
|
|
69
|
+
|
|
70
|
+
| command | what it is for | costs |
|
|
71
|
+
|---|---|---|
|
|
72
|
+
| `looply` | where you are, and the single most useful next step | — |
|
|
73
|
+
| `looply init` | profile the project and write `.looply/config.yaml` | — |
|
|
74
|
+
| `looply doctor` | validate the config and run every check once | — |
|
|
75
|
+
| `looply scan` | read the code through several lenses and fill the queue | agent |
|
|
76
|
+
| `looply verify` | confirm draft items against the code, so a run can pick them | agent |
|
|
77
|
+
| `looply run --hours N` | work the queue for N hours | agent |
|
|
78
|
+
| `looply run --dry-run` | print exactly what a run would do | — |
|
|
79
|
+
| `looply status` | what it is doing right now | — |
|
|
80
|
+
| `looply report` | what a finished run actually did | — |
|
|
81
|
+
| `looply pair` | connect this machine to your phone | — |
|
|
82
|
+
| `looply daemon` | stay connected so the phone can drive it | — |
|
|
83
|
+
| `looply agent --json` | machine-readable state, for other tools | — |
|
|
84
|
+
|
|
85
|
+
`doctor` and `--dry-run` cost nothing. Use them rather than starting a run to find out
|
|
86
|
+
the config is wrong.
|
|
87
|
+
|
|
88
|
+
## Using a different agent
|
|
89
|
+
|
|
90
|
+
The prompt is written to the agent's **stdin**, never onto a command line, so a
|
|
91
|
+
multi-line prompt and a diff full of quotes are not your problem:
|
|
92
|
+
|
|
93
|
+
```yaml
|
|
94
|
+
agent:
|
|
95
|
+
command: "claude -p --dangerously-skip-permissions"
|
|
96
|
+
output_format_flag: "--output-format" # "" if your agent has no such flag
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
The agent runs **contained**: it inherits no PATH and no environment, which is
|
|
100
|
+
the point — but it means a provider outside your project has to be named, or it
|
|
101
|
+
cannot start at all. Two keys do that, and skipping them produces exactly two
|
|
102
|
+
failures, both measured:
|
|
103
|
+
|
|
104
|
+
```yaml
|
|
105
|
+
agent:
|
|
106
|
+
# Where the binary lives. Without it every lens reports
|
|
107
|
+
# "'claude' is not recognized as an internal or external command".
|
|
108
|
+
runtime: ["/home/you/.local/bin"]
|
|
109
|
+
# Names only — the VALUE comes from the environment the daemon holds, so no
|
|
110
|
+
# key is ever written into this file. Without it a provider that keeps its
|
|
111
|
+
# login in a credential store answers "Not logged in · Please run /login",
|
|
112
|
+
# because looply will not grant an agent a credential store.
|
|
113
|
+
env: ["CLAUDE_CODE_OAUTH_TOKEN"]
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Confirm both with `looply doctor --provider`, which spends one model call and
|
|
117
|
+
tells you whether the process actually started, answered, or hung.
|
|
118
|
+
|
|
119
|
+
## Requirements
|
|
120
|
+
|
|
121
|
+
- Node 20 or newer
|
|
122
|
+
- A git repository with a clean working tree — a run refuses to start otherwise, because
|
|
123
|
+
the first discard would destroy uncommitted work
|
|
124
|
+
- At least one check of your own that exits non-zero when it fails. Without one there is
|
|
125
|
+
nothing for the first key to turn.
|
|
126
|
+
|
|
127
|
+
## What it is not
|
|
128
|
+
|
|
129
|
+
- Not a coding agent. It drives the one you already use and is worth nothing without it.
|
|
130
|
+
- Not a replacement for review. It narrows what you review and shows its working.
|
|
131
|
+
- Not free. Every round is agent time, and a check that rejects work has still been paid for.
|
|
132
|
+
|
|
133
|
+
## Documentation
|
|
134
|
+
|
|
135
|
+
<https://looply-agent-app.web.app/docs/>
|
|
136
|
+
|
|
137
|
+
MIT © vuedale
|
package/dist/.src-hash
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0718ecc55a9ad89af6ef6bfb9f39e9139d823f2be48bcd1675cb79cd8be97d7a
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { type AcceptanceStepShape, type ObservedProfile } from '@looply/core';
|
|
2
|
+
import type { CommandRunner } from './gate';
|
|
3
|
+
import type { ContainmentProbe } from './untrusted-exec';
|
|
4
|
+
export interface LockIdentity {
|
|
5
|
+
readonly file: string;
|
|
6
|
+
readonly digest: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* The dependency DECLARATION in a checkout, as `<file>@<sha256:16>`.
|
|
10
|
+
*
|
|
11
|
+
* ⚠️ A DECLARATION, NOT AN INSTALLATION — see `deps` below. Returns null when the
|
|
12
|
+
* project holds no lockfile at all, which is a readable answer and not a
|
|
13
|
+
* failure: plenty of real projects have none, and a default that demanded one
|
|
14
|
+
* would refuse them for ever.
|
|
15
|
+
*/
|
|
16
|
+
export declare function readLockIdentity(dir: string): LockIdentity | null;
|
|
17
|
+
export interface EnvironmentSource {
|
|
18
|
+
/** `process.platform`, injected rather than read, so a test can state it. */
|
|
19
|
+
readonly platform: string;
|
|
20
|
+
/** `process.arch`. */
|
|
21
|
+
readonly arch: string;
|
|
22
|
+
/** `process.versions.node`. */
|
|
23
|
+
readonly nodeVersion: string;
|
|
24
|
+
/** The acceptance map this pass ran under — `cfg.gates`. */
|
|
25
|
+
readonly gates: readonly AcceptanceStepShape[];
|
|
26
|
+
/**
|
|
27
|
+
* `DoctorReport.containment`, or null when nothing asked.
|
|
28
|
+
*
|
|
29
|
+
* 🔴 THIS IS THE FACT THE LANE ALREADY COMPUTED AND THREW AWAY.
|
|
30
|
+
* `integration-deps.ts` mapped the doctor report down to `{name, ok, detail}`
|
|
31
|
+
* and dropped `containment` with it, so the one question "was there a boundary
|
|
32
|
+
* around this execution" was answered on every lane pass and recorded nowhere.
|
|
33
|
+
*/
|
|
34
|
+
readonly containment: ContainmentProbe | null;
|
|
35
|
+
/** The candidate checkout's own lockfile, or null when it holds none. */
|
|
36
|
+
readonly lock: LockIdentity | null;
|
|
37
|
+
/**
|
|
38
|
+
* Did this checkout receive `node_modules` (or anything else) from the host
|
|
39
|
+
* rather than installing from its own lockfile?
|
|
40
|
+
*
|
|
41
|
+
* 🔴 NOT A FORMALITY, AND THE REASON `deps` EXISTS APART FROM `lock`. The lane
|
|
42
|
+
* copies `run.carry_into_checkouts` into the candidate's worktree from the
|
|
43
|
+
* LANE's tree (integration-runtime.ts, `carryIntoCheckout`), so the gate runs
|
|
44
|
+
* the candidate's lockfile against the host's installed tree. Recording a lock
|
|
45
|
+
* digest alone would assert a dependency identity the check did not have.
|
|
46
|
+
*/
|
|
47
|
+
readonly depsCarried: boolean;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Assemble the observation. PURE: every fact arrives as an argument.
|
|
51
|
+
*
|
|
52
|
+
* ⚠️ A FACT THAT COULD NOT BE READ IS `null`, NEVER OMITTED AND NEVER GUESSED.
|
|
53
|
+
* Absent means nobody asked and `null` means it was asked and could not be read;
|
|
54
|
+
* the matcher refuses each by its own name, and Rule #1 makes both non-evidence
|
|
55
|
+
* in strict mode.
|
|
56
|
+
*/
|
|
57
|
+
export declare function observedProfile(src: EnvironmentSource): ObservedProfile;
|
|
58
|
+
/**
|
|
59
|
+
* The observation for a gate pass in `dir`, reading this process and that
|
|
60
|
+
* checkout.
|
|
61
|
+
*
|
|
62
|
+
* ⚠️ `platform`/`arch`/`nodeVersion` DESCRIBE THE PROCESS THAT RAN THE GATE, and
|
|
63
|
+
* that is the right answer: the lane runs the candidate's checks in a worktree
|
|
64
|
+
* on this machine, so this machine is where they happened.
|
|
65
|
+
*/
|
|
66
|
+
export declare function observeAt(dir: string, gates: readonly AcceptanceStepShape[], containment: ContainmentProbe | null, depsCarried: boolean): ObservedProfile;
|
|
67
|
+
/** How long a declared probe may take before it is treated as unreadable. */
|
|
68
|
+
export declare const PROBE_TIMEOUT_MS = 30000;
|
|
69
|
+
/** A probe answer longer than this is a command that misunderstood its job. */
|
|
70
|
+
export declare const PROBE_VALUE_MAX = 200;
|
|
71
|
+
/**
|
|
72
|
+
* Read the facts this machine cannot read for itself — a database engine and
|
|
73
|
+
* major version, a migration head, a build target.
|
|
74
|
+
*
|
|
75
|
+
* 🔴 EVERY FAILURE IS `null`, WHICH IS "ASKED AND UNREADABLE", AND IN STRICT
|
|
76
|
+
* MODE THAT IS A REFUSAL. A probe that exits non-zero, times out, or prints
|
|
77
|
+
* nothing does NOT quietly drop out of the profile — dropping it would read
|
|
78
|
+
* downstream as "nobody asked", which is a different fact and the softer one.
|
|
79
|
+
* Fail-closed is the charter's rule for a required fact that cannot be read.
|
|
80
|
+
*
|
|
81
|
+
* ⚠️ THE FIRST NON-EMPTY LINE, TRIMMED. A probe is a fact reader, not a report;
|
|
82
|
+
* anything longer than a short identifier is a command that misunderstood its
|
|
83
|
+
* job, and truncating silently would make two different databases digest alike.
|
|
84
|
+
* An over-long answer is `null` for the same reason a crash is.
|
|
85
|
+
*
|
|
86
|
+
* ⚠️ RUN UNDER THE SAME CONTAINED RUNNER AS THE GATE, in the candidate's own
|
|
87
|
+
* checkout. On a platform whose containment backend refuses outright, every
|
|
88
|
+
* probe answers `null` — which is honest, and is why an owner who declares one
|
|
89
|
+
* is told by `doctor` before a Start is ever spent on it.
|
|
90
|
+
*/
|
|
91
|
+
export declare function runAcceptanceProbes(probes: readonly {
|
|
92
|
+
readonly fact: string;
|
|
93
|
+
readonly run: string;
|
|
94
|
+
}[], runner: CommandRunner, timeoutMs?: number): Promise<Record<string, string | null>>;
|
|
95
|
+
/**
|
|
96
|
+
* The full observation: the facts this process and checkout can state, plus
|
|
97
|
+
* whatever the project's declared probes answer.
|
|
98
|
+
*
|
|
99
|
+
* ⚠️ PROBE ANSWERS GO THROUGH `normaliseObserved` WITH THE REST, so a probe
|
|
100
|
+
* cannot invent a fact outside the closed set — a probe declared for
|
|
101
|
+
* `probe.db-engine` cannot return a `user` key, because it returns a string and
|
|
102
|
+
* the key is the one the owner declared.
|
|
103
|
+
*/
|
|
104
|
+
export declare function observeAtWithProbes(dir: string, gates: readonly AcceptanceStepShape[], containment: ContainmentProbe | null, depsCarried: boolean, probes: readonly {
|
|
105
|
+
readonly fact: string;
|
|
106
|
+
readonly run: string;
|
|
107
|
+
}[], runner: CommandRunner): Promise<ObservedProfile>;
|
|
108
|
+
//# sourceMappingURL=acceptance-observe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acceptance-observe.d.ts","sourceRoot":"","sources":["../src/acceptance-observe.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACrB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AA0BzD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAUjE;AAED,MAAM,WAAW,iBAAiB;IAChC,6EAA6E;IAC7E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,sBAAsB;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,+BAA+B;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC/C;;;;;;;OAOG;IACH,QAAQ,CAAC,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC9C,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC;;;;;;;;;OASG;IACH,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,iBAAiB,GAAG,eAAe,CAavE;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CACvB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,SAAS,mBAAmB,EAAE,EACrC,WAAW,EAAE,gBAAgB,GAAG,IAAI,EACpC,WAAW,EAAE,OAAO,GACnB,eAAe,CAUjB;AAED,6EAA6E;AAC7E,eAAO,MAAM,gBAAgB,QAAS,CAAC;AACvC,+EAA+E;AAC/E,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,EAClE,MAAM,EAAE,aAAa,EACrB,SAAS,GAAE,MAAyB,GACnC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAgBxC;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,SAAS,mBAAmB,EAAE,EACrC,WAAW,EAAE,gBAAgB,GAAG,IAAI,EACpC,WAAW,EAAE,OAAO,EACpB,MAAM,EAAE,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,EAClE,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,eAAe,CAAC,CAI1B"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PROBE_VALUE_MAX = exports.PROBE_TIMEOUT_MS = void 0;
|
|
4
|
+
exports.readLockIdentity = readLockIdentity;
|
|
5
|
+
exports.observedProfile = observedProfile;
|
|
6
|
+
exports.observeAt = observeAt;
|
|
7
|
+
exports.runAcceptanceProbes = runAcceptanceProbes;
|
|
8
|
+
exports.observeAtWithProbes = observeAtWithProbes;
|
|
9
|
+
const node_crypto_1 = require("node:crypto");
|
|
10
|
+
const node_fs_1 = require("node:fs");
|
|
11
|
+
const node_path_1 = require("node:path");
|
|
12
|
+
const core_1 = require("@looply/core");
|
|
13
|
+
/**
|
|
14
|
+
* THE READER FOR RULE #1 — what a gate pass was actually observed to happen
|
|
15
|
+
* under.
|
|
16
|
+
*
|
|
17
|
+
* 🔴 EVERY FACT COMES FROM THIS PROCESS, FROM THE CANDIDATE'S OWN CHECKOUT, OR
|
|
18
|
+
* FROM THE GATE REPORT. No agent output reaches this file and there is no field
|
|
19
|
+
* on `IntegrationCandidate` that could supply one — which is the mechanical form
|
|
20
|
+
* of "no model decides whether its own environment qualifies". The matcher
|
|
21
|
+
* (`packages/core/src/acceptance-environment.ts`) then decides on the
|
|
22
|
+
* OBSERVATION IT IS HANDED and never on this host, and a purity spec pins that.
|
|
23
|
+
*
|
|
24
|
+
* ⚠️ FACTS ARE COLLECTED WHETHER OR NOT ANYTHING REQUIRES THEM. An observation
|
|
25
|
+
* is a record for a person to read; `matchProfile` loops over `required`, so a
|
|
26
|
+
* fact nobody asked for cannot refuse anything. Collecting broadly and matching
|
|
27
|
+
* narrowly is the whole shape of "irrelevant facts must not invalidate".
|
|
28
|
+
*
|
|
29
|
+
* ⚠️ AND NOTHING SECRET IS COLLECTED. The closed list in core is the guard —
|
|
30
|
+
* `normaliseObserved` drops anything outside it — but the first defence is that
|
|
31
|
+
* nothing here reads an env var, a credential store or a home directory.
|
|
32
|
+
*/
|
|
33
|
+
/** The lockfiles worth recognising, in the order a project would hold them. */
|
|
34
|
+
const LOCKFILES = ['package-lock.json', 'pnpm-lock.yaml', 'yarn.lock', 'npm-shrinkwrap.json'];
|
|
35
|
+
/**
|
|
36
|
+
* The dependency DECLARATION in a checkout, as `<file>@<sha256:16>`.
|
|
37
|
+
*
|
|
38
|
+
* ⚠️ A DECLARATION, NOT AN INSTALLATION — see `deps` below. Returns null when the
|
|
39
|
+
* project holds no lockfile at all, which is a readable answer and not a
|
|
40
|
+
* failure: plenty of real projects have none, and a default that demanded one
|
|
41
|
+
* would refuse them for ever.
|
|
42
|
+
*/
|
|
43
|
+
function readLockIdentity(dir) {
|
|
44
|
+
for (const file of LOCKFILES) {
|
|
45
|
+
try {
|
|
46
|
+
const bytes = (0, node_fs_1.readFileSync)((0, node_path_1.join)(dir, file));
|
|
47
|
+
return { file, digest: (0, node_crypto_1.createHash)('sha256').update(bytes).digest('hex').slice(0, 16) };
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
/* not this one */
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Assemble the observation. PURE: every fact arrives as an argument.
|
|
57
|
+
*
|
|
58
|
+
* ⚠️ A FACT THAT COULD NOT BE READ IS `null`, NEVER OMITTED AND NEVER GUESSED.
|
|
59
|
+
* Absent means nobody asked and `null` means it was asked and could not be read;
|
|
60
|
+
* the matcher refuses each by its own name, and Rule #1 makes both non-evidence
|
|
61
|
+
* in strict mode.
|
|
62
|
+
*/
|
|
63
|
+
function observedProfile(src) {
|
|
64
|
+
return (0, core_1.normaliseObserved)({
|
|
65
|
+
os: src.platform,
|
|
66
|
+
arch: src.arch,
|
|
67
|
+
runtime: `node@${src.nodeVersion}`,
|
|
68
|
+
lock: src.lock === null ? 'none' : `${src.lock.file}@${src.lock.digest}`,
|
|
69
|
+
deps: src.depsCarried ? 'carried-from-host' : 'from-lock',
|
|
70
|
+
gates: (0, core_1.acceptanceMapDigest)(src.gates),
|
|
71
|
+
containment: src.containment === null
|
|
72
|
+
? null
|
|
73
|
+
: `${src.containment.backend}:${src.containment.available ? 'available' : 'unavailable'}`,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* The observation for a gate pass in `dir`, reading this process and that
|
|
78
|
+
* checkout.
|
|
79
|
+
*
|
|
80
|
+
* ⚠️ `platform`/`arch`/`nodeVersion` DESCRIBE THE PROCESS THAT RAN THE GATE, and
|
|
81
|
+
* that is the right answer: the lane runs the candidate's checks in a worktree
|
|
82
|
+
* on this machine, so this machine is where they happened.
|
|
83
|
+
*/
|
|
84
|
+
function observeAt(dir, gates, containment, depsCarried) {
|
|
85
|
+
return observedProfile({
|
|
86
|
+
platform: process.platform,
|
|
87
|
+
arch: process.arch,
|
|
88
|
+
nodeVersion: process.versions.node,
|
|
89
|
+
gates,
|
|
90
|
+
containment,
|
|
91
|
+
lock: readLockIdentity(dir),
|
|
92
|
+
depsCarried,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
/** How long a declared probe may take before it is treated as unreadable. */
|
|
96
|
+
exports.PROBE_TIMEOUT_MS = 30_000;
|
|
97
|
+
/** A probe answer longer than this is a command that misunderstood its job. */
|
|
98
|
+
exports.PROBE_VALUE_MAX = 200;
|
|
99
|
+
/**
|
|
100
|
+
* Read the facts this machine cannot read for itself — a database engine and
|
|
101
|
+
* major version, a migration head, a build target.
|
|
102
|
+
*
|
|
103
|
+
* 🔴 EVERY FAILURE IS `null`, WHICH IS "ASKED AND UNREADABLE", AND IN STRICT
|
|
104
|
+
* MODE THAT IS A REFUSAL. A probe that exits non-zero, times out, or prints
|
|
105
|
+
* nothing does NOT quietly drop out of the profile — dropping it would read
|
|
106
|
+
* downstream as "nobody asked", which is a different fact and the softer one.
|
|
107
|
+
* Fail-closed is the charter's rule for a required fact that cannot be read.
|
|
108
|
+
*
|
|
109
|
+
* ⚠️ THE FIRST NON-EMPTY LINE, TRIMMED. A probe is a fact reader, not a report;
|
|
110
|
+
* anything longer than a short identifier is a command that misunderstood its
|
|
111
|
+
* job, and truncating silently would make two different databases digest alike.
|
|
112
|
+
* An over-long answer is `null` for the same reason a crash is.
|
|
113
|
+
*
|
|
114
|
+
* ⚠️ RUN UNDER THE SAME CONTAINED RUNNER AS THE GATE, in the candidate's own
|
|
115
|
+
* checkout. On a platform whose containment backend refuses outright, every
|
|
116
|
+
* probe answers `null` — which is honest, and is why an owner who declares one
|
|
117
|
+
* is told by `doctor` before a Start is ever spent on it.
|
|
118
|
+
*/
|
|
119
|
+
async function runAcceptanceProbes(probes, runner, timeoutMs = exports.PROBE_TIMEOUT_MS) {
|
|
120
|
+
const out = {};
|
|
121
|
+
for (const p of probes) {
|
|
122
|
+
try {
|
|
123
|
+
const r = await runner(p.run, timeoutMs);
|
|
124
|
+
const line = (r.output ?? '')
|
|
125
|
+
.split('\n')
|
|
126
|
+
.map((l) => l.trim())
|
|
127
|
+
.find((l) => l !== '');
|
|
128
|
+
out[p.fact] = r.ok && !r.timedOut && line !== undefined && line.length <= exports.PROBE_VALUE_MAX ? line : null;
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// A runner that throws is a machine that cannot answer, not a fact.
|
|
132
|
+
out[p.fact] = null;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return out;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* The full observation: the facts this process and checkout can state, plus
|
|
139
|
+
* whatever the project's declared probes answer.
|
|
140
|
+
*
|
|
141
|
+
* ⚠️ PROBE ANSWERS GO THROUGH `normaliseObserved` WITH THE REST, so a probe
|
|
142
|
+
* cannot invent a fact outside the closed set — a probe declared for
|
|
143
|
+
* `probe.db-engine` cannot return a `user` key, because it returns a string and
|
|
144
|
+
* the key is the one the owner declared.
|
|
145
|
+
*/
|
|
146
|
+
async function observeAtWithProbes(dir, gates, containment, depsCarried, probes, runner) {
|
|
147
|
+
const core = observeAt(dir, gates, containment, depsCarried);
|
|
148
|
+
if (probes.length === 0)
|
|
149
|
+
return core;
|
|
150
|
+
return (0, core_1.normaliseObserved)({ ...core, ...(await runAcceptanceProbes(probes, runner)) });
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=acceptance-observe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acceptance-observe.js","sourceRoot":"","sources":["../src/acceptance-observe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import type { Item, Status } from '@looply/core';
|
|
2
|
+
import type { LooplyConfig } from './config';
|
|
3
|
+
/**
|
|
4
|
+
* `looply agent` — the machine-readable surface.
|
|
5
|
+
*
|
|
6
|
+
* Everything else in this CLI is written for a person: boxes, colour, a next
|
|
7
|
+
* step spelled out. This one is written for another program, and the two goals
|
|
8
|
+
* fight each other badly enough that mixing them produces output neither can
|
|
9
|
+
* use. So the split is explicit.
|
|
10
|
+
*
|
|
11
|
+
* Three promises, because a tool that consumes this has no way to ask:
|
|
12
|
+
*
|
|
13
|
+
* 1. `schemaVersion` changes when a field's meaning changes. A consumer can
|
|
14
|
+
* refuse to guess rather than silently misread.
|
|
15
|
+
* 2. Every field is either present or explicitly `null`. Nothing is omitted,
|
|
16
|
+
* so `undefined` never has to be told apart from "absent because false".
|
|
17
|
+
* 3. It exits 0 whenever it could answer at all, including "nothing is
|
|
18
|
+
* running". A non-zero exit means the question could not be answered —
|
|
19
|
+
* never that the answer was boring.
|
|
20
|
+
*/
|
|
21
|
+
export declare const AGENT_SCHEMA_VERSION = 1;
|
|
22
|
+
export interface AgentQueueItem {
|
|
23
|
+
id: string;
|
|
24
|
+
title: string;
|
|
25
|
+
tag: string;
|
|
26
|
+
state: string;
|
|
27
|
+
attempts: number;
|
|
28
|
+
/** Why the last attempt was thrown away, when there was one. */
|
|
29
|
+
lastFailure: string | null;
|
|
30
|
+
evidence: {
|
|
31
|
+
path: string;
|
|
32
|
+
line: number | null;
|
|
33
|
+
}[];
|
|
34
|
+
}
|
|
35
|
+
export interface AgentSnapshot {
|
|
36
|
+
schemaVersion: number;
|
|
37
|
+
cliVersion: string;
|
|
38
|
+
project: {
|
|
39
|
+
name: string;
|
|
40
|
+
configured: boolean;
|
|
41
|
+
id: string | null;
|
|
42
|
+
};
|
|
43
|
+
machine: {
|
|
44
|
+
paired: boolean;
|
|
45
|
+
id: string | null;
|
|
46
|
+
serverUrl: string | null;
|
|
47
|
+
};
|
|
48
|
+
run: {
|
|
49
|
+
live: boolean;
|
|
50
|
+
id: string | null;
|
|
51
|
+
branch: string | null;
|
|
52
|
+
startedAt: string | null;
|
|
53
|
+
endedAt: string | null;
|
|
54
|
+
stopReason: string | null;
|
|
55
|
+
/** Whether events are still arriving; null when no run has ever happened. */
|
|
56
|
+
stale: boolean | null;
|
|
57
|
+
};
|
|
58
|
+
round: {
|
|
59
|
+
n: number | null;
|
|
60
|
+
itemId: string | null;
|
|
61
|
+
title: string | null;
|
|
62
|
+
attempt: number | null;
|
|
63
|
+
phase: string | null;
|
|
64
|
+
checks: {
|
|
65
|
+
name: string;
|
|
66
|
+
ok: boolean;
|
|
67
|
+
skipped: boolean;
|
|
68
|
+
ms: number;
|
|
69
|
+
}[];
|
|
70
|
+
} | null;
|
|
71
|
+
totals: {
|
|
72
|
+
rounds: number;
|
|
73
|
+
committed: number;
|
|
74
|
+
discarded: number;
|
|
75
|
+
abandoned: number;
|
|
76
|
+
};
|
|
77
|
+
queue: {
|
|
78
|
+
ready: number;
|
|
79
|
+
draft: number;
|
|
80
|
+
blocked: number;
|
|
81
|
+
total: number;
|
|
82
|
+
items: AgentQueueItem[];
|
|
83
|
+
};
|
|
84
|
+
questions: {
|
|
85
|
+
id: string;
|
|
86
|
+
text: string;
|
|
87
|
+
default: string;
|
|
88
|
+
deadline: string;
|
|
89
|
+
}[];
|
|
90
|
+
/** Guidance for a caller deciding what to do next, in machine terms. */
|
|
91
|
+
suggests: string | null;
|
|
92
|
+
}
|
|
93
|
+
export interface AgentInput {
|
|
94
|
+
cliVersion: string;
|
|
95
|
+
config: LooplyConfig | null;
|
|
96
|
+
status: Status | null;
|
|
97
|
+
items: readonly Item[];
|
|
98
|
+
machine: {
|
|
99
|
+
paired: boolean;
|
|
100
|
+
id: string | null;
|
|
101
|
+
serverUrl: string | null;
|
|
102
|
+
};
|
|
103
|
+
now: number;
|
|
104
|
+
staleAfterMs?: number;
|
|
105
|
+
/** Cap on items included; the counts stay complete regardless. */
|
|
106
|
+
limit?: number;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* What a caller should probably do next, as a stable token rather than prose.
|
|
110
|
+
*
|
|
111
|
+
* Deliberately not a sentence: a program branching on `"scan"` keeps working
|
|
112
|
+
* when the wording changes, and a program branching on English does not.
|
|
113
|
+
*/
|
|
114
|
+
export declare function suggestion(input: {
|
|
115
|
+
configured: boolean;
|
|
116
|
+
live: boolean;
|
|
117
|
+
ready: number;
|
|
118
|
+
draft: number;
|
|
119
|
+
openQuestions: number;
|
|
120
|
+
}): string | null;
|
|
121
|
+
export declare function buildSnapshot(input: AgentInput): AgentSnapshot;
|
|
122
|
+
/** Stable two-space JSON — diffable, and readable when a human ends up reading it. */
|
|
123
|
+
export declare function renderAgentJson(snapshot: AgentSnapshot): string;
|
|
124
|
+
/**
|
|
125
|
+
* The same snapshot as lines of `key=value`.
|
|
126
|
+
*
|
|
127
|
+
* For shell callers, where reaching for `jq` to learn whether a run is going is
|
|
128
|
+
* more ceremony than the question deserves.
|
|
129
|
+
*/
|
|
130
|
+
export declare function renderAgentText(s: AgentSnapshot): string;
|
|
131
|
+
//# sourceMappingURL=agent-cmd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-cmd.d.ts","sourceRoot":"","sources":["../src/agent-cmd.ts"],"names":[],"mappings":"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"}
|