nlm-memory 0.21.0 → 0.21.12
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 +45 -13
- 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
package/dist/ui/index.html
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>nlm memory</title>
|
|
7
|
-
<script type="module" crossorigin src="/ui/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/ui/assets/index-D6F3xAis.js"></script>
|
|
8
8
|
<link rel="stylesheet" crossorigin href="/ui/assets/index-DSzo1eTD.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
-- nlm:no-wrap
|
|
2
|
+
-- Migration 033: CHECK constraint on actions.kind (#294).
|
|
3
|
+
--
|
|
4
|
+
-- actions.kind has been a freeform TEXT column since 000_initial_schema;
|
|
5
|
+
-- the overlay reducer (src/core/actions/overlay.ts) only ever recognizes a
|
|
6
|
+
-- fixed set, and unknown kinds silently no-op there instead of failing at
|
|
7
|
+
-- write time. This constrains writes to the set the reducer actually
|
|
8
|
+
-- understands: dismiss, snooze, retire_entity, label_entity, rename_entity,
|
|
9
|
+
-- resolve_open, promote_open, dismiss_decision, revise_decision,
|
|
10
|
+
-- merge_entity, set_coherence, plus 'undo' (actions-log.ts's own revert
|
|
11
|
+
-- marker, subject_type 'action').
|
|
12
|
+
--
|
|
13
|
+
-- Adding a CHECK to an existing column requires a table rebuild (SQLite
|
|
14
|
+
-- cannot ALTER a CHECK constraint). Runs under foreign_keys=OFF, hence
|
|
15
|
+
-- nlm:no-wrap so the runner doesn't add its own BEGIN/COMMIT around this
|
|
16
|
+
-- file's own transaction (see migrations/019_split_replaces.sql for the
|
|
17
|
+
-- established precedent).
|
|
18
|
+
|
|
19
|
+
PRAGMA foreign_keys = OFF;
|
|
20
|
+
|
|
21
|
+
BEGIN;
|
|
22
|
+
|
|
23
|
+
CREATE TABLE actions_new (
|
|
24
|
+
id TEXT PRIMARY KEY,
|
|
25
|
+
timestamp TEXT NOT NULL,
|
|
26
|
+
kind TEXT NOT NULL CHECK(kind IN (
|
|
27
|
+
'dismiss', 'snooze', 'retire_entity', 'label_entity',
|
|
28
|
+
'rename_entity', 'resolve_open', 'promote_open',
|
|
29
|
+
'dismiss_decision', 'revise_decision', 'merge_entity',
|
|
30
|
+
'set_coherence', 'undo'
|
|
31
|
+
)),
|
|
32
|
+
subject_type TEXT NOT NULL,
|
|
33
|
+
subject_id TEXT NOT NULL,
|
|
34
|
+
payload TEXT,
|
|
35
|
+
actor TEXT NOT NULL DEFAULT 'user',
|
|
36
|
+
runtime TEXT,
|
|
37
|
+
reverted_by TEXT REFERENCES actions(id),
|
|
38
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
INSERT INTO actions_new
|
|
42
|
+
(id, timestamp, kind, subject_type, subject_id, payload, actor, runtime, reverted_by, created_at)
|
|
43
|
+
SELECT
|
|
44
|
+
id, timestamp, kind, subject_type, subject_id, payload, actor, runtime, reverted_by, created_at
|
|
45
|
+
FROM actions;
|
|
46
|
+
|
|
47
|
+
DROP TABLE actions;
|
|
48
|
+
ALTER TABLE actions_new RENAME TO actions;
|
|
49
|
+
|
|
50
|
+
CREATE INDEX IF NOT EXISTS idx_actions_subject ON actions(subject_type, subject_id);
|
|
51
|
+
CREATE INDEX IF NOT EXISTS idx_actions_kind ON actions(kind);
|
|
52
|
+
CREATE INDEX IF NOT EXISTS idx_actions_timestamp ON actions(timestamp DESC);
|
|
53
|
+
|
|
54
|
+
INSERT OR IGNORE INTO schema_migrations (version, name) VALUES (33, 'actions_kind_check');
|
|
55
|
+
|
|
56
|
+
COMMIT;
|
|
57
|
+
|
|
58
|
+
PRAGMA foreign_keys = ON;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
-- migrations/034_tenancy_teams_and_stamps.sql
|
|
2
|
+
-- M1 (Team NLM program spec §2): tenancy registry + tenant stamps.
|
|
3
|
+
-- sqlite lane: NOT NULL DEFAULT, no REFERENCES on ADD COLUMN (FKs enforced at
|
|
4
|
+
-- runtime; SQLite forbids ADD COLUMN + REFERENCES + non-NULL default).
|
|
5
|
+
-- Isolation is enforced at the store layer (M2), not by schema constraints.
|
|
6
|
+
|
|
7
|
+
CREATE TABLE IF NOT EXISTS teams (
|
|
8
|
+
id TEXT PRIMARY KEY,
|
|
9
|
+
name TEXT NOT NULL,
|
|
10
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
CREATE TABLE IF NOT EXISTS team_tokens (
|
|
14
|
+
token_hash TEXT PRIMARY KEY,
|
|
15
|
+
team_id TEXT NOT NULL REFERENCES teams(id),
|
|
16
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
17
|
+
revoked_at TEXT
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
CREATE INDEX IF NOT EXISTS idx_team_tokens_team ON team_tokens(team_id);
|
|
21
|
+
|
|
22
|
+
INSERT OR IGNORE INTO teams (id, name) VALUES ('team_local', 'Local operator team');
|
|
23
|
+
|
|
24
|
+
ALTER TABLE sessions ADD COLUMN tenant_id TEXT NOT NULL DEFAULT 'team_local';
|
|
25
|
+
ALTER TABLE facts ADD COLUMN tenant_id TEXT NOT NULL DEFAULT 'team_local';
|
|
26
|
+
ALTER TABLE code_exemplars ADD COLUMN tenant_id TEXT NOT NULL DEFAULT 'team_local';
|
|
27
|
+
ALTER TABLE signals ADD COLUMN tenant_id TEXT NOT NULL DEFAULT 'team_local';
|
|
28
|
+
ALTER TABLE workstreams ADD COLUMN tenant_id TEXT NOT NULL DEFAULT 'team_local';
|
|
29
|
+
ALTER TABLE sources ADD COLUMN tenant_id TEXT NOT NULL DEFAULT 'team_local';
|
|
30
|
+
ALTER TABLE providers ADD COLUMN tenant_id TEXT NOT NULL DEFAULT 'team_local';
|
|
31
|
+
|
|
32
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_tenant ON sessions(tenant_id);
|
|
33
|
+
CREATE INDEX IF NOT EXISTS idx_facts_tenant ON facts(tenant_id);
|
|
34
|
+
CREATE INDEX IF NOT EXISTS idx_code_exemplars_tenant ON code_exemplars(tenant_id);
|
|
35
|
+
CREATE INDEX IF NOT EXISTS idx_signals_tenant ON signals(tenant_id);
|
|
36
|
+
CREATE INDEX IF NOT EXISTS idx_workstreams_tenant ON workstreams(tenant_id);
|
|
37
|
+
CREATE INDEX IF NOT EXISTS idx_sources_tenant ON sources(tenant_id);
|
|
38
|
+
CREATE INDEX IF NOT EXISTS idx_providers_tenant ON providers(tenant_id);
|
|
39
|
+
|
|
40
|
+
INSERT OR IGNORE INTO schema_migrations (version, name) VALUES (34, 'tenancy_teams_and_stamps');
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
-- nlm:no-wrap
|
|
2
|
+
-- migrations/035_tenancy_entity_rekey.sql
|
|
3
|
+
-- M1 (Team NLM program spec §2): entities become tenant-local. Composite PK
|
|
4
|
+
-- (tenant_id, canonical); referencing tables re-keyed with composite FKs.
|
|
5
|
+
-- Table rebuild per the 010-015/033 convention: FKs off, own transaction.
|
|
6
|
+
|
|
7
|
+
PRAGMA foreign_keys = OFF;
|
|
8
|
+
BEGIN;
|
|
9
|
+
|
|
10
|
+
CREATE TABLE entities_new (
|
|
11
|
+
tenant_id TEXT NOT NULL DEFAULT 'team_local',
|
|
12
|
+
canonical TEXT NOT NULL,
|
|
13
|
+
type TEXT NOT NULL,
|
|
14
|
+
status TEXT NOT NULL CHECK(status IN ('active','dormant','retired','rejected','candidate')),
|
|
15
|
+
source TEXT,
|
|
16
|
+
notes TEXT,
|
|
17
|
+
first_seen_session TEXT REFERENCES sessions(id),
|
|
18
|
+
last_seen_session TEXT REFERENCES sessions(id),
|
|
19
|
+
session_count INTEGER NOT NULL DEFAULT 0,
|
|
20
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
21
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
22
|
+
PRIMARY KEY (tenant_id, canonical)
|
|
23
|
+
);
|
|
24
|
+
INSERT INTO entities_new (tenant_id, canonical, type, status, source, notes, first_seen_session, last_seen_session, session_count, created_at, updated_at)
|
|
25
|
+
SELECT 'team_local', canonical, type, status, source, notes, first_seen_session, last_seen_session, session_count, created_at, updated_at FROM entities;
|
|
26
|
+
DROP TABLE entities;
|
|
27
|
+
ALTER TABLE entities_new RENAME TO entities;
|
|
28
|
+
CREATE INDEX IF NOT EXISTS idx_entities_type ON entities(type);
|
|
29
|
+
CREATE INDEX IF NOT EXISTS idx_entities_status ON entities(status);
|
|
30
|
+
|
|
31
|
+
CREATE TABLE entity_variants_new (
|
|
32
|
+
tenant_id TEXT NOT NULL DEFAULT 'team_local',
|
|
33
|
+
variant TEXT NOT NULL,
|
|
34
|
+
canonical TEXT NOT NULL,
|
|
35
|
+
source_session_id TEXT REFERENCES sessions(id),
|
|
36
|
+
PRIMARY KEY (tenant_id, variant),
|
|
37
|
+
FOREIGN KEY (tenant_id, canonical) REFERENCES entities(tenant_id, canonical) ON DELETE CASCADE
|
|
38
|
+
);
|
|
39
|
+
INSERT INTO entity_variants_new (tenant_id, variant, canonical, source_session_id)
|
|
40
|
+
SELECT 'team_local', variant, canonical, source_session_id FROM entity_variants;
|
|
41
|
+
DROP TABLE entity_variants;
|
|
42
|
+
ALTER TABLE entity_variants_new RENAME TO entity_variants;
|
|
43
|
+
CREATE INDEX IF NOT EXISTS idx_entity_variants_canonical ON entity_variants(tenant_id, canonical);
|
|
44
|
+
|
|
45
|
+
CREATE TABLE session_entities_new (
|
|
46
|
+
tenant_id TEXT NOT NULL DEFAULT 'team_local',
|
|
47
|
+
session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
|
|
48
|
+
entity_canonical TEXT NOT NULL,
|
|
49
|
+
PRIMARY KEY (session_id, entity_canonical),
|
|
50
|
+
FOREIGN KEY (tenant_id, entity_canonical) REFERENCES entities(tenant_id, canonical)
|
|
51
|
+
);
|
|
52
|
+
INSERT INTO session_entities_new (tenant_id, session_id, entity_canonical)
|
|
53
|
+
SELECT 'team_local', session_id, entity_canonical FROM session_entities;
|
|
54
|
+
DROP TABLE session_entities;
|
|
55
|
+
ALTER TABLE session_entities_new RENAME TO session_entities;
|
|
56
|
+
CREATE INDEX IF NOT EXISTS idx_session_entities_entity ON session_entities(tenant_id, entity_canonical);
|
|
57
|
+
|
|
58
|
+
CREATE TABLE workstream_entities_new (
|
|
59
|
+
tenant_id TEXT NOT NULL DEFAULT 'team_local',
|
|
60
|
+
workstream_id TEXT NOT NULL REFERENCES workstreams(id) ON DELETE CASCADE,
|
|
61
|
+
entity_canonical TEXT NOT NULL,
|
|
62
|
+
session_count INTEGER NOT NULL DEFAULT 0,
|
|
63
|
+
PRIMARY KEY (workstream_id, entity_canonical),
|
|
64
|
+
FOREIGN KEY (tenant_id, entity_canonical) REFERENCES entities(tenant_id, canonical)
|
|
65
|
+
);
|
|
66
|
+
INSERT INTO workstream_entities_new (tenant_id, workstream_id, entity_canonical, session_count)
|
|
67
|
+
SELECT 'team_local', workstream_id, entity_canonical, session_count FROM workstream_entities;
|
|
68
|
+
DROP TABLE workstream_entities;
|
|
69
|
+
ALTER TABLE workstream_entities_new RENAME TO workstream_entities;
|
|
70
|
+
CREATE INDEX IF NOT EXISTS idx_workstream_entities_entity ON workstream_entities(tenant_id, entity_canonical);
|
|
71
|
+
|
|
72
|
+
INSERT OR IGNORE INTO schema_migrations (version, name) VALUES (35, 'tenancy_entity_rekey');
|
|
73
|
+
COMMIT;
|
|
74
|
+
PRAGMA foreign_keys = ON;
|
|
75
|
+
PRAGMA foreign_key_check;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
-- nlm:no-wrap
|
|
2
|
+
-- migrations/036_tenant_name_uniqueness.sql
|
|
3
|
+
-- M4 (Team NLM program spec §5 row M4): sources.name / providers.name
|
|
4
|
+
-- uniqueness re-keyed from a single-column UNIQUE to (tenant_id, name), so
|
|
5
|
+
-- two teams can register same-named sources/providers while a name still
|
|
6
|
+
-- stays unique within one tenant. SQLite can't ALTER a column-level UNIQUE
|
|
7
|
+
-- constraint, so this is a table rebuild under foreign_keys=OFF (precedent:
|
|
8
|
+
-- migrations/019_split_replaces.sql, 033_actions_kind_check.sql,
|
|
9
|
+
-- 035_tenancy_entity_rekey.sql). Every current column carried over exactly
|
|
10
|
+
-- (verified against the live schema, incl. the 034-added tenant_id).
|
|
11
|
+
|
|
12
|
+
PRAGMA foreign_keys = OFF;
|
|
13
|
+
BEGIN;
|
|
14
|
+
|
|
15
|
+
CREATE TABLE sources_new (
|
|
16
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
17
|
+
kind TEXT NOT NULL CHECK (kind IN ('claude-code', 'codex', 'hermes', 'hermes-agent', 'aider', 'cursor', 'windsurf', 'opencode', 'pi', 'jsonl-generic', 'webhook')),
|
|
18
|
+
name TEXT NOT NULL,
|
|
19
|
+
path_or_url TEXT,
|
|
20
|
+
runtime_label TEXT NOT NULL,
|
|
21
|
+
parse_config TEXT NOT NULL DEFAULT '{}',
|
|
22
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
23
|
+
token TEXT,
|
|
24
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
25
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
26
|
+
tenant_id TEXT NOT NULL DEFAULT 'team_local',
|
|
27
|
+
UNIQUE (tenant_id, name)
|
|
28
|
+
);
|
|
29
|
+
INSERT INTO sources_new (id, kind, name, path_or_url, runtime_label, parse_config, enabled, token, created_at, updated_at, tenant_id)
|
|
30
|
+
SELECT id, kind, name, path_or_url, runtime_label, parse_config, enabled, token, created_at, updated_at, tenant_id FROM sources;
|
|
31
|
+
DROP TABLE sources;
|
|
32
|
+
ALTER TABLE sources_new RENAME TO sources;
|
|
33
|
+
CREATE INDEX IF NOT EXISTS idx_sources_enabled ON sources(enabled) WHERE enabled = 1;
|
|
34
|
+
CREATE INDEX IF NOT EXISTS idx_sources_tenant ON sources(tenant_id);
|
|
35
|
+
|
|
36
|
+
CREATE TABLE providers_new (
|
|
37
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
38
|
+
kind TEXT NOT NULL CHECK (kind IN ('deepseek', 'ollama', 'openai', 'anthropic', 'openrouter', 'openai-compatible')),
|
|
39
|
+
name TEXT NOT NULL,
|
|
40
|
+
base_url TEXT,
|
|
41
|
+
api_key TEXT,
|
|
42
|
+
default_model TEXT,
|
|
43
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
44
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
45
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
46
|
+
tenant_id TEXT NOT NULL DEFAULT 'team_local',
|
|
47
|
+
UNIQUE (tenant_id, name)
|
|
48
|
+
);
|
|
49
|
+
INSERT INTO providers_new (id, kind, name, base_url, api_key, default_model, enabled, created_at, updated_at, tenant_id)
|
|
50
|
+
SELECT id, kind, name, base_url, api_key, default_model, enabled, created_at, updated_at, tenant_id FROM providers;
|
|
51
|
+
DROP TABLE providers;
|
|
52
|
+
ALTER TABLE providers_new RENAME TO providers;
|
|
53
|
+
CREATE INDEX IF NOT EXISTS idx_providers_enabled ON providers(enabled) WHERE enabled = 1;
|
|
54
|
+
CREATE INDEX IF NOT EXISTS idx_providers_tenant ON providers(tenant_id);
|
|
55
|
+
|
|
56
|
+
INSERT OR IGNORE INTO schema_migrations (version, name) VALUES (36, 'tenant_name_uniqueness');
|
|
57
|
+
COMMIT;
|
|
58
|
+
PRAGMA foreign_keys = ON;
|
|
59
|
+
PRAGMA foreign_key_check;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
-- migrations/037_sessions_covering_index.sql
|
|
2
|
+
-- Covering index so joins that only need a session's id/tenant/started_at stop
|
|
3
|
+
-- reading the row itself.
|
|
4
|
+
--
|
|
5
|
+
-- `sessions` carries `body`, which is the bulk of the store (378MB of a 1.45GB
|
|
6
|
+
-- database on the reference install). Any plan that resolves a session by id
|
|
7
|
+
-- through sqlite_autoindex_sessions_1 then visits the main b-tree and pays for
|
|
8
|
+
-- that whole wide row. The entity-overlap lookup in the ingest path does
|
|
9
|
+
-- exactly this, once per candidate: 10ms warm but 5,190ms cold, hit repeatedly
|
|
10
|
+
-- on boot, inside a synchronous better-sqlite3 call that blocks the event loop
|
|
11
|
+
-- (NLM #457 — same class of problem as the correlated LIKE fixed in
|
|
12
|
+
-- core/actions/actions-log.ts, different query).
|
|
13
|
+
--
|
|
14
|
+
-- With this index the planner reports
|
|
15
|
+
-- SEARCH s USING COVERING INDEX idx_sessions_cover_id_tenant_started (id=? AND tenant_id=?)
|
|
16
|
+
-- and never touches the main table. Roughly 1MB for 15k sessions.
|
|
17
|
+
--
|
|
18
|
+
-- Column order is (id, tenant_id, started_at): id is the join/seek key,
|
|
19
|
+
-- tenant_id the equality filter, started_at trails so it is available for
|
|
20
|
+
-- ORDER BY without a lookup.
|
|
21
|
+
|
|
22
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_cover_id_tenant_started
|
|
23
|
+
ON sessions(id, tenant_id, started_at);
|
|
24
|
+
|
|
25
|
+
INSERT OR IGNORE INTO schema_migrations (version, name) VALUES (37, 'sessions_covering_index');
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
-- nlm:no-wrap
|
|
2
|
+
-- Add 'muse' to the sources.kind CHECK constraint. Without it, seedDefaults()
|
|
3
|
+
-- fails at boot on any machine with a Muse sessions directory. Table rebuild
|
|
4
|
+
-- under foreign_keys=OFF, carrying every column of the post-036 shape.
|
|
5
|
+
|
|
6
|
+
PRAGMA foreign_keys = OFF;
|
|
7
|
+
BEGIN;
|
|
8
|
+
|
|
9
|
+
CREATE TABLE sources_new (
|
|
10
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
11
|
+
kind TEXT NOT NULL CHECK (kind IN ('claude-code', 'codex', 'hermes', 'hermes-agent', 'muse', 'aider', 'cursor', 'windsurf', 'opencode', 'pi', 'jsonl-generic', 'webhook')),
|
|
12
|
+
name TEXT NOT NULL,
|
|
13
|
+
path_or_url TEXT,
|
|
14
|
+
runtime_label TEXT NOT NULL,
|
|
15
|
+
parse_config TEXT NOT NULL DEFAULT '{}',
|
|
16
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
17
|
+
token TEXT,
|
|
18
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
19
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
20
|
+
tenant_id TEXT NOT NULL DEFAULT 'team_local',
|
|
21
|
+
UNIQUE (tenant_id, name)
|
|
22
|
+
);
|
|
23
|
+
INSERT INTO sources_new (id, kind, name, path_or_url, runtime_label, parse_config, enabled, token, created_at, updated_at, tenant_id)
|
|
24
|
+
SELECT id, kind, name, path_or_url, runtime_label, parse_config, enabled, token, created_at, updated_at, tenant_id FROM sources;
|
|
25
|
+
DROP TABLE sources;
|
|
26
|
+
ALTER TABLE sources_new RENAME TO sources;
|
|
27
|
+
CREATE INDEX IF NOT EXISTS idx_sources_enabled ON sources(enabled) WHERE enabled = 1;
|
|
28
|
+
CREATE INDEX IF NOT EXISTS idx_sources_tenant ON sources(tenant_id);
|
|
29
|
+
|
|
30
|
+
INSERT OR IGNORE INTO schema_migrations (version, name) VALUES (38, 'sources_muse');
|
|
31
|
+
COMMIT;
|
|
32
|
+
PRAGMA foreign_keys = ON;
|
|
33
|
+
PRAGMA foreign_key_check;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
-- migrations/037_learner_evidence.sql
|
|
2
|
+
-- Learner evidence (spec 2026-10-06-learner-evidence-design.md §2).
|
|
3
|
+
-- STAMP tables: tenant_id NOT NULL DEFAULT 'team_local', no REFERENCES (see 034 header).
|
|
4
|
+
-- Summaries are computed from events, never stored: no concept_states table.
|
|
5
|
+
|
|
6
|
+
CREATE TABLE IF NOT EXISTS learners (
|
|
7
|
+
id TEXT NOT NULL,
|
|
8
|
+
label TEXT NOT NULL,
|
|
9
|
+
profile_json TEXT NOT NULL DEFAULT '{}',
|
|
10
|
+
tenant_id TEXT NOT NULL DEFAULT 'team_local',
|
|
11
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
12
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
13
|
+
PRIMARY KEY (tenant_id, id)
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
CREATE TABLE IF NOT EXISTS enrollments (
|
|
17
|
+
id TEXT PRIMARY KEY,
|
|
18
|
+
learner_id TEXT NOT NULL,
|
|
19
|
+
course_id TEXT NOT NULL,
|
|
20
|
+
workstream_id TEXT REFERENCES workstreams(id),
|
|
21
|
+
plan_ref TEXT NOT NULL,
|
|
22
|
+
plan_revision INTEGER NOT NULL,
|
|
23
|
+
plan_fingerprint TEXT NOT NULL,
|
|
24
|
+
status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active','completed')),
|
|
25
|
+
completion_history_json TEXT NOT NULL DEFAULT '[]',
|
|
26
|
+
tenant_id TEXT NOT NULL DEFAULT 'team_local',
|
|
27
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
28
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
29
|
+
UNIQUE (tenant_id, learner_id, course_id),
|
|
30
|
+
FOREIGN KEY (tenant_id, learner_id) REFERENCES learners(tenant_id, id) ON DELETE CASCADE
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
CREATE TABLE IF NOT EXISTS learning_events (
|
|
34
|
+
id TEXT NOT NULL,
|
|
35
|
+
enrollment_id TEXT NOT NULL REFERENCES enrollments(id) ON DELETE CASCADE,
|
|
36
|
+
date TEXT NOT NULL,
|
|
37
|
+
covered_json TEXT NOT NULL DEFAULT '[]',
|
|
38
|
+
attempts_json TEXT NOT NULL DEFAULT '[]',
|
|
39
|
+
interpretation TEXT NOT NULL DEFAULT '',
|
|
40
|
+
next_step TEXT NOT NULL,
|
|
41
|
+
tenant_id TEXT NOT NULL DEFAULT 'team_local',
|
|
42
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
43
|
+
PRIMARY KEY (enrollment_id, id)
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
CREATE INDEX IF NOT EXISTS idx_learners_tenant ON learners(tenant_id);
|
|
47
|
+
CREATE INDEX IF NOT EXISTS idx_enrollments_tenant ON enrollments(tenant_id);
|
|
48
|
+
CREATE INDEX IF NOT EXISTS idx_enrollments_ws ON enrollments(workstream_id);
|
|
49
|
+
CREATE INDEX IF NOT EXISTS idx_events_tenant ON learning_events(tenant_id);
|
|
50
|
+
|
|
51
|
+
INSERT OR IGNORE INTO schema_migrations (version, name) VALUES (37, 'learner_evidence');
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
-- Mirrors migrations/033_actions_kind_check.sql (#294). Pg supports adding a
|
|
2
|
+
-- CHECK constraint in place, no table rebuild needed. Same fixed set the
|
|
3
|
+
-- overlay reducer (src/core/actions/overlay.ts) understands, plus 'undo'
|
|
4
|
+
-- (actions-log.ts's own revert marker, subject_type 'action').
|
|
5
|
+
|
|
6
|
+
BEGIN;
|
|
7
|
+
|
|
8
|
+
ALTER TABLE actions DROP CONSTRAINT IF EXISTS actions_kind_check;
|
|
9
|
+
ALTER TABLE actions ADD CONSTRAINT actions_kind_check
|
|
10
|
+
CHECK (kind IN (
|
|
11
|
+
'dismiss', 'snooze', 'retire_entity', 'label_entity',
|
|
12
|
+
'rename_entity', 'resolve_open', 'promote_open',
|
|
13
|
+
'dismiss_decision', 'revise_decision', 'merge_entity',
|
|
14
|
+
'set_coherence', 'undo'
|
|
15
|
+
));
|
|
16
|
+
|
|
17
|
+
COMMIT;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
-- migrations/pg/034_tenancy.sql
|
|
2
|
+
-- M1 (Team NLM program spec §2): tenancy registry, tenant stamps with full
|
|
3
|
+
-- constraint rigor (the hosted lane), entity re-key to (tenant_id, canonical).
|
|
4
|
+
|
|
5
|
+
CREATE TABLE IF NOT EXISTS teams (
|
|
6
|
+
id TEXT PRIMARY KEY,
|
|
7
|
+
name TEXT NOT NULL,
|
|
8
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
9
|
+
);
|
|
10
|
+
|
|
11
|
+
CREATE TABLE IF NOT EXISTS team_tokens (
|
|
12
|
+
token_hash TEXT PRIMARY KEY,
|
|
13
|
+
team_id TEXT NOT NULL REFERENCES teams(id),
|
|
14
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
15
|
+
revoked_at TIMESTAMPTZ
|
|
16
|
+
);
|
|
17
|
+
CREATE INDEX IF NOT EXISTS idx_team_tokens_team ON team_tokens(team_id);
|
|
18
|
+
|
|
19
|
+
INSERT INTO teams (id, name) VALUES ('team_local', 'Local operator team') ON CONFLICT DO NOTHING;
|
|
20
|
+
|
|
21
|
+
-- Stamp the seven flat tables: add → backfill → NOT NULL → FK → index.
|
|
22
|
+
DO $$
|
|
23
|
+
DECLARE t TEXT;
|
|
24
|
+
BEGIN
|
|
25
|
+
FOREACH t IN ARRAY ARRAY['sessions','facts','code_exemplars','signals','workstreams','sources','providers'] LOOP
|
|
26
|
+
EXECUTE format('ALTER TABLE %I ADD COLUMN IF NOT EXISTS tenant_id TEXT', t);
|
|
27
|
+
EXECUTE format('UPDATE %I SET tenant_id = ''team_local'' WHERE tenant_id IS NULL', t);
|
|
28
|
+
EXECUTE format('ALTER TABLE %I ALTER COLUMN tenant_id SET DEFAULT ''team_local''', t);
|
|
29
|
+
EXECUTE format('ALTER TABLE %I ALTER COLUMN tenant_id SET NOT NULL', t);
|
|
30
|
+
EXECUTE format('ALTER TABLE %I DROP CONSTRAINT IF EXISTS fk_%s_tenant', t, t);
|
|
31
|
+
EXECUTE format('ALTER TABLE %I ADD CONSTRAINT fk_%s_tenant FOREIGN KEY (tenant_id) REFERENCES teams(id)', t, t);
|
|
32
|
+
EXECUTE format('CREATE INDEX IF NOT EXISTS idx_%s_tenant ON %I(tenant_id)', t, t);
|
|
33
|
+
END LOOP;
|
|
34
|
+
END $$;
|
|
35
|
+
|
|
36
|
+
-- Entity re-key: stamp the four entity-graph tables, then swap keys.
|
|
37
|
+
ALTER TABLE entities ADD COLUMN IF NOT EXISTS tenant_id TEXT;
|
|
38
|
+
ALTER TABLE entity_variants ADD COLUMN IF NOT EXISTS tenant_id TEXT;
|
|
39
|
+
ALTER TABLE session_entities ADD COLUMN IF NOT EXISTS tenant_id TEXT;
|
|
40
|
+
ALTER TABLE workstream_entities ADD COLUMN IF NOT EXISTS tenant_id TEXT;
|
|
41
|
+
UPDATE entities SET tenant_id = 'team_local' WHERE tenant_id IS NULL;
|
|
42
|
+
UPDATE entity_variants SET tenant_id = 'team_local' WHERE tenant_id IS NULL;
|
|
43
|
+
UPDATE session_entities SET tenant_id = 'team_local' WHERE tenant_id IS NULL;
|
|
44
|
+
UPDATE workstream_entities SET tenant_id = 'team_local' WHERE tenant_id IS NULL;
|
|
45
|
+
ALTER TABLE entities ALTER COLUMN tenant_id SET DEFAULT 'team_local';
|
|
46
|
+
ALTER TABLE entity_variants ALTER COLUMN tenant_id SET DEFAULT 'team_local';
|
|
47
|
+
ALTER TABLE session_entities ALTER COLUMN tenant_id SET DEFAULT 'team_local';
|
|
48
|
+
ALTER TABLE workstream_entities ALTER COLUMN tenant_id SET DEFAULT 'team_local';
|
|
49
|
+
ALTER TABLE entities ALTER COLUMN tenant_id SET NOT NULL;
|
|
50
|
+
ALTER TABLE entity_variants ALTER COLUMN tenant_id SET NOT NULL;
|
|
51
|
+
ALTER TABLE session_entities ALTER COLUMN tenant_id SET NOT NULL;
|
|
52
|
+
ALTER TABLE workstream_entities ALTER COLUMN tenant_id SET NOT NULL;
|
|
53
|
+
|
|
54
|
+
-- Drop the old single-column FKs (default constraint names from 001/025/029),
|
|
55
|
+
-- then the old PKs, then rebuild composite.
|
|
56
|
+
ALTER TABLE session_entities DROP CONSTRAINT IF EXISTS session_entities_entity_canonical_fkey;
|
|
57
|
+
ALTER TABLE workstream_entities DROP CONSTRAINT IF EXISTS workstream_entities_entity_canonical_fkey;
|
|
58
|
+
ALTER TABLE entity_variants DROP CONSTRAINT IF EXISTS entity_variants_canonical_fkey;
|
|
59
|
+
ALTER TABLE entities DROP CONSTRAINT IF EXISTS entities_pkey;
|
|
60
|
+
ALTER TABLE entities ADD PRIMARY KEY (tenant_id, canonical);
|
|
61
|
+
ALTER TABLE entities ADD CONSTRAINT fk_entities_tenant FOREIGN KEY (tenant_id) REFERENCES teams(id);
|
|
62
|
+
|
|
63
|
+
ALTER TABLE entity_variants DROP CONSTRAINT IF EXISTS entity_variants_pkey;
|
|
64
|
+
ALTER TABLE entity_variants ADD PRIMARY KEY (tenant_id, variant);
|
|
65
|
+
ALTER TABLE entity_variants ADD CONSTRAINT fk_entity_variants_entity
|
|
66
|
+
FOREIGN KEY (tenant_id, canonical) REFERENCES entities(tenant_id, canonical) ON DELETE CASCADE;
|
|
67
|
+
|
|
68
|
+
ALTER TABLE session_entities ADD CONSTRAINT fk_session_entities_entity
|
|
69
|
+
FOREIGN KEY (tenant_id, entity_canonical) REFERENCES entities(tenant_id, canonical);
|
|
70
|
+
ALTER TABLE workstream_entities ADD CONSTRAINT fk_workstream_entities_entity
|
|
71
|
+
FOREIGN KEY (tenant_id, entity_canonical) REFERENCES entities(tenant_id, canonical);
|
|
72
|
+
|
|
73
|
+
CREATE INDEX IF NOT EXISTS idx_entity_variants_canonical ON entity_variants(tenant_id, canonical);
|
|
74
|
+
CREATE INDEX IF NOT EXISTS idx_session_entities_entity_t ON session_entities(tenant_id, entity_canonical);
|
|
75
|
+
CREATE INDEX IF NOT EXISTS idx_workstream_entities_entity_t ON workstream_entities(tenant_id, entity_canonical);
|
|
76
|
+
|
|
77
|
+
INSERT INTO schema_migrations (version, name) VALUES (34, 'tenancy') ON CONFLICT DO NOTHING;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
-- migrations/pg/035_tenant_name_uniqueness.sql
|
|
2
|
+
-- M4 (Team NLM program spec §5 row M4): sources.name / providers.name
|
|
3
|
+
-- uniqueness re-keyed from a single-column UNIQUE constraint to
|
|
4
|
+
-- (tenant_id, name), so two teams can register same-named sources/providers
|
|
5
|
+
-- while a name still stays unique within one tenant. Constraint names
|
|
6
|
+
-- verified against the live schema: sources_name_key / providers_name_key
|
|
7
|
+
-- (the default names Postgres assigns to an inline `name TEXT ... UNIQUE`).
|
|
8
|
+
|
|
9
|
+
ALTER TABLE sources DROP CONSTRAINT IF EXISTS sources_name_key;
|
|
10
|
+
ALTER TABLE providers DROP CONSTRAINT IF EXISTS providers_name_key;
|
|
11
|
+
|
|
12
|
+
ALTER TABLE sources ADD CONSTRAINT sources_tenant_name_key UNIQUE (tenant_id, name);
|
|
13
|
+
ALTER TABLE providers ADD CONSTRAINT providers_tenant_name_key UNIQUE (tenant_id, name);
|
|
14
|
+
|
|
15
|
+
INSERT INTO schema_migrations (version, name) VALUES (35, 'tenant_name_uniqueness') ON CONFLICT DO NOTHING;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
-- Mirrors migrations/038_sources_muse.sql. Pg alters the CHECK in place.
|
|
2
|
+
|
|
3
|
+
BEGIN;
|
|
4
|
+
|
|
5
|
+
ALTER TABLE sources DROP CONSTRAINT IF EXISTS sources_kind_check;
|
|
6
|
+
ALTER TABLE sources ADD CONSTRAINT sources_kind_check
|
|
7
|
+
CHECK (kind IN (
|
|
8
|
+
'claude-code', 'codex', 'hermes', 'hermes-agent', 'muse', 'aider',
|
|
9
|
+
'cursor', 'windsurf', 'opencode', 'pi', 'jsonl-generic', 'webhook'
|
|
10
|
+
));
|
|
11
|
+
|
|
12
|
+
COMMIT;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
-- migrations/pg/036_learner_evidence.sql
|
|
2
|
+
-- PG parity for SQLite migration 037 (learner evidence). Auto-applied by the
|
|
3
|
+
-- version-gated runner (runMigrationsPg). Idempotent: every DDL statement uses
|
|
4
|
+
-- IF NOT EXISTS, so re-applying on an existing schema is a no-op.
|
|
5
|
+
-- Spec: docs/superpowers/specs/2026-10-06-learner-evidence-design.md §2.
|
|
6
|
+
-- Summaries are computed from events, never stored: no concept_states table.
|
|
7
|
+
|
|
8
|
+
BEGIN;
|
|
9
|
+
|
|
10
|
+
CREATE TABLE IF NOT EXISTS learners (
|
|
11
|
+
id TEXT NOT NULL,
|
|
12
|
+
label TEXT NOT NULL,
|
|
13
|
+
profile_json JSONB NOT NULL DEFAULT '{}',
|
|
14
|
+
tenant_id TEXT NOT NULL REFERENCES teams(id),
|
|
15
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
16
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
17
|
+
PRIMARY KEY (tenant_id, id)
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
CREATE TABLE IF NOT EXISTS enrollments (
|
|
21
|
+
id TEXT PRIMARY KEY,
|
|
22
|
+
learner_id TEXT NOT NULL,
|
|
23
|
+
course_id TEXT NOT NULL,
|
|
24
|
+
workstream_id TEXT REFERENCES workstreams(id),
|
|
25
|
+
plan_ref TEXT NOT NULL,
|
|
26
|
+
plan_revision INTEGER NOT NULL,
|
|
27
|
+
plan_fingerprint TEXT NOT NULL,
|
|
28
|
+
status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active','completed')),
|
|
29
|
+
completion_history_json JSONB NOT NULL DEFAULT '[]',
|
|
30
|
+
tenant_id TEXT NOT NULL REFERENCES teams(id),
|
|
31
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
32
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
33
|
+
UNIQUE (tenant_id, learner_id, course_id),
|
|
34
|
+
FOREIGN KEY (tenant_id, learner_id) REFERENCES learners(tenant_id, id) ON DELETE CASCADE
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
CREATE TABLE IF NOT EXISTS learning_events (
|
|
38
|
+
id TEXT NOT NULL,
|
|
39
|
+
enrollment_id TEXT NOT NULL REFERENCES enrollments(id) ON DELETE CASCADE,
|
|
40
|
+
date TEXT NOT NULL,
|
|
41
|
+
covered_json JSONB NOT NULL DEFAULT '[]',
|
|
42
|
+
attempts_json JSONB NOT NULL DEFAULT '[]',
|
|
43
|
+
interpretation TEXT NOT NULL DEFAULT '',
|
|
44
|
+
next_step TEXT NOT NULL,
|
|
45
|
+
tenant_id TEXT NOT NULL REFERENCES teams(id),
|
|
46
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
47
|
+
PRIMARY KEY (enrollment_id, id)
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
CREATE INDEX IF NOT EXISTS idx_learners_tenant ON learners(tenant_id);
|
|
51
|
+
CREATE INDEX IF NOT EXISTS idx_enrollments_tenant ON enrollments(tenant_id);
|
|
52
|
+
CREATE INDEX IF NOT EXISTS idx_enrollments_ws ON enrollments(workstream_id);
|
|
53
|
+
CREATE INDEX IF NOT EXISTS idx_events_tenant ON learning_events(tenant_id);
|
|
54
|
+
|
|
55
|
+
COMMIT;
|