nlm-memory 0.21.0 → 0.21.13
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/README.md +67 -12
- package/assets/replay-eval-dark.svg +26 -0
- package/assets/replay-eval-light.svg +26 -0
- package/dist/cli/digest.js +34 -7
- package/dist/cli/digest.js.map +1 -1
- package/dist/cli/nlm.d.ts +14 -0
- package/dist/cli/nlm.js +450 -65
- package/dist/cli/nlm.js.map +1 -1
- package/dist/cli/reprocess-job-adapters.d.ts +35 -0
- package/dist/cli/reprocess-job-adapters.js +80 -0
- package/dist/cli/reprocess-job-adapters.js.map +1 -0
- package/dist/cli/scope-coverage.js +4 -1
- package/dist/cli/scope-coverage.js.map +1 -1
- package/dist/cli/supersede.js +8 -7
- package/dist/cli/supersede.js.map +1 -1
- package/dist/core/actions/actions-log.d.ts +65 -8
- package/dist/core/actions/actions-log.js +134 -17
- package/dist/core/actions/actions-log.js.map +1 -1
- package/dist/core/actions/overlay.d.ts +11 -2
- package/dist/core/actions/overlay.js +18 -6
- package/dist/core/actions/overlay.js.map +1 -1
- package/dist/core/adapters/from-source.js +11 -3
- package/dist/core/adapters/from-source.js.map +1 -1
- package/dist/core/adapters/fs-wiki-writer.d.ts +44 -0
- package/dist/core/adapters/fs-wiki-writer.js +132 -0
- package/dist/core/adapters/fs-wiki-writer.js.map +1 -0
- package/dist/core/adapters/hermes-agent.d.ts +15 -2
- package/dist/core/adapters/hermes-agent.js +57 -11
- package/dist/core/adapters/hermes-agent.js.map +1 -1
- package/dist/core/adapters/memory-wiki-writer.d.ts +8 -0
- package/dist/core/adapters/memory-wiki-writer.js +16 -0
- package/dist/core/adapters/memory-wiki-writer.js.map +1 -0
- package/dist/core/adapters/muse.d.ts +51 -0
- package/dist/core/adapters/muse.js +271 -0
- package/dist/core/adapters/muse.js.map +1 -0
- package/dist/core/adapters/opencode.d.ts +11 -4
- package/dist/core/adapters/opencode.js +41 -7
- package/dist/core/adapters/opencode.js.map +1 -1
- package/dist/core/alerts/alert-state.d.ts +17 -0
- package/dist/core/alerts/alert-state.js +45 -0
- package/dist/core/alerts/alert-state.js.map +1 -0
- package/dist/core/alerts/check-and-alert.d.ts +28 -0
- package/dist/core/alerts/check-and-alert.js +53 -0
- package/dist/core/alerts/check-and-alert.js.map +1 -0
- package/dist/core/alerts/drift-transition.d.ts +27 -0
- package/dist/core/alerts/drift-transition.js +56 -0
- package/dist/core/alerts/drift-transition.js.map +1 -0
- package/dist/core/alerts/embedder-transition.d.ts +23 -0
- package/dist/core/alerts/embedder-transition.js +40 -0
- package/dist/core/alerts/embedder-transition.js.map +1 -0
- package/dist/core/alerts/fire-alert.d.ts +24 -0
- package/dist/core/alerts/fire-alert.js +72 -0
- package/dist/core/alerts/fire-alert.js.map +1 -0
- package/dist/core/alerts/job-alert.d.ts +12 -0
- package/dist/core/alerts/job-alert.js +37 -0
- package/dist/core/alerts/job-alert.js.map +1 -0
- package/dist/core/alerts/types.d.ts +104 -0
- package/dist/core/alerts/types.js +11 -0
- package/dist/core/alerts/types.js.map +1 -0
- package/dist/core/alerts/wiki-alert.d.ts +15 -0
- package/dist/core/alerts/wiki-alert.js +31 -0
- package/dist/core/alerts/wiki-alert.js.map +1 -0
- package/dist/core/classifier/prompt.d.ts +13 -0
- package/dist/core/classifier/prompt.js +52 -2
- package/dist/core/classifier/prompt.js.map +1 -1
- package/dist/core/dataset/build-dataset.d.ts +16 -1
- package/dist/core/dataset/build-dataset.js +105 -45
- package/dist/core/dataset/build-dataset.js.map +1 -1
- package/dist/core/digest/compose.d.ts +8 -0
- package/dist/core/digest/compose.js +54 -0
- package/dist/core/digest/compose.js.map +1 -1
- package/dist/core/digest/hook-injection.d.ts +1 -1
- package/dist/core/digest/hook-injection.js +9 -1
- package/dist/core/digest/hook-injection.js.map +1 -1
- package/dist/core/digest/hook-version-parity.d.ts +31 -0
- package/dist/core/digest/hook-version-parity.js +56 -0
- package/dist/core/digest/hook-version-parity.js.map +1 -0
- package/dist/core/embedding/pg-embed-backfill.js +1 -1
- package/dist/core/embedding/pg-embed-backfill.js.map +1 -1
- package/dist/core/exemplars/capture-from-session.d.ts +1 -1
- package/dist/core/exemplars/capture-from-session.js +3 -3
- package/dist/core/exemplars/capture-from-session.js.map +1 -1
- package/dist/core/exemplars/embed-backfill.d.ts +9 -0
- package/dist/core/exemplars/embed-backfill.js +9 -1
- package/dist/core/exemplars/embed-backfill.js.map +1 -1
- package/dist/core/exemplars/recall-code.d.ts +1 -1
- package/dist/core/exemplars/recall-code.js +2 -2
- package/dist/core/exemplars/recall-code.js.map +1 -1
- package/dist/core/facts/backfill-facts.d.ts +1 -1
- package/dist/core/facts/backfill-facts.js +4 -4
- package/dist/core/facts/backfill-facts.js.map +1 -1
- package/dist/core/facts/embed-backfill.d.ts +54 -0
- package/dist/core/facts/embed-backfill.js +109 -0
- package/dist/core/facts/embed-backfill.js.map +1 -0
- package/dist/core/facts/reconcile-facts.d.ts +42 -0
- package/dist/core/facts/reconcile-facts.js +133 -0
- package/dist/core/facts/reconcile-facts.js.map +1 -0
- package/dist/core/health/embed-failure-state.d.ts +4 -0
- package/dist/core/health/embed-failure-state.js +12 -0
- package/dist/core/health/embed-failure-state.js.map +1 -0
- package/dist/core/health/warmup-retry.d.ts +27 -0
- package/dist/core/health/warmup-retry.js +53 -0
- package/dist/core/health/warmup-retry.js.map +1 -0
- package/dist/core/health/warmup-state.d.ts +15 -0
- package/dist/core/health/warmup-state.js +15 -1
- package/dist/core/health/warmup-state.js.map +1 -1
- package/dist/core/hook/cite-memo.d.ts +11 -7
- package/dist/core/hook/cite-memo.js +25 -17
- package/dist/core/hook/cite-memo.js.map +1 -1
- package/dist/core/hook/hook-log.d.ts +13 -2
- package/dist/core/hook/hook-log.js +16 -8
- package/dist/core/hook/hook-log.js.map +1 -1
- package/dist/core/hook/memo.d.ts +10 -6
- package/dist/core/hook/memo.js +25 -17
- package/dist/core/hook/memo.js.map +1 -1
- package/dist/core/hook/pointer-block.d.ts +8 -1
- package/dist/core/hook/pointer-block.js +17 -4
- package/dist/core/hook/pointer-block.js.map +1 -1
- package/dist/core/hook/resolve-conversation-by-query.d.ts +6 -5
- package/dist/core/hook/resolve-conversation-by-query.js +24 -12
- package/dist/core/hook/resolve-conversation-by-query.js.map +1 -1
- package/dist/core/ingest/ingest-session.d.ts +1 -1
- package/dist/core/ingest/ingest-session.js +3 -3
- package/dist/core/ingest/ingest-session.js.map +1 -1
- package/dist/core/ingest/reclassify-oversized.d.ts +1 -1
- package/dist/core/ingest/reclassify-oversized.js +2 -2
- package/dist/core/ingest/reclassify-oversized.js.map +1 -1
- package/dist/core/ingest/reprocess.d.ts +1 -1
- package/dist/core/ingest/reprocess.js +2 -2
- package/dist/core/ingest/reprocess.js.map +1 -1
- package/dist/core/jobs/job-supervisor.d.ts +168 -0
- package/dist/core/jobs/job-supervisor.js +335 -0
- package/dist/core/jobs/job-supervisor.js.map +1 -0
- package/dist/core/learner/model.d.ts +63 -0
- package/dist/core/learner/model.js +30 -0
- package/dist/core/learner/model.js.map +1 -0
- package/dist/core/learner/service.d.ts +42 -0
- package/dist/core/learner/service.js +74 -0
- package/dist/core/learner/service.js.map +1 -0
- package/dist/core/learner/summary.d.ts +28 -0
- package/dist/core/learner/summary.js +70 -0
- package/dist/core/learner/summary.js.map +1 -0
- package/dist/core/learner/validate.d.ts +18 -0
- package/dist/core/learner/validate.js +95 -0
- package/dist/core/learner/validate.js.map +1 -0
- package/dist/core/metrics/re-derivation.d.ts +31 -2
- package/dist/core/metrics/re-derivation.js +36 -4
- package/dist/core/metrics/re-derivation.js.map +1 -1
- package/dist/core/outcome/coverage.d.ts +1 -1
- package/dist/core/outcome/coverage.js +2 -2
- package/dist/core/outcome/coverage.js.map +1 -1
- package/dist/core/outcome/rollup.d.ts +1 -1
- package/dist/core/outcome/rollup.js +4 -4
- package/dist/core/outcome/rollup.js.map +1 -1
- package/dist/core/providers/provider-registry.d.ts +40 -23
- package/dist/core/providers/provider-registry.js +99 -81
- package/dist/core/providers/provider-registry.js.map +1 -1
- package/dist/core/recall/citation-log.d.ts +10 -5
- package/dist/core/recall/citation-log.js +21 -10
- package/dist/core/recall/citation-log.js.map +1 -1
- package/dist/core/recall/hook-recall-log.d.ts +5 -2
- package/dist/core/recall/hook-recall-log.js +12 -6
- package/dist/core/recall/hook-recall-log.js.map +1 -1
- package/dist/core/recall/miss-log.d.ts +7 -4
- package/dist/core/recall/miss-log.js +18 -11
- package/dist/core/recall/miss-log.js.map +1 -1
- package/dist/core/recall/query-log.d.ts +8 -5
- package/dist/core/recall/query-log.js +16 -9
- package/dist/core/recall/query-log.js.map +1 -1
- package/dist/core/recall/recall-service.d.ts +10 -1
- package/dist/core/recall/recall-service.js +31 -12
- package/dist/core/recall/recall-service.js.map +1 -1
- package/dist/core/recall/recent-log.d.ts +6 -1
- package/dist/core/recall/recent-log.js +13 -5
- package/dist/core/recall/recent-log.js.map +1 -1
- package/dist/core/recall/related-concepts.d.ts +29 -0
- package/dist/core/recall/related-concepts.js +67 -0
- package/dist/core/recall/related-concepts.js.map +1 -0
- package/dist/core/recall/related-exemplars.d.ts +1 -1
- package/dist/core/recall/related-exemplars.js +2 -2
- package/dist/core/recall/related-exemplars.js.map +1 -1
- package/dist/core/recall/related-facts.d.ts +1 -1
- package/dist/core/recall/related-facts.js +3 -3
- package/dist/core/recall/related-facts.js.map +1 -1
- package/dist/core/recall-facts/fact-query-log.d.ts +8 -4
- package/dist/core/recall-facts/fact-query-log.js +16 -8
- package/dist/core/recall-facts/fact-query-log.js.map +1 -1
- package/dist/core/recall-facts/fact-recall-service.d.ts +2 -2
- package/dist/core/recall-facts/fact-recall-service.js +12 -12
- package/dist/core/recall-facts/fact-recall-service.js.map +1 -1
- package/dist/core/scheduler/scan-once.js +15 -14
- package/dist/core/scheduler/scan-once.js.map +1 -1
- package/dist/core/scheduler/scheduler.d.ts +3 -0
- package/dist/core/scheduler/scheduler.js +15 -11
- package/dist/core/scheduler/scheduler.js.map +1 -1
- package/dist/core/signals/failure-mode-recall.d.ts +1 -1
- package/dist/core/signals/failure-mode-recall.js +2 -2
- package/dist/core/signals/failure-mode-recall.js.map +1 -1
- package/dist/core/signals/stamp-scope.d.ts +2 -2
- package/dist/core/signals/stamp-scope.js +2 -2
- package/dist/core/signals/stamp-scope.js.map +1 -1
- package/dist/core/sources/source-registry.d.ts +49 -28
- package/dist/core/sources/source-registry.js +113 -70
- package/dist/core/sources/source-registry.js.map +1 -1
- package/dist/core/storage/pg-code-exemplar-store.d.ts +19 -10
- package/dist/core/storage/pg-code-exemplar-store.js +58 -27
- package/dist/core/storage/pg-code-exemplar-store.js.map +1 -1
- package/dist/core/storage/pg-entity-store.d.ts +6 -1
- package/dist/core/storage/pg-entity-store.js +33 -18
- package/dist/core/storage/pg-entity-store.js.map +1 -1
- package/dist/core/storage/pg-fact-ingest.d.ts +1 -1
- package/dist/core/storage/pg-fact-ingest.js +10 -7
- package/dist/core/storage/pg-fact-ingest.js.map +1 -1
- package/dist/core/storage/pg-fact-store.d.ts +29 -17
- package/dist/core/storage/pg-fact-store.js +99 -46
- package/dist/core/storage/pg-fact-store.js.map +1 -1
- package/dist/core/storage/pg-learner-store.d.ts +27 -0
- package/dist/core/storage/pg-learner-store.js +174 -0
- package/dist/core/storage/pg-learner-store.js.map +1 -0
- package/dist/core/storage/pg-session-store.d.ts +24 -20
- package/dist/core/storage/pg-session-store.js +162 -90
- package/dist/core/storage/pg-session-store.js.map +1 -1
- package/dist/core/storage/pg-signal-store.d.ts +10 -5
- package/dist/core/storage/pg-signal-store.js +24 -12
- package/dist/core/storage/pg-signal-store.js.map +1 -1
- package/dist/core/storage/pg-storage.d.ts +4 -0
- package/dist/core/storage/pg-storage.js +6 -0
- package/dist/core/storage/pg-storage.js.map +1 -1
- package/dist/core/storage/pg-workstream-store.d.ts +16 -11
- package/dist/core/storage/pg-workstream-store.js +46 -29
- package/dist/core/storage/pg-workstream-store.js.map +1 -1
- package/dist/core/storage/sqlite-code-exemplar-store.d.ts +24 -10
- package/dist/core/storage/sqlite-code-exemplar-store.js +84 -40
- package/dist/core/storage/sqlite-code-exemplar-store.js.map +1 -1
- package/dist/core/storage/sqlite-entity-store.d.ts +8 -1
- package/dist/core/storage/sqlite-entity-store.js +46 -27
- package/dist/core/storage/sqlite-entity-store.js.map +1 -1
- package/dist/core/storage/sqlite-fact-store.d.ts +45 -19
- package/dist/core/storage/sqlite-fact-store.js +172 -64
- package/dist/core/storage/sqlite-fact-store.js.map +1 -1
- package/dist/core/storage/sqlite-learner-store.d.ts +33 -0
- package/dist/core/storage/sqlite-learner-store.js +178 -0
- package/dist/core/storage/sqlite-learner-store.js.map +1 -0
- package/dist/core/storage/sqlite-outcome-store.d.ts +37 -22
- package/dist/core/storage/sqlite-outcome-store.js +90 -37
- package/dist/core/storage/sqlite-outcome-store.js.map +1 -1
- package/dist/core/storage/sqlite-session-store.d.ts +29 -20
- package/dist/core/storage/sqlite-session-store.js +207 -121
- package/dist/core/storage/sqlite-session-store.js.map +1 -1
- package/dist/core/storage/sqlite-signal-store.d.ts +12 -5
- package/dist/core/storage/sqlite-signal-store.js +27 -15
- package/dist/core/storage/sqlite-signal-store.js.map +1 -1
- package/dist/core/storage/sqlite-storage.d.ts +4 -0
- package/dist/core/storage/sqlite-storage.js +10 -2
- package/dist/core/storage/sqlite-storage.js.map +1 -1
- package/dist/core/storage/sqlite-workstream-store.d.ts +16 -11
- package/dist/core/storage/sqlite-workstream-store.js +52 -31
- package/dist/core/storage/sqlite-workstream-store.js.map +1 -1
- package/dist/core/storage/supersedence-log.d.ts +10 -7
- package/dist/core/storage/supersedence-log.js +19 -14
- package/dist/core/storage/supersedence-log.js.map +1 -1
- package/dist/core/tenancy/default-team.d.ts +6 -0
- package/dist/core/tenancy/default-team.js +7 -0
- package/dist/core/tenancy/default-team.js.map +1 -0
- package/dist/core/tenancy/hosted-mode.d.ts +9 -0
- package/dist/core/tenancy/hosted-mode.js +12 -0
- package/dist/core/tenancy/hosted-mode.js.map +1 -0
- package/dist/core/tenancy/team-auth.d.ts +16 -0
- package/dist/core/tenancy/team-auth.js +22 -0
- package/dist/core/tenancy/team-auth.js.map +1 -0
- package/dist/core/tenancy/team-token-store.d.ts +45 -0
- package/dist/core/tenancy/team-token-store.js +52 -0
- package/dist/core/tenancy/team-token-store.js.map +1 -0
- package/dist/core/tenancy/tenant-clause.d.ts +37 -0
- package/dist/core/tenancy/tenant-clause.js +11 -0
- package/dist/core/tenancy/tenant-clause.js.map +1 -0
- package/dist/core/tenancy/tenant-state-path.d.ts +28 -0
- package/dist/core/tenancy/tenant-state-path.js +49 -0
- package/dist/core/tenancy/tenant-state-path.js.map +1 -0
- package/dist/core/wiki/project.d.ts +17 -0
- package/dist/core/wiki/project.js +37 -0
- package/dist/core/wiki/project.js.map +1 -0
- package/dist/core/wiki/reconcile.d.ts +15 -0
- package/dist/core/wiki/reconcile.js +14 -0
- package/dist/core/wiki/reconcile.js.map +1 -0
- package/dist/core/wiki/render.d.ts +5 -0
- package/dist/core/wiki/render.js +84 -0
- package/dist/core/wiki/render.js.map +1 -0
- package/dist/core/wiki/rollup.d.ts +28 -0
- package/dist/core/wiki/rollup.js +91 -0
- package/dist/core/wiki/rollup.js.map +1 -0
- package/dist/core/wiki/select.d.ts +8 -0
- package/dist/core/wiki/select.js +7 -0
- package/dist/core/wiki/select.js.map +1 -0
- package/dist/core/wiki/slug.d.ts +36 -0
- package/dist/core/wiki/slug.js +71 -0
- package/dist/core/wiki/slug.js.map +1 -0
- package/dist/core/wiki/types.d.ts +37 -0
- package/dist/core/wiki/types.js +2 -0
- package/dist/core/wiki/types.js.map +1 -0
- package/dist/core/work-digest/build-work-digest.d.ts +1 -1
- package/dist/core/work-digest/build-work-digest.js +3 -3
- package/dist/core/work-digest/build-work-digest.js.map +1 -1
- package/dist/core/workstream/bind.d.ts +1 -1
- package/dist/core/workstream/bind.js +10 -10
- package/dist/core/workstream/bind.js.map +1 -1
- package/dist/core/workstream/rollup.d.ts +1 -1
- package/dist/core/workstream/rollup.js +6 -6
- package/dist/core/workstream/rollup.js.map +1 -1
- package/dist/hook/hook-helpers.d.ts +14 -0
- package/dist/hook/hook-helpers.js +29 -2
- package/dist/hook/hook-helpers.js.map +1 -1
- package/dist/hook/pre-compact-hook.js +6 -4
- package/dist/hook/pre-compact-hook.js.map +1 -1
- package/dist/hook/prompt-recall-hook.d.ts +5 -2
- package/dist/hook/prompt-recall-hook.js +28 -17
- package/dist/hook/prompt-recall-hook.js.map +1 -1
- package/dist/hook/recall-over-http.d.ts +27 -3
- package/dist/hook/recall-over-http.js +44 -11
- package/dist/hook/recall-over-http.js.map +1 -1
- package/dist/hook/session-end-hook.js +7 -5
- package/dist/hook/session-end-hook.js.map +1 -1
- package/dist/hook/session-start-hook.d.ts +14 -1
- package/dist/hook/session-start-hook.js +55 -15
- package/dist/hook/session-start-hook.js.map +1 -1
- package/dist/hook/stop-hook.js +9 -7
- package/dist/hook/stop-hook.js.map +1 -1
- package/dist/http/app.d.ts +41 -3
- package/dist/http/app.js +355 -96
- package/dist/http/app.js.map +1 -1
- package/dist/install/claude-code.d.ts +17 -0
- package/dist/install/claude-code.js +44 -5
- package/dist/install/claude-code.js.map +1 -1
- package/dist/install/codex.d.ts +23 -2
- package/dist/install/codex.js +111 -14
- package/dist/install/codex.js.map +1 -1
- package/dist/install/cursor.d.ts +2 -2
- package/dist/install/cursor.js +7 -7
- package/dist/install/cursor.js.map +1 -1
- package/dist/install/hermes.d.ts +8 -0
- package/dist/install/hermes.js +28 -5
- package/dist/install/hermes.js.map +1 -1
- package/dist/install/local-source.d.ts +20 -0
- package/dist/install/local-source.js +28 -0
- package/dist/install/local-source.js.map +1 -0
- package/dist/install/mcp-block.d.ts +77 -0
- package/dist/install/mcp-block.js +99 -0
- package/dist/install/mcp-block.js.map +1 -0
- package/dist/install/pi.d.ts +26 -0
- package/dist/install/pi.js +43 -0
- package/dist/install/pi.js.map +1 -1
- package/dist/install/setup.js +6 -0
- package/dist/install/setup.js.map +1 -1
- package/dist/install/windsurf.d.ts +2 -2
- package/dist/install/windsurf.js +7 -7
- package/dist/install/windsurf.js.map +1 -1
- package/dist/llm/classifier-box.d.ts +5 -0
- package/dist/llm/classifier-box.js +5 -0
- package/dist/llm/classifier-box.js.map +1 -1
- package/dist/mcp/server.d.ts +73 -16
- package/dist/mcp/server.js +306 -83
- package/dist/mcp/server.js.map +1 -1
- package/dist/ports/clock.d.ts +12 -0
- package/dist/ports/clock.js +10 -0
- package/dist/ports/clock.js.map +1 -0
- package/dist/ports/code-exemplar-store.d.ts +13 -13
- package/dist/ports/entity-store.d.ts +5 -1
- package/dist/ports/fact-store.d.ts +0 -0
- package/dist/ports/fact-store.js +0 -0
- package/dist/ports/fact-store.js.map +1 -1
- package/dist/ports/learner-store.d.ts +80 -0
- package/dist/ports/learner-store.js +19 -0
- package/dist/ports/learner-store.js.map +1 -0
- package/dist/ports/outcome.d.ts +3 -3
- package/dist/ports/session-store.d.ts +20 -14
- package/dist/ports/session-store.js +5 -0
- package/dist/ports/session-store.js.map +1 -1
- package/dist/ports/signal-store.d.ts +12 -8
- package/dist/ports/spawn-child.d.ts +14 -0
- package/dist/ports/spawn-child.js +10 -0
- package/dist/ports/spawn-child.js.map +1 -0
- package/dist/ports/storage.d.ts +6 -0
- package/dist/ports/transcript-adapter.d.ts +11 -0
- package/dist/ports/wiki-writer.d.ts +19 -0
- package/dist/ports/wiki-writer.js +12 -0
- package/dist/ports/wiki-writer.js.map +1 -0
- package/dist/ports/workstream-store.d.ts +19 -12
- package/dist/shared/types.d.ts +22 -0
- package/dist/shared/types.js.map +1 -1
- package/dist/shared/version.d.ts +9 -0
- package/dist/shared/version.js +11 -0
- package/dist/shared/version.js.map +1 -0
- package/dist/ui/assets/index-D6F3xAis.js +11 -0
- package/dist/ui/index.html +1 -1
- package/migrations/033_actions_kind_check.sql +58 -0
- package/migrations/034_tenancy_teams_and_stamps.sql +40 -0
- package/migrations/035_tenancy_entity_rekey.sql +75 -0
- package/migrations/036_tenant_name_uniqueness.sql +59 -0
- package/migrations/037_sessions_covering_index.sql +25 -0
- package/migrations/038_sources_muse.sql +33 -0
- package/migrations/039_learner_evidence.sql +51 -0
- package/migrations/pg/033_actions_kind_check.sql +17 -0
- package/migrations/pg/034_tenancy.sql +77 -0
- package/migrations/pg/035_tenant_name_uniqueness.sql +15 -0
- package/migrations/pg/036_sources_muse.sql +12 -0
- package/migrations/pg/037_learner_evidence.sql +55 -0
- package/nlm/index.js +246 -55
- package/package.json +10 -5
- package/plugin/.codex-plugin/plugin.json +2 -2
- package/plugin/scripts/prompt-recall-hook.mjs +244 -55
- package/plugin/scripts/session-start-hook.mjs +273 -53
- package/plugin/scripts/stop-hook.mjs +195 -37
- package/dist/ui/assets/index-CSaBtgXD.js +0 -11
|
@@ -6,8 +6,19 @@
|
|
|
6
6
|
* (INSERT OR IGNORE on the primary key, which is sha256 of the dedup tuple).
|
|
7
7
|
* The vec lane is managed separately via upsertEmbedding; inserts succeed
|
|
8
8
|
* even when no embedder is configured.
|
|
9
|
+
*
|
|
10
|
+
* Tenancy (program spec §4, M2 plan Wave B3): every method takes `tenantId`
|
|
11
|
+
* as its non-optional first parameter. `code_exemplars` is a STAMP table;
|
|
12
|
+
* every SELECT/UPDATE/DELETE routes its WHERE fragment through
|
|
13
|
+
* `tenantClause`, and INSERTs stamp `tenant_id` explicitly.
|
|
14
|
+
* `code_exemplars_vec` carries no tenant_id (DERIVE-VIA-FK) — `searchByVector`
|
|
15
|
+
* is the purest vector path in the codebase (no keyword pre-filter at all);
|
|
16
|
+
* its tenant filter is applied inside the id-resolution SQL join against
|
|
17
|
+
* `code_exemplars`, with a JS re-check of each row's own tenant_id as
|
|
18
|
+
* defense in depth (never a substitute for the SQL filter).
|
|
9
19
|
*/
|
|
10
20
|
import { createHash } from "node:crypto";
|
|
21
|
+
import { tenantClause } from "../tenancy/tenant-clause.js";
|
|
11
22
|
const VEC_DIM = 768;
|
|
12
23
|
/**
|
|
13
24
|
* Deterministic primary key: sha256(install_scope|repo|code_hash|outcome)[:16].
|
|
@@ -24,17 +35,17 @@ export class SqliteCodeExemplarStore {
|
|
|
24
35
|
constructor(db) {
|
|
25
36
|
this.db = db;
|
|
26
37
|
}
|
|
27
|
-
async insert(input) {
|
|
38
|
+
async insert(tenantId, input) {
|
|
28
39
|
const id = exemplarId({
|
|
29
40
|
installScope: input.installScope,
|
|
30
41
|
repo: input.repo,
|
|
31
42
|
codeHash: input.codeHash,
|
|
32
43
|
outcome: input.outcome,
|
|
33
44
|
});
|
|
34
|
-
const info = this.insertStmt().run(this.toRow(id, input));
|
|
45
|
+
const info = this.insertStmt().run(this.toRow(id, input, tenantId));
|
|
35
46
|
return { id, skipped: info.changes === 0 };
|
|
36
47
|
}
|
|
37
|
-
async insertMany(inputs) {
|
|
48
|
+
async insertMany(tenantId, inputs) {
|
|
38
49
|
if (inputs.length === 0)
|
|
39
50
|
return 0;
|
|
40
51
|
const stmt = this.insertStmt();
|
|
@@ -53,21 +64,31 @@ export class SqliteCodeExemplarStore {
|
|
|
53
64
|
codeHash: inp.codeHash,
|
|
54
65
|
outcome: inp.outcome,
|
|
55
66
|
});
|
|
56
|
-
return this.toRow(id, inp);
|
|
67
|
+
return this.toRow(id, inp, tenantId);
|
|
57
68
|
}));
|
|
58
69
|
return inserted;
|
|
59
70
|
}
|
|
60
|
-
|
|
71
|
+
/**
|
|
72
|
+
* No-op if exemplarId isn't owned by tenantId — writing an embedding for
|
|
73
|
+
* another tenant's exemplar must never fall through to a write.
|
|
74
|
+
*/
|
|
75
|
+
async upsertEmbedding(tenantId, exemplarId, vector) {
|
|
61
76
|
if (vector.length !== VEC_DIM) {
|
|
62
77
|
throw new Error(`code exemplar embeddings must be ${VEC_DIM}-dim (got ${vector.length})`);
|
|
63
78
|
}
|
|
79
|
+
const tc = tenantClause(tenantId);
|
|
80
|
+
const owned = this.db
|
|
81
|
+
.prepare(`SELECT id FROM code_exemplars WHERE id = ? AND ${tc.sql}`)
|
|
82
|
+
.get(exemplarId, tc.param);
|
|
83
|
+
if (!owned)
|
|
84
|
+
return;
|
|
64
85
|
const buf = Buffer.from(vector.buffer, vector.byteOffset, vector.byteLength);
|
|
65
86
|
this.db.prepare("DELETE FROM code_exemplars_vec WHERE exemplar_id = ?").run(exemplarId);
|
|
66
87
|
this.db
|
|
67
88
|
.prepare("INSERT INTO code_exemplars_vec (exemplar_id, embedding) VALUES (?, ?)")
|
|
68
89
|
.run(exemplarId, buf);
|
|
69
90
|
}
|
|
70
|
-
async searchByVector(queryVector, filter) {
|
|
91
|
+
async searchByVector(tenantId, queryVector, filter) {
|
|
71
92
|
const k = Math.max(1, Math.min(50, filter.k ?? 5));
|
|
72
93
|
const includeNegatives = filter.includeNegatives ?? true;
|
|
73
94
|
const queryBuf = Buffer.from(queryVector.buffer, queryVector.byteOffset, queryVector.byteLength);
|
|
@@ -83,14 +104,26 @@ export class SqliteCodeExemplarStore {
|
|
|
83
104
|
return [];
|
|
84
105
|
const ids = vecRows.map((r) => r.exemplar_id);
|
|
85
106
|
const distanceById = new Map(vecRows.map((r) => [r.exemplar_id, r.distance]));
|
|
107
|
+
// code_exemplars_vec carries no tenant_id (DERIVE-VIA-FK) — the vec0 KNN
|
|
108
|
+
// scan returns neighbors from the whole corpus regardless of tenant. The
|
|
109
|
+
// tenant filter is re-applied HERE, inside the id-resolution SQL against
|
|
110
|
+
// code_exemplars (program spec §4.3 vector-path rule) — this is the
|
|
111
|
+
// purest vector path in the codebase (no keyword pre-filter at all), so
|
|
112
|
+
// a candidate exemplar id that fails to resolve within the caller's
|
|
113
|
+
// tenant is excluded outright, not merely down-ranked.
|
|
86
114
|
const placeholders = ids.map(() => "?").join(",");
|
|
115
|
+
const tc = tenantClause(tenantId);
|
|
87
116
|
const rows = this.db
|
|
88
117
|
.prepare(`SELECT id, install_scope, signal_id, session_id, repo, model, lang,
|
|
89
|
-
task_context, code, code_hash, outcome, git_sha, survived, ts, created_at
|
|
118
|
+
task_context, code, code_hash, outcome, git_sha, survived, ts, created_at, tenant_id
|
|
90
119
|
FROM code_exemplars
|
|
91
|
-
WHERE id IN (${placeholders}) AND install_scope = ? AND retired_at IS NULL`)
|
|
92
|
-
.all(...ids, filter.installScope);
|
|
93
|
-
|
|
120
|
+
WHERE id IN (${placeholders}) AND install_scope = ? AND retired_at IS NULL AND ${tc.sql}`)
|
|
121
|
+
.all(...ids, filter.installScope, tc.param);
|
|
122
|
+
// Defense in depth (never a substitute for the SQL filter above): re-check
|
|
123
|
+
// each resolved row's own tenant, read into a local first so this JS
|
|
124
|
+
// comparison can never be mistaken by the tenant-guard scan for an
|
|
125
|
+
// inlined SQL WHERE fragment (that literal is reserved for tenant-clause.ts).
|
|
126
|
+
let hits = rows.filter((r) => { const rowTenant = r["tenant_id"]; return rowTenant === tenantId; }).map((r) => ({
|
|
94
127
|
id: r.id,
|
|
95
128
|
code: r.code,
|
|
96
129
|
taskContext: r.task_context,
|
|
@@ -120,32 +153,35 @@ export class SqliteCodeExemplarStore {
|
|
|
120
153
|
});
|
|
121
154
|
return hits.slice(0, k);
|
|
122
155
|
}
|
|
123
|
-
async getById(id) {
|
|
156
|
+
async getById(tenantId, id) {
|
|
157
|
+
const tc = tenantClause(tenantId);
|
|
124
158
|
const row = this.db
|
|
125
159
|
.prepare(`SELECT id, install_scope, signal_id, session_id, repo, model, lang,
|
|
126
160
|
task_context, code, code_hash, outcome, git_sha, survived, ts, created_at,
|
|
127
161
|
retired_at, label_source
|
|
128
|
-
FROM code_exemplars WHERE id =
|
|
129
|
-
.get(id);
|
|
162
|
+
FROM code_exemplars WHERE id = ? AND ${tc.sql}`)
|
|
163
|
+
.get(id, tc.param);
|
|
130
164
|
return row ? this.rowToExemplar(row) : null;
|
|
131
165
|
}
|
|
132
|
-
async listBySessions(sessionIds) {
|
|
166
|
+
async listBySessions(tenantId, sessionIds) {
|
|
133
167
|
if (sessionIds.length === 0)
|
|
134
168
|
return [];
|
|
135
169
|
const ph = sessionIds.map(() => "?").join(",");
|
|
170
|
+
const tc = tenantClause(tenantId);
|
|
136
171
|
const rows = this.db
|
|
137
172
|
.prepare(`SELECT id, install_scope, signal_id, session_id, repo, model, lang,
|
|
138
173
|
task_context, code, code_hash, outcome, git_sha, survived, ts, created_at, retired_at, label_source
|
|
139
|
-
FROM code_exemplars WHERE session_id IN (${ph}) AND retired_at IS NULL ORDER BY ts ASC`)
|
|
140
|
-
.all(...sessionIds);
|
|
174
|
+
FROM code_exemplars WHERE session_id IN (${ph}) AND retired_at IS NULL AND ${tc.sql} ORDER BY ts ASC`)
|
|
175
|
+
.all(...sessionIds, tc.param);
|
|
141
176
|
return rows.map((r) => this.rowToExemplar(r));
|
|
142
177
|
}
|
|
143
|
-
async applyBucketCap(installScope, maxPerBucket) {
|
|
178
|
+
async applyBucketCap(tenantId, installScope, maxPerBucket) {
|
|
179
|
+
const bucketTc = tenantClause(tenantId);
|
|
144
180
|
const buckets = this.db
|
|
145
181
|
.prepare(`SELECT DISTINCT repo, lang,
|
|
146
182
|
CASE WHEN outcome IN ('pass','fix') THEN 'positive' ELSE 'negative' END AS outcome_class
|
|
147
|
-
FROM code_exemplars WHERE install_scope =
|
|
148
|
-
.all(installScope);
|
|
183
|
+
FROM code_exemplars WHERE install_scope = ? AND ${bucketTc.sql}`)
|
|
184
|
+
.all(installScope, bucketTc.param);
|
|
149
185
|
let deleted = 0;
|
|
150
186
|
const delStmt = this.db.prepare("DELETE FROM code_exemplars WHERE id = ?");
|
|
151
187
|
const txn = this.db.transaction(() => {
|
|
@@ -153,13 +189,15 @@ export class SqliteCodeExemplarStore {
|
|
|
153
189
|
const outcomeList = bucket.outcome_class === "positive" ? ["pass", "fix"] : ["fail", "exhausted"];
|
|
154
190
|
const placeholders = outcomeList.map(() => "?").join(",");
|
|
155
191
|
const langFilter = bucket.lang !== null ? "AND lang = ?" : "AND lang IS NULL";
|
|
192
|
+
const idsTc = tenantClause(tenantId);
|
|
156
193
|
const params = bucket.lang !== null
|
|
157
|
-
? [installScope, bucket.repo, bucket.lang, ...outcomeList]
|
|
158
|
-
: [installScope, bucket.repo, ...outcomeList];
|
|
194
|
+
? [installScope, bucket.repo, bucket.lang, ...outcomeList, idsTc.param]
|
|
195
|
+
: [installScope, bucket.repo, ...outcomeList, idsTc.param];
|
|
159
196
|
const allIds = this.db
|
|
160
197
|
.prepare(`SELECT id FROM code_exemplars
|
|
161
198
|
WHERE install_scope = ? AND repo = ? ${langFilter}
|
|
162
199
|
AND outcome IN (${placeholders})
|
|
200
|
+
AND ${idsTc.sql}
|
|
163
201
|
ORDER BY ts DESC`)
|
|
164
202
|
.all(...params)
|
|
165
203
|
.map((r) => r.id);
|
|
@@ -174,10 +212,11 @@ export class SqliteCodeExemplarStore {
|
|
|
174
212
|
txn();
|
|
175
213
|
return deleted;
|
|
176
214
|
}
|
|
177
|
-
async pruneReverted(installScope) {
|
|
215
|
+
async pruneReverted(tenantId, installScope) {
|
|
216
|
+
const tc = tenantClause(tenantId);
|
|
178
217
|
const ids = this.db
|
|
179
|
-
.prepare(
|
|
180
|
-
.all(installScope)
|
|
218
|
+
.prepare(`SELECT id FROM code_exemplars WHERE install_scope = ? AND survived = 0 AND ${tc.sql}`)
|
|
219
|
+
.all(installScope, tc.param)
|
|
181
220
|
.map((r) => r.id);
|
|
182
221
|
let deleted = 0;
|
|
183
222
|
const txn = this.db.transaction(() => {
|
|
@@ -190,31 +229,35 @@ export class SqliteCodeExemplarStore {
|
|
|
190
229
|
txn();
|
|
191
230
|
return deleted;
|
|
192
231
|
}
|
|
193
|
-
async setVerdict(id, patch, source) {
|
|
232
|
+
async setVerdict(tenantId, id, patch, source) {
|
|
233
|
+
const tc = tenantClause(tenantId);
|
|
194
234
|
const row = this.db
|
|
195
|
-
.prepare(
|
|
196
|
-
.get(id);
|
|
235
|
+
.prepare(`SELECT label_source FROM code_exemplars WHERE id = ? AND ${tc.sql}`)
|
|
236
|
+
.get(id, tc.param);
|
|
197
237
|
if (!row)
|
|
198
238
|
return { status: "not_found" };
|
|
199
239
|
if (source === "llm" && row.label_source === "human")
|
|
200
240
|
return { status: "human_locked" };
|
|
201
|
-
const sets = ["label_source =
|
|
202
|
-
const params =
|
|
241
|
+
const sets = ["label_source = ?"];
|
|
242
|
+
const params = [source];
|
|
203
243
|
if (patch.retired !== undefined) {
|
|
204
|
-
sets.push("retired_at =
|
|
205
|
-
params
|
|
244
|
+
sets.push("retired_at = ?");
|
|
245
|
+
params.push(patch.retired ? new Date().toISOString() : null);
|
|
206
246
|
}
|
|
207
247
|
if (patch.outcome !== undefined) {
|
|
208
|
-
sets.push("outcome =
|
|
209
|
-
params
|
|
248
|
+
sets.push("outcome = ?");
|
|
249
|
+
params.push(patch.outcome);
|
|
210
250
|
}
|
|
211
|
-
|
|
251
|
+
const updateTc = tenantClause(tenantId);
|
|
252
|
+
params.push(id, updateTc.param);
|
|
253
|
+
this.db.prepare(`UPDATE code_exemplars SET ${sets.join(", ")} WHERE id = ? AND ${updateTc.sql}`).run(...params);
|
|
212
254
|
return { status: "applied" };
|
|
213
255
|
}
|
|
214
|
-
async pruneOlderThan(olderThanTs) {
|
|
256
|
+
async pruneOlderThan(tenantId, olderThanTs) {
|
|
257
|
+
const tc = tenantClause(tenantId);
|
|
215
258
|
const ids = this.db
|
|
216
|
-
.prepare(
|
|
217
|
-
.all(olderThanTs)
|
|
259
|
+
.prepare(`SELECT id FROM code_exemplars WHERE ts < ? AND ${tc.sql}`)
|
|
260
|
+
.all(olderThanTs, tc.param)
|
|
218
261
|
.map((r) => r.id);
|
|
219
262
|
let deleted = 0;
|
|
220
263
|
const txn = this.db.transaction(() => {
|
|
@@ -231,14 +274,14 @@ export class SqliteCodeExemplarStore {
|
|
|
231
274
|
return this.db.prepare(`
|
|
232
275
|
INSERT OR IGNORE INTO code_exemplars (
|
|
233
276
|
id, install_scope, signal_id, session_id, repo, model, lang,
|
|
234
|
-
task_context, code, code_hash, outcome, git_sha, survived, scope, ts, created_at
|
|
277
|
+
task_context, code, code_hash, outcome, git_sha, survived, scope, ts, created_at, tenant_id
|
|
235
278
|
) VALUES (
|
|
236
279
|
@id, @install_scope, @signal_id, @session_id, @repo, @model, @lang,
|
|
237
|
-
@task_context, @code, @code_hash, @outcome, @git_sha, @survived, @scope, @ts, @created_at
|
|
280
|
+
@task_context, @code, @code_hash, @outcome, @git_sha, @survived, @scope, @ts, @created_at, @tenant_id
|
|
238
281
|
)
|
|
239
282
|
`);
|
|
240
283
|
}
|
|
241
|
-
toRow(id, inp) {
|
|
284
|
+
toRow(id, inp, tenantId) {
|
|
242
285
|
return {
|
|
243
286
|
id,
|
|
244
287
|
install_scope: inp.installScope,
|
|
@@ -258,6 +301,7 @@ export class SqliteCodeExemplarStore {
|
|
|
258
301
|
created_at: new Date().toISOString(),
|
|
259
302
|
retired_at: null,
|
|
260
303
|
label_source: "llm",
|
|
304
|
+
tenant_id: tenantId,
|
|
261
305
|
};
|
|
262
306
|
}
|
|
263
307
|
rowToExemplar(row) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-code-exemplar-store.js","sourceRoot":"","sources":["../../../src/core/storage/sqlite-code-exemplar-store.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sqlite-code-exemplar-store.js","sourceRoot":"","sources":["../../../src/core/storage/sqlite-code-exemplar-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,11 +3,18 @@
|
|
|
3
3
|
*
|
|
4
4
|
* All merge operations run inside a single synchronous transaction so
|
|
5
5
|
* the database is never left in a partially-merged state.
|
|
6
|
+
*
|
|
7
|
+
* Tenancy (program spec §4, M2 plan Wave B4): entities/entity_variants carry
|
|
8
|
+
* a composite PK (tenant_id, canonical/variant); session_entities and
|
|
9
|
+
* workstream_entities are stamped too. merge takes tenantId as its
|
|
10
|
+
* non-optional first parameter and resolves source/target within that
|
|
11
|
+
* tenant only — every SELECT/UPDATE/DELETE routes its WHERE fragment
|
|
12
|
+
* through tenantClause.
|
|
6
13
|
*/
|
|
7
14
|
import type Database from "better-sqlite3";
|
|
8
15
|
import type { EntityStore } from "../../ports/entity-store.js";
|
|
9
16
|
export declare class SqliteEntityStore implements EntityStore {
|
|
10
17
|
private readonly db;
|
|
11
18
|
constructor(db: Database.Database);
|
|
12
|
-
merge(source: string, target: string): Promise<void>;
|
|
19
|
+
merge(tenantId: string, source: string, target: string): Promise<void>;
|
|
13
20
|
}
|
|
@@ -3,92 +3,111 @@
|
|
|
3
3
|
*
|
|
4
4
|
* All merge operations run inside a single synchronous transaction so
|
|
5
5
|
* the database is never left in a partially-merged state.
|
|
6
|
+
*
|
|
7
|
+
* Tenancy (program spec §4, M2 plan Wave B4): entities/entity_variants carry
|
|
8
|
+
* a composite PK (tenant_id, canonical/variant); session_entities and
|
|
9
|
+
* workstream_entities are stamped too. merge takes tenantId as its
|
|
10
|
+
* non-optional first parameter and resolves source/target within that
|
|
11
|
+
* tenant only — every SELECT/UPDATE/DELETE routes its WHERE fragment
|
|
12
|
+
* through tenantClause.
|
|
6
13
|
*/
|
|
14
|
+
import { tenantClause } from "../tenancy/tenant-clause.js";
|
|
7
15
|
export class SqliteEntityStore {
|
|
8
16
|
db;
|
|
9
17
|
constructor(db) {
|
|
10
18
|
this.db = db;
|
|
11
19
|
}
|
|
12
|
-
async merge(source, target) {
|
|
20
|
+
async merge(tenantId, source, target) {
|
|
13
21
|
const txn = this.db.transaction(() => {
|
|
22
|
+
const targetTc = tenantClause(tenantId);
|
|
14
23
|
const targetRow = this.db
|
|
15
|
-
.prepare(
|
|
16
|
-
.get(target);
|
|
24
|
+
.prepare(`SELECT status FROM entities WHERE canonical = ? AND ${targetTc.sql}`)
|
|
25
|
+
.get(target, targetTc.param);
|
|
17
26
|
if (!targetRow)
|
|
18
27
|
throw new Error(`merge: target entity not found: ${target}`);
|
|
19
28
|
if (targetRow.status === "retired") {
|
|
20
29
|
throw new Error(`merge: target entity is retired: ${target}`);
|
|
21
30
|
}
|
|
31
|
+
const sourceTc = tenantClause(tenantId);
|
|
22
32
|
const sourceRow = this.db
|
|
23
|
-
.prepare(
|
|
24
|
-
.get(source);
|
|
33
|
+
.prepare(`SELECT status FROM entities WHERE canonical = ? AND ${sourceTc.sql}`)
|
|
34
|
+
.get(source, sourceTc.param);
|
|
25
35
|
if (!sourceRow)
|
|
26
36
|
throw new Error(`merge: source entity not found: ${source}`);
|
|
27
37
|
// Step 1: copy source session_entities to target, dedup on composite PK.
|
|
38
|
+
const copyTc = tenantClause(tenantId);
|
|
28
39
|
this.db
|
|
29
|
-
.prepare(`INSERT OR IGNORE INTO session_entities (session_id, entity_canonical)
|
|
30
|
-
SELECT session_id, ? FROM session_entities WHERE entity_canonical =
|
|
31
|
-
.run(target, source);
|
|
40
|
+
.prepare(`INSERT OR IGNORE INTO session_entities (tenant_id, session_id, entity_canonical)
|
|
41
|
+
SELECT ?, session_id, ? FROM session_entities WHERE entity_canonical = ? AND ${copyTc.sql}`)
|
|
42
|
+
.run(tenantId, target, source, copyTc.param);
|
|
32
43
|
// Step 2: delete source's session_entities rows.
|
|
44
|
+
const deleteEntTc = tenantClause(tenantId);
|
|
33
45
|
this.db
|
|
34
|
-
.prepare(
|
|
35
|
-
.run(source);
|
|
46
|
+
.prepare(`DELETE FROM session_entities WHERE entity_canonical = ? AND ${deleteEntTc.sql}`)
|
|
47
|
+
.run(source, deleteEntTc.param);
|
|
36
48
|
// Step 3: recompute target.session_count exactly from session_entities.
|
|
49
|
+
const countInnerTc = tenantClause(tenantId);
|
|
50
|
+
const countOuterTc = tenantClause(tenantId);
|
|
37
51
|
this.db
|
|
38
52
|
.prepare(`UPDATE entities
|
|
39
|
-
SET session_count = (SELECT COUNT(*) FROM session_entities WHERE entity_canonical = ?),
|
|
53
|
+
SET session_count = (SELECT COUNT(*) FROM session_entities WHERE entity_canonical = ? AND ${countInnerTc.sql}),
|
|
40
54
|
updated_at = datetime('now')
|
|
41
|
-
WHERE canonical =
|
|
42
|
-
.run(target, target);
|
|
55
|
+
WHERE canonical = ? AND ${countOuterTc.sql}`)
|
|
56
|
+
.run(target, countInnerTc.param, target, countOuterTc.param);
|
|
43
57
|
// Step 4: widen first_seen_session / last_seen_session.
|
|
44
58
|
// first_seen and last_seen are session IDs (text), not timestamps.
|
|
45
59
|
// We use sessions.started_at to order them chronologically and pick
|
|
46
60
|
// the earliest / latest. This is correct as long as session IDs are
|
|
47
61
|
// stable references (they are -- FK to sessions(id)).
|
|
62
|
+
const seenTc = tenantClause(tenantId, "e.tenant_id");
|
|
48
63
|
const bothSeenSessions = this.db
|
|
49
64
|
.prepare(`SELECT id, started_at FROM sessions
|
|
50
65
|
WHERE id IN (
|
|
51
|
-
SELECT first_seen_session FROM entities WHERE canonical IN (?, ?)
|
|
66
|
+
SELECT first_seen_session FROM entities e WHERE canonical IN (?, ?) AND ${seenTc.sql}
|
|
52
67
|
UNION
|
|
53
|
-
SELECT last_seen_session FROM entities WHERE canonical IN (?, ?)
|
|
68
|
+
SELECT last_seen_session FROM entities e WHERE canonical IN (?, ?) AND ${seenTc.sql}
|
|
54
69
|
)`)
|
|
55
|
-
.all(source, target, source, target);
|
|
70
|
+
.all(source, target, seenTc.param, source, target, seenTc.param);
|
|
56
71
|
if (bothSeenSessions.length > 0) {
|
|
57
72
|
bothSeenSessions.sort((a, b) => a.started_at.localeCompare(b.started_at));
|
|
58
73
|
const earliest = bothSeenSessions[0].id;
|
|
59
74
|
const latest = bothSeenSessions[bothSeenSessions.length - 1].id;
|
|
75
|
+
const widenTc = tenantClause(tenantId);
|
|
60
76
|
this.db
|
|
61
77
|
.prepare(`UPDATE entities
|
|
62
78
|
SET first_seen_session = ?,
|
|
63
79
|
last_seen_session = ?,
|
|
64
80
|
updated_at = datetime('now')
|
|
65
|
-
WHERE canonical =
|
|
66
|
-
.run(earliest, latest, target);
|
|
81
|
+
WHERE canonical = ? AND ${widenTc.sql}`)
|
|
82
|
+
.run(earliest, latest, target, widenTc.param);
|
|
67
83
|
}
|
|
68
84
|
// Step 5: insert the variant record so future ingest resolves source -> target.
|
|
69
85
|
this.db
|
|
70
|
-
.prepare(`INSERT OR IGNORE INTO entity_variants (variant, canonical, source_session_id)
|
|
71
|
-
VALUES (?, ?, NULL)`)
|
|
72
|
-
.run(source, target);
|
|
86
|
+
.prepare(`INSERT OR IGNORE INTO entity_variants (tenant_id, variant, canonical, source_session_id)
|
|
87
|
+
VALUES (?, ?, ?, NULL)`)
|
|
88
|
+
.run(tenantId, source, target);
|
|
73
89
|
// Step 6: re-point existing variants of source to target.
|
|
90
|
+
const listVariantsTc = tenantClause(tenantId);
|
|
74
91
|
const sourceVariants = this.db
|
|
75
|
-
.prepare(
|
|
76
|
-
.all(source);
|
|
92
|
+
.prepare(`SELECT variant FROM entity_variants WHERE canonical = ? AND ${listVariantsTc.sql}`)
|
|
93
|
+
.all(source, listVariantsTc.param);
|
|
77
94
|
for (const { variant } of sourceVariants) {
|
|
78
95
|
if (variant === source)
|
|
79
96
|
continue;
|
|
97
|
+
const repointTc = tenantClause(tenantId);
|
|
80
98
|
this.db
|
|
81
|
-
.prepare(
|
|
82
|
-
.run(target, variant);
|
|
99
|
+
.prepare(`UPDATE entity_variants SET canonical = ? WHERE variant = ? AND ${repointTc.sql}`)
|
|
100
|
+
.run(target, variant, repointTc.param);
|
|
83
101
|
}
|
|
84
102
|
// Step 7: retire the source entity row in place.
|
|
103
|
+
const retireTc = tenantClause(tenantId);
|
|
85
104
|
this.db
|
|
86
105
|
.prepare(`UPDATE entities
|
|
87
106
|
SET status = 'retired',
|
|
88
107
|
session_count = 0,
|
|
89
108
|
updated_at = datetime('now')
|
|
90
|
-
WHERE canonical =
|
|
91
|
-
.run(source);
|
|
109
|
+
WHERE canonical = ? AND ${retireTc.sql}`)
|
|
110
|
+
.run(source, retireTc.param);
|
|
92
111
|
});
|
|
93
112
|
txn();
|
|
94
113
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-entity-store.js","sourceRoot":"","sources":["../../../src/core/storage/sqlite-entity-store.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"sqlite-entity-store.js","sourceRoot":"","sources":["../../../src/core/storage/sqlite-entity-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,9 +14,18 @@
|
|
|
14
14
|
* B.3 — listForRecall (pre-filter for FactRecallService), semanticSearch,
|
|
15
15
|
* getHistory (supersedence chain inspection)
|
|
16
16
|
* B.4 — auto-supersedence on (subject, predicate) collision (deferred)
|
|
17
|
+
*
|
|
18
|
+
* Tenancy (program spec §4, M2 plan Wave B): every method takes `tenantId`
|
|
19
|
+
* as its non-optional first parameter. `facts` is a STAMP table; every
|
|
20
|
+
* SELECT/UPDATE/DELETE routes its WHERE fragment through `tenantClause`,
|
|
21
|
+
* and INSERTs stamp `tenant_id` explicitly. `fact_embeddings` carries no
|
|
22
|
+
* tenant_id (DERIVE-VIA-FK, keyed by fact_id) — `semanticSearch`'s KNN scan
|
|
23
|
+
* has no tenant awareness of its own, so callers (FactRecallService) resolve
|
|
24
|
+
* neighbor ids back through the tenant-filtered `getByIds`/`getById` before
|
|
25
|
+
* trusting them (program spec §4.3, vector-path rule).
|
|
17
26
|
*/
|
|
18
27
|
import type Database from "better-sqlite3";
|
|
19
|
-
import type { FactListFilter, FactQuery, FactSemanticNeighbor, FactStore } from "../../ports/fact-store.js";
|
|
28
|
+
import type { FactListFilter, FactQuery, FactSemanticNeighbor, FactStore, SubjectStat } from "../../ports/fact-store.js";
|
|
20
29
|
import type { Fact, FactHistoryChain } from "../../shared/types.js";
|
|
21
30
|
export declare class SqliteFactStore implements FactStore {
|
|
22
31
|
private readonly db;
|
|
@@ -27,33 +36,50 @@ export declare class SqliteFactStore implements FactStore {
|
|
|
27
36
|
*/
|
|
28
37
|
constructor(db: Database.Database);
|
|
29
38
|
private cachedInsertStmt;
|
|
30
|
-
insert(fact: Fact): Promise<void>;
|
|
31
|
-
insertMany(facts: ReadonlyArray<Fact>): Promise<void>;
|
|
32
|
-
getById(id: string): Promise<Fact | null>;
|
|
33
|
-
getByIds(ids: ReadonlyArray<string>): Promise<ReadonlyArray<Fact>>;
|
|
34
|
-
findCurrent(subject: string, predicate: string): Promise<Fact | null>;
|
|
35
|
-
list(query: FactQuery): Promise<ReadonlyArray<Fact>>;
|
|
36
|
-
listBySession(sessionId: string): Promise<ReadonlyArray<Fact>>;
|
|
37
|
-
listBySessions(sessionIds: ReadonlyArray<string>, opts?: {
|
|
39
|
+
insert(tenantId: string, fact: Fact): Promise<void>;
|
|
40
|
+
insertMany(tenantId: string, facts: ReadonlyArray<Fact>): Promise<void>;
|
|
41
|
+
getById(tenantId: string, id: string): Promise<Fact | null>;
|
|
42
|
+
getByIds(tenantId: string, ids: ReadonlyArray<string>): Promise<ReadonlyArray<Fact>>;
|
|
43
|
+
findCurrent(tenantId: string, subject: string, predicate: string): Promise<Fact | null>;
|
|
44
|
+
list(tenantId: string, query: FactQuery): Promise<ReadonlyArray<Fact>>;
|
|
45
|
+
listBySession(tenantId: string, sessionId: string): Promise<ReadonlyArray<Fact>>;
|
|
46
|
+
listBySessions(tenantId: string, sessionIds: ReadonlyArray<string>, opts?: {
|
|
38
47
|
includeSuperseded?: boolean;
|
|
39
48
|
}): Promise<ReadonlyArray<Fact>>;
|
|
40
|
-
listForRecall(filter: FactListFilter): Promise<ReadonlyArray<Fact>>;
|
|
41
|
-
semanticSearch(queryVector: Float32Array, limit: number): Promise<ReadonlyArray<FactSemanticNeighbor>>;
|
|
42
|
-
getHistory(subject: string, predicate?: string): Promise<ReadonlyArray<FactHistoryChain>>;
|
|
43
|
-
corroborationCounts(triples: ReadonlyArray<{
|
|
49
|
+
listForRecall(tenantId: string, filter: FactListFilter): Promise<ReadonlyArray<Fact>>;
|
|
50
|
+
semanticSearch(tenantId: string, queryVector: Float32Array, limit: number): Promise<ReadonlyArray<FactSemanticNeighbor>>;
|
|
51
|
+
getHistory(tenantId: string, subject: string, predicate?: string): Promise<ReadonlyArray<FactHistoryChain>>;
|
|
52
|
+
corroborationCounts(tenantId: string, triples: ReadonlyArray<{
|
|
44
53
|
readonly subject: string;
|
|
45
54
|
readonly predicate: string;
|
|
46
55
|
readonly value: string;
|
|
47
56
|
}>): Promise<Map<string, number>>;
|
|
57
|
+
/**
|
|
58
|
+
* Aggregate current (non-superseded, non-retired) facts by subject.
|
|
59
|
+
* Covered by idx_facts_subject_current.
|
|
60
|
+
*/
|
|
61
|
+
listSubjectStats(tenantId: string): Promise<ReadonlyArray<SubjectStat>>;
|
|
62
|
+
/**
|
|
63
|
+
* Every non-retired fact for the given subjects, current and superseded,
|
|
64
|
+
* in one query — the wiki projection's rollup stage calls this once for
|
|
65
|
+
* all selected subjects instead of fanning out one listForRecall call per
|
|
66
|
+
* subject. Chunked at 500 subjects per query because SQLite's default
|
|
67
|
+
* host-parameter limit is 999 and the tenant param takes one slot. No SQL
|
|
68
|
+
* ORDER BY: chunk boundaries don't align with the requested subject/date
|
|
69
|
+
* order, so the concatenated rows are sorted once in JS afterward instead.
|
|
70
|
+
*/
|
|
71
|
+
listBySubjects(tenantId: string, subjects: ReadonlyArray<string>): Promise<ReadonlyArray<Fact>>;
|
|
48
72
|
/**
|
|
49
73
|
* Insert (or replace) the embedding row for a fact. Best-effort: callers
|
|
50
74
|
* trap embedder errors so an unreachable Ollama doesn't roll back ingest.
|
|
51
|
-
* vec0 doesn't UPDATE, so this is a DELETE+INSERT pair.
|
|
75
|
+
* vec0 doesn't UPDATE, so this is a DELETE+INSERT pair. Guarded by a
|
|
76
|
+
* tenant-scoped existence check — writing an embedding for a fact outside
|
|
77
|
+
* the caller's tenant is a no-op, not a fallthrough write.
|
|
52
78
|
*/
|
|
53
|
-
upsertEmbedding(factId: string, vector: Float32Array): Promise<void>;
|
|
54
|
-
markSuperseded(oldId: string, newId: string | null): Promise<void>;
|
|
55
|
-
retire(factId: string): Promise<void>;
|
|
56
|
-
ingestSessionFacts(sessionId: string, facts: ReadonlyArray<Fact>): Promise<void>;
|
|
79
|
+
upsertEmbedding(tenantId: string, factId: string, vector: Float32Array): Promise<void>;
|
|
80
|
+
markSuperseded(tenantId: string, oldId: string, newId: string | null): Promise<void>;
|
|
81
|
+
retire(tenantId: string, factId: string): Promise<void>;
|
|
82
|
+
ingestSessionFacts(tenantId: string, sessionId: string, facts: ReadonlyArray<Fact>): Promise<void>;
|
|
57
83
|
/**
|
|
58
84
|
* Sync core of ingestSessionFacts, callable from inside an existing
|
|
59
85
|
* better-sqlite3 transaction. SINGLE SOURCE OF TRUTH for the replace +
|
|
@@ -64,7 +90,7 @@ export declare class SqliteFactStore implements FactStore {
|
|
|
64
90
|
* originally landed only here and silently skipped the inlined copies — the
|
|
65
91
|
* path production actually uses — leaving both bugs live in production.
|
|
66
92
|
*/
|
|
67
|
-
ingestSessionFactsInTxn(sessionId: string, facts: ReadonlyArray<Fact>, scope?: string | null): void;
|
|
93
|
+
ingestSessionFactsInTxn(tenantId: string, sessionId: string, facts: ReadonlyArray<Fact>, scope?: string | null): void;
|
|
68
94
|
private insertStmt;
|
|
69
95
|
private toRow;
|
|
70
96
|
private rowToFact;
|