@cleocode/core 2026.9.23 → 2026.9.24
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/build-provenance.json +2 -2
- 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/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 +74 -0
- package/dist/decide/bench/profiles.d.ts.map +1 -0
- package/dist/decide/bench/profiles.js +131 -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 +120 -0
- package/dist/decide/bench/report.js.map +1 -0
- package/dist/decide/bench/runner.d.ts +203 -0
- package/dist/decide/bench/runner.d.ts.map +1 -0
- package/dist/decide/bench/runner.js +335 -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 +124 -30
- 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 +25 -19
- package/dist/decide/jev-wire.d.ts.map +1 -1
- package/dist/decide/jev-wire.js +56 -31
- 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 +2928 -1053
- 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/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/twin-collapse.d.ts +52 -2
- package/dist/doctor/twin-collapse.d.ts.map +1 -1
- package/dist/doctor/twin-collapse.js +108 -4
- 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/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 +3017 -1142
- 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/learnings.d.ts +6 -6
- package/dist/memory/patterns.d.ts +4 -4
- 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/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 +67 -2
- 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/query.d.ts +2 -2
- package/dist/nexus/query.d.ts.map +1 -1
- package/dist/nexus/query.js +4 -19
- 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.d.ts +30 -5
- package/dist/nexus/registry.d.ts.map +1 -1
- package/dist/nexus/registry.js +115 -70
- 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/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.js +1 -1
- 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/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/selfimprove/fix-gen.js +3027 -1152
- package/dist/selfimprove/fix-gen.js.map +3 -3
- package/dist/sentient/cross-project-hygiene.d.ts +12 -6
- package/dist/sentient/cross-project-hygiene.d.ts.map +1 -1
- package/dist/sentient/cross-project-hygiene.js +15 -10
- package/dist/sentient/cross-project-hygiene.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/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/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/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/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 +30 -0
- package/dist/store/backup-sidecar.d.ts.map +1 -1
- package/dist/store/backup-sidecar.js +90 -2
- 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/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 +73 -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 +18 -0
- package/dist/store/db-helpers.d.ts.map +1 -1
- package/dist/store/db-helpers.js +46 -0
- package/dist/store/db-helpers.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/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 +3 -1
- 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/safety-data-accessor.d.ts +8 -3
- package/dist/store/safety-data-accessor.d.ts.map +1 -1
- package/dist/store/safety-data-accessor.js +11 -4
- package/dist/store/safety-data-accessor.js.map +1 -1
- package/dist/store/schema/cleo-global/nexus.d.ts +48 -0
- 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-project/docs.d.ts +16 -0
- 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/tasks-core.d.ts +80 -0
- package/dist/store/schema/cleo-project/tasks-core.d.ts.map +1 -1
- package/dist/store/schema/cleo-project/tasks-core.js +25 -1
- package/dist/store/schema/cleo-project/tasks-core.js.map +1 -1
- package/dist/store/schema/cleo-shared/brain.d.ts +1 -1
- package/dist/store/schema/memory-schema.d.ts +1 -1
- package/dist/store/schema/nexus-schema.d.ts +48 -0
- 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/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/sqlite-data-accessor.d.ts.map +1 -1
- package/dist/store/sqlite-data-accessor.js +245 -47
- 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/table-classification.d.ts +1 -1
- package/dist/store/table-classification.d.ts.map +1 -1
- package/dist/store/table-classification.js +34 -8
- 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.js +1 -1
- package/dist/store/tasks-sqlite.js.map +1 -1
- package/dist/store/twin-collapse.d.ts +339 -22
- package/dist/store/twin-collapse.d.ts.map +1 -1
- package/dist/store/twin-collapse.js +1323 -48
- package/dist/store/twin-collapse.js.map +1 -1
- package/dist/store/umbrella-data-accessor.d.ts +8 -3
- package/dist/store/umbrella-data-accessor.d.ts.map +1 -1
- package/dist/store/umbrella-data-accessor.js +10 -4
- package/dist/store/umbrella-data-accessor.js.map +1 -1
- package/dist/store/validation-schemas.d.ts +161 -1
- 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 +3 -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 +8 -0
- package/dist/system/project-health.d.ts.map +1 -1
- package/dist/system/project-health.js +13 -5
- 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/add.d.ts.map +1 -1
- package/dist/tasks/add.js +3 -2
- 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/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 +27 -7
- package/dist/tasks/complete.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/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/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/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/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/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/package.json +23 -13
- package/schemas/project-info.schema.json +10 -4
- package/templates/CLEO-INJECTION.md +1 -1
- package/templates/CLEO-REFERENCE.md +3 -3
- package/templates/cleo-gitignore +11 -0
- package/templates/workflows/release-prepare.yml.tmpl +156 -10
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Blob keep-links: attachment blobs outlive a stale-reading older build
|
|
3
|
+
* (T12535, mixed-version defence).
|
|
4
|
+
*
|
|
5
|
+
* ## Why
|
|
6
|
+
*
|
|
7
|
+
* After the twin collapse this build reads and writes `docs_attachments`,
|
|
8
|
+
* while the 2026.9.20 build still reads and writes the bare `attachments`
|
|
9
|
+
* table. Both keep blob bytes at the same content-addressed path
|
|
10
|
+
* (`.cleo/attachments/sha256/<aa>/<rest><ext>`). The older build deletes a blob
|
|
11
|
+
* when ITS last bare ref goes (and its janitor deletes blobs no BARE row
|
|
12
|
+
* names), unaware that this build's twin may still reference the content.
|
|
13
|
+
*
|
|
14
|
+
* ## How
|
|
15
|
+
*
|
|
16
|
+
* Every blob this build stores, references or carries in the collapse gets a
|
|
17
|
+
* hard link under `.cleo/attachments/keep/<aa>/<rest>` (a copy where hard
|
|
18
|
+
* links are not possible). The older build only ever unlinks the primary path,
|
|
19
|
+
* so the bytes survive in the keep-link, and this build restores the primary
|
|
20
|
+
* path from it on read, on every merge and in the repair.
|
|
21
|
+
*
|
|
22
|
+
* This build never deletes a blob straight away: its last deref leaves a
|
|
23
|
+
* tombstone (`<keep-link>.tomb`, holding the time). The repair (`cleo doctor`,
|
|
24
|
+
* the janitor) removes the primary file and the keep-link only after the grace
|
|
25
|
+
* period, and only when neither table names the content.
|
|
26
|
+
*
|
|
27
|
+
* @module
|
|
28
|
+
* @task T12535
|
|
29
|
+
*/
|
|
30
|
+
import { copyFileSync, existsSync, linkSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync, } from 'node:fs';
|
|
31
|
+
import { dirname, join } from 'node:path';
|
|
32
|
+
/**
|
|
33
|
+
* Minimal MIME-to-extension map for common attachment types.
|
|
34
|
+
*
|
|
35
|
+
* Fallback for all unrecognised MIME types is `.bin`.
|
|
36
|
+
*/
|
|
37
|
+
const MIME_TO_EXT = {
|
|
38
|
+
'text/markdown': '.md',
|
|
39
|
+
'text/plain': '.txt',
|
|
40
|
+
'text/html': '.html',
|
|
41
|
+
'text/css': '.css',
|
|
42
|
+
'text/javascript': '.js',
|
|
43
|
+
'application/json': '.json',
|
|
44
|
+
'application/pdf': '.pdf',
|
|
45
|
+
'application/zip': '.zip',
|
|
46
|
+
'application/octet-stream': '.bin',
|
|
47
|
+
'image/png': '.png',
|
|
48
|
+
'image/jpeg': '.jpg',
|
|
49
|
+
'image/gif': '.gif',
|
|
50
|
+
'image/webp': '.webp',
|
|
51
|
+
'image/svg+xml': '.svg',
|
|
52
|
+
'audio/mpeg': '.mp3',
|
|
53
|
+
'video/mp4': '.mp4',
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Resolve a file extension from a MIME type.
|
|
57
|
+
*
|
|
58
|
+
* @param mime - IANA MIME type string
|
|
59
|
+
* @returns Extension string including the leading dot (e.g., `".md"`)
|
|
60
|
+
*/
|
|
61
|
+
export function extFromMime(mime) {
|
|
62
|
+
// Normalise: strip parameters (e.g., "text/plain; charset=utf-8")
|
|
63
|
+
const base = mime.split(';')[0]?.trim() ?? mime;
|
|
64
|
+
return MIME_TO_EXT[base] ?? '.bin';
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* The primary on-disk path of a blob.
|
|
68
|
+
*
|
|
69
|
+
* @param cleoDir - The project's `.cleo` directory.
|
|
70
|
+
* @param sha256 - The content hash.
|
|
71
|
+
* @param mime - The blob's MIME type (gives the extension).
|
|
72
|
+
* @returns `.cleo/attachments/sha256/<aa>/<rest><ext>`.
|
|
73
|
+
*/
|
|
74
|
+
export function blobFilePath(cleoDir, sha256, mime) {
|
|
75
|
+
return join(cleoDir, 'attachments', 'sha256', sha256.slice(0, 2), `${sha256.slice(2)}${extFromMime(mime)}`);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* The primary path of the blob an attachment row stores bytes for, or `null`
|
|
79
|
+
* for kinds kept by reference (url, llms-txt, llmtxt-doc) or malformed JSON.
|
|
80
|
+
*
|
|
81
|
+
* @param cleoDir - The project's `.cleo` directory.
|
|
82
|
+
* @param sha256 - The row's content hash.
|
|
83
|
+
* @param attachmentJson - The row's `attachment_json`.
|
|
84
|
+
* @returns The primary blob path, or `null`.
|
|
85
|
+
*/
|
|
86
|
+
export function blobFileForRow(cleoDir, sha256, attachmentJson) {
|
|
87
|
+
let attachment;
|
|
88
|
+
try {
|
|
89
|
+
attachment = JSON.parse(attachmentJson);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
if (attachment.kind !== 'blob' && attachment.kind !== 'local-file')
|
|
95
|
+
return null;
|
|
96
|
+
const mime = typeof attachment.mime === 'string' ? attachment.mime : 'application/octet-stream';
|
|
97
|
+
return blobFilePath(cleoDir, sha256, mime);
|
|
98
|
+
}
|
|
99
|
+
/** The keep-link of a blob. */
|
|
100
|
+
function keepPath(cleoDir, sha256) {
|
|
101
|
+
return join(cleoDir, 'attachments', 'keep', sha256.slice(0, 2), sha256.slice(2));
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Hard-link (or copy) a blob's primary file to its keep-link. Idempotent and
|
|
105
|
+
* best effort: a missing primary file or an unwritable keep directory is not
|
|
106
|
+
* an error (the blob is then simply not protected).
|
|
107
|
+
*
|
|
108
|
+
* @param cleoDir - The project's `.cleo` directory.
|
|
109
|
+
* @param sha256 - The content hash.
|
|
110
|
+
* @param primary - The blob's primary path.
|
|
111
|
+
*/
|
|
112
|
+
export function pinBlob(cleoDir, sha256, primary) {
|
|
113
|
+
const keep = keepPath(cleoDir, sha256);
|
|
114
|
+
try {
|
|
115
|
+
if (existsSync(keep) || !existsSync(primary))
|
|
116
|
+
return;
|
|
117
|
+
mkdirSync(dirname(keep), { recursive: true });
|
|
118
|
+
try {
|
|
119
|
+
linkSync(primary, keep);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
copyFileSync(primary, keep);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
// best effort
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Put a blob's primary file back from its keep-link when the primary is
|
|
131
|
+
* missing (an older build unlinked it). Clears a pending tombstone: a restore
|
|
132
|
+
* means something still needs the bytes.
|
|
133
|
+
*
|
|
134
|
+
* @param cleoDir - The project's `.cleo` directory.
|
|
135
|
+
* @param sha256 - The content hash.
|
|
136
|
+
* @param primary - The blob's primary path.
|
|
137
|
+
* @returns Whether the primary file exists afterwards.
|
|
138
|
+
*/
|
|
139
|
+
export function restoreBlob(cleoDir, sha256, primary) {
|
|
140
|
+
if (existsSync(primary))
|
|
141
|
+
return true;
|
|
142
|
+
const keep = keepPath(cleoDir, sha256);
|
|
143
|
+
if (!existsSync(keep))
|
|
144
|
+
return false;
|
|
145
|
+
try {
|
|
146
|
+
mkdirSync(dirname(primary), { recursive: true });
|
|
147
|
+
try {
|
|
148
|
+
linkSync(keep, primary);
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
copyFileSync(keep, primary);
|
|
152
|
+
}
|
|
153
|
+
rmSync(`${keep}.tomb`, { force: true });
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Mark a blob this build no longer references: the repair deletes it after the
|
|
162
|
+
* grace period if neither table names the content then. The primary file and
|
|
163
|
+
* the keep-link stay until then.
|
|
164
|
+
*
|
|
165
|
+
* @param cleoDir - The project's `.cleo` directory.
|
|
166
|
+
* @param sha256 - The content hash.
|
|
167
|
+
* @param primary - The blob's primary path (pinned first, so the tombstone has
|
|
168
|
+
* a keep-link to guard).
|
|
169
|
+
* @param now - The tombstone time (ms since the epoch).
|
|
170
|
+
*/
|
|
171
|
+
export function tombstoneBlob(cleoDir, sha256, primary, now) {
|
|
172
|
+
pinBlob(cleoDir, sha256, primary);
|
|
173
|
+
const keep = keepPath(cleoDir, sha256);
|
|
174
|
+
try {
|
|
175
|
+
mkdirSync(dirname(keep), { recursive: true });
|
|
176
|
+
writeFileSync(`${keep}.tomb`, JSON.stringify({ primary, at: now }));
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
// best effort: without a tombstone the blob is simply kept
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Collect keep-links nobody needs. For each keep-link:
|
|
184
|
+
*
|
|
185
|
+
* - referenced by a row in either table: kept; a tombstone on it is dropped
|
|
186
|
+
* and its primary file restored if it is gone;
|
|
187
|
+
* - not referenced, tombstoned (this build's last deref): the primary file
|
|
188
|
+
* and the keep-link are deleted once the tombstone is older than the grace
|
|
189
|
+
* period;
|
|
190
|
+
* - not referenced, no tombstone (an older build deleted the row): the
|
|
191
|
+
* keep-link (and any primary file) is deleted once the file is older than
|
|
192
|
+
* the grace period.
|
|
193
|
+
*
|
|
194
|
+
* @param cleoDir - The project's `.cleo` directory.
|
|
195
|
+
* @param isReferenced - Whether a row in either table names the content.
|
|
196
|
+
* @param graceMs - How long a tombstone (or an unreferenced keep-link) must age.
|
|
197
|
+
* @param now - The current time (ms since the epoch).
|
|
198
|
+
* @param dryRun - Report only.
|
|
199
|
+
* @returns What was deleted, kept waiting, or revived.
|
|
200
|
+
*/
|
|
201
|
+
export function collectBlobGarbage(cleoDir, isReferenced, graceMs, now, dryRun) {
|
|
202
|
+
const root = join(cleoDir, 'attachments', 'keep');
|
|
203
|
+
const result = { deleted: [], waiting: 0, revived: 0 };
|
|
204
|
+
if (!existsSync(root))
|
|
205
|
+
return result;
|
|
206
|
+
for (const prefix of readdirSync(root)) {
|
|
207
|
+
let names;
|
|
208
|
+
try {
|
|
209
|
+
names = readdirSync(join(root, prefix));
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
for (const name of names) {
|
|
215
|
+
if (name.endsWith('.tomb'))
|
|
216
|
+
continue;
|
|
217
|
+
const sha256 = `${prefix}${name}`;
|
|
218
|
+
const keep = join(root, prefix, name);
|
|
219
|
+
const tomb = `${keep}.tomb`;
|
|
220
|
+
let primary = '';
|
|
221
|
+
let at;
|
|
222
|
+
try {
|
|
223
|
+
if (existsSync(tomb)) {
|
|
224
|
+
const parsed = JSON.parse(readFileSync(tomb, 'utf8'));
|
|
225
|
+
primary = typeof parsed.primary === 'string' ? parsed.primary : '';
|
|
226
|
+
at = typeof parsed.at === 'number' ? parsed.at : statSync(tomb).mtimeMs;
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
at = statSync(keep).mtimeMs;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
if (isReferenced(sha256)) {
|
|
236
|
+
if (existsSync(tomb)) {
|
|
237
|
+
result.revived++;
|
|
238
|
+
if (!dryRun) {
|
|
239
|
+
if (primary)
|
|
240
|
+
restoreBlob(cleoDir, sha256, primary);
|
|
241
|
+
rmSync(tomb, { force: true });
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
if (now - at < graceMs) {
|
|
247
|
+
result.waiting++;
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
result.deleted.push(sha256);
|
|
251
|
+
if (!dryRun) {
|
|
252
|
+
if (primary)
|
|
253
|
+
rmSync(primary, { force: true });
|
|
254
|
+
rmSync(keep, { force: true });
|
|
255
|
+
rmSync(tomb, { force: true });
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return result;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Whether a blob has a pending tombstone (its deletion waits for the grace
|
|
263
|
+
* period, so other sweeps leave it alone).
|
|
264
|
+
*
|
|
265
|
+
* @param cleoDir - The project's `.cleo` directory.
|
|
266
|
+
* @param sha256 - The content hash.
|
|
267
|
+
* @returns `true` when tombstoned.
|
|
268
|
+
*/
|
|
269
|
+
export function isTombstoned(cleoDir, sha256) {
|
|
270
|
+
return existsSync(`${keepPath(cleoDir, sha256)}.tomb`);
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Delete a blob's keep-link (the primary file was deleted by a sweep that
|
|
274
|
+
* checked both tables).
|
|
275
|
+
*
|
|
276
|
+
* @param cleoDir - The project's `.cleo` directory.
|
|
277
|
+
* @param sha256 - The content hash.
|
|
278
|
+
*/
|
|
279
|
+
export function unpinBlob(cleoDir, sha256) {
|
|
280
|
+
rmSync(keepPath(cleoDir, sha256), { force: true });
|
|
281
|
+
rmSync(`${keepPath(cleoDir, sha256)}.tomb`, { force: true });
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=blob-keep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blob-keep.js","sourceRoot":"","sources":["../../src/store/blob-keep.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"converters.d.ts","sourceRoot":"","sources":["../../src/store/converters.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,OAAO,EAGP,IAAI,EAQL,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"converters.d.ts","sourceRoot":"","sources":["../../src/store/converters.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,OAAO,EAGP,IAAI,EAQL,MAAM,qBAAqB,CAAC;AAM7B,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAyBzE,0DAA0D;AAC1D,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CA+C5C;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,CA4C1E;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU,CAOxD;AAED,gDAAgD;AAChD,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAuCrD"}
|
package/dist/store/converters.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import { acceptanceItemSchema } from '@cleocode/contracts';
|
|
8
8
|
import { z } from 'zod';
|
|
9
9
|
import { safeParseJson, safeParseJsonArray } from './parsers.js';
|
|
10
|
+
import { claimFromColumns } from './task-claim.js';
|
|
10
11
|
// Validate with the canonical stored union, but retain the original values.
|
|
11
12
|
// Parsing acceptanceItemSchema directly trims strings and strips object keys.
|
|
12
13
|
const storedAcceptanceSchema = z.custom((value) => Array.isArray(value) && value.every((item) => acceptanceItemSchema.safeParse(item).success));
|
|
@@ -21,6 +22,11 @@ function readStoredAcceptance(row) {
|
|
|
21
22
|
throw new Error(`Invalid stored acceptance for task ${row.id}`, { cause });
|
|
22
23
|
}
|
|
23
24
|
}
|
|
25
|
+
/** The `claim` entry of a task record: `{ claim }` when leased, else `{}` (T12502). */
|
|
26
|
+
function claimEntry(row) {
|
|
27
|
+
const claim = claimFromColumns(row);
|
|
28
|
+
return claim ? { claim } : {};
|
|
29
|
+
}
|
|
24
30
|
/** Convert a database TaskRow to a domain Task object. */
|
|
25
31
|
export function rowToTask(row) {
|
|
26
32
|
return {
|
|
@@ -60,6 +66,9 @@ export function rowToTask(row) {
|
|
|
60
66
|
: undefined,
|
|
61
67
|
pipelineStage: row.pipelineStage ?? undefined,
|
|
62
68
|
assignee: row.assignee ?? undefined,
|
|
69
|
+
// T12502: the agent claim lease — read-only here; taskToRow never writes it.
|
|
70
|
+
// Present only when claimed, so an unclaimed task record is unchanged.
|
|
71
|
+
...claimEntry(row),
|
|
63
72
|
// T944/T9072: orthogonal axes — kind (intent, DB col 'role') and scope (granularity)
|
|
64
73
|
kind: row.kind ?? undefined,
|
|
65
74
|
scope: row.scope ?? undefined,
|
|
@@ -155,6 +164,8 @@ export function rowToSession(row) {
|
|
|
155
164
|
nextSessionId: row.nextSessionId ?? null,
|
|
156
165
|
// Fork-tree parent edge (T11639)
|
|
157
166
|
parentSessionId: row.parentSessionId ?? null,
|
|
167
|
+
// Trusted spawn edge (T12502) — read-only: upsertSession never writes it.
|
|
168
|
+
spawnedBySessionId: row.spawnedBySessionId ?? null,
|
|
158
169
|
agentIdentifier: row.agentIdentifier ?? null,
|
|
159
170
|
handoffConsumedAt: row.handoffConsumedAt ?? null,
|
|
160
171
|
handoffConsumedBy: row.handoffConsumedBy ?? null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"converters.js","sourceRoot":"","sources":["../../src/store/converters.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"converters.js","sourceRoot":"","sources":["../../src/store/converters.ts"],"names":[],"mappings":"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"}
|
|
@@ -57,6 +57,11 @@ export interface CredentialSources {
|
|
|
57
57
|
readonly projectDbPath?: string;
|
|
58
58
|
/** Project identity keying the project KDF. Required when the project store has rows. */
|
|
59
59
|
readonly projectId?: string;
|
|
60
|
+
/**
|
|
61
|
+
* Ids the project was keyed by before a re-key (T12716); ciphertexts under
|
|
62
|
+
* them are opened and re-wrapped under {@link CredentialSources.projectId}.
|
|
63
|
+
*/
|
|
64
|
+
readonly previousProjectIds?: readonly string[];
|
|
60
65
|
/** Candidate paths for legacy path-bound project ciphertexts (usually the project root). */
|
|
61
66
|
readonly legacyProjectPaths?: readonly string[];
|
|
62
67
|
/** Global `cleo.db` (live, or a staged snapshot). */
|
|
@@ -219,7 +224,7 @@ export declare function unsealCredentials(sealed: Uint8Array, passphrase: string
|
|
|
219
224
|
* and `projectId` is missing.
|
|
220
225
|
* @task T12326
|
|
221
226
|
*/
|
|
222
|
-
export declare function migrateProjectCredentials(sources: Pick<CredentialSources, 'projectDbPath' | 'projectId' | 'legacyProjectPaths' | 'cleoHome'>, options?: {
|
|
227
|
+
export declare function migrateProjectCredentials(sources: Pick<CredentialSources, 'projectDbPath' | 'projectId' | 'previousProjectIds' | 'legacyProjectPaths' | 'cleoHome'>, options?: {
|
|
223
228
|
readonly dryRun?: boolean;
|
|
224
229
|
}): Promise<ProjectCredentialMigrationResult>;
|
|
225
230
|
/**
|
|
@@ -236,10 +241,37 @@ export interface ProjectRootCredentialMigration extends ProjectCredentialMigrati
|
|
|
236
241
|
readonly dryRun: boolean;
|
|
237
242
|
}
|
|
238
243
|
/**
|
|
239
|
-
*
|
|
240
|
-
*
|
|
241
|
-
*
|
|
242
|
-
*
|
|
244
|
+
* The id that keys a project's credentials, plus the ids it was keyed by
|
|
245
|
+
* before (T12716).
|
|
246
|
+
*
|
|
247
|
+
* The id is the declared one — tracked `.cleo/project.json` /
|
|
248
|
+
* `.cleo/project-id` first, then the `project-info.json` cache — the same
|
|
249
|
+
* order every identity reader uses. The previous ids are the cache when it
|
|
250
|
+
* disagrees (a conflict not yet resolved), the cache's `previousProjectIds`
|
|
251
|
+
* receipts (a conflict `cleo doctor project-identity --resolve` already
|
|
252
|
+
* re-keyed), and every id the global registry aliases to the declared one
|
|
253
|
+
* (`nexus_project_id_aliases`), so credentials sealed under any of them open.
|
|
254
|
+
* The alias read never creates the global store.
|
|
255
|
+
*
|
|
256
|
+
* @param projectRoot - Project root.
|
|
257
|
+
* @param cleoHome - Global CLEO home whose alias table is read (defaults to the current one).
|
|
258
|
+
* @returns The declared id (`null` when none) and the previous ids.
|
|
259
|
+
* @example
|
|
260
|
+
* ```ts
|
|
261
|
+
* const { projectId, previousProjectIds } = await readProjectCredentialIdentity(root);
|
|
262
|
+
* ```
|
|
263
|
+
* @task T12716
|
|
264
|
+
*/
|
|
265
|
+
export declare function readProjectCredentialIdentity(projectRoot: string, cleoHome?: string): Promise<{
|
|
266
|
+
projectId: string | null;
|
|
267
|
+
previousProjectIds: string[];
|
|
268
|
+
}>;
|
|
269
|
+
/**
|
|
270
|
+
* Migrate a project's stored credentials off the path-bound KDF (and off any
|
|
271
|
+
* id the project was re-keyed away from — T12716), resolving everything from
|
|
272
|
+
* the project root: the store is `<root>/.cleo/cleo.db`, the identity is
|
|
273
|
+
* {@link readProjectCredentialIdentity}, and the legacy candidates are the
|
|
274
|
+
* root as given and its real path.
|
|
243
275
|
*
|
|
244
276
|
* This is the trigger used by `cleo upgrade` and `cleo doctor credentials`.
|
|
245
277
|
* It is idempotent and never deletes; unrecoverable rows come back in
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential-transfer.d.ts","sourceRoot":"","sources":["../../src/store/credential-transfer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAMH,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EACjB,gCAAgC,EAChC,qBAAqB,EACrB,uBAAuB,EACxB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"credential-transfer.d.ts","sourceRoot":"","sources":["../../src/store/credential-transfer.ts"],"names":[],"mappings":"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"}
|
|
@@ -48,6 +48,7 @@
|
|
|
48
48
|
import fs from 'node:fs';
|
|
49
49
|
import { createRequire } from 'node:module';
|
|
50
50
|
import path from 'node:path';
|
|
51
|
+
import { isValidPortableProjectId, readDeclaredProjectIdentity } from '@cleocode/paths';
|
|
51
52
|
import { decryptGlobal, decryptProjectSecret, encryptGlobal, encryptProjectSecret, } from '../crypto/credentials.js';
|
|
52
53
|
import { addCredential, credentialsStorePath, isStoredCredential, } from '../llm/credentials-store.js';
|
|
53
54
|
import { getCleoHome } from '../paths.js';
|
|
@@ -338,6 +339,7 @@ async function openRow(row, sources) {
|
|
|
338
339
|
const projectId = requireProjectId(sources.projectId, 'seal');
|
|
339
340
|
const result = await decryptProjectSecret(row.material, {
|
|
340
341
|
projectId,
|
|
342
|
+
previousProjectIds: sources.previousProjectIds,
|
|
341
343
|
legacyProjectPaths: sources.legacyProjectPaths,
|
|
342
344
|
cleoHome: sources.cleoHome,
|
|
343
345
|
});
|
|
@@ -653,6 +655,7 @@ export async function migrateProjectCredentials(sources, options = {}) {
|
|
|
653
655
|
try {
|
|
654
656
|
result = await decryptProjectSecret(row.material, {
|
|
655
657
|
projectId,
|
|
658
|
+
previousProjectIds: sources.previousProjectIds,
|
|
656
659
|
legacyProjectPaths: sources.legacyProjectPaths,
|
|
657
660
|
cleoHome: sources.cleoHome,
|
|
658
661
|
});
|
|
@@ -676,10 +679,74 @@ export async function migrateProjectCredentials(sources, options = {}) {
|
|
|
676
679
|
return { migrated, current, reentry };
|
|
677
680
|
}
|
|
678
681
|
/**
|
|
679
|
-
*
|
|
680
|
-
*
|
|
681
|
-
*
|
|
682
|
-
*
|
|
682
|
+
* The id that keys a project's credentials, plus the ids it was keyed by
|
|
683
|
+
* before (T12716).
|
|
684
|
+
*
|
|
685
|
+
* The id is the declared one — tracked `.cleo/project.json` /
|
|
686
|
+
* `.cleo/project-id` first, then the `project-info.json` cache — the same
|
|
687
|
+
* order every identity reader uses. The previous ids are the cache when it
|
|
688
|
+
* disagrees (a conflict not yet resolved), the cache's `previousProjectIds`
|
|
689
|
+
* receipts (a conflict `cleo doctor project-identity --resolve` already
|
|
690
|
+
* re-keyed), and every id the global registry aliases to the declared one
|
|
691
|
+
* (`nexus_project_id_aliases`), so credentials sealed under any of them open.
|
|
692
|
+
* The alias read never creates the global store.
|
|
693
|
+
*
|
|
694
|
+
* @param projectRoot - Project root.
|
|
695
|
+
* @param cleoHome - Global CLEO home whose alias table is read (defaults to the current one).
|
|
696
|
+
* @returns The declared id (`null` when none) and the previous ids.
|
|
697
|
+
* @example
|
|
698
|
+
* ```ts
|
|
699
|
+
* const { projectId, previousProjectIds } = await readProjectCredentialIdentity(root);
|
|
700
|
+
* ```
|
|
701
|
+
* @task T12716
|
|
702
|
+
*/
|
|
703
|
+
export async function readProjectCredentialIdentity(projectRoot, cleoHome = getCleoHome()) {
|
|
704
|
+
const declared = readDeclaredProjectIdentity(projectRoot);
|
|
705
|
+
const previous = new Set();
|
|
706
|
+
if (declared?.infoProjectId !== undefined && declared.infoProjectId !== declared.projectId)
|
|
707
|
+
previous.add(declared.infoProjectId);
|
|
708
|
+
try {
|
|
709
|
+
const info = JSON.parse(fs.readFileSync(path.join(projectRoot, '.cleo', 'project-info.json'), 'utf-8'));
|
|
710
|
+
const receipts = info !== null && typeof info === 'object' && 'previousProjectIds' in info
|
|
711
|
+
? info.previousProjectIds
|
|
712
|
+
: undefined;
|
|
713
|
+
if (Array.isArray(receipts))
|
|
714
|
+
for (const id of receipts)
|
|
715
|
+
if (typeof id === 'string' && id.length > 0)
|
|
716
|
+
previous.add(id);
|
|
717
|
+
}
|
|
718
|
+
catch {
|
|
719
|
+
// No readable cache: no previous ids.
|
|
720
|
+
}
|
|
721
|
+
if (declared) {
|
|
722
|
+
try {
|
|
723
|
+
const { getNexusRegistryDb, getNexusRegistryDbPath } = await import('./nexus-sqlite.js');
|
|
724
|
+
if (fs.existsSync(getNexusRegistryDbPath(cleoHome))) {
|
|
725
|
+
const { projectIdAliases } = await import('./schema/nexus-schema.js');
|
|
726
|
+
const { eq } = await import('drizzle-orm');
|
|
727
|
+
const db = await getNexusRegistryDb(cleoHome);
|
|
728
|
+
for (const alias of db
|
|
729
|
+
.select({ legacyId: projectIdAliases.legacyId })
|
|
730
|
+
.from(projectIdAliases)
|
|
731
|
+
.where(eq(projectIdAliases.canonicalId, declared.projectId))
|
|
732
|
+
.all())
|
|
733
|
+
if (isValidPortableProjectId(alias.legacyId))
|
|
734
|
+
previous.add(alias.legacyId);
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
catch {
|
|
738
|
+
// Registry unreadable: the receipts above still apply.
|
|
739
|
+
}
|
|
740
|
+
previous.delete(declared.projectId);
|
|
741
|
+
}
|
|
742
|
+
return { projectId: declared?.projectId ?? null, previousProjectIds: [...previous] };
|
|
743
|
+
}
|
|
744
|
+
/**
|
|
745
|
+
* Migrate a project's stored credentials off the path-bound KDF (and off any
|
|
746
|
+
* id the project was re-keyed away from — T12716), resolving everything from
|
|
747
|
+
* the project root: the store is `<root>/.cleo/cleo.db`, the identity is
|
|
748
|
+
* {@link readProjectCredentialIdentity}, and the legacy candidates are the
|
|
749
|
+
* root as given and its real path.
|
|
683
750
|
*
|
|
684
751
|
* This is the trigger used by `cleo upgrade` and `cleo doctor credentials`.
|
|
685
752
|
* It is idempotent and never deletes; unrecoverable rows come back in
|
|
@@ -697,23 +764,11 @@ export async function migrateProjectCredentialsAtRoot(projectRoot, options = {})
|
|
|
697
764
|
const root = path.resolve(projectRoot);
|
|
698
765
|
const cleoDir = path.join(root, '.cleo');
|
|
699
766
|
const projectDbPath = path.join(cleoDir, 'cleo.db');
|
|
700
|
-
|
|
701
|
-
try {
|
|
702
|
-
const parsed = JSON.parse(fs.readFileSync(path.join(cleoDir, 'project-info.json'), 'utf-8'));
|
|
703
|
-
if (typeof parsed === 'object' &&
|
|
704
|
-
parsed !== null &&
|
|
705
|
-
'projectId' in parsed &&
|
|
706
|
-
typeof parsed.projectId === 'string' &&
|
|
707
|
-
parsed.projectId.length > 0) {
|
|
708
|
-
projectId = parsed.projectId;
|
|
709
|
-
}
|
|
710
|
-
}
|
|
711
|
-
catch {
|
|
712
|
-
projectId = null;
|
|
713
|
-
}
|
|
767
|
+
const { projectId, previousProjectIds } = await readProjectCredentialIdentity(root, options.cleoHome);
|
|
714
768
|
const result = await migrateProjectCredentials({
|
|
715
769
|
projectDbPath,
|
|
716
770
|
...(projectId !== null ? { projectId } : {}),
|
|
771
|
+
previousProjectIds,
|
|
717
772
|
legacyProjectPaths: [root, canonicalPath(root)],
|
|
718
773
|
...(options.cleoHome !== undefined ? { cleoHome: options.cleoHome } : {}),
|
|
719
774
|
}, { dryRun: options.dryRun === true });
|