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
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AliasMap } from "./alias-map.js";
|
|
2
|
+
/**
|
|
3
|
+
* The one scope-path normalizer: symlink-resolved when the path exists,
|
|
4
|
+
* lexical fallback otherwise. Inputs and configured alias prefixes MUST go
|
|
5
|
+
* through the same function or a symlinked alias entry can mis-resolve.
|
|
6
|
+
*/
|
|
7
|
+
export declare function normalizeScopePath(p: string): string;
|
|
8
|
+
export declare function deriveScope(path: string, aliasMap: AliasMap): string | null;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { realpathSync } from "node:fs";
|
|
2
|
+
import { isAbsolute, normalize } from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* The one scope-path normalizer: symlink-resolved when the path exists,
|
|
5
|
+
* lexical fallback otherwise. Inputs and configured alias prefixes MUST go
|
|
6
|
+
* through the same function or a symlinked alias entry can mis-resolve.
|
|
7
|
+
*/
|
|
8
|
+
export function normalizeScopePath(p) {
|
|
9
|
+
let n;
|
|
10
|
+
try {
|
|
11
|
+
n = realpathSync(p);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
n = normalize(p);
|
|
15
|
+
}
|
|
16
|
+
return n.length > 1 && n.endsWith("/") ? n.slice(0, -1) : n;
|
|
17
|
+
}
|
|
18
|
+
function matchesPrefix(prefix, target) {
|
|
19
|
+
return target === prefix || target.startsWith(prefix + "/");
|
|
20
|
+
}
|
|
21
|
+
export function deriveScope(path, aliasMap) {
|
|
22
|
+
if (!path || !isAbsolute(path))
|
|
23
|
+
return null;
|
|
24
|
+
const norm = normalizeScopePath(path);
|
|
25
|
+
const candidates = [];
|
|
26
|
+
for (const entry of aliasMap.named) {
|
|
27
|
+
for (const prefix of entry.paths) {
|
|
28
|
+
if (matchesPrefix(prefix, norm)) {
|
|
29
|
+
candidates.push({ prefix, scope: entry.scope, isGlobal: false });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
for (const prefix of aliasMap.global) {
|
|
34
|
+
if (matchesPrefix(prefix, norm)) {
|
|
35
|
+
candidates.push({ prefix, scope: "global", isGlobal: true });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (candidates.length === 0)
|
|
39
|
+
return norm;
|
|
40
|
+
candidates.sort((a, b) => {
|
|
41
|
+
const lenDiff = b.prefix.length - a.prefix.length;
|
|
42
|
+
if (lenDiff !== 0)
|
|
43
|
+
return lenDiff;
|
|
44
|
+
if (!a.isGlobal && b.isGlobal)
|
|
45
|
+
return -1;
|
|
46
|
+
if (a.isGlobal && !b.isGlobal)
|
|
47
|
+
return 1;
|
|
48
|
+
// Deterministic across scopes.json key orderings when two named scopes
|
|
49
|
+
// claim equal-length prefixes (a config error, but it must not flap).
|
|
50
|
+
return a.scope < b.scope ? -1 : a.scope > b.scope ? 1 : 0;
|
|
51
|
+
});
|
|
52
|
+
return candidates[0].scope;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=derive-scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive-scope.js","sourceRoot":"","sources":["../../../src/core/scope/derive-scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGlD;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,CAAS;IAC1C,IAAI,CAAS,CAAC;IACd,IAAI,CAAC;QACH,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,aAAa,CAAC,MAAc,EAAE,MAAc;IACnD,OAAO,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;AAC9D,CAAC;AAID,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,QAAkB;IAC1D,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAEtC,MAAM,UAAU,GAAgB,EAAE,CAAC;IAEnC,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnC,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACjC,IAAI,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;gBAChC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;IACH,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrC,IAAI,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;YAChC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACvB,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;QAClD,IAAI,OAAO,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC;QAClC,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ;YAAE,OAAO,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ;YAAE,OAAO,CAAC,CAAC;QACxC,uEAAuE;QACvE,sEAAsE;QACtE,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type ActiveScope = {
|
|
2
|
+
kind: "scoped";
|
|
3
|
+
value: string;
|
|
4
|
+
} | {
|
|
5
|
+
kind: "global-only";
|
|
6
|
+
} | {
|
|
7
|
+
kind: "all-scopes";
|
|
8
|
+
};
|
|
9
|
+
export declare function scopeClause(active: ActiveScope): {
|
|
10
|
+
sql: string;
|
|
11
|
+
params: string[];
|
|
12
|
+
};
|
|
13
|
+
export declare function scopeClauseSignal(active: ActiveScope): {
|
|
14
|
+
sql: string;
|
|
15
|
+
params: string[];
|
|
16
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export function scopeClause(active) {
|
|
2
|
+
switch (active.kind) {
|
|
3
|
+
case "scoped":
|
|
4
|
+
return { sql: "(scope = ? OR scope = 'global')", params: [active.value] };
|
|
5
|
+
case "global-only":
|
|
6
|
+
return { sql: "(scope = 'global')", params: [] };
|
|
7
|
+
case "all-scopes":
|
|
8
|
+
return { sql: "(1 = 1)", params: [] };
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export function scopeClauseSignal(active) {
|
|
12
|
+
switch (active.kind) {
|
|
13
|
+
case "scoped":
|
|
14
|
+
return { sql: "(scope = ?)", params: [active.value] };
|
|
15
|
+
case "global-only":
|
|
16
|
+
return { sql: "(1 = 0)", params: [] };
|
|
17
|
+
case "all-scopes":
|
|
18
|
+
return { sql: "(1 = 1)", params: [] };
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=scope-clause.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope-clause.js","sourceRoot":"","sources":["../../../src/core/scope/scope-clause.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,WAAW,CAAC,MAAmB;IAC7C,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ;YACX,OAAO,EAAE,GAAG,EAAE,iCAAiC,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5E,KAAK,aAAa;YAChB,OAAO,EAAE,GAAG,EAAE,oBAAoB,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACnD,KAAK,YAAY;YACf,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAmB;IACnD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ;YACX,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,KAAK,aAAa;YAChB,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACxC,KAAK,YAAY;YACf,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAC1C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function scopeStampEnabled(): boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stamp-flag.js","sourceRoot":"","sources":["../../../src/core/scope/stamp-flag.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iBAAiB;IAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,GAAG,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code-signal producer (#330): turns a coding commit into a deterministically
|
|
3
|
+
* labeled, PATH-(b) code signal payload.
|
|
4
|
+
*
|
|
5
|
+
* The daemon's /api/signal handler runs extractExemplar, which prefers PATH (a)
|
|
6
|
+
* (`git show` at detail.git_sha) when git_sha is present — that path couples the
|
|
7
|
+
* daemon to the repo filesystem and breaks on a client install or a logical repo
|
|
8
|
+
* name. This producer therefore emits PATH (b): it ships the changed code in
|
|
9
|
+
* detail.code itself and records the sha under detail.commit (for provenance),
|
|
10
|
+
* deliberately NOT under detail.git_sha, so path (a) is never triggered.
|
|
11
|
+
*
|
|
12
|
+
* repo is always a LOGICAL name (the override or the repoPath basename), never
|
|
13
|
+
* an absolute filesystem path.
|
|
14
|
+
*/
|
|
15
|
+
import type { SignalKind, SignalOutcome } from "../../shared/types.js";
|
|
16
|
+
export interface BuildCodeSignalArgs {
|
|
17
|
+
readonly repoPath: string;
|
|
18
|
+
readonly sha: string;
|
|
19
|
+
readonly testExit: number;
|
|
20
|
+
readonly task?: string;
|
|
21
|
+
readonly model?: string;
|
|
22
|
+
readonly repo?: string;
|
|
23
|
+
/** Unified diff to parse instead of shelling out — for unit tests. */
|
|
24
|
+
readonly diff?: string;
|
|
25
|
+
/** Clock injection for deterministic tests. */
|
|
26
|
+
readonly ts?: () => string;
|
|
27
|
+
}
|
|
28
|
+
export interface CodeSignalDetail {
|
|
29
|
+
readonly code: string;
|
|
30
|
+
readonly lang: string | null;
|
|
31
|
+
readonly task: string;
|
|
32
|
+
readonly commit: string;
|
|
33
|
+
readonly test_exit: number;
|
|
34
|
+
}
|
|
35
|
+
export interface CodeSignalPayload {
|
|
36
|
+
readonly v: 1;
|
|
37
|
+
readonly kind: SignalKind;
|
|
38
|
+
readonly outcome: SignalOutcome;
|
|
39
|
+
readonly producer: "code-commit";
|
|
40
|
+
readonly model: string;
|
|
41
|
+
readonly repo: string;
|
|
42
|
+
readonly repo_path: string;
|
|
43
|
+
readonly step: null;
|
|
44
|
+
readonly detail: CodeSignalDetail;
|
|
45
|
+
readonly session: null;
|
|
46
|
+
readonly ts: string;
|
|
47
|
+
}
|
|
48
|
+
/** One-line success summary for the CLI: outcome + the accepted signal id. */
|
|
49
|
+
export declare function formatCodeSignalResult(outcome: SignalOutcome, signalId: string): string;
|
|
50
|
+
export declare function buildCodeSignalPayload(args: BuildCodeSignalArgs): CodeSignalPayload;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code-signal producer (#330): turns a coding commit into a deterministically
|
|
3
|
+
* labeled, PATH-(b) code signal payload.
|
|
4
|
+
*
|
|
5
|
+
* The daemon's /api/signal handler runs extractExemplar, which prefers PATH (a)
|
|
6
|
+
* (`git show` at detail.git_sha) when git_sha is present — that path couples the
|
|
7
|
+
* daemon to the repo filesystem and breaks on a client install or a logical repo
|
|
8
|
+
* name. This producer therefore emits PATH (b): it ships the changed code in
|
|
9
|
+
* detail.code itself and records the sha under detail.commit (for provenance),
|
|
10
|
+
* deliberately NOT under detail.git_sha, so path (a) is never triggered.
|
|
11
|
+
*
|
|
12
|
+
* repo is always a LOGICAL name (the override or the repoPath basename), never
|
|
13
|
+
* an absolute filesystem path.
|
|
14
|
+
*/
|
|
15
|
+
import { execFileSync } from "node:child_process";
|
|
16
|
+
import { basename } from "node:path";
|
|
17
|
+
import { detectLang, extractAddedLines, parseFuncname, parseHunks, selectLargestHunk, } from "../exemplars/diff-parse.js";
|
|
18
|
+
/** One-line success summary for the CLI: outcome + the accepted signal id. */
|
|
19
|
+
export function formatCodeSignalResult(outcome, signalId) {
|
|
20
|
+
return `code-signal: accepted outcome=${outcome} signal id=${signalId}`;
|
|
21
|
+
}
|
|
22
|
+
function gitShow(repoPath, sha) {
|
|
23
|
+
return execFileSync("git", ["show", "--unified=3", "--diff-filter=AM", sha], { cwd: repoPath, encoding: "utf8", timeout: 10_000 });
|
|
24
|
+
}
|
|
25
|
+
export function buildCodeSignalPayload(args) {
|
|
26
|
+
const diff = args.diff ?? gitShow(args.repoPath, args.sha);
|
|
27
|
+
const hunks = parseHunks(diff);
|
|
28
|
+
const best = selectLargestHunk(hunks);
|
|
29
|
+
const code = best ? extractAddedLines(best.body) : "";
|
|
30
|
+
const lang = best ? detectLang(best.file) : null;
|
|
31
|
+
const funcname = best ? parseFuncname(best.hunkHeader) : null;
|
|
32
|
+
const task = args.task ??
|
|
33
|
+
(best
|
|
34
|
+
? funcname
|
|
35
|
+
? `${funcname} (${best.file})`
|
|
36
|
+
: `changes in ${best.file}`
|
|
37
|
+
: "code commit");
|
|
38
|
+
const outcome = args.testExit === 0 ? "pass" : "fail";
|
|
39
|
+
const isoNow = (args.ts ?? (() => new Date().toISOString()))();
|
|
40
|
+
return {
|
|
41
|
+
v: 1,
|
|
42
|
+
kind: "test",
|
|
43
|
+
outcome,
|
|
44
|
+
producer: "code-commit",
|
|
45
|
+
model: args.model ?? "unknown",
|
|
46
|
+
repo: args.repo ?? basename(args.repoPath),
|
|
47
|
+
repo_path: args.repoPath,
|
|
48
|
+
step: null,
|
|
49
|
+
detail: { code, lang, task, commit: args.sha, test_exit: args.testExit },
|
|
50
|
+
session: null,
|
|
51
|
+
ts: isoNow,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=code-signal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-signal.js","sourceRoot":"","sources":["../../../src/core/signals/code-signal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,UAAU,EACV,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AAsCpC,8EAA8E;AAC9E,MAAM,UAAU,sBAAsB,CAAC,OAAsB,EAAE,QAAgB;IAC7E,OAAO,iCAAiC,OAAO,cAAc,QAAQ,EAAE,CAAC;AAC1E,CAAC;AAED,SAAS,OAAO,CAAC,QAAgB,EAAE,GAAW;IAC5C,OAAO,YAAY,CACjB,KAAK,EACL,CAAC,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,GAAG,CAAC,EAChD,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CACrD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAyB;IAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAEtC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,MAAM,IAAI,GACR,IAAI,CAAC,IAAI;QACT,CAAC,IAAI;YACH,CAAC,CAAC,QAAQ;gBACR,CAAC,CAAC,GAAG,QAAQ,KAAK,IAAI,CAAC,IAAI,GAAG;gBAC9B,CAAC,CAAC,cAAc,IAAI,CAAC,IAAI,EAAE;YAC7B,CAAC,CAAC,aAAa,CAAC,CAAC;IAErB,MAAM,OAAO,GAAkB,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IACrE,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC;IAE/D,OAAO;QACL,CAAC,EAAE,CAAC;QACJ,IAAI,EAAE,MAAM;QACZ,OAAO;QACP,QAAQ,EAAE,aAAa;QACvB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,SAAS;QAC9B,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC1C,SAAS,EAAE,IAAI,CAAC,QAAQ;QACxB,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE;QACxE,OAAO,EAAE,IAAI;QACb,EAAE,EAAE,MAAM;KACX,CAAC;AACJ,CAAC"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* session file re-parsed after it grows re-emits the same ids and the store's
|
|
9
9
|
* ON CONFLICT DO NOTHING makes re-ingest a no-op.
|
|
10
10
|
*/
|
|
11
|
-
import type
|
|
11
|
+
import { type Signal } from "../../shared/types.js";
|
|
12
12
|
export declare function signalId(parts: {
|
|
13
13
|
sessionId: string | null;
|
|
14
14
|
producer: string;
|
|
@@ -9,8 +9,9 @@
|
|
|
9
9
|
* ON CONFLICT DO NOTHING makes re-ingest a no-op.
|
|
10
10
|
*/
|
|
11
11
|
import { createHash } from "node:crypto";
|
|
12
|
+
import { SIGNAL_OUTCOMES } from "../../shared/types.js";
|
|
12
13
|
const KINDS = new Set(["gate", "eval", "review", "test"]);
|
|
13
|
-
const OUTCOMES = new Set(
|
|
14
|
+
const OUTCOMES = new Set(SIGNAL_OUTCOMES);
|
|
14
15
|
export function signalId(parts) {
|
|
15
16
|
const hash = createHash("sha256")
|
|
16
17
|
.update([parts.sessionId ?? "", parts.producer, parts.ts, parts.step ?? "", parts.outcome].join("|"))
|
|
@@ -56,6 +57,7 @@ export function normalizeSignal(raw, installScope, now = () => new Date().toISOS
|
|
|
56
57
|
step,
|
|
57
58
|
detail,
|
|
58
59
|
sessionId,
|
|
60
|
+
scope: null,
|
|
59
61
|
ts,
|
|
60
62
|
createdAt: now(),
|
|
61
63
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingest-signal.js","sourceRoot":"","sources":["../../../src/core/signals/ingest-signal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ingest-signal.js","sourceRoot":"","sources":["../../../src/core/signals/ingest-signal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared scope stamping for inbound signals. Both transports that write
|
|
3
|
+
* signals (POST /api/signal and the MCP report_outcome tool) call this, so
|
|
4
|
+
* the rows they produce carry identical scope regardless of entry point.
|
|
5
|
+
*
|
|
6
|
+
* Precedence mirrors the original /api/signal behavior: an explicit
|
|
7
|
+
* repo_path wins; otherwise a session-correlated signal inherits that
|
|
8
|
+
* session's stamped scope. "global" is stored as NULL (signals never take
|
|
9
|
+
* global scope). Flag off (NLM_SCOPE_STAMP unset) is a no-op.
|
|
10
|
+
*/
|
|
11
|
+
import type { Signal } from "../../shared/types.js";
|
|
12
|
+
export interface SessionScopeReader {
|
|
13
|
+
getSessionScopeById(id: string): Promise<string | null>;
|
|
14
|
+
}
|
|
15
|
+
export declare function stampSignalScope(signal: Signal, opts: {
|
|
16
|
+
readonly repoPath?: string | null;
|
|
17
|
+
readonly sessionScopeReader?: SessionScopeReader | undefined;
|
|
18
|
+
}): Promise<Signal>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared scope stamping for inbound signals. Both transports that write
|
|
3
|
+
* signals (POST /api/signal and the MCP report_outcome tool) call this, so
|
|
4
|
+
* the rows they produce carry identical scope regardless of entry point.
|
|
5
|
+
*
|
|
6
|
+
* Precedence mirrors the original /api/signal behavior: an explicit
|
|
7
|
+
* repo_path wins; otherwise a session-correlated signal inherits that
|
|
8
|
+
* session's stamped scope. "global" is stored as NULL (signals never take
|
|
9
|
+
* global scope). Flag off (NLM_SCOPE_STAMP unset) is a no-op.
|
|
10
|
+
*/
|
|
11
|
+
import { deriveScope } from "../scope/derive-scope.js";
|
|
12
|
+
import { loadAliasMap } from "../scope/alias-map.js";
|
|
13
|
+
import { scopeStampEnabled } from "../scope/stamp-flag.js";
|
|
14
|
+
export async function stampSignalScope(signal, opts) {
|
|
15
|
+
if (!scopeStampEnabled())
|
|
16
|
+
return signal;
|
|
17
|
+
let scope = null;
|
|
18
|
+
if (opts.repoPath) {
|
|
19
|
+
const derived = deriveScope(opts.repoPath, loadAliasMap());
|
|
20
|
+
scope = derived === "global" ? null : derived;
|
|
21
|
+
}
|
|
22
|
+
else if (signal.sessionId && opts.sessionScopeReader) {
|
|
23
|
+
const inherited = await opts.sessionScopeReader.getSessionScopeById(signal.sessionId);
|
|
24
|
+
scope = inherited === "global" ? null : inherited;
|
|
25
|
+
}
|
|
26
|
+
return { ...signal, scope };
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=stamp-scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stamp-scope.js","sourceRoot":"","sources":["../../../src/core/signals/stamp-scope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAO9D,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAc,EACd,IAGC;IAED,IAAI,CAAC,iBAAiB,EAAE;QAAE,OAAO,MAAM,CAAC;IACxC,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;QAC3D,KAAK,GAAG,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;IAChD,CAAC;SAAM,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACvD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACtF,KAAK,GAAG,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACpD,CAAC;IACD,OAAO,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* file. The desktop shell turns "restart required" into one click.
|
|
13
13
|
*/
|
|
14
14
|
import Database from "better-sqlite3";
|
|
15
|
-
import { existsSync, renameSync, rmSync, statSync } from "node:fs";
|
|
15
|
+
import { chmodSync, existsSync, renameSync, rmSync, statSync } from "node:fs";
|
|
16
16
|
import { dirname, join } from "node:path";
|
|
17
17
|
export const PENDING_SUFFIX = ".restore-pending";
|
|
18
18
|
/**
|
|
@@ -70,6 +70,7 @@ export function stageRestore(dbPath, candidatePath) {
|
|
|
70
70
|
const pending = dbPath + PENDING_SUFFIX;
|
|
71
71
|
rmSync(pending, { force: true });
|
|
72
72
|
renameSync(candidatePath, pending);
|
|
73
|
+
chmodSync(pending, 0o600);
|
|
73
74
|
return validation;
|
|
74
75
|
}
|
|
75
76
|
/**
|
|
@@ -104,6 +105,7 @@ export function applyPendingRestore(dbPath) {
|
|
|
104
105
|
export function vacuumSnapshot(db, destPath) {
|
|
105
106
|
rmSync(destPath, { force: true });
|
|
106
107
|
db.prepare("VACUUM INTO ?").run(destPath);
|
|
108
|
+
chmodSync(destPath, 0o600);
|
|
107
109
|
return statSync(destPath).size;
|
|
108
110
|
}
|
|
109
111
|
/** Scratch path for a backup snapshot, alongside the DB so rename stays atomic. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-restore.js","sourceRoot":"","sources":["../../../src/core/storage/db-restore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"db-restore.js","sourceRoot":"","sources":["../../../src/core/storage/db-restore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Fact } from "../../shared/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Returns the per-(subject, predicate) batch winners in insertion order.
|
|
4
|
+
* Last occurrence in `facts` wins for each unique (subject, predicate) pair,
|
|
5
|
+
* matching the collapse semantics of ingestSessionFactsInTxn (SQLite) and
|
|
6
|
+
* ingestSessionFactsOnClient (PG). The returned array contains one entry per
|
|
7
|
+
* unique key, ordered by the key's first appearance in the input.
|
|
8
|
+
*/
|
|
9
|
+
export declare function batchWinners(facts: ReadonlyArray<Fact>): ReadonlyArray<Fact>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns the per-(subject, predicate) batch winners in insertion order.
|
|
3
|
+
* Last occurrence in `facts` wins for each unique (subject, predicate) pair,
|
|
4
|
+
* matching the collapse semantics of ingestSessionFactsInTxn (SQLite) and
|
|
5
|
+
* ingestSessionFactsOnClient (PG). The returned array contains one entry per
|
|
6
|
+
* unique key, ordered by the key's first appearance in the input.
|
|
7
|
+
*/
|
|
8
|
+
export function batchWinners(facts) {
|
|
9
|
+
const seen = new Map();
|
|
10
|
+
for (const f of facts)
|
|
11
|
+
seen.set(`${f.subject}\u0000${f.predicate}`, f);
|
|
12
|
+
return Array.from(seen.values());
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=fact-batch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fact-batch.js","sourceRoot":"","sources":["../../../src/core/storage/fact-batch.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,KAA0B;IACrD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAgB,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;IACvE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -24,6 +24,7 @@ export declare class PgCodeExemplarStore implements CodeExemplarStore {
|
|
|
24
24
|
upsertEmbedding(exemplarId: string, vector: Float32Array): Promise<void>;
|
|
25
25
|
searchByVector(queryVector: Float32Array, filter: CodeExemplarSearchFilter): Promise<ReadonlyArray<CodeExemplarHit>>;
|
|
26
26
|
getById(id: string): Promise<CodeExemplar | null>;
|
|
27
|
+
listBySessions(sessionIds: ReadonlyArray<string>): Promise<ReadonlyArray<CodeExemplar>>;
|
|
27
28
|
applyBucketCap(installScope: string, maxPerBucket: number): Promise<number>;
|
|
28
29
|
pruneReverted(installScope: string): Promise<number>;
|
|
29
30
|
setVerdict(id: string, patch: ExemplarVerdictPatch, source: ExemplarVerdictSource): Promise<ExemplarVerdictResult>;
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import { exemplarId } from "./sqlite-code-exemplar-store.js";
|
|
14
14
|
const VEC_DIM = 768;
|
|
15
|
+
// Read column list stays scope-free while stamping is write-only (#348
|
|
16
|
+
// Stage A); reads gain scope in the enforcement task.
|
|
15
17
|
const COLUMNS = "id, install_scope, signal_id, session_id, repo, model, lang, " +
|
|
16
18
|
"task_context, code, code_hash, outcome, git_sha, survived, ts, created_at, " +
|
|
17
19
|
"retired_at, label_source";
|
|
@@ -36,14 +38,15 @@ function insertParams(input) {
|
|
|
36
38
|
input.outcome,
|
|
37
39
|
input.gitSha,
|
|
38
40
|
input.survived,
|
|
41
|
+
input.scope,
|
|
39
42
|
input.ts,
|
|
40
43
|
];
|
|
41
44
|
}
|
|
42
45
|
const INSERT_SQL = `
|
|
43
46
|
INSERT INTO code_exemplars
|
|
44
47
|
(id, install_scope, signal_id, session_id, repo, model, lang,
|
|
45
|
-
task_context, code, code_hash, outcome, git_sha, survived, ts)
|
|
46
|
-
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14)
|
|
48
|
+
task_context, code, code_hash, outcome, git_sha, survived, scope, ts)
|
|
49
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)
|
|
47
50
|
ON CONFLICT (id) DO NOTHING
|
|
48
51
|
`;
|
|
49
52
|
export class PgCodeExemplarStore {
|
|
@@ -137,6 +140,13 @@ export class PgCodeExemplarStore {
|
|
|
137
140
|
const row = res.rows[0];
|
|
138
141
|
return row ? this.rowToExemplar(row) : null;
|
|
139
142
|
}
|
|
143
|
+
async listBySessions(sessionIds) {
|
|
144
|
+
if (sessionIds.length === 0)
|
|
145
|
+
return [];
|
|
146
|
+
const ph = sessionIds.map((_, i) => `$${i + 1}`).join(",");
|
|
147
|
+
const res = await this.pool.query(`SELECT ${COLUMNS} FROM code_exemplars WHERE session_id IN (${ph}) AND retired_at IS NULL ORDER BY ts ASC`, [...sessionIds]);
|
|
148
|
+
return res.rows.map((r) => this.rowToExemplar(r));
|
|
149
|
+
}
|
|
140
150
|
async applyBucketCap(installScope, maxPerBucket) {
|
|
141
151
|
// Window-rank within each (repo, lang, outcome-class) bucket newest-first,
|
|
142
152
|
// delete everything past the cap. Cascade clears the embeddings.
|
|
@@ -199,6 +209,7 @@ export class PgCodeExemplarStore {
|
|
|
199
209
|
outcome: row.outcome,
|
|
200
210
|
gitSha: row.git_sha,
|
|
201
211
|
survived: row.survived,
|
|
212
|
+
scope: row.scope ?? null,
|
|
202
213
|
ts: row.ts,
|
|
203
214
|
createdAt: row.created_at,
|
|
204
215
|
retiredAt: row.retired_at,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pg-code-exemplar-store.js","sourceRoot":"","sources":["../../../src/core/storage/pg-code-exemplar-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,MAAM,OAAO,GAAG,GAAG,CAAC;AAEpB,MAAM,OAAO,GACX,+DAA+D;IAC/D,6EAA6E;IAC7E,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"pg-code-exemplar-store.js","sourceRoot":"","sources":["../../../src/core/storage/pg-code-exemplar-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Pool } from "pg";
|
|
2
|
+
import type { EmbeddingConfigStore, EmbeddingLane, EmbeddingLaneConfig } from "../embedding/embedding-config.js";
|
|
3
|
+
/**
|
|
4
|
+
* Postgres implementation of EmbeddingConfigStore.
|
|
5
|
+
*
|
|
6
|
+
* The EmbeddingConfigStore port has synchronous methods (getLane / upsertLane)
|
|
7
|
+
* to match the SQLite twin. This implementation satisfies the port via an
|
|
8
|
+
* in-memory write-through cache:
|
|
9
|
+
* - load() preloads all rows from pg (called by PgStorage.init).
|
|
10
|
+
* - getLane() reads from the cache synchronously.
|
|
11
|
+
* - upsertLane() updates the cache synchronously and fires an async pg write.
|
|
12
|
+
*
|
|
13
|
+
* The fire-and-forget write logs errors but does not throw, consistent with
|
|
14
|
+
* the "best-effort tracking" semantics of the embedding config lane.
|
|
15
|
+
*/
|
|
16
|
+
export declare class PgEmbeddingConfigStore implements EmbeddingConfigStore {
|
|
17
|
+
private readonly pool;
|
|
18
|
+
private readonly cache;
|
|
19
|
+
constructor(pool: Pool);
|
|
20
|
+
load(): Promise<void>;
|
|
21
|
+
getLane(lane: EmbeddingLane): EmbeddingLaneConfig | null;
|
|
22
|
+
/**
|
|
23
|
+
* The pg write is fire-and-forget. Short-lived callers (CLI commands) must
|
|
24
|
+
* not route their final config write through this method and then call
|
|
25
|
+
* pool.end() in the same tick, or the write can be rejected before it
|
|
26
|
+
* acquires a connection; issue an awaited pool.query() directly instead.
|
|
27
|
+
*/
|
|
28
|
+
upsertLane(cfg: EmbeddingLaneConfig, updatedAtIso: string): void;
|
|
29
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
function rowToConfig(r) {
|
|
2
|
+
return { lane: r.lane, provider: r.provider, model: r.model, dim: r.dim };
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Postgres implementation of EmbeddingConfigStore.
|
|
6
|
+
*
|
|
7
|
+
* The EmbeddingConfigStore port has synchronous methods (getLane / upsertLane)
|
|
8
|
+
* to match the SQLite twin. This implementation satisfies the port via an
|
|
9
|
+
* in-memory write-through cache:
|
|
10
|
+
* - load() preloads all rows from pg (called by PgStorage.init).
|
|
11
|
+
* - getLane() reads from the cache synchronously.
|
|
12
|
+
* - upsertLane() updates the cache synchronously and fires an async pg write.
|
|
13
|
+
*
|
|
14
|
+
* The fire-and-forget write logs errors but does not throw, consistent with
|
|
15
|
+
* the "best-effort tracking" semantics of the embedding config lane.
|
|
16
|
+
*/
|
|
17
|
+
export class PgEmbeddingConfigStore {
|
|
18
|
+
pool;
|
|
19
|
+
cache = new Map();
|
|
20
|
+
constructor(pool) {
|
|
21
|
+
this.pool = pool;
|
|
22
|
+
}
|
|
23
|
+
async load() {
|
|
24
|
+
const { rows } = await this.pool.query("SELECT lane, provider, model, dim FROM embedding_config");
|
|
25
|
+
for (const row of rows) {
|
|
26
|
+
this.cache.set(row.lane, rowToConfig(row));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
getLane(lane) {
|
|
30
|
+
return this.cache.get(lane) ?? null;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The pg write is fire-and-forget. Short-lived callers (CLI commands) must
|
|
34
|
+
* not route their final config write through this method and then call
|
|
35
|
+
* pool.end() in the same tick, or the write can be rejected before it
|
|
36
|
+
* acquires a connection; issue an awaited pool.query() directly instead.
|
|
37
|
+
*/
|
|
38
|
+
upsertLane(cfg, updatedAtIso) {
|
|
39
|
+
this.cache.set(cfg.lane, cfg);
|
|
40
|
+
void this.pool
|
|
41
|
+
.query(`INSERT INTO embedding_config (lane, provider, model, dim, updated_at)
|
|
42
|
+
VALUES ($1, $2, $3, $4, $5)
|
|
43
|
+
ON CONFLICT (lane) DO UPDATE SET
|
|
44
|
+
provider = EXCLUDED.provider,
|
|
45
|
+
model = EXCLUDED.model,
|
|
46
|
+
dim = EXCLUDED.dim,
|
|
47
|
+
updated_at = EXCLUDED.updated_at`, [cfg.lane, cfg.provider, cfg.model, cfg.dim, updatedAtIso])
|
|
48
|
+
.catch((err) => {
|
|
49
|
+
console.error("nlm-memory: pg upsert embedding_config failed:", err);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=pg-embedding-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pg-embedding-config.js","sourceRoot":"","sources":["../../../src/core/storage/pg-embedding-config.ts"],"names":[],"mappings":"AAcA,SAAS,WAAW,CAAC,CAAY;IAC/B,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAqB,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;AAC7F,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,sBAAsB;IAGJ;IAFZ,KAAK,GAAG,IAAI,GAAG,EAAsC,CAAC;IAEvE,YAA6B,IAAU;QAAV,SAAI,GAAJ,IAAI,CAAM;IAAG,CAAC;IAE3C,KAAK,CAAC,IAAI;QACR,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CACpC,yDAAyD,CAC1D,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAqB,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,OAAO,CAAC,IAAmB;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IACtC,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,GAAwB,EAAE,YAAoB;QACvD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC9B,KAAK,IAAI,CAAC,IAAI;aACX,KAAK,CACJ;;;;;;4CAMoC,EACpC,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAC3D;aACA,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YACtB,OAAO,CAAC,KAAK,CAAC,gDAAgD,EAAE,GAAG,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;IACP,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PgEntityStore -- EntityStore implementation over pg.Pool.
|
|
3
|
+
*
|
|
4
|
+
* All merge operations run inside a single pg transaction.
|
|
5
|
+
*/
|
|
6
|
+
import type { Pool } from "pg";
|
|
7
|
+
import type { EntityStore } from "../../ports/entity-store.js";
|
|
8
|
+
export declare class PgEntityStore implements EntityStore {
|
|
9
|
+
private readonly pool;
|
|
10
|
+
constructor(pool: Pool);
|
|
11
|
+
merge(source: string, target: string): Promise<void>;
|
|
12
|
+
}
|