nlm-memory 0.20.0 → 0.20.1
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 +17 -10
- package/dist/cli/digest.js +21 -0
- 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 +766 -55
- package/dist/cli/nlm.js.map +1 -1
- 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.js +6 -0
- package/dist/core/adapters/claude-code.js.map +1 -1
- package/dist/core/classifier/prompt.js +3 -3
- package/dist/core/digest/compose.d.ts +10 -0
- package/dist/core/digest/compose.js +7 -1
- package/dist/core/digest/compose.js.map +1 -1
- 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 +1 -0
- package/dist/core/exemplars/capture-from-session.js +6 -2
- 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.js +2 -65
- package/dist/core/exemplars/extract-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/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/ingest-session.d.ts +5 -0
- package/dist/core/ingest/ingest-session.js +3 -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 +3 -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 +275 -0
- package/dist/core/ingest/reprocess.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/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/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 +21 -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 +13 -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 +75 -10
- package/dist/core/scheduler/scheduler.js.map +1 -1
- package/dist/core/signals/code-signal.d.ts +49 -0
- package/dist/core/signals/code-signal.js +53 -0
- package/dist/core/signals/code-signal.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 +7 -0
- 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 +9 -0
- package/dist/core/storage/pg-session-store.js +204 -76
- package/dist/core/storage/pg-session-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 +24 -0
- package/dist/core/storage/pg-workstream-store.js +96 -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 +11 -0
- 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 +76 -25
- package/dist/core/storage/sqlite-fact-store.js.map +1 -1
- package/dist/core/storage/sqlite-session-store.d.ts +20 -5
- package/dist/core/storage/sqlite-session-store.js +183 -68
- package/dist/core/storage/sqlite-session-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 +24 -0
- package/dist/core/storage/sqlite-workstream-store.js +98 -0
- package/dist/core/storage/sqlite-workstream-store.js.map +1 -0
- 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 +25 -0
- package/dist/core/workstream/bind.js +23 -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 +20 -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 +66 -0
- package/dist/hook/pre-compact-hook.js.map +1 -0
- package/dist/hook/prompt-recall-hook.d.ts +37 -0
- package/dist/hook/prompt-recall-hook.js +120 -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 +1 -1
- package/dist/hook/recall-over-http.js +11 -11
- 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 +24 -59
- package/dist/hook/session-start-hook.js.map +1 -1
- package/dist/hook/stop-hook.js +22 -59
- package/dist/hook/stop-hook.js.map +1 -1
- package/dist/hook/subagent-start-hook.d.ts +28 -0
- package/dist/hook/subagent-start-hook.js +81 -0
- package/dist/hook/subagent-start-hook.js.map +1 -0
- package/dist/http/app.js +28 -8
- 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 +47 -2
- package/dist/mcp/server.js +303 -18
- 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/session-store.d.ts +12 -0
- 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 +21 -0
- package/dist/ports/workstream-store.js +2 -0
- package/dist/ports/workstream-store.js.map +1 -0
- package/dist/shared/types.d.ts +23 -2
- 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/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/nlm/index.js +395 -37
- package/package.json +12 -2
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/scripts/prompt-recall-hook.mjs +402 -41
- package/plugin/scripts/session-start-hook.mjs +286 -60
- package/plugin/scripts/stop-hook.mjs +85 -65
- 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
|
@@ -14,39 +14,35 @@
|
|
|
14
14
|
* Vectors are L2-normalised before return so vec0 cosine retrieval is correct.
|
|
15
15
|
*/
|
|
16
16
|
import { LLMUnreachableError } from "../ports/llm-client.js";
|
|
17
|
-
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
import { l2Normalize } from "./ollama-client.js";
|
|
18
|
+
export const DEFAULT_CODE_EMBED_MODEL = "hf.co/awhiteside/CodeRankEmbed-Q8_0-GGUF";
|
|
19
|
+
export const CODE_RANK_QUERY_PREFIX = "Represent this query for searching relevant code: ";
|
|
20
|
+
/** Apply the code-embed prefix convention for `model`. CodeRankEmbed prefixes
|
|
21
|
+
* queries and leaves documents raw; nomic-family models use the asymmetric
|
|
22
|
+
* search_query/search_document prefixes. Shared by both transports so the two
|
|
23
|
+
* code embedders produce identical inputs (and thus interchangeable vectors). */
|
|
24
|
+
export function buildCodeEmbedPrompt(text, role, model) {
|
|
25
|
+
if (model.startsWith("nomic")) {
|
|
26
|
+
return role === "query" ? `search_query: ${text}` : `search_document: ${text}`;
|
|
24
27
|
}
|
|
25
|
-
|
|
26
|
-
return v;
|
|
27
|
-
const norm = Math.sqrt(sumSq);
|
|
28
|
-
const out = new Float32Array(v.length);
|
|
29
|
-
for (let i = 0; i < v.length; i++)
|
|
30
|
-
out[i] = (v[i] ?? 0) / norm;
|
|
31
|
-
return out;
|
|
28
|
+
return role === "query" ? `${CODE_RANK_QUERY_PREFIX}${text}` : text;
|
|
32
29
|
}
|
|
33
30
|
export class OllamaCodeEmbedder {
|
|
34
31
|
baseUrl;
|
|
35
32
|
model;
|
|
36
|
-
isNomic;
|
|
37
33
|
constructor(opts = {}) {
|
|
38
34
|
this.baseUrl = opts.baseUrl ?? (process.env["OLLAMA_HOST"] ?? "http://localhost:11434");
|
|
39
35
|
this.model = opts.model ?? (process.env["NLM_CODE_EMBED_MODEL"] ?? DEFAULT_CODE_EMBED_MODEL);
|
|
40
|
-
this.isNomic = this.model.startsWith("nomic");
|
|
41
36
|
}
|
|
42
|
-
async embed(text, role) {
|
|
43
|
-
const prompt =
|
|
37
|
+
async embed(text, role, signal) {
|
|
38
|
+
const prompt = buildCodeEmbedPrompt(text, role, this.model);
|
|
44
39
|
let res;
|
|
45
40
|
try {
|
|
46
41
|
res = await fetch(`${this.baseUrl}/api/embeddings`, {
|
|
47
42
|
method: "POST",
|
|
48
43
|
headers: { "Content-Type": "application/json" },
|
|
49
44
|
body: JSON.stringify({ model: this.model, prompt }),
|
|
45
|
+
...(signal ? { signal } : {}),
|
|
50
46
|
});
|
|
51
47
|
}
|
|
52
48
|
catch (e) {
|
|
@@ -63,11 +59,5 @@ export class OllamaCodeEmbedder {
|
|
|
63
59
|
const vector = l2Normalize(raw);
|
|
64
60
|
return { vector, dim: vector.length };
|
|
65
61
|
}
|
|
66
|
-
buildPrompt(text, role) {
|
|
67
|
-
if (this.isNomic) {
|
|
68
|
-
return role === "query" ? `search_query: ${text}` : `search_document: ${text}`;
|
|
69
|
-
}
|
|
70
|
-
return role === "query" ? `${CODE_RANK_QUERY_PREFIX}${text}` : text;
|
|
71
|
-
}
|
|
72
62
|
}
|
|
73
63
|
//# sourceMappingURL=ollama-code-embedder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama-code-embedder.js","sourceRoot":"","sources":["../../src/llm/ollama-code-embedder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"ollama-code-embedder.js","sourceRoot":"","sources":["../../src/llm/ollama-code-embedder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,MAAM,wBAAwB,GAAG,0CAA0C,CAAC;AACnF,MAAM,CAAC,MAAM,sBAAsB,GAAG,oDAAoD,CAAC;AAE3F;;;kFAGkF;AAClF,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,IAA0B,EAAE,KAAa;IAC1F,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,CAAC,oBAAoB,IAAI,EAAE,CAAC;IACjF,CAAC;IACD,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,sBAAsB,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACtE,CAAC;AAOD,MAAM,OAAO,kBAAkB;IACZ,OAAO,CAAS;IAChB,KAAK,CAAS;IAE/B,YAAY,OAAkC,EAAE;QAC9C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,wBAAwB,CAAC,CAAC;QACxF,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,wBAAwB,CAAC,CAAC;IAC/F,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,IAA0B,EAAE,MAAoB;QACxE,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5D,IAAI,GAAa,CAAC;QAClB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,iBAAiB,EAAE;gBAClD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;gBACnD,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,mBAAmB,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,mBAAmB,CAAC,sBAAsB,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9E,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA6B,CAAC;QAC5D,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,mBAAmB,CAAC,sBAAsB,EAAE,iBAAiB,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAChC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACxC,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAICodeEmbedderClient — the code-lane embedder over any OpenAI-compatible
|
|
3
|
+
* `/v1/embeddings` endpoint (LM Studio, oMLX, vLLM, cloud). It mirrors
|
|
4
|
+
* OllamaCodeEmbedder's contract exactly — same CodeRankEmbed/nomic prefix
|
|
5
|
+
* convention (via the shared `buildCodeEmbedPrompt`) and the same
|
|
6
|
+
* L2-normalization — so vectors are interchangeable with the Ollama transport.
|
|
7
|
+
* Only the request/response shape differs (`{model, input}` -> `data[0].embedding`).
|
|
8
|
+
*/
|
|
9
|
+
import type { CodeEmbedder, EmbedCodeResult } from "../ports/code-embedder.js";
|
|
10
|
+
export type FetchImpl = typeof fetch;
|
|
11
|
+
export interface OpenAICodeEmbedderClientOptions {
|
|
12
|
+
readonly baseUrl: string;
|
|
13
|
+
readonly model?: string;
|
|
14
|
+
/** Optional — local servers ignore it; a placeholder is sent when unset. */
|
|
15
|
+
readonly apiKey?: string;
|
|
16
|
+
readonly fetchImpl?: FetchImpl;
|
|
17
|
+
}
|
|
18
|
+
export declare class OpenAICodeEmbedderClient implements CodeEmbedder {
|
|
19
|
+
private readonly baseUrl;
|
|
20
|
+
private readonly model;
|
|
21
|
+
private readonly apiKey;
|
|
22
|
+
private readonly fetchImpl;
|
|
23
|
+
constructor(opts: OpenAICodeEmbedderClientOptions);
|
|
24
|
+
embed(text: string, role: "query" | "document", signal?: AbortSignal): Promise<EmbedCodeResult>;
|
|
25
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAICodeEmbedderClient — the code-lane embedder over any OpenAI-compatible
|
|
3
|
+
* `/v1/embeddings` endpoint (LM Studio, oMLX, vLLM, cloud). It mirrors
|
|
4
|
+
* OllamaCodeEmbedder's contract exactly — same CodeRankEmbed/nomic prefix
|
|
5
|
+
* convention (via the shared `buildCodeEmbedPrompt`) and the same
|
|
6
|
+
* L2-normalization — so vectors are interchangeable with the Ollama transport.
|
|
7
|
+
* Only the request/response shape differs (`{model, input}` -> `data[0].embedding`).
|
|
8
|
+
*/
|
|
9
|
+
import { LLMUnreachableError } from "../ports/llm-client.js";
|
|
10
|
+
import { l2Normalize } from "./ollama-client.js";
|
|
11
|
+
import { DEFAULT_CODE_EMBED_MODEL, buildCodeEmbedPrompt } from "./ollama-code-embedder.js";
|
|
12
|
+
export class OpenAICodeEmbedderClient {
|
|
13
|
+
baseUrl;
|
|
14
|
+
model;
|
|
15
|
+
apiKey;
|
|
16
|
+
fetchImpl;
|
|
17
|
+
constructor(opts) {
|
|
18
|
+
this.baseUrl = opts.baseUrl.replace(/\/+$/, "");
|
|
19
|
+
this.model = opts.model ?? DEFAULT_CODE_EMBED_MODEL;
|
|
20
|
+
this.apiKey = opts.apiKey ?? "local";
|
|
21
|
+
this.fetchImpl = opts.fetchImpl ?? fetch;
|
|
22
|
+
}
|
|
23
|
+
async embed(text, role, signal) {
|
|
24
|
+
const input = buildCodeEmbedPrompt(text, role, this.model);
|
|
25
|
+
let res;
|
|
26
|
+
try {
|
|
27
|
+
res = await this.fetchImpl(`${this.baseUrl}/embeddings`, {
|
|
28
|
+
method: "POST",
|
|
29
|
+
headers: {
|
|
30
|
+
"Content-Type": "application/json",
|
|
31
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
32
|
+
},
|
|
33
|
+
body: JSON.stringify({ model: this.model, input }),
|
|
34
|
+
...(signal ? { signal } : {}),
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
throw new LLMUnreachableError("openai-code-embedder", String(e));
|
|
39
|
+
}
|
|
40
|
+
if (!res.ok) {
|
|
41
|
+
throw new LLMUnreachableError("openai-code-embedder", `HTTP ${res.status}`);
|
|
42
|
+
}
|
|
43
|
+
const data = (await res.json());
|
|
44
|
+
const embedding = data.data?.[0]?.embedding;
|
|
45
|
+
if (!embedding || embedding.length === 0) {
|
|
46
|
+
throw new LLMUnreachableError("openai-code-embedder", "empty embedding");
|
|
47
|
+
}
|
|
48
|
+
const vector = l2Normalize(new Float32Array(embedding));
|
|
49
|
+
return { vector, dim: vector.length };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=openai-code-embedder-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-code-embedder-client.js","sourceRoot":"","sources":["../../src/llm/openai-code-embedder-client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAgB3F,MAAM,OAAO,wBAAwB;IAClB,OAAO,CAAS;IAChB,KAAK,CAAS;IACd,MAAM,CAAS;IACf,SAAS,CAAY;IAEtC,YAAY,IAAqC;QAC/C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,wBAAwB,CAAC;QACpD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,IAA0B,EAAE,MAAoB;QACxE,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D,IAAI,GAAa,CAAC;QAClB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO,aAAa,EAAE;gBACvD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;iBACvC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;gBAClD,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,mBAAmB,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,mBAAmB,CAAC,sBAAsB,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9E,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAuB,CAAC;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;QAC5C,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,mBAAmB,CAAC,sBAAsB,EAAE,iBAAiB,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;QACxD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACxC,CAAC;CACF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAIEmbedderClient — an embedder backed by any OpenAI-compatible
|
|
3
|
+
* `/v1/embeddings` endpoint (LM Studio, oMLX, vLLM, or a cloud API). It mirrors
|
|
4
|
+
* OllamaClient's embedding contract exactly so vectors are interchangeable:
|
|
5
|
+
* the same nomic asymmetric-retrieval prefixes (`search_query:` /
|
|
6
|
+
* `search_document:`), the same MAX_EMBED_CHARS truncation, and the same
|
|
7
|
+
* L2-normalization. Only the transport differs (POST `/embeddings` with
|
|
8
|
+
* `{model, input}` and a `data[0].embedding` response shape).
|
|
9
|
+
*
|
|
10
|
+
* This client only embeds. `classify()` and `rewriteForRecall()` are not
|
|
11
|
+
* supported and throw LLMUnreachableError so a RecallService that holds this as
|
|
12
|
+
* its `llm` fails open to the raw query rather than crashing.
|
|
13
|
+
*/
|
|
14
|
+
import type { ClassifyResult, EmbedResult, EmbeddingKind, LLMClient, RewriteResult } from "../ports/llm-client.js";
|
|
15
|
+
export type FetchImpl = typeof fetch;
|
|
16
|
+
/** Default model for the openai embedder provider — nomic-embed-text v1.5 as
|
|
17
|
+
* served by LM Studio (`/v1/embeddings`). Exported so the info descriptor
|
|
18
|
+
* reports the same default the client actually uses. */
|
|
19
|
+
export declare const DEFAULT_OPENAI_EMBED_MODEL = "text-embedding-nomic-embed-text-v1.5";
|
|
20
|
+
export interface OpenAIEmbedderClientOptions {
|
|
21
|
+
readonly baseUrl: string;
|
|
22
|
+
readonly model?: string;
|
|
23
|
+
/** Optional — local servers ignore it; a placeholder is sent when unset. */
|
|
24
|
+
readonly apiKey?: string;
|
|
25
|
+
readonly timeoutMs?: number;
|
|
26
|
+
readonly fetchImpl?: FetchImpl;
|
|
27
|
+
}
|
|
28
|
+
export declare class OpenAIEmbedderClient implements LLMClient {
|
|
29
|
+
private readonly baseUrl;
|
|
30
|
+
private readonly model;
|
|
31
|
+
private readonly apiKey;
|
|
32
|
+
private readonly timeoutMs;
|
|
33
|
+
private readonly fetchImpl;
|
|
34
|
+
constructor(opts: OpenAIEmbedderClientOptions);
|
|
35
|
+
embed(text: string, kind: EmbeddingKind, opts?: {
|
|
36
|
+
signal?: AbortSignal;
|
|
37
|
+
}): Promise<EmbedResult>;
|
|
38
|
+
classify(_transcript: string): Promise<ClassifyResult>;
|
|
39
|
+
rewriteForRecall(_query: string): Promise<RewriteResult>;
|
|
40
|
+
nameWorkstream(): Promise<string | null>;
|
|
41
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAIEmbedderClient — an embedder backed by any OpenAI-compatible
|
|
3
|
+
* `/v1/embeddings` endpoint (LM Studio, oMLX, vLLM, or a cloud API). It mirrors
|
|
4
|
+
* OllamaClient's embedding contract exactly so vectors are interchangeable:
|
|
5
|
+
* the same nomic asymmetric-retrieval prefixes (`search_query:` /
|
|
6
|
+
* `search_document:`), the same MAX_EMBED_CHARS truncation, and the same
|
|
7
|
+
* L2-normalization. Only the transport differs (POST `/embeddings` with
|
|
8
|
+
* `{model, input}` and a `data[0].embedding` response shape).
|
|
9
|
+
*
|
|
10
|
+
* This client only embeds. `classify()` and `rewriteForRecall()` are not
|
|
11
|
+
* supported and throw LLMUnreachableError so a RecallService that holds this as
|
|
12
|
+
* its `llm` fails open to the raw query rather than crashing.
|
|
13
|
+
*/
|
|
14
|
+
import { LLMUnreachableError } from "../ports/llm-client.js";
|
|
15
|
+
import { EMBED_PREFIXES, MAX_EMBED_CHARS, l2Normalize } from "./ollama-client.js";
|
|
16
|
+
/** Default model for the openai embedder provider — nomic-embed-text v1.5 as
|
|
17
|
+
* served by LM Studio (`/v1/embeddings`). Exported so the info descriptor
|
|
18
|
+
* reports the same default the client actually uses. */
|
|
19
|
+
export const DEFAULT_OPENAI_EMBED_MODEL = "text-embedding-nomic-embed-text-v1.5";
|
|
20
|
+
export class OpenAIEmbedderClient {
|
|
21
|
+
baseUrl;
|
|
22
|
+
model;
|
|
23
|
+
apiKey;
|
|
24
|
+
timeoutMs;
|
|
25
|
+
fetchImpl;
|
|
26
|
+
constructor(opts) {
|
|
27
|
+
this.baseUrl = opts.baseUrl.replace(/\/+$/, "");
|
|
28
|
+
this.model = opts.model ?? DEFAULT_OPENAI_EMBED_MODEL;
|
|
29
|
+
this.apiKey = opts.apiKey ?? "local";
|
|
30
|
+
this.timeoutMs = opts.timeoutMs ?? 30_000;
|
|
31
|
+
this.fetchImpl = opts.fetchImpl ?? fetch;
|
|
32
|
+
}
|
|
33
|
+
async embed(text, kind, opts) {
|
|
34
|
+
const input = `${EMBED_PREFIXES[kind]}${text.slice(0, MAX_EMBED_CHARS)}`;
|
|
35
|
+
const controller = new AbortController();
|
|
36
|
+
const timer = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
37
|
+
const onExternal = opts?.signal != null ? () => { controller.abort(); } : null;
|
|
38
|
+
if (onExternal != null && opts?.signal != null) {
|
|
39
|
+
opts.signal.addEventListener("abort", onExternal, { once: true });
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
const res = await this.fetchImpl(`${this.baseUrl}/embeddings`, {
|
|
43
|
+
method: "POST",
|
|
44
|
+
headers: {
|
|
45
|
+
"Content-Type": "application/json",
|
|
46
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
47
|
+
},
|
|
48
|
+
body: JSON.stringify({ model: this.model, input }),
|
|
49
|
+
signal: controller.signal,
|
|
50
|
+
});
|
|
51
|
+
if (!res.ok) {
|
|
52
|
+
throw new LLMUnreachableError("openai-embedder", `status ${res.status}`);
|
|
53
|
+
}
|
|
54
|
+
const data = (await res.json());
|
|
55
|
+
const embedding = data.data?.[0]?.embedding;
|
|
56
|
+
if (!embedding || embedding.length === 0) {
|
|
57
|
+
throw new LLMUnreachableError("openai-embedder", "empty embedding");
|
|
58
|
+
}
|
|
59
|
+
return { vector: l2Normalize(new Float32Array(embedding)), model: this.model };
|
|
60
|
+
}
|
|
61
|
+
catch (e) {
|
|
62
|
+
if (e instanceof LLMUnreachableError)
|
|
63
|
+
throw e;
|
|
64
|
+
throw new LLMUnreachableError("openai-embedder", e);
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
clearTimeout(timer);
|
|
68
|
+
if (onExternal != null && opts?.signal != null) {
|
|
69
|
+
opts.signal.removeEventListener("abort", onExternal);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async classify(_transcript) {
|
|
74
|
+
throw new LLMUnreachableError("openai-embedder", "classify not supported — OpenAIEmbedderClient is an embedder only");
|
|
75
|
+
}
|
|
76
|
+
async rewriteForRecall(_query) {
|
|
77
|
+
throw new LLMUnreachableError("openai-embedder", "rewriteForRecall not supported — OpenAIEmbedderClient is an embedder only");
|
|
78
|
+
}
|
|
79
|
+
nameWorkstream() {
|
|
80
|
+
throw new Error("OpenAIEmbedderClient does not support nameWorkstream");
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=openai-embedder-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-embedder-client.js","sourceRoot":"","sources":["../../src/llm/openai-embedder-client.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/server.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ import type { FactRecallService } from "../core/recall-facts/fact-recall-service
|
|
|
14
14
|
import type { RecallService } from "../core/recall/recall-service.js";
|
|
15
15
|
import type { FactStore } from "../ports/fact-store.js";
|
|
16
16
|
import type { SessionStore } from "../ports/session-store.js";
|
|
17
|
+
import { type BuildWorkDigestDeps } from "../core/work-digest/build-work-digest.js";
|
|
17
18
|
import type { FactKind, RecallKindFilter, RecallMode } from "../shared/types.js";
|
|
18
19
|
export interface McpDeps {
|
|
19
20
|
readonly recall: RecallService;
|
|
@@ -26,6 +27,15 @@ export interface McpDeps {
|
|
|
26
27
|
/** Optional code embedder for recall_code semantic search. */
|
|
27
28
|
readonly codeEmbedder?: import("../ports/code-embedder.js").CodeEmbedder;
|
|
28
29
|
readonly installScope?: string;
|
|
30
|
+
/** Wire to enable the work_summary tool (operator daily work digest). */
|
|
31
|
+
readonly workDigest?: BuildWorkDigestDeps;
|
|
32
|
+
/** Wire to enable recall_workstream. Mirrors RollupDeps + the store for idOrLabel resolution. */
|
|
33
|
+
readonly workstreams?: {
|
|
34
|
+
readonly store: import("../ports/workstream-store.js").WorkstreamStore;
|
|
35
|
+
readonly sessions: Pick<SessionStore, "listSessionIdsByWorkstreams">;
|
|
36
|
+
readonly facts: Pick<FactStore, "listBySessions">;
|
|
37
|
+
readonly exemplars: Pick<import("../ports/code-exemplar-store.js").CodeExemplarStore, "listBySessions">;
|
|
38
|
+
};
|
|
29
39
|
}
|
|
30
40
|
export interface ToolResult {
|
|
31
41
|
content: {
|
|
@@ -41,8 +51,40 @@ export interface RecallToolInput {
|
|
|
41
51
|
mode: RecallMode | undefined;
|
|
42
52
|
limit: number | undefined;
|
|
43
53
|
rewrite: boolean | undefined;
|
|
54
|
+
workstream: string | undefined;
|
|
44
55
|
}
|
|
45
|
-
|
|
56
|
+
/**
|
|
57
|
+
* Normalize an MCP client's self-reported identity (from the initialize
|
|
58
|
+
* handshake's clientInfo) into a runtime attribution string for the recall
|
|
59
|
+
* query-log. Returns null when no usable name is present, so the log stays
|
|
60
|
+
* honest about unknown callers. Trim + lowercase keeps aggregation clean
|
|
61
|
+
* (claude-code, cursor, hermes) and matches the hook-side runtime convention.
|
|
62
|
+
*/
|
|
63
|
+
export declare function mcpRuntimeFromClient(client: {
|
|
64
|
+
name?: string;
|
|
65
|
+
} | undefined): string | null;
|
|
66
|
+
export declare function recallSessionsHandler(deps: McpDeps, input: Partial<RecallToolInput>, runtime?: string | null): Promise<ToolResult>;
|
|
67
|
+
export declare function workSummaryHandler(deps: McpDeps, input: {
|
|
68
|
+
date?: string | undefined;
|
|
69
|
+
}): Promise<ToolResult>;
|
|
70
|
+
export declare function recallWorkstreamHandler(deps: McpDeps, input: {
|
|
71
|
+
idOrLabel?: string;
|
|
72
|
+
}, runtime?: string | null): Promise<ToolResult>;
|
|
73
|
+
export declare function renameWorkstreamHandler(deps: McpDeps, input: {
|
|
74
|
+
idOrLabel?: string;
|
|
75
|
+
label?: string;
|
|
76
|
+
}): Promise<ToolResult>;
|
|
77
|
+
export declare function retireWorkstreamHandler(deps: McpDeps, input: {
|
|
78
|
+
idOrLabel?: string;
|
|
79
|
+
}): Promise<ToolResult>;
|
|
80
|
+
export declare function mergeWorkstreamsHandler(deps: McpDeps, input: {
|
|
81
|
+
from?: string;
|
|
82
|
+
into?: string;
|
|
83
|
+
}): Promise<ToolResult>;
|
|
84
|
+
export declare function rebindSessionHandler(deps: McpDeps, input: {
|
|
85
|
+
sessionId?: string;
|
|
86
|
+
workstream?: string;
|
|
87
|
+
}): Promise<ToolResult>;
|
|
46
88
|
export declare function getSessionHandler(deps: McpDeps, input: {
|
|
47
89
|
id: string;
|
|
48
90
|
}): Promise<ToolResult>;
|
|
@@ -56,7 +98,7 @@ export interface RecallFactsInput {
|
|
|
56
98
|
minConfidence: number | undefined;
|
|
57
99
|
limit: number | undefined;
|
|
58
100
|
}
|
|
59
|
-
export declare function recallFactsHandler(deps: McpDeps, input: Partial<RecallFactsInput
|
|
101
|
+
export declare function recallFactsHandler(deps: McpDeps, input: Partial<RecallFactsInput>, runtime?: string | null): Promise<ToolResult>;
|
|
60
102
|
export declare function getFactHistoryHandler(deps: McpDeps, input: {
|
|
61
103
|
subject: string;
|
|
62
104
|
predicate: string | undefined;
|
|
@@ -78,4 +120,7 @@ export interface SupersedeFactInput {
|
|
|
78
120
|
}
|
|
79
121
|
export declare function supersedeFactHandler(deps: McpDeps, input: SupersedeFactInput): Promise<ToolResult>;
|
|
80
122
|
export declare function citeSessionHandler(input: CiteSessionInput): Promise<ToolResult>;
|
|
123
|
+
export declare function listMergeSuggestionsHandler(deps: McpDeps, input: {
|
|
124
|
+
minScore: number | undefined;
|
|
125
|
+
}): Promise<ToolResult>;
|
|
81
126
|
export declare function createMcpServer(deps: McpDeps): McpServer;
|