@cleocode/core 2026.9.23 → 2026.9.25
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/admin/import-tasks.d.ts.map +1 -1
- package/dist/admin/import-tasks.js +35 -6
- package/dist/admin/import-tasks.js.map +1 -1
- package/dist/admin/import.d.ts.map +1 -1
- package/dist/admin/import.js +25 -6
- package/dist/admin/import.js.map +1 -1
- package/dist/audit-prune.d.ts +32 -0
- package/dist/audit-prune.d.ts.map +1 -1
- package/dist/audit-prune.js +37 -3
- package/dist/audit-prune.js.map +1 -1
- package/dist/build-provenance.json +2 -2
- package/dist/cloud/crypto.d.ts +1 -2
- package/dist/cloud/crypto.d.ts.map +1 -1
- package/dist/cloud/crypto.js +1 -11
- package/dist/cloud/crypto.js.map +1 -1
- package/dist/cloud/http.d.ts +8 -0
- package/dist/cloud/http.d.ts.map +1 -1
- package/dist/cloud/http.js +8 -1
- package/dist/cloud/http.js.map +1 -1
- package/dist/cloud/index.d.ts +6 -1
- package/dist/cloud/index.d.ts.map +1 -1
- package/dist/cloud/index.js +6 -1
- package/dist/cloud/index.js.map +1 -1
- package/dist/cloud/nexus-auth.d.ts +169 -0
- package/dist/cloud/nexus-auth.d.ts.map +1 -0
- package/dist/cloud/nexus-auth.js +372 -0
- package/dist/cloud/nexus-auth.js.map +1 -0
- package/dist/cloud/nexus-credentials.d.ts +188 -0
- package/dist/cloud/nexus-credentials.d.ts.map +1 -0
- package/dist/cloud/nexus-credentials.js +323 -0
- package/dist/cloud/nexus-credentials.js.map +1 -0
- package/dist/cloud/nexus-link.d.ts +85 -0
- package/dist/cloud/nexus-link.d.ts.map +1 -0
- package/dist/cloud/nexus-link.js +226 -0
- package/dist/cloud/nexus-link.js.map +1 -0
- package/dist/cloud/presence.d.ts +88 -0
- package/dist/cloud/presence.d.ts.map +1 -0
- package/dist/cloud/presence.js +137 -0
- package/dist/cloud/presence.js.map +1 -0
- package/dist/cloud/projects.d.ts +3 -1
- package/dist/cloud/projects.d.ts.map +1 -1
- package/dist/cloud/projects.js +4 -2
- package/dist/cloud/projects.js.map +1 -1
- package/dist/cloud/uuidv7.d.ts +9 -0
- package/dist/cloud/uuidv7.d.ts.map +1 -0
- package/dist/cloud/uuidv7.js +19 -0
- package/dist/cloud/uuidv7.js.map +1 -0
- package/dist/crypto/credentials.d.ts +14 -4
- package/dist/crypto/credentials.d.ts.map +1 -1
- package/dist/crypto/credentials.js +15 -1
- package/dist/crypto/credentials.js.map +1 -1
- package/dist/decide/bench/dataset.d.ts +125 -0
- package/dist/decide/bench/dataset.d.ts.map +1 -0
- package/dist/decide/bench/dataset.js +457 -0
- package/dist/decide/bench/dataset.js.map +1 -0
- package/dist/decide/bench/index.d.ts +23 -0
- package/dist/decide/bench/index.d.ts.map +1 -0
- package/dist/decide/bench/index.js +23 -0
- package/dist/decide/bench/index.js.map +1 -0
- package/dist/decide/bench/metrics.d.ts +55 -0
- package/dist/decide/bench/metrics.d.ts.map +1 -0
- package/dist/decide/bench/metrics.js +100 -0
- package/dist/decide/bench/metrics.js.map +1 -0
- package/dist/decide/bench/operation.d.ts +119 -0
- package/dist/decide/bench/operation.d.ts.map +1 -0
- package/dist/decide/bench/operation.js +171 -0
- package/dist/decide/bench/operation.js.map +1 -0
- package/dist/decide/bench/profiles.d.ts +102 -0
- package/dist/decide/bench/profiles.d.ts.map +1 -0
- package/dist/decide/bench/profiles.js +175 -0
- package/dist/decide/bench/profiles.js.map +1 -0
- package/dist/decide/bench/questions.d.ts +40 -0
- package/dist/decide/bench/questions.d.ts.map +1 -0
- package/dist/decide/bench/questions.js +107 -0
- package/dist/decide/bench/questions.js.map +1 -0
- package/dist/decide/bench/report.d.ts +21 -0
- package/dist/decide/bench/report.d.ts.map +1 -0
- package/dist/decide/bench/report.js +125 -0
- package/dist/decide/bench/report.js.map +1 -0
- package/dist/decide/bench/runner.d.ts +208 -0
- package/dist/decide/bench/runner.d.ts.map +1 -0
- package/dist/decide/bench/runner.js +336 -0
- package/dist/decide/bench/runner.js.map +1 -0
- package/dist/decide/bench/source.d.ts +21 -0
- package/dist/decide/bench/source.d.ts.map +1 -0
- package/dist/decide/bench/source.js +67 -0
- package/dist/decide/bench/source.js.map +1 -0
- package/dist/decide/bench/spot-check.d.ts +117 -0
- package/dist/decide/bench/spot-check.d.ts.map +1 -0
- package/dist/decide/bench/spot-check.js +221 -0
- package/dist/decide/bench/spot-check.js.map +1 -0
- package/dist/decide/bench/stats.d.ts +57 -0
- package/dist/decide/bench/stats.d.ts.map +1 -0
- package/dist/decide/bench/stats.js +82 -0
- package/dist/decide/bench/stats.js.map +1 -0
- package/dist/decide/bench/types.d.ts +216 -0
- package/dist/decide/bench/types.d.ts.map +1 -0
- package/dist/decide/bench/types.js +104 -0
- package/dist/decide/bench/types.js.map +1 -0
- package/dist/decide/client.d.ts +35 -1
- package/dist/decide/client.d.ts.map +1 -1
- package/dist/decide/client.js +135 -35
- package/dist/decide/client.js.map +1 -1
- package/dist/decide/credentials.d.ts +177 -17
- package/dist/decide/credentials.d.ts.map +1 -1
- package/dist/decide/credentials.js +505 -41
- package/dist/decide/credentials.js.map +1 -1
- package/dist/decide/index.d.ts +8 -8
- package/dist/decide/index.d.ts.map +1 -1
- package/dist/decide/index.js +8 -8
- package/dist/decide/index.js.map +1 -1
- package/dist/decide/jev-wire.d.ts +55 -19
- package/dist/decide/jev-wire.d.ts.map +1 -1
- package/dist/decide/jev-wire.js +116 -37
- package/dist/decide/jev-wire.js.map +1 -1
- package/dist/decide/operations.d.ts +63 -12
- package/dist/decide/operations.d.ts.map +1 -1
- package/dist/decide/operations.js +116 -58
- package/dist/decide/operations.js.map +1 -1
- package/dist/decide/provider-state.d.ts +85 -12
- package/dist/decide/provider-state.d.ts.map +1 -1
- package/dist/decide/provider-state.js +154 -21
- package/dist/decide/provider-state.js.map +1 -1
- package/dist/decide/provider.d.ts +5 -0
- package/dist/decide/provider.d.ts.map +1 -1
- package/dist/decide/provider.js.map +1 -1
- package/dist/decide/providers.d.ts +15 -2
- package/dist/decide/providers.d.ts.map +1 -1
- package/dist/decide/providers.js +22 -6
- package/dist/decide/providers.js.map +1 -1
- package/dist/decide/sites/registry.d.ts +22 -0
- package/dist/decide/sites/registry.d.ts.map +1 -1
- package/dist/decide/sites/registry.js +23 -0
- package/dist/decide/sites/registry.js.map +1 -1
- package/dist/decide/wizard.d.ts +12 -4
- package/dist/decide/wizard.d.ts.map +1 -1
- package/dist/decide/wizard.js +79 -26
- package/dist/decide/wizard.js.map +1 -1
- package/dist/dispatch/mvi-projection.d.ts +15 -2
- package/dist/dispatch/mvi-projection.d.ts.map +1 -1
- package/dist/dispatch/mvi-projection.js +73 -12
- package/dist/dispatch/mvi-projection.js.map +1 -1
- package/dist/docs/adr-allocator.d.ts +2 -2
- package/dist/docs/adr-allocator.d.ts.map +1 -1
- package/dist/docs/adr-allocator.js +17 -4
- package/dist/docs/adr-allocator.js.map +1 -1
- package/dist/docs/blob-consolidation.js +1 -1
- package/dist/docs/blob-consolidation.js.map +1 -1
- package/dist/docs/display-alias.d.ts +1 -1
- package/dist/docs/display-alias.d.ts.map +1 -1
- package/dist/docs/display-alias.js +7 -4
- package/dist/docs/display-alias.js.map +1 -1
- package/dist/docs/docs-inconsistency-detector.js +1 -1
- package/dist/docs/docs-inconsistency-detector.js.map +1 -1
- package/dist/docs/docs-update.d.ts.map +1 -1
- package/dist/docs/docs-update.js +6 -1
- package/dist/docs/docs-update.js.map +1 -1
- package/dist/docs/export-document.js +18058 -14538
- package/dist/docs/export-document.js.map +3 -3
- package/dist/docs/numbering.js +1 -1
- package/dist/docs/numbering.js.map +1 -1
- package/dist/docs/supersede.d.ts.map +1 -1
- package/dist/docs/supersede.js +6 -3
- package/dist/docs/supersede.js.map +1 -1
- package/dist/docs/version-ssot.js +1 -1
- package/dist/docs/version-ssot.js.map +1 -1
- package/dist/doctor/db-substrate.d.ts.map +1 -1
- package/dist/doctor/db-substrate.js +39 -24
- package/dist/doctor/db-substrate.js.map +1 -1
- package/dist/doctor/knowledge-summary.d.ts +10 -3
- package/dist/doctor/knowledge-summary.d.ts.map +1 -1
- package/dist/doctor/knowledge-summary.js +10 -3
- package/dist/doctor/knowledge-summary.js.map +1 -1
- package/dist/doctor/orphan-ac-bindings.d.ts +64 -0
- package/dist/doctor/orphan-ac-bindings.d.ts.map +1 -0
- package/dist/doctor/orphan-ac-bindings.js +59 -0
- package/dist/doctor/orphan-ac-bindings.js.map +1 -0
- package/dist/doctor/project-identity.d.ts +128 -37
- package/dist/doctor/project-identity.d.ts.map +1 -1
- package/dist/doctor/project-identity.js +476 -63
- package/dist/doctor/project-identity.js.map +1 -1
- package/dist/doctor/projects.d.ts.map +1 -1
- package/dist/doctor/projects.js +43 -29
- package/dist/doctor/projects.js.map +1 -1
- package/dist/doctor/row-identity.d.ts +31 -0
- package/dist/doctor/row-identity.d.ts.map +1 -0
- package/dist/doctor/row-identity.js +93 -0
- package/dist/doctor/row-identity.js.map +1 -0
- package/dist/doctor/twin-collapse.d.ts +108 -2
- package/dist/doctor/twin-collapse.d.ts.map +1 -1
- package/dist/doctor/twin-collapse.js +309 -7
- package/dist/doctor/twin-collapse.js.map +1 -1
- package/dist/error-catalog.js +2 -2
- package/dist/error-catalog.js.map +1 -1
- package/dist/error-registry.js +1 -1
- package/dist/error-registry.js.map +1 -1
- package/dist/gateway-client/generated/types.gen.d.ts +22 -2
- package/dist/gateway-client/generated/types.gen.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +20 -11
- package/dist/init.js.map +1 -1
- package/dist/inject/index.d.ts.map +1 -1
- package/dist/inject/index.js +2 -3
- package/dist/inject/index.js.map +1 -1
- package/dist/internal.d.ts +5 -4
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +6 -4
- package/dist/internal.js.map +1 -1
- package/dist/lifecycle/verification/satisfies-validator.d.ts.map +1 -1
- package/dist/lifecycle/verification/satisfies-validator.js +10 -0
- package/dist/lifecycle/verification/satisfies-validator.js.map +1 -1
- package/dist/llm/credential-remove-entry.d.ts +59 -0
- package/dist/llm/credential-remove-entry.d.ts.map +1 -0
- package/dist/llm/credential-remove-entry.js +101 -0
- package/dist/llm/credential-remove-entry.js.map +1 -0
- package/dist/llm/oauth/device-code.d.ts +26 -6
- package/dist/llm/oauth/device-code.d.ts.map +1 -1
- package/dist/llm/oauth/device-code.js +44 -12
- package/dist/llm/oauth/device-code.js.map +1 -1
- package/dist/llm/plugin-facade.js +18202 -14682
- package/dist/llm/plugin-facade.js.map +3 -3
- package/dist/memory/attention.d.ts.map +1 -1
- package/dist/memory/attention.js +5 -3
- package/dist/memory/attention.js.map +1 -1
- package/dist/memory/decisions.d.ts +48 -3
- package/dist/memory/decisions.d.ts.map +1 -1
- package/dist/memory/decisions.js +98 -14
- package/dist/memory/decisions.js.map +1 -1
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +19 -10
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/learnings.d.ts +6 -6
- package/dist/memory/manifest-identity.d.ts +171 -0
- package/dist/memory/manifest-identity.d.ts.map +1 -0
- package/dist/memory/manifest-identity.js +345 -0
- package/dist/memory/manifest-identity.js.map +1 -0
- package/dist/memory/mental-model-queue.d.ts +14 -4
- package/dist/memory/mental-model-queue.d.ts.map +1 -1
- package/dist/memory/mental-model-queue.js +64 -35
- package/dist/memory/mental-model-queue.js.map +1 -1
- package/dist/memory/patterns.d.ts +4 -4
- package/dist/memory/pipeline-manifest-sqlite.d.ts +47 -5
- package/dist/memory/pipeline-manifest-sqlite.d.ts.map +1 -1
- package/dist/memory/pipeline-manifest-sqlite.js +130 -14
- package/dist/memory/pipeline-manifest-sqlite.js.map +1 -1
- package/dist/memory/retrieval/observe.d.ts.map +1 -1
- package/dist/memory/retrieval/observe.js +2 -0
- package/dist/memory/retrieval/observe.js.map +1 -1
- package/dist/memory/transcript-scanner.js +1 -1
- package/dist/migration/manual/T10165-backfill-adr-index.d.ts.map +1 -1
- package/dist/migration/manual/T10165-backfill-adr-index.js +5 -1
- package/dist/migration/manual/T10165-backfill-adr-index.js.map +1 -1
- package/dist/nexus/deps.d.ts.map +1 -1
- package/dist/nexus/deps.js +7 -14
- package/dist/nexus/deps.js.map +1 -1
- package/dist/nexus/discover.d.ts.map +1 -1
- package/dist/nexus/discover.js +6 -9
- package/dist/nexus/discover.js.map +1 -1
- package/dist/nexus/fleet-status.d.ts +83 -0
- package/dist/nexus/fleet-status.d.ts.map +1 -0
- package/dist/nexus/fleet-status.js +414 -0
- package/dist/nexus/fleet-status.js.map +1 -0
- package/dist/nexus/git-state.d.ts +15 -0
- package/dist/nexus/git-state.d.ts.map +1 -1
- package/dist/nexus/git-state.js +77 -3
- package/dist/nexus/git-state.js.map +1 -1
- package/dist/nexus/identity.d.ts.map +1 -1
- package/dist/nexus/identity.js +4 -0
- package/dist/nexus/identity.js.map +1 -1
- package/dist/nexus/index.d.ts +4 -1
- package/dist/nexus/index.d.ts.map +1 -1
- package/dist/nexus/index.js +7 -1
- package/dist/nexus/index.js.map +1 -1
- package/dist/nexus/migrate-json-to-sqlite.d.ts +3 -2
- package/dist/nexus/migrate-json-to-sqlite.d.ts.map +1 -1
- package/dist/nexus/migrate-json-to-sqlite.js +9 -17
- package/dist/nexus/migrate-json-to-sqlite.js.map +1 -1
- package/dist/nexus/ops.d.ts +1 -0
- package/dist/nexus/ops.d.ts.map +1 -1
- package/dist/nexus/project-activity.d.ts +104 -0
- package/dist/nexus/project-activity.d.ts.map +1 -0
- package/dist/nexus/project-activity.js +150 -0
- package/dist/nexus/project-activity.js.map +1 -0
- package/dist/nexus/projects-clean.d.ts.map +1 -1
- package/dist/nexus/projects-clean.js +22 -11
- package/dist/nexus/projects-clean.js.map +1 -1
- package/dist/nexus/projects-scan.d.ts.map +1 -1
- package/dist/nexus/projects-scan.js +8 -13
- package/dist/nexus/projects-scan.js.map +1 -1
- package/dist/nexus/query.d.ts +2 -2
- package/dist/nexus/query.d.ts.map +1 -1
- package/dist/nexus/query.js +8 -31
- package/dist/nexus/query.js.map +1 -1
- package/dist/nexus/registry-errors.d.ts +61 -0
- package/dist/nexus/registry-errors.d.ts.map +1 -0
- package/dist/nexus/registry-errors.js +85 -0
- package/dist/nexus/registry-errors.js.map +1 -0
- package/dist/nexus/registry-roots.d.ts +5 -2
- package/dist/nexus/registry-roots.d.ts.map +1 -1
- package/dist/nexus/registry-roots.js +8 -10
- package/dist/nexus/registry-roots.js.map +1 -1
- package/dist/nexus/registry.d.ts +48 -5
- package/dist/nexus/registry.d.ts.map +1 -1
- package/dist/nexus/registry.js +151 -85
- package/dist/nexus/registry.js.map +1 -1
- package/dist/orchestrate/pivot.d.ts +4 -0
- package/dist/orchestrate/pivot.d.ts.map +1 -1
- package/dist/orchestrate/pivot.js +75 -12
- package/dist/orchestrate/pivot.js.map +1 -1
- package/dist/orchestrate/query-ops.d.ts.map +1 -1
- package/dist/orchestrate/query-ops.js +29 -27
- package/dist/orchestrate/query-ops.js.map +1 -1
- package/dist/orchestrate/spawn-ops.d.ts.map +1 -1
- package/dist/orchestrate/spawn-ops.js +29 -3
- package/dist/orchestrate/spawn-ops.js.map +1 -1
- package/dist/orchestrate/worktree-complete.d.ts.map +1 -1
- package/dist/orchestrate/worktree-complete.js +40 -2
- package/dist/orchestrate/worktree-complete.js.map +1 -1
- package/dist/orchestration/bootstrap.d.ts.map +1 -1
- package/dist/orchestration/bootstrap.js +20 -14
- package/dist/orchestration/bootstrap.js.map +1 -1
- package/dist/orchestration/index.d.ts +15 -1
- package/dist/orchestration/index.d.ts.map +1 -1
- package/dist/orchestration/index.js +25 -6
- package/dist/orchestration/index.js.map +1 -1
- package/dist/orchestration/lead-rollup.d.ts +7 -1
- package/dist/orchestration/lead-rollup.d.ts.map +1 -1
- package/dist/orchestration/lead-rollup.js +6 -3
- package/dist/orchestration/lead-rollup.js.map +1 -1
- package/dist/orchestration/spawn-prompt.d.ts +26 -0
- package/dist/orchestration/spawn-prompt.d.ts.map +1 -1
- package/dist/orchestration/spawn-prompt.js +63 -92
- package/dist/orchestration/spawn-prompt.js.map +1 -1
- package/dist/orchestration/waves.d.ts +21 -10
- package/dist/orchestration/waves.d.ts.map +1 -1
- package/dist/orchestration/waves.js +38 -35
- package/dist/orchestration/waves.js.map +1 -1
- package/dist/paths.d.ts +9 -2
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +30 -13
- package/dist/paths.js.map +1 -1
- package/dist/phases/index.d.ts +1 -1
- package/dist/phases/index.d.ts.map +1 -1
- package/dist/phases/index.js +3 -4
- package/dist/phases/index.js.map +1 -1
- package/dist/project-info.d.ts +40 -3
- package/dist/project-info.d.ts.map +1 -1
- package/dist/project-info.js +74 -6
- package/dist/project-info.js.map +1 -1
- package/dist/project-lifecycle.d.ts +28 -7
- package/dist/project-lifecycle.d.ts.map +1 -1
- package/dist/project-lifecycle.js +114 -47
- package/dist/project-lifecycle.js.map +1 -1
- package/dist/project-scope.d.ts +70 -3
- package/dist/project-scope.d.ts.map +1 -1
- package/dist/project-scope.js +154 -15
- package/dist/project-scope.js.map +1 -1
- package/dist/release/ci-evidence.d.ts +190 -0
- package/dist/release/ci-evidence.d.ts.map +1 -1
- package/dist/release/ci-evidence.js +436 -4
- package/dist/release/ci-evidence.js.map +1 -1
- package/dist/release/open.d.ts +12 -2
- package/dist/release/open.d.ts.map +1 -1
- package/dist/release/open.js +32 -3
- package/dist/release/open.js.map +1 -1
- package/dist/release/preflight-skip.d.ts +73 -0
- package/dist/release/preflight-skip.d.ts.map +1 -0
- package/dist/release/preflight-skip.js +254 -0
- package/dist/release/preflight-skip.js.map +1 -0
- package/dist/render/decide/index.d.ts +51 -0
- package/dist/render/decide/index.d.ts.map +1 -0
- package/dist/render/decide/index.js +289 -0
- package/dist/render/decide/index.js.map +1 -0
- package/dist/render/index.d.ts +1 -0
- package/dist/render/index.d.ts.map +1 -1
- package/dist/render/index.js +1 -0
- package/dist/render/index.js.map +1 -1
- package/dist/render/nexus/graph/index.d.ts +5 -0
- package/dist/render/nexus/graph/index.d.ts.map +1 -1
- package/dist/render/nexus/graph/index.js +53 -0
- package/dist/render/nexus/graph/index.js.map +1 -1
- package/dist/scaffold/ensure-config.d.ts +14 -6
- package/dist/scaffold/ensure-config.d.ts.map +1 -1
- package/dist/scaffold/ensure-config.js +39 -17
- package/dist/scaffold/ensure-config.js.map +1 -1
- package/dist/scaffold/project-identity.d.ts +115 -23
- package/dist/scaffold/project-identity.d.ts.map +1 -1
- package/dist/scaffold/project-identity.js +196 -44
- package/dist/scaffold/project-identity.js.map +1 -1
- package/dist/sdk/validator-ac-pull.d.ts.map +1 -1
- package/dist/sdk/validator-ac-pull.js +2 -1
- package/dist/sdk/validator-ac-pull.js.map +1 -1
- package/dist/selfimprove/fix-gen.js +18221 -14701
- package/dist/selfimprove/fix-gen.js.map +3 -3
- package/dist/sentient/cross-project-hygiene.d.ts +17 -6
- package/dist/sentient/cross-project-hygiene.d.ts.map +1 -1
- package/dist/sentient/cross-project-hygiene.js +22 -11
- package/dist/sentient/cross-project-hygiene.js.map +1 -1
- package/dist/sentient/propose-tick.d.ts.map +1 -1
- package/dist/sentient/propose-tick.js +2 -3
- package/dist/sentient/propose-tick.js.map +1 -1
- package/dist/sentient/stage-drift-tick.d.ts.map +1 -1
- package/dist/sentient/stage-drift-tick.js +2 -3
- package/dist/sentient/stage-drift-tick.js.map +1 -1
- package/dist/session/engine-ops.d.ts +13 -4
- package/dist/session/engine-ops.d.ts.map +1 -1
- package/dist/session/engine-ops.js +38 -45
- package/dist/session/engine-ops.js.map +1 -1
- package/dist/sessions/briefing.d.ts +7 -3
- package/dist/sessions/briefing.d.ts.map +1 -1
- package/dist/sessions/briefing.js +10 -10
- package/dist/sessions/briefing.js.map +1 -1
- package/dist/sessions/drift-watchdog.d.ts.map +1 -1
- package/dist/sessions/drift-watchdog.js +11 -19
- package/dist/sessions/drift-watchdog.js.map +1 -1
- package/dist/sessions/focus-state-store.d.ts +103 -26
- package/dist/sessions/focus-state-store.d.ts.map +1 -1
- package/dist/sessions/focus-state-store.js +166 -37
- package/dist/sessions/focus-state-store.js.map +1 -1
- package/dist/sessions/handoff.d.ts.map +1 -1
- package/dist/sessions/handoff.js +9 -18
- package/dist/sessions/handoff.js.map +1 -1
- package/dist/sessions/index.d.ts +4 -2
- package/dist/sessions/index.d.ts.map +1 -1
- package/dist/sessions/index.js +35 -6
- package/dist/sessions/index.js.map +1 -1
- package/dist/sessions/session-drift.d.ts.map +1 -1
- package/dist/sessions/session-drift.js +4 -2
- package/dist/sessions/session-drift.js.map +1 -1
- package/dist/sessions/session-view.d.ts +8 -1
- package/dist/sessions/session-view.d.ts.map +1 -1
- package/dist/sessions/session-view.js +9 -2
- package/dist/sessions/session-view.js.map +1 -1
- package/dist/setup/config-json-merge.d.ts.map +1 -1
- package/dist/setup/config-json-merge.js +1 -0
- package/dist/setup/config-json-merge.js.map +1 -1
- package/dist/setup/index.d.ts +4 -2
- package/dist/setup/index.d.ts.map +1 -1
- package/dist/setup/index.js +6 -2
- package/dist/setup/index.js.map +1 -1
- package/dist/setup/sections/nexus-account.d.ts +32 -0
- package/dist/setup/sections/nexus-account.d.ts.map +1 -0
- package/dist/setup/sections/nexus-account.js +64 -0
- package/dist/setup/sections/nexus-account.js.map +1 -0
- package/dist/setup/wizard.d.ts +1 -1
- package/dist/setup/wizard.d.ts.map +1 -1
- package/dist/setup/wizard.js.map +1 -1
- package/dist/skills/manifests/research.js +2 -0
- package/dist/skills/manifests/research.js.map +1 -1
- package/dist/skills/orchestrator/startup.d.ts.map +1 -1
- package/dist/skills/orchestrator/startup.js +18 -31
- package/dist/skills/orchestrator/startup.js.map +1 -1
- package/dist/skills/orchestrator/validator.d.ts.map +1 -1
- package/dist/skills/orchestrator/validator.js +9 -2
- package/dist/skills/orchestrator/validator.js.map +1 -1
- package/dist/skills/validation.d.ts +4 -1
- package/dist/skills/validation.d.ts.map +1 -1
- package/dist/skills/validation.js +11 -3
- package/dist/skills/validation.js.map +1 -1
- package/dist/snapshot/index.d.ts.map +1 -1
- package/dist/snapshot/index.js +60 -53
- package/dist/snapshot/index.js.map +1 -1
- package/dist/spawn/agent-identity.d.ts +33 -1
- package/dist/spawn/agent-identity.d.ts.map +1 -1
- package/dist/spawn/agent-identity.js +53 -1
- package/dist/spawn/agent-identity.js.map +1 -1
- package/dist/spawn/branch-lock.d.ts +111 -7
- package/dist/spawn/branch-lock.d.ts.map +1 -1
- package/dist/spawn/branch-lock.js +296 -8
- package/dist/spawn/branch-lock.js.map +1 -1
- package/dist/spawn/index.d.ts +1 -1
- package/dist/spawn/index.d.ts.map +1 -1
- package/dist/spawn/index.js +1 -1
- package/dist/spawn/index.js.map +1 -1
- package/dist/stats/index.d.ts.map +1 -1
- package/dist/stats/index.js +3 -4
- package/dist/stats/index.js.map +1 -1
- package/dist/status/index.d.ts +12 -3
- package/dist/status/index.d.ts.map +1 -1
- package/dist/status/index.js +47 -5
- package/dist/status/index.js.map +1 -1
- package/dist/store/ac-binding-prune.d.ts +144 -0
- package/dist/store/ac-binding-prune.d.ts.map +1 -0
- package/dist/store/ac-binding-prune.js +293 -0
- package/dist/store/ac-binding-prune.js.map +1 -0
- package/dist/store/agent-registry-store.d.ts.map +1 -1
- package/dist/store/agent-registry-store.js +3 -2
- package/dist/store/agent-registry-store.js.map +1 -1
- package/dist/store/attachment-repair.d.ts.map +1 -1
- package/dist/store/attachment-repair.js +42 -3
- package/dist/store/attachment-repair.js.map +1 -1
- package/dist/store/attachment-store.d.ts.map +1 -1
- package/dist/store/attachment-store.js +30 -46
- package/dist/store/attachment-store.js.map +1 -1
- package/dist/store/backup-recover-brain.d.ts +4 -0
- package/dist/store/backup-recover-brain.d.ts.map +1 -1
- package/dist/store/backup-recover-brain.js +2 -0
- package/dist/store/backup-recover-brain.js.map +1 -1
- package/dist/store/backup-recover.d.ts +9 -0
- package/dist/store/backup-recover.d.ts.map +1 -1
- package/dist/store/backup-recover.js +28 -1
- package/dist/store/backup-recover.js.map +1 -1
- package/dist/store/backup-sidecar.d.ts +115 -2
- package/dist/store/backup-sidecar.d.ts.map +1 -1
- package/dist/store/backup-sidecar.js +263 -3
- package/dist/store/backup-sidecar.js.map +1 -1
- package/dist/store/blob-keep.d.ts +135 -0
- package/dist/store/blob-keep.d.ts.map +1 -0
- package/dist/store/blob-keep.js +283 -0
- package/dist/store/blob-keep.js.map +1 -0
- package/dist/store/conduit-sqlite.d.ts.map +1 -1
- package/dist/store/conduit-sqlite.js +3 -2
- package/dist/store/conduit-sqlite.js.map +1 -1
- package/dist/store/converters.d.ts.map +1 -1
- package/dist/store/converters.js +11 -0
- package/dist/store/converters.js.map +1 -1
- package/dist/store/credential-transfer.d.ts +37 -5
- package/dist/store/credential-transfer.d.ts.map +1 -1
- package/dist/store/credential-transfer.js +76 -18
- package/dist/store/credential-transfer.js.map +1 -1
- package/dist/store/data-accessor.d.ts +1 -1
- package/dist/store/data-accessor.d.ts.map +1 -1
- package/dist/store/data-accessor.js.map +1 -1
- package/dist/store/db-helpers.d.ts +35 -11
- package/dist/store/db-helpers.d.ts.map +1 -1
- package/dist/store/db-helpers.js +107 -38
- package/dist/store/db-helpers.js.map +1 -1
- package/dist/store/display-id-alias.d.ts +529 -0
- package/dist/store/display-id-alias.d.ts.map +1 -0
- package/dist/store/display-id-alias.js +1063 -0
- package/dist/store/display-id-alias.js.map +1 -0
- package/dist/store/dual-scope-db.d.ts.map +1 -1
- package/dist/store/dual-scope-db.js +21 -0
- package/dist/store/dual-scope-db.js.map +1 -1
- package/dist/store/exodus/on-open.d.ts.map +1 -1
- package/dist/store/exodus/on-open.js +35 -0
- package/dist/store/exodus/on-open.js.map +1 -1
- package/dist/store/exodus/reconcile.d.ts.map +1 -1
- package/dist/store/exodus/reconcile.js +7 -2
- package/dist/store/exodus/reconcile.js.map +1 -1
- package/dist/store/exodus/recovery.d.ts.map +1 -1
- package/dist/store/exodus/recovery.js +20 -1
- package/dist/store/exodus/recovery.js.map +1 -1
- package/dist/store/exodus/runtime-targets.d.ts +3 -3
- package/dist/store/exodus/runtime-targets.js +3 -3
- package/dist/store/import-remap.d.ts +12 -1
- package/dist/store/import-remap.d.ts.map +1 -1
- package/dist/store/import-remap.js +14 -0
- package/dist/store/import-remap.js.map +1 -1
- package/dist/store/legacy-tasks-lineage.d.ts +3 -1
- package/dist/store/legacy-tasks-lineage.d.ts.map +1 -1
- package/dist/store/legacy-tasks-lineage.js +22 -3
- package/dist/store/legacy-tasks-lineage.js.map +1 -1
- package/dist/store/memory-accessor.js +1 -1
- package/dist/store/memory-accessor.js.map +1 -1
- package/dist/store/migration-manager.d.ts +61 -0
- package/dist/store/migration-manager.d.ts.map +1 -1
- package/dist/store/migration-manager.js +102 -4
- package/dist/store/migration-manager.js.map +1 -1
- package/dist/store/nexus-validation-schemas.d.ts +64 -0
- package/dist/store/nexus-validation-schemas.d.ts.map +1 -1
- package/dist/store/portable-bundle-import.d.ts +8 -0
- package/dist/store/portable-bundle-import.d.ts.map +1 -1
- package/dist/store/portable-bundle-import.js +10 -0
- package/dist/store/portable-bundle-import.js.map +1 -1
- package/dist/store/portable-bundle-scan.d.ts.map +1 -1
- package/dist/store/portable-bundle-scan.js +1 -0
- package/dist/store/portable-bundle-scan.js.map +1 -1
- package/dist/store/portable-bundle.d.ts.map +1 -1
- package/dist/store/portable-bundle.js +15 -14
- package/dist/store/portable-bundle.js.map +1 -1
- package/dist/store/pre-repair-snapshot.d.ts +4 -1
- package/dist/store/pre-repair-snapshot.d.ts.map +1 -1
- package/dist/store/pre-repair-snapshot.js +5 -1
- package/dist/store/pre-repair-snapshot.js.map +1 -1
- package/dist/store/regenerators.d.ts +4 -2
- package/dist/store/regenerators.d.ts.map +1 -1
- package/dist/store/regenerators.js +7 -3
- package/dist/store/regenerators.js.map +1 -1
- package/dist/store/repair-malformed-dbs.d.ts +4 -0
- package/dist/store/repair-malformed-dbs.d.ts.map +1 -1
- package/dist/store/repair-malformed-dbs.js +3 -0
- package/dist/store/repair-malformed-dbs.js.map +1 -1
- package/dist/store/row-identity-flag.d.ts +26 -0
- package/dist/store/row-identity-flag.d.ts.map +1 -0
- package/dist/store/row-identity-flag.js +31 -0
- package/dist/store/row-identity-flag.js.map +1 -0
- package/dist/store/row-identity-registry.d.ts +61 -0
- package/dist/store/row-identity-registry.d.ts.map +1 -0
- package/dist/store/row-identity-registry.js +198 -0
- package/dist/store/row-identity-registry.js.map +1 -0
- package/dist/store/row-identity.d.ts +390 -0
- package/dist/store/row-identity.d.ts.map +1 -0
- package/dist/store/row-identity.js +1240 -0
- package/dist/store/row-identity.js.map +1 -0
- package/dist/store/safety-data-accessor.d.ts +10 -3
- package/dist/store/safety-data-accessor.d.ts.map +1 -1
- package/dist/store/safety-data-accessor.js +15 -4
- package/dist/store/safety-data-accessor.js.map +1 -1
- package/dist/store/schema/attachments.d.ts +1 -1
- package/dist/store/schema/audit.d.ts +4 -4
- package/dist/store/schema/background-jobs.d.ts +1 -1
- package/dist/store/schema/cleo-global/nexus.d.ts +49 -1
- package/dist/store/schema/cleo-global/nexus.d.ts.map +1 -1
- package/dist/store/schema/cleo-global/nexus.js +17 -0
- package/dist/store/schema/cleo-global/nexus.js.map +1 -1
- package/dist/store/schema/cleo-global/skills.d.ts +2 -2
- package/dist/store/schema/cleo-project/audit.d.ts +4 -4
- package/dist/store/schema/cleo-project/docs.d.ts +17 -1
- package/dist/store/schema/cleo-project/docs.d.ts.map +1 -1
- package/dist/store/schema/cleo-project/docs.js +10 -0
- package/dist/store/schema/cleo-project/docs.js.map +1 -1
- package/dist/store/schema/cleo-project/lifecycle.d.ts +4 -4
- package/dist/store/schema/cleo-project/nexus-graph.d.ts +3 -3
- package/dist/store/schema/cleo-project/provenance-commits.d.ts +2 -2
- package/dist/store/schema/cleo-project/provenance-rest.d.ts +3 -3
- package/dist/store/schema/cleo-project/runtime.d.ts +3 -3
- package/dist/store/schema/cleo-project/tasks-core-batch2.d.ts +87 -1
- package/dist/store/schema/cleo-project/tasks-core-batch2.d.ts.map +1 -1
- package/dist/store/schema/cleo-project/tasks-core-batch2.js +35 -0
- package/dist/store/schema/cleo-project/tasks-core-batch2.js.map +1 -1
- package/dist/store/schema/cleo-project/tasks-core.d.ts +263 -7
- package/dist/store/schema/cleo-project/tasks-core.d.ts.map +1 -1
- package/dist/store/schema/cleo-project/tasks-core.js +77 -2
- package/dist/store/schema/cleo-project/tasks-core.js.map +1 -1
- package/dist/store/schema/cleo-shared/brain.d.ts +7 -7
- package/dist/store/schema/lifecycle.d.ts +4 -4
- package/dist/store/schema/manifest.d.ts +1 -1
- package/dist/store/schema/memory-schema.d.ts +6 -6
- package/dist/store/schema/nexus-schema.d.ts +51 -3
- package/dist/store/schema/nexus-schema.d.ts.map +1 -1
- package/dist/store/schema/nexus-schema.js +28 -7
- package/dist/store/schema/nexus-schema.js.map +1 -1
- package/dist/store/schema/provenance/releases.d.ts +1 -1
- package/dist/store/schema/skills-schema.d.ts +2 -2
- package/dist/store/schema/tasks.d.ts +6 -6
- package/dist/store/session-store.d.ts +65 -0
- package/dist/store/session-store.d.ts.map +1 -1
- package/dist/store/session-store.js +108 -7
- package/dist/store/session-store.js.map +1 -1
- package/dist/store/split-brain-import.d.ts +2 -14
- package/dist/store/split-brain-import.d.ts.map +1 -1
- package/dist/store/split-brain-import.js +4 -19
- package/dist/store/split-brain-import.js.map +1 -1
- package/dist/store/sqlite-data-accessor.d.ts +279 -2
- package/dist/store/sqlite-data-accessor.d.ts.map +1 -1
- package/dist/store/sqlite-data-accessor.js +789 -91
- package/dist/store/sqlite-data-accessor.js.map +1 -1
- package/dist/store/sqlite.d.ts +15 -3
- package/dist/store/sqlite.d.ts.map +1 -1
- package/dist/store/sqlite.js +52 -20
- package/dist/store/sqlite.js.map +1 -1
- package/dist/store/store-write-guard.d.ts +9 -3
- package/dist/store/store-write-guard.d.ts.map +1 -1
- package/dist/store/store-write-guard.js +25 -4
- package/dist/store/store-write-guard.js.map +1 -1
- package/dist/store/sync/clock-store.d.ts +67 -0
- package/dist/store/sync/clock-store.d.ts.map +1 -0
- package/dist/store/sync/clock-store.js +117 -0
- package/dist/store/sync/clock-store.js.map +1 -0
- package/dist/store/sync/flags.d.ts +51 -0
- package/dist/store/sync/flags.d.ts.map +1 -0
- package/dist/store/sync/flags.js +81 -0
- package/dist/store/sync/flags.js.map +1 -0
- package/dist/store/sync/hlc.d.ts +115 -0
- package/dist/store/sync/hlc.d.ts.map +1 -0
- package/dist/store/sync/hlc.js +172 -0
- package/dist/store/sync/hlc.js.map +1 -0
- package/dist/store/sync/index.d.ts +20 -0
- package/dist/store/sync/index.d.ts.map +1 -0
- package/dist/store/sync/index.js +20 -0
- package/dist/store/sync/index.js.map +1 -0
- package/dist/store/sync/replica-registry.d.ts +85 -0
- package/dist/store/sync/replica-registry.d.ts.map +1 -0
- package/dist/store/sync/replica-registry.js +147 -0
- package/dist/store/sync/replica-registry.js.map +1 -0
- package/dist/store/sync/replica.d.ts +181 -0
- package/dist/store/sync/replica.d.ts.map +1 -0
- package/dist/store/sync/replica.js +305 -0
- package/dist/store/sync/replica.js.map +1 -0
- package/dist/store/sync/schema.d.ts +68 -0
- package/dist/store/sync/schema.d.ts.map +1 -0
- package/dist/store/sync/schema.js +130 -0
- package/dist/store/sync/schema.js.map +1 -0
- package/dist/store/sync/skew-hold.d.ts +71 -0
- package/dist/store/sync/skew-hold.d.ts.map +1 -0
- package/dist/store/sync/skew-hold.js +89 -0
- package/dist/store/sync/skew-hold.js.map +1 -0
- package/dist/store/table-classification.d.ts +11 -9
- package/dist/store/table-classification.d.ts.map +1 -1
- package/dist/store/table-classification.js +127 -33
- package/dist/store/table-classification.js.map +1 -1
- package/dist/store/task-claim.d.ts +144 -0
- package/dist/store/task-claim.d.ts.map +1 -0
- package/dist/store/task-claim.js +195 -0
- package/dist/store/task-claim.js.map +1 -0
- package/dist/store/task-version.d.ts +43 -5
- package/dist/store/task-version.d.ts.map +1 -1
- package/dist/store/task-version.js +113 -17
- package/dist/store/task-version.js.map +1 -1
- package/dist/store/tasks-schema.d.ts +2 -0
- package/dist/store/tasks-schema.d.ts.map +1 -1
- package/dist/store/tasks-schema.js +1 -0
- package/dist/store/tasks-schema.js.map +1 -1
- package/dist/store/tasks-sqlite.d.ts.map +1 -1
- package/dist/store/tasks-sqlite.js +10 -2
- package/dist/store/tasks-sqlite.js.map +1 -1
- package/dist/store/twin-collapse.d.ts +450 -22
- package/dist/store/twin-collapse.d.ts.map +1 -1
- package/dist/store/twin-collapse.js +1552 -49
- package/dist/store/twin-collapse.js.map +1 -1
- package/dist/store/umbrella-data-accessor.d.ts +10 -3
- package/dist/store/umbrella-data-accessor.d.ts.map +1 -1
- package/dist/store/umbrella-data-accessor.js +14 -4
- package/dist/store/umbrella-data-accessor.js.map +1 -1
- package/dist/store/validation-schemas.d.ts +402 -50
- package/dist/store/validation-schemas.d.ts.map +1 -1
- package/dist/store/with-retry.d.ts +36 -0
- package/dist/store/with-retry.d.ts.map +1 -1
- package/dist/store/with-retry.js +51 -0
- package/dist/store/with-retry.js.map +1 -1
- package/dist/store/worktree-build-guard.d.ts +13 -4
- package/dist/store/worktree-build-guard.d.ts.map +1 -1
- package/dist/store/worktree-build-guard.js +21 -10
- package/dist/store/worktree-build-guard.js.map +1 -1
- package/dist/store/worktree-isolation-guard.d.ts +121 -10
- package/dist/store/worktree-isolation-guard.d.ts.map +1 -1
- package/dist/store/worktree-isolation-guard.js +155 -34
- package/dist/store/worktree-isolation-guard.js.map +1 -1
- package/dist/system/backup.d.ts +7 -0
- package/dist/system/backup.d.ts.map +1 -1
- package/dist/system/backup.js +5 -0
- package/dist/system/backup.js.map +1 -1
- package/dist/system/health.d.ts.map +1 -1
- package/dist/system/health.js +6 -1
- package/dist/system/health.js.map +1 -1
- package/dist/system/inject-generate.d.ts.map +1 -1
- package/dist/system/inject-generate.js +23 -10
- package/dist/system/inject-generate.js.map +1 -1
- package/dist/system/project-health.d.ts +17 -2
- package/dist/system/project-health.d.ts.map +1 -1
- package/dist/system/project-health.js +19 -6
- package/dist/system/project-health.js.map +1 -1
- package/dist/task-tools/index.d.ts +1 -1
- package/dist/task-tools/index.d.ts.map +1 -1
- package/dist/task-tools/index.js +1 -1
- package/dist/task-tools/index.js.map +1 -1
- package/dist/task-tools/score-task-priority.d.ts +38 -0
- package/dist/task-tools/score-task-priority.d.ts.map +1 -1
- package/dist/task-tools/score-task-priority.js +51 -0
- package/dist/task-tools/score-task-priority.js.map +1 -1
- package/dist/task-work/claims.d.ts +215 -0
- package/dist/task-work/claims.d.ts.map +1 -0
- package/dist/task-work/claims.js +272 -0
- package/dist/task-work/claims.js.map +1 -0
- package/dist/task-work/index.d.ts +47 -3
- package/dist/task-work/index.d.ts.map +1 -1
- package/dist/task-work/index.js +74 -41
- package/dist/task-work/index.js.map +1 -1
- package/dist/tasks/ac-coverage-gate.d.ts.map +1 -1
- package/dist/tasks/ac-coverage-gate.js +3 -0
- package/dist/tasks/ac-coverage-gate.js.map +1 -1
- package/dist/tasks/ac-table.d.ts +35 -7
- package/dist/tasks/ac-table.d.ts.map +1 -1
- package/dist/tasks/ac-table.js +119 -14
- package/dist/tasks/ac-table.js.map +1 -1
- package/dist/tasks/add.d.ts.map +1 -1
- package/dist/tasks/add.js +51 -4
- package/dist/tasks/add.js.map +1 -1
- package/dist/tasks/analyze.d.ts.map +1 -1
- package/dist/tasks/analyze.js +3 -4
- package/dist/tasks/analyze.js.map +1 -1
- package/dist/tasks/backfill-child-projections.js +47 -6
- package/dist/tasks/backfill-child-projections.js.map +1 -1
- package/dist/tasks/change-set.d.ts +5 -0
- package/dist/tasks/change-set.d.ts.map +1 -1
- package/dist/tasks/change-set.js +59 -3
- package/dist/tasks/change-set.js.map +1 -1
- package/dist/tasks/complete.d.ts +16 -0
- package/dist/tasks/complete.d.ts.map +1 -1
- package/dist/tasks/complete.js +33 -8
- package/dist/tasks/complete.js.map +1 -1
- package/dist/tasks/completion-evaluation.d.ts.map +1 -1
- package/dist/tasks/completion-evaluation.js +3 -0
- package/dist/tasks/completion-evaluation.js.map +1 -1
- package/dist/tasks/component-pr.d.ts +162 -1
- package/dist/tasks/component-pr.d.ts.map +1 -1
- package/dist/tasks/component-pr.js +560 -59
- package/dist/tasks/component-pr.js.map +1 -1
- package/dist/tasks/done-record.d.ts +14 -1
- package/dist/tasks/done-record.d.ts.map +1 -1
- package/dist/tasks/done-record.js +37 -0
- package/dist/tasks/done-record.js.map +1 -1
- package/dist/tasks/duplicate-detector.d.ts +20 -1
- package/dist/tasks/duplicate-detector.d.ts.map +1 -1
- package/dist/tasks/duplicate-detector.js +10 -2
- package/dist/tasks/duplicate-detector.js.map +1 -1
- package/dist/tasks/engine-wrap-ops.d.ts +19 -10
- package/dist/tasks/engine-wrap-ops.d.ts.map +1 -1
- package/dist/tasks/engine-wrap-ops.js +38 -10
- package/dist/tasks/engine-wrap-ops.js.map +1 -1
- package/dist/tasks/evidence.d.ts.map +1 -1
- package/dist/tasks/evidence.js +14 -3
- package/dist/tasks/evidence.js.map +1 -1
- package/dist/tasks/graph-ops.d.ts +9 -2
- package/dist/tasks/graph-ops.d.ts.map +1 -1
- package/dist/tasks/graph-ops.js +24 -32
- package/dist/tasks/graph-ops.js.map +1 -1
- package/dist/tasks/plan.d.ts.map +1 -1
- package/dist/tasks/plan.js +16 -60
- package/dist/tasks/plan.js.map +1 -1
- package/dist/tasks/task-context.d.ts.map +1 -1
- package/dist/tasks/task-context.js +13 -0
- package/dist/tasks/task-context.js.map +1 -1
- package/dist/tasks/task-import.d.ts.map +1 -1
- package/dist/tasks/task-import.js +21 -12
- package/dist/tasks/task-import.js.map +1 -1
- package/dist/tasks/task-next.d.ts +25 -2
- package/dist/tasks/task-next.d.ts.map +1 -1
- package/dist/tasks/task-next.js +32 -13
- package/dist/tasks/task-next.js.map +1 -1
- package/dist/tasks/update.d.ts.map +1 -1
- package/dist/tasks/update.js +7 -5
- package/dist/tasks/update.js.map +1 -1
- package/dist/upgrade.d.ts +1 -1
- package/dist/upgrade.d.ts.map +1 -1
- package/dist/upgrade.js +48 -9
- package/dist/upgrade.js.map +1 -1
- package/dist/validation/compliance.d.ts +5 -1
- package/dist/validation/compliance.d.ts.map +1 -1
- package/dist/validation/compliance.js +24 -3
- package/dist/validation/compliance.js.map +1 -1
- package/dist/validation/doctor/checks.d.ts +20 -6
- package/dist/validation/doctor/checks.d.ts.map +1 -1
- package/dist/validation/doctor/checks.js +51 -8
- package/dist/validation/doctor/checks.js.map +1 -1
- package/dist/validation/index.d.ts +1 -1
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/validation/index.js +1 -1
- package/dist/validation/index.js.map +1 -1
- package/dist/validation/protocol-common.d.ts +47 -2
- package/dist/validation/protocol-common.d.ts.map +1 -1
- package/dist/validation/protocol-common.js +86 -21
- package/dist/validation/protocol-common.js.map +1 -1
- package/dist/validation/validate-ops.d.ts.map +1 -1
- package/dist/validation/validate-ops.js +2 -3
- package/dist/validation/validate-ops.js.map +1 -1
- package/migrations/README.md +12 -0
- package/migrations/drizzle-cleo-global/20260929010000_t12512-registry-probed-opened/migration.sql +35 -0
- package/migrations/drizzle-cleo-global/20260929020000_t12721-git-state-head-committed-at/migration.sql +25 -0
- package/migrations/drizzle-cleo-project/20260928120000_t12341-row-uids/migration.sql +169 -0
- package/migrations/drizzle-cleo-project/20260929000000_t12535-docs-attachments-union-shape/migration.sql +21 -0
- package/migrations/drizzle-cleo-project/20260929120000_t12502-task-claim-leases/migration.sql +77 -0
- package/migrations/drizzle-cleo-project/20260929130000_t12736-claim-lease-iso-repair/migration.sql +37 -0
- package/migrations/sync-journal/20260929140000_t12342-sync-clock/migration.sql +42 -0
- package/package.json +23 -13
- package/schemas/project-info.schema.json +10 -4
- package/templates/CLEO-INJECTION.md +1 -1
- package/templates/CLEO-REFERENCE.md +7 -3
- package/templates/cleo-gitignore +11 -0
- package/templates/workflows/release-prepare.yml.tmpl +156 -10
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Leased agent claims on tasks — lease arithmetic and the typed refusal (T12502).
|
|
3
|
+
*
|
|
4
|
+
* A claim is four columns on `tasks_tasks` (`claimed_by_session`,
|
|
5
|
+
* `claimed_by_agent`, `claimed_at`, `lease_expires_at`), separate from the
|
|
6
|
+
* human `assignee`. It is written ONLY through the T12503 field chokepoint
|
|
7
|
+
* (`updateTaskFields`) with a `TaskClaimGuard`, which turns the claim into a
|
|
8
|
+
* compare-and-set in the UPDATE's WHERE clause (see
|
|
9
|
+
* `sqlite-data-accessor.ts#claimPredicate`). This module holds what the
|
|
10
|
+
* chokepoint and its callers share:
|
|
11
|
+
*
|
|
12
|
+
* - the lease TTL ({@link taskClaimLeaseMs}) and expiry
|
|
13
|
+
* ({@link leaseExpiresAtFrom});
|
|
14
|
+
* - the row → {@link TaskClaim} mapping ({@link claimFromColumns});
|
|
15
|
+
* - the `E_TASK_CLAIMED` error ({@link taskClaimedError}), which names the
|
|
16
|
+
* holder, the lease expiry and the one explicit, audited override.
|
|
17
|
+
*
|
|
18
|
+
* Lifecycle: taken by `cleo start` / `cleo claim` / spawn; renewed by the
|
|
19
|
+
* holder session's mutations (dispatch heartbeat) or `cleo claim --renew`;
|
|
20
|
+
* released by `cleo stop`, `cleo unclaim`, and — via SQL triggers — by the
|
|
21
|
+
* task reaching done / cancelled / archived and by the holder session ending
|
|
22
|
+
* or being deleted. An expired lease is never taken silently: `--take-over`.
|
|
23
|
+
*
|
|
24
|
+
* @task T12502
|
|
25
|
+
* @epic T12497
|
|
26
|
+
*/
|
|
27
|
+
import { type TaskClaim, type TaskClaimMode } from '@cleocode/contracts';
|
|
28
|
+
import { CleoError } from '../errors.js';
|
|
29
|
+
/** Default claim lease: 30 minutes, renewed by the holder's activity. */
|
|
30
|
+
export declare const DEFAULT_TASK_CLAIM_LEASE_MS: number;
|
|
31
|
+
/**
|
|
32
|
+
* Environment override for the lease length, in whole minutes. Values that
|
|
33
|
+
* are not positive integers are ignored.
|
|
34
|
+
*/
|
|
35
|
+
export declare const TASK_CLAIM_LEASE_ENV = "CLEO_CLAIM_LEASE_MINUTES";
|
|
36
|
+
/**
|
|
37
|
+
* Resolve the claim lease length in milliseconds.
|
|
38
|
+
*
|
|
39
|
+
* @returns `CLEO_CLAIM_LEASE_MINUTES` in ms when set to a positive integer,
|
|
40
|
+
* else {@link DEFAULT_TASK_CLAIM_LEASE_MS}.
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* const expires = leaseExpiresAtFrom(now, taskClaimLeaseMs());
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare function taskClaimLeaseMs(): number;
|
|
47
|
+
/**
|
|
48
|
+
* Compute a lease expiry.
|
|
49
|
+
*
|
|
50
|
+
* @param now - ISO-8601 UTC instant the lease starts or is renewed.
|
|
51
|
+
* @param leaseMs - Lease length in milliseconds.
|
|
52
|
+
* @returns The ISO-8601 UTC expiry instant.
|
|
53
|
+
* @example
|
|
54
|
+
* ```ts
|
|
55
|
+
* leaseExpiresAtFrom('2026-09-29T00:00:00.000Z', 60_000); // '2026-09-29T00:01:00.000Z'
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export declare function leaseExpiresAtFrom(now: string, leaseMs: number): string;
|
|
59
|
+
/** The claim columns as stored on a task row. */
|
|
60
|
+
export interface TaskClaimColumns {
|
|
61
|
+
/** `claimed_by_session`. */
|
|
62
|
+
claimedBySession: string | null;
|
|
63
|
+
/** `claimed_by_agent`. */
|
|
64
|
+
claimedByAgent: string | null;
|
|
65
|
+
/** `claimed_at`. */
|
|
66
|
+
claimedAt: string | null;
|
|
67
|
+
/** `lease_expires_at`. */
|
|
68
|
+
leaseExpiresAt: string | null;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Map stored claim columns to a {@link TaskClaim}.
|
|
72
|
+
*
|
|
73
|
+
* @param row - The claim columns of a task row.
|
|
74
|
+
* @returns The lease, or `undefined` when the task is unclaimed.
|
|
75
|
+
* @example
|
|
76
|
+
* ```ts
|
|
77
|
+
* const claim = claimFromColumns(row); // undefined for an unclaimed task
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
export declare function claimFromColumns(row: TaskClaimColumns): TaskClaim | undefined;
|
|
81
|
+
/**
|
|
82
|
+
* The claim columns for a loaded task's lease (all `null` when unclaimed).
|
|
83
|
+
*
|
|
84
|
+
* @param claim - The lease on a task, if any.
|
|
85
|
+
* @returns The four claim columns.
|
|
86
|
+
* @example
|
|
87
|
+
* ```ts
|
|
88
|
+
* claimColumnsOf(task.claim).claimedBySession;
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
export declare function claimColumnsOf(claim: TaskClaim | undefined): TaskClaimColumns;
|
|
92
|
+
/**
|
|
93
|
+
* Whether a lease has lapsed at `now`. A lease with no recorded expiry
|
|
94
|
+
* counts as lapsed (it can never be renewed into validity by its holder
|
|
95
|
+
* anyway, and must not block forever).
|
|
96
|
+
*
|
|
97
|
+
* @param claim - The stored lease.
|
|
98
|
+
* @param now - ISO-8601 UTC instant to compare against.
|
|
99
|
+
* @returns `true` when `leaseExpiresAt <= now`.
|
|
100
|
+
* @example
|
|
101
|
+
* ```ts
|
|
102
|
+
* isClaimExpired(holder, new Date().toISOString());
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
export declare function isClaimExpired(claim: TaskClaim, now: string): boolean;
|
|
106
|
+
/**
|
|
107
|
+
* Whether a claim write in `mode` by `sessionId` may replace the stored lease.
|
|
108
|
+
* This is the JavaScript mirror of the SQL predicate; the chokepoint uses the
|
|
109
|
+
* SQL form for the write and this form only to explain a refusal.
|
|
110
|
+
*
|
|
111
|
+
* @param stored - The lease on the row, or `undefined` when unclaimed.
|
|
112
|
+
* @param mode - The claim mode.
|
|
113
|
+
* @param sessionId - The caller's session (`null` when unbound).
|
|
114
|
+
* @param now - ISO-8601 UTC instant for the expiry comparison.
|
|
115
|
+
* @param allowedHolders - Sessions whose lease `acquire` / `take-over` may take
|
|
116
|
+
* even while live: the spawn hand-off source and the caller's spawn-edge
|
|
117
|
+
* parent and children (`tasks_sessions.parent_session_id`).
|
|
118
|
+
* @returns `true` when the write is allowed.
|
|
119
|
+
* @example
|
|
120
|
+
* ```ts
|
|
121
|
+
* claimAllows(stored, 'acquire', 'ses_a', now); // false when ses_b holds it
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
124
|
+
export declare function claimAllows(stored: TaskClaim | undefined, mode: TaskClaimMode, sessionId: string | null, now: string, allowedHolders?: readonly string[]): boolean;
|
|
125
|
+
/**
|
|
126
|
+
* Build the `E_TASK_CLAIMED` refusal.
|
|
127
|
+
*
|
|
128
|
+
* @param taskId - The claimed task.
|
|
129
|
+
* @param holder - The lease stored on the task.
|
|
130
|
+
* @param requester - The refused caller.
|
|
131
|
+
* @param now - ISO-8601 UTC instant used for the expiry comparison.
|
|
132
|
+
* @param verb - The refused command, for the fix hint (`start`, `claim`, …).
|
|
133
|
+
* @returns A {@link CleoError} with `ExitCode.TASK_CLAIMED` (LAFS
|
|
134
|
+
* `E_TASK_CLAIMED`) and {@link TaskClaimedDetails} as `details`.
|
|
135
|
+
* @example
|
|
136
|
+
* ```ts
|
|
137
|
+
* throw taskClaimedError('T1', holder, { sessionId: 'ses_b', agentId: null }, now);
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
140
|
+
export declare function taskClaimedError(taskId: string, holder: TaskClaim, requester: {
|
|
141
|
+
sessionId: string | null;
|
|
142
|
+
agentId: string | null;
|
|
143
|
+
}, now: string, verb?: string): CleoError;
|
|
144
|
+
//# sourceMappingURL=task-claim.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-claim.d.ts","sourceRoot":"","sources":["../../src/store/task-claim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAEL,KAAK,SAAS,EAEd,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,yEAAyE;AACzE,eAAO,MAAM,2BAA2B,QAAiB,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,oBAAoB,6BAA6B,CAAC;AAE/D;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAOzC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED,iDAAiD;AACjD,MAAM,WAAW,gBAAgB;IAC/B,4BAA4B;IAC5B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,0BAA0B;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,oBAAoB;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,0BAA0B;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,GAAG,SAAS,GAAG,SAAS,CAQ7E;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,gBAAgB,CAO7E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAErE;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,SAAS,GAAG,SAAS,EAC7B,IAAI,EAAE,aAAa,EACnB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,GAAG,EAAE,MAAM,EACX,cAAc,GAAE,SAAS,MAAM,EAAO,GACrC,OAAO,CAST;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE;IAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAC/D,GAAG,EAAE,MAAM,EACX,IAAI,SAAU,GACb,SAAS,CAwBX"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Leased agent claims on tasks — lease arithmetic and the typed refusal (T12502).
|
|
3
|
+
*
|
|
4
|
+
* A claim is four columns on `tasks_tasks` (`claimed_by_session`,
|
|
5
|
+
* `claimed_by_agent`, `claimed_at`, `lease_expires_at`), separate from the
|
|
6
|
+
* human `assignee`. It is written ONLY through the T12503 field chokepoint
|
|
7
|
+
* (`updateTaskFields`) with a `TaskClaimGuard`, which turns the claim into a
|
|
8
|
+
* compare-and-set in the UPDATE's WHERE clause (see
|
|
9
|
+
* `sqlite-data-accessor.ts#claimPredicate`). This module holds what the
|
|
10
|
+
* chokepoint and its callers share:
|
|
11
|
+
*
|
|
12
|
+
* - the lease TTL ({@link taskClaimLeaseMs}) and expiry
|
|
13
|
+
* ({@link leaseExpiresAtFrom});
|
|
14
|
+
* - the row → {@link TaskClaim} mapping ({@link claimFromColumns});
|
|
15
|
+
* - the `E_TASK_CLAIMED` error ({@link taskClaimedError}), which names the
|
|
16
|
+
* holder, the lease expiry and the one explicit, audited override.
|
|
17
|
+
*
|
|
18
|
+
* Lifecycle: taken by `cleo start` / `cleo claim` / spawn; renewed by the
|
|
19
|
+
* holder session's mutations (dispatch heartbeat) or `cleo claim --renew`;
|
|
20
|
+
* released by `cleo stop`, `cleo unclaim`, and — via SQL triggers — by the
|
|
21
|
+
* task reaching done / cancelled / archived and by the holder session ending
|
|
22
|
+
* or being deleted. An expired lease is never taken silently: `--take-over`.
|
|
23
|
+
*
|
|
24
|
+
* @task T12502
|
|
25
|
+
* @epic T12497
|
|
26
|
+
*/
|
|
27
|
+
import { ExitCode, } from '@cleocode/contracts';
|
|
28
|
+
import { CleoError } from '../errors.js';
|
|
29
|
+
/** Default claim lease: 30 minutes, renewed by the holder's activity. */
|
|
30
|
+
export const DEFAULT_TASK_CLAIM_LEASE_MS = 30 * 60 * 1000;
|
|
31
|
+
/**
|
|
32
|
+
* Environment override for the lease length, in whole minutes. Values that
|
|
33
|
+
* are not positive integers are ignored.
|
|
34
|
+
*/
|
|
35
|
+
export const TASK_CLAIM_LEASE_ENV = 'CLEO_CLAIM_LEASE_MINUTES';
|
|
36
|
+
/**
|
|
37
|
+
* Resolve the claim lease length in milliseconds.
|
|
38
|
+
*
|
|
39
|
+
* @returns `CLEO_CLAIM_LEASE_MINUTES` in ms when set to a positive integer,
|
|
40
|
+
* else {@link DEFAULT_TASK_CLAIM_LEASE_MS}.
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* const expires = leaseExpiresAtFrom(now, taskClaimLeaseMs());
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export function taskClaimLeaseMs() {
|
|
47
|
+
const raw = process.env[TASK_CLAIM_LEASE_ENV];
|
|
48
|
+
if (raw && /^\d+$/.test(raw)) {
|
|
49
|
+
const minutes = Number(raw);
|
|
50
|
+
if (minutes > 0)
|
|
51
|
+
return minutes * 60 * 1000;
|
|
52
|
+
}
|
|
53
|
+
return DEFAULT_TASK_CLAIM_LEASE_MS;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Compute a lease expiry.
|
|
57
|
+
*
|
|
58
|
+
* @param now - ISO-8601 UTC instant the lease starts or is renewed.
|
|
59
|
+
* @param leaseMs - Lease length in milliseconds.
|
|
60
|
+
* @returns The ISO-8601 UTC expiry instant.
|
|
61
|
+
* @example
|
|
62
|
+
* ```ts
|
|
63
|
+
* leaseExpiresAtFrom('2026-09-29T00:00:00.000Z', 60_000); // '2026-09-29T00:01:00.000Z'
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export function leaseExpiresAtFrom(now, leaseMs) {
|
|
67
|
+
return new Date(Date.parse(now) + leaseMs).toISOString();
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Map stored claim columns to a {@link TaskClaim}.
|
|
71
|
+
*
|
|
72
|
+
* @param row - The claim columns of a task row.
|
|
73
|
+
* @returns The lease, or `undefined` when the task is unclaimed.
|
|
74
|
+
* @example
|
|
75
|
+
* ```ts
|
|
76
|
+
* const claim = claimFromColumns(row); // undefined for an unclaimed task
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
export function claimFromColumns(row) {
|
|
80
|
+
if (!row.claimedBySession)
|
|
81
|
+
return undefined;
|
|
82
|
+
return {
|
|
83
|
+
sessionId: row.claimedBySession,
|
|
84
|
+
agentId: row.claimedByAgent,
|
|
85
|
+
claimedAt: row.claimedAt ?? '',
|
|
86
|
+
leaseExpiresAt: row.leaseExpiresAt ?? '',
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* The claim columns for a loaded task's lease (all `null` when unclaimed).
|
|
91
|
+
*
|
|
92
|
+
* @param claim - The lease on a task, if any.
|
|
93
|
+
* @returns The four claim columns.
|
|
94
|
+
* @example
|
|
95
|
+
* ```ts
|
|
96
|
+
* claimColumnsOf(task.claim).claimedBySession;
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
export function claimColumnsOf(claim) {
|
|
100
|
+
return {
|
|
101
|
+
claimedBySession: claim?.sessionId ?? null,
|
|
102
|
+
claimedByAgent: claim?.agentId ?? null,
|
|
103
|
+
claimedAt: claim?.claimedAt ?? null,
|
|
104
|
+
leaseExpiresAt: claim?.leaseExpiresAt ?? null,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Whether a lease has lapsed at `now`. A lease with no recorded expiry
|
|
109
|
+
* counts as lapsed (it can never be renewed into validity by its holder
|
|
110
|
+
* anyway, and must not block forever).
|
|
111
|
+
*
|
|
112
|
+
* @param claim - The stored lease.
|
|
113
|
+
* @param now - ISO-8601 UTC instant to compare against.
|
|
114
|
+
* @returns `true` when `leaseExpiresAt <= now`.
|
|
115
|
+
* @example
|
|
116
|
+
* ```ts
|
|
117
|
+
* isClaimExpired(holder, new Date().toISOString());
|
|
118
|
+
* ```
|
|
119
|
+
*/
|
|
120
|
+
export function isClaimExpired(claim, now) {
|
|
121
|
+
return claim.leaseExpiresAt === '' || claim.leaseExpiresAt <= now;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Whether a claim write in `mode` by `sessionId` may replace the stored lease.
|
|
125
|
+
* This is the JavaScript mirror of the SQL predicate; the chokepoint uses the
|
|
126
|
+
* SQL form for the write and this form only to explain a refusal.
|
|
127
|
+
*
|
|
128
|
+
* @param stored - The lease on the row, or `undefined` when unclaimed.
|
|
129
|
+
* @param mode - The claim mode.
|
|
130
|
+
* @param sessionId - The caller's session (`null` when unbound).
|
|
131
|
+
* @param now - ISO-8601 UTC instant for the expiry comparison.
|
|
132
|
+
* @param allowedHolders - Sessions whose lease `acquire` / `take-over` may take
|
|
133
|
+
* even while live: the spawn hand-off source and the caller's spawn-edge
|
|
134
|
+
* parent and children (`tasks_sessions.parent_session_id`).
|
|
135
|
+
* @returns `true` when the write is allowed.
|
|
136
|
+
* @example
|
|
137
|
+
* ```ts
|
|
138
|
+
* claimAllows(stored, 'acquire', 'ses_a', now); // false when ses_b holds it
|
|
139
|
+
* ```
|
|
140
|
+
*/
|
|
141
|
+
export function claimAllows(stored, mode, sessionId, now, allowedHolders = []) {
|
|
142
|
+
if (mode === 'force')
|
|
143
|
+
return true;
|
|
144
|
+
if (mode === 'renew' || mode === 'release') {
|
|
145
|
+
return stored !== undefined && sessionId !== null && stored.sessionId === sessionId;
|
|
146
|
+
}
|
|
147
|
+
if (!stored)
|
|
148
|
+
return true;
|
|
149
|
+
if (sessionId !== null && stored.sessionId === sessionId)
|
|
150
|
+
return true;
|
|
151
|
+
if (allowedHolders.includes(stored.sessionId))
|
|
152
|
+
return true;
|
|
153
|
+
return mode === 'take-over' && isClaimExpired(stored, now);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Build the `E_TASK_CLAIMED` refusal.
|
|
157
|
+
*
|
|
158
|
+
* @param taskId - The claimed task.
|
|
159
|
+
* @param holder - The lease stored on the task.
|
|
160
|
+
* @param requester - The refused caller.
|
|
161
|
+
* @param now - ISO-8601 UTC instant used for the expiry comparison.
|
|
162
|
+
* @param verb - The refused command, for the fix hint (`start`, `claim`, …).
|
|
163
|
+
* @returns A {@link CleoError} with `ExitCode.TASK_CLAIMED` (LAFS
|
|
164
|
+
* `E_TASK_CLAIMED`) and {@link TaskClaimedDetails} as `details`.
|
|
165
|
+
* @example
|
|
166
|
+
* ```ts
|
|
167
|
+
* throw taskClaimedError('T1', holder, { sessionId: 'ses_b', agentId: null }, now);
|
|
168
|
+
* ```
|
|
169
|
+
*/
|
|
170
|
+
export function taskClaimedError(taskId, holder, requester, now, verb = 'start') {
|
|
171
|
+
const expired = isClaimExpired(holder, now);
|
|
172
|
+
const override = expired ? '--take-over' : '--force-claim';
|
|
173
|
+
const details = {
|
|
174
|
+
field: 'claimedBySession',
|
|
175
|
+
taskId,
|
|
176
|
+
holder,
|
|
177
|
+
expired,
|
|
178
|
+
requester,
|
|
179
|
+
override,
|
|
180
|
+
};
|
|
181
|
+
const who = holder.agentId
|
|
182
|
+
? `session ${holder.sessionId} (agent ${holder.agentId})`
|
|
183
|
+
: `session ${holder.sessionId}`;
|
|
184
|
+
const lease = expired
|
|
185
|
+
? `its lease expired at ${holder.leaseExpiresAt}`
|
|
186
|
+
: `lease expires ${holder.leaseExpiresAt}`;
|
|
187
|
+
const fix = expired
|
|
188
|
+
? `The holder stopped renewing its lease. Take the task over explicitly (audited): cleo ${verb} ${taskId} --take-over`
|
|
189
|
+
: `Pick another task (cleo next), wait for the lease to expire at ${holder.leaseExpiresAt}, or override the live lease (audited): cleo ${verb} ${taskId} --force-claim`;
|
|
190
|
+
return new CleoError(ExitCode.TASK_CLAIMED, `Task ${taskId} is claimed by ${who}; ${lease}.`, {
|
|
191
|
+
fix,
|
|
192
|
+
details: { ...details },
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=task-claim.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-claim.js","sourceRoot":"","sources":["../../src/store/task-claim.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,13 @@
|
|
|
11
11
|
* leave the row at a version a stale reader already holds (no ABA).
|
|
12
12
|
* 2. The comparison ({@link assertTaskVersion}) runs after `BEGIN IMMEDIATE`
|
|
13
13
|
* holds the database write lock, so no other process can commit between
|
|
14
|
-
* the check and the write.
|
|
14
|
+
* the check and the write. The field-level chokepoint
|
|
15
|
+
* (`updateTaskFields`) additionally puts the version in the UPDATE's
|
|
16
|
+
* WHERE clause, so a guarded write is a single compare-and-set statement.
|
|
17
|
+
*
|
|
18
|
+
* A conflict is raised by {@link taskConflictError}: `E_CONFLICT` with the
|
|
19
|
+
* current version, the fields that differ from the caller's read, the stored
|
|
20
|
+
* values to merge against, and a `--if-match` retry hint.
|
|
15
21
|
*
|
|
16
22
|
* `withWriteRetry` only absorbs `SQLITE_BUSY`; it cannot detect a lost update.
|
|
17
23
|
* These helpers are what turn a stale read-modify-write into a typed
|
|
@@ -20,6 +26,8 @@
|
|
|
20
26
|
* @task T12503
|
|
21
27
|
* @epic T12497
|
|
22
28
|
*/
|
|
29
|
+
import { type Task, type TaskConflictChange } from '@cleocode/contracts';
|
|
30
|
+
import { CleoError } from '../errors.js';
|
|
23
31
|
/** The minimal row shape that carries a task version. */
|
|
24
32
|
export interface TaskVersionSource {
|
|
25
33
|
/** Last-update timestamp (ISO 8601), or null/undefined for a never-updated row. */
|
|
@@ -51,6 +59,36 @@ export declare function taskVersion(row: TaskVersionSource | null | undefined):
|
|
|
51
59
|
* ```
|
|
52
60
|
*/
|
|
53
61
|
export declare function nextTaskVersion(current: TaskVersionSource | null | undefined, now?: string): string;
|
|
62
|
+
/**
|
|
63
|
+
* List the fields whose stored value differs from the caller's read.
|
|
64
|
+
*
|
|
65
|
+
* The version field (`updatedAt`) is never listed; an absent field and an
|
|
66
|
+
* explicit `null` compare equal.
|
|
67
|
+
*
|
|
68
|
+
* @param baseline - The task as the caller read it.
|
|
69
|
+
* @param current - The task as stored now.
|
|
70
|
+
* @returns One entry per differing field, sorted by field name.
|
|
71
|
+
* @example
|
|
72
|
+
* ```ts
|
|
73
|
+
* diffTaskFields(before, after); // [{ field: 'labels', was: '["a"]', now: '["a","b"]' }]
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
export declare function diffTaskFields(baseline: Task, current: Task): TaskConflictChange[];
|
|
77
|
+
/**
|
|
78
|
+
* Build the `E_CONFLICT` error for a stale task write.
|
|
79
|
+
*
|
|
80
|
+
* @param taskId - Task being written.
|
|
81
|
+
* @param expectedUpdatedAt - The version the caller expected.
|
|
82
|
+
* @param current - The row as stored now; a full task adds the merge summary.
|
|
83
|
+
* @param baseline - The task as the caller read it, when the write path has it.
|
|
84
|
+
* @returns A {@link CleoError} with `ExitCode.VERSION_CONFLICT` (LAFS
|
|
85
|
+
* `E_CONFLICT`), a fix hint, and {@link TaskConflictDetails} as `details`.
|
|
86
|
+
* @example
|
|
87
|
+
* ```ts
|
|
88
|
+
* throw taskConflictError('T1', expected, await accessor.loadSingleTask('T1'), baseline);
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
export declare function taskConflictError(taskId: string, expectedUpdatedAt: string, current: Task | TaskVersionSource | null, baseline?: Task): CleoError;
|
|
54
92
|
/**
|
|
55
93
|
* Throw `E_CONFLICT` when the caller's expected version no longer matches.
|
|
56
94
|
*
|
|
@@ -60,13 +98,13 @@ export declare function nextTaskVersion(current: TaskVersionSource | null | unde
|
|
|
60
98
|
* @param taskId - Task being written.
|
|
61
99
|
* @param current - The row as read inside the write transaction.
|
|
62
100
|
* @param expectedUpdatedAt - The version the caller read, if it supplied one.
|
|
101
|
+
* @param baseline - The task as the caller read it; enables the changed-field summary.
|
|
63
102
|
* @throws {CleoError} `ExitCode.VERSION_CONFLICT` (LAFS `E_CONFLICT`) with
|
|
64
|
-
*
|
|
65
|
-
* current version.
|
|
103
|
+
* {@link TaskConflictDetails} as `details`.
|
|
66
104
|
* @example
|
|
67
105
|
* ```ts
|
|
68
|
-
* assertTaskVersion('T1', current, guard?.expectedUpdatedAt);
|
|
106
|
+
* assertTaskVersion('T1', current, guard?.expectedUpdatedAt, guard?.baseline);
|
|
69
107
|
* ```
|
|
70
108
|
*/
|
|
71
|
-
export declare function assertTaskVersion(taskId: string, current: TaskVersionSource, expectedUpdatedAt: string | undefined): void;
|
|
109
|
+
export declare function assertTaskVersion(taskId: string, current: Task | TaskVersionSource, expectedUpdatedAt: string | undefined, baseline?: Task): void;
|
|
72
110
|
//# sourceMappingURL=task-version.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-version.d.ts","sourceRoot":"","sources":["../../src/store/task-version.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"task-version.d.ts","sourceRoot":"","sources":["../../src/store/task-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,OAAO,EAEL,KAAK,IAAI,EACT,KAAK,kBAAkB,EAExB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,yDAAyD;AACzD,MAAM,WAAW,iBAAiB;IAChC,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAE7E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,EAC7C,GAAG,CAAC,EAAE,MAAM,GACX,MAAM,CAOR;AA6BD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,GAAG,kBAAkB,EAAE,CAclF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,iBAAiB,EAAE,MAAM,EACzB,OAAO,EAAE,IAAI,GAAG,iBAAiB,GAAG,IAAI,EACxC,QAAQ,CAAC,EAAE,IAAI,GACd,SAAS,CAkCX;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,IAAI,GAAG,iBAAiB,EACjC,iBAAiB,EAAE,MAAM,GAAG,SAAS,EACrC,QAAQ,CAAC,EAAE,IAAI,GACd,IAAI,CAIN"}
|
|
@@ -11,7 +11,13 @@
|
|
|
11
11
|
* leave the row at a version a stale reader already holds (no ABA).
|
|
12
12
|
* 2. The comparison ({@link assertTaskVersion}) runs after `BEGIN IMMEDIATE`
|
|
13
13
|
* holds the database write lock, so no other process can commit between
|
|
14
|
-
* the check and the write.
|
|
14
|
+
* the check and the write. The field-level chokepoint
|
|
15
|
+
* (`updateTaskFields`) additionally puts the version in the UPDATE's
|
|
16
|
+
* WHERE clause, so a guarded write is a single compare-and-set statement.
|
|
17
|
+
*
|
|
18
|
+
* A conflict is raised by {@link taskConflictError}: `E_CONFLICT` with the
|
|
19
|
+
* current version, the fields that differ from the caller's read, the stored
|
|
20
|
+
* values to merge against, and a `--if-match` retry hint.
|
|
15
21
|
*
|
|
16
22
|
* `withWriteRetry` only absorbs `SQLITE_BUSY`; it cannot detect a lost update.
|
|
17
23
|
* These helpers are what turn a stale read-modify-write into a typed
|
|
@@ -20,7 +26,8 @@
|
|
|
20
26
|
* @task T12503
|
|
21
27
|
* @epic T12497
|
|
22
28
|
*/
|
|
23
|
-
import {
|
|
29
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
30
|
+
import { ExitCode, } from '@cleocode/contracts';
|
|
24
31
|
import { CleoError } from '../errors.js';
|
|
25
32
|
/**
|
|
26
33
|
* Return the version of a task row: `updatedAt`, else `createdAt`, else `''`.
|
|
@@ -57,6 +64,104 @@ export function nextTaskVersion(current, now) {
|
|
|
57
64
|
return candidate;
|
|
58
65
|
return new Date(stored + 1).toISOString();
|
|
59
66
|
}
|
|
67
|
+
/** Longest JSON summary of one field value carried on a conflict error. */
|
|
68
|
+
const CONFLICT_VALUE_MAX = 200;
|
|
69
|
+
/** Most entries of `current.labels` / `current.depends` carried on a conflict error. */
|
|
70
|
+
const CONFLICT_LIST_MAX = 50;
|
|
71
|
+
/** Cut a string to {@link CONFLICT_VALUE_MAX} characters, marking the cut. */
|
|
72
|
+
function truncate(text) {
|
|
73
|
+
return text.length <= CONFLICT_VALUE_MAX ? text : `${text.slice(0, CONFLICT_VALUE_MAX - 1)}…`;
|
|
74
|
+
}
|
|
75
|
+
/** Fields never reported as "changed": the version itself. */
|
|
76
|
+
const CONFLICT_IGNORED_FIELDS = new Set(['updatedAt']);
|
|
77
|
+
/** JSON of a field value for a conflict summary, truncated; `null` when absent. */
|
|
78
|
+
function summarizeValue(value) {
|
|
79
|
+
if (value === undefined || value === null)
|
|
80
|
+
return null;
|
|
81
|
+
const json = JSON.stringify(value);
|
|
82
|
+
if (json === undefined)
|
|
83
|
+
return null;
|
|
84
|
+
return truncate(json);
|
|
85
|
+
}
|
|
86
|
+
/** Narrow a version source to a full task row. */
|
|
87
|
+
function isFullTask(row) {
|
|
88
|
+
return 'id' in row && 'title' in row && 'status' in row;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* List the fields whose stored value differs from the caller's read.
|
|
92
|
+
*
|
|
93
|
+
* The version field (`updatedAt`) is never listed; an absent field and an
|
|
94
|
+
* explicit `null` compare equal.
|
|
95
|
+
*
|
|
96
|
+
* @param baseline - The task as the caller read it.
|
|
97
|
+
* @param current - The task as stored now.
|
|
98
|
+
* @returns One entry per differing field, sorted by field name.
|
|
99
|
+
* @example
|
|
100
|
+
* ```ts
|
|
101
|
+
* diffTaskFields(before, after); // [{ field: 'labels', was: '["a"]', now: '["a","b"]' }]
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
export function diffTaskFields(baseline, current) {
|
|
105
|
+
// Values are heterogeneous task fields that are only compared and JSON-encoded.
|
|
106
|
+
const was = new Map(Object.entries(baseline));
|
|
107
|
+
const now = new Map(Object.entries(current));
|
|
108
|
+
const fields = [...new Set([...was.keys(), ...now.keys()])].sort();
|
|
109
|
+
const changes = [];
|
|
110
|
+
for (const field of fields) {
|
|
111
|
+
if (CONFLICT_IGNORED_FIELDS.has(field))
|
|
112
|
+
continue;
|
|
113
|
+
const before = was.get(field) ?? null;
|
|
114
|
+
const after = now.get(field) ?? null;
|
|
115
|
+
if (isDeepStrictEqual(before, after))
|
|
116
|
+
continue;
|
|
117
|
+
changes.push({ field, was: summarizeValue(before), now: summarizeValue(after) });
|
|
118
|
+
}
|
|
119
|
+
return changes;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Build the `E_CONFLICT` error for a stale task write.
|
|
123
|
+
*
|
|
124
|
+
* @param taskId - Task being written.
|
|
125
|
+
* @param expectedUpdatedAt - The version the caller expected.
|
|
126
|
+
* @param current - The row as stored now; a full task adds the merge summary.
|
|
127
|
+
* @param baseline - The task as the caller read it, when the write path has it.
|
|
128
|
+
* @returns A {@link CleoError} with `ExitCode.VERSION_CONFLICT` (LAFS
|
|
129
|
+
* `E_CONFLICT`), a fix hint, and {@link TaskConflictDetails} as `details`.
|
|
130
|
+
* @example
|
|
131
|
+
* ```ts
|
|
132
|
+
* throw taskConflictError('T1', expected, await accessor.loadSingleTask('T1'), baseline);
|
|
133
|
+
* ```
|
|
134
|
+
*/
|
|
135
|
+
export function taskConflictError(taskId, expectedUpdatedAt, current, baseline) {
|
|
136
|
+
const currentVersion = taskVersion(current);
|
|
137
|
+
const full = current !== null && isFullTask(current) ? current : null;
|
|
138
|
+
const changes = full && baseline ? diffTaskFields(baseline, full) : [];
|
|
139
|
+
const details = {
|
|
140
|
+
field: 'updatedAt',
|
|
141
|
+
expected: expectedUpdatedAt,
|
|
142
|
+
actual: currentVersion,
|
|
143
|
+
currentVersion,
|
|
144
|
+
changedFields: changes.map((change) => change.field),
|
|
145
|
+
changes,
|
|
146
|
+
current: full
|
|
147
|
+
? {
|
|
148
|
+
title: truncate(full.title),
|
|
149
|
+
status: full.status,
|
|
150
|
+
priority: full.priority,
|
|
151
|
+
labels: (full.labels ?? []).slice(0, CONFLICT_LIST_MAX),
|
|
152
|
+
labelsTotal: full.labels?.length ?? 0,
|
|
153
|
+
depends: (full.depends ?? []).slice(0, CONFLICT_LIST_MAX),
|
|
154
|
+
dependsTotal: full.depends?.length ?? 0,
|
|
155
|
+
parentId: full.parentId ?? null,
|
|
156
|
+
}
|
|
157
|
+
: null,
|
|
158
|
+
};
|
|
159
|
+
const changed = details.changedFields.length > 0 ? ` Changed: ${details.changedFields.join(', ')}.` : '';
|
|
160
|
+
return new CleoError(ExitCode.VERSION_CONFLICT, `Task ${taskId} changed since it was read (expected version ${expectedUpdatedAt}, current ${currentVersion}).${changed}`, {
|
|
161
|
+
fix: `Re-read the task (cleo show ${taskId}), merge your change onto it, then retry with --if-match ${currentVersion}`,
|
|
162
|
+
details: { ...details },
|
|
163
|
+
});
|
|
164
|
+
}
|
|
60
165
|
/**
|
|
61
166
|
* Throw `E_CONFLICT` when the caller's expected version no longer matches.
|
|
62
167
|
*
|
|
@@ -66,28 +171,19 @@ export function nextTaskVersion(current, now) {
|
|
|
66
171
|
* @param taskId - Task being written.
|
|
67
172
|
* @param current - The row as read inside the write transaction.
|
|
68
173
|
* @param expectedUpdatedAt - The version the caller read, if it supplied one.
|
|
174
|
+
* @param baseline - The task as the caller read it; enables the changed-field summary.
|
|
69
175
|
* @throws {CleoError} `ExitCode.VERSION_CONFLICT` (LAFS `E_CONFLICT`) with
|
|
70
|
-
*
|
|
71
|
-
* current version.
|
|
176
|
+
* {@link TaskConflictDetails} as `details`.
|
|
72
177
|
* @example
|
|
73
178
|
* ```ts
|
|
74
|
-
* assertTaskVersion('T1', current, guard?.expectedUpdatedAt);
|
|
179
|
+
* assertTaskVersion('T1', current, guard?.expectedUpdatedAt, guard?.baseline);
|
|
75
180
|
* ```
|
|
76
181
|
*/
|
|
77
|
-
export function assertTaskVersion(taskId, current, expectedUpdatedAt) {
|
|
182
|
+
export function assertTaskVersion(taskId, current, expectedUpdatedAt, baseline) {
|
|
78
183
|
if (expectedUpdatedAt === undefined)
|
|
79
184
|
return;
|
|
80
|
-
|
|
81
|
-
if (currentVersion === expectedUpdatedAt)
|
|
185
|
+
if (taskVersion(current) === expectedUpdatedAt)
|
|
82
186
|
return;
|
|
83
|
-
throw
|
|
84
|
-
fix: `Re-read the task (cleo show ${taskId}) and retry with --expected-updated-at ${currentVersion}`,
|
|
85
|
-
details: {
|
|
86
|
-
field: 'updatedAt',
|
|
87
|
-
expected: expectedUpdatedAt,
|
|
88
|
-
actual: currentVersion,
|
|
89
|
-
currentVersion,
|
|
90
|
-
},
|
|
91
|
-
});
|
|
187
|
+
throw taskConflictError(taskId, expectedUpdatedAt, current, baseline);
|
|
92
188
|
}
|
|
93
189
|
//# sourceMappingURL=task-version.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-version.js","sourceRoot":"","sources":["../../src/store/task-version.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"task-version.js","sourceRoot":"","sources":["../../src/store/task-version.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,8 @@ export { AGENT_INSTANCE_STATUSES, AGENT_TYPES, agentErrorLog, agentInstances, }
|
|
|
17
17
|
export type { NewWarpChainInstanceRow, NewWarpChainRow, WarpChainInstanceRow, WarpChainRow, } from './schema/chain-schema.js';
|
|
18
18
|
export { warpChainInstances, warpChains } from './schema/chain-schema.js';
|
|
19
19
|
export { tasksSchemaMeta as schemaMeta } from './schema/cleo-project/audit.js';
|
|
20
|
+
export type { DocsAttachmentRefRow as AttachmentRefRow, DocsAttachmentRow as AttachmentRow, NewDocsAttachmentRefRow as NewAttachmentRefRow, NewDocsAttachmentRow as NewAttachmentRow, } from './schema/cleo-project/docs.js';
|
|
21
|
+
export { docsAttachmentRefs as attachmentRefs, docsAttachments as attachments, } from './schema/cleo-project/docs.js';
|
|
20
22
|
export type { NewTasksLifecycleEvidenceRow as NewLifecycleEvidenceRow, NewTasksLifecycleGateResultRow as NewLifecycleGateResultRow, NewTasksLifecyclePipelineRow as NewLifecyclePipelineRow, NewTasksLifecycleStageRow as NewLifecycleStageRow, NewTasksLifecycleTransitionRow as NewLifecycleTransitionRow, TasksLifecycleEvidenceRow as LifecycleEvidenceRow, TasksLifecycleGateResultRow as LifecycleGateResultRow, TasksLifecyclePipelineRow as LifecyclePipelineRow, TasksLifecycleStageRow as LifecycleStageRow, TasksLifecycleTransitionRow as LifecycleTransitionRow, } from './schema/cleo-project/lifecycle.js';
|
|
21
23
|
export { tasksLifecycleEvidence as lifecycleEvidence, tasksLifecycleGateResults as lifecycleGateResults, tasksLifecyclePipelines as lifecyclePipelines, tasksLifecycleStages as lifecycleStages, tasksLifecycleTransitions as lifecycleTransitions, } from './schema/cleo-project/lifecycle.js';
|
|
22
24
|
export { tasksCommitFiles as commitFiles, tasksCommits as commits, tasksTaskCommits as taskCommits, } from './schema/cleo-project/provenance-commits.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks-schema.d.ts","sourceRoot":"","sources":["../../src/store/tasks-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,YAAY,EACV,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,SAAS,EACT,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,uBAAuB,EACvB,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,uBAAuB,EACvB,eAAe,EACf,oBAAoB,EACpB,YAAY,GACb,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAa1E,OAAO,EAAE,eAAe,IAAI,UAAU,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"tasks-schema.d.ts","sourceRoot":"","sources":["../../src/store/tasks-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,6 +29,7 @@ export { warpChainInstances, warpChains } from './schema/chain-schema.js';
|
|
|
29
29
|
// twin (key-aware, atomic) at every open, before any read: the initial
|
|
30
30
|
// collapse, then whatever an older build wrote to the bare table since.
|
|
31
31
|
export { tasksSchemaMeta as schemaMeta } from './schema/cleo-project/audit.js';
|
|
32
|
+
export { docsAttachmentRefs as attachmentRefs, docsAttachments as attachments, } from './schema/cleo-project/docs.js';
|
|
32
33
|
// COMPLETE-CUTOVER (T12017 · gh#1107) — lifecycle domain → PREFIXED tables.
|
|
33
34
|
//
|
|
34
35
|
// Completes the satellite-rebind deferred at the top of this file. The bare
|