dorfl 0.0.0 → 0.1.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/dist/advance-ci-template.d.ts +73 -0
- package/dist/advance-ci-template.d.ts.map +1 -0
- package/dist/advance-ci-template.js +104 -0
- package/dist/advance-ci-template.js.map +1 -0
- package/dist/advance-classify.d.ts +132 -0
- package/dist/advance-classify.d.ts.map +1 -0
- package/dist/advance-classify.js +120 -0
- package/dist/advance-classify.js.map +1 -0
- package/dist/advance-drivers.d.ts +182 -0
- package/dist/advance-drivers.d.ts.map +1 -0
- package/dist/advance-drivers.js +231 -0
- package/dist/advance-drivers.js.map +1 -0
- package/dist/advance-isolated.d.ts +156 -0
- package/dist/advance-isolated.d.ts.map +1 -0
- package/dist/advance-isolated.js +256 -0
- package/dist/advance-isolated.js.map +1 -0
- package/dist/advance-lifecycle-template.d.ts +107 -0
- package/dist/advance-lifecycle-template.d.ts.map +1 -0
- package/dist/advance-lifecycle-template.js +668 -0
- package/dist/advance-lifecycle-template.js.map +1 -0
- package/dist/advance-loop-driver.d.ts +325 -0
- package/dist/advance-loop-driver.d.ts.map +1 -0
- package/dist/advance-loop-driver.js +437 -0
- package/dist/advance-loop-driver.js.map +1 -0
- package/dist/advance-treeless-publish.d.ts +108 -0
- package/dist/advance-treeless-publish.d.ts.map +1 -0
- package/dist/advance-treeless-publish.js +71 -0
- package/dist/advance-treeless-publish.js.map +1 -0
- package/dist/advance.d.ts +340 -0
- package/dist/advance.d.ts.map +1 -0
- package/dist/advance.js +1122 -0
- package/dist/advance.js.map +1 -0
- package/dist/advancing-lock.d.ts +294 -0
- package/dist/advancing-lock.d.ts.map +1 -0
- package/dist/advancing-lock.js +594 -0
- package/dist/advancing-lock.js.map +1 -0
- package/dist/agent-launch.d.ts +79 -0
- package/dist/agent-launch.d.ts.map +1 -0
- package/dist/agent-launch.js +61 -0
- package/dist/agent-launch.js.map +1 -0
- package/dist/agent-stop.d.ts +149 -0
- package/dist/agent-stop.d.ts.map +1 -0
- package/dist/agent-stop.js +307 -0
- package/dist/agent-stop.js.map +1 -0
- package/dist/apply-decide.d.ts +127 -0
- package/dist/apply-decide.d.ts.map +1 -0
- package/dist/apply-decide.js +176 -0
- package/dist/apply-decide.js.map +1 -0
- package/dist/apply-merge-action.d.ts +206 -0
- package/dist/apply-merge-action.d.ts.map +1 -0
- package/dist/apply-merge-action.js +307 -0
- package/dist/apply-merge-action.js.map +1 -0
- package/dist/apply-persist.d.ts +174 -0
- package/dist/apply-persist.d.ts.map +1 -0
- package/dist/apply-persist.js +359 -0
- package/dist/apply-persist.js.map +1 -0
- package/dist/arbiter.d.ts +120 -0
- package/dist/arbiter.d.ts.map +1 -0
- package/dist/arbiter.js +255 -0
- package/dist/arbiter.js.map +1 -0
- package/dist/brand.d.ts +70 -0
- package/dist/brand.d.ts.map +1 -0
- package/dist/brand.js +84 -0
- package/dist/brand.js.map +1 -0
- package/dist/buildable-body.d.ts +132 -0
- package/dist/buildable-body.d.ts.map +1 -0
- package/dist/buildable-body.js +131 -0
- package/dist/buildable-body.js.map +1 -0
- package/dist/categorise.d.ts +66 -0
- package/dist/categorise.d.ts.map +1 -0
- package/dist/categorise.js +106 -0
- package/dist/categorise.js.map +1 -0
- package/dist/claim-cas.d.ts +117 -0
- package/dist/claim-cas.d.ts.map +1 -0
- package/dist/claim-cas.js +312 -0
- package/dist/claim-cas.js.map +1 -0
- package/dist/cli-spinner.d.ts +112 -0
- package/dist/cli-spinner.d.ts.map +1 -0
- package/dist/cli-spinner.js +157 -0
- package/dist/cli-spinner.js.map +1 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +3094 -0
- package/dist/cli.js.map +1 -0
- package/dist/close-job-template.d.ts +70 -0
- package/dist/close-job-template.d.ts.map +1 -0
- package/dist/close-job-template.js +180 -0
- package/dist/close-job-template.js.map +1 -0
- package/dist/close-job.d.ts +95 -0
- package/dist/close-job.d.ts.map +1 -0
- package/dist/close-job.js +226 -0
- package/dist/close-job.js.map +1 -0
- package/dist/complete.d.ts +361 -0
- package/dist/complete.d.ts.map +1 -0
- package/dist/complete.js +885 -0
- package/dist/complete.js.map +1 -0
- package/dist/concurrency.d.ts +68 -0
- package/dist/concurrency.d.ts.map +1 -0
- package/dist/concurrency.js +112 -0
- package/dist/concurrency.js.map +1 -0
- package/dist/config-override.d.ts +76 -0
- package/dist/config-override.d.ts.map +1 -0
- package/dist/config-override.js +50 -0
- package/dist/config-override.js.map +1 -0
- package/dist/config.d.ts +668 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +241 -0
- package/dist/config.js.map +1 -0
- package/dist/continue-branch.d.ts +249 -0
- package/dist/continue-branch.d.ts.map +1 -0
- package/dist/continue-branch.js +389 -0
- package/dist/continue-branch.js.map +1 -0
- package/dist/cwd-section.d.ts +186 -0
- package/dist/cwd-section.d.ts.map +1 -0
- package/dist/cwd-section.js +209 -0
- package/dist/cwd-section.js.map +1 -0
- package/dist/decision-engine.d.ts +170 -0
- package/dist/decision-engine.d.ts.map +1 -0
- package/dist/decision-engine.js +136 -0
- package/dist/decision-engine.js.map +1 -0
- package/dist/detect.d.ts +17 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +118 -0
- package/dist/detect.js.map +1 -0
- package/dist/do-autopick.d.ts +85 -0
- package/dist/do-autopick.d.ts.map +1 -0
- package/dist/do-autopick.js +112 -0
- package/dist/do-autopick.js.map +1 -0
- package/dist/do-config.d.ts +312 -0
- package/dist/do-config.d.ts.map +1 -0
- package/dist/do-config.js +358 -0
- package/dist/do-config.js.map +1 -0
- package/dist/do-remote-auto.d.ts +75 -0
- package/dist/do-remote-auto.d.ts.map +1 -0
- package/dist/do-remote-auto.js +111 -0
- package/dist/do-remote-auto.js.map +1 -0
- package/dist/do.d.ts +621 -0
- package/dist/do.d.ts.map +1 -0
- package/dist/do.js +1882 -0
- package/dist/do.js.map +1 -0
- package/dist/drop-source.d.ts +96 -0
- package/dist/drop-source.d.ts.map +1 -0
- package/dist/drop-source.js +91 -0
- package/dist/drop-source.js.map +1 -0
- package/dist/eligibility.d.ts +46 -0
- package/dist/eligibility.d.ts.map +1 -0
- package/dist/eligibility.js +34 -0
- package/dist/eligibility.js.map +1 -0
- package/dist/env-config.d.ts +51 -0
- package/dist/env-config.d.ts.map +1 -0
- package/dist/env-config.js +272 -0
- package/dist/env-config.js.map +1 -0
- package/dist/failure-cause.d.ts +70 -0
- package/dist/failure-cause.d.ts.map +1 -0
- package/dist/failure-cause.js +126 -0
- package/dist/failure-cause.js.map +1 -0
- package/dist/format.d.ts +43 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +256 -0
- package/dist/format.js.map +1 -0
- package/dist/frontmatter.d.ts +215 -0
- package/dist/frontmatter.d.ts.map +1 -0
- package/dist/frontmatter.js +345 -0
- package/dist/frontmatter.js.map +1 -0
- package/dist/gate-readiness.d.ts +84 -0
- package/dist/gate-readiness.d.ts.map +1 -0
- package/dist/gate-readiness.js +103 -0
- package/dist/gate-readiness.js.map +1 -0
- package/dist/gc.d.ts +165 -0
- package/dist/gc.d.ts.map +1 -0
- package/dist/gc.js +313 -0
- package/dist/gc.js.map +1 -0
- package/dist/gh-failure.d.ts +42 -0
- package/dist/gh-failure.d.ts.map +1 -0
- package/dist/gh-failure.js +49 -0
- package/dist/gh-failure.js.map +1 -0
- package/dist/git.d.ts +75 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +130 -0
- package/dist/git.js.map +1 -0
- package/dist/github.d.ts +187 -0
- package/dist/github.d.ts.map +1 -0
- package/dist/github.js +343 -0
- package/dist/github.js.map +1 -0
- package/dist/harness.d.ts +242 -0
- package/dist/harness.d.ts.map +1 -0
- package/dist/harness.js +157 -0
- package/dist/harness.js.map +1 -0
- package/dist/identity.d.ts +167 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +231 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +147 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/install-ci-branch-protection.d.ts +147 -0
- package/dist/install-ci-branch-protection.d.ts.map +1 -0
- package/dist/install-ci-branch-protection.js +166 -0
- package/dist/install-ci-branch-protection.js.map +1 -0
- package/dist/install-ci-capabilities/advance-lifecycle.d.ts +15 -0
- package/dist/install-ci-capabilities/advance-lifecycle.d.ts.map +1 -0
- package/dist/install-ci-capabilities/advance-lifecycle.js +28 -0
- package/dist/install-ci-capabilities/advance-lifecycle.js.map +1 -0
- package/dist/install-ci-capabilities/close-job.d.ts +13 -0
- package/dist/install-ci-capabilities/close-job.d.ts.map +1 -0
- package/dist/install-ci-capabilities/close-job.js +26 -0
- package/dist/install-ci-capabilities/close-job.js.map +1 -0
- package/dist/install-ci-capabilities/example-noop.d.ts +16 -0
- package/dist/install-ci-capabilities/example-noop.d.ts.map +1 -0
- package/dist/install-ci-capabilities/example-noop.js +23 -0
- package/dist/install-ci-capabilities/example-noop.js.map +1 -0
- package/dist/install-ci-capabilities/intake.d.ts +15 -0
- package/dist/install-ci-capabilities/intake.d.ts.map +1 -0
- package/dist/install-ci-capabilities/intake.js +28 -0
- package/dist/install-ci-capabilities/intake.js.map +1 -0
- package/dist/install-ci-capabilities/verify.d.ts +14 -0
- package/dist/install-ci-capabilities/verify.d.ts.map +1 -0
- package/dist/install-ci-capabilities/verify.js +27 -0
- package/dist/install-ci-capabilities/verify.js.map +1 -0
- package/dist/install-ci-core.d.ts +446 -0
- package/dist/install-ci-core.d.ts.map +1 -0
- package/dist/install-ci-core.js +760 -0
- package/dist/install-ci-core.js.map +1 -0
- package/dist/install-ci-github.d.ts +167 -0
- package/dist/install-ci-github.d.ts.map +1 -0
- package/dist/install-ci-github.js +315 -0
- package/dist/install-ci-github.js.map +1 -0
- package/dist/install-ci.d.ts +105 -0
- package/dist/install-ci.d.ts.map +1 -0
- package/dist/install-ci.js +363 -0
- package/dist/install-ci.js.map +1 -0
- package/dist/intake-event.d.ts +88 -0
- package/dist/intake-event.d.ts.map +1 -0
- package/dist/intake-event.js +66 -0
- package/dist/intake-event.js.map +1 -0
- package/dist/intake-marker.d.ts +95 -0
- package/dist/intake-marker.d.ts.map +1 -0
- package/dist/intake-marker.js +127 -0
- package/dist/intake-marker.js.map +1 -0
- package/dist/intake-triage.d.ts +48 -0
- package/dist/intake-triage.d.ts.map +1 -0
- package/dist/intake-triage.js +95 -0
- package/dist/intake-triage.js.map +1 -0
- package/dist/intake-trigger-template.d.ts +185 -0
- package/dist/intake-trigger-template.d.ts.map +1 -0
- package/dist/intake-trigger-template.js +449 -0
- package/dist/intake-trigger-template.js.map +1 -0
- package/dist/intake.d.ts +569 -0
- package/dist/intake.d.ts.map +1 -0
- package/dist/intake.js +1628 -0
- package/dist/intake.js.map +1 -0
- package/dist/integration-core.d.ts +539 -0
- package/dist/integration-core.d.ts.map +1 -0
- package/dist/integration-core.js +2195 -0
- package/dist/integration-core.js.map +1 -0
- package/dist/integrator.d.ts +343 -0
- package/dist/integrator.d.ts.map +1 -0
- package/dist/integrator.js +400 -0
- package/dist/integrator.js.map +1 -0
- package/dist/isolation.d.ts +219 -0
- package/dist/isolation.d.ts.map +1 -0
- package/dist/isolation.js +261 -0
- package/dist/isolation.js.map +1 -0
- package/dist/issue-provider.d.ts +349 -0
- package/dist/issue-provider.d.ts.map +1 -0
- package/dist/issue-provider.js +360 -0
- package/dist/issue-provider.js.map +1 -0
- package/dist/item-lock.d.ts +626 -0
- package/dist/item-lock.d.ts.map +1 -0
- package/dist/item-lock.js +1381 -0
- package/dist/item-lock.js.map +1 -0
- package/dist/item-path.d.ts +49 -0
- package/dist/item-path.d.ts.map +1 -0
- package/dist/item-path.js +66 -0
- package/dist/item-path.js.map +1 -0
- package/dist/ledger-lint.d.ts +129 -0
- package/dist/ledger-lint.d.ts.map +1 -0
- package/dist/ledger-lint.js +249 -0
- package/dist/ledger-lint.js.map +1 -0
- package/dist/ledger-read.d.ts +357 -0
- package/dist/ledger-read.d.ts.map +1 -0
- package/dist/ledger-read.js +442 -0
- package/dist/ledger-read.js.map +1 -0
- package/dist/ledger-write.d.ts +330 -0
- package/dist/ledger-write.d.ts.map +1 -0
- package/dist/ledger-write.js +411 -0
- package/dist/ledger-write.js.map +1 -0
- package/dist/lifecycle-gather.d.ts +30 -0
- package/dist/lifecycle-gather.d.ts.map +1 -0
- package/dist/lifecycle-gather.js +205 -0
- package/dist/lifecycle-gather.js.map +1 -0
- package/dist/lifecycle-pools.d.ts +180 -0
- package/dist/lifecycle-pools.d.ts.map +1 -0
- package/dist/lifecycle-pools.js +78 -0
- package/dist/lifecycle-pools.js.map +1 -0
- package/dist/merge-question-surfacer.d.ts +166 -0
- package/dist/merge-question-surfacer.d.ts.map +1 -0
- package/dist/merge-question-surfacer.js +297 -0
- package/dist/merge-question-surfacer.js.map +1 -0
- package/dist/mint-adr.d.ts +126 -0
- package/dist/mint-adr.d.ts.map +1 -0
- package/dist/mint-adr.js +257 -0
- package/dist/mint-adr.js.map +1 -0
- package/dist/mirror-pool-scan.d.ts +125 -0
- package/dist/mirror-pool-scan.d.ts.map +1 -0
- package/dist/mirror-pool-scan.js +104 -0
- package/dist/mirror-pool-scan.js.map +1 -0
- package/dist/needs-attention.d.ts +341 -0
- package/dist/needs-attention.d.ts.map +1 -0
- package/dist/needs-attention.js +900 -0
- package/dist/needs-attention.js.map +1 -0
- package/dist/orphan-sidecar.d.ts +79 -0
- package/dist/orphan-sidecar.d.ts.map +1 -0
- package/dist/orphan-sidecar.js +71 -0
- package/dist/orphan-sidecar.js.map +1 -0
- package/dist/output.d.ts +48 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +66 -0
- package/dist/output.js.map +1 -0
- package/dist/pi-harness.d.ts +179 -0
- package/dist/pi-harness.d.ts.map +1 -0
- package/dist/pi-harness.js +342 -0
- package/dist/pi-harness.js.map +1 -0
- package/dist/placement.d.ts +99 -0
- package/dist/placement.d.ts.map +1 -0
- package/dist/placement.js +67 -0
- package/dist/placement.js.map +1 -0
- package/dist/prd-to-spec.d.ts +315 -0
- package/dist/prd-to-spec.d.ts.map +1 -0
- package/dist/prd-to-spec.js +684 -0
- package/dist/prd-to-spec.js.map +1 -0
- package/dist/prepare.d.ts +121 -0
- package/dist/prepare.d.ts.map +1 -0
- package/dist/prepare.js +140 -0
- package/dist/prepare.js.map +1 -0
- package/dist/prompt.d.ts +360 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +499 -0
- package/dist/prompt.js.map +1 -0
- package/dist/protocol/ADR-FORMAT.md +47 -0
- package/dist/protocol/CLAIM-PROTOCOL.md +217 -0
- package/dist/protocol/REVIEW-PROTOCOL.md +119 -0
- package/dist/protocol/SURFACE-PROTOCOL.md +121 -0
- package/dist/protocol/TASKING-PROTOCOL.md +122 -0
- package/dist/protocol/WORK-CONTRACT.md +276 -0
- package/dist/protocol/spec-template.md +71 -0
- package/dist/protocol/task-template.md +65 -0
- package/dist/readiness.d.ts +66 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +36 -0
- package/dist/readiness.js.map +1 -0
- package/dist/reap-branches.d.ts +102 -0
- package/dist/reap-branches.d.ts.map +1 -0
- package/dist/reap-branches.js +149 -0
- package/dist/reap-branches.js.map +1 -0
- package/dist/recover-isolated.d.ts +72 -0
- package/dist/recover-isolated.d.ts.map +1 -0
- package/dist/recover-isolated.js +188 -0
- package/dist/recover-isolated.js.map +1 -0
- package/dist/registry.d.ts +172 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +296 -0
- package/dist/registry.js.map +1 -0
- package/dist/repo-config.d.ts +201 -0
- package/dist/repo-config.d.ts.map +1 -0
- package/dist/repo-config.js +414 -0
- package/dist/repo-config.js.map +1 -0
- package/dist/repo-key.d.ts +20 -0
- package/dist/repo-key.d.ts.map +1 -0
- package/dist/repo-key.js +68 -0
- package/dist/repo-key.js.map +1 -0
- package/dist/repo-mirror.d.ts +177 -0
- package/dist/repo-mirror.d.ts.map +1 -0
- package/dist/repo-mirror.js +271 -0
- package/dist/repo-mirror.js.map +1 -0
- package/dist/retry-backoff.d.ts +90 -0
- package/dist/retry-backoff.d.ts.map +1 -0
- package/dist/retry-backoff.js +98 -0
- package/dist/retry-backoff.js.map +1 -0
- package/dist/review-gate.d.ts +173 -0
- package/dist/review-gate.d.ts.map +1 -0
- package/dist/review-gate.js +261 -0
- package/dist/review-gate.js.map +1 -0
- package/dist/review-verdict.d.ts +149 -0
- package/dist/review-verdict.d.ts.map +1 -0
- package/dist/review-verdict.js +332 -0
- package/dist/review-verdict.js.map +1 -0
- package/dist/run.d.ts +221 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +963 -0
- package/dist/run.js.map +1 -0
- package/dist/scan.d.ts +308 -0
- package/dist/scan.d.ts.map +1 -0
- package/dist/scan.js +374 -0
- package/dist/scan.js.map +1 -0
- package/dist/select-order.d.ts +75 -0
- package/dist/select-order.d.ts.map +1 -0
- package/dist/select-order.js +108 -0
- package/dist/select-order.js.map +1 -0
- package/dist/select-priority.d.ts +188 -0
- package/dist/select-priority.d.ts.map +1 -0
- package/dist/select-priority.js +80 -0
- package/dist/select-priority.js.map +1 -0
- package/dist/select.d.ts +25 -0
- package/dist/select.d.ts.map +1 -0
- package/dist/select.js +43 -0
- package/dist/select.js.map +1 -0
- package/dist/session-path.d.ts +36 -0
- package/dist/session-path.d.ts.map +1 -0
- package/dist/session-path.js +129 -0
- package/dist/session-path.js.map +1 -0
- package/dist/sidecar-apply.d.ts +83 -0
- package/dist/sidecar-apply.d.ts.map +1 -0
- package/dist/sidecar-apply.js +111 -0
- package/dist/sidecar-apply.js.map +1 -0
- package/dist/sidecar.d.ts +245 -0
- package/dist/sidecar.d.ts.map +1 -0
- package/dist/sidecar.js +481 -0
- package/dist/sidecar.js.map +1 -0
- package/dist/slug-namespace.d.ts +204 -0
- package/dist/slug-namespace.d.ts.map +1 -0
- package/dist/slug-namespace.js +229 -0
- package/dist/slug-namespace.js.map +1 -0
- package/dist/spec-complete.d.ts +44 -0
- package/dist/spec-complete.d.ts.map +1 -0
- package/dist/spec-complete.js +69 -0
- package/dist/spec-complete.js.map +1 -0
- package/dist/start.d.ts +97 -0
- package/dist/start.d.ts.map +1 -0
- package/dist/start.js +633 -0
- package/dist/start.js.map +1 -0
- package/dist/status.d.ts +199 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +228 -0
- package/dist/status.js.map +1 -0
- package/dist/surface-gate.d.ts +162 -0
- package/dist/surface-gate.d.ts.map +1 -0
- package/dist/surface-gate.js +206 -0
- package/dist/surface-gate.js.map +1 -0
- package/dist/surface-persist.d.ts +86 -0
- package/dist/surface-persist.d.ts.map +1 -0
- package/dist/surface-persist.js +129 -0
- package/dist/surface-persist.js.map +1 -0
- package/dist/tasker-review-loop.d.ts +249 -0
- package/dist/tasker-review-loop.d.ts.map +1 -0
- package/dist/tasker-review-loop.js +369 -0
- package/dist/tasker-review-loop.js.map +1 -0
- package/dist/tasking-eligibility.d.ts +74 -0
- package/dist/tasking-eligibility.d.ts.map +1 -0
- package/dist/tasking-eligibility.js +52 -0
- package/dist/tasking-eligibility.js.map +1 -0
- package/dist/tasking-lock.d.ts +111 -0
- package/dist/tasking-lock.d.ts.map +1 -0
- package/dist/tasking-lock.js +256 -0
- package/dist/tasking-lock.js.map +1 -0
- package/dist/tasking.d.ts +275 -0
- package/dist/tasking.d.ts.map +1 -0
- package/dist/tasking.js +952 -0
- package/dist/tasking.js.map +1 -0
- package/dist/triage-gate.d.ts +127 -0
- package/dist/triage-gate.d.ts.map +1 -0
- package/dist/triage-gate.js +139 -0
- package/dist/triage-gate.js.map +1 -0
- package/dist/triage-persist.d.ts +163 -0
- package/dist/triage-persist.d.ts.map +1 -0
- package/dist/triage-persist.js +387 -0
- package/dist/triage-persist.js.map +1 -0
- package/dist/verdict-json.d.ts +32 -0
- package/dist/verdict-json.d.ts.map +1 -0
- package/dist/verdict-json.js +74 -0
- package/dist/verdict-json.js.map +1 -0
- package/dist/verify-workflow-template.d.ts +60 -0
- package/dist/verify-workflow-template.d.ts.map +1 -0
- package/dist/verify-workflow-template.js +126 -0
- package/dist/verify-workflow-template.js.map +1 -0
- package/dist/verify.d.ts +60 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +62 -0
- package/dist/verify.js.map +1 -0
- package/dist/watch-session.d.ts +112 -0
- package/dist/watch-session.d.ts.map +1 -0
- package/dist/watch-session.js +347 -0
- package/dist/watch-session.js.map +1 -0
- package/dist/work-layout.d.ts +198 -0
- package/dist/work-layout.d.ts.map +1 -0
- package/dist/work-layout.js +217 -0
- package/dist/work-layout.js.map +1 -0
- package/dist/work-on.d.ts +154 -0
- package/dist/work-on.d.ts.map +1 -0
- package/dist/work-on.js +387 -0
- package/dist/work-on.js.map +1 -0
- package/dist/workspace.d.ts +224 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +325 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +46 -2
- package/src/advance-ci-template.ts +203 -0
- package/src/advance-classify.ts +197 -0
- package/src/advance-drivers.ts +414 -0
- package/src/advance-isolated.ts +432 -0
- package/src/advance-lifecycle-template.ts +791 -0
- package/src/advance-loop-driver.ts +745 -0
- package/src/advance-treeless-publish.ts +177 -0
- package/src/advance.ts +1564 -0
- package/src/advancing-lock.ts +988 -0
- package/src/agent-launch.ts +137 -0
- package/src/agent-stop.ts +361 -0
- package/src/apply-decide.ts +242 -0
- package/src/apply-merge-action.ts +502 -0
- package/src/apply-persist.ts +518 -0
- package/src/arbiter.ts +372 -0
- package/src/brand.ts +111 -0
- package/src/buildable-body.ts +196 -0
- package/src/categorise.ts +158 -0
- package/src/claim-cas.ts +513 -0
- package/src/cli-spinner.ts +225 -0
- package/src/cli.ts +4369 -0
- package/src/close-job-template.ts +236 -0
- package/src/close-job.ts +319 -0
- package/src/complete.ts +1379 -0
- package/src/concurrency.ts +151 -0
- package/src/config-override.ts +116 -0
- package/src/config.ts +883 -0
- package/src/continue-branch.ts +542 -0
- package/src/cwd-section.ts +392 -0
- package/src/decision-engine.ts +272 -0
- package/src/detect.ts +124 -0
- package/src/do-autopick.ts +223 -0
- package/src/do-config.ts +589 -0
- package/src/do-remote-auto.ts +197 -0
- package/src/do.ts +2623 -0
- package/src/drop-source.ts +194 -0
- package/src/eligibility.ts +79 -0
- package/src/env-config.ts +305 -0
- package/src/failure-cause.ts +142 -0
- package/src/format.ts +313 -0
- package/src/frontmatter.ts +485 -0
- package/src/gate-readiness.ts +147 -0
- package/src/gc.ts +510 -0
- package/src/gh-failure.ts +53 -0
- package/src/git.ts +186 -0
- package/src/github.ts +468 -0
- package/src/harness.ts +355 -0
- package/src/identity.ts +322 -0
- package/src/index.ts +785 -0
- package/src/install-ci-branch-protection.ts +255 -0
- package/src/install-ci-capabilities/advance-lifecycle.ts +34 -0
- package/src/install-ci-capabilities/close-job.ts +32 -0
- package/src/install-ci-capabilities/example-noop.ts +24 -0
- package/src/install-ci-capabilities/intake.ts +34 -0
- package/src/install-ci-capabilities/verify.ts +33 -0
- package/src/install-ci-core.ts +1088 -0
- package/src/install-ci-github.ts +376 -0
- package/src/install-ci.ts +552 -0
- package/src/intake-event.ts +102 -0
- package/src/intake-marker.ts +195 -0
- package/src/intake-triage.ts +138 -0
- package/src/intake-trigger-template.ts +591 -0
- package/src/intake.ts +2445 -0
- package/src/integration-core.ts +3065 -0
- package/src/integrator.ts +771 -0
- package/src/isolation.ts +484 -0
- package/src/issue-provider.ts +733 -0
- package/src/item-lock.ts +1858 -0
- package/src/item-path.ts +75 -0
- package/src/ledger-lint.ts +332 -0
- package/src/ledger-read.ts +924 -0
- package/src/ledger-write.ts +865 -0
- package/src/lifecycle-gather.ts +298 -0
- package/src/lifecycle-pools.ts +250 -0
- package/src/merge-question-surfacer.ts +496 -0
- package/src/mint-adr.ts +362 -0
- package/src/mirror-pool-scan.ts +240 -0
- package/src/needs-attention.ts +1506 -0
- package/src/orphan-sidecar.ts +150 -0
- package/src/output.ts +89 -0
- package/src/pi-harness.ts +403 -0
- package/src/placement.ts +131 -0
- package/src/prd-to-spec.ts +1023 -0
- package/src/prepare.ts +230 -0
- package/src/prompt.ts +760 -0
- package/src/readiness.ts +98 -0
- package/src/reap-branches.ts +278 -0
- package/src/recover-isolated.ts +276 -0
- package/src/registry.ts +475 -0
- package/src/repo-config.ts +550 -0
- package/src/repo-key.ts +74 -0
- package/src/repo-mirror.ts +367 -0
- package/src/retry-backoff.ts +130 -0
- package/src/review-gate.ts +389 -0
- package/src/review-verdict.ts +422 -0
- package/src/run.ts +1430 -0
- package/src/scan.ts +611 -0
- package/src/select-order.ts +143 -0
- package/src/select-priority.ts +266 -0
- package/src/select.ts +62 -0
- package/src/session-path.ts +153 -0
- package/src/sidecar-apply.ts +216 -0
- package/src/sidecar.ts +700 -0
- package/src/slug-namespace.ts +367 -0
- package/src/spec-complete.ts +118 -0
- package/src/start.ts +974 -0
- package/src/status.ts +441 -0
- package/src/surface-gate.ts +337 -0
- package/src/surface-persist.ts +241 -0
- package/src/tasker-review-loop.ts +671 -0
- package/src/tasking-eligibility.ts +114 -0
- package/src/tasking-lock.ts +416 -0
- package/src/tasking.ts +1438 -0
- package/src/triage-gate.ts +248 -0
- package/src/triage-persist.ts +570 -0
- package/src/verdict-json.ts +73 -0
- package/src/verify-workflow-template.ts +159 -0
- package/src/verify.ts +123 -0
- package/src/watch-session.ts +397 -0
- package/src/work-layout.ts +262 -0
- package/src/work-on.ts +660 -0
- package/src/workspace.ts +502 -0
package/dist/gc.d.ts
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { type JobRecord } from './workspace.js';
|
|
2
|
+
/**
|
|
3
|
+
* Why a job's worktree was retained (not provably safe to remove). The reaper
|
|
4
|
+
* surfaces exactly one of these per retained job (the FIRST failing clause, in
|
|
5
|
+
* predicate order: dirty tree dominates, then arbiter-reachability).
|
|
6
|
+
*/
|
|
7
|
+
export type RetainReason = 'dirty-tree' | 'unmerged-commits' | 'branch-not-pushed';
|
|
8
|
+
/** Human-readable text for each retain reason (used in `gc` reports). */
|
|
9
|
+
export declare const RETAIN_REASON_TEXT: Record<RetainReason, string>;
|
|
10
|
+
/** How a job's branch tip is reachable on the arbiter (when it is). */
|
|
11
|
+
export type ReachableVia = 'merged' | 'pushed';
|
|
12
|
+
/** The result of applying the deletion-safety predicate to one job worktree. */
|
|
13
|
+
export interface SafetyVerdict {
|
|
14
|
+
/** True iff the worktree is provably safe to remove (clean AND reachable). */
|
|
15
|
+
safe: boolean;
|
|
16
|
+
/** When `safe`, HOW the tip is reachable on the arbiter. */
|
|
17
|
+
reachableVia?: ReachableVia;
|
|
18
|
+
/** When NOT `safe`, why it was retained. */
|
|
19
|
+
reason?: RetainReason;
|
|
20
|
+
}
|
|
21
|
+
export interface EvaluateSafetyInput {
|
|
22
|
+
/** The job worktree directory to evaluate. */
|
|
23
|
+
dir: string;
|
|
24
|
+
/** The work branch checked out there (`work/<slug>`). */
|
|
25
|
+
branch: string;
|
|
26
|
+
/**
|
|
27
|
+
* The arbiter remote name valid inside the worktree. Defaults to `origin`
|
|
28
|
+
* (the bare hub mirror's clone remote — ADR §2). Tests with a different
|
|
29
|
+
* layout can override it.
|
|
30
|
+
*/
|
|
31
|
+
arbiter?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Drop the CLEAN-TREE half of the predicate, keeping ONLY the
|
|
34
|
+
* reachable-on-arbiter half. A worktree whose durable branch is provably on
|
|
35
|
+
* the arbiter is then safe to reap EVEN WHEN its tree has incidental churn
|
|
36
|
+
* (uncommitted doc-churn / artefacts) — because the durable artefact is the
|
|
37
|
+
* PUSHED branch, not the worktree files.
|
|
38
|
+
*
|
|
39
|
+
* Scoped, deliberate opt-in for the FAILURE-return path of `performDoRemote`,
|
|
40
|
+
* where the needs-attention seam has ALREADY surfaced the item + pushed the
|
|
41
|
+
* branch, so we KNOW the work is safe. The reachability half is NEVER dropped
|
|
42
|
+
* (we never reap work not yet on the arbiter — never lose work). The default
|
|
43
|
+
* (`false`) keeps the full clean-AND-reachable predicate the clean-completion
|
|
44
|
+
* path and `gc`'s default sweep use unchanged.
|
|
45
|
+
*/
|
|
46
|
+
reachableOnly?: boolean;
|
|
47
|
+
env?: NodeJS.ProcessEnv;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Apply the provably-safe deletion predicate (ADR §4) to ONE job worktree:
|
|
51
|
+
*
|
|
52
|
+
* 1. the working tree must be **clean** (no uncommitted changes), AND
|
|
53
|
+
* 2. the branch tip must be **reachable on the arbiter** — merged
|
|
54
|
+
* (`merge-base --is-ancestor <tip> <arbiter>/main`) OR pushed
|
|
55
|
+
* (`<arbiter>/<branch>` tip == local tip).
|
|
56
|
+
*
|
|
57
|
+
* Reaches out to the arbiter (a `git fetch`) so the remote-tracking refs reflect
|
|
58
|
+
* the live arbiter before checking reachability. Never mutates the worktree.
|
|
59
|
+
* Pure verdict — the caller decides whether to reap.
|
|
60
|
+
*/
|
|
61
|
+
export declare function evaluateDeletionSafety(input: EvaluateSafetyInput): SafetyVerdict;
|
|
62
|
+
export interface ReapInput extends EvaluateSafetyInput {
|
|
63
|
+
/**
|
|
64
|
+
* The bare hub mirror the worktree was cut from. `git worktree remove` +
|
|
65
|
+
* `prune` are run there (the worktree's registration lives on the mirror).
|
|
66
|
+
*/
|
|
67
|
+
mirrorPath: string;
|
|
68
|
+
/**
|
|
69
|
+
* Override the predicate: remove the worktree even when NOT provably safe
|
|
70
|
+
* (discard un-saved work). Loud + explicit — NEVER the default (ADR §4).
|
|
71
|
+
*/
|
|
72
|
+
force?: boolean;
|
|
73
|
+
}
|
|
74
|
+
export interface ReapResult {
|
|
75
|
+
/** True iff the worktree was actually removed. */
|
|
76
|
+
removed: boolean;
|
|
77
|
+
/** The verdict the decision was based on. */
|
|
78
|
+
verdict: SafetyVerdict;
|
|
79
|
+
/** True iff removal happened only because `force` overrode the predicate. */
|
|
80
|
+
forced: boolean;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Auto-reap ONE job worktree iff the predicate holds (or `force` overrides):
|
|
84
|
+
* `git worktree remove` then `git worktree prune` on the hub mirror — NEVER a
|
|
85
|
+
* bare `rm -rf` (ADR §4). Returns whether it removed the worktree + the verdict
|
|
86
|
+
* it acted on (so the caller can report a retained job's reason).
|
|
87
|
+
*
|
|
88
|
+
* Used at end-of-job (the runner calls it after integrating) and by `gc` (the
|
|
89
|
+
* catch-up when auto-reap didn't run). A job whose work is NOT on the arbiter is
|
|
90
|
+
* never removed here (force is the only override, and it is explicit).
|
|
91
|
+
*/
|
|
92
|
+
export declare function reapJob(input: ReapInput): ReapResult;
|
|
93
|
+
/** One job the `gc` sweep evaluated. */
|
|
94
|
+
export interface GcJob {
|
|
95
|
+
/** Absolute path to the job worktree. */
|
|
96
|
+
dir: string;
|
|
97
|
+
/** The work slug (from the record, else derived from the dir name). */
|
|
98
|
+
slug: string;
|
|
99
|
+
/** The work branch (`work/<slug>`). */
|
|
100
|
+
branch: string;
|
|
101
|
+
/** The per-job record, when present. */
|
|
102
|
+
record?: JobRecord;
|
|
103
|
+
}
|
|
104
|
+
/** A worktree `gc` reaped (provably safe, or forced). */
|
|
105
|
+
export interface ReapedJob extends GcJob {
|
|
106
|
+
verdict: SafetyVerdict;
|
|
107
|
+
/** True iff removed only because `--force` overrode the predicate. */
|
|
108
|
+
forced: boolean;
|
|
109
|
+
}
|
|
110
|
+
/** A worktree `gc` retained, with the human-readable reason it kept it. */
|
|
111
|
+
export interface RetainedJob extends GcJob {
|
|
112
|
+
reason: RetainReason;
|
|
113
|
+
/** Human-readable reason text (`RETAIN_REASON_TEXT[reason]`). */
|
|
114
|
+
reasonText: string;
|
|
115
|
+
}
|
|
116
|
+
export interface GcOptions {
|
|
117
|
+
/** The execution working area (config `workspacesDir`, default `~/.dorfl`). */
|
|
118
|
+
workspacesDir: string;
|
|
119
|
+
/**
|
|
120
|
+
* Override the predicate for EVERY job: discard un-saved work. Loud +
|
|
121
|
+
* explicit (the CLI guards it behind a confirmation) — NEVER the default.
|
|
122
|
+
*/
|
|
123
|
+
force?: boolean;
|
|
124
|
+
/** Sink for human-readable progress notes (per reaped / retained job). */
|
|
125
|
+
note?: (message: string) => void;
|
|
126
|
+
env?: NodeJS.ProcessEnv;
|
|
127
|
+
}
|
|
128
|
+
export interface GcResult {
|
|
129
|
+
/** The worktrees reaped this sweep (provably safe, or forced). */
|
|
130
|
+
reaped: ReapedJob[];
|
|
131
|
+
/** The worktrees retained, each with a clear reason. */
|
|
132
|
+
retained: RetainedJob[];
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Re-apply the deletion-safety predicate across every `<workspacesDir>/work/*`
|
|
136
|
+
* job (ADR §4): reap the provably-safe ones, RETAIN the rest and report each
|
|
137
|
+
* with a clear reason. This is the safety-net catch-up for when auto-reap didn't
|
|
138
|
+
* run (a runner crash/kill left the worktree behind).
|
|
139
|
+
*
|
|
140
|
+
* `force: true` overrides the predicate for every job (discard un-saved work) —
|
|
141
|
+
* loud + explicit (the CLI confirms first), NEVER the default. A job whose work
|
|
142
|
+
* is NOT on the arbiter is never auto-removed without `force`.
|
|
143
|
+
*/
|
|
144
|
+
export declare function gc(options: GcOptions): GcResult;
|
|
145
|
+
/**
|
|
146
|
+
* Discover every job worktree under `<workspacesDir>/work/*` (the flat layout —
|
|
147
|
+
* ADR §2). The per-job record is a SIBLING of the worktree dir
|
|
148
|
+
* (`<work-id>.json` next to `<work-id>/`, {@link jobRecordPath}) — OUTSIDE the
|
|
149
|
+
* checked-out tree so it can never be swept into a commit — so a work-id dir is
|
|
150
|
+
* a job iff its sibling record file exists (with a LEGACY fallback to an in-tree
|
|
151
|
+
* record left by an old binary, via {@link readJobRecord}). The branch comes
|
|
152
|
+
* from the record (falling back to `work/<derived-slug>`).
|
|
153
|
+
*/
|
|
154
|
+
export declare function discoverJobs(workspacesDir: string): GcJob[];
|
|
155
|
+
/**
|
|
156
|
+
* True iff `ancestor` is an ancestor of (or equal to) `descendant`, both
|
|
157
|
+
* resolved IN the local repo `dir` (`git merge-base --is-ancestor`). This is the
|
|
158
|
+
* ONE provably-merged reachability predicate in the system: the worktree reaper
|
|
159
|
+
* above uses it for `<tip> --is-ancestor <arbiter>/main`, and the remote
|
|
160
|
+
* merged-branch sweep (`reap-branches.ts`) REUSES it (not a second predicate) to
|
|
161
|
+
* decide a remote `work/<slug>` branch is provably merged before deleting it.
|
|
162
|
+
* EXPORTED so that single source of truth is shared, never forked.
|
|
163
|
+
*/
|
|
164
|
+
export declare function isAncestor(dir: string, ancestor: string, descendant: string, env: NodeJS.ProcessEnv | undefined): boolean;
|
|
165
|
+
//# sourceMappingURL=gc.d.ts.map
|
package/dist/gc.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gc.d.ts","sourceRoot":"","sources":["../src/gc.ts"],"names":[],"mappings":"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"}
|
package/dist/gc.js
ADDED
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { existsSync, readdirSync, statSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { git, run } from './git.js';
|
|
4
|
+
import { JOB_RECORD_FILENAME, jobRecordPath, readJobRecord, removeJobRecord, } from './workspace.js';
|
|
5
|
+
import { workBranchRef } from './slug-namespace.js';
|
|
6
|
+
/**
|
|
7
|
+
* The **reaper** for job worktrees, governed by the **provably-safe deletion
|
|
8
|
+
* predicate** (ADR §4 in `docs/adr/execution-substrate-decisions.md`, the
|
|
9
|
+
* authoritative source). Split out of `agent-workspaces` so the substrate stays
|
|
10
|
+
* thin; this module owns deletion.
|
|
11
|
+
*
|
|
12
|
+
* A job's worktree is removed (auto, at end-of-job; or by `gc`) **iff**:
|
|
13
|
+
*
|
|
14
|
+
* 1. its working tree is **clean** (no uncommitted changes), AND
|
|
15
|
+
* 2. its branch tip is **reachable on the arbiter** — either merged into
|
|
16
|
+
* `<arbiter>/main` (`git merge-base --is-ancestor <tip> <arbiter>/main`),
|
|
17
|
+
* OR pushed as an up-to-date branch (`<arbiter>/<branch>` tip == local tip).
|
|
18
|
+
*
|
|
19
|
+
* Both hold ⇒ the worktree is genuinely redundant (reconstructible from the
|
|
20
|
+
* arbiter) ⇒ remove. Otherwise ⇒ **retain for the human** (a retained worktree
|
|
21
|
+
* is a reliable "needs attention" signal that dovetails with `watch`'s
|
|
22
|
+
* surface-failures rail).
|
|
23
|
+
*
|
|
24
|
+
* The trigger is **provable safety, not "success"**: a successful-but-unpushed
|
|
25
|
+
* job is retained; a job whose commits are on the arbiter is reaped. One rule,
|
|
26
|
+
* no done-vs-failed special-casing. Removal is always `git worktree remove`
|
|
27
|
+
* (+ prune), NEVER a bare `rm -rf` (which would leave a dangling worktree
|
|
28
|
+
* registration on the hub).
|
|
29
|
+
*
|
|
30
|
+
* `--force` overrides the predicate (discard un-saved work) — it must be loud
|
|
31
|
+
* and explicit, NEVER the default.
|
|
32
|
+
*/
|
|
33
|
+
/** The arbiter remote name valid INSIDE a job worktree (ADR §2: cut from the
|
|
34
|
+
* bare hub mirror whose clone remote is `origin`). */
|
|
35
|
+
const ARBITER_REMOTE = 'origin';
|
|
36
|
+
/** Human-readable text for each retain reason (used in `gc` reports). */
|
|
37
|
+
export const RETAIN_REASON_TEXT = {
|
|
38
|
+
'dirty-tree': 'dirty tree (uncommitted changes)',
|
|
39
|
+
'unmerged-commits': 'unmerged commits (branch tip not on the arbiter)',
|
|
40
|
+
'branch-not-pushed': 'branch not pushed (remote tip differs from local tip)',
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Apply the provably-safe deletion predicate (ADR §4) to ONE job worktree:
|
|
44
|
+
*
|
|
45
|
+
* 1. the working tree must be **clean** (no uncommitted changes), AND
|
|
46
|
+
* 2. the branch tip must be **reachable on the arbiter** — merged
|
|
47
|
+
* (`merge-base --is-ancestor <tip> <arbiter>/main`) OR pushed
|
|
48
|
+
* (`<arbiter>/<branch>` tip == local tip).
|
|
49
|
+
*
|
|
50
|
+
* Reaches out to the arbiter (a `git fetch`) so the remote-tracking refs reflect
|
|
51
|
+
* the live arbiter before checking reachability. Never mutates the worktree.
|
|
52
|
+
* Pure verdict — the caller decides whether to reap.
|
|
53
|
+
*/
|
|
54
|
+
export function evaluateDeletionSafety(input) {
|
|
55
|
+
const env = input.env;
|
|
56
|
+
const arbiter = input.arbiter ?? ARBITER_REMOTE;
|
|
57
|
+
// 1. Clean tree? Dirty dominates (we never reap over uncommitted work) —
|
|
58
|
+
// UNLESS `reachableOnly` was opted into (the failure path, where the branch
|
|
59
|
+
// is already pushed so the durable artefact is the branch, not the tree).
|
|
60
|
+
if (input.reachableOnly !== true && !isWorkingTreeClean(input.dir, env)) {
|
|
61
|
+
return { safe: false, reason: 'dirty-tree' };
|
|
62
|
+
}
|
|
63
|
+
// Refresh the arbiter's refs so reachability is checked against the LIVE
|
|
64
|
+
// arbiter (not a stale local mirror). A job worktree is cut from a bare hub
|
|
65
|
+
// mirror whose `origin` remote has NO fetch refspec (so `origin/main` /
|
|
66
|
+
// `origin/<branch>` would not otherwise resolve) — so we fetch the two refs
|
|
67
|
+
// we need EXPLICITLY into remote-tracking refs (the same technique
|
|
68
|
+
// `integrator.rebaseOntoArbiterMain` uses). A plain `git fetch origin` would
|
|
69
|
+
// instead try to clobber the checked-out branch on a mirror. Best-effort: an
|
|
70
|
+
// unreachable arbiter leaves the local refs in place and the predicate reads
|
|
71
|
+
// as not-reachable → retain (the safe direction).
|
|
72
|
+
fetchTracking(input.dir, arbiter, 'main', env);
|
|
73
|
+
fetchTracking(input.dir, arbiter, input.branch, env);
|
|
74
|
+
const localTip = revParse(input.dir, 'HEAD', env);
|
|
75
|
+
// 2a. Merged: the tip is an ancestor of <arbiter>/main.
|
|
76
|
+
if (isAncestor(input.dir, localTip, `refs/remotes/${arbiter}/main`, env)) {
|
|
77
|
+
return { safe: true, reachableVia: 'merged' };
|
|
78
|
+
}
|
|
79
|
+
// 2b. Pushed: <arbiter>/<branch> exists AND its tip == the local tip.
|
|
80
|
+
const remoteTip = revParseOrUndefined(input.dir, `refs/remotes/${arbiter}/${input.branch}`, env);
|
|
81
|
+
if (remoteTip !== undefined && remoteTip === localTip) {
|
|
82
|
+
return { safe: true, reachableVia: 'pushed' };
|
|
83
|
+
}
|
|
84
|
+
// Clean, but NOT on the arbiter: distinguish "a remote branch exists but its
|
|
85
|
+
// tip differs (un-pushed amend)" from "no remote presence at all".
|
|
86
|
+
if (remoteTip !== undefined) {
|
|
87
|
+
return { safe: false, reason: 'branch-not-pushed' };
|
|
88
|
+
}
|
|
89
|
+
return { safe: false, reason: 'unmerged-commits' };
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Auto-reap ONE job worktree iff the predicate holds (or `force` overrides):
|
|
93
|
+
* `git worktree remove` then `git worktree prune` on the hub mirror — NEVER a
|
|
94
|
+
* bare `rm -rf` (ADR §4). Returns whether it removed the worktree + the verdict
|
|
95
|
+
* it acted on (so the caller can report a retained job's reason).
|
|
96
|
+
*
|
|
97
|
+
* Used at end-of-job (the runner calls it after integrating) and by `gc` (the
|
|
98
|
+
* catch-up when auto-reap didn't run). A job whose work is NOT on the arbiter is
|
|
99
|
+
* never removed here (force is the only override, and it is explicit).
|
|
100
|
+
*/
|
|
101
|
+
export function reapJob(input) {
|
|
102
|
+
const verdict = evaluateDeletionSafety(input);
|
|
103
|
+
const force = input.force === true;
|
|
104
|
+
if (!verdict.safe && !force) {
|
|
105
|
+
return { removed: false, verdict, forced: false };
|
|
106
|
+
}
|
|
107
|
+
removeWorktree(input.mirrorPath, input.dir, input.branch, input.env);
|
|
108
|
+
return { removed: true, verdict, forced: !verdict.safe };
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Re-apply the deletion-safety predicate across every `<workspacesDir>/work/*`
|
|
112
|
+
* job (ADR §4): reap the provably-safe ones, RETAIN the rest and report each
|
|
113
|
+
* with a clear reason. This is the safety-net catch-up for when auto-reap didn't
|
|
114
|
+
* run (a runner crash/kill left the worktree behind).
|
|
115
|
+
*
|
|
116
|
+
* `force: true` overrides the predicate for every job (discard un-saved work) —
|
|
117
|
+
* loud + explicit (the CLI confirms first), NEVER the default. A job whose work
|
|
118
|
+
* is NOT on the arbiter is never auto-removed without `force`.
|
|
119
|
+
*/
|
|
120
|
+
export function gc(options) {
|
|
121
|
+
const note = options.note ?? (() => { });
|
|
122
|
+
const env = options.env;
|
|
123
|
+
const reaped = [];
|
|
124
|
+
const retained = [];
|
|
125
|
+
for (const job of discoverJobs(options.workspacesDir)) {
|
|
126
|
+
const mirrorPath = resolveMirrorPath(options.workspacesDir, job);
|
|
127
|
+
const result = reapJob({
|
|
128
|
+
dir: job.dir,
|
|
129
|
+
branch: job.branch,
|
|
130
|
+
mirrorPath,
|
|
131
|
+
force: options.force,
|
|
132
|
+
env,
|
|
133
|
+
});
|
|
134
|
+
if (result.removed) {
|
|
135
|
+
reaped.push({ ...job, verdict: result.verdict, forced: result.forced });
|
|
136
|
+
note(result.forced
|
|
137
|
+
? `Reaped ${job.slug} (FORCED — discarded un-saved work).`
|
|
138
|
+
: `Reaped ${job.slug} (${result.verdict.reachableVia}).`);
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
const reason = result.verdict.reason ?? 'unmerged-commits';
|
|
142
|
+
const reasonText = RETAIN_REASON_TEXT[reason];
|
|
143
|
+
retained.push({ ...job, reason, reasonText });
|
|
144
|
+
note(`Retained ${job.slug}: ${reasonText}.`);
|
|
145
|
+
}
|
|
146
|
+
return { reaped, retained };
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Discover every job worktree under `<workspacesDir>/work/*` (the flat layout —
|
|
150
|
+
* ADR §2). The per-job record is a SIBLING of the worktree dir
|
|
151
|
+
* (`<work-id>.json` next to `<work-id>/`, {@link jobRecordPath}) — OUTSIDE the
|
|
152
|
+
* checked-out tree so it can never be swept into a commit — so a work-id dir is
|
|
153
|
+
* a job iff its sibling record file exists (with a LEGACY fallback to an in-tree
|
|
154
|
+
* record left by an old binary, via {@link readJobRecord}). The branch comes
|
|
155
|
+
* from the record (falling back to `work/<derived-slug>`).
|
|
156
|
+
*/
|
|
157
|
+
export function discoverJobs(workspacesDir) {
|
|
158
|
+
const workDir = join(workspacesDir, 'work');
|
|
159
|
+
if (!existsSync(workDir)) {
|
|
160
|
+
return [];
|
|
161
|
+
}
|
|
162
|
+
const jobs = [];
|
|
163
|
+
for (const entry of readdirSync(workDir)) {
|
|
164
|
+
const dir = join(workDir, entry);
|
|
165
|
+
let isDir;
|
|
166
|
+
try {
|
|
167
|
+
isDir = statSync(dir).isDirectory();
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
if (!isDir) {
|
|
173
|
+
continue; // skip the sibling `<work-id>.json` record files themselves
|
|
174
|
+
}
|
|
175
|
+
// A job iff a record exists — the sibling path first, then the legacy
|
|
176
|
+
// in-tree path (an old-binary worktree). Mirrors `readJobRecord`'s order.
|
|
177
|
+
if (!existsSync(jobRecordPath(dir)) &&
|
|
178
|
+
!existsSync(join(dir, JOB_RECORD_FILENAME))) {
|
|
179
|
+
continue; // not a job worktree (no record at either location)
|
|
180
|
+
}
|
|
181
|
+
const record = readJobRecord(dir);
|
|
182
|
+
const slug = record?.slug ?? deriveSlug(entry);
|
|
183
|
+
// The job record carries the (already-namespaced) branch — the SOURCE OF
|
|
184
|
+
// TRUTH. Only when a record is missing/legacy do we synthesise a fallback;
|
|
185
|
+
// the flat work-id dir name cannot recover the type, so default to the
|
|
186
|
+
// overwhelmingly-common `task` namespace (a recordless worktree is a rare
|
|
187
|
+
// legacy/corrupt case).
|
|
188
|
+
const branch = record?.branch ?? workBranchRef('task', slug);
|
|
189
|
+
jobs.push({ dir, slug, branch, record });
|
|
190
|
+
}
|
|
191
|
+
return jobs;
|
|
192
|
+
}
|
|
193
|
+
/** Derive a slug from a flat work-id dir name (`host__org__repo__slug`). */
|
|
194
|
+
function deriveSlug(workId) {
|
|
195
|
+
const parts = workId.split('__');
|
|
196
|
+
return parts[parts.length - 1] || workId;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* The hub mirror a job worktree was cut from. We do NOT reconstruct it from the
|
|
200
|
+
* encoded repo key (the key may not round-trip the arbiter URL): a worktree's
|
|
201
|
+
* `.git` file points at its mirror's `worktrees/<id>` admin dir, so we read the
|
|
202
|
+
* mirror's common dir directly from the worktree (robust + layout-agnostic).
|
|
203
|
+
*/
|
|
204
|
+
function resolveMirrorPath(workspacesDir, job) {
|
|
205
|
+
const common = run('git', ['rev-parse', '--path-format=absolute', '--git-common-dir'], job.dir);
|
|
206
|
+
const dir = common.stdout.trim();
|
|
207
|
+
if (common.status === 0 && dir !== '') {
|
|
208
|
+
return dir;
|
|
209
|
+
}
|
|
210
|
+
// Fallback: the repos hub under the workspaces dir (best-effort).
|
|
211
|
+
return join(workspacesDir, 'repos');
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* True iff the working tree has NO uncommitted WORK (tracked, staged, or
|
|
215
|
+
* untracked). The agent's edits and any untracked artefacts count: untracked
|
|
216
|
+
* work is still un-saved work.
|
|
217
|
+
*
|
|
218
|
+
* The `.dorfl-job.json` exclusion below is now INERT: the per-job record
|
|
219
|
+
* lives at a SIBLING path OUTSIDE the worktree, so it can no longer appear in
|
|
220
|
+
* the worktree's `git status` at all. It used to be load-bearing (the record
|
|
221
|
+
* was written INSIDE the worktree, so a perfectly-saved job would otherwise read
|
|
222
|
+
* as "dirty" purely because the runner wrote its own state file there). It is
|
|
223
|
+
* kept as a harmless no-op that still names the record for a hypothetical
|
|
224
|
+
* old-binary worktree whose record is still in-tree (the read-fallback case);
|
|
225
|
+
* removing it would only risk regressing that edge with no upside. The
|
|
226
|
+
* `work/`-ledger exclusion is a SEPARATE concern and stays.
|
|
227
|
+
*/
|
|
228
|
+
function isWorkingTreeClean(dir, env) {
|
|
229
|
+
// `status --porcelain` prints one line per change; empty ⇒ clean. Includes
|
|
230
|
+
// staged, unstaged, and untracked files.
|
|
231
|
+
const res = run('git', ['status', '--porcelain'], dir, { env });
|
|
232
|
+
if (res.status !== 0) {
|
|
233
|
+
// Can't determine cleanliness ⇒ treat as dirty (the safe direction).
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
const lines = res.stdout
|
|
237
|
+
.split('\n')
|
|
238
|
+
.map((l) => l.trimEnd())
|
|
239
|
+
.filter((l) => l !== '');
|
|
240
|
+
// Each porcelain line is `XY <path>` (path starts at column 3). Drop the
|
|
241
|
+
// runner's own job-record line; any remaining change ⇒ genuinely dirty.
|
|
242
|
+
const work = lines.filter((l) => l.slice(3).trim() !== JOB_RECORD_FILENAME);
|
|
243
|
+
return work.length === 0;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Fetch a single arbiter head into its remote-tracking ref EXPLICITLY
|
|
247
|
+
* (`+refs/heads/<head>:refs/remotes/<arbiter>/<head>`). A bare hub mirror has no
|
|
248
|
+
* fetch refspec, so this is the only way the remote-tracking ref exists; it is
|
|
249
|
+
* also harmless on a normal clone. Best-effort: the arbiter may be unreachable
|
|
250
|
+
* (offline) or the head may not exist there — either way the local ref simply
|
|
251
|
+
* stays absent/stale and the predicate reads as not-reachable → retain.
|
|
252
|
+
*/
|
|
253
|
+
function fetchTracking(dir, arbiter, head, env) {
|
|
254
|
+
run('git', [
|
|
255
|
+
'fetch',
|
|
256
|
+
'--quiet',
|
|
257
|
+
arbiter,
|
|
258
|
+
`+refs/heads/${head}:refs/remotes/${arbiter}/${head}`,
|
|
259
|
+
], dir, { env });
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* True iff `ancestor` is an ancestor of (or equal to) `descendant`, both
|
|
263
|
+
* resolved IN the local repo `dir` (`git merge-base --is-ancestor`). This is the
|
|
264
|
+
* ONE provably-merged reachability predicate in the system: the worktree reaper
|
|
265
|
+
* above uses it for `<tip> --is-ancestor <arbiter>/main`, and the remote
|
|
266
|
+
* merged-branch sweep (`reap-branches.ts`) REUSES it (not a second predicate) to
|
|
267
|
+
* decide a remote `work/<slug>` branch is provably merged before deleting it.
|
|
268
|
+
* EXPORTED so that single source of truth is shared, never forked.
|
|
269
|
+
*/
|
|
270
|
+
export function isAncestor(dir, ancestor, descendant, env) {
|
|
271
|
+
const res = run('git', ['merge-base', '--is-ancestor', ancestor, descendant], dir, { env });
|
|
272
|
+
return res.status === 0;
|
|
273
|
+
}
|
|
274
|
+
/** Resolve a ref to its 40-hex sha (throws if it doesn't resolve). */
|
|
275
|
+
function revParse(dir, ref, env) {
|
|
276
|
+
return git(['rev-parse', '--verify', '--quiet', ref], dir, { env }).trim();
|
|
277
|
+
}
|
|
278
|
+
/** Resolve a ref to its sha, or `undefined` if it doesn't resolve. */
|
|
279
|
+
function revParseOrUndefined(dir, ref, env) {
|
|
280
|
+
const res = run('git', ['rev-parse', '--verify', '--quiet', ref], dir, { env });
|
|
281
|
+
if (res.status !== 0) {
|
|
282
|
+
return undefined;
|
|
283
|
+
}
|
|
284
|
+
const sha = res.stdout.trim();
|
|
285
|
+
return sha === '' ? undefined : sha;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Remove a job worktree the contract-safe way: `git worktree remove` then
|
|
289
|
+
* `git worktree prune` on the hub mirror, plus dropping the now-orphaned work
|
|
290
|
+
* branch AND the now-orphaned per-job record (a SIBLING of the worktree since
|
|
291
|
+
* the relocation — it no longer goes away WITH the worktree dir, so we delete it
|
|
292
|
+
* explicitly so a reaped job leaves no `<work-id>.json` litter). NEVER a bare
|
|
293
|
+
* `rm -rf` of the WORKTREE (ADR §4): a raw delete leaves a dangling worktree
|
|
294
|
+
* registration on the hub. Best-effort on prune/branch-drop/record (idempotent
|
|
295
|
+
* re-runs of `gc` must not error on an already-clean hub).
|
|
296
|
+
*/
|
|
297
|
+
function removeWorktree(mirrorPath, dir, branch, env) {
|
|
298
|
+
git(['worktree', 'remove', '--force', dir], mirrorPath, { env });
|
|
299
|
+
removeJobRecord(dir);
|
|
300
|
+
try {
|
|
301
|
+
git(['worktree', 'prune'], mirrorPath, { env });
|
|
302
|
+
}
|
|
303
|
+
catch {
|
|
304
|
+
// best-effort
|
|
305
|
+
}
|
|
306
|
+
try {
|
|
307
|
+
git(['branch', '-D', branch], mirrorPath, { env });
|
|
308
|
+
}
|
|
309
|
+
catch {
|
|
310
|
+
// branch may already be gone
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
//# sourceMappingURL=gc.js.map
|
package/dist/gc.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gc.js","sourceRoot":"","sources":["../src/gc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type RunResult } from './git.js';
|
|
2
|
+
/**
|
|
3
|
+
* **Shared `gh`-failure diagnostics** for the two `gh`-backed provider seams (the
|
|
4
|
+
* review-request `GitHubProvider` in `github.ts` and the `GitHubIssueProvider` in
|
|
5
|
+
* `issue-provider.ts`).
|
|
6
|
+
*
|
|
7
|
+
* Both providers shell out to `gh` and must, on a failure, surface the REAL cause
|
|
8
|
+
* — the actual `gh` stderr (a rate-limit, a permissions error, a transient 5xx),
|
|
9
|
+
* NOT a hard-coded "`gh` is unavailable or unauthenticated" guess that sends an
|
|
10
|
+
* operator chasing a phantom auth problem. This module is the single source of
|
|
11
|
+
* truth for that distillation so the two providers can NEVER drift apart on the
|
|
12
|
+
* next fix (the drift the original hard-coded strings created).
|
|
13
|
+
*
|
|
14
|
+
* Both `gh`-shelling helpers (`runGh`) return `RunResult | undefined`, where
|
|
15
|
+
* `undefined` = the `gh` BINARY could not be spawned (missing / not on `PATH`).
|
|
16
|
+
* That case has no `RunResult` to read, so the PAIR below resolves it to a fixed
|
|
17
|
+
* "binary missing" string and reserves {@link ghFailureReason} for a genuine
|
|
18
|
+
* `RunResult`.
|
|
19
|
+
*/
|
|
20
|
+
/** The fixed reason for a missing/unspawnable `gh` binary (no `RunResult` to read). */
|
|
21
|
+
export declare const GH_BINARY_MISSING = "`gh` is not available (binary missing).";
|
|
22
|
+
/**
|
|
23
|
+
* Distil the REAL reason a `gh` invocation failed from its result — the trimmed
|
|
24
|
+
* stderr (the actual cause, e.g. `'dorfl:processing' not found`), falling
|
|
25
|
+
* back to the exit status when stderr is empty. This is what replaces the old
|
|
26
|
+
* hard-coded "unavailable or unauthenticated" guess: the cause must be diagnosable.
|
|
27
|
+
*
|
|
28
|
+
* Requires a NON-undefined `RunResult` (it reads `stderr`/`status`); a missing
|
|
29
|
+
* binary (`undefined`) has no result to read — use {@link ghFailureDetail} when
|
|
30
|
+
* the value may be `undefined`.
|
|
31
|
+
*/
|
|
32
|
+
export declare function ghFailureReason(result: RunResult): string;
|
|
33
|
+
/**
|
|
34
|
+
* Resolve the real failure detail for a `gh` shell-out whose result MAY be
|
|
35
|
+
* `undefined` (binary missing) — the two-arm guard both providers' degrade paths
|
|
36
|
+
* need: a missing binary yields the fixed {@link GH_BINARY_MISSING} string, and
|
|
37
|
+
* only a genuine `RunResult` is passed to {@link ghFailureReason}. This keeps the
|
|
38
|
+
* undefined-vs-`RunResult` split in ONE place so no degrade branch ever calls
|
|
39
|
+
* `ghFailureReason(undefined)`.
|
|
40
|
+
*/
|
|
41
|
+
export declare function ghFailureDetail(result: RunResult | undefined): string;
|
|
42
|
+
//# sourceMappingURL=gh-failure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gh-failure.d.ts","sourceRoot":"","sources":["../src/gh-failure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,SAAS,EAAC,MAAM,UAAU,CAAC;AAExC;;;;;;;;;;;;;;;;;GAiBG;AAEH,uFAAuF;AACvF,eAAO,MAAM,iBAAiB,4CAA4C,CAAC;AAE3E;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAMzD;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAErE"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* **Shared `gh`-failure diagnostics** for the two `gh`-backed provider seams (the
|
|
3
|
+
* review-request `GitHubProvider` in `github.ts` and the `GitHubIssueProvider` in
|
|
4
|
+
* `issue-provider.ts`).
|
|
5
|
+
*
|
|
6
|
+
* Both providers shell out to `gh` and must, on a failure, surface the REAL cause
|
|
7
|
+
* — the actual `gh` stderr (a rate-limit, a permissions error, a transient 5xx),
|
|
8
|
+
* NOT a hard-coded "`gh` is unavailable or unauthenticated" guess that sends an
|
|
9
|
+
* operator chasing a phantom auth problem. This module is the single source of
|
|
10
|
+
* truth for that distillation so the two providers can NEVER drift apart on the
|
|
11
|
+
* next fix (the drift the original hard-coded strings created).
|
|
12
|
+
*
|
|
13
|
+
* Both `gh`-shelling helpers (`runGh`) return `RunResult | undefined`, where
|
|
14
|
+
* `undefined` = the `gh` BINARY could not be spawned (missing / not on `PATH`).
|
|
15
|
+
* That case has no `RunResult` to read, so the PAIR below resolves it to a fixed
|
|
16
|
+
* "binary missing" string and reserves {@link ghFailureReason} for a genuine
|
|
17
|
+
* `RunResult`.
|
|
18
|
+
*/
|
|
19
|
+
/** The fixed reason for a missing/unspawnable `gh` binary (no `RunResult` to read). */
|
|
20
|
+
export const GH_BINARY_MISSING = '`gh` is not available (binary missing).';
|
|
21
|
+
/**
|
|
22
|
+
* Distil the REAL reason a `gh` invocation failed from its result — the trimmed
|
|
23
|
+
* stderr (the actual cause, e.g. `'dorfl:processing' not found`), falling
|
|
24
|
+
* back to the exit status when stderr is empty. This is what replaces the old
|
|
25
|
+
* hard-coded "unavailable or unauthenticated" guess: the cause must be diagnosable.
|
|
26
|
+
*
|
|
27
|
+
* Requires a NON-undefined `RunResult` (it reads `stderr`/`status`); a missing
|
|
28
|
+
* binary (`undefined`) has no result to read — use {@link ghFailureDetail} when
|
|
29
|
+
* the value may be `undefined`.
|
|
30
|
+
*/
|
|
31
|
+
export function ghFailureReason(result) {
|
|
32
|
+
const stderr = result.stderr.trim();
|
|
33
|
+
if (stderr) {
|
|
34
|
+
return stderr;
|
|
35
|
+
}
|
|
36
|
+
return `\`gh\` exited ${result.status}.`;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Resolve the real failure detail for a `gh` shell-out whose result MAY be
|
|
40
|
+
* `undefined` (binary missing) — the two-arm guard both providers' degrade paths
|
|
41
|
+
* need: a missing binary yields the fixed {@link GH_BINARY_MISSING} string, and
|
|
42
|
+
* only a genuine `RunResult` is passed to {@link ghFailureReason}. This keeps the
|
|
43
|
+
* undefined-vs-`RunResult` split in ONE place so no degrade branch ever calls
|
|
44
|
+
* `ghFailureReason(undefined)`.
|
|
45
|
+
*/
|
|
46
|
+
export function ghFailureDetail(result) {
|
|
47
|
+
return result === undefined ? GH_BINARY_MISSING : ghFailureReason(result);
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=gh-failure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gh-failure.js","sourceRoot":"","sources":["../src/gh-failure.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AAEH,uFAAuF;AACvF,MAAM,CAAC,MAAM,iBAAiB,GAAG,yCAAyC,CAAC;AAE3E;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAAC,MAAiB;IAChD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,MAAM,EAAE,CAAC;QACZ,OAAO,MAAM,CAAC;IACf,CAAC;IACD,OAAO,iBAAiB,MAAM,CAAC,MAAM,GAAG,CAAC;AAC1C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,MAA6B;IAC5D,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;AAC3E,CAAC"}
|