@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,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cleo project link`: register the current project with Cleo Nexus and bind
|
|
3
|
+
* the remote project to the local one.
|
|
4
|
+
*
|
|
5
|
+
* ## What is sent
|
|
6
|
+
*
|
|
7
|
+
* `POST /v1/projects` with `{ projectId, label }` only:
|
|
8
|
+
*
|
|
9
|
+
* - `projectId` is the tracked, immutable `.cleo/project-id`
|
|
10
|
+
* (`readDeclaredProjectIdentity`), the key the server stores projects under,
|
|
11
|
+
* so the remote id IS the local id.
|
|
12
|
+
* - `label` is the project's display name in plaintext
|
|
13
|
+
* ({@link getProjectDisplayName}), or `--label`. It must not look like a path.
|
|
14
|
+
*
|
|
15
|
+
* No filesystem path, git remote or directory layout is ever sent.
|
|
16
|
+
*
|
|
17
|
+
* ## Idempotency
|
|
18
|
+
*
|
|
19
|
+
* Registering the same id again answers 200 (201 on first registration) and
|
|
20
|
+
* sets the server label to the one sent, so re-linking after a rename updates
|
|
21
|
+
* the label. Linking twice is safe.
|
|
22
|
+
*
|
|
23
|
+
* ## Where the binding lives
|
|
24
|
+
*
|
|
25
|
+
* `<project>/.cleo/nexus-link.json`, keyed by API origin. It is machine-local:
|
|
26
|
+
* `.cleo/.gitignore` denies everything not allow-listed, so the binding (which
|
|
27
|
+
* names an account's organization) is never committed. It is not
|
|
28
|
+
* `project-context.json`, which is tracked in git and regenerated by
|
|
29
|
+
* `cleo upgrade`, and not the project `cleo.db`, so linking never opens or
|
|
30
|
+
* migrates the task store. Each clone links itself, the same way each machine
|
|
31
|
+
* signs itself in.
|
|
32
|
+
*
|
|
33
|
+
* @task T12712
|
|
34
|
+
* @epic T12322
|
|
35
|
+
*/
|
|
36
|
+
import { readFileSync, writeFileSync } from 'node:fs';
|
|
37
|
+
import { homedir, userInfo } from 'node:os';
|
|
38
|
+
import { join, resolve } from 'node:path';
|
|
39
|
+
import { readDeclaredProjectIdentity } from '@cleocode/paths';
|
|
40
|
+
import { z } from 'zod';
|
|
41
|
+
import { getCleoDirAbsolute, resolveOrCwd } from '../paths.js';
|
|
42
|
+
import { getProjectDisplayName } from '../project-info.js';
|
|
43
|
+
import { withLock } from '../store/file-utils.js';
|
|
44
|
+
import { Http, NexusError } from './http.js';
|
|
45
|
+
import { NexusAccountError, requireNexusSession, resolveNexusApiUrl, } from './nexus-auth.js';
|
|
46
|
+
import { FileNexusTokenStore } from './nexus-credentials.js';
|
|
47
|
+
import { registerProject } from './projects.js';
|
|
48
|
+
/** File name of the binding, inside the project's `.cleo/` directory. */
|
|
49
|
+
export const NEXUS_LINK_FILE = 'nexus-link.json';
|
|
50
|
+
/** Longest label the server accepts (`RegisterProjectRequest.label`). */
|
|
51
|
+
export const NEXUS_LABEL_MAX = 120;
|
|
52
|
+
const linkSchema = z.object({
|
|
53
|
+
apiUrl: z.string(),
|
|
54
|
+
localProjectId: z.string(),
|
|
55
|
+
remoteProjectId: z.string(),
|
|
56
|
+
organizationId: z.string(),
|
|
57
|
+
label: z.string().nullable(),
|
|
58
|
+
streamId: z.string(),
|
|
59
|
+
linkedAt: z.string(),
|
|
60
|
+
});
|
|
61
|
+
const linkFileSchema = z.object({
|
|
62
|
+
version: z.literal(1),
|
|
63
|
+
links: z.record(z.string(), linkSchema),
|
|
64
|
+
});
|
|
65
|
+
/**
|
|
66
|
+
* Path separators and their look-alikes: `/`, `\`, fullwidth / \, division
|
|
67
|
+
* slash ∕, set minus ∖, fraction slash ⁄, big solidi ⧸ ⧹, small reverse
|
|
68
|
+
* solidus ﹨. Plus C0/C1 control characters.
|
|
69
|
+
*/
|
|
70
|
+
const LABEL_FORBIDDEN = /[/\\\uFF0F\uFF3C\u2215\u2216\u2044\u29F8\u29F9\uFE68\u0000-\u001f\u007f-\u009f]/;
|
|
71
|
+
/** The OS account name, or `null` when the platform cannot say. */
|
|
72
|
+
function osUsername() {
|
|
73
|
+
try {
|
|
74
|
+
return userInfo().username || null;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Validate a project label: 1-120 characters; no path separator or look-alike
|
|
82
|
+
* slash, no drive letter (`C:`), no leading `~`, no control characters; and
|
|
83
|
+
* not the OS username, which would leak the account name. A label is a name,
|
|
84
|
+
* never a path.
|
|
85
|
+
*
|
|
86
|
+
* @param raw - Candidate label.
|
|
87
|
+
* @returns The trimmed label.
|
|
88
|
+
* @throws {NexusAccountError} `E_NEXUS_INVALID_LABEL`.
|
|
89
|
+
*/
|
|
90
|
+
export function validateNexusProjectLabel(raw) {
|
|
91
|
+
const label = raw.trim();
|
|
92
|
+
const pathLike = LABEL_FORBIDDEN.test(label) || label.startsWith('~') || /^[A-Za-z]:/.test(label);
|
|
93
|
+
if (!label || label.length > NEXUS_LABEL_MAX || pathLike) {
|
|
94
|
+
throw new NexusAccountError('E_NEXUS_INVALID_LABEL', `invalid project label "${label}": use 1-${NEXUS_LABEL_MAX} characters with no slash or backslash (or look-alike), drive letter or leading "~" (a name, not a path)`, 'pass `--label <name>`');
|
|
95
|
+
}
|
|
96
|
+
const username = osUsername();
|
|
97
|
+
if (username !== null && label.toLowerCase() === username.toLowerCase()) {
|
|
98
|
+
throw new NexusAccountError('E_NEXUS_INVALID_LABEL', 'the project label equals your OS username, which would reveal it to the server', 'pass `--label <name>` with a different name');
|
|
99
|
+
}
|
|
100
|
+
return label;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* The label to send: `--label`, else the project's display name. A project
|
|
104
|
+
* rooted at the home directory has no meaningful name (its basename is the
|
|
105
|
+
* account name), so it must be labelled explicitly.
|
|
106
|
+
*/
|
|
107
|
+
function resolveLinkLabel(projectRoot, explicit) {
|
|
108
|
+
if (explicit !== undefined)
|
|
109
|
+
return validateNexusProjectLabel(explicit);
|
|
110
|
+
if (resolve(projectRoot) === resolve(homedir())) {
|
|
111
|
+
throw new NexusAccountError('E_NEXUS_INVALID_LABEL', 'this project is your home directory; its name would reveal your account name', 'pass `--label <name>`');
|
|
112
|
+
}
|
|
113
|
+
return validateNexusProjectLabel(getProjectDisplayName(projectRoot));
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Path of the binding file for a project.
|
|
117
|
+
*
|
|
118
|
+
* @param projectRoot - Project root.
|
|
119
|
+
* @returns `<project>/.cleo/nexus-link.json`.
|
|
120
|
+
*/
|
|
121
|
+
export function nexusLinkPath(projectRoot) {
|
|
122
|
+
return join(getCleoDirAbsolute(projectRoot), NEXUS_LINK_FILE);
|
|
123
|
+
}
|
|
124
|
+
/** Read the binding file; missing or malformed reads as empty. */
|
|
125
|
+
function readLinkFile(path) {
|
|
126
|
+
try {
|
|
127
|
+
const parsed = linkFileSchema.safeParse(JSON.parse(readFileSync(path, 'utf-8')));
|
|
128
|
+
if (parsed.success)
|
|
129
|
+
return parsed.data;
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
/* missing or unreadable */
|
|
133
|
+
}
|
|
134
|
+
return { version: 1, links: {} };
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* The stored binding for a project and origin, if any.
|
|
138
|
+
*
|
|
139
|
+
* @param projectRoot - Project root.
|
|
140
|
+
* @param apiUrl - API URL (any URL on the origin).
|
|
141
|
+
* @returns The binding, or `null`.
|
|
142
|
+
*/
|
|
143
|
+
export function readNexusProjectLink(projectRoot, apiUrl) {
|
|
144
|
+
return readLinkFile(nexusLinkPath(projectRoot)).links[new URL(apiUrl).origin] ?? null;
|
|
145
|
+
}
|
|
146
|
+
/** Map an API failure to a Nexus error; a 401 means the session expired. */
|
|
147
|
+
function toLinkError(err) {
|
|
148
|
+
if (err instanceof NexusError) {
|
|
149
|
+
if (err.status === 401) {
|
|
150
|
+
return new NexusAccountError('E_NEXUS_SESSION_EXPIRED', 'the Nexus session expired or was revoked', 'run `cleo login nexus` again');
|
|
151
|
+
}
|
|
152
|
+
const remedy = typeof err.details?.['remedy'] === 'string' ? err.details['remedy'] : undefined;
|
|
153
|
+
return new NexusAccountError('E_NEXUS_REQUEST_FAILED', err.message, remedy);
|
|
154
|
+
}
|
|
155
|
+
return err instanceof Error ? err : new Error(String(err));
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Register the project with Nexus (label only, never a path) and persist the
|
|
159
|
+
* binding in `.cleo/nexus-link.json`. Idempotent.
|
|
160
|
+
*
|
|
161
|
+
* @param opts - Project root, label, API URL, store and test overrides.
|
|
162
|
+
* @returns The binding and whether it already existed.
|
|
163
|
+
* @throws {NexusAccountError} Not signed in, expired session, invalid label,
|
|
164
|
+
* not a CLEO project, or an API refusal (e.g. the id belongs to another account).
|
|
165
|
+
*/
|
|
166
|
+
export async function linkProjectToNexus(opts = {}) {
|
|
167
|
+
const apiUrl = resolveNexusApiUrl(opts.apiUrl);
|
|
168
|
+
const store = opts.store ?? new FileNexusTokenStore();
|
|
169
|
+
const session = await requireNexusSession(apiUrl, store);
|
|
170
|
+
let projectRoot;
|
|
171
|
+
try {
|
|
172
|
+
projectRoot = resolveOrCwd(opts.projectRoot);
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
throw new NexusAccountError('E_NEXUS_NOT_A_PROJECT', 'not inside a CLEO project', 'run `cleo init` first');
|
|
176
|
+
}
|
|
177
|
+
const identity = readDeclaredProjectIdentity(projectRoot);
|
|
178
|
+
if (!identity) {
|
|
179
|
+
throw new NexusAccountError('E_NEXUS_NOT_A_PROJECT', 'this project has no project id (.cleo/project-id)', 'run `cleo init` or `cleo upgrade` to assign one');
|
|
180
|
+
}
|
|
181
|
+
const projectId = identity.projectId;
|
|
182
|
+
const label = resolveLinkLabel(projectRoot, opts.label);
|
|
183
|
+
const http = new Http({
|
|
184
|
+
baseUrl: apiUrl,
|
|
185
|
+
token: session.bearer(),
|
|
186
|
+
...(opts.fetch ? { fetch: opts.fetch } : {}),
|
|
187
|
+
});
|
|
188
|
+
let registered;
|
|
189
|
+
try {
|
|
190
|
+
registered = await registerProject(http, { projectId, label });
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
throw toLinkError(err);
|
|
194
|
+
}
|
|
195
|
+
const linkPath = nexusLinkPath(projectRoot);
|
|
196
|
+
const link = {
|
|
197
|
+
apiUrl,
|
|
198
|
+
localProjectId: projectId,
|
|
199
|
+
remoteProjectId: registered.project.projectId,
|
|
200
|
+
organizationId: registered.project.organizationId,
|
|
201
|
+
label: registered.project.label,
|
|
202
|
+
streamId: registered.streamId,
|
|
203
|
+
linkedAt: new Date().toISOString(),
|
|
204
|
+
};
|
|
205
|
+
// Locked read-modify-write: concurrent links (other origins, other shells)
|
|
206
|
+
// never drop each other's entries. withLock needs a parseable file to read,
|
|
207
|
+
// so seed an empty one exclusively ('wx') when there is none.
|
|
208
|
+
try {
|
|
209
|
+
writeFileSync(linkPath, `${JSON.stringify({ version: 1, links: {} })}\n`, { flag: 'wx' });
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
if (!(err instanceof Error && 'code' in err && err.code === 'EEXIST'))
|
|
213
|
+
throw err;
|
|
214
|
+
}
|
|
215
|
+
await withLock(linkPath, (current) => {
|
|
216
|
+
const parsed = linkFileSchema.safeParse(current);
|
|
217
|
+
const links = parsed.success ? parsed.data.links : {};
|
|
218
|
+
return { version: 1, links: { ...links, [apiUrl]: link } };
|
|
219
|
+
});
|
|
220
|
+
return {
|
|
221
|
+
link,
|
|
222
|
+
alreadyLinked: !registered.created,
|
|
223
|
+
linkPath,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=nexus-link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nexus-link.js","sourceRoot":"","sources":["../../src/cloud/nexus-link.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Replica presence mapper (T12721): one fleet-view location → the path-free
|
|
3
|
+
* `ReplicaPresence` the cleo-nexus cloud accepts at
|
|
4
|
+
* `PUT /v1/projects/:projectId/replicas/:replicaId/presence`.
|
|
5
|
+
*
|
|
6
|
+
* Pure: no I/O, no clock. Everything the contract marks **device-local, never
|
|
7
|
+
* mirrored** — path, hostname, remote name and URL, upstream ref, HEAD and
|
|
8
|
+
* upstream commit shas, probe error text — is read only to derive a boolean,
|
|
9
|
+
* a count or an enum, and never copied. `branch` is copied only when the
|
|
10
|
+
* caller opts in.
|
|
11
|
+
*
|
|
12
|
+
* @task T12721
|
|
13
|
+
* @epic T12496
|
|
14
|
+
*/
|
|
15
|
+
import { type NexusFleetDevice, type NexusFleetGitSummary, type NexusFleetLocation } from '@cleocode/contracts';
|
|
16
|
+
import type { ReplicaPresence } from '@cleocode/contracts/cloud';
|
|
17
|
+
/** The `git` block of a {@link ReplicaPresence}. */
|
|
18
|
+
export type ReplicaPresenceGit = NonNullable<ReplicaPresence['git']>;
|
|
19
|
+
/** The remote tracking state a presence reports. */
|
|
20
|
+
export type ReplicaRemoteState = ReplicaPresenceGit['remote'];
|
|
21
|
+
/** Server-side length limits of `ReplicaPresence` string fields. */
|
|
22
|
+
export declare const REPLICA_PRESENCE_LIMITS: {
|
|
23
|
+
/** `git.branch` maximum length. */
|
|
24
|
+
readonly branchMax: 200;
|
|
25
|
+
/** `cliVersion` maximum length. */
|
|
26
|
+
readonly cliVersionMax: 40;
|
|
27
|
+
};
|
|
28
|
+
/** `cliVersion` sent when the device never reported its CLEO version. */
|
|
29
|
+
export declare const UNKNOWN_CLI_VERSION = "unknown";
|
|
30
|
+
/** Options for {@link toReplicaPresence}. */
|
|
31
|
+
export interface ToReplicaPresenceOptions {
|
|
32
|
+
/** Include the checked-out branch (truncated to 200). Default `false`: branch names can be sensitive. */
|
|
33
|
+
includeBranch?: boolean;
|
|
34
|
+
/** Presence schema version. Default {@link NEXUS_FLEET_SCHEMA_VERSION}. */
|
|
35
|
+
schemaVersion?: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Remote tracking state of one probe row, as the presence enum.
|
|
39
|
+
*
|
|
40
|
+
* - a real probe failure (path missing or unreadable, not a repo, git error or
|
|
41
|
+
* timeout) → `unknown`. `E_FETCH_FAILED` is NOT one: an offline `--fetch`
|
|
42
|
+
* still recorded valid local ahead/behind as of the LAST fetch, so it maps
|
|
43
|
+
* exactly like a probe that never fetched;
|
|
44
|
+
* - no upstream → `no-upstream`;
|
|
45
|
+
* - an upstream whose tracking ref is gone (`remote.headSha` null — e.g. the
|
|
46
|
+
* branch was deleted remotely and pruned) or whose ahead/behind git did not
|
|
47
|
+
* report → `unknown`, never a defaulted `in-sync`;
|
|
48
|
+
* - never fetched (`fetchedAt` null) → `unknown`;
|
|
49
|
+
* - otherwise from ahead/behind as of the last fetch: both → `diverged`,
|
|
50
|
+
* ahead only → `ahead`, behind only → `behind`, neither → `in-sync`.
|
|
51
|
+
*
|
|
52
|
+
* @param git - Recorded git summary of the location.
|
|
53
|
+
* @returns The presence remote state.
|
|
54
|
+
* @example
|
|
55
|
+
* ```ts
|
|
56
|
+
* replicaRemoteState(summary); // 'behind'
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export declare function replicaRemoteState(git: NexusFleetGitSummary): ReplicaRemoteState;
|
|
60
|
+
/**
|
|
61
|
+
* Map one fleet-view location on one device to the cloud `ReplicaPresence`.
|
|
62
|
+
*
|
|
63
|
+
* - `observedAt` is the probe instant (`git.probedAt`); an unprobed location
|
|
64
|
+
* has no `git` block and reports when it was last encountered (`lastSeen`).
|
|
65
|
+
* - `cliVersion` is `device.cleoVersion` truncated to 40, or `unknown`.
|
|
66
|
+
* - `git.dirty` is `(dirtyCount ?? 0) + (untrackedCount ?? 0) > 0`;
|
|
67
|
+
* `ahead`/`behind` default to 0; `remote` is {@link replicaRemoteState};
|
|
68
|
+
* `lastCommitAt` is `headCommittedAt` when known; `branch` only with
|
|
69
|
+
* `includeBranch`, truncated to 200.
|
|
70
|
+
*
|
|
71
|
+
* The replica id is not part of the body: it is the `:replicaId` path
|
|
72
|
+
* segment (`location.replicaId`), and a caller must not send presence while
|
|
73
|
+
* it is `null`.
|
|
74
|
+
*
|
|
75
|
+
* @param location - The location, from `nexus.projects.fleet`.
|
|
76
|
+
* @param device - The device holding it (same `deviceId`).
|
|
77
|
+
* @param opts - Branch opt-in and schema version.
|
|
78
|
+
* @returns A path-free presence body.
|
|
79
|
+
* @throws Error when `device.deviceId` differs from `location.deviceId`, or
|
|
80
|
+
* when the observation instant (`git.probedAt`, else `lastSeen`) is not a
|
|
81
|
+
* parseable timestamp — a raw string is never sent as `observedAt`.
|
|
82
|
+
* @example
|
|
83
|
+
* ```ts
|
|
84
|
+
* const body = toReplicaPresence(loc, device, { includeBranch: false });
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
export declare function toReplicaPresence(location: NexusFleetLocation, device: NexusFleetDevice, opts?: ToReplicaPresenceOptions): ReplicaPresence;
|
|
88
|
+
//# sourceMappingURL=presence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presence.d.ts","sourceRoot":"","sources":["../../src/cloud/presence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEjE,oDAAoD;AACpD,MAAM,MAAM,kBAAkB,GAAG,WAAW,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;AAErE,oDAAoD;AACpD,MAAM,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AAE9D,oEAAoE;AACpE,eAAO,MAAM,uBAAuB;IAClC,mCAAmC;;IAEnC,mCAAmC;;CAE3B,CAAC;AAEX,yEAAyE;AACzE,eAAO,MAAM,mBAAmB,YAAY,CAAC;AAE7C,6CAA6C;AAC7C,MAAM,WAAW,wBAAwB;IACvC,yGAAyG;IACzG,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,2EAA2E;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,oBAAoB,GAAG,kBAAkB,CAUhF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,EAAE,gBAAgB,EACxB,IAAI,GAAE,wBAA6B,GAClC,eAAe,CAqCjB"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Replica presence mapper (T12721): one fleet-view location → the path-free
|
|
3
|
+
* `ReplicaPresence` the cleo-nexus cloud accepts at
|
|
4
|
+
* `PUT /v1/projects/:projectId/replicas/:replicaId/presence`.
|
|
5
|
+
*
|
|
6
|
+
* Pure: no I/O, no clock. Everything the contract marks **device-local, never
|
|
7
|
+
* mirrored** — path, hostname, remote name and URL, upstream ref, HEAD and
|
|
8
|
+
* upstream commit shas, probe error text — is read only to derive a boolean,
|
|
9
|
+
* a count or an enum, and never copied. `branch` is copied only when the
|
|
10
|
+
* caller opts in.
|
|
11
|
+
*
|
|
12
|
+
* @task T12721
|
|
13
|
+
* @epic T12496
|
|
14
|
+
*/
|
|
15
|
+
import { NEXUS_FLEET_SCHEMA_VERSION, } from '@cleocode/contracts';
|
|
16
|
+
/** Server-side length limits of `ReplicaPresence` string fields. */
|
|
17
|
+
export const REPLICA_PRESENCE_LIMITS = {
|
|
18
|
+
/** `git.branch` maximum length. */
|
|
19
|
+
branchMax: 200,
|
|
20
|
+
/** `cliVersion` maximum length. */
|
|
21
|
+
cliVersionMax: 40,
|
|
22
|
+
};
|
|
23
|
+
/** `cliVersion` sent when the device never reported its CLEO version. */
|
|
24
|
+
export const UNKNOWN_CLI_VERSION = 'unknown';
|
|
25
|
+
/**
|
|
26
|
+
* Remote tracking state of one probe row, as the presence enum.
|
|
27
|
+
*
|
|
28
|
+
* - a real probe failure (path missing or unreadable, not a repo, git error or
|
|
29
|
+
* timeout) → `unknown`. `E_FETCH_FAILED` is NOT one: an offline `--fetch`
|
|
30
|
+
* still recorded valid local ahead/behind as of the LAST fetch, so it maps
|
|
31
|
+
* exactly like a probe that never fetched;
|
|
32
|
+
* - no upstream → `no-upstream`;
|
|
33
|
+
* - an upstream whose tracking ref is gone (`remote.headSha` null — e.g. the
|
|
34
|
+
* branch was deleted remotely and pruned) or whose ahead/behind git did not
|
|
35
|
+
* report → `unknown`, never a defaulted `in-sync`;
|
|
36
|
+
* - never fetched (`fetchedAt` null) → `unknown`;
|
|
37
|
+
* - otherwise from ahead/behind as of the last fetch: both → `diverged`,
|
|
38
|
+
* ahead only → `ahead`, behind only → `behind`, neither → `in-sync`.
|
|
39
|
+
*
|
|
40
|
+
* @param git - Recorded git summary of the location.
|
|
41
|
+
* @returns The presence remote state.
|
|
42
|
+
* @example
|
|
43
|
+
* ```ts
|
|
44
|
+
* replicaRemoteState(summary); // 'behind'
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export function replicaRemoteState(git) {
|
|
48
|
+
if (git.probeErrorCode !== null && git.probeErrorCode !== 'E_FETCH_FAILED')
|
|
49
|
+
return 'unknown';
|
|
50
|
+
const { upstream, ahead, behind, headSha, fetchedAt } = git.remote;
|
|
51
|
+
if (upstream === null)
|
|
52
|
+
return 'no-upstream';
|
|
53
|
+
if (ahead === null || behind === null || headSha === null)
|
|
54
|
+
return 'unknown';
|
|
55
|
+
if (fetchedAt === null)
|
|
56
|
+
return 'unknown';
|
|
57
|
+
if (ahead > 0 && behind > 0)
|
|
58
|
+
return 'diverged';
|
|
59
|
+
if (ahead > 0)
|
|
60
|
+
return 'ahead';
|
|
61
|
+
if (behind > 0)
|
|
62
|
+
return 'behind';
|
|
63
|
+
return 'in-sync';
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Map one fleet-view location on one device to the cloud `ReplicaPresence`.
|
|
67
|
+
*
|
|
68
|
+
* - `observedAt` is the probe instant (`git.probedAt`); an unprobed location
|
|
69
|
+
* has no `git` block and reports when it was last encountered (`lastSeen`).
|
|
70
|
+
* - `cliVersion` is `device.cleoVersion` truncated to 40, or `unknown`.
|
|
71
|
+
* - `git.dirty` is `(dirtyCount ?? 0) + (untrackedCount ?? 0) > 0`;
|
|
72
|
+
* `ahead`/`behind` default to 0; `remote` is {@link replicaRemoteState};
|
|
73
|
+
* `lastCommitAt` is `headCommittedAt` when known; `branch` only with
|
|
74
|
+
* `includeBranch`, truncated to 200.
|
|
75
|
+
*
|
|
76
|
+
* The replica id is not part of the body: it is the `:replicaId` path
|
|
77
|
+
* segment (`location.replicaId`), and a caller must not send presence while
|
|
78
|
+
* it is `null`.
|
|
79
|
+
*
|
|
80
|
+
* @param location - The location, from `nexus.projects.fleet`.
|
|
81
|
+
* @param device - The device holding it (same `deviceId`).
|
|
82
|
+
* @param opts - Branch opt-in and schema version.
|
|
83
|
+
* @returns A path-free presence body.
|
|
84
|
+
* @throws Error when `device.deviceId` differs from `location.deviceId`, or
|
|
85
|
+
* when the observation instant (`git.probedAt`, else `lastSeen`) is not a
|
|
86
|
+
* parseable timestamp — a raw string is never sent as `observedAt`.
|
|
87
|
+
* @example
|
|
88
|
+
* ```ts
|
|
89
|
+
* const body = toReplicaPresence(loc, device, { includeBranch: false });
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
export function toReplicaPresence(location, device, opts = {}) {
|
|
93
|
+
if (device.deviceId !== location.deviceId) {
|
|
94
|
+
throw new Error(`toReplicaPresence: device ${device.deviceId} does not hold this location (device ${location.deviceId})`);
|
|
95
|
+
}
|
|
96
|
+
const observedRaw = location.git?.probedAt ?? location.lastSeen;
|
|
97
|
+
const observedAt = toUtcIso(observedRaw);
|
|
98
|
+
if (observedAt === undefined) {
|
|
99
|
+
throw new Error(`toReplicaPresence: observation instant ${JSON.stringify(observedRaw)} is not a valid ISO 8601 timestamp`);
|
|
100
|
+
}
|
|
101
|
+
const presence = {
|
|
102
|
+
cliVersion: truncate(device.cleoVersion ?? UNKNOWN_CLI_VERSION, REPLICA_PRESENCE_LIMITS.cliVersionMax),
|
|
103
|
+
schemaVersion: opts.schemaVersion ?? NEXUS_FLEET_SCHEMA_VERSION,
|
|
104
|
+
observedAt,
|
|
105
|
+
};
|
|
106
|
+
const git = location.git;
|
|
107
|
+
if (git === null)
|
|
108
|
+
return presence;
|
|
109
|
+
const block = {
|
|
110
|
+
dirty: (git.dirtyCount ?? 0) + (git.untrackedCount ?? 0) > 0,
|
|
111
|
+
ahead: git.remote.ahead ?? 0,
|
|
112
|
+
behind: git.remote.behind ?? 0,
|
|
113
|
+
remote: replicaRemoteState(git),
|
|
114
|
+
};
|
|
115
|
+
if (opts.includeBranch === true && git.branch !== null) {
|
|
116
|
+
block.branch = truncate(git.branch, REPLICA_PRESENCE_LIMITS.branchMax);
|
|
117
|
+
}
|
|
118
|
+
const lastCommitAt = git.headCommittedAt === null ? undefined : toUtcIso(git.headCommittedAt);
|
|
119
|
+
if (lastCommitAt !== undefined)
|
|
120
|
+
block.lastCommitAt = lastCommitAt;
|
|
121
|
+
presence.git = block;
|
|
122
|
+
return presence;
|
|
123
|
+
}
|
|
124
|
+
/** Truncate to `max` UTF-16 units without splitting a surrogate pair. */
|
|
125
|
+
function truncate(value, max) {
|
|
126
|
+
if (value.length <= max)
|
|
127
|
+
return value;
|
|
128
|
+
const cut = value.slice(0, max);
|
|
129
|
+
const last = cut.charCodeAt(cut.length - 1);
|
|
130
|
+
return last >= 0xd800 && last <= 0xdbff ? cut.slice(0, -1) : cut;
|
|
131
|
+
}
|
|
132
|
+
/** An instant as ISO 8601 UTC (`Z`), or `undefined` when unparsable. */
|
|
133
|
+
function toUtcIso(value) {
|
|
134
|
+
const ms = Date.parse(value);
|
|
135
|
+
return Number.isNaN(ms) ? undefined : new Date(ms).toISOString();
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=presence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presence.js","sourceRoot":"","sources":["../../src/cloud/presence.ts"],"names":[],"mappings":"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"}
|
package/dist/cloud/projects.d.ts
CHANGED
|
@@ -4,10 +4,12 @@ import type { Http } from './http.js';
|
|
|
4
4
|
* Register a project, or update its metadata when it is already registered. Organizations own
|
|
5
5
|
* projects (ADR-095): pass `organizationId` to register into one the caller belongs to, or omit it
|
|
6
6
|
* for the caller's personal organization. Re-registering into a different organization is refused
|
|
7
|
-
* with `E_CONFLICT`. The server records no filesystem path.
|
|
7
|
+
* with `E_CONFLICT`. The server records no filesystem path. `created` is `true` on 201 (new
|
|
8
|
+
* registration) and `false` on 200 (the id was already registered; its label is updated).
|
|
8
9
|
*/
|
|
9
10
|
export declare function registerProject(http: Http, req: RegisterProjectRequest): Promise<{
|
|
10
11
|
project: Project;
|
|
11
12
|
streamId: StreamId;
|
|
13
|
+
created: boolean;
|
|
12
14
|
}>;
|
|
13
15
|
//# sourceMappingURL=projects.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/cloud/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,sBAAsB,EAE3B,KAAK,QAAQ,EACd,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/cloud/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,sBAAsB,EAE3B,KAAK,QAAQ,EACd,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,IAAI,EACV,GAAG,EAAE,sBAAsB,GAC1B,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAQrE"}
|
package/dist/cloud/projects.js
CHANGED
|
@@ -3,9 +3,11 @@ import { RegisterProjectResult, } from '@cleocode/contracts/cloud';
|
|
|
3
3
|
* Register a project, or update its metadata when it is already registered. Organizations own
|
|
4
4
|
* projects (ADR-095): pass `organizationId` to register into one the caller belongs to, or omit it
|
|
5
5
|
* for the caller's personal organization. Re-registering into a different organization is refused
|
|
6
|
-
* with `E_CONFLICT`. The server records no filesystem path.
|
|
6
|
+
* with `E_CONFLICT`. The server records no filesystem path. `created` is `true` on 201 (new
|
|
7
|
+
* registration) and `false` on 200 (the id was already registered; its label is updated).
|
|
7
8
|
*/
|
|
8
9
|
export async function registerProject(http, req) {
|
|
9
|
-
|
|
10
|
+
const { data, status } = await http.requestWithStatus('POST', '/v1/projects', RegisterProjectResult, req);
|
|
11
|
+
return { ...data, created: status === 201 };
|
|
10
12
|
}
|
|
11
13
|
//# sourceMappingURL=projects.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/cloud/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,qBAAqB,GAEtB,MAAM,2BAA2B,CAAC;AAGnC
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/cloud/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,qBAAqB,GAEtB,MAAM,2BAA2B,CAAC;AAGnC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAU,EACV,GAA2B;IAE3B,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,iBAAiB,CACnD,MAAM,EACN,cAAc,EACd,qBAAqB,EACrB,GAAG,CACJ,CAAC;IACF,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UUIDv7 minting, kept free of other imports so the store's open path can use
|
|
3
|
+
* it without loading the cloud crypto module (T12341 row uids).
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
/** A UUIDv7 (RFC 9562 §5.7): 48-bit Unix millis, then random bits. Mints checkpoint ids and row uids. */
|
|
8
|
+
export declare function uuidv7(now?: number): string;
|
|
9
|
+
//# sourceMappingURL=uuidv7.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uuidv7.d.ts","sourceRoot":"","sources":["../../src/cloud/uuidv7.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,yGAAyG;AACzG,wBAAgB,MAAM,CAAC,GAAG,GAAE,MAAmB,GAAG,MAAM,CAQvD"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UUIDv7 minting, kept free of other imports so the store's open path can use
|
|
3
|
+
* it without loading the cloud crypto module (T12341 row uids).
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import { randomBytes } from 'node:crypto';
|
|
8
|
+
/** A UUIDv7 (RFC 9562 §5.7): 48-bit Unix millis, then random bits. Mints checkpoint ids and row uids. */
|
|
9
|
+
export function uuidv7(now = Date.now()) {
|
|
10
|
+
const b = randomBytes(16);
|
|
11
|
+
const ms = BigInt(Math.max(0, Math.floor(now)));
|
|
12
|
+
for (let i = 0; i < 6; i++)
|
|
13
|
+
b[i] = Number((ms >> BigInt(8 * (5 - i))) & 0xffn);
|
|
14
|
+
b[6] = ((b[6] ?? 0) & 0x0f) | 0x70;
|
|
15
|
+
b[8] = ((b[8] ?? 0) & 0x3f) | 0x80;
|
|
16
|
+
const h = b.toString('hex');
|
|
17
|
+
return `${h.slice(0, 8)}-${h.slice(8, 12)}-${h.slice(12, 16)}-${h.slice(16, 20)}-${h.slice(20)}`;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=uuidv7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uuidv7.js","sourceRoot":"","sources":["../../src/cloud/uuidv7.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,yGAAyG;AACzG,MAAM,UAAU,MAAM,CAAC,MAAc,IAAI,CAAC,GAAG,EAAE;IAC7C,MAAM,CAAC,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAC1B,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACnC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACnC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5B,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;AACnG,CAAC"}
|
|
@@ -75,11 +75,20 @@ export type ProjectCredentialKdf = 'project-id' | 'legacy-path';
|
|
|
75
75
|
*/
|
|
76
76
|
export interface ProjectSecretContext extends CredentialKeyOptions {
|
|
77
77
|
/**
|
|
78
|
-
* Stable project identity — the
|
|
79
|
-
*
|
|
80
|
-
* moved or renamed checkout derives the
|
|
78
|
+
* Stable project identity — the declared id (`.cleo/project.json`, the
|
|
79
|
+
* legacy `.cleo/project-id`, else the `project-info.json` cache). Travels
|
|
80
|
+
* with the project directory, so a moved or renamed checkout derives the
|
|
81
|
+
* same key.
|
|
81
82
|
*/
|
|
82
83
|
readonly projectId: string;
|
|
84
|
+
/**
|
|
85
|
+
* Ids this project was keyed by before (T12716): the `project-info.json`
|
|
86
|
+
* cache when it disagrees with the tracked id, and its
|
|
87
|
+
* `previousProjectIds` receipts. A project-id ciphertext sealed under one
|
|
88
|
+
* of them is opened and re-wrapped under {@link ProjectSecretContext.projectId},
|
|
89
|
+
* so re-keying a project never strands its credentials.
|
|
90
|
+
*/
|
|
91
|
+
readonly previousProjectIds?: readonly string[];
|
|
83
92
|
/**
|
|
84
93
|
* Candidate project paths for ciphertexts still under the legacy path KDF
|
|
85
94
|
* (typically the current root plus the path the registry last recorded).
|
|
@@ -123,7 +132,8 @@ export declare function encryptProjectSecret(plaintext: string, projectId: strin
|
|
|
123
132
|
/**
|
|
124
133
|
* Decrypt a project-scoped secret, migrating legacy ciphertexts on the way.
|
|
125
134
|
*
|
|
126
|
-
* - Version `0x02` ciphertexts open with the project-identity key
|
|
135
|
+
* - Version `0x02` ciphertexts open with the project-identity key; one sealed
|
|
136
|
+
* under a `previousProjectIds` entry is opened and re-wrapped (T12716).
|
|
127
137
|
* - Version `0x01` (legacy, path-bound) ciphertexts are tried against each of
|
|
128
138
|
* `legacyProjectPaths`; the first that authenticates wins and the secret is
|
|
129
139
|
* re-encrypted under the project-identity KDF and returned as `rewrapped`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/crypto/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAqBH;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,CAE1E;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAuID;;;;GAIG;AACH,eAAO,MAAM,sCAAsC,IAAO,CAAC;AAE3D;;;GAGG;AACH,eAAO,MAAM,qCAAqC,IAAO,CAAC;AAK1D;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,YAAY,GAAG,aAAa,CAAC;AAEhE;;;;GAIG;AACH,MAAM,WAAW,oBAAqB,SAAQ,oBAAoB;IAChE
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/crypto/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAqBH;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,CAE1E;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAuID;;;;GAIG;AACH,eAAO,MAAM,sCAAsC,IAAO,CAAC;AAE3D;;;GAGG;AACH,eAAO,MAAM,qCAAqC,IAAO,CAAC;AAK1D;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,YAAY,GAAG,aAAa,CAAC;AAEhE;;;;GAIG;AACH,MAAM,WAAW,oBAAqB,SAAQ,oBAAoB;IAChE;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B;;;;;;OAMG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD;;;;OAIG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACjD;AAED;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,4BAA4B;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,2BAA2B;IAC3B,QAAQ,CAAC,GAAG,EAAE,oBAAoB,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AA2BD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,uBAAuB,CAAC,CAqDlC;AAyCD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,MAAM,CAAC,CAiBjB"}
|
|
@@ -232,7 +232,8 @@ export async function encryptProjectSecret(plaintext, projectId, options = {}) {
|
|
|
232
232
|
/**
|
|
233
233
|
* Decrypt a project-scoped secret, migrating legacy ciphertexts on the way.
|
|
234
234
|
*
|
|
235
|
-
* - Version `0x02` ciphertexts open with the project-identity key
|
|
235
|
+
* - Version `0x02` ciphertexts open with the project-identity key; one sealed
|
|
236
|
+
* under a `previousProjectIds` entry is opened and re-wrapped (T12716).
|
|
236
237
|
* - Version `0x01` (legacy, path-bound) ciphertexts are tried against each of
|
|
237
238
|
* `legacyProjectPaths`; the first that authenticates wins and the secret is
|
|
238
239
|
* re-encrypted under the project-identity KDF and returned as `rewrapped`
|
|
@@ -250,6 +251,19 @@ export async function decryptProjectSecret(ciphertext, context) {
|
|
|
250
251
|
if (parts.version === PROJECT_CIPHERTEXT_VERSION_PROJECT_ID) {
|
|
251
252
|
const plaintext = openWithKey(parts, await deriveProjectIdKey(context.projectId, context.cleoHome));
|
|
252
253
|
if (plaintext === null) {
|
|
254
|
+
// T12716: sealed under an id the project was re-keyed away from.
|
|
255
|
+
for (const previous of new Set(context.previousProjectIds ?? [])) {
|
|
256
|
+
if (previous.length === 0 || previous === context.projectId)
|
|
257
|
+
continue;
|
|
258
|
+
const opened = openWithKey(parts, await deriveProjectIdKey(previous, context.cleoHome));
|
|
259
|
+
if (opened !== null) {
|
|
260
|
+
return {
|
|
261
|
+
plaintext: opened,
|
|
262
|
+
kdf: 'project-id',
|
|
263
|
+
rewrapped: await encryptProjectSecret(opened, context.projectId, context),
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
}
|
|
253
267
|
throw new Error(`Cannot decrypt project credential for project ${context.projectId}: ` +
|
|
254
268
|
'the machine key differs from the one that encrypted it (another device, or a ' +
|
|
255
269
|
'regenerated machine-key), or the data is corrupted.');
|