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
|
@@ -2,20 +2,27 @@
|
|
|
2
2
|
* PgFactStore — FactStore implementation over pg.Pool + pgvector.
|
|
3
3
|
*
|
|
4
4
|
* Receives its Pool from PgStorage. Never opens its own connection.
|
|
5
|
+
*
|
|
6
|
+
* Tenancy: mirrors SqliteFactStore — every method takes `tenantId` as its
|
|
7
|
+
* non-optional first parameter and routes STAMP-table WHERE fragments
|
|
8
|
+
* through `tenantClausePg`. See that file's header comment for the full
|
|
9
|
+
* per-table rationale, including the vector-path re-resolution in
|
|
10
|
+
* semanticSearch.
|
|
5
11
|
*/
|
|
6
12
|
import { ingestSessionFactsOnClient } from "./pg-fact-ingest.js";
|
|
13
|
+
import { tenantClausePg } from "../tenancy/tenant-clause.js";
|
|
7
14
|
export class PgFactStore {
|
|
8
15
|
pool;
|
|
9
16
|
constructor(pool) {
|
|
10
17
|
this.pool = pool;
|
|
11
18
|
}
|
|
12
|
-
async insert(fact) {
|
|
19
|
+
async insert(tenantId, fact) {
|
|
13
20
|
await this.pool.query(`INSERT INTO facts (id, kind, subject, predicate, value, source_session_id,
|
|
14
|
-
source_quote, created_at, superseded_by, confidence)
|
|
15
|
-
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)`, [fact.id, fact.kind, fact.subject, fact.predicate, fact.value,
|
|
16
|
-
fact.sourceSessionId, fact.sourceQuote, fact.createdAt, fact.supersededBy, fact.confidence]);
|
|
21
|
+
source_quote, created_at, superseded_by, confidence, tenant_id)
|
|
22
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)`, [fact.id, fact.kind, fact.subject, fact.predicate, fact.value,
|
|
23
|
+
fact.sourceSessionId, fact.sourceQuote, fact.createdAt, fact.supersededBy, fact.confidence, tenantId]);
|
|
17
24
|
}
|
|
18
|
-
async insertMany(facts) {
|
|
25
|
+
async insertMany(tenantId, facts) {
|
|
19
26
|
if (facts.length === 0)
|
|
20
27
|
return;
|
|
21
28
|
const client = await this.pool.connect();
|
|
@@ -23,9 +30,9 @@ export class PgFactStore {
|
|
|
23
30
|
await client.query("BEGIN");
|
|
24
31
|
for (const f of facts) {
|
|
25
32
|
await client.query(`INSERT INTO facts (id, kind, subject, predicate, value, source_session_id,
|
|
26
|
-
source_quote, created_at, superseded_by, confidence)
|
|
27
|
-
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)`, [f.id, f.kind, f.subject, f.predicate, f.value,
|
|
28
|
-
f.sourceSessionId, f.sourceQuote, f.createdAt, f.supersededBy, f.confidence]);
|
|
33
|
+
source_quote, created_at, superseded_by, confidence, tenant_id)
|
|
34
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)`, [f.id, f.kind, f.subject, f.predicate, f.value,
|
|
35
|
+
f.sourceSessionId, f.sourceQuote, f.createdAt, f.supersededBy, f.confidence, tenantId]);
|
|
29
36
|
}
|
|
30
37
|
await client.query("COMMIT");
|
|
31
38
|
}
|
|
@@ -37,30 +44,33 @@ export class PgFactStore {
|
|
|
37
44
|
client.release();
|
|
38
45
|
}
|
|
39
46
|
}
|
|
40
|
-
async getById(id) {
|
|
47
|
+
async getById(tenantId, id) {
|
|
48
|
+
const tc = tenantClausePg(tenantId, 2);
|
|
41
49
|
const result = await this.pool.query(`SELECT id, kind, subject, predicate, value, source_session_id,
|
|
42
50
|
source_quote, created_at, superseded_by, confidence, retired_at
|
|
43
|
-
FROM facts WHERE id = $1`, [id]);
|
|
51
|
+
FROM facts WHERE id = $1 AND ${tc.sql}`, [id, tc.param]);
|
|
44
52
|
return result.rows[0] ? rowToFact(result.rows[0]) : null;
|
|
45
53
|
}
|
|
46
|
-
async getByIds(ids) {
|
|
54
|
+
async getByIds(tenantId, ids) {
|
|
47
55
|
if (ids.length === 0)
|
|
48
56
|
return [];
|
|
57
|
+
const tc = tenantClausePg(tenantId, 2);
|
|
49
58
|
const result = await this.pool.query(`SELECT id, kind, subject, predicate, value, source_session_id,
|
|
50
59
|
source_quote, created_at, superseded_by, confidence, retired_at
|
|
51
|
-
FROM facts WHERE id = ANY($1)`, [ids]);
|
|
60
|
+
FROM facts WHERE id = ANY($1) AND ${tc.sql}`, [ids, tc.param]);
|
|
52
61
|
return result.rows.map(rowToFact);
|
|
53
62
|
}
|
|
54
|
-
async findCurrent(subject, predicate) {
|
|
63
|
+
async findCurrent(tenantId, subject, predicate) {
|
|
64
|
+
const tc = tenantClausePg(tenantId, 3);
|
|
55
65
|
const result = await this.pool.query(`SELECT id, kind, subject, predicate, value, source_session_id,
|
|
56
66
|
source_quote, created_at, superseded_by, confidence, retired_at
|
|
57
67
|
FROM facts
|
|
58
|
-
WHERE subject = $1 AND predicate = $2 AND superseded_by IS NULL AND retired_at IS NULL
|
|
68
|
+
WHERE subject = $1 AND predicate = $2 AND superseded_by IS NULL AND retired_at IS NULL AND ${tc.sql}
|
|
59
69
|
ORDER BY created_at DESC
|
|
60
|
-
LIMIT 1`, [subject, predicate]);
|
|
70
|
+
LIMIT 1`, [subject, predicate, tc.param]);
|
|
61
71
|
return result.rows[0] ? rowToFact(result.rows[0]) : null;
|
|
62
72
|
}
|
|
63
|
-
async list(query) {
|
|
73
|
+
async list(tenantId, query) {
|
|
64
74
|
const limit = Math.max(1, Math.trunc(query.limit ?? 50));
|
|
65
75
|
const includeSuperseded = query.includeSuperseded === true;
|
|
66
76
|
const where = ["subject = $1"];
|
|
@@ -74,6 +84,9 @@ export class PgFactStore {
|
|
|
74
84
|
where.push("superseded_by IS NULL");
|
|
75
85
|
where.push("retired_at IS NULL");
|
|
76
86
|
}
|
|
87
|
+
const tc = tenantClausePg(tenantId, idx++);
|
|
88
|
+
where.push(tc.sql);
|
|
89
|
+
params.push(tc.param);
|
|
77
90
|
params.push(limit);
|
|
78
91
|
const result = await this.pool.query(`SELECT id, kind, subject, predicate, value, source_session_id,
|
|
79
92
|
source_quote, created_at, superseded_by, confidence, retired_at
|
|
@@ -83,25 +96,27 @@ export class PgFactStore {
|
|
|
83
96
|
LIMIT $${idx}`, params);
|
|
84
97
|
return result.rows.map(rowToFact);
|
|
85
98
|
}
|
|
86
|
-
async listBySession(sessionId) {
|
|
99
|
+
async listBySession(tenantId, sessionId) {
|
|
100
|
+
const tc = tenantClausePg(tenantId, 2);
|
|
87
101
|
const result = await this.pool.query(`SELECT id, kind, subject, predicate, value, source_session_id,
|
|
88
102
|
source_quote, created_at, superseded_by, confidence, retired_at
|
|
89
103
|
FROM facts
|
|
90
|
-
WHERE source_session_id = $1
|
|
91
|
-
ORDER BY created_at ASC`, [sessionId]);
|
|
104
|
+
WHERE source_session_id = $1 AND ${tc.sql}
|
|
105
|
+
ORDER BY created_at ASC`, [sessionId, tc.param]);
|
|
92
106
|
return result.rows.map(rowToFact);
|
|
93
107
|
}
|
|
94
|
-
async listBySessions(sessionIds, opts) {
|
|
108
|
+
async listBySessions(tenantId, sessionIds, opts) {
|
|
95
109
|
if (sessionIds.length === 0)
|
|
96
110
|
return [];
|
|
97
111
|
const ph = sessionIds.map((_, i) => `$${i + 1}`).join(",");
|
|
98
112
|
const filter = opts?.includeSuperseded === true ? "" : " AND superseded_by IS NULL AND retired_at IS NULL";
|
|
113
|
+
const tc = tenantClausePg(tenantId, sessionIds.length + 1);
|
|
99
114
|
const result = await this.pool.query(`SELECT id, kind, subject, predicate, value, source_session_id,
|
|
100
115
|
source_quote, created_at, superseded_by, confidence, retired_at
|
|
101
|
-
FROM facts WHERE source_session_id IN (${ph})${filter} ORDER BY created_at ASC`, [...sessionIds]);
|
|
116
|
+
FROM facts WHERE source_session_id IN (${ph}) AND ${tc.sql}${filter} ORDER BY created_at ASC`, [...sessionIds, tc.param]);
|
|
102
117
|
return result.rows.map(rowToFact);
|
|
103
118
|
}
|
|
104
|
-
async listForRecall(filter) {
|
|
119
|
+
async listForRecall(tenantId, filter) {
|
|
105
120
|
const where = [];
|
|
106
121
|
const params = [];
|
|
107
122
|
let idx = 1;
|
|
@@ -125,6 +140,9 @@ export class PgFactStore {
|
|
|
125
140
|
where.push("superseded_by IS NULL");
|
|
126
141
|
where.push("retired_at IS NULL");
|
|
127
142
|
}
|
|
143
|
+
const tc = tenantClausePg(tenantId, idx++);
|
|
144
|
+
where.push(tc.sql);
|
|
145
|
+
params.push(tc.param);
|
|
128
146
|
const limit = Math.max(1, Math.trunc(filter.limit ?? 500));
|
|
129
147
|
params.push(limit);
|
|
130
148
|
const sql = `
|
|
@@ -138,22 +156,25 @@ export class PgFactStore {
|
|
|
138
156
|
const result = await this.pool.query(sql, params);
|
|
139
157
|
return result.rows.map(rowToFact);
|
|
140
158
|
}
|
|
141
|
-
async markSuperseded(oldId, newId) {
|
|
159
|
+
async markSuperseded(tenantId, oldId, newId) {
|
|
142
160
|
if (newId !== null && oldId === newId) {
|
|
143
161
|
throw new Error("A fact cannot supersede itself");
|
|
144
162
|
}
|
|
145
163
|
const client = await this.pool.connect();
|
|
146
164
|
try {
|
|
147
165
|
await client.query("BEGIN");
|
|
148
|
-
const
|
|
166
|
+
const oldTc = tenantClausePg(tenantId, 2);
|
|
167
|
+
const old = await client.query(`SELECT id FROM facts WHERE id = $1 AND ${oldTc.sql}`, [oldId, oldTc.param]);
|
|
149
168
|
if (old.rows.length === 0)
|
|
150
169
|
throw new Error(`Fact ${oldId} not found`);
|
|
151
170
|
if (newId !== null) {
|
|
152
|
-
const
|
|
171
|
+
const newTc = tenantClausePg(tenantId, 2);
|
|
172
|
+
const next = await client.query(`SELECT id FROM facts WHERE id = $1 AND ${newTc.sql}`, [newId, newTc.param]);
|
|
153
173
|
if (next.rows.length === 0)
|
|
154
174
|
throw new Error(`Fact ${newId} not found`);
|
|
155
175
|
}
|
|
156
|
-
|
|
176
|
+
const updateTc = tenantClausePg(tenantId, 3);
|
|
177
|
+
await client.query(`UPDATE facts SET superseded_by = $1 WHERE id = $2 AND ${updateTc.sql}`, [newId, oldId, updateTc.param]);
|
|
157
178
|
// Superseded facts leave the ANN index (parity with SQLite + retire); a
|
|
158
179
|
// lingering embedding silently reduces effective recall (NLM #351).
|
|
159
180
|
if (newId !== null) {
|
|
@@ -169,14 +190,16 @@ export class PgFactStore {
|
|
|
169
190
|
client.release();
|
|
170
191
|
}
|
|
171
192
|
}
|
|
172
|
-
async retire(factId) {
|
|
193
|
+
async retire(tenantId, factId) {
|
|
173
194
|
const client = await this.pool.connect();
|
|
174
195
|
try {
|
|
175
196
|
await client.query("BEGIN");
|
|
176
|
-
const
|
|
197
|
+
const rowTc = tenantClausePg(tenantId, 2);
|
|
198
|
+
const row = await client.query(`SELECT id FROM facts WHERE id = $1 AND ${rowTc.sql}`, [factId, rowTc.param]);
|
|
177
199
|
if (row.rows.length === 0)
|
|
178
200
|
throw new Error(`Fact ${factId} not found`);
|
|
179
|
-
|
|
201
|
+
const updateTc = tenantClausePg(tenantId, 3);
|
|
202
|
+
await client.query(`UPDATE facts SET retired_at = $1 WHERE id = $2 AND ${updateTc.sql}`, [new Date().toISOString(), factId, updateTc.param]);
|
|
180
203
|
await client.query("DELETE FROM fact_embeddings WHERE fact_id = $1", [factId]);
|
|
181
204
|
await client.query("COMMIT");
|
|
182
205
|
}
|
|
@@ -188,11 +211,11 @@ export class PgFactStore {
|
|
|
188
211
|
client.release();
|
|
189
212
|
}
|
|
190
213
|
}
|
|
191
|
-
async ingestSessionFacts(sessionId, facts) {
|
|
214
|
+
async ingestSessionFacts(tenantId, sessionId, facts) {
|
|
192
215
|
const client = await this.pool.connect();
|
|
193
216
|
try {
|
|
194
217
|
await client.query("BEGIN");
|
|
195
|
-
await ingestSessionFactsOnClient(client, sessionId, facts);
|
|
218
|
+
await ingestSessionFactsOnClient(client, tenantId, sessionId, facts);
|
|
196
219
|
await client.query("COMMIT");
|
|
197
220
|
}
|
|
198
221
|
catch (err) {
|
|
@@ -203,33 +226,53 @@ export class PgFactStore {
|
|
|
203
226
|
client.release();
|
|
204
227
|
}
|
|
205
228
|
}
|
|
206
|
-
|
|
229
|
+
/**
|
|
230
|
+
* Guarded by a tenant-scoped existence check — writing an embedding for a
|
|
231
|
+
* fact outside the caller's tenant is a no-op, not a fallthrough write.
|
|
232
|
+
*/
|
|
233
|
+
async upsertEmbedding(tenantId, factId, vector) {
|
|
234
|
+
const tc = tenantClausePg(tenantId, 2);
|
|
235
|
+
const owned = await this.pool.query(`SELECT id FROM facts WHERE id = $1 AND ${tc.sql}`, [factId, tc.param]);
|
|
236
|
+
if (owned.rows.length === 0)
|
|
237
|
+
return;
|
|
207
238
|
const vecStr = `[${Array.from(vector).join(",")}]`;
|
|
208
239
|
await this.pool.query(`INSERT INTO fact_embeddings (fact_id, embedding)
|
|
209
240
|
VALUES ($1, $2::vector)
|
|
210
241
|
ON CONFLICT (fact_id) DO UPDATE SET embedding = EXCLUDED.embedding`, [factId, vecStr]);
|
|
211
242
|
}
|
|
212
|
-
async semanticSearch(queryVector, limit) {
|
|
243
|
+
async semanticSearch(tenantId, queryVector, limit) {
|
|
213
244
|
const k = Math.max(1, Math.trunc(limit));
|
|
214
245
|
const vecStr = `[${Array.from(queryVector).join(",")}]`;
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
246
|
+
// Tenant filter applied in the id-resolution join against `facts`
|
|
247
|
+
// (program spec §4.3, vector-path rule) — fact_embeddings carries no
|
|
248
|
+
// tenant_id of its own.
|
|
249
|
+
const tc = tenantClausePg(tenantId, 2);
|
|
250
|
+
const result = await this.pool.query(`SELECT fe.fact_id, fe.embedding <-> $1::vector AS distance
|
|
251
|
+
FROM fact_embeddings fe
|
|
252
|
+
JOIN facts f ON f.id = fe.fact_id
|
|
253
|
+
WHERE ${tc.sql}
|
|
254
|
+
ORDER BY fe.embedding <-> $1::vector
|
|
255
|
+
LIMIT $3`, [vecStr, tc.param, k]);
|
|
219
256
|
return result.rows.map((r) => ({ factId: r.fact_id, distance: r.distance }));
|
|
220
257
|
}
|
|
221
|
-
async getHistory(subject, predicate) {
|
|
258
|
+
async getHistory(tenantId, subject, predicate) {
|
|
222
259
|
const result = predicate
|
|
223
|
-
? await this.pool.query(
|
|
260
|
+
? await this.pool.query((() => {
|
|
261
|
+
const tc = tenantClausePg(tenantId, 3);
|
|
262
|
+
return `SELECT id, kind, subject, predicate, value, source_session_id,
|
|
224
263
|
source_quote, created_at, superseded_by, confidence, retired_at
|
|
225
264
|
FROM facts
|
|
226
|
-
WHERE subject = $1 AND predicate = $2
|
|
227
|
-
ORDER BY predicate ASC, created_at DESC
|
|
228
|
-
|
|
265
|
+
WHERE subject = $1 AND predicate = $2 AND ${tc.sql}
|
|
266
|
+
ORDER BY predicate ASC, created_at DESC`;
|
|
267
|
+
})(), [subject, predicate, tenantId])
|
|
268
|
+
: await this.pool.query((() => {
|
|
269
|
+
const tc = tenantClausePg(tenantId, 2);
|
|
270
|
+
return `SELECT id, kind, subject, predicate, value, source_session_id,
|
|
229
271
|
source_quote, created_at, superseded_by, confidence, retired_at
|
|
230
272
|
FROM facts
|
|
231
|
-
WHERE subject = $1
|
|
232
|
-
ORDER BY predicate ASC, created_at DESC
|
|
273
|
+
WHERE subject = $1 AND ${tc.sql}
|
|
274
|
+
ORDER BY predicate ASC, created_at DESC`;
|
|
275
|
+
})(), [subject, tenantId]);
|
|
233
276
|
const byPred = new Map();
|
|
234
277
|
for (const row of result.rows) {
|
|
235
278
|
const fact = rowToFact(row);
|
|
@@ -241,7 +284,7 @@ export class PgFactStore {
|
|
|
241
284
|
}
|
|
242
285
|
return [...byPred.entries()].map(([pred, history]) => ({ subject, predicate: pred, history }));
|
|
243
286
|
}
|
|
244
|
-
async corroborationCounts(triples) {
|
|
287
|
+
async corroborationCounts(tenantId, triples) {
|
|
245
288
|
const out = new Map();
|
|
246
289
|
if (triples.length === 0)
|
|
247
290
|
return out;
|
|
@@ -253,6 +296,7 @@ export class PgFactStore {
|
|
|
253
296
|
values.push(`($${base + 1}, $${base + 2}, $${base + 3})`);
|
|
254
297
|
args.push(t.subject, t.predicate, t.value);
|
|
255
298
|
}
|
|
299
|
+
const tc = tenantClausePg(tenantId, args.length + 1, "f.tenant_id");
|
|
256
300
|
const sql = `
|
|
257
301
|
WITH q(subject, predicate, value) AS (VALUES ${values.join(", ")})
|
|
258
302
|
SELECT q.subject, q.predicate, q.value,
|
|
@@ -262,14 +306,23 @@ export class PgFactStore {
|
|
|
262
306
|
ON f.subject = q.subject
|
|
263
307
|
AND f.predicate = q.predicate
|
|
264
308
|
AND f.value = q.value
|
|
309
|
+
AND ${tc.sql}
|
|
265
310
|
GROUP BY q.subject, q.predicate, q.value
|
|
266
311
|
`;
|
|
267
|
-
const result = await this.pool.query(sql, args);
|
|
312
|
+
const result = await this.pool.query(sql, [...args, tenantId]);
|
|
268
313
|
for (const r of result.rows) {
|
|
269
314
|
out.set(`${r.subject} ${r.predicate} ${r.value}`, r.session_count);
|
|
270
315
|
}
|
|
271
316
|
return out;
|
|
272
317
|
}
|
|
318
|
+
async listSubjectStats(_tenantId) {
|
|
319
|
+
throw new Error("listSubjectStats is not implemented on the Postgres backend; the wiki " +
|
|
320
|
+
"projection is SQLite-only and the daemon does not start it under PgStorage");
|
|
321
|
+
}
|
|
322
|
+
async listBySubjects(_tenantId, _subjects) {
|
|
323
|
+
throw new Error("listBySubjects is not implemented on the Postgres backend; the wiki " +
|
|
324
|
+
"projection is SQLite-only and the daemon does not start it under PgStorage");
|
|
325
|
+
}
|
|
273
326
|
}
|
|
274
327
|
function rowToFact(row) {
|
|
275
328
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pg-fact-store.js","sourceRoot":"","sources":["../../../src/core/storage/pg-fact-store.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pg-fact-store.js","sourceRoot":"","sources":["../../../src/core/storage/pg-fact-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PgLearnerStore — LearnerStore implementation over pg.Pool.
|
|
3
|
+
*
|
|
4
|
+
* Receives its Pool from PgStorage. Never opens its own connection.
|
|
5
|
+
*
|
|
6
|
+
* Tenancy: mirrors SqliteLearnerStore — every method takes `tenantId` as its
|
|
7
|
+
* non-optional first parameter and routes STAMP-table WHERE fragments through
|
|
8
|
+
* `tenantClausePg`. JSON columns are JSONB (node-postgres parses them); the
|
|
9
|
+
* row readers accept both parsed objects and strings so the two backends stay
|
|
10
|
+
* behaviorally identical.
|
|
11
|
+
*/
|
|
12
|
+
import type { Pool } from "pg";
|
|
13
|
+
import type { EnrollmentInput, LearnerInit, LearnerStore, LearningEventInput, RecordResult } from "../../ports/learner-store.js";
|
|
14
|
+
import type { Enrollment, Learner, LearningEvent } from "../learner/model.js";
|
|
15
|
+
export declare class PgLearnerStore implements LearnerStore {
|
|
16
|
+
private readonly pool;
|
|
17
|
+
constructor(pool: Pool);
|
|
18
|
+
initLearner(tenantId: string, input: LearnerInit): Promise<void>;
|
|
19
|
+
getLearner(tenantId: string, id: string): Promise<Learner | null>;
|
|
20
|
+
enroll(tenantId: string, input: EnrollmentInput): Promise<Enrollment>;
|
|
21
|
+
getEnrollment(tenantId: string, learnerId: string, courseId: string): Promise<Enrollment | null>;
|
|
22
|
+
listEnrollments(tenantId: string, learnerId: string): Promise<ReadonlyArray<Enrollment>>;
|
|
23
|
+
listEnrollmentsByWorkstreams(tenantId: string, workstreamIds: ReadonlyArray<string>): Promise<ReadonlyArray<Enrollment>>;
|
|
24
|
+
recordEvent(tenantId: string, learnerId: string, courseId: string, event: LearningEventInput): Promise<RecordResult>;
|
|
25
|
+
listEvents(tenantId: string, learnerId: string, courseId: string): Promise<ReadonlyArray<LearningEvent>>;
|
|
26
|
+
completeCourse(tenantId: string, learnerId: string, courseId: string): Promise<void>;
|
|
27
|
+
}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PgLearnerStore — LearnerStore implementation over pg.Pool.
|
|
3
|
+
*
|
|
4
|
+
* Receives its Pool from PgStorage. Never opens its own connection.
|
|
5
|
+
*
|
|
6
|
+
* Tenancy: mirrors SqliteLearnerStore — every method takes `tenantId` as its
|
|
7
|
+
* non-optional first parameter and routes STAMP-table WHERE fragments through
|
|
8
|
+
* `tenantClausePg`. JSON columns are JSONB (node-postgres parses them); the
|
|
9
|
+
* row readers accept both parsed objects and strings so the two backends stay
|
|
10
|
+
* behaviorally identical.
|
|
11
|
+
*/
|
|
12
|
+
import { learningEventContentEqual, makeEnrollmentId } from "../learner/model.js";
|
|
13
|
+
import { tenantClausePg } from "../tenancy/tenant-clause.js";
|
|
14
|
+
function parseJson(value) {
|
|
15
|
+
return typeof value === "string" ? JSON.parse(value) : value;
|
|
16
|
+
}
|
|
17
|
+
function learnerFromRow(row) {
|
|
18
|
+
return {
|
|
19
|
+
id: row.id,
|
|
20
|
+
label: row.label,
|
|
21
|
+
profile: parseJson(row.profile_json),
|
|
22
|
+
createdAt: row.created_at,
|
|
23
|
+
updatedAt: row.updated_at,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function enrollmentFromRow(row) {
|
|
27
|
+
return {
|
|
28
|
+
id: row.id,
|
|
29
|
+
learnerId: row.learner_id,
|
|
30
|
+
courseId: row.course_id,
|
|
31
|
+
workstreamId: row.workstream_id,
|
|
32
|
+
planRef: row.plan_ref,
|
|
33
|
+
planRevision: row.plan_revision,
|
|
34
|
+
planFingerprint: row.plan_fingerprint,
|
|
35
|
+
status: row.status,
|
|
36
|
+
completionHistory: parseJson(row.completion_history_json),
|
|
37
|
+
createdAt: row.created_at,
|
|
38
|
+
updatedAt: row.updated_at,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function eventFromRow(row) {
|
|
42
|
+
return {
|
|
43
|
+
id: row.id,
|
|
44
|
+
date: row.date,
|
|
45
|
+
covered: parseJson(row.covered_json),
|
|
46
|
+
attempts: parseJson(row.attempts_json),
|
|
47
|
+
interpretation: row.interpretation,
|
|
48
|
+
nextStep: row.next_step,
|
|
49
|
+
createdAt: row.created_at,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const LEARNER_COLS = "id, label, profile_json, created_at, updated_at";
|
|
53
|
+
const ENROLLMENT_COLS = "id, learner_id, course_id, workstream_id, plan_ref, plan_revision, " +
|
|
54
|
+
"plan_fingerprint, status, completion_history_json, created_at, updated_at";
|
|
55
|
+
const EVENT_COLS = "id, date, covered_json, attempts_json, interpretation, next_step, created_at";
|
|
56
|
+
export class PgLearnerStore {
|
|
57
|
+
pool;
|
|
58
|
+
constructor(pool) {
|
|
59
|
+
this.pool = pool;
|
|
60
|
+
}
|
|
61
|
+
async initLearner(tenantId, input) {
|
|
62
|
+
await this.pool.query("INSERT INTO learners (id, label, profile_json, tenant_id) VALUES ($1, $2, $3, $4)", [input.id, input.label, JSON.stringify(input.profile ?? {}), tenantId]);
|
|
63
|
+
}
|
|
64
|
+
async getLearner(tenantId, id) {
|
|
65
|
+
const tc = tenantClausePg(tenantId, 2);
|
|
66
|
+
const result = await this.pool.query(`SELECT ${LEARNER_COLS} FROM learners WHERE id = $1 AND ${tc.sql}`, [id, tc.param]);
|
|
67
|
+
return result.rows[0] ? learnerFromRow(result.rows[0]) : null;
|
|
68
|
+
}
|
|
69
|
+
async enroll(tenantId, input) {
|
|
70
|
+
const client = await this.pool.connect();
|
|
71
|
+
try {
|
|
72
|
+
await client.query("BEGIN");
|
|
73
|
+
const tc = tenantClausePg(tenantId, 3);
|
|
74
|
+
const existing = await client.query(`SELECT ${ENROLLMENT_COLS} FROM enrollments WHERE learner_id = $1 AND course_id = $2 AND ${tc.sql}`, [input.learnerId, input.courseId, tc.param]);
|
|
75
|
+
if (existing.rows[0]) {
|
|
76
|
+
const row = existing.rows[0];
|
|
77
|
+
if (row.plan_fingerprint !== input.planFingerprint || row.plan_revision !== input.planRevision) {
|
|
78
|
+
throw new Error(`enroll: plan changed for ${input.learnerId}/${input.courseId} ` +
|
|
79
|
+
"(rev differs) — reconcile explicitly, refusing silent upsert");
|
|
80
|
+
}
|
|
81
|
+
await client.query("COMMIT");
|
|
82
|
+
return enrollmentFromRow(row);
|
|
83
|
+
}
|
|
84
|
+
const id = makeEnrollmentId();
|
|
85
|
+
await client.query(`INSERT INTO enrollments (id, learner_id, course_id, workstream_id, plan_ref,
|
|
86
|
+
plan_revision, plan_fingerprint, tenant_id)
|
|
87
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)`, [id, input.learnerId, input.courseId, input.workstreamId,
|
|
88
|
+
input.planRef, input.planRevision, input.planFingerprint, tenantId]);
|
|
89
|
+
const inserted = await client.query(`SELECT ${ENROLLMENT_COLS} FROM enrollments WHERE id = $1 AND ${tenantClausePg(tenantId, 2).sql}`, [id, tenantId]);
|
|
90
|
+
await client.query("COMMIT");
|
|
91
|
+
return enrollmentFromRow(inserted.rows[0]);
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
await client.query("ROLLBACK");
|
|
95
|
+
throw err;
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
client.release();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async getEnrollment(tenantId, learnerId, courseId) {
|
|
102
|
+
const tc = tenantClausePg(tenantId, 3);
|
|
103
|
+
const result = await this.pool.query(`SELECT ${ENROLLMENT_COLS} FROM enrollments WHERE learner_id = $1 AND course_id = $2 AND ${tc.sql}`, [learnerId, courseId, tc.param]);
|
|
104
|
+
return result.rows[0] ? enrollmentFromRow(result.rows[0]) : null;
|
|
105
|
+
}
|
|
106
|
+
async listEnrollments(tenantId, learnerId) {
|
|
107
|
+
const tc = tenantClausePg(tenantId, 2);
|
|
108
|
+
const result = await this.pool.query(`SELECT ${ENROLLMENT_COLS} FROM enrollments WHERE learner_id = $1 AND ${tc.sql} ORDER BY course_id ASC`, [learnerId, tc.param]);
|
|
109
|
+
return result.rows.map(enrollmentFromRow);
|
|
110
|
+
}
|
|
111
|
+
async listEnrollmentsByWorkstreams(tenantId, workstreamIds) {
|
|
112
|
+
if (workstreamIds.length === 0)
|
|
113
|
+
return [];
|
|
114
|
+
const tc = tenantClausePg(tenantId, 2);
|
|
115
|
+
const result = await this.pool.query(`SELECT ${ENROLLMENT_COLS} FROM enrollments WHERE workstream_id = ANY($1) AND ${tc.sql}`, [[...workstreamIds], tc.param]);
|
|
116
|
+
return result.rows.map(enrollmentFromRow);
|
|
117
|
+
}
|
|
118
|
+
async recordEvent(tenantId, learnerId, courseId, event) {
|
|
119
|
+
const client = await this.pool.connect();
|
|
120
|
+
try {
|
|
121
|
+
await client.query("BEGIN");
|
|
122
|
+
const enrTc = tenantClausePg(tenantId, 3);
|
|
123
|
+
const enrollment = await client.query(`SELECT ${ENROLLMENT_COLS} FROM enrollments WHERE learner_id = $1 AND course_id = $2 AND ${enrTc.sql}`, [learnerId, courseId, enrTc.param]);
|
|
124
|
+
if (!enrollment.rows[0])
|
|
125
|
+
throw new Error(`recordEvent: no enrollment for ${learnerId}/${courseId}`);
|
|
126
|
+
const evTc = tenantClausePg(tenantId, 3);
|
|
127
|
+
const existing = await client.query(`SELECT ${EVENT_COLS} FROM learning_events WHERE enrollment_id = $1 AND id = $2 AND ${evTc.sql}`, [enrollment.rows[0].id, event.id, evTc.param]);
|
|
128
|
+
if (!existing.rows[0]) {
|
|
129
|
+
await client.query(`INSERT INTO learning_events (id, enrollment_id, date, covered_json, attempts_json,
|
|
130
|
+
interpretation, next_step, tenant_id)
|
|
131
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)`, [event.id, enrollment.rows[0].id, event.date, JSON.stringify(event.covered),
|
|
132
|
+
JSON.stringify(event.attempts), event.interpretation, event.nextStep, tenantId]);
|
|
133
|
+
await client.query("COMMIT");
|
|
134
|
+
return "inserted";
|
|
135
|
+
}
|
|
136
|
+
const row = existing.rows[0];
|
|
137
|
+
const same = learningEventContentEqual(event, {
|
|
138
|
+
date: row.date,
|
|
139
|
+
covered: parseJson(row.covered_json),
|
|
140
|
+
attempts: parseJson(row.attempts_json),
|
|
141
|
+
interpretation: row.interpretation,
|
|
142
|
+
nextStep: row.next_step,
|
|
143
|
+
});
|
|
144
|
+
if (!same)
|
|
145
|
+
throw new Error(`recordEvent: conflicting event id ${event.id} — refusing to rewrite history`);
|
|
146
|
+
await client.query("COMMIT");
|
|
147
|
+
return "noop";
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
await client.query("ROLLBACK");
|
|
151
|
+
throw err;
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
client.release();
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
async listEvents(tenantId, learnerId, courseId) {
|
|
158
|
+
const enrollment = await this.getEnrollment(tenantId, learnerId, courseId);
|
|
159
|
+
if (!enrollment)
|
|
160
|
+
return [];
|
|
161
|
+
const tc = tenantClausePg(tenantId, 2);
|
|
162
|
+
const result = await this.pool.query(`SELECT ${EVENT_COLS} FROM learning_events WHERE enrollment_id = $1 AND ${tc.sql} ` +
|
|
163
|
+
"ORDER BY date ASC, id ASC", [enrollment.id, tc.param]);
|
|
164
|
+
return result.rows.map(eventFromRow);
|
|
165
|
+
}
|
|
166
|
+
async completeCourse(tenantId, learnerId, courseId) {
|
|
167
|
+
const enrollment = await this.getEnrollment(tenantId, learnerId, courseId);
|
|
168
|
+
if (!enrollment)
|
|
169
|
+
throw new Error(`completeCourse: no enrollment for ${learnerId}/${courseId}`);
|
|
170
|
+
const tc = tenantClausePg(tenantId, 2);
|
|
171
|
+
await this.pool.query(`UPDATE enrollments SET status = 'completed', updated_at = NOW() WHERE id = $1 AND ${tc.sql}`, [enrollment.id, tc.param]);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=pg-learner-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pg-learner-store.js","sourceRoot":"","sources":["../../../src/core/storage/pg-learner-store.ts"],"names":[],"mappings":"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"}
|