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
|
@@ -30,6 +30,21 @@ export interface DeepSeekClientOptions {
|
|
|
30
30
|
readonly fetchImpl?: FetchImpl;
|
|
31
31
|
/** Total classify attempts before giving up on transient schema/unreachable errors. */
|
|
32
32
|
readonly classifyAttempts?: number;
|
|
33
|
+
/**
|
|
34
|
+
* Whether to request structured JSON via `response_format`. DeepSeek and many
|
|
35
|
+
* cloud OpenAI-compatible APIs accept `json_object`; some local servers reject
|
|
36
|
+
* it (LM Studio's MLX engine demands `json_schema` or `text`). `"none"` omits
|
|
37
|
+
* the field entirely — the most portable choice across arbitrary endpoints —
|
|
38
|
+
* and relies on the system prompt + fence-stripping + schema validation.
|
|
39
|
+
*/
|
|
40
|
+
readonly responseFormat?: "json_object" | "none";
|
|
41
|
+
/**
|
|
42
|
+
* Output token budget for classify. Must cover the model's hidden reasoning
|
|
43
|
+
* plus the JSON body. Thinking-capable local models (e.g. qwen3.5 over an
|
|
44
|
+
* OpenAI-compatible endpoint, where think cannot be disabled via API) consume
|
|
45
|
+
* 1-2K+ reasoning tokens before any JSON, so this needs headroom.
|
|
46
|
+
*/
|
|
47
|
+
readonly classifyMaxTokens?: number;
|
|
33
48
|
}
|
|
34
49
|
export declare class DeepSeekClient implements LLMClient {
|
|
35
50
|
private readonly apiKey;
|
|
@@ -39,9 +54,14 @@ export declare class DeepSeekClient implements LLMClient {
|
|
|
39
54
|
private readonly maxTranscriptChars;
|
|
40
55
|
private readonly fetchImpl;
|
|
41
56
|
private readonly classifyAttempts;
|
|
57
|
+
private readonly responseFormat;
|
|
58
|
+
private readonly classifyMaxTokens;
|
|
42
59
|
constructor(opts?: DeepSeekClientOptions);
|
|
60
|
+
/** Spread into a chat request body: `{type:"json_object"}` or nothing. */
|
|
61
|
+
private responseFormatField;
|
|
43
62
|
embed(_text: string, _kind: EmbeddingKind): Promise<EmbedResult>;
|
|
44
63
|
classify(transcript: string, priorContext?: string): Promise<ClassifyResult>;
|
|
45
64
|
private classifyOnce;
|
|
46
65
|
rewriteForRecall(query: string): Promise<RewriteResult>;
|
|
66
|
+
nameWorkstream(content: string, candidates: ReadonlyArray<import("../ports/llm-client.js").WorkstreamCandidateHint>): Promise<string | null>;
|
|
47
67
|
}
|
|
@@ -20,16 +20,10 @@
|
|
|
20
20
|
* separate embedder (OllamaClient) for semantic recall.
|
|
21
21
|
*/
|
|
22
22
|
import { ClassifierSchemaError, LLMUnreachableError } from "../ports/llm-client.js";
|
|
23
|
-
import {
|
|
23
|
+
import { buildNamingSystemPrompt, parseLongestLabel } from "./naming.js";
|
|
24
|
+
import { classifyWithRetry, parseClassifierContent, rewriteTimeoutMs } from "./client-shared.js";
|
|
25
|
+
import { CLASSIFIER_SYSTEM_PROMPT, buildUserPrompt, } from "../core/classifier/prompt.js";
|
|
24
26
|
import { REWRITE_SYSTEM_PROMPT, parseRewriteJson } from "../core/recall/rewrite-prompt.js";
|
|
25
|
-
const DEFAULT_REWRITE_TIMEOUT_MS = 5_000;
|
|
26
|
-
function rewriteTimeoutMs() {
|
|
27
|
-
const raw = process.env["NLM_RECALL_REWRITE_TIMEOUT_MS"];
|
|
28
|
-
if (!raw)
|
|
29
|
-
return DEFAULT_REWRITE_TIMEOUT_MS;
|
|
30
|
-
const parsed = Number.parseInt(raw, 10);
|
|
31
|
-
return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_REWRITE_TIMEOUT_MS;
|
|
32
|
-
}
|
|
33
27
|
export class DeepSeekClient {
|
|
34
28
|
apiKey;
|
|
35
29
|
baseUrl;
|
|
@@ -38,6 +32,8 @@ export class DeepSeekClient {
|
|
|
38
32
|
maxTranscriptChars;
|
|
39
33
|
fetchImpl;
|
|
40
34
|
classifyAttempts;
|
|
35
|
+
responseFormat;
|
|
36
|
+
classifyMaxTokens;
|
|
41
37
|
constructor(opts = {}) {
|
|
42
38
|
const key = opts.apiKey ?? process.env["DEEPSEEK_API_KEY"];
|
|
43
39
|
if (!key) {
|
|
@@ -50,23 +46,20 @@ export class DeepSeekClient {
|
|
|
50
46
|
this.maxTranscriptChars = opts.maxTranscriptChars ?? 30_000;
|
|
51
47
|
this.fetchImpl = opts.fetchImpl ?? fetch;
|
|
52
48
|
this.classifyAttempts = opts.classifyAttempts ?? 3;
|
|
49
|
+
this.responseFormat = opts.responseFormat ?? "json_object";
|
|
50
|
+
this.classifyMaxTokens = opts.classifyMaxTokens ?? 8192;
|
|
51
|
+
}
|
|
52
|
+
/** Spread into a chat request body: `{type:"json_object"}` or nothing. */
|
|
53
|
+
responseFormatField() {
|
|
54
|
+
return this.responseFormat === "json_object"
|
|
55
|
+
? { response_format: { type: "json_object" } }
|
|
56
|
+
: {};
|
|
53
57
|
}
|
|
54
58
|
async embed(_text, _kind) {
|
|
55
59
|
throw new Error("DeepSeekClient.embed not supported — DeepSeek's API has no embeddings endpoint. Wire OllamaClient for embeddings.");
|
|
56
60
|
}
|
|
57
61
|
async classify(transcript, priorContext = "") {
|
|
58
|
-
|
|
59
|
-
for (let attempt = 1; attempt <= this.classifyAttempts; attempt++) {
|
|
60
|
-
try {
|
|
61
|
-
return await this.classifyOnce(transcript, priorContext);
|
|
62
|
-
}
|
|
63
|
-
catch (e) {
|
|
64
|
-
if (!(e instanceof ClassifierSchemaError || e instanceof LLMUnreachableError))
|
|
65
|
-
throw e;
|
|
66
|
-
lastErr = e;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
throw lastErr;
|
|
62
|
+
return classifyWithRetry(this.classifyAttempts, () => this.classifyOnce(transcript, priorContext));
|
|
70
63
|
}
|
|
71
64
|
async classifyOnce(transcript, priorContext) {
|
|
72
65
|
const controller = new AbortController();
|
|
@@ -94,17 +87,16 @@ export class DeepSeekClient {
|
|
|
94
87
|
{ role: "system", content: CLASSIFIER_SYSTEM_PROMPT },
|
|
95
88
|
{ role: "user", content: userPrompt },
|
|
96
89
|
],
|
|
97
|
-
|
|
90
|
+
...this.responseFormatField(),
|
|
98
91
|
temperature: 0.1,
|
|
99
|
-
//
|
|
100
|
-
//
|
|
101
|
-
//
|
|
102
|
-
//
|
|
103
|
-
//
|
|
104
|
-
//
|
|
105
|
-
//
|
|
106
|
-
|
|
107
|
-
max_tokens: 8192,
|
|
92
|
+
// max_tokens covers reasoning + JSON output. Reasoning models (e.g.
|
|
93
|
+
// deepseek-v4-flash, or qwen3.5 over an OpenAI-compatible endpoint
|
|
94
|
+
// where think can't be disabled) spend hidden chain-of-thought
|
|
95
|
+
// against this budget before any JSON reaches `content`. At 1024 the
|
|
96
|
+
// reasoning consumed the entire budget and content came back empty
|
|
97
|
+
// (finish_reason: length). Default 8192 leaves headroom; tune via
|
|
98
|
+
// classifyMaxTokens for models with longer reasoning.
|
|
99
|
+
max_tokens: this.classifyMaxTokens,
|
|
108
100
|
stream: false,
|
|
109
101
|
}),
|
|
110
102
|
signal: controller.signal,
|
|
@@ -113,19 +105,7 @@ export class DeepSeekClient {
|
|
|
113
105
|
throw new LLMUnreachableError("deepseek", `status ${res.status}: ${await res.text().catch(() => "")}`);
|
|
114
106
|
}
|
|
115
107
|
const data = (await res.json());
|
|
116
|
-
|
|
117
|
-
const content = stripJsonFences(rawContent);
|
|
118
|
-
let parsed;
|
|
119
|
-
try {
|
|
120
|
-
parsed = JSON.parse(content);
|
|
121
|
-
}
|
|
122
|
-
catch {
|
|
123
|
-
throw new ClassifierSchemaError("deepseek returned non-JSON content");
|
|
124
|
-
}
|
|
125
|
-
if (!validateClassifierJson(parsed)) {
|
|
126
|
-
throw new ClassifierSchemaError("deepseek response missing required keys");
|
|
127
|
-
}
|
|
128
|
-
return coerceClassifyResult(parsed);
|
|
108
|
+
return parseClassifierContent(data.choices?.[0]?.message?.content ?? "", "deepseek");
|
|
129
109
|
}
|
|
130
110
|
catch (e) {
|
|
131
111
|
if (e instanceof LLMUnreachableError || e instanceof ClassifierSchemaError)
|
|
@@ -152,7 +132,7 @@ export class DeepSeekClient {
|
|
|
152
132
|
{ role: "system", content: REWRITE_SYSTEM_PROMPT },
|
|
153
133
|
{ role: "user", content: query },
|
|
154
134
|
],
|
|
155
|
-
|
|
135
|
+
...this.responseFormatField(),
|
|
156
136
|
temperature: 0.1,
|
|
157
137
|
max_tokens: 512,
|
|
158
138
|
stream: false,
|
|
@@ -175,5 +155,39 @@ export class DeepSeekClient {
|
|
|
175
155
|
clearTimeout(timer);
|
|
176
156
|
}
|
|
177
157
|
}
|
|
158
|
+
async nameWorkstream(content, candidates) {
|
|
159
|
+
if (candidates.length === 0)
|
|
160
|
+
return null;
|
|
161
|
+
const sys = buildNamingSystemPrompt(candidates, { noThinkSuffix: true });
|
|
162
|
+
const controller = new AbortController();
|
|
163
|
+
const timer = setTimeout(() => controller.abort(), this.classifyTimeoutMs);
|
|
164
|
+
try {
|
|
165
|
+
const res = await this.fetchImpl(`${this.baseUrl}/chat/completions`, {
|
|
166
|
+
method: "POST",
|
|
167
|
+
headers: { "Content-Type": "application/json", Authorization: `Bearer ${this.apiKey}` },
|
|
168
|
+
body: JSON.stringify({
|
|
169
|
+
model: this.classifyModel,
|
|
170
|
+
temperature: 0,
|
|
171
|
+
max_tokens: this.classifyMaxTokens,
|
|
172
|
+
messages: [
|
|
173
|
+
{ role: "system", content: sys },
|
|
174
|
+
{ role: "user", content },
|
|
175
|
+
],
|
|
176
|
+
}),
|
|
177
|
+
signal: controller.signal,
|
|
178
|
+
});
|
|
179
|
+
if (!res.ok)
|
|
180
|
+
return null;
|
|
181
|
+
const data = (await res.json());
|
|
182
|
+
const out = data.choices?.[0]?.message?.content ?? "";
|
|
183
|
+
return parseLongestLabel(out, candidates);
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
finally {
|
|
189
|
+
clearTimeout(timer);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
178
192
|
}
|
|
179
193
|
//# sourceMappingURL=deepseek-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deepseek-client.js","sourceRoot":"","sources":["../../src/llm/deepseek-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AASH,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,
|
|
1
|
+
{"version":3,"file":"deepseek-client.js","sourceRoot":"","sources":["../../src/llm/deepseek-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* resolveEmbedderInfo — the descriptor `/api/classifier/info` reports for the
|
|
3
|
+
* active embedder. It mirrors `buildEmbedder`'s provider/model selection from
|
|
4
|
+
* the same env, so the UI shows the embedder that's actually running rather
|
|
5
|
+
* than a hardcoded default.
|
|
6
|
+
*
|
|
7
|
+
* Pass `dim` from the live embedder probe; without it, the descriptor
|
|
8
|
+
* defaults to 768, which may not match the active embedder's dims.
|
|
9
|
+
*/
|
|
10
|
+
export interface EmbedderDescriptor {
|
|
11
|
+
readonly provider: string;
|
|
12
|
+
readonly model: string;
|
|
13
|
+
readonly dims: number;
|
|
14
|
+
}
|
|
15
|
+
export declare function resolveEmbedderInfo(env?: Record<string, string | undefined>, dim?: number): EmbedderDescriptor;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* resolveEmbedderInfo — the descriptor `/api/classifier/info` reports for the
|
|
3
|
+
* active embedder. It mirrors `buildEmbedder`'s provider/model selection from
|
|
4
|
+
* the same env, so the UI shows the embedder that's actually running rather
|
|
5
|
+
* than a hardcoded default.
|
|
6
|
+
*
|
|
7
|
+
* Pass `dim` from the live embedder probe; without it, the descriptor
|
|
8
|
+
* defaults to 768, which may not match the active embedder's dims.
|
|
9
|
+
*/
|
|
10
|
+
import { DEFAULT_OPENAI_EMBED_MODEL } from "./openai-embedder-client.js";
|
|
11
|
+
import { DEFAULT_MODEL_REPO } from "./bundled-embedder-client.js";
|
|
12
|
+
const DEFAULT_OLLAMA_EMBED_MODEL = "nomic-embed-text";
|
|
13
|
+
export function resolveEmbedderInfo(env = process.env, dim) {
|
|
14
|
+
const provider = (env["NLM_EMBED_PROVIDER"] ?? "ollama").toLowerCase();
|
|
15
|
+
let model;
|
|
16
|
+
if (provider === "openai") {
|
|
17
|
+
model = env["NLM_EMBED_MODEL"] ?? DEFAULT_OPENAI_EMBED_MODEL;
|
|
18
|
+
}
|
|
19
|
+
else if (provider === "bundled") {
|
|
20
|
+
model = env["NLM_EMBED_MODEL"] ?? DEFAULT_MODEL_REPO;
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
model = env["NLM_EMBED_MODEL"] ?? DEFAULT_OLLAMA_EMBED_MODEL;
|
|
24
|
+
}
|
|
25
|
+
return { provider, model, dims: dim ?? 768 };
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=embedder-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedder-info.js","sourceRoot":"","sources":["../../src/llm/embedder-info.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElE,MAAM,0BAA0B,GAAG,kBAAkB,CAAC;AAQtD,MAAM,UAAU,mBAAmB,CACjC,MAA0C,OAAO,CAAC,GAAG,EACrD,GAAY;IAEZ,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACvE,IAAI,KAAa,CAAC;IAClB,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,KAAK,GAAG,GAAG,CAAC,iBAAiB,CAAC,IAAI,0BAA0B,CAAC;IAC/D,CAAC;SAAM,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,KAAK,GAAG,GAAG,CAAC,iBAAiB,CAAC,IAAI,kBAAkB,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,GAAG,CAAC,iBAAiB,CAAC,IAAI,0BAA0B,CAAC;IAC/D,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Qwen 3.5+ models default to extended chain-of-thought, which blows the
|
|
2
|
+
* classify timeout. Disable thinking for them; non-thinking models like
|
|
3
|
+
* qwen3:4b-instruct are unaffected. */
|
|
4
|
+
export function classifierNeedsThinkDisabled(model) {
|
|
5
|
+
return /qwen3\.5/i.test(model);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=model-quirks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-quirks.js","sourceRoot":"","sources":["../../src/llm/model-quirks.ts"],"names":[],"mappings":"AAAA;;uCAEuC;AACvC,MAAM,UAAU,4BAA4B,CAAC,KAAa;IACxD,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { WorkstreamCandidateHint } from "../ports/llm-client.js";
|
|
2
|
+
export declare function buildNamingSystemPrompt(candidates: ReadonlyArray<WorkstreamCandidateHint>, opts?: {
|
|
3
|
+
readonly noThinkSuffix?: boolean;
|
|
4
|
+
}): string;
|
|
5
|
+
export declare function parseLongestLabel(out: string, candidates: ReadonlyArray<WorkstreamCandidateHint>): string | null;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function buildNamingSystemPrompt(candidates, opts) {
|
|
2
|
+
const list = candidates.map((c) => `- ${c.label}`).join("\n");
|
|
3
|
+
return (`You label a work session by which project it belongs to. Known projects:\n${list}\n` +
|
|
4
|
+
`Answer with a project name only when the session's actual work is on that project; a passing mention is not enough. ` +
|
|
5
|
+
`If it belongs to NONE of these, or you are unsure, answer "none". Reply with ONLY the exact project name from the list, or "none".` +
|
|
6
|
+
(opts?.noThinkSuffix ? " /no_think" : ""));
|
|
7
|
+
}
|
|
8
|
+
export function parseLongestLabel(out, candidates) {
|
|
9
|
+
const lower = out.toLowerCase();
|
|
10
|
+
let best = null;
|
|
11
|
+
let bestLen = 0;
|
|
12
|
+
for (const c of candidates) {
|
|
13
|
+
if (lower.includes(c.label.toLowerCase()) && c.label.length > bestLen) {
|
|
14
|
+
best = c.label;
|
|
15
|
+
bestLen = c.label.length;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return best;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=naming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming.js","sourceRoot":"","sources":["../../src/llm/naming.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,uBAAuB,CACrC,UAAkD,EAClD,IAA2C;IAE3C,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9D,OAAO,CACL,6EAA6E,IAAI,IAAI;QACrF,sHAAsH;QACtH,oIAAoI;QACpI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAC1C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,GAAW,EACX,UAAkD;IAElD,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAChC,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;YACtE,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC;YACf,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -11,8 +11,10 @@
|
|
|
11
11
|
* Layering: this file lives in the outer ring. core/ depends on LLMClient,
|
|
12
12
|
* not on this concrete class. Tests can substitute a fake client.
|
|
13
13
|
*/
|
|
14
|
-
import type { ClassifyResult, EmbedResult, EmbeddingKind, LLMClient, RewriteResult } from "../ports/llm-client.js";
|
|
14
|
+
import type { ClassifyResult, EmbedResult, EmbeddingKind, LLMClient, RewriteResult, WorkstreamCandidateHint } from "../ports/llm-client.js";
|
|
15
15
|
export type FetchImpl = typeof fetch;
|
|
16
|
+
export declare const MAX_EMBED_CHARS = 8000;
|
|
17
|
+
export declare const EMBED_PREFIXES: Record<EmbeddingKind, string>;
|
|
16
18
|
export declare function l2Normalize(vec: Float32Array): Float32Array;
|
|
17
19
|
export interface OllamaClientOptions {
|
|
18
20
|
readonly baseUrl?: string;
|
|
@@ -52,14 +54,11 @@ export declare class OllamaClient implements LLMClient {
|
|
|
52
54
|
private readonly fetchImpl;
|
|
53
55
|
private readonly classifyAttempts;
|
|
54
56
|
constructor(opts?: OllamaClientOptions);
|
|
55
|
-
embed(text: string, kind: EmbeddingKind
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
* schema/unreachable errors before rethrowing the last error. Each attempt
|
|
59
|
-
* sends the transcript through the Ollama classifier and returns a
|
|
60
|
-
* ClassifyResult on success, or throws LLMUnreachableError / ClassifierSchemaError.
|
|
61
|
-
*/
|
|
57
|
+
embed(text: string, kind: EmbeddingKind, opts?: {
|
|
58
|
+
signal?: AbortSignal;
|
|
59
|
+
}): Promise<EmbedResult>;
|
|
62
60
|
classify(transcript: string, priorContext?: string): Promise<ClassifyResult>;
|
|
63
61
|
private classifyOnce;
|
|
64
62
|
rewriteForRecall(query: string): Promise<RewriteResult>;
|
|
63
|
+
nameWorkstream(content: string, candidates: ReadonlyArray<WorkstreamCandidateHint>): Promise<string | null>;
|
|
65
64
|
}
|
|
@@ -12,26 +12,21 @@
|
|
|
12
12
|
* not on this concrete class. Tests can substitute a fake client.
|
|
13
13
|
*/
|
|
14
14
|
import { ClassifierSchemaError, LLMUnreachableError } from "../ports/llm-client.js";
|
|
15
|
-
import {
|
|
15
|
+
import { classifierNeedsThinkDisabled } from "./model-quirks.js";
|
|
16
|
+
import { buildNamingSystemPrompt, parseLongestLabel } from "./naming.js";
|
|
17
|
+
import { classifyWithRetry, parseClassifierContent, rewriteTimeoutMs } from "./client-shared.js";
|
|
18
|
+
import { CLASSIFIER_SYSTEM_PROMPT, CLASSIFIER_JSON_SCHEMA, buildUserPrompt, } from "../core/classifier/prompt.js";
|
|
16
19
|
import { REWRITE_SYSTEM_PROMPT, parseRewriteJson } from "../core/recall/rewrite-prompt.js";
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
// Ollama /api/embeddings endpoint returned 500 on 54% of those large
|
|
28
|
-
// inputs despite nomic-embed-text's nominal 8192-token context — semantic
|
|
29
|
-
// R@5 collapsed from 87.2% → 15.8%. Reverted. Real fix is chunk + max-pool
|
|
30
|
-
// (each body split into ≤8K-char chunks, store all vectors, score against
|
|
31
|
-
// max cosine at query time) so coverage doesn't depend on a single embed
|
|
32
|
-
// call. Filed as #174.
|
|
33
|
-
const MAX_EMBED_CHARS = 8_000;
|
|
34
|
-
const EMBED_PREFIXES = {
|
|
20
|
+
// MAX_EMBED_CHARS is the per-transport-call cap for the Ollama
|
|
21
|
+
// /api/embeddings endpoint. Chunking shipped in migration 009: session
|
|
22
|
+
// text splits into 5500-char chunks with 500-char overlap; recall scores
|
|
23
|
+
// against max cosine across all chunks for that session (max-pool at query
|
|
24
|
+
// time). Raising this cap to 28000 on 2026-05-25 caused Ollama 500s on
|
|
25
|
+
// 54% of long inputs and semantic R@5 collapsed from 87.2% to 15.8%;
|
|
26
|
+
// the cap stays at 8000 while each chunk remains well under the Ollama
|
|
27
|
+
// failure cliff.
|
|
28
|
+
export const MAX_EMBED_CHARS = 8_000;
|
|
29
|
+
export const EMBED_PREFIXES = {
|
|
35
30
|
query: "search_query: ",
|
|
36
31
|
document: "search_document: ",
|
|
37
32
|
};
|
|
@@ -71,7 +66,7 @@ export class OllamaClient {
|
|
|
71
66
|
this.fetchImpl = opts.fetchImpl ?? fetch;
|
|
72
67
|
this.classifyAttempts = opts.classifyAttempts ?? 3;
|
|
73
68
|
}
|
|
74
|
-
async embed(text, kind) {
|
|
69
|
+
async embed(text, kind, opts) {
|
|
75
70
|
// nomic-embed-text v1.5 is an asymmetric retrieval model. The
|
|
76
71
|
// search_query:/search_document: prefix is part of the training
|
|
77
72
|
// contract; omitting it or using the wrong one degrades retrieval
|
|
@@ -80,6 +75,10 @@ export class OllamaClient {
|
|
|
80
75
|
const prompt = `${EMBED_PREFIXES[kind]}${truncated}`;
|
|
81
76
|
const controller = new AbortController();
|
|
82
77
|
const timer = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
78
|
+
const onExternal = opts?.signal != null ? () => { controller.abort(); } : null;
|
|
79
|
+
if (onExternal != null && opts?.signal != null) {
|
|
80
|
+
opts.signal.addEventListener("abort", onExternal, { once: true });
|
|
81
|
+
}
|
|
83
82
|
try {
|
|
84
83
|
const res = await this.fetchImpl(`${this.baseUrl}/api/embeddings`, {
|
|
85
84
|
method: "POST",
|
|
@@ -104,27 +103,13 @@ export class OllamaClient {
|
|
|
104
103
|
}
|
|
105
104
|
finally {
|
|
106
105
|
clearTimeout(timer);
|
|
106
|
+
if (onExternal != null && opts?.signal != null) {
|
|
107
|
+
opts.signal.removeEventListener("abort", onExternal);
|
|
108
|
+
}
|
|
107
109
|
}
|
|
108
110
|
}
|
|
109
|
-
/**
|
|
110
|
-
* Classify a transcript, retrying up to `classifyAttempts` times on transient
|
|
111
|
-
* schema/unreachable errors before rethrowing the last error. Each attempt
|
|
112
|
-
* sends the transcript through the Ollama classifier and returns a
|
|
113
|
-
* ClassifyResult on success, or throws LLMUnreachableError / ClassifierSchemaError.
|
|
114
|
-
*/
|
|
115
111
|
async classify(transcript, priorContext = "") {
|
|
116
|
-
|
|
117
|
-
for (let attempt = 1; attempt <= this.classifyAttempts; attempt++) {
|
|
118
|
-
try {
|
|
119
|
-
return await this.classifyOnce(transcript, priorContext);
|
|
120
|
-
}
|
|
121
|
-
catch (e) {
|
|
122
|
-
if (!(e instanceof ClassifierSchemaError || e instanceof LLMUnreachableError))
|
|
123
|
-
throw e;
|
|
124
|
-
lastErr = e;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
throw lastErr;
|
|
112
|
+
return classifyWithRetry(this.classifyAttempts, () => this.classifyOnce(transcript, priorContext));
|
|
128
113
|
}
|
|
129
114
|
async classifyOnce(transcript, priorContext) {
|
|
130
115
|
const controller = new AbortController();
|
|
@@ -152,19 +137,7 @@ export class OllamaClient {
|
|
|
152
137
|
throw new LLMUnreachableError("ollama", `status ${res.status}`);
|
|
153
138
|
}
|
|
154
139
|
const data = (await res.json());
|
|
155
|
-
|
|
156
|
-
const content = stripJsonFences(rawContent);
|
|
157
|
-
let parsed;
|
|
158
|
-
try {
|
|
159
|
-
parsed = JSON.parse(content);
|
|
160
|
-
}
|
|
161
|
-
catch {
|
|
162
|
-
throw new ClassifierSchemaError("ollama returned non-JSON content");
|
|
163
|
-
}
|
|
164
|
-
if (!validateClassifierJson(parsed)) {
|
|
165
|
-
throw new ClassifierSchemaError("ollama response missing required keys");
|
|
166
|
-
}
|
|
167
|
-
return coerceClassifyResult(parsed);
|
|
140
|
+
return parseClassifierContent(data.message?.content ?? "", "ollama");
|
|
168
141
|
}
|
|
169
142
|
catch (e) {
|
|
170
143
|
if (e instanceof LLMUnreachableError || e instanceof ClassifierSchemaError)
|
|
@@ -211,5 +184,40 @@ export class OllamaClient {
|
|
|
211
184
|
clearTimeout(timer);
|
|
212
185
|
}
|
|
213
186
|
}
|
|
187
|
+
async nameWorkstream(content, candidates) {
|
|
188
|
+
if (candidates.length === 0)
|
|
189
|
+
return null;
|
|
190
|
+
const sys = buildNamingSystemPrompt(candidates);
|
|
191
|
+
const controller = new AbortController();
|
|
192
|
+
const timer = setTimeout(() => controller.abort(), this.classifyTimeoutMs);
|
|
193
|
+
const needsThinkOff = classifierNeedsThinkDisabled(this.classifyModel);
|
|
194
|
+
try {
|
|
195
|
+
const res = await this.fetchImpl(`${this.baseUrl}/api/chat`, {
|
|
196
|
+
method: "POST",
|
|
197
|
+
headers: { "Content-Type": "application/json" },
|
|
198
|
+
body: JSON.stringify({
|
|
199
|
+
model: this.classifyModel,
|
|
200
|
+
messages: [
|
|
201
|
+
{ role: "system", content: sys },
|
|
202
|
+
{ role: "user", content },
|
|
203
|
+
],
|
|
204
|
+
stream: false,
|
|
205
|
+
...(needsThinkOff ? { think: false } : {}),
|
|
206
|
+
}),
|
|
207
|
+
signal: controller.signal,
|
|
208
|
+
});
|
|
209
|
+
if (!res.ok)
|
|
210
|
+
return null;
|
|
211
|
+
const data = (await res.json());
|
|
212
|
+
const out = data.message?.content ?? "";
|
|
213
|
+
return parseLongestLabel(out, candidates);
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
finally {
|
|
219
|
+
clearTimeout(timer);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
214
222
|
}
|
|
215
223
|
//# sourceMappingURL=ollama-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama-client.js","sourceRoot":"","sources":["../../src/llm/ollama-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"ollama-client.js","sourceRoot":"","sources":["../../src/llm/ollama-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,13 @@
|
|
|
14
14
|
* Vectors are L2-normalised before return so vec0 cosine retrieval is correct.
|
|
15
15
|
*/
|
|
16
16
|
import type { CodeEmbedder, EmbedCodeResult } from "../ports/code-embedder.js";
|
|
17
|
+
export declare const DEFAULT_CODE_EMBED_MODEL = "hf.co/awhiteside/CodeRankEmbed-Q8_0-GGUF";
|
|
18
|
+
export declare const CODE_RANK_QUERY_PREFIX = "Represent this query for searching relevant code: ";
|
|
19
|
+
/** Apply the code-embed prefix convention for `model`. CodeRankEmbed prefixes
|
|
20
|
+
* queries and leaves documents raw; nomic-family models use the asymmetric
|
|
21
|
+
* search_query/search_document prefixes. Shared by both transports so the two
|
|
22
|
+
* code embedders produce identical inputs (and thus interchangeable vectors). */
|
|
23
|
+
export declare function buildCodeEmbedPrompt(text: string, role: "query" | "document", model: string): string;
|
|
17
24
|
export interface OllamaCodeEmbedderOptions {
|
|
18
25
|
readonly baseUrl?: string;
|
|
19
26
|
readonly model?: string;
|
|
@@ -21,8 +28,6 @@ export interface OllamaCodeEmbedderOptions {
|
|
|
21
28
|
export declare class OllamaCodeEmbedder implements CodeEmbedder {
|
|
22
29
|
private readonly baseUrl;
|
|
23
30
|
private readonly model;
|
|
24
|
-
private readonly isNomic;
|
|
25
31
|
constructor(opts?: OllamaCodeEmbedderOptions);
|
|
26
|
-
embed(text: string, role: "query" | "document"): Promise<EmbedCodeResult>;
|
|
27
|
-
private buildPrompt;
|
|
32
|
+
embed(text: string, role: "query" | "document", signal?: AbortSignal): Promise<EmbedCodeResult>;
|
|
28
33
|
}
|