@cleocode/core 2026.10.21 → 2026.10.22
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/STABILITY.md +1 -1
- package/dist/build-provenance.json +2 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/docs/document-edges.d.ts +38 -0
- package/dist/docs/document-edges.d.ts.map +1 -0
- package/dist/docs/document-edges.js +62 -0
- package/dist/docs/document-edges.js.map +1 -0
- package/dist/docs/projection.d.ts +3 -2
- package/dist/docs/projection.d.ts.map +1 -1
- package/dist/docs/projection.js +33 -36
- package/dist/docs/projection.js.map +1 -1
- package/dist/events/event-bus.d.ts +6 -5
- package/dist/events/event-bus.d.ts.map +1 -1
- package/dist/events/event-bus.js +9 -8
- package/dist/events/event-bus.js.map +1 -1
- package/dist/gateway-client/generated/index.d.ts +2 -2
- package/dist/gateway-client/generated/index.d.ts.map +1 -1
- package/dist/gateway-client/generated/index.js +1 -1
- package/dist/gateway-client/generated/index.js.map +1 -1
- package/dist/gateway-client/generated/namespaces.gen.d.ts +1 -0
- package/dist/gateway-client/generated/namespaces.gen.d.ts.map +1 -1
- package/dist/gateway-client/generated/namespaces.gen.js +2 -1
- package/dist/gateway-client/generated/namespaces.gen.js.map +1 -1
- package/dist/gateway-client/generated/sdk.gen.d.ts +5 -1
- package/dist/gateway-client/generated/sdk.gen.d.ts.map +1 -1
- package/dist/gateway-client/generated/sdk.gen.js +11 -0
- package/dist/gateway-client/generated/sdk.gen.js.map +1 -1
- package/dist/gateway-client/generated/types.gen.d.ts +34 -0
- package/dist/gateway-client/generated/types.gen.d.ts.map +1 -1
- package/dist/git/base-ref.d.ts +81 -0
- package/dist/git/base-ref.d.ts.map +1 -0
- package/dist/git/base-ref.js +135 -0
- package/dist/git/base-ref.js.map +1 -0
- package/dist/git/hooks-install.d.ts +1 -1
- package/dist/git/hooks-install.d.ts.map +1 -1
- package/dist/git/work-tree.d.ts +40 -0
- package/dist/git/work-tree.d.ts.map +1 -1
- package/dist/git/work-tree.js +62 -7
- package/dist/git/work-tree.js.map +1 -1
- package/dist/hooks/handlers/conduit-hooks.d.ts +2 -1
- package/dist/hooks/handlers/conduit-hooks.d.ts.map +1 -1
- package/dist/hooks/handlers/conduit-hooks.js +9 -23
- package/dist/hooks/handlers/conduit-hooks.js.map +1 -1
- package/dist/hooks/handlers/index.d.ts +0 -1
- package/dist/hooks/handlers/index.d.ts.map +1 -1
- package/dist/hooks/handlers/index.js +0 -2
- package/dist/hooks/handlers/index.js.map +1 -1
- package/dist/hooks.d.ts +1 -1
- package/dist/hooks.d.ts.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +5 -12
- package/dist/init.js.map +1 -1
- package/dist/internal.d.ts +2 -3
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +1 -1
- package/dist/internal.js.map +1 -1
- package/dist/lifecycle/index.d.ts +15 -1
- package/dist/lifecycle/index.d.ts.map +1 -1
- package/dist/lifecycle/index.js +12 -6
- package/dist/lifecycle/index.js.map +1 -1
- package/dist/lifecycle/stage-guidance.js +1 -1
- package/dist/lifecycle/stage-guidance.js.map +1 -1
- package/dist/memory/auto-row-quarantine.d.ts +196 -0
- package/dist/memory/auto-row-quarantine.d.ts.map +1 -0
- package/dist/memory/auto-row-quarantine.js +363 -0
- package/dist/memory/auto-row-quarantine.js.map +1 -0
- package/dist/memory/auto-row-rules.d.ts +29 -0
- package/dist/memory/auto-row-rules.d.ts.map +1 -0
- package/dist/memory/auto-row-rules.js +55 -0
- package/dist/memory/auto-row-rules.js.map +1 -0
- package/dist/memory/brain-lifecycle.d.ts.map +1 -1
- package/dist/memory/brain-lifecycle.js +13 -8
- package/dist/memory/brain-lifecycle.js.map +1 -1
- package/dist/memory/brain-search.d.ts +49 -29
- package/dist/memory/brain-search.d.ts.map +1 -1
- package/dist/memory/brain-search.js +159 -156
- package/dist/memory/brain-search.js.map +1 -1
- package/dist/memory/brain-similarity.d.ts +27 -4
- package/dist/memory/brain-similarity.d.ts.map +1 -1
- package/dist/memory/brain-similarity.js +41 -20
- package/dist/memory/brain-similarity.js.map +1 -1
- package/dist/memory/brain-stub-prune.d.ts +13 -0
- package/dist/memory/brain-stub-prune.d.ts.map +1 -1
- package/dist/memory/brain-stub-prune.js +14 -3
- package/dist/memory/brain-stub-prune.js.map +1 -1
- package/dist/memory/brain-writer-handlers.d.ts +3 -7
- package/dist/memory/brain-writer-handlers.d.ts.map +1 -1
- package/dist/memory/brain-writer-handlers.js +5 -20
- package/dist/memory/brain-writer-handlers.js.map +1 -1
- package/dist/memory/brain-writer-thread.d.ts +2 -11
- package/dist/memory/brain-writer-thread.d.ts.map +1 -1
- package/dist/memory/brain-writer-thread.js +20 -78
- package/dist/memory/brain-writer-thread.js.map +1 -1
- package/dist/memory/brain-writer-worker.js +1 -8
- package/dist/memory/brain-writer-worker.js.map +1 -1
- package/dist/memory/dispatch-trace-format.d.ts +13 -14
- package/dist/memory/dispatch-trace-format.d.ts.map +1 -1
- package/dist/memory/dispatch-trace-format.js +13 -14
- package/dist/memory/dispatch-trace-format.js.map +1 -1
- package/dist/memory/eligibility.d.ts +22 -0
- package/dist/memory/eligibility.d.ts.map +1 -1
- package/dist/memory/eligibility.js +36 -0
- package/dist/memory/eligibility.js.map +1 -1
- package/dist/memory/engine-compat.d.ts.map +1 -1
- package/dist/memory/engine-compat.js +11 -1
- package/dist/memory/engine-compat.js.map +1 -1
- package/dist/memory/evidence-graph-links.d.ts +253 -0
- package/dist/memory/evidence-graph-links.d.ts.map +1 -0
- package/dist/memory/evidence-graph-links.js +554 -0
- package/dist/memory/evidence-graph-links.js.map +1 -0
- package/dist/memory/extraction-gate.d.ts +7 -0
- package/dist/memory/extraction-gate.d.ts.map +1 -1
- package/dist/memory/extraction-gate.js +20 -8
- package/dist/memory/extraction-gate.js.map +1 -1
- package/dist/memory/global-brain.d.ts +4 -6
- package/dist/memory/global-brain.d.ts.map +1 -1
- package/dist/memory/global-brain.js +15 -2
- package/dist/memory/global-brain.js.map +1 -1
- package/dist/memory/graph-auto-populate.d.ts +73 -1
- package/dist/memory/graph-auto-populate.d.ts.map +1 -1
- package/dist/memory/graph-auto-populate.js +111 -8
- package/dist/memory/graph-auto-populate.js.map +1 -1
- package/dist/memory/import-from-provider.d.ts +19 -6
- package/dist/memory/import-from-provider.d.ts.map +1 -1
- package/dist/memory/import-from-provider.js +28 -15
- package/dist/memory/import-from-provider.js.map +1 -1
- package/dist/memory/lessons-import.d.ts +175 -0
- package/dist/memory/lessons-import.d.ts.map +1 -0
- package/dist/memory/lessons-import.js +233 -0
- package/dist/memory/lessons-import.js.map +1 -0
- package/dist/memory/lessons.d.ts +67 -0
- package/dist/memory/lessons.d.ts.map +1 -0
- package/dist/memory/lessons.js +121 -0
- package/dist/memory/lessons.js.map +1 -0
- package/dist/memory/memory-bridge.d.ts.map +1 -1
- package/dist/memory/memory-bridge.js +3 -2
- package/dist/memory/memory-bridge.js.map +1 -1
- package/dist/memory/public-api.d.ts.map +1 -1
- package/dist/memory/public-api.js +7 -6
- package/dist/memory/public-api.js.map +1 -1
- package/dist/memory/recall-ranking.d.ts +88 -0
- package/dist/memory/recall-ranking.d.ts.map +1 -0
- package/dist/memory/recall-ranking.js +130 -0
- package/dist/memory/recall-ranking.js.map +1 -0
- package/dist/memory/retrieval/build-retrieval-bundle.js +5 -5
- package/dist/memory/retrieval/build-retrieval-bundle.js.map +1 -1
- package/dist/memory/retrieval/fetch.d.ts +3 -2
- package/dist/memory/retrieval/fetch.d.ts.map +1 -1
- package/dist/memory/retrieval/fetch.js +4 -3
- package/dist/memory/retrieval/fetch.js.map +1 -1
- package/dist/memory/retrieval/observe.d.ts +1 -7
- package/dist/memory/retrieval/observe.d.ts.map +1 -1
- package/dist/memory/retrieval/observe.js +9 -58
- package/dist/memory/retrieval/observe.js.map +1 -1
- package/dist/memory/retrieval/search.d.ts +5 -6
- package/dist/memory/retrieval/search.d.ts.map +1 -1
- package/dist/memory/retrieval/search.js +38 -102
- package/dist/memory/retrieval/search.js.map +1 -1
- package/dist/memory/retrieval/telemetry.d.ts +5 -16
- package/dist/memory/retrieval/telemetry.d.ts.map +1 -1
- package/dist/memory/retrieval/telemetry.js +5 -22
- package/dist/memory/retrieval/telemetry.js.map +1 -1
- package/dist/nexus/analyze-orchestrator.d.ts +15 -0
- package/dist/nexus/analyze-orchestrator.d.ts.map +1 -1
- package/dist/nexus/analyze-orchestrator.js +53 -6
- package/dist/nexus/analyze-orchestrator.js.map +1 -1
- package/dist/nexus/brief-map.d.ts +60 -0
- package/dist/nexus/brief-map.d.ts.map +1 -0
- package/dist/nexus/brief-map.js +234 -0
- package/dist/nexus/brief-map.js.map +1 -0
- package/dist/nexus/freshness.d.ts +128 -13
- package/dist/nexus/freshness.d.ts.map +1 -1
- package/dist/nexus/freshness.js +374 -86
- package/dist/nexus/freshness.js.map +1 -1
- package/dist/nexus/graph-manifest.d.ts +47 -0
- package/dist/nexus/graph-manifest.d.ts.map +1 -1
- package/dist/nexus/graph-manifest.js +69 -0
- package/dist/nexus/graph-manifest.js.map +1 -1
- package/dist/nexus/hooks-augment.d.ts.map +1 -1
- package/dist/nexus/hooks-augment.js +7 -3
- package/dist/nexus/hooks-augment.js.map +1 -1
- package/dist/nexus/index-health.d.ts +112 -0
- package/dist/nexus/index-health.d.ts.map +1 -0
- package/dist/nexus/index-health.js +199 -0
- package/dist/nexus/index-health.js.map +1 -0
- package/dist/nexus/living-brain.d.ts.map +1 -1
- package/dist/nexus/living-brain.js +2 -15
- package/dist/nexus/living-brain.js.map +1 -1
- package/dist/nexus/pid-lock.d.ts +50 -0
- package/dist/nexus/pid-lock.d.ts.map +1 -0
- package/dist/nexus/pid-lock.js +135 -0
- package/dist/nexus/pid-lock.js.map +1 -0
- package/dist/nexus/projects-clean.d.ts.map +1 -1
- package/dist/nexus/projects-clean.js +33 -2
- package/dist/nexus/projects-clean.js.map +1 -1
- package/dist/nexus/refresh-child.js +4 -0
- package/dist/nexus/refresh-child.js.map +1 -1
- package/dist/nexus/registry-host.d.ts +70 -0
- package/dist/nexus/registry-host.d.ts.map +1 -0
- package/dist/nexus/registry-host.js +79 -0
- package/dist/nexus/registry-host.js.map +1 -0
- package/dist/nexus/registry.d.ts +37 -0
- package/dist/nexus/registry.d.ts.map +1 -1
- package/dist/nexus/registry.js +49 -1
- package/dist/nexus/registry.js.map +1 -1
- package/dist/nexus/reindex-on-merge.d.ts +94 -0
- package/dist/nexus/reindex-on-merge.d.ts.map +1 -0
- package/dist/nexus/reindex-on-merge.js +192 -0
- package/dist/nexus/reindex-on-merge.js.map +1 -0
- package/dist/orchestrate/handoff-ops.d.ts.map +1 -1
- package/dist/orchestrate/handoff-ops.js +1 -13
- package/dist/orchestrate/handoff-ops.js.map +1 -1
- package/dist/orchestrate/index.d.ts +2 -3
- package/dist/orchestrate/index.d.ts.map +1 -1
- package/dist/orchestrate/index.js +2 -2
- package/dist/orchestrate/index.js.map +1 -1
- package/dist/orchestrate/lifecycle-ops.d.ts +3 -0
- package/dist/orchestrate/lifecycle-ops.d.ts.map +1 -1
- package/dist/orchestrate/lifecycle-ops.js +5 -5
- package/dist/orchestrate/lifecycle-ops.js.map +1 -1
- package/dist/orchestrate/spawn-ops.d.ts +8 -28
- package/dist/orchestrate/spawn-ops.d.ts.map +1 -1
- package/dist/orchestrate/spawn-ops.js +8 -67
- package/dist/orchestrate/spawn-ops.js.map +1 -1
- package/dist/orchestration/lead-rollup.d.ts +7 -0
- package/dist/orchestration/lead-rollup.d.ts.map +1 -1
- package/dist/orchestration/lead-rollup.js.map +1 -1
- package/dist/orchestration/spawn-prompt.d.ts +8 -29
- package/dist/orchestration/spawn-prompt.d.ts.map +1 -1
- package/dist/orchestration/spawn-prompt.js +44 -112
- package/dist/orchestration/spawn-prompt.js.map +1 -1
- package/dist/orchestration/spawn.d.ts +7 -14
- package/dist/orchestration/spawn.d.ts.map +1 -1
- package/dist/orchestration/spawn.js +2 -5
- package/dist/orchestration/spawn.js.map +1 -1
- package/dist/orchestration/wave-topic.d.ts +0 -13
- package/dist/orchestration/wave-topic.d.ts.map +1 -1
- package/dist/orchestration/wave-topic.js +0 -20
- package/dist/orchestration/wave-topic.js.map +1 -1
- package/dist/release/engine-ops.js +2 -2
- package/dist/release/engine-ops.js.map +1 -1
- package/dist/release/github-pr.d.ts +8 -5
- package/dist/release/github-pr.d.ts.map +1 -1
- package/dist/release/github-pr.js +11 -16
- package/dist/release/github-pr.js.map +1 -1
- package/dist/release/plan.d.ts +4 -2
- package/dist/release/plan.d.ts.map +1 -1
- package/dist/release/plan.js +11 -4
- package/dist/release/plan.js.map +1 -1
- package/dist/release/pr-evidence.d.ts +39 -11
- package/dist/release/pr-evidence.d.ts.map +1 -1
- package/dist/release/pr-evidence.js +122 -31
- package/dist/release/pr-evidence.js.map +1 -1
- package/dist/release/reconcile.d.ts +15 -0
- package/dist/release/reconcile.d.ts.map +1 -1
- package/dist/release/reconcile.js +36 -0
- package/dist/release/reconcile.js.map +1 -1
- package/dist/render/brain/index.d.ts +3 -2
- package/dist/render/brain/index.d.ts.map +1 -1
- package/dist/render/brain/index.js +4 -2
- package/dist/render/brain/index.js.map +1 -1
- package/dist/render/brain/migrate-repo-ids.d.ts +19 -0
- package/dist/render/brain/migrate-repo-ids.d.ts.map +1 -0
- package/dist/render/brain/migrate-repo-ids.js +41 -0
- package/dist/render/brain/migrate-repo-ids.js.map +1 -0
- package/dist/render/nexus/graph/index.d.ts.map +1 -1
- package/dist/render/nexus/graph/index.js +10 -1
- package/dist/render/nexus/graph/index.js.map +1 -1
- package/dist/resources/admission-ledger.d.ts +39 -4
- package/dist/resources/admission-ledger.d.ts.map +1 -1
- package/dist/resources/admission-ledger.js +147 -32
- package/dist/resources/admission-ledger.js.map +1 -1
- package/dist/resources/hook-footprint.d.ts +90 -0
- package/dist/resources/hook-footprint.d.ts.map +1 -0
- package/dist/resources/hook-footprint.js +245 -0
- package/dist/resources/hook-footprint.js.map +1 -0
- package/dist/resources/pressure-gate.d.ts +3 -2
- package/dist/resources/pressure-gate.d.ts.map +1 -1
- package/dist/resources/pressure-gate.js +8 -5
- package/dist/resources/pressure-gate.js.map +1 -1
- package/dist/resources/run-admission.d.ts +23 -3
- package/dist/resources/run-admission.d.ts.map +1 -1
- package/dist/resources/run-admission.js +70 -8
- package/dist/resources/run-admission.js.map +1 -1
- package/dist/resources/run-class.d.ts +1 -0
- package/dist/resources/run-class.d.ts.map +1 -1
- package/dist/resources/run-class.js +7 -0
- package/dist/resources/run-class.js.map +1 -1
- package/dist/resources/run-governed.d.ts +13 -1
- package/dist/resources/run-governed.d.ts.map +1 -1
- package/dist/resources/run-governed.js +29 -6
- package/dist/resources/run-governed.js.map +1 -1
- package/dist/resources/top-memory.d.ts +67 -0
- package/dist/resources/top-memory.d.ts.map +1 -0
- package/dist/resources/top-memory.js +143 -0
- package/dist/resources/top-memory.js.map +1 -0
- package/dist/scaffold/global-scaffold.d.ts +6 -1
- package/dist/scaffold/global-scaffold.d.ts.map +1 -1
- package/dist/scaffold/global-scaffold.js +11 -2
- package/dist/scaffold/global-scaffold.js.map +1 -1
- package/dist/scaffold/scaffold-global.d.ts +3 -2
- package/dist/scaffold/scaffold-global.d.ts.map +1 -1
- package/dist/scaffold/scaffold-global.js +3 -2
- package/dist/scaffold/scaffold-global.js.map +1 -1
- package/dist/sentient/ingesters/brain-ingester.d.ts.map +1 -1
- package/dist/sentient/ingesters/brain-ingester.js +2 -1
- package/dist/sentient/ingesters/brain-ingester.js.map +1 -1
- package/dist/session/engine-ops.js +1 -1
- package/dist/session/engine-ops.js.map +1 -1
- package/dist/sessions/briefing.d.ts +26 -0
- package/dist/sessions/briefing.d.ts.map +1 -1
- package/dist/sessions/briefing.js +46 -0
- package/dist/sessions/briefing.js.map +1 -1
- package/dist/sessions/session-end-snapshot.d.ts +1 -1
- package/dist/sessions/session-end-snapshot.js +1 -1
- package/dist/sessions/session-id.d.ts +2 -1
- package/dist/sessions/session-id.d.ts.map +1 -1
- package/dist/sessions/session-id.js +3 -2
- package/dist/sessions/session-id.js.map +1 -1
- package/dist/store/agent-resolver.d.ts +0 -6
- package/dist/store/agent-resolver.d.ts.map +1 -1
- package/dist/store/agent-resolver.js +0 -31
- package/dist/store/agent-resolver.js.map +1 -1
- package/dist/store/memory-accessor.d.ts +45 -2
- package/dist/store/memory-accessor.d.ts.map +1 -1
- package/dist/store/memory-accessor.js +81 -7
- package/dist/store/memory-accessor.js.map +1 -1
- package/dist/store/schema/cleo-shared/brain.d.ts +2 -2
- package/dist/store/schema/memory-schema.d.ts +3 -3
- package/dist/store/schema/memory-schema.d.ts.map +1 -1
- package/dist/store/schema/memory-schema.js +2 -0
- package/dist/store/schema/memory-schema.js.map +1 -1
- package/dist/store/session-store.d.ts +5 -2
- package/dist/store/session-store.d.ts.map +1 -1
- package/dist/store/session-store.js +10 -5
- package/dist/store/session-store.js.map +1 -1
- package/dist/store/sqlite-native.d.ts +5 -4
- package/dist/store/sqlite-native.d.ts.map +1 -1
- package/dist/store/sqlite-native.js +5 -4
- package/dist/store/sqlite-native.js.map +1 -1
- package/dist/store/sync/merge/rules.d.ts.map +1 -1
- package/dist/store/sync/merge/rules.js +4 -3
- package/dist/store/sync/merge/rules.js.map +1 -1
- package/dist/store/validation-schemas.d.ts +1 -0
- package/dist/store/validation-schemas.d.ts.map +1 -1
- package/dist/store/vault-manifest.js +1 -1
- package/dist/store/vault-manifest.js.map +1 -1
- package/dist/system/project-health.d.ts +7 -0
- package/dist/system/project-health.d.ts.map +1 -1
- package/dist/system/project-health.js +13 -0
- package/dist/system/project-health.js.map +1 -1
- package/dist/tasks/add.d.ts.map +1 -1
- package/dist/tasks/add.js +0 -15
- package/dist/tasks/add.js.map +1 -1
- package/dist/tasks/affected-packages.d.ts +26 -11
- package/dist/tasks/affected-packages.d.ts.map +1 -1
- package/dist/tasks/affected-packages.js +54 -17
- package/dist/tasks/affected-packages.js.map +1 -1
- package/dist/tasks/affected-scope.d.ts +24 -0
- package/dist/tasks/affected-scope.d.ts.map +1 -1
- package/dist/tasks/affected-scope.js +57 -0
- package/dist/tasks/affected-scope.js.map +1 -1
- package/dist/tasks/change-set.d.ts +72 -9
- package/dist/tasks/change-set.d.ts.map +1 -1
- package/dist/tasks/change-set.js +227 -20
- package/dist/tasks/change-set.js.map +1 -1
- package/dist/tasks/complete-ci.d.ts.map +1 -1
- package/dist/tasks/complete-ci.js +2 -0
- package/dist/tasks/complete-ci.js.map +1 -1
- package/dist/tasks/complete.d.ts +2 -2
- package/dist/tasks/complete.d.ts.map +1 -1
- package/dist/tasks/complete.js +38 -17
- package/dist/tasks/complete.js.map +1 -1
- package/dist/tasks/done-plan.d.ts.map +1 -1
- package/dist/tasks/done-plan.js +66 -18
- package/dist/tasks/done-plan.js.map +1 -1
- package/dist/tasks/epic-enforcement.d.ts +39 -1
- package/dist/tasks/epic-enforcement.d.ts.map +1 -1
- package/dist/tasks/epic-enforcement.js +46 -2
- package/dist/tasks/epic-enforcement.js.map +1 -1
- package/dist/tasks/evidence.d.ts +74 -22
- package/dist/tasks/evidence.d.ts.map +1 -1
- package/dist/tasks/evidence.js +221 -35
- package/dist/tasks/evidence.js.map +1 -1
- package/dist/tasks/gate-runner.d.ts.map +1 -1
- package/dist/tasks/gate-runner.js +2 -12
- package/dist/tasks/gate-runner.js.map +1 -1
- package/dist/tasks/qa-run-binding.d.ts +2 -0
- package/dist/tasks/qa-run-binding.d.ts.map +1 -1
- package/dist/tasks/qa-run-binding.js +6 -2
- package/dist/tasks/qa-run-binding.js.map +1 -1
- package/dist/tasks/test-run-binding.d.ts +2 -0
- package/dist/tasks/test-run-binding.d.ts.map +1 -1
- package/dist/tasks/test-run-binding.js +8 -3
- package/dist/tasks/test-run-binding.js.map +1 -1
- package/dist/tasks/verification-policy.d.ts +57 -1
- package/dist/tasks/verification-policy.d.ts.map +1 -1
- package/dist/tasks/verification-policy.js +94 -1
- package/dist/tasks/verification-policy.js.map +1 -1
- package/dist/upgrade.d.ts.map +1 -1
- package/dist/upgrade.js +2 -15
- package/dist/upgrade.js.map +1 -1
- package/dist/validation/engine-ops.d.ts.map +1 -1
- package/dist/validation/engine-ops.js +39 -19
- package/dist/validation/engine-ops.js.map +1 -1
- package/package.json +13 -13
- package/schemas/config.schema.json +69 -0
- package/templates/CLEO-INJECTION.md +4 -5
- package/templates/CLEO-REFERENCE.md +2 -4
- package/templates/git-hooks/post-merge +25 -0
- package/dist/memory/dispatch-trace.d.ts +0 -44
- package/dist/memory/dispatch-trace.d.ts.map +0 -1
- package/dist/memory/dispatch-trace.js +0 -65
- package/dist/memory/dispatch-trace.js.map +0 -1
- package/dist/memory/retrieval/increment-citation-counts.d.ts +0 -11
- package/dist/memory/retrieval/increment-citation-counts.d.ts.map +0 -1
- package/dist/memory/retrieval/increment-citation-counts.js +0 -43
- package/dist/memory/retrieval/increment-citation-counts.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-row-quarantine.d.ts","sourceRoot":"","sources":["../../src/memory/auto-row-quarantine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reversible quarantine of auto-generated BRAIN rows (T13951, owner decision
|
|
3
|
+
* D11179).
|
|
4
|
+
*
|
|
5
|
+
* Three kinds of rows were written by machinery, not by anyone recording
|
|
6
|
+
* knowledge: dispatch traces (`brain_patterns`, one per agent resolution until
|
|
7
|
+
* T13946), "Doc attached" records (`brain_observations`, until T13985) and the
|
|
8
|
+
* content-free task-start/complete stubs. Recall already ignores them
|
|
9
|
+
* (`eligibility.ts#autoRowExclusionClause`); this module retires them from the
|
|
10
|
+
* active store by setting `invalid_at` only. Nothing is deleted.
|
|
11
|
+
*
|
|
12
|
+
* Safety contract (lead conditions on D11179):
|
|
13
|
+
* - Dry run by default: per-store, per-table counts and the exact predicates.
|
|
14
|
+
* - Apply refuses unless the caller passes the counts of a dry run taken in the
|
|
15
|
+
* same state, so it never touches more rows than were approved.
|
|
16
|
+
* - The receipt (ids per store and table, timestamp, predicates, counts) is
|
|
17
|
+
* written durably BEFORE the first write, so a crash mid-apply leaves a
|
|
18
|
+
* receipt restore can use.
|
|
19
|
+
* - Restore clears `invalid_at` only where it still equals the receipt's
|
|
20
|
+
* timestamp, so it is idempotent and never undoes a later invalidation.
|
|
21
|
+
* - Writes go through the canonical accessors, in batches, and sync.
|
|
22
|
+
*
|
|
23
|
+
* Code placed in `packages/core/` per Package-Boundary Check — verified against AGENTS.md.
|
|
24
|
+
*
|
|
25
|
+
* @module memory/auto-row-quarantine
|
|
26
|
+
* @task T13951
|
|
27
|
+
*/
|
|
28
|
+
import { createHash } from 'node:crypto';
|
|
29
|
+
import { closeSync, fsyncSync, mkdirSync, openSync, readFileSync, renameSync, writeSync, } from 'node:fs';
|
|
30
|
+
import { dirname, join } from 'node:path';
|
|
31
|
+
import { z } from 'zod';
|
|
32
|
+
import { AUTO_ROW_RULES, CURRENT_UNVERIFIED, } from './auto-row-rules.js';
|
|
33
|
+
/** Brain stores the quarantine covers, reported separately. */
|
|
34
|
+
export const QUARANTINE_SCOPES = ['project', 'global'];
|
|
35
|
+
/** Memory tables holding auto rows. */
|
|
36
|
+
export const QUARANTINE_TABLES = ['patterns', 'observations'];
|
|
37
|
+
/** Build one value per store. */
|
|
38
|
+
function perScope(make) {
|
|
39
|
+
return { project: make('project'), global: make('global') };
|
|
40
|
+
}
|
|
41
|
+
/** An all-zero tally. */
|
|
42
|
+
function zeroTally() {
|
|
43
|
+
return perScope(() => ({ patterns: 0, observations: 0 }));
|
|
44
|
+
}
|
|
45
|
+
/** Default rows per write transaction. */
|
|
46
|
+
export const QUARANTINE_BATCH_SIZE = 500;
|
|
47
|
+
/** Error with a stable code for the CLI envelope. */
|
|
48
|
+
export class AutoRowQuarantineError extends Error {
|
|
49
|
+
code;
|
|
50
|
+
/**
|
|
51
|
+
* @param code - Stable error code.
|
|
52
|
+
* @param message - Human-readable explanation.
|
|
53
|
+
*/
|
|
54
|
+
constructor(code, message) {
|
|
55
|
+
super(message);
|
|
56
|
+
this.code = code;
|
|
57
|
+
this.name = 'AutoRowQuarantineError';
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Open the project and global brain stores with accessor-backed writers.
|
|
62
|
+
*
|
|
63
|
+
* @param projectRoot - Project whose brain is the `project` store.
|
|
64
|
+
* @returns Read handles and writers for both stores.
|
|
65
|
+
* @example
|
|
66
|
+
* ```ts
|
|
67
|
+
* const stores = await openQuarantineStores(projectRoot);
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
export async function openQuarantineStores(projectRoot) {
|
|
71
|
+
const { getBrainDb, getBrainNativeDb } = await import('../store/memory-sqlite.js');
|
|
72
|
+
const { getBrainAccessor, setGlobalInvalidAtWhere } = await import('../store/memory-accessor.js');
|
|
73
|
+
const { getDualScopeNativeDb, openDualScopeDb } = await import('../store/dual-scope-db.js');
|
|
74
|
+
await getBrainDb(projectRoot);
|
|
75
|
+
const projectDb = getBrainNativeDb(projectRoot);
|
|
76
|
+
// @sync-invariant none:local-only no store handle, so nothing is read or written
|
|
77
|
+
if (!projectDb)
|
|
78
|
+
throw new Error('BRAIN database unavailable for the auto-row quarantine');
|
|
79
|
+
const accessor = await getBrainAccessor(projectRoot);
|
|
80
|
+
return {
|
|
81
|
+
project: { db: projectDb, write: (...args) => accessor.setInvalidAtWhere(...args) },
|
|
82
|
+
global: {
|
|
83
|
+
db: getDualScopeNativeDb(await openDualScopeDb('global')),
|
|
84
|
+
write: setGlobalInvalidAtWhere,
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Dry run: what an apply would quarantine in each store, with the predicates.
|
|
90
|
+
*
|
|
91
|
+
* @param stores - Project and global stores.
|
|
92
|
+
* @returns Counts, predicates and ids. Nothing is written.
|
|
93
|
+
* @example
|
|
94
|
+
* ```ts
|
|
95
|
+
* const plan = planAutoRowQuarantine(await openQuarantineStores(root));
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
export function planAutoRowQuarantine(stores) {
|
|
99
|
+
const ids = perScope((scope) => idsFor(stores[scope].db));
|
|
100
|
+
return {
|
|
101
|
+
counts: perScope((scope) => countsFor(stores[scope].db, ids[scope])),
|
|
102
|
+
predicates: Object.fromEntries(AUTO_ROW_RULES.map((rule) => [rule.id, `${rule.predicate} AND ${CURRENT_UNVERIFIED}`])),
|
|
103
|
+
ids,
|
|
104
|
+
digest: digestIds(ids),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Short, stable digest of an id set (sha256 of the sorted ids per store and
|
|
109
|
+
* table, first 16 hex characters). Approval binds to it, so an apply cannot
|
|
110
|
+
* quarantine a different set of rows with the same counts.
|
|
111
|
+
*
|
|
112
|
+
* @param ids - Ids per store and table.
|
|
113
|
+
* @returns 16 hex characters.
|
|
114
|
+
* @example
|
|
115
|
+
* ```ts
|
|
116
|
+
* digestIds(plan.ids); // '3f2a9c0d1b7e4a55'
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
export function digestIds(ids) {
|
|
120
|
+
const canonical = QUARANTINE_SCOPES.flatMap((scope) => QUARANTINE_TABLES.map((table) => [scope, table, [...ids[scope][table]].sort()]));
|
|
121
|
+
return createHash('sha256').update(JSON.stringify(canonical)).digest('hex').slice(0, 16);
|
|
122
|
+
}
|
|
123
|
+
/** The rules a table's rows must still match when a batch writes them. */
|
|
124
|
+
function tableRules(table) {
|
|
125
|
+
return AUTO_ROW_RULES.filter((rule) => rule.table === table).map((rule) => rule.id);
|
|
126
|
+
}
|
|
127
|
+
/** Ids one rule matches in one store. */
|
|
128
|
+
function ruleIds(db, rule) {
|
|
129
|
+
return db
|
|
130
|
+
.prepare(`SELECT id FROM main.brain_${rule.table}
|
|
131
|
+
WHERE (${rule.predicate}) AND ${CURRENT_UNVERIFIED} ORDER BY id`)
|
|
132
|
+
.all()
|
|
133
|
+
.map((row) => String(row.id));
|
|
134
|
+
}
|
|
135
|
+
/** Distinct matching ids per table for one store. */
|
|
136
|
+
function idsFor(db) {
|
|
137
|
+
const ids = (table) => [
|
|
138
|
+
...new Set(AUTO_ROW_RULES.filter((rule) => rule.table === table).flatMap((rule) => ruleIds(db, rule))),
|
|
139
|
+
].sort();
|
|
140
|
+
return { patterns: ids('patterns'), observations: ids('observations') };
|
|
141
|
+
}
|
|
142
|
+
/** Per-table and per-rule counts for one store. */
|
|
143
|
+
function countsFor(db, ids) {
|
|
144
|
+
const byRule = (table) => Object.fromEntries(AUTO_ROW_RULES.filter((rule) => rule.table === table).map((rule) => [
|
|
145
|
+
rule.id,
|
|
146
|
+
ruleIds(db, rule).length,
|
|
147
|
+
]));
|
|
148
|
+
return {
|
|
149
|
+
patterns: { count: ids.patterns.length, byRule: byRule('patterns') },
|
|
150
|
+
observations: { count: ids.observations.length, byRule: byRule('observations') },
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Parse `--expect` counts: `project:patterns=N,project:observations=N,global:...`.
|
|
155
|
+
* Every store/table pair must be given, once.
|
|
156
|
+
*
|
|
157
|
+
* @param text - The flag value.
|
|
158
|
+
* @returns Expected counts per store and table.
|
|
159
|
+
* @throws AutoRowQuarantineError when a pair is missing, repeated or malformed.
|
|
160
|
+
* @example
|
|
161
|
+
* ```ts
|
|
162
|
+
* parseQuarantineExpect('project:patterns=3,project:observations=1,global:patterns=0,global:observations=0');
|
|
163
|
+
* ```
|
|
164
|
+
*/
|
|
165
|
+
export function parseQuarantineExpect(text) {
|
|
166
|
+
const given = new Map();
|
|
167
|
+
for (const part of text.split(',')) {
|
|
168
|
+
const match = /^\s*(project|global):(patterns|observations)=(\d+)\s*$/.exec(part);
|
|
169
|
+
if (!match) {
|
|
170
|
+
throw new AutoRowQuarantineError('E_QUARANTINE_EXPECT_MISMATCH', `Malformed --expect entry '${part}'; use <project|global>:<patterns|observations>=<count>`);
|
|
171
|
+
}
|
|
172
|
+
const pair = `${match[1]}:${match[2]}`;
|
|
173
|
+
if (given.has(pair)) {
|
|
174
|
+
// @sync-invariant none:input-shape a doubled --expect pair is refused before any write
|
|
175
|
+
throw new AutoRowQuarantineError('E_QUARANTINE_EXPECT_MISMATCH', `--expect gives ${pair} more than once; pass each count once`);
|
|
176
|
+
}
|
|
177
|
+
given.set(pair, Number(match[3]));
|
|
178
|
+
}
|
|
179
|
+
const count = (scope, table) => {
|
|
180
|
+
const value = given.get(`${scope}:${table}`);
|
|
181
|
+
if (value === undefined) {
|
|
182
|
+
throw new AutoRowQuarantineError('E_QUARANTINE_EXPECT_MISMATCH', `--expect must give ${scope}:${table}; pass every count from the dry run`);
|
|
183
|
+
}
|
|
184
|
+
return value;
|
|
185
|
+
};
|
|
186
|
+
return perScope((scope) => ({
|
|
187
|
+
patterns: count(scope, 'patterns'),
|
|
188
|
+
observations: count(scope, 'observations'),
|
|
189
|
+
}));
|
|
190
|
+
}
|
|
191
|
+
/** Write JSON durably: temp file, fsync, rename. */
|
|
192
|
+
function writeDurably(path, value) {
|
|
193
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
194
|
+
const temp = `${path}.tmp`;
|
|
195
|
+
const fd = openSync(temp, 'w');
|
|
196
|
+
try {
|
|
197
|
+
writeSync(fd, `${JSON.stringify(value, null, 2)}\n`);
|
|
198
|
+
fsyncSync(fd);
|
|
199
|
+
}
|
|
200
|
+
finally {
|
|
201
|
+
closeSync(fd);
|
|
202
|
+
}
|
|
203
|
+
renameSync(temp, path);
|
|
204
|
+
// Best effort: make the rename itself durable (not supported on every platform).
|
|
205
|
+
try {
|
|
206
|
+
const dirFd = openSync(dirname(path), 'r');
|
|
207
|
+
try {
|
|
208
|
+
fsyncSync(dirFd);
|
|
209
|
+
}
|
|
210
|
+
finally {
|
|
211
|
+
closeSync(dirFd);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
// A directory fsync is unavailable here; the receipt file itself is synced.
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Default receipt path for an apply at `quarantinedAt` (gitignored backups).
|
|
220
|
+
*
|
|
221
|
+
* @param projectRoot - Project root.
|
|
222
|
+
* @param quarantinedAt - ISO timestamp of the apply.
|
|
223
|
+
* @returns Absolute receipt path.
|
|
224
|
+
* @example
|
|
225
|
+
* ```ts
|
|
226
|
+
* defaultQuarantineReceiptPath(root, '2026-10-24T00:00:00.000Z');
|
|
227
|
+
* ```
|
|
228
|
+
*/
|
|
229
|
+
export function defaultQuarantineReceiptPath(projectRoot, quarantinedAt) {
|
|
230
|
+
return join(projectRoot, '.cleo', 'backups', 'quarantine', `auto-rows-${quarantinedAt.replace(/[:.]/g, '-')}.json`);
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Apply the quarantine after checking the approved counts still hold.
|
|
234
|
+
*
|
|
235
|
+
* @param stores - Project and global stores.
|
|
236
|
+
* @param expect - Counts from the approved dry run; any difference refuses.
|
|
237
|
+
* @param expectDigest - Id-set digest from the approved dry run; any difference refuses.
|
|
238
|
+
* @param receiptPath - Where the receipt is written (before the first write).
|
|
239
|
+
* @param options - `batchSize` per write transaction; `now` for tests.
|
|
240
|
+
* @returns The completed receipt.
|
|
241
|
+
* @throws AutoRowQuarantineError when the current counts differ from `expect`.
|
|
242
|
+
* @example
|
|
243
|
+
* ```ts
|
|
244
|
+
* const receipt = await applyAutoRowQuarantine(stores, expect, path);
|
|
245
|
+
* ```
|
|
246
|
+
*/
|
|
247
|
+
export async function applyAutoRowQuarantine(stores, expect, expectDigest, receiptPath, options = {}) {
|
|
248
|
+
const plan = planAutoRowQuarantine(stores);
|
|
249
|
+
if (plan.digest !== expectDigest) {
|
|
250
|
+
// @sync-invariant none:input-shape the approved row set no longer holds; nothing is written
|
|
251
|
+
throw new AutoRowQuarantineError('E_QUARANTINE_EXPECT_MISMATCH', `The matched rows now digest to ${plan.digest}, not the approved ${expectDigest}; run the dry run again`);
|
|
252
|
+
}
|
|
253
|
+
for (const scope of QUARANTINE_SCOPES) {
|
|
254
|
+
for (const table of QUARANTINE_TABLES) {
|
|
255
|
+
if (plan.counts[scope][table].count !== expect[scope][table]) {
|
|
256
|
+
// @sync-invariant none:input-shape the approved counts no longer hold; nothing is written
|
|
257
|
+
throw new AutoRowQuarantineError('E_QUARANTINE_EXPECT_MISMATCH', `${scope}:${table} now matches ${plan.counts[scope][table].count} rows, not the approved ${expect[scope][table]}; run the dry run again`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
const receipt = {
|
|
262
|
+
version: 1,
|
|
263
|
+
quarantinedAt: (options.now ?? new Date()).toISOString(),
|
|
264
|
+
status: 'started',
|
|
265
|
+
predicates: plan.predicates,
|
|
266
|
+
counts: expect,
|
|
267
|
+
ids: plan.ids,
|
|
268
|
+
digest: plan.digest,
|
|
269
|
+
};
|
|
270
|
+
writeDurably(receiptPath, receipt);
|
|
271
|
+
const batchSize = options.batchSize ?? QUARANTINE_BATCH_SIZE;
|
|
272
|
+
const quarantined = zeroTally();
|
|
273
|
+
const skipped = perScope(() => ({ patterns: [], observations: [] }));
|
|
274
|
+
for (const scope of QUARANTINE_SCOPES) {
|
|
275
|
+
for (const table of QUARANTINE_TABLES) {
|
|
276
|
+
const ids = plan.ids[scope][table];
|
|
277
|
+
for (let start = 0; start < ids.length; start += batchSize) {
|
|
278
|
+
const batch = ids.slice(start, start + batchSize);
|
|
279
|
+
// Re-check the full predicate: a row verified or edited mid-apply is skipped.
|
|
280
|
+
const changed = new Set(await stores[scope].write(table, batch, receipt.quarantinedAt, null, tableRules(table)));
|
|
281
|
+
quarantined[scope][table] += changed.size;
|
|
282
|
+
skipped[scope][table].push(...batch.filter((id) => !changed.has(id)));
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
const complete = {
|
|
287
|
+
...receipt,
|
|
288
|
+
status: 'complete',
|
|
289
|
+
quarantined,
|
|
290
|
+
skipped,
|
|
291
|
+
};
|
|
292
|
+
writeDurably(receiptPath, complete);
|
|
293
|
+
return complete;
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Restore a quarantine from its receipt: clear `invalid_at` on the listed rows
|
|
297
|
+
* that still carry the receipt's timestamp. Idempotent; works on a receipt left
|
|
298
|
+
* `started` by an interrupted apply.
|
|
299
|
+
*
|
|
300
|
+
* @param stores - Project and global stores.
|
|
301
|
+
* @param receiptPath - The receipt an apply wrote.
|
|
302
|
+
* @param options - `batchSize` per write transaction.
|
|
303
|
+
* @returns Rows restored per store and table.
|
|
304
|
+
* @throws AutoRowQuarantineError when the receipt is unreadable or malformed.
|
|
305
|
+
* @example
|
|
306
|
+
* ```ts
|
|
307
|
+
* const restored = await restoreAutoRowQuarantine(stores, path);
|
|
308
|
+
* ```
|
|
309
|
+
*/
|
|
310
|
+
export async function restoreAutoRowQuarantine(stores, receiptPath, options = {}) {
|
|
311
|
+
const receipt = readReceipt(receiptPath);
|
|
312
|
+
const batchSize = options.batchSize ?? QUARANTINE_BATCH_SIZE;
|
|
313
|
+
const restored = zeroTally();
|
|
314
|
+
for (const scope of QUARANTINE_SCOPES) {
|
|
315
|
+
for (const table of QUARANTINE_TABLES) {
|
|
316
|
+
const ids = receipt.ids[scope][table];
|
|
317
|
+
for (let start = 0; start < ids.length; start += batchSize) {
|
|
318
|
+
const changed = await stores[scope].write(table, ids.slice(start, start + batchSize), null, receipt.quarantinedAt);
|
|
319
|
+
restored[scope][table] += changed.length;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
return restored;
|
|
324
|
+
}
|
|
325
|
+
const tallySchema = z.object({ patterns: z.number(), observations: z.number() });
|
|
326
|
+
const idsSchema = z.object({ patterns: z.array(z.string()), observations: z.array(z.string()) });
|
|
327
|
+
const receiptSchema = z.object({
|
|
328
|
+
version: z.literal(1),
|
|
329
|
+
quarantinedAt: z.string().min(1),
|
|
330
|
+
status: z.enum(['started', 'complete']),
|
|
331
|
+
predicates: z.record(z.string(), z.string()),
|
|
332
|
+
counts: z.object({ project: tallySchema, global: tallySchema }),
|
|
333
|
+
ids: z.object({ project: idsSchema, global: idsSchema }),
|
|
334
|
+
digest: z.string(),
|
|
335
|
+
quarantined: z.object({ project: tallySchema, global: tallySchema }).optional(),
|
|
336
|
+
skipped: z.object({ project: idsSchema, global: idsSchema }).optional(),
|
|
337
|
+
});
|
|
338
|
+
/** Read and validate a receipt. */
|
|
339
|
+
function readReceipt(path) {
|
|
340
|
+
let text;
|
|
341
|
+
try {
|
|
342
|
+
text = readFileSync(path, 'utf8');
|
|
343
|
+
}
|
|
344
|
+
catch (err) {
|
|
345
|
+
// @sync-invariant none:input-shape an unreadable receipt is refused before any write
|
|
346
|
+
throw new AutoRowQuarantineError('E_QUARANTINE_RECEIPT', `Cannot read quarantine receipt ${path}: ${err instanceof Error ? err.message : String(err)}`);
|
|
347
|
+
}
|
|
348
|
+
let json;
|
|
349
|
+
try {
|
|
350
|
+
json = JSON.parse(text);
|
|
351
|
+
}
|
|
352
|
+
catch {
|
|
353
|
+
// @sync-invariant none:input-shape an unparseable receipt is refused before any write
|
|
354
|
+
throw new AutoRowQuarantineError('E_QUARANTINE_RECEIPT', `Receipt ${path} is not valid JSON`);
|
|
355
|
+
}
|
|
356
|
+
const parsed = receiptSchema.safeParse(json);
|
|
357
|
+
if (!parsed.success) {
|
|
358
|
+
// @sync-invariant none:input-shape a malformed receipt is refused before any write
|
|
359
|
+
throw new AutoRowQuarantineError('E_QUARANTINE_RECEIPT', `Not a quarantine receipt: ${path}`);
|
|
360
|
+
}
|
|
361
|
+
return parsed.data;
|
|
362
|
+
}
|
|
363
|
+
//# sourceMappingURL=auto-row-quarantine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-row-quarantine.js","sourceRoot":"","sources":["../../src/memory/auto-row-quarantine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Stable id of an auto-row rule. */
|
|
2
|
+
export type AutoRowRuleId = 'dispatch-trace' | 'doc-attachment' | 'task-stub';
|
|
3
|
+
/** One named auto-row rule with its exact SQL predicate. */
|
|
4
|
+
export interface AutoRowRule {
|
|
5
|
+
/** Stable id, reported in counts. */
|
|
6
|
+
readonly id: AutoRowRuleId;
|
|
7
|
+
/** Table the rule reads. */
|
|
8
|
+
readonly table: 'patterns' | 'observations';
|
|
9
|
+
/** SQL predicate over unaliased columns, ANDed with the current/unverified guard. */
|
|
10
|
+
readonly predicate: string;
|
|
11
|
+
}
|
|
12
|
+
/** Guard every rule shares: only current, unverified rows. */
|
|
13
|
+
export declare const CURRENT_UNVERIFIED = "invalid_at IS NULL AND COALESCE(verified, 0) != 1";
|
|
14
|
+
/** The rules, each matching rows only machinery writes. */
|
|
15
|
+
export declare const AUTO_ROW_RULES: readonly AutoRowRule[];
|
|
16
|
+
/**
|
|
17
|
+
* The SQL guard for a write: any of the named rules, on current unverified rows.
|
|
18
|
+
*
|
|
19
|
+
* @param table - Table being written.
|
|
20
|
+
* @param ruleIds - Rules the row must still match.
|
|
21
|
+
* @returns A predicate over unaliased columns.
|
|
22
|
+
* @throws Error when no rule is named, or a rule is unknown or reads another table.
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* const guard = autoRowGuard('patterns', ['dispatch-trace']);
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function autoRowGuard(table: 'patterns' | 'observations', ruleIds: readonly AutoRowRuleId[]): string;
|
|
29
|
+
//# sourceMappingURL=auto-row-rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-row-rules.d.ts","sourceRoot":"","sources":["../../src/memory/auto-row-rules.ts"],"names":[],"mappings":"AAQA,qCAAqC;AACrC,MAAM,MAAM,aAAa,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,WAAW,CAAC;AAE9E,4DAA4D;AAC5D,MAAM,WAAW,WAAW;IAC1B,qCAAqC;IACrC,QAAQ,CAAC,EAAE,EAAE,aAAa,CAAC;IAC3B,4BAA4B;IAC5B,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,cAAc,CAAC;IAC5C,qFAAqF;IACrF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,8DAA8D;AAC9D,eAAO,MAAM,kBAAkB,sDAAsD,CAAC;AAEtF,2DAA2D;AAC3D,eAAO,MAAM,cAAc,EAAE,SAAS,WAAW,EAkBhD,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,UAAU,GAAG,cAAc,EAClC,OAAO,EAAE,SAAS,aAAa,EAAE,GAChC,MAAM,CAUR"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The named auto-row rules (T13951) and the guard the memory accessors resolve
|
|
3
|
+
* from rule ids, so no caller hands the store raw SQL (T14003).
|
|
4
|
+
* Code placed in `packages/core/` per Package-Boundary Check — verified against AGENTS.md.
|
|
5
|
+
*/
|
|
6
|
+
import { stubObservationClause } from './brain-stub-prune.js';
|
|
7
|
+
import { DISPATCH_TRACE_TEXT_PREFIX } from './dispatch-trace-format.js';
|
|
8
|
+
/** Guard every rule shares: only current, unverified rows. */
|
|
9
|
+
export const CURRENT_UNVERIFIED = 'invalid_at IS NULL AND COALESCE(verified, 0) != 1';
|
|
10
|
+
/** The rules, each matching rows only machinery writes. */
|
|
11
|
+
export const AUTO_ROW_RULES = [
|
|
12
|
+
{
|
|
13
|
+
id: 'dispatch-trace',
|
|
14
|
+
table: 'patterns',
|
|
15
|
+
predicate: `pattern LIKE '${DISPATCH_TRACE_TEXT_PREFIX}%'`,
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
// Both the title and the writer's JSON payload: a human note titled
|
|
19
|
+
// "Doc attached: ..." without the payload is never matched.
|
|
20
|
+
id: 'doc-attachment',
|
|
21
|
+
table: 'observations',
|
|
22
|
+
predicate: `title GLOB 'Doc attached:*' AND COALESCE(narrative, '') LIKE '%"kind":"doc-attachment"%'`,
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
id: 'task-stub',
|
|
26
|
+
table: 'observations',
|
|
27
|
+
predicate: `(${stubObservationClause()})`,
|
|
28
|
+
},
|
|
29
|
+
];
|
|
30
|
+
/**
|
|
31
|
+
* The SQL guard for a write: any of the named rules, on current unverified rows.
|
|
32
|
+
*
|
|
33
|
+
* @param table - Table being written.
|
|
34
|
+
* @param ruleIds - Rules the row must still match.
|
|
35
|
+
* @returns A predicate over unaliased columns.
|
|
36
|
+
* @throws Error when no rule is named, or a rule is unknown or reads another table.
|
|
37
|
+
* @example
|
|
38
|
+
* ```ts
|
|
39
|
+
* const guard = autoRowGuard('patterns', ['dispatch-trace']);
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export function autoRowGuard(table, ruleIds) {
|
|
43
|
+
const predicates = ruleIds.map((id) => {
|
|
44
|
+
const rule = AUTO_ROW_RULES.find((candidate) => candidate.id === id);
|
|
45
|
+
// @sync-invariant none:input-shape an unknown or mismatched rule is refused before any write
|
|
46
|
+
if (!rule || rule.table !== table)
|
|
47
|
+
throw new Error(`No auto-row rule '${id}' for ${table}`);
|
|
48
|
+
return `(${rule.predicate})`;
|
|
49
|
+
});
|
|
50
|
+
// @sync-invariant none:input-shape an empty guard is refused before any write
|
|
51
|
+
if (predicates.length === 0)
|
|
52
|
+
throw new Error(`An auto-row guard for ${table} names no rule`);
|
|
53
|
+
return `(${predicates.join(' OR ')}) AND ${CURRENT_UNVERIFIED}`;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=auto-row-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-row-rules.js","sourceRoot":"","sources":["../../src/memory/auto-row-rules.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAexE,8DAA8D;AAC9D,MAAM,CAAC,MAAM,kBAAkB,GAAG,mDAAmD,CAAC;AAEtF,2DAA2D;AAC3D,MAAM,CAAC,MAAM,cAAc,GAA2B;IACpD;QACE,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,UAAU;QACjB,SAAS,EAAE,iBAAiB,0BAA0B,IAAI;KAC3D;IACD;QACE,oEAAoE;QACpE,4DAA4D;QAC5D,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,cAAc;QACrB,SAAS,EAAE,0FAA0F;KACtG;IACD;QACE,EAAE,EAAE,WAAW;QACf,KAAK,EAAE,cAAc;QACrB,SAAS,EAAE,IAAI,qBAAqB,EAAE,GAAG;KAC1C;CACF,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAkC,EAClC,OAAiC;IAEjC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACpC,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACrE,6FAA6F;QAC7F,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,EAAE,SAAS,KAAK,EAAE,CAAC,CAAC;QAC5F,OAAO,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC;IAC/B,CAAC,CAAC,CAAC;IACH,8EAA8E;IAC9E,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,gBAAgB,CAAC,CAAC;IAC7F,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,kBAAkB,EAAE,CAAC;AAClE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brain-lifecycle.d.ts","sourceRoot":"","sources":["../../src/memory/brain-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;
|
|
1
|
+
{"version":3,"file":"brain-lifecycle.d.ts","sourceRoot":"","sources":["../../src/memory/brain-lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,7 @@ import { getLogger } from '../logger.js';
|
|
|
21
21
|
import { getBrainAccessor } from '../store/memory-accessor.js';
|
|
22
22
|
import { typedAll } from '../store/typed-query.js';
|
|
23
23
|
import { EDGE_TYPES } from './edge-types.js';
|
|
24
|
+
import { autoRowExclusionClause } from './eligibility.js';
|
|
24
25
|
/**
|
|
25
26
|
* Apply temporal decay to brain_learnings confidence values.
|
|
26
27
|
*
|
|
@@ -351,12 +352,16 @@ export async function runTierPromotion(projectRoot) {
|
|
|
351
352
|
.slice(0, 19);
|
|
352
353
|
// Tables + their date column name (mixed conventions in schema)
|
|
353
354
|
const tables = [
|
|
354
|
-
{ table: 'brain_observations', dateCol: 'created_at' },
|
|
355
|
-
{ table: 'brain_learnings', dateCol: 'created_at' },
|
|
356
|
-
{ table: 'brain_patterns', dateCol: 'extracted_at' },
|
|
357
|
-
{ table: 'brain_decisions', dateCol: 'created_at' },
|
|
355
|
+
{ table: 'brain_observations', kind: 'observations', dateCol: 'created_at' },
|
|
356
|
+
{ table: 'brain_learnings', kind: 'learnings', dateCol: 'created_at' },
|
|
357
|
+
{ table: 'brain_patterns', kind: 'patterns', dateCol: 'extracted_at' },
|
|
358
|
+
{ table: 'brain_decisions', kind: 'decisions', dateCol: 'created_at' },
|
|
358
359
|
];
|
|
359
|
-
for (const { table, dateCol } of tables) {
|
|
360
|
+
for (const { table, kind, dateCol } of tables) {
|
|
361
|
+
// T13947: auto rows (dispatch traces, doc-attachment records, task stubs)
|
|
362
|
+
// are never promoted, whatever citation count they collected while reads
|
|
363
|
+
// still bumped it.
|
|
364
|
+
const notAuto = autoRowExclusionClause(kind);
|
|
360
365
|
let shortToMedium = [];
|
|
361
366
|
try {
|
|
362
367
|
shortToMedium = typedAll(nativeDb.prepare(`
|
|
@@ -364,7 +369,7 @@ export async function runTierPromotion(projectRoot) {
|
|
|
364
369
|
FROM ${table}
|
|
365
370
|
WHERE memory_tier = 'short'
|
|
366
371
|
AND invalid_at IS NULL
|
|
367
|
-
AND ${dateCol} <
|
|
372
|
+
AND ${dateCol} < ?${notAuto}
|
|
368
373
|
AND (
|
|
369
374
|
citation_count >= 3
|
|
370
375
|
OR quality_score >= 0.7
|
|
@@ -409,7 +414,7 @@ export async function runTierPromotion(projectRoot) {
|
|
|
409
414
|
FROM ${table}
|
|
410
415
|
WHERE memory_tier = 'medium'
|
|
411
416
|
AND invalid_at IS NULL
|
|
412
|
-
AND ${dateCol} <
|
|
417
|
+
AND ${dateCol} < ?${notAuto}
|
|
413
418
|
AND (citation_count >= 5 OR verified = 1)
|
|
414
419
|
`), age7d);
|
|
415
420
|
}
|
|
@@ -525,7 +530,7 @@ export async function promoteObservationsToTyped(projectRoot, limit = 100, thres
|
|
|
525
530
|
AND NOT EXISTS (
|
|
526
531
|
SELECT 1 FROM brain_promotion_log p
|
|
527
532
|
WHERE p.observation_id = o.id
|
|
528
|
-
)
|
|
533
|
+
)${autoRowExclusionClause('observations', 'o')}
|
|
529
534
|
ORDER BY o.created_at DESC
|
|
530
535
|
LIMIT ?
|
|
531
536
|
`), limit);
|