nlm-memory 0.20.0 → 0.21.0
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 +19 -10
- package/dist/cli/digest.js +60 -1
- package/dist/cli/digest.js.map +1 -1
- package/dist/cli/init.d.ts +12 -0
- package/dist/cli/init.js +49 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/nlm.d.ts +13 -1
- package/dist/cli/nlm.js +872 -61
- package/dist/cli/nlm.js.map +1 -1
- package/dist/cli/scope-backfill.d.ts +34 -0
- package/dist/cli/scope-backfill.js +237 -0
- package/dist/cli/scope-backfill.js.map +1 -0
- package/dist/cli/scope-coverage.d.ts +44 -0
- package/dist/cli/scope-coverage.js +205 -0
- package/dist/cli/scope-coverage.js.map +1 -0
- package/dist/core/actions/overlay.d.ts +20 -6
- package/dist/core/actions/overlay.js +32 -18
- package/dist/core/actions/overlay.js.map +1 -1
- package/dist/core/adapters/claude-code.d.ts +14 -0
- package/dist/core/adapters/claude-code.js +36 -0
- package/dist/core/adapters/claude-code.js.map +1 -1
- package/dist/core/classifier/prompt.js +3 -3
- package/dist/core/dataset/build-dataset.js +1 -0
- package/dist/core/dataset/build-dataset.js.map +1 -1
- package/dist/core/digest/compose.d.ts +13 -3
- package/dist/core/digest/compose.js +23 -18
- package/dist/core/digest/compose.js.map +1 -1
- package/dist/core/digest/hook-injection.d.ts +43 -0
- package/dist/core/digest/hook-injection.js +79 -0
- package/dist/core/digest/hook-injection.js.map +1 -0
- package/dist/core/embedding/embed-backfill.d.ts +13 -2
- package/dist/core/embedding/embed-backfill.js +181 -43
- package/dist/core/embedding/embed-backfill.js.map +1 -1
- package/dist/core/embedding/embedding-config.d.ts +17 -0
- package/dist/core/embedding/embedding-config.js +12 -0
- package/dist/core/embedding/embedding-config.js.map +1 -0
- package/dist/core/embedding/pg-embed-backfill.d.ts +31 -0
- package/dist/core/embedding/pg-embed-backfill.js +264 -0
- package/dist/core/embedding/pg-embed-backfill.js.map +1 -0
- package/dist/core/entities/dedup-suggest.d.ts +25 -0
- package/dist/core/entities/dedup-suggest.js +107 -0
- package/dist/core/entities/dedup-suggest.js.map +1 -0
- package/dist/core/eval/classifier-fixture-eval.d.ts +29 -0
- package/dist/core/eval/classifier-fixture-eval.js +217 -0
- package/dist/core/eval/classifier-fixture-eval.js.map +1 -0
- package/dist/core/eval/extraction-scoring.d.ts +63 -0
- package/dist/core/eval/extraction-scoring.js +79 -0
- package/dist/core/eval/extraction-scoring.js.map +1 -0
- package/dist/core/eval/run-eval.d.ts +40 -0
- package/dist/core/eval/run-eval.js +34 -0
- package/dist/core/eval/run-eval.js.map +1 -0
- package/dist/core/exemplars/capture-from-session.d.ts +2 -0
- package/dist/core/exemplars/capture-from-session.js +7 -3
- package/dist/core/exemplars/capture-from-session.js.map +1 -1
- package/dist/core/exemplars/diff-parse.d.ts +23 -0
- package/dist/core/exemplars/diff-parse.js +73 -0
- package/dist/core/exemplars/diff-parse.js.map +1 -0
- package/dist/core/exemplars/embed-backfill.d.ts +36 -0
- package/dist/core/exemplars/embed-backfill.js +85 -0
- package/dist/core/exemplars/embed-backfill.js.map +1 -0
- package/dist/core/exemplars/embed-text.d.ts +15 -0
- package/dist/core/exemplars/embed-text.js +18 -0
- package/dist/core/exemplars/embed-text.js.map +1 -0
- package/dist/core/exemplars/extract-exemplar.d.ts +2 -0
- package/dist/core/exemplars/extract-exemplar.js +9 -66
- package/dist/core/exemplars/extract-exemplar.js.map +1 -1
- package/dist/core/exemplars/ingest-exemplar.d.ts +1 -0
- package/dist/core/exemplars/ingest-exemplar.js +1 -0
- package/dist/core/exemplars/ingest-exemplar.js.map +1 -1
- package/dist/core/exemplars/recall-code.js +4 -0
- package/dist/core/exemplars/recall-code.js.map +1 -1
- package/dist/core/exemplars/warm-embedder.d.ts +14 -0
- package/dist/core/exemplars/warm-embedder.js +18 -0
- package/dist/core/exemplars/warm-embedder.js.map +1 -0
- package/dist/core/health/corpus-state.d.ts +8 -0
- package/dist/core/health/corpus-state.js +11 -0
- package/dist/core/health/corpus-state.js.map +1 -0
- package/dist/core/health/embed-inflight.d.ts +9 -0
- package/dist/core/health/embed-inflight.js +30 -0
- package/dist/core/health/embed-inflight.js.map +1 -0
- package/dist/core/health/embedding-lane-state.d.ts +6 -0
- package/dist/core/health/embedding-lane-state.js +18 -0
- package/dist/core/health/embedding-lane-state.js.map +1 -0
- package/dist/core/health/warmup-state.d.ts +12 -0
- package/dist/core/health/warmup-state.js +12 -0
- package/dist/core/health/warmup-state.js.map +1 -0
- package/dist/core/hook/claude-settings.d.ts +1 -1
- package/dist/core/hook/claude-settings.js +0 -1
- package/dist/core/hook/claude-settings.js.map +1 -1
- package/dist/core/hook/gate.d.ts +13 -6
- package/dist/core/hook/gate.js +47 -6
- package/dist/core/hook/gate.js.map +1 -1
- package/dist/core/hook/hook-log.d.ts +5 -0
- package/dist/core/hook/hook-log.js.map +1 -1
- package/dist/core/hook/memo.d.ts +12 -0
- package/dist/core/hook/memo.js +41 -1
- package/dist/core/hook/memo.js.map +1 -1
- package/dist/core/hook/pointer-block.d.ts +1 -0
- package/dist/core/hook/pointer-block.js +23 -2
- package/dist/core/hook/pointer-block.js.map +1 -1
- package/dist/core/hook/query-extract.d.ts +2 -1
- package/dist/core/hook/query-extract.js +10 -1
- package/dist/core/hook/query-extract.js.map +1 -1
- package/dist/core/hook/resolve-conversation-by-query.d.ts +28 -0
- package/dist/core/hook/resolve-conversation-by-query.js +98 -0
- package/dist/core/hook/resolve-conversation-by-query.js.map +1 -0
- package/dist/core/hook/select.d.ts +8 -0
- package/dist/core/hook/select.js +9 -2
- package/dist/core/hook/select.js.map +1 -1
- package/dist/core/hook/transcript.js +16 -2
- package/dist/core/hook/transcript.js.map +1 -1
- package/dist/core/ingest/backfill-derivables.d.ts +92 -0
- package/dist/core/ingest/backfill-derivables.js +175 -0
- package/dist/core/ingest/backfill-derivables.js.map +1 -0
- package/dist/core/ingest/ingest-session.d.ts +5 -0
- package/dist/core/ingest/ingest-session.js +23 -0
- package/dist/core/ingest/ingest-session.js.map +1 -1
- package/dist/core/ingest/reclassify-oversized.d.ts +5 -0
- package/dist/core/ingest/reclassify-oversized.js +9 -0
- package/dist/core/ingest/reclassify-oversized.js.map +1 -1
- package/dist/core/ingest/reprocess.d.ts +96 -0
- package/dist/core/ingest/reprocess.js +280 -0
- package/dist/core/ingest/reprocess.js.map +1 -0
- package/dist/core/ingest/transcript-derivables.d.ts +27 -0
- package/dist/core/ingest/transcript-derivables.js +138 -0
- package/dist/core/ingest/transcript-derivables.js.map +1 -0
- package/dist/core/integrity/check-invariants.d.ts +6 -1
- package/dist/core/integrity/check-invariants.js +209 -3
- package/dist/core/integrity/check-invariants.js.map +1 -1
- package/dist/core/metrics/corpus-stats.d.ts +49 -0
- package/dist/core/metrics/corpus-stats.js +111 -0
- package/dist/core/metrics/corpus-stats.js.map +1 -0
- package/dist/core/metrics/re-derivation.d.ts +48 -0
- package/dist/core/metrics/re-derivation.js +87 -0
- package/dist/core/metrics/re-derivation.js.map +1 -0
- package/dist/core/outcome/coverage.d.ts +33 -0
- package/dist/core/outcome/coverage.js +46 -0
- package/dist/core/outcome/coverage.js.map +1 -0
- package/dist/core/outcome/rollup.d.ts +33 -0
- package/dist/core/outcome/rollup.js +113 -0
- package/dist/core/outcome/rollup.js.map +1 -0
- package/dist/core/recall/citation-log.d.ts +8 -0
- package/dist/core/recall/citation-log.js +17 -0
- package/dist/core/recall/citation-log.js.map +1 -1
- package/dist/core/recall/hook-recall-log.d.ts +2 -2
- package/dist/core/recall/hook-recall-log.js +2 -2
- package/dist/core/recall/query-intent.d.ts +7 -0
- package/dist/core/recall/query-intent.js +25 -0
- package/dist/core/recall/query-intent.js.map +1 -0
- package/dist/core/recall/query-log.d.ts +4 -0
- package/dist/core/recall/query-log.js +4 -0
- package/dist/core/recall/query-log.js.map +1 -1
- package/dist/core/recall/recall-service.d.ts +37 -1
- package/dist/core/recall/recall-service.js +106 -63
- package/dist/core/recall/recall-service.js.map +1 -1
- package/dist/core/recall/related-exemplars.d.ts +1 -0
- package/dist/core/recall/related-exemplars.js +4 -1
- package/dist/core/recall/related-exemplars.js.map +1 -1
- package/dist/core/recall/related-facts.js +2 -2
- package/dist/core/recall/related-facts.js.map +1 -1
- package/dist/core/recall/reranker.d.ts +2 -1
- package/dist/core/recall/reranker.js +3 -3
- package/dist/core/recall/reranker.js.map +1 -1
- package/dist/core/recall-facts/fact-query-log.d.ts +7 -0
- package/dist/core/recall-facts/fact-query-log.js +2 -0
- package/dist/core/recall-facts/fact-query-log.js.map +1 -1
- package/dist/core/recall-facts/fact-recall-service.d.ts +9 -1
- package/dist/core/recall-facts/fact-recall-service.js +22 -8
- package/dist/core/recall-facts/fact-recall-service.js.map +1 -1
- package/dist/core/scheduler/scan-once.d.ts +6 -6
- package/dist/core/scheduler/scan-once.js +15 -49
- package/dist/core/scheduler/scan-once.js.map +1 -1
- package/dist/core/scheduler/scheduler.d.ts +10 -0
- package/dist/core/scheduler/scheduler.js +109 -13
- package/dist/core/scheduler/scheduler.js.map +1 -1
- package/dist/core/scope/alias-map.d.ts +10 -0
- package/dist/core/scope/alias-map.js +41 -0
- package/dist/core/scope/alias-map.js.map +1 -0
- package/dist/core/scope/derive-scope.d.ts +8 -0
- package/dist/core/scope/derive-scope.js +54 -0
- package/dist/core/scope/derive-scope.js.map +1 -0
- package/dist/core/scope/scope-clause.d.ts +16 -0
- package/dist/core/scope/scope-clause.js +21 -0
- package/dist/core/scope/scope-clause.js.map +1 -0
- package/dist/core/scope/stamp-flag.d.ts +1 -0
- package/dist/core/scope/stamp-flag.js +4 -0
- package/dist/core/scope/stamp-flag.js.map +1 -0
- package/dist/core/signals/code-signal.d.ts +50 -0
- package/dist/core/signals/code-signal.js +54 -0
- package/dist/core/signals/code-signal.js.map +1 -0
- package/dist/core/signals/ingest-signal.d.ts +1 -1
- package/dist/core/signals/ingest-signal.js +3 -1
- package/dist/core/signals/ingest-signal.js.map +1 -1
- package/dist/core/signals/stamp-scope.d.ts +18 -0
- package/dist/core/signals/stamp-scope.js +28 -0
- package/dist/core/signals/stamp-scope.js.map +1 -0
- package/dist/core/storage/db-restore.js +3 -1
- package/dist/core/storage/db-restore.js.map +1 -1
- package/dist/core/storage/fact-batch.d.ts +9 -0
- package/dist/core/storage/fact-batch.js +14 -0
- package/dist/core/storage/fact-batch.js.map +1 -0
- package/dist/core/storage/pg-code-exemplar-store.d.ts +1 -0
- package/dist/core/storage/pg-code-exemplar-store.js +13 -2
- package/dist/core/storage/pg-code-exemplar-store.js.map +1 -1
- package/dist/core/storage/pg-embedding-config.d.ts +29 -0
- package/dist/core/storage/pg-embedding-config.js +53 -0
- package/dist/core/storage/pg-embedding-config.js.map +1 -0
- package/dist/core/storage/pg-entity-store.d.ts +12 -0
- package/dist/core/storage/pg-entity-store.js +79 -0
- package/dist/core/storage/pg-entity-store.js.map +1 -0
- package/dist/core/storage/pg-fact-ingest.d.ts +15 -0
- package/dist/core/storage/pg-fact-ingest.js +34 -0
- package/dist/core/storage/pg-fact-ingest.js.map +1 -0
- package/dist/core/storage/pg-fact-store.d.ts +3 -0
- package/dist/core/storage/pg-fact-store.js +26 -30
- package/dist/core/storage/pg-fact-store.js.map +1 -1
- package/dist/core/storage/pg-migrate.d.ts +18 -0
- package/dist/core/storage/pg-migrate.js +73 -0
- package/dist/core/storage/pg-migrate.js.map +1 -0
- package/dist/core/storage/pg-session-store.d.ts +11 -2
- package/dist/core/storage/pg-session-store.js +224 -96
- package/dist/core/storage/pg-session-store.js.map +1 -1
- package/dist/core/storage/pg-signal-store.js +4 -3
- package/dist/core/storage/pg-signal-store.js.map +1 -1
- package/dist/core/storage/pg-storage.d.ts +9 -7
- package/dist/core/storage/pg-storage.js +20 -50
- package/dist/core/storage/pg-storage.js.map +1 -1
- package/dist/core/storage/pg-workstream-store.d.ts +25 -0
- package/dist/core/storage/pg-workstream-store.js +97 -0
- package/dist/core/storage/pg-workstream-store.js.map +1 -0
- package/dist/core/storage/sqlite-code-exemplar-store.d.ts +1 -0
- package/dist/core/storage/sqlite-code-exemplar-store.js +15 -2
- package/dist/core/storage/sqlite-code-exemplar-store.js.map +1 -1
- package/dist/core/storage/sqlite-embedding-config.d.ts +10 -0
- package/dist/core/storage/sqlite-embedding-config.js +27 -0
- package/dist/core/storage/sqlite-embedding-config.js.map +1 -0
- package/dist/core/storage/sqlite-entity-store.d.ts +13 -0
- package/dist/core/storage/sqlite-entity-store.js +96 -0
- package/dist/core/storage/sqlite-entity-store.js.map +1 -0
- package/dist/core/storage/sqlite-fact-store.d.ts +15 -7
- package/dist/core/storage/sqlite-fact-store.js +81 -27
- package/dist/core/storage/sqlite-fact-store.js.map +1 -1
- package/dist/core/storage/sqlite-outcome-store.d.ts +89 -0
- package/dist/core/storage/sqlite-outcome-store.js +158 -0
- package/dist/core/storage/sqlite-outcome-store.js.map +1 -0
- package/dist/core/storage/sqlite-session-store.d.ts +42 -7
- package/dist/core/storage/sqlite-session-store.js +208 -95
- package/dist/core/storage/sqlite-session-store.js.map +1 -1
- package/dist/core/storage/sqlite-signal-store.js +4 -2
- package/dist/core/storage/sqlite-signal-store.js.map +1 -1
- package/dist/core/storage/sqlite-storage.d.ts +8 -8
- package/dist/core/storage/sqlite-storage.js +21 -32
- package/dist/core/storage/sqlite-storage.js.map +1 -1
- package/dist/core/storage/sqlite-workstream-store.d.ts +25 -0
- package/dist/core/storage/sqlite-workstream-store.js +99 -0
- package/dist/core/storage/sqlite-workstream-store.js.map +1 -0
- package/dist/core/storage/supersedence-log.js +2 -0
- package/dist/core/storage/supersedence-log.js.map +1 -1
- package/dist/core/telemetry/probe-filter.d.ts +35 -0
- package/dist/core/telemetry/probe-filter.js +56 -0
- package/dist/core/telemetry/probe-filter.js.map +1 -0
- package/dist/core/update-check/check.d.ts +6 -0
- package/dist/core/update-check/check.js +35 -0
- package/dist/core/update-check/check.js.map +1 -1
- package/dist/core/work-digest/active-spans.d.ts +8 -0
- package/dist/core/work-digest/active-spans.js +29 -0
- package/dist/core/work-digest/active-spans.js.map +1 -0
- package/dist/core/work-digest/attribute.d.ts +15 -0
- package/dist/core/work-digest/attribute.js +76 -0
- package/dist/core/work-digest/attribute.js.map +1 -0
- package/dist/core/work-digest/build-work-digest.d.ts +12 -0
- package/dist/core/work-digest/build-work-digest.js +69 -0
- package/dist/core/work-digest/build-work-digest.js.map +1 -0
- package/dist/core/work-digest/compose-work-digest.d.ts +3 -0
- package/dist/core/work-digest/compose-work-digest.js +52 -0
- package/dist/core/work-digest/compose-work-digest.js.map +1 -0
- package/dist/core/work-digest/merge-active.d.ts +10 -0
- package/dist/core/work-digest/merge-active.js +22 -0
- package/dist/core/work-digest/merge-active.js.map +1 -0
- package/dist/core/work-digest/read-transcript-timestamps.d.ts +7 -0
- package/dist/core/work-digest/read-transcript-timestamps.js +40 -0
- package/dist/core/work-digest/read-transcript-timestamps.js.map +1 -0
- package/dist/core/work-digest/topics.d.ts +18 -0
- package/dist/core/work-digest/topics.js +26 -0
- package/dist/core/work-digest/topics.js.map +1 -0
- package/dist/core/work-digest/types.d.ts +45 -0
- package/dist/core/work-digest/types.js +2 -0
- package/dist/core/work-digest/types.js.map +1 -0
- package/dist/core/workstream/bind.d.ts +26 -0
- package/dist/core/workstream/bind.js +42 -0
- package/dist/core/workstream/bind.js.map +1 -0
- package/dist/core/workstream/compose-recall.d.ts +2 -0
- package/dist/core/workstream/compose-recall.js +39 -0
- package/dist/core/workstream/compose-recall.js.map +1 -0
- package/dist/core/workstream/merge-suggest.d.ts +19 -0
- package/dist/core/workstream/merge-suggest.js +61 -0
- package/dist/core/workstream/merge-suggest.js.map +1 -0
- package/dist/core/workstream/model.d.ts +21 -0
- package/dist/core/workstream/model.js +9 -0
- package/dist/core/workstream/model.js.map +1 -0
- package/dist/core/workstream/name-match.d.ts +8 -0
- package/dist/core/workstream/name-match.js +18 -0
- package/dist/core/workstream/name-match.js.map +1 -0
- package/dist/core/workstream/resolve.d.ts +10 -0
- package/dist/core/workstream/resolve.js +21 -0
- package/dist/core/workstream/resolve.js.map +1 -0
- package/dist/core/workstream/rollup.d.ts +12 -0
- package/dist/core/workstream/rollup.js +17 -0
- package/dist/core/workstream/rollup.js.map +1 -0
- package/dist/core/workstream/work-topics.d.ts +10 -0
- package/dist/core/workstream/work-topics.js +55 -0
- package/dist/core/workstream/work-topics.js.map +1 -0
- package/dist/hook/hook-helpers.d.ts +4 -0
- package/dist/hook/hook-helpers.js +36 -0
- package/dist/hook/hook-helpers.js.map +1 -0
- package/dist/hook/pre-compact-hook.d.ts +23 -0
- package/dist/hook/pre-compact-hook.js +67 -0
- package/dist/hook/pre-compact-hook.js.map +1 -0
- package/dist/hook/prompt-recall-hook.d.ts +38 -0
- package/dist/hook/prompt-recall-hook.js +124 -20
- package/dist/hook/prompt-recall-hook.js.map +1 -1
- package/dist/hook/recall-gate.d.ts +29 -0
- package/dist/hook/recall-gate.js +50 -0
- package/dist/hook/recall-gate.js.map +1 -0
- package/dist/hook/recall-over-http.d.ts +3 -2
- package/dist/hook/recall-over-http.js +26 -13
- package/dist/hook/recall-over-http.js.map +1 -1
- package/dist/hook/recent-context.d.ts +25 -0
- package/dist/hook/recent-context.js +104 -0
- package/dist/hook/recent-context.js.map +1 -0
- package/dist/hook/score-floor.d.ts +27 -0
- package/dist/hook/score-floor.js +42 -0
- package/dist/hook/score-floor.js.map +1 -0
- package/dist/hook/session-end-hook.js +8 -29
- package/dist/hook/session-end-hook.js.map +1 -1
- package/dist/hook/session-start-hook.js +26 -60
- package/dist/hook/session-start-hook.js.map +1 -1
- package/dist/hook/stop-hook.js +24 -60
- package/dist/hook/stop-hook.js.map +1 -1
- package/dist/http/app.d.ts +6 -0
- package/dist/http/app.js +52 -44
- package/dist/http/app.js.map +1 -1
- package/dist/install/setup.js +2 -0
- package/dist/install/setup.js.map +1 -1
- package/dist/llm/build-classifier.d.ts +22 -0
- package/dist/llm/build-classifier.js +42 -0
- package/dist/llm/build-classifier.js.map +1 -0
- package/dist/llm/build-embedder.d.ts +11 -0
- package/dist/llm/build-embedder.js +42 -0
- package/dist/llm/build-embedder.js.map +1 -0
- package/dist/llm/bundled-embedder-client.d.ts +37 -0
- package/dist/llm/bundled-embedder-client.js +90 -0
- package/dist/llm/bundled-embedder-client.js.map +1 -0
- package/dist/llm/classifier-box.d.ts +13 -5
- package/dist/llm/classifier-box.js +28 -6
- package/dist/llm/classifier-box.js.map +1 -1
- package/dist/llm/classifier-egress.d.ts +18 -0
- package/dist/llm/classifier-egress.js +59 -0
- package/dist/llm/classifier-egress.js.map +1 -0
- package/dist/llm/client-shared.d.ts +4 -0
- package/dist/llm/client-shared.js +39 -0
- package/dist/llm/client-shared.js.map +1 -0
- package/dist/llm/deepseek-client.d.ts +20 -0
- package/dist/llm/deepseek-client.js +59 -45
- package/dist/llm/deepseek-client.js.map +1 -1
- package/dist/llm/embedder-info.d.ts +15 -0
- package/dist/llm/embedder-info.js +27 -0
- package/dist/llm/embedder-info.js.map +1 -0
- package/dist/llm/model-quirks.d.ts +4 -0
- package/dist/llm/model-quirks.js +7 -0
- package/dist/llm/model-quirks.js.map +1 -0
- package/dist/llm/naming.d.ts +5 -0
- package/dist/llm/naming.js +20 -0
- package/dist/llm/naming.js.map +1 -0
- package/dist/llm/ollama-client.d.ts +7 -8
- package/dist/llm/ollama-client.js +59 -51
- package/dist/llm/ollama-client.js.map +1 -1
- package/dist/llm/ollama-code-embedder.d.ts +8 -3
- package/dist/llm/ollama-code-embedder.js +14 -24
- package/dist/llm/ollama-code-embedder.js.map +1 -1
- package/dist/llm/openai-code-embedder-client.d.ts +25 -0
- package/dist/llm/openai-code-embedder-client.js +52 -0
- package/dist/llm/openai-code-embedder-client.js.map +1 -0
- package/dist/llm/openai-embedder-client.d.ts +41 -0
- package/dist/llm/openai-embedder-client.js +83 -0
- package/dist/llm/openai-embedder-client.js.map +1 -0
- package/dist/mcp/server.d.ts +69 -2
- package/dist/mcp/server.js +404 -19
- package/dist/mcp/server.js.map +1 -1
- package/dist/ports/code-embedder.d.ts +6 -1
- package/dist/ports/code-exemplar-store.d.ts +5 -0
- package/dist/ports/entity-store.d.ts +35 -0
- package/dist/ports/entity-store.js +7 -0
- package/dist/ports/entity-store.js.map +1 -0
- package/dist/ports/fact-store.d.ts +0 -0
- package/dist/ports/fact-store.js.map +1 -1
- package/dist/ports/llm-client.d.ts +9 -1
- package/dist/ports/outcome.d.ts +85 -0
- package/dist/ports/outcome.js +11 -0
- package/dist/ports/outcome.js.map +1 -0
- package/dist/ports/session-store.d.ts +12 -6
- package/dist/ports/storage.d.ts +7 -30
- package/dist/ports/storage.js +3 -7
- package/dist/ports/storage.js.map +1 -1
- package/dist/ports/transcript-adapter.d.ts +2 -0
- package/dist/ports/workstream-store.d.ts +22 -0
- package/dist/ports/workstream-store.js +2 -0
- package/dist/ports/workstream-store.js.map +1 -0
- package/dist/shared/net.d.ts +3 -0
- package/dist/shared/net.js +4 -0
- package/dist/shared/net.js.map +1 -0
- package/dist/shared/types.d.ts +56 -2
- package/dist/shared/types.js +4 -1
- package/dist/shared/types.js.map +1 -1
- package/dist/ui/assets/{index-CMpQkbQy.js → index-CSaBtgXD.js} +1 -1
- package/dist/ui/index.html +1 -1
- package/fixtures/classifier-gold/README.md +94 -0
- package/fixtures/classifier-gold/reference.json +318 -0
- package/fixtures/classifier-gold/transcripts/01-bug-fix-null-pointer-api.txt +75 -0
- package/fixtures/classifier-gold/transcripts/02-bug-fix-race-condition-queue.txt +77 -0
- package/fixtures/classifier-gold/transcripts/03-bug-fix-jwt-clock-skew.txt +86 -0
- package/fixtures/classifier-gold/transcripts/04-feature-webhook-retry.txt +95 -0
- package/fixtures/classifier-gold/transcripts/05-feature-csv-export.txt +86 -0
- package/fixtures/classifier-gold/transcripts/06-feature-rate-limiting.txt +61 -0
- package/fixtures/classifier-gold/transcripts/07-refactor-db-abstraction.txt +72 -0
- package/fixtures/classifier-gold/transcripts/08-refactor-config-loading.txt +89 -0
- package/fixtures/classifier-gold/transcripts/09-ops-docker-staging.txt +94 -0
- package/fixtures/classifier-gold/transcripts/10-ops-nginx-ssl.txt +121 -0
- package/fixtures/classifier-gold/transcripts/11-ops-postgres-migration.txt +74 -0
- package/fixtures/classifier-gold/transcripts/12-ops-cron-debugging.txt +73 -0
- package/fixtures/classifier-gold/transcripts/13-research-vector-db-comparison.txt +59 -0
- package/fixtures/classifier-gold/transcripts/14-research-oauth-provider.txt +74 -0
- package/fixtures/classifier-gold/transcripts/15-writing-api-docs.txt +154 -0
- package/fixtures/classifier-gold/transcripts/16-meeting-sprint-planning.txt +69 -0
- package/fixtures/classifier-gold/transcripts/17-trivial-list-files.txt +14 -0
- package/fixtures/classifier-gold/transcripts/18-trivial-version-check.txt +21 -0
- package/fixtures/classifier-gold/transcripts/19-trivial-syntax-help.txt +29 -0
- package/fixtures/classifier-gold/transcripts/20-trivial-read-package-json.txt +41 -0
- package/migrations/000_initial_schema.sql +1 -1
- package/migrations/024_backfill_exemplar_repo_basename.sql +32 -0
- package/migrations/025_workstreams.sql +30 -0
- package/migrations/026_embedding_config.sql +12 -0
- package/migrations/027_drop_legacy_session_embeddings.sql +7 -0
- package/migrations/028_classifier_provenance.sql +5 -0
- package/migrations/029_project_scope.sql +21 -0
- package/migrations/032_session_derivables.sql +11 -0
- package/migrations/pg/001_initial.sql +34 -0
- package/migrations/pg/019_split_replaces.sql +16 -7
- package/migrations/pg/025_workstreams.sql +34 -0
- package/migrations/pg/026_embedding_config.sql +12 -0
- package/migrations/pg/028_classifier_provenance.sql +5 -0
- package/migrations/pg/029_entity_variants.sql +9 -0
- package/migrations/pg/030_project_scope.sql +23 -0
- package/migrations/pg/031_widen_session_edges_kind.sql +11 -0
- package/migrations/pg/032_session_derivables.sql +17 -0
- package/nlm/index.js +405 -39
- package/package.json +12 -2
- package/plugin/.codex-plugin/plugin.json +2 -2
- package/plugin/scripts/prompt-recall-hook.mjs +413 -43
- package/plugin/scripts/session-start-hook.mjs +295 -61
- package/plugin/scripts/stop-hook.mjs +89 -66
- package/plugin-hermes-agent/__init__.py +2 -1
- package/templates/agent-contract/README.md +24 -0
- package/templates/agent-contract/claude-code.md +40 -0
- package/templates/agent-contract/generic.md +38 -0
- package/dist/core/embedding/embed-normalize.d.ts +0 -28
- package/dist/core/embedding/embed-normalize.js +0 -98
- package/dist/core/embedding/embed-normalize.js.map +0 -1
- package/dist/core/storage/pg-tx-context.d.ts +0 -52
- package/dist/core/storage/pg-tx-context.js +0 -149
- package/dist/core/storage/pg-tx-context.js.map +0 -1
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* embed-backfill — re-embed every session in canonical.sqlite into the
|
|
3
|
-
* chunk + max-pool index (session_embedding_chunks).
|
|
4
|
-
* one-vector-per-session backfill that wrote to session_embeddings.
|
|
3
|
+
* chunk + max-pool index (session_embedding_chunks).
|
|
5
4
|
*
|
|
6
5
|
* For each session: chunk (label + summary + body) via chunkSessionText,
|
|
7
6
|
* embed each chunk with kind="document", and write to the chunk table +
|
|
@@ -12,6 +11,12 @@
|
|
|
12
11
|
* session ids. A session is considered "done" only when ALL its chunks
|
|
13
12
|
* embed successfully — partial sessions are retried on the next run.
|
|
14
13
|
*
|
|
14
|
+
* When the probed embedder dim/model/provider differs from the stored
|
|
15
|
+
* embedding_config prose row, both vec tables are dropped and recreated at
|
|
16
|
+
* the new dim before the session loop runs. Facts (superseded_by IS NULL
|
|
17
|
+
* AND retired_at IS NULL) are reembedded immediately after the session
|
|
18
|
+
* loop. Same-config reruns skip the rebuild and reembed sessions only.
|
|
19
|
+
*
|
|
15
20
|
* Layering: depends on the LLMClient port. SQLite touched directly via
|
|
16
21
|
* better-sqlite3 because this is a one-shot operational tool, not a hot
|
|
17
22
|
* path. Lives under core/ but is invoked from the CLI composition root.
|
|
@@ -23,22 +28,26 @@ import Database from "better-sqlite3";
|
|
|
23
28
|
import * as sqliteVec from "sqlite-vec";
|
|
24
29
|
import { LLMUnreachableError } from "../../ports/llm-client.js";
|
|
25
30
|
import { chunkSessionText } from "../embedding/chunk-body.js";
|
|
31
|
+
import { SqliteEmbeddingConfigStore } from "../storage/sqlite-embedding-config.js";
|
|
26
32
|
const DEFAULT_STATE_PATH = join(homedir(), ".nlm", "embed_reembed.state");
|
|
27
33
|
const SAVE_EVERY = 25;
|
|
28
|
-
function
|
|
34
|
+
function loadStateData(path) {
|
|
29
35
|
if (!existsSync(path))
|
|
30
|
-
return new Set();
|
|
36
|
+
return { done: new Set() };
|
|
31
37
|
try {
|
|
32
|
-
const
|
|
33
|
-
return new Set(
|
|
38
|
+
const raw = JSON.parse(readFileSync(path, "utf8"));
|
|
39
|
+
return { done: new Set(raw.done ?? []), ...(raw.config ? { config: raw.config } : {}) };
|
|
34
40
|
}
|
|
35
41
|
catch {
|
|
36
|
-
return new Set();
|
|
42
|
+
return { done: new Set() };
|
|
37
43
|
}
|
|
38
44
|
}
|
|
39
|
-
function saveState(path, done) {
|
|
45
|
+
function saveState(path, done, config) {
|
|
40
46
|
mkdirSync(dirname(path), { recursive: true });
|
|
41
|
-
|
|
47
|
+
const data = { done: [...done].sort() };
|
|
48
|
+
if (config)
|
|
49
|
+
data.config = config;
|
|
50
|
+
writeFileSync(path, JSON.stringify(data));
|
|
42
51
|
}
|
|
43
52
|
export async function reembedCorpus(opts) {
|
|
44
53
|
const statePath = opts.statePath ?? DEFAULT_STATE_PATH;
|
|
@@ -47,31 +56,126 @@ export async function reembedCorpus(opts) {
|
|
|
47
56
|
}
|
|
48
57
|
const db = new Database(opts.dbPath);
|
|
49
58
|
sqliteVec.load(db);
|
|
50
|
-
// Backfill every session with content; live ingest covers ongoing writes.
|
|
51
|
-
// The state file dedupes across runs so partial completion resumes cleanly.
|
|
52
|
-
const sql = "SELECT s.id, s.label, s.summary, s.body FROM sessions s " +
|
|
53
|
-
"WHERE s.body IS NOT NULL OR s.summary IS NOT NULL OR s.label IS NOT NULL " +
|
|
54
|
-
"ORDER BY s.started_at" +
|
|
55
|
-
(opts.limit ? ` LIMIT ${Math.trunc(opts.limit)}` : "");
|
|
56
|
-
const rows = db.prepare(sql).all();
|
|
57
|
-
const total = rows.length;
|
|
58
|
-
const done = loadState(statePath);
|
|
59
|
-
const selectChunks = db.prepare("SELECT chunk_id FROM session_chunk_map WHERE session_id = ?");
|
|
60
|
-
const delChunks = (sessionId) => {
|
|
61
|
-
const existing = selectChunks.all(sessionId);
|
|
62
|
-
if (existing.length === 0)
|
|
63
|
-
return;
|
|
64
|
-
const placeholders = existing.map(() => "?").join(",");
|
|
65
|
-
const ids = existing.map((r) => r.chunk_id);
|
|
66
|
-
db.prepare(`DELETE FROM session_embedding_chunks WHERE chunk_id IN (${placeholders})`).run(...ids);
|
|
67
|
-
db.prepare("DELETE FROM session_chunk_map WHERE session_id = ?").run(sessionId);
|
|
68
|
-
};
|
|
69
|
-
const insChunk = db.prepare("INSERT INTO session_embedding_chunks (embedding, session_id, chunk_idx) VALUES (?, ?, ?)");
|
|
70
|
-
const insMap = db.prepare("INSERT INTO session_chunk_map (chunk_id, session_id, chunk_idx) VALUES (?, ?, ?)");
|
|
71
|
-
let succeeded = 0;
|
|
72
|
-
let failed = 0;
|
|
73
|
-
let skipped = 0;
|
|
74
59
|
try {
|
|
60
|
+
const configTableRow = db
|
|
61
|
+
.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='embedding_config'")
|
|
62
|
+
.get();
|
|
63
|
+
if (!configTableRow) {
|
|
64
|
+
throw new Error("embedding_config table not found; run `nlm migrate` to apply pending migrations");
|
|
65
|
+
}
|
|
66
|
+
const probeResult = await opts.embedder.embed("nlm dimension probe", "query");
|
|
67
|
+
const dim = probeResult.vector.length;
|
|
68
|
+
const model = probeResult.model;
|
|
69
|
+
const provider = opts.embedderProvider ?? process.env["NLM_EMBED_PROVIDER"] ?? "ollama";
|
|
70
|
+
const runtimeConfig = { lane: "prose", provider, model, dim };
|
|
71
|
+
const configStore = new SqliteEmbeddingConfigStore(db);
|
|
72
|
+
const storedConfig = configStore.getLane("prose");
|
|
73
|
+
const stateData = loadStateData(statePath);
|
|
74
|
+
let configMatch = false;
|
|
75
|
+
let needsRebuild = false;
|
|
76
|
+
if (storedConfig !== null) {
|
|
77
|
+
configMatch =
|
|
78
|
+
storedConfig.provider === runtimeConfig.provider &&
|
|
79
|
+
storedConfig.model === runtimeConfig.model &&
|
|
80
|
+
storedConfig.dim === runtimeConfig.dim;
|
|
81
|
+
if (!configMatch) {
|
|
82
|
+
// An interrupted rebuild already dropped+recreated the tables if the
|
|
83
|
+
// state file carries a matching config. Resume without re-dropping.
|
|
84
|
+
const stateConfigMatches = stateData.config !== undefined &&
|
|
85
|
+
stateData.config.provider === runtimeConfig.provider &&
|
|
86
|
+
stateData.config.model === runtimeConfig.model &&
|
|
87
|
+
stateData.config.dim === runtimeConfig.dim;
|
|
88
|
+
if (!stateConfigMatches) {
|
|
89
|
+
needsRebuild = true;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Resume state: stored config differs from runtime, but the state file already
|
|
94
|
+
// carries the new config (tables were rebuilt in a prior interrupted run).
|
|
95
|
+
// No re-drop is needed, but facts must still be reembedded to finish the run.
|
|
96
|
+
const isResumeState = storedConfig !== null && !configMatch && !needsRebuild;
|
|
97
|
+
if (opts.dryRun) {
|
|
98
|
+
if (needsRebuild) {
|
|
99
|
+
const stored = storedConfig;
|
|
100
|
+
process.stderr.write(`[embed-backfill] dim mismatch: stored ${stored.provider}/${stored.model}@${stored.dim},` +
|
|
101
|
+
` runtime ${provider}/${model}@${dim}.` +
|
|
102
|
+
` Would DROP session_embedding_chunks, session_chunk_map entries, fact_embeddings.\n`);
|
|
103
|
+
}
|
|
104
|
+
else if (isResumeState) {
|
|
105
|
+
const stored = storedConfig;
|
|
106
|
+
process.stderr.write(`[embed-backfill] resume state: interrupted rebuild detected.` +
|
|
107
|
+
` Stored config ${stored.provider}/${stored.model}@${stored.dim}` +
|
|
108
|
+
` differs from runtime ${provider}/${model}@${dim},` +
|
|
109
|
+
` but state file already matches runtime.` +
|
|
110
|
+
` No re-drop; facts would be reembedded to complete the interrupted rebuild.\n`);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
process.stderr.write(`[embed-backfill] dry-run: config matches (${provider}/${model}@${dim}), no rebuild needed.\n`);
|
|
114
|
+
}
|
|
115
|
+
let dryRunFactCount = 0;
|
|
116
|
+
if (isResumeState) {
|
|
117
|
+
dryRunFactCount = db
|
|
118
|
+
.prepare("SELECT id FROM facts WHERE superseded_by IS NULL AND retired_at IS NULL")
|
|
119
|
+
.all().length;
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
total: 0,
|
|
123
|
+
processed: 0,
|
|
124
|
+
succeeded: 0,
|
|
125
|
+
failed: 0,
|
|
126
|
+
skippedAlreadyDone: 0,
|
|
127
|
+
dbMissing: false,
|
|
128
|
+
dryRun: true,
|
|
129
|
+
rebuilt: needsRebuild,
|
|
130
|
+
factsReembedded: dryRunFactCount,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
if (needsRebuild) {
|
|
134
|
+
const stored = storedConfig;
|
|
135
|
+
process.stderr.write(`[embed-backfill] rebuilding vec tables: stored ${stored.provider}/${stored.model}@${stored.dim}` +
|
|
136
|
+
` vs runtime ${provider}/${model}@${dim}\n`);
|
|
137
|
+
process.stderr.write(`[embed-backfill] DROP TABLE IF EXISTS session_embedding_chunks\n`);
|
|
138
|
+
db.exec("DROP TABLE IF EXISTS session_embedding_chunks");
|
|
139
|
+
db.exec(`CREATE VIRTUAL TABLE session_embedding_chunks USING vec0(` +
|
|
140
|
+
`chunk_id INTEGER PRIMARY KEY, ` +
|
|
141
|
+
`embedding float[${dim}], ` +
|
|
142
|
+
`+session_id TEXT, ` +
|
|
143
|
+
`+chunk_idx INTEGER` +
|
|
144
|
+
`)`);
|
|
145
|
+
db.exec("DELETE FROM session_chunk_map");
|
|
146
|
+
process.stderr.write(`[embed-backfill] DROP TABLE IF EXISTS fact_embeddings\n`);
|
|
147
|
+
db.exec("DROP TABLE IF EXISTS fact_embeddings");
|
|
148
|
+
db.exec(`CREATE VIRTUAL TABLE fact_embeddings USING vec0(` +
|
|
149
|
+
`fact_id TEXT PRIMARY KEY, ` +
|
|
150
|
+
`embedding float[${dim}]` +
|
|
151
|
+
`)`);
|
|
152
|
+
// Ignore the stale state file; start fresh for this config.
|
|
153
|
+
stateData.done = new Set();
|
|
154
|
+
}
|
|
155
|
+
// Backfill every session with content; live ingest covers ongoing writes.
|
|
156
|
+
// The state file dedupes across runs so partial completion resumes cleanly.
|
|
157
|
+
const sql = "SELECT s.id, s.label, s.summary, s.body FROM sessions s " +
|
|
158
|
+
"WHERE s.body IS NOT NULL OR s.summary IS NOT NULL OR s.label IS NOT NULL " +
|
|
159
|
+
"ORDER BY s.started_at" +
|
|
160
|
+
(opts.limit ? ` LIMIT ${Math.trunc(opts.limit)}` : "");
|
|
161
|
+
const rows = db.prepare(sql).all();
|
|
162
|
+
const total = rows.length;
|
|
163
|
+
const done = stateData.done;
|
|
164
|
+
const selectChunks = db.prepare("SELECT chunk_id FROM session_chunk_map WHERE session_id = ?");
|
|
165
|
+
const delChunks = (sessionId) => {
|
|
166
|
+
const existing = selectChunks.all(sessionId);
|
|
167
|
+
if (existing.length === 0)
|
|
168
|
+
return;
|
|
169
|
+
const placeholders = existing.map(() => "?").join(",");
|
|
170
|
+
const ids = existing.map((r) => r.chunk_id);
|
|
171
|
+
db.prepare(`DELETE FROM session_embedding_chunks WHERE chunk_id IN (${placeholders})`).run(...ids);
|
|
172
|
+
db.prepare("DELETE FROM session_chunk_map WHERE session_id = ?").run(sessionId);
|
|
173
|
+
};
|
|
174
|
+
const insChunk = db.prepare("INSERT INTO session_embedding_chunks (embedding, session_id, chunk_idx) VALUES (?, ?, ?)");
|
|
175
|
+
const insMap = db.prepare("INSERT INTO session_chunk_map (chunk_id, session_id, chunk_idx) VALUES (?, ?, ?)");
|
|
176
|
+
let succeeded = 0;
|
|
177
|
+
let failed = 0;
|
|
178
|
+
let skipped = 0;
|
|
75
179
|
for (let i = 0; i < rows.length; i++) {
|
|
76
180
|
const row = rows[i];
|
|
77
181
|
const idx = i + 1;
|
|
@@ -143,20 +247,54 @@ export async function reembedCorpus(opts) {
|
|
|
143
247
|
: `PARTIAL (${vectors.length}/${chunks.length} chunks, ${chunkSkipped} skipped)`;
|
|
144
248
|
opts.onProgress?.(idx, total, row.id, status);
|
|
145
249
|
if (succeeded % SAVE_EVERY === 0)
|
|
146
|
-
saveState(statePath, done);
|
|
250
|
+
saveState(statePath, done, { provider, model, dim });
|
|
251
|
+
}
|
|
252
|
+
// Reembed facts whenever the stored config does not match the runtime config
|
|
253
|
+
// (storedConfig exists but configMatch is false). This covers both fresh
|
|
254
|
+
// rebuilds and interrupted rebuilds that resume: after a rebuild the tables
|
|
255
|
+
// are empty and the state file carries the new config, but the embedding_config
|
|
256
|
+
// row is only updated on successful completion, so storedConfig still holds
|
|
257
|
+
// the old values. Gating on needsRebuild alone skips facts in that resume path.
|
|
258
|
+
let factsReembedded = 0;
|
|
259
|
+
if (storedConfig !== null && !configMatch) {
|
|
260
|
+
const factRows = db
|
|
261
|
+
.prepare("SELECT id, subject, predicate, value FROM facts" +
|
|
262
|
+
" WHERE superseded_by IS NULL AND retired_at IS NULL")
|
|
263
|
+
.all();
|
|
264
|
+
const delFactEmb = db.prepare("DELETE FROM fact_embeddings WHERE fact_id = ?");
|
|
265
|
+
const insFactEmb = db.prepare("INSERT INTO fact_embeddings (fact_id, embedding) VALUES (?, ?)");
|
|
266
|
+
for (const fact of factRows) {
|
|
267
|
+
const factText = `${fact.subject} ${fact.predicate} ${fact.value}`.trim();
|
|
268
|
+
if (!factText)
|
|
269
|
+
continue;
|
|
270
|
+
try {
|
|
271
|
+
const out = await opts.embedder.embed(factText, "document");
|
|
272
|
+
const blob = Buffer.from(out.vector.buffer, out.vector.byteOffset, out.vector.byteLength);
|
|
273
|
+
delFactEmb.run(fact.id);
|
|
274
|
+
insFactEmb.run(fact.id, blob);
|
|
275
|
+
factsReembedded += 1;
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
// Best-effort: fact row survives; semantic recall misses it until re-run.
|
|
279
|
+
}
|
|
280
|
+
}
|
|
147
281
|
}
|
|
148
|
-
|
|
282
|
+
// Upsert prose config row on successful completion and persist final state.
|
|
283
|
+
configStore.upsertLane(runtimeConfig, new Date().toISOString());
|
|
284
|
+
saveState(statePath, done, { provider, model, dim });
|
|
285
|
+
return {
|
|
286
|
+
total,
|
|
287
|
+
processed: succeeded + failed + skipped,
|
|
288
|
+
succeeded,
|
|
289
|
+
failed,
|
|
290
|
+
skippedAlreadyDone: skipped,
|
|
291
|
+
dbMissing: false,
|
|
292
|
+
rebuilt: needsRebuild,
|
|
293
|
+
factsReembedded,
|
|
294
|
+
};
|
|
149
295
|
}
|
|
150
296
|
finally {
|
|
151
297
|
db.close();
|
|
152
298
|
}
|
|
153
|
-
return {
|
|
154
|
-
total,
|
|
155
|
-
processed: succeeded + failed + skipped,
|
|
156
|
-
succeeded,
|
|
157
|
-
failed,
|
|
158
|
-
skippedAlreadyDone: skipped,
|
|
159
|
-
dbMissing: false,
|
|
160
|
-
};
|
|
161
299
|
}
|
|
162
300
|
//# sourceMappingURL=embed-backfill.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embed-backfill.js","sourceRoot":"","sources":["../../../src/core/embedding/embed-backfill.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"embed-backfill.js","sourceRoot":"","sources":["../../../src/core/embedding/embed-backfill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type EmbeddingLane = "prose" | "code";
|
|
2
|
+
export interface EmbeddingLaneConfig {
|
|
3
|
+
readonly lane: EmbeddingLane;
|
|
4
|
+
readonly provider: string;
|
|
5
|
+
readonly model: string;
|
|
6
|
+
readonly dim: number;
|
|
7
|
+
}
|
|
8
|
+
export interface EmbeddingConfigStore {
|
|
9
|
+
getLane(lane: EmbeddingLane): EmbeddingLaneConfig | null;
|
|
10
|
+
upsertLane(cfg: EmbeddingLaneConfig, updatedAtIso: string): void;
|
|
11
|
+
}
|
|
12
|
+
export type LaneReconcileState = "recorded" | "match" | "stale";
|
|
13
|
+
export interface LaneReconcileResult {
|
|
14
|
+
readonly state: LaneReconcileState;
|
|
15
|
+
readonly stored: EmbeddingLaneConfig | null;
|
|
16
|
+
}
|
|
17
|
+
export declare function reconcileLane(store: EmbeddingConfigStore, runtime: EmbeddingLaneConfig, nowIso: string): LaneReconcileResult;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function reconcileLane(store, runtime, nowIso) {
|
|
2
|
+
const stored = store.getLane(runtime.lane);
|
|
3
|
+
if (!stored) {
|
|
4
|
+
store.upsertLane(runtime, nowIso);
|
|
5
|
+
return { state: "recorded", stored: null };
|
|
6
|
+
}
|
|
7
|
+
const match = stored.provider === runtime.provider &&
|
|
8
|
+
stored.model === runtime.model &&
|
|
9
|
+
stored.dim === runtime.dim;
|
|
10
|
+
return { state: match ? "match" : "stale", stored };
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=embedding-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-config.js","sourceRoot":"","sources":["../../../src/core/embedding/embedding-config.ts"],"names":[],"mappings":"AAqBA,MAAM,UAAU,aAAa,CAC3B,KAA2B,EAC3B,OAA4B,EAC5B,MAAc;IAEd,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAClC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC7C,CAAC;IACD,MAAM,KAAK,GACT,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ;QACpC,MAAM,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK;QAC9B,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC;IAC7B,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pg-embed-backfill -- re-embed every session in the Postgres store into
|
|
3
|
+
* session_embedding_chunks. Mirrors reembedCorpus from embed-backfill.ts
|
|
4
|
+
* but drives a pg Pool instead of a SQLite file.
|
|
5
|
+
*
|
|
6
|
+
* Resumable via a JSON state file at $NLM_EMBED_STATE (default
|
|
7
|
+
* ~/.nlm/embed_reembed_pg.state). Same SAVE_EVERY = 25 checkpoint cadence.
|
|
8
|
+
*
|
|
9
|
+
* When the probed dim/model/provider differs from the stored embedding_config
|
|
10
|
+
* row, both vector tables are rebuilt: rows cleared, the embedding column
|
|
11
|
+
* altered to the new dimension, and indexes recreated. Facts (superseded_by
|
|
12
|
+
* IS NULL AND retired_at IS NULL) are reembedded after the session loop.
|
|
13
|
+
* Same-config reruns skip the rebuild.
|
|
14
|
+
*
|
|
15
|
+
* CRITICAL: the final config write is an awaited pool.query() INSERT ON
|
|
16
|
+
* CONFLICT -- never routed through PgEmbeddingConfigStore.upsertLane, which
|
|
17
|
+
* is fire-and-forget and can be lost when pool.end() follows.
|
|
18
|
+
*/
|
|
19
|
+
import type { LLMClient } from "../../ports/llm-client.js";
|
|
20
|
+
import type { BackfillReport } from "../embedding/embed-backfill.js";
|
|
21
|
+
export type { BackfillReport };
|
|
22
|
+
export interface PgBackfillOptions {
|
|
23
|
+
readonly pgUrl: string;
|
|
24
|
+
readonly embedder: LLMClient;
|
|
25
|
+
readonly statePath?: string;
|
|
26
|
+
readonly limit?: number;
|
|
27
|
+
readonly dryRun?: boolean;
|
|
28
|
+
readonly embedderProvider?: string;
|
|
29
|
+
readonly onProgress?: (i: number, total: number, sid: string, status: string) => void;
|
|
30
|
+
}
|
|
31
|
+
export declare function reembedCorpusPg(opts: PgBackfillOptions): Promise<BackfillReport>;
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pg-embed-backfill -- re-embed every session in the Postgres store into
|
|
3
|
+
* session_embedding_chunks. Mirrors reembedCorpus from embed-backfill.ts
|
|
4
|
+
* but drives a pg Pool instead of a SQLite file.
|
|
5
|
+
*
|
|
6
|
+
* Resumable via a JSON state file at $NLM_EMBED_STATE (default
|
|
7
|
+
* ~/.nlm/embed_reembed_pg.state). Same SAVE_EVERY = 25 checkpoint cadence.
|
|
8
|
+
*
|
|
9
|
+
* When the probed dim/model/provider differs from the stored embedding_config
|
|
10
|
+
* row, both vector tables are rebuilt: rows cleared, the embedding column
|
|
11
|
+
* altered to the new dimension, and indexes recreated. Facts (superseded_by
|
|
12
|
+
* IS NULL AND retired_at IS NULL) are reembedded after the session loop.
|
|
13
|
+
* Same-config reruns skip the rebuild.
|
|
14
|
+
*
|
|
15
|
+
* CRITICAL: the final config write is an awaited pool.query() INSERT ON
|
|
16
|
+
* CONFLICT -- never routed through PgEmbeddingConfigStore.upsertLane, which
|
|
17
|
+
* is fire-and-forget and can be lost when pool.end() follows.
|
|
18
|
+
*/
|
|
19
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
20
|
+
import { dirname, join } from "node:path";
|
|
21
|
+
import { homedir } from "node:os";
|
|
22
|
+
import { Pool } from "pg";
|
|
23
|
+
import { LLMUnreachableError } from "../../ports/llm-client.js";
|
|
24
|
+
import { chunkSessionText } from "../embedding/chunk-body.js";
|
|
25
|
+
const DEFAULT_STATE_PATH = join(homedir(), ".nlm", "embed_reembed_pg.state");
|
|
26
|
+
const SAVE_EVERY = 25;
|
|
27
|
+
function loadStateData(path) {
|
|
28
|
+
if (!existsSync(path))
|
|
29
|
+
return { done: new Set() };
|
|
30
|
+
try {
|
|
31
|
+
const raw = JSON.parse(readFileSync(path, "utf8"));
|
|
32
|
+
return { done: new Set(raw.done ?? []), ...(raw.config ? { config: raw.config } : {}) };
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return { done: new Set() };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function saveState(path, done, config) {
|
|
39
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
40
|
+
const data = { done: [...done].sort() };
|
|
41
|
+
if (config)
|
|
42
|
+
data.config = config;
|
|
43
|
+
writeFileSync(path, JSON.stringify(data));
|
|
44
|
+
}
|
|
45
|
+
export async function reembedCorpusPg(opts) {
|
|
46
|
+
const statePath = opts.statePath ?? DEFAULT_STATE_PATH;
|
|
47
|
+
const pool = new Pool({ connectionString: opts.pgUrl });
|
|
48
|
+
try {
|
|
49
|
+
const tableCheck = await pool.query("SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'embedding_config') AS exists");
|
|
50
|
+
if (!tableCheck.rows[0]?.exists) {
|
|
51
|
+
throw new Error("embedding_config table not found; run `nlm migrate` to apply pending migrations");
|
|
52
|
+
}
|
|
53
|
+
const probeResult = await opts.embedder.embed("nlm dimension probe", "query");
|
|
54
|
+
const dim = probeResult.vector.length;
|
|
55
|
+
const model = probeResult.model;
|
|
56
|
+
const provider = opts.embedderProvider ?? process.env["NLM_EMBED_PROVIDER"] ?? "ollama";
|
|
57
|
+
const cfgRows = await pool.query("SELECT provider, model, dim FROM embedding_config WHERE lane = 'prose'");
|
|
58
|
+
const storedConfig = cfgRows.rows[0] ?? null;
|
|
59
|
+
const stateData = loadStateData(statePath);
|
|
60
|
+
let configMatch = false;
|
|
61
|
+
let needsRebuild = false;
|
|
62
|
+
if (storedConfig !== null) {
|
|
63
|
+
configMatch =
|
|
64
|
+
storedConfig.provider === provider &&
|
|
65
|
+
storedConfig.model === model &&
|
|
66
|
+
storedConfig.dim === dim;
|
|
67
|
+
if (!configMatch) {
|
|
68
|
+
const stateConfigMatches = stateData.config !== undefined &&
|
|
69
|
+
stateData.config.provider === provider &&
|
|
70
|
+
stateData.config.model === model &&
|
|
71
|
+
stateData.config.dim === dim;
|
|
72
|
+
if (!stateConfigMatches) {
|
|
73
|
+
needsRebuild = true;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Resume state: stored config differs from runtime, but the state file already
|
|
78
|
+
// carries the new config (tables were rebuilt in a prior interrupted run).
|
|
79
|
+
// No column alter is needed, but facts must still be reembedded to finish the run.
|
|
80
|
+
const isResumeState = storedConfig !== null && !configMatch && !needsRebuild;
|
|
81
|
+
if (opts.dryRun) {
|
|
82
|
+
if (needsRebuild) {
|
|
83
|
+
const stored = storedConfig;
|
|
84
|
+
process.stderr.write(`[pg-embed-backfill] dim mismatch: stored ${stored.provider}/${stored.model}@${stored.dim},` +
|
|
85
|
+
` runtime ${provider}/${model}@${dim}.` +
|
|
86
|
+
` Would ALTER session_embedding_chunks and fact_embeddings to vector(${dim}).\n`);
|
|
87
|
+
}
|
|
88
|
+
else if (isResumeState) {
|
|
89
|
+
const stored = storedConfig;
|
|
90
|
+
process.stderr.write(`[pg-embed-backfill] resume state: interrupted rebuild detected.` +
|
|
91
|
+
` Stored config ${stored.provider}/${stored.model}@${stored.dim}` +
|
|
92
|
+
` differs from runtime ${provider}/${model}@${dim},` +
|
|
93
|
+
` but state file already matches runtime.` +
|
|
94
|
+
` No column alter; facts would be reembedded to complete the interrupted rebuild.\n`);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
process.stderr.write(`[pg-embed-backfill] dry-run: config matches (${provider}/${model}@${dim}), no rebuild needed.\n`);
|
|
98
|
+
}
|
|
99
|
+
let dryRunFactCount = 0;
|
|
100
|
+
if (isResumeState) {
|
|
101
|
+
const countResult = await pool.query("SELECT COUNT(*) AS cnt FROM facts WHERE superseded_by IS NULL AND retired_at IS NULL");
|
|
102
|
+
dryRunFactCount = Number(countResult.rows[0]?.cnt ?? 0);
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
total: 0,
|
|
106
|
+
processed: 0,
|
|
107
|
+
succeeded: 0,
|
|
108
|
+
failed: 0,
|
|
109
|
+
skippedAlreadyDone: 0,
|
|
110
|
+
dbMissing: false,
|
|
111
|
+
dryRun: true,
|
|
112
|
+
rebuilt: needsRebuild,
|
|
113
|
+
factsReembedded: dryRunFactCount,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
if (needsRebuild) {
|
|
117
|
+
const stored = storedConfig;
|
|
118
|
+
process.stderr.write(`[pg-embed-backfill] rebuilding vec tables: stored ${stored.provider}/${stored.model}@${stored.dim}` +
|
|
119
|
+
` vs runtime ${provider}/${model}@${dim}\n`);
|
|
120
|
+
process.stderr.write(`[pg-embed-backfill] DELETE FROM session_embedding_chunks\n`);
|
|
121
|
+
await pool.query("DELETE FROM session_embedding_chunks");
|
|
122
|
+
await pool.query("DROP INDEX IF EXISTS session_chunks_embedding_idx");
|
|
123
|
+
await pool.query(`ALTER TABLE session_embedding_chunks ALTER COLUMN embedding TYPE vector(${dim})`);
|
|
124
|
+
await pool.query(`CREATE INDEX session_chunks_embedding_idx` +
|
|
125
|
+
` ON session_embedding_chunks USING ivfflat (embedding vector_l2_ops) WITH (lists = 100)`);
|
|
126
|
+
process.stderr.write(`[pg-embed-backfill] rebuilding fact_embeddings to vector(${dim})\n`);
|
|
127
|
+
await pool.query("DELETE FROM fact_embeddings");
|
|
128
|
+
await pool.query("DROP INDEX IF EXISTS fact_embeddings_idx");
|
|
129
|
+
await pool.query(`ALTER TABLE fact_embeddings ALTER COLUMN embedding TYPE vector(${dim})`);
|
|
130
|
+
await pool.query(`CREATE INDEX fact_embeddings_idx` +
|
|
131
|
+
` ON fact_embeddings USING ivfflat (embedding vector_l2_ops) WITH (lists = 100)`);
|
|
132
|
+
stateData.done = new Set();
|
|
133
|
+
}
|
|
134
|
+
const limitClause = opts.limit ? ` LIMIT ${Math.trunc(opts.limit)}` : "";
|
|
135
|
+
const sessionResult = await pool.query("SELECT id, label, summary, body FROM sessions" +
|
|
136
|
+
" WHERE body IS NOT NULL OR summary IS NOT NULL OR label IS NOT NULL" +
|
|
137
|
+
" ORDER BY started_at" +
|
|
138
|
+
limitClause);
|
|
139
|
+
const rows = sessionResult.rows;
|
|
140
|
+
const total = rows.length;
|
|
141
|
+
const done = stateData.done;
|
|
142
|
+
let succeeded = 0;
|
|
143
|
+
let failed = 0;
|
|
144
|
+
let skipped = 0;
|
|
145
|
+
for (let i = 0; i < rows.length; i++) {
|
|
146
|
+
const row = rows[i];
|
|
147
|
+
const idx = i + 1;
|
|
148
|
+
if (done.has(row.id)) {
|
|
149
|
+
skipped += 1;
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
const chunks = chunkSessionText({
|
|
153
|
+
label: row.label,
|
|
154
|
+
summary: row.summary,
|
|
155
|
+
body: row.body,
|
|
156
|
+
});
|
|
157
|
+
if (chunks.length === 0) {
|
|
158
|
+
failed += 1;
|
|
159
|
+
opts.onProgress?.(idx, total, row.id, "SKIP (no text)");
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
await pool.query("DELETE FROM session_embedding_chunks WHERE session_id = $1", [row.id]);
|
|
163
|
+
const vectors = [];
|
|
164
|
+
let chunkSkipped = 0;
|
|
165
|
+
for (let c = 0; c < chunks.length; c++) {
|
|
166
|
+
const chunk = chunks[c];
|
|
167
|
+
let lastErr;
|
|
168
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
169
|
+
try {
|
|
170
|
+
const out = await opts.embedder.embed(chunk, "document");
|
|
171
|
+
vectors.push({ idx: c, vec: out.vector });
|
|
172
|
+
lastErr = undefined;
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
catch (e) {
|
|
176
|
+
lastErr = e;
|
|
177
|
+
if (!(e instanceof LLMUnreachableError))
|
|
178
|
+
throw e;
|
|
179
|
+
if (attempt === 0)
|
|
180
|
+
await new Promise((r) => setTimeout(r, 200));
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (lastErr !== undefined)
|
|
184
|
+
chunkSkipped += 1;
|
|
185
|
+
}
|
|
186
|
+
if (vectors.length === 0) {
|
|
187
|
+
failed += 1;
|
|
188
|
+
opts.onProgress?.(idx, total, row.id, `FAIL (embedder, ${chunkSkipped}/${chunks.length} chunks)`);
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
try {
|
|
192
|
+
for (const { idx: cidx, vec } of vectors) {
|
|
193
|
+
const vecStr = `[${Array.from(vec).join(",")}]`;
|
|
194
|
+
const ins = await pool.query(`INSERT INTO session_embedding_chunks (session_id, chunk_idx, embedding)
|
|
195
|
+
VALUES ($1, $2, $3::vector) RETURNING chunk_id`, [row.id, cidx, vecStr]);
|
|
196
|
+
const chunkId = ins.rows[0].chunk_id;
|
|
197
|
+
await pool.query("INSERT INTO session_chunk_map (chunk_id, session_id, chunk_idx) VALUES ($1, $2, $3)", [chunkId, row.id, cidx]);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
catch (e) {
|
|
201
|
+
failed += 1;
|
|
202
|
+
opts.onProgress?.(idx, total, row.id, `FAIL (db): ${e.message}`);
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
done.add(row.id);
|
|
206
|
+
succeeded += 1;
|
|
207
|
+
const status = chunkSkipped === 0
|
|
208
|
+
? `OK (${vectors.length} chunks)`
|
|
209
|
+
: `PARTIAL (${vectors.length}/${chunks.length} chunks, ${chunkSkipped} skipped)`;
|
|
210
|
+
opts.onProgress?.(idx, total, row.id, status);
|
|
211
|
+
if (succeeded % SAVE_EVERY === 0)
|
|
212
|
+
saveState(statePath, done, { provider, model, dim });
|
|
213
|
+
}
|
|
214
|
+
// Reembed facts whenever the stored config does not match the runtime config
|
|
215
|
+
// (storedConfig exists but configMatch is false). This covers both fresh
|
|
216
|
+
// rebuilds and interrupted rebuilds that resume: the embedding_config row
|
|
217
|
+
// is only updated on successful completion, so storedConfig still holds
|
|
218
|
+
// the old values during a partial run. Gating on needsRebuild alone skips
|
|
219
|
+
// facts in that resume path.
|
|
220
|
+
let factsReembedded = 0;
|
|
221
|
+
if (storedConfig !== null && !configMatch) {
|
|
222
|
+
const factResult = await pool.query("SELECT id, subject, predicate, value FROM facts" +
|
|
223
|
+
" WHERE superseded_by IS NULL AND retired_at IS NULL");
|
|
224
|
+
for (const fact of factResult.rows) {
|
|
225
|
+
const factText = `${fact.subject} ${fact.predicate} ${fact.value}`.trim();
|
|
226
|
+
if (!factText)
|
|
227
|
+
continue;
|
|
228
|
+
try {
|
|
229
|
+
const out = await opts.embedder.embed(factText, "document");
|
|
230
|
+
const vecStr = `[${Array.from(out.vector).join(",")}]`;
|
|
231
|
+
await pool.query(`INSERT INTO fact_embeddings (fact_id, embedding)
|
|
232
|
+
VALUES ($1, $2::vector)
|
|
233
|
+
ON CONFLICT (fact_id) DO UPDATE SET embedding = EXCLUDED.embedding`, [fact.id, vecStr]);
|
|
234
|
+
factsReembedded += 1;
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
// Best-effort: fact row survives; semantic recall misses it until re-run.
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
await pool.query(`INSERT INTO embedding_config (lane, provider, model, dim, updated_at)
|
|
242
|
+
VALUES ($1, $2, $3, $4, $5)
|
|
243
|
+
ON CONFLICT (lane) DO UPDATE SET
|
|
244
|
+
provider = EXCLUDED.provider,
|
|
245
|
+
model = EXCLUDED.model,
|
|
246
|
+
dim = EXCLUDED.dim,
|
|
247
|
+
updated_at = EXCLUDED.updated_at`, ["prose", provider, model, dim, new Date().toISOString()]);
|
|
248
|
+
saveState(statePath, done, { provider, model, dim });
|
|
249
|
+
return {
|
|
250
|
+
total,
|
|
251
|
+
processed: succeeded + failed + skipped,
|
|
252
|
+
succeeded,
|
|
253
|
+
failed,
|
|
254
|
+
skippedAlreadyDone: skipped,
|
|
255
|
+
dbMissing: false,
|
|
256
|
+
rebuilt: needsRebuild,
|
|
257
|
+
factsReembedded,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
finally {
|
|
261
|
+
await pool.end();
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=pg-embed-backfill.js.map
|