@steno-ai/engine 0.1.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/dist/adapters/cache.d.ts +9 -0
- package/dist/adapters/cache.d.ts.map +1 -0
- package/dist/adapters/cache.js +2 -0
- package/dist/adapters/cache.js.map +1 -0
- package/dist/adapters/embedding.d.ts +7 -0
- package/dist/adapters/embedding.d.ts.map +1 -0
- package/dist/adapters/embedding.js +2 -0
- package/dist/adapters/embedding.js.map +1 -0
- package/dist/adapters/gemini-embedding.d.ts +18 -0
- package/dist/adapters/gemini-embedding.d.ts.map +1 -0
- package/dist/adapters/gemini-embedding.js +53 -0
- package/dist/adapters/gemini-embedding.js.map +1 -0
- package/dist/adapters/index.d.ts +7 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +7 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/llm.d.ts +19 -0
- package/dist/adapters/llm.d.ts.map +1 -0
- package/dist/adapters/llm.js +2 -0
- package/dist/adapters/llm.js.map +1 -0
- package/dist/adapters/perplexity-embedding.d.ts +24 -0
- package/dist/adapters/perplexity-embedding.d.ts.map +1 -0
- package/dist/adapters/perplexity-embedding.js +78 -0
- package/dist/adapters/perplexity-embedding.js.map +1 -0
- package/dist/adapters/storage.d.ts +172 -0
- package/dist/adapters/storage.d.ts.map +1 -0
- package/dist/adapters/storage.js +2 -0
- package/dist/adapters/storage.js.map +1 -0
- package/dist/auth/api-key.d.ts +8 -0
- package/dist/auth/api-key.d.ts.map +1 -0
- package/dist/auth/api-key.js +27 -0
- package/dist/auth/api-key.js.map +1 -0
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +2 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/config.d.ts +296 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +92 -0
- package/dist/config.js.map +1 -0
- package/dist/extraction/contradiction.d.ts +15 -0
- package/dist/extraction/contradiction.d.ts.map +1 -0
- package/dist/extraction/contradiction.js +23 -0
- package/dist/extraction/contradiction.js.map +1 -0
- package/dist/extraction/dedup.d.ts +12 -0
- package/dist/extraction/dedup.d.ts.map +1 -0
- package/dist/extraction/dedup.js +93 -0
- package/dist/extraction/dedup.js.map +1 -0
- package/dist/extraction/entity-extractor.d.ts +30 -0
- package/dist/extraction/entity-extractor.d.ts.map +1 -0
- package/dist/extraction/entity-extractor.js +145 -0
- package/dist/extraction/entity-extractor.js.map +1 -0
- package/dist/extraction/hasher.d.ts +5 -0
- package/dist/extraction/hasher.d.ts.map +1 -0
- package/dist/extraction/hasher.js +8 -0
- package/dist/extraction/hasher.js.map +1 -0
- package/dist/extraction/heuristic.d.ts +3 -0
- package/dist/extraction/heuristic.d.ts.map +1 -0
- package/dist/extraction/heuristic.js +282 -0
- package/dist/extraction/heuristic.js.map +1 -0
- package/dist/extraction/index.d.ts +10 -0
- package/dist/extraction/index.d.ts.map +1 -0
- package/dist/extraction/index.js +10 -0
- package/dist/extraction/index.js.map +1 -0
- package/dist/extraction/llm-extractor.d.ts +23 -0
- package/dist/extraction/llm-extractor.d.ts.map +1 -0
- package/dist/extraction/llm-extractor.js +238 -0
- package/dist/extraction/llm-extractor.js.map +1 -0
- package/dist/extraction/pipeline.d.ts +30 -0
- package/dist/extraction/pipeline.d.ts.map +1 -0
- package/dist/extraction/pipeline.js +398 -0
- package/dist/extraction/pipeline.js.map +1 -0
- package/dist/extraction/prompts.d.ts +28 -0
- package/dist/extraction/prompts.d.ts.map +1 -0
- package/dist/extraction/prompts.js +196 -0
- package/dist/extraction/prompts.js.map +1 -0
- package/dist/extraction/sliding-window.d.ts +41 -0
- package/dist/extraction/sliding-window.d.ts.map +1 -0
- package/dist/extraction/sliding-window.js +84 -0
- package/dist/extraction/sliding-window.js.map +1 -0
- package/dist/extraction/types.d.ts +80 -0
- package/dist/extraction/types.d.ts.map +1 -0
- package/dist/extraction/types.js +2 -0
- package/dist/extraction/types.js.map +1 -0
- package/dist/feedback/index.d.ts +2 -0
- package/dist/feedback/index.d.ts.map +1 -0
- package/dist/feedback/index.js +2 -0
- package/dist/feedback/index.js.map +1 -0
- package/dist/feedback/tracker.d.ts +25 -0
- package/dist/feedback/tracker.d.ts.map +1 -0
- package/dist/feedback/tracker.js +90 -0
- package/dist/feedback/tracker.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/models/api-key.d.ts +54 -0
- package/dist/models/api-key.d.ts.map +1 -0
- package/dist/models/api-key.js +21 -0
- package/dist/models/api-key.js.map +1 -0
- package/dist/models/edge.d.ts +78 -0
- package/dist/models/edge.d.ts.map +1 -0
- package/dist/models/edge.js +29 -0
- package/dist/models/edge.js.map +1 -0
- package/dist/models/entity.d.ts +60 -0
- package/dist/models/entity.d.ts.map +1 -0
- package/dist/models/entity.js +22 -0
- package/dist/models/entity.js.map +1 -0
- package/dist/models/extraction.d.ts +111 -0
- package/dist/models/extraction.d.ts.map +1 -0
- package/dist/models/extraction.js +40 -0
- package/dist/models/extraction.js.map +1 -0
- package/dist/models/fact-entity.d.ts +33 -0
- package/dist/models/fact-entity.d.ts.map +1 -0
- package/dist/models/fact-entity.js +14 -0
- package/dist/models/fact-entity.js.map +1 -0
- package/dist/models/fact.d.ts +191 -0
- package/dist/models/fact.d.ts.map +1 -0
- package/dist/models/fact.js +72 -0
- package/dist/models/fact.js.map +1 -0
- package/dist/models/index.d.ts +13 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +13 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/memory-access.d.ts +89 -0
- package/dist/models/memory-access.d.ts.map +1 -0
- package/dist/models/memory-access.js +33 -0
- package/dist/models/memory-access.js.map +1 -0
- package/dist/models/session.d.ts +60 -0
- package/dist/models/session.d.ts.map +1 -0
- package/dist/models/session.js +23 -0
- package/dist/models/session.js.map +1 -0
- package/dist/models/tenant.d.ts +448 -0
- package/dist/models/tenant.d.ts.map +1 -0
- package/dist/models/tenant.js +23 -0
- package/dist/models/tenant.js.map +1 -0
- package/dist/models/trigger.d.ts +87 -0
- package/dist/models/trigger.d.ts.map +1 -0
- package/dist/models/trigger.js +41 -0
- package/dist/models/trigger.js.map +1 -0
- package/dist/models/usage-record.d.ts +37 -0
- package/dist/models/usage-record.d.ts.map +1 -0
- package/dist/models/usage-record.js +14 -0
- package/dist/models/usage-record.js.map +1 -0
- package/dist/models/webhook.d.ts +50 -0
- package/dist/models/webhook.d.ts.map +1 -0
- package/dist/models/webhook.js +25 -0
- package/dist/models/webhook.js.map +1 -0
- package/dist/profiles/index.d.ts +3 -0
- package/dist/profiles/index.d.ts.map +1 -0
- package/dist/profiles/index.js +2 -0
- package/dist/profiles/index.js.map +1 -0
- package/dist/profiles/profile.d.ts +22 -0
- package/dist/profiles/profile.d.ts.map +1 -0
- package/dist/profiles/profile.js +59 -0
- package/dist/profiles/profile.js.map +1 -0
- package/dist/retrieval/compound-search.d.ts +13 -0
- package/dist/retrieval/compound-search.d.ts.map +1 -0
- package/dist/retrieval/compound-search.js +87 -0
- package/dist/retrieval/compound-search.js.map +1 -0
- package/dist/retrieval/contradiction-surfacer.d.ts +18 -0
- package/dist/retrieval/contradiction-surfacer.d.ts.map +1 -0
- package/dist/retrieval/contradiction-surfacer.js +64 -0
- package/dist/retrieval/contradiction-surfacer.js.map +1 -0
- package/dist/retrieval/embedding-cache.d.ts +17 -0
- package/dist/retrieval/embedding-cache.d.ts.map +1 -0
- package/dist/retrieval/embedding-cache.js +56 -0
- package/dist/retrieval/embedding-cache.js.map +1 -0
- package/dist/retrieval/fusion.d.ts +27 -0
- package/dist/retrieval/fusion.d.ts.map +1 -0
- package/dist/retrieval/fusion.js +87 -0
- package/dist/retrieval/fusion.js.map +1 -0
- package/dist/retrieval/graph-traversal.d.ts +29 -0
- package/dist/retrieval/graph-traversal.d.ts.map +1 -0
- package/dist/retrieval/graph-traversal.js +208 -0
- package/dist/retrieval/graph-traversal.js.map +1 -0
- package/dist/retrieval/index.d.ts +14 -0
- package/dist/retrieval/index.d.ts.map +1 -0
- package/dist/retrieval/index.js +13 -0
- package/dist/retrieval/index.js.map +1 -0
- package/dist/retrieval/keyword-search.d.ts +4 -0
- package/dist/retrieval/keyword-search.d.ts.map +1 -0
- package/dist/retrieval/keyword-search.js +27 -0
- package/dist/retrieval/keyword-search.js.map +1 -0
- package/dist/retrieval/query-expansion.d.ts +20 -0
- package/dist/retrieval/query-expansion.d.ts.map +1 -0
- package/dist/retrieval/query-expansion.js +76 -0
- package/dist/retrieval/query-expansion.js.map +1 -0
- package/dist/retrieval/reranker.d.ts +15 -0
- package/dist/retrieval/reranker.d.ts.map +1 -0
- package/dist/retrieval/reranker.js +47 -0
- package/dist/retrieval/reranker.js.map +1 -0
- package/dist/retrieval/salience-scorer.d.ts +15 -0
- package/dist/retrieval/salience-scorer.d.ts.map +1 -0
- package/dist/retrieval/salience-scorer.js +41 -0
- package/dist/retrieval/salience-scorer.js.map +1 -0
- package/dist/retrieval/search.d.ts +21 -0
- package/dist/retrieval/search.d.ts.map +1 -0
- package/dist/retrieval/search.js +228 -0
- package/dist/retrieval/search.js.map +1 -0
- package/dist/retrieval/temporal-scorer.d.ts +18 -0
- package/dist/retrieval/temporal-scorer.d.ts.map +1 -0
- package/dist/retrieval/temporal-scorer.js +106 -0
- package/dist/retrieval/temporal-scorer.js.map +1 -0
- package/dist/retrieval/trigger-matcher.d.ts +18 -0
- package/dist/retrieval/trigger-matcher.d.ts.map +1 -0
- package/dist/retrieval/trigger-matcher.js +134 -0
- package/dist/retrieval/trigger-matcher.js.map +1 -0
- package/dist/retrieval/types.d.ts +70 -0
- package/dist/retrieval/types.d.ts.map +1 -0
- package/dist/retrieval/types.js +9 -0
- package/dist/retrieval/types.js.map +1 -0
- package/dist/retrieval/vector-search.d.ts +5 -0
- package/dist/retrieval/vector-search.d.ts.map +1 -0
- package/dist/retrieval/vector-search.js +24 -0
- package/dist/retrieval/vector-search.js.map +1 -0
- package/dist/salience/decay.d.ts +9 -0
- package/dist/salience/decay.d.ts.map +1 -0
- package/dist/salience/decay.js +15 -0
- package/dist/salience/decay.js.map +1 -0
- package/dist/salience/index.d.ts +2 -0
- package/dist/salience/index.d.ts.map +1 -0
- package/dist/salience/index.js +2 -0
- package/dist/salience/index.js.map +1 -0
- package/dist/scratchpad/index.d.ts +2 -0
- package/dist/scratchpad/index.d.ts.map +1 -0
- package/dist/scratchpad/index.js +2 -0
- package/dist/scratchpad/index.js.map +1 -0
- package/dist/scratchpad/scratchpad.d.ts +23 -0
- package/dist/scratchpad/scratchpad.d.ts.map +1 -0
- package/dist/scratchpad/scratchpad.js +107 -0
- package/dist/scratchpad/scratchpad.js.map +1 -0
- package/dist/sessions/index.d.ts +2 -0
- package/dist/sessions/index.d.ts.map +1 -0
- package/dist/sessions/index.js +2 -0
- package/dist/sessions/index.js.map +1 -0
- package/dist/sessions/manager.d.ts +11 -0
- package/dist/sessions/manager.d.ts.map +1 -0
- package/dist/sessions/manager.js +63 -0
- package/dist/sessions/manager.js.map +1 -0
- package/package.json +38 -0
- package/src/adapters/cache.d.ts +9 -0
- package/src/adapters/cache.d.ts.map +1 -0
- package/src/adapters/cache.js.map +1 -0
- package/src/adapters/cache.ts +8 -0
- package/src/adapters/embedding.d.ts +7 -0
- package/src/adapters/embedding.d.ts.map +1 -0
- package/src/adapters/embedding.js.map +1 -0
- package/src/adapters/embedding.ts +6 -0
- package/src/adapters/gemini-embedding.ts +67 -0
- package/src/adapters/index.ts +6 -0
- package/src/adapters/llm.d.ts +19 -0
- package/src/adapters/llm.d.ts.map +1 -0
- package/src/adapters/llm.js.map +1 -0
- package/src/adapters/llm.ts +16 -0
- package/src/adapters/perplexity-embedding.d.ts +24 -0
- package/src/adapters/perplexity-embedding.d.ts.map +1 -0
- package/src/adapters/perplexity-embedding.js.map +1 -0
- package/src/adapters/perplexity-embedding.ts +98 -0
- package/src/adapters/storage.d.ts +172 -0
- package/src/adapters/storage.d.ts.map +1 -0
- package/src/adapters/storage.js.map +1 -0
- package/src/adapters/storage.ts +187 -0
- package/src/auth/api-key.ts +33 -0
- package/src/auth/index.ts +1 -0
- package/src/config.d.ts +86 -0
- package/src/config.d.ts.map +1 -0
- package/src/config.js.map +1 -0
- package/src/config.ts +131 -0
- package/src/extraction/contradiction.d.ts +15 -0
- package/src/extraction/contradiction.d.ts.map +1 -0
- package/src/extraction/contradiction.js.map +1 -0
- package/src/extraction/contradiction.ts +33 -0
- package/src/extraction/dedup.d.ts +12 -0
- package/src/extraction/dedup.d.ts.map +1 -0
- package/src/extraction/dedup.js.map +1 -0
- package/src/extraction/dedup.ts +133 -0
- package/src/extraction/entity-extractor.d.ts +30 -0
- package/src/extraction/entity-extractor.d.ts.map +1 -0
- package/src/extraction/entity-extractor.js.map +1 -0
- package/src/extraction/entity-extractor.ts +193 -0
- package/src/extraction/hasher.d.ts +5 -0
- package/src/extraction/hasher.d.ts.map +1 -0
- package/src/extraction/hasher.js.map +1 -0
- package/src/extraction/hasher.ts +7 -0
- package/src/extraction/heuristic.d.ts +3 -0
- package/src/extraction/heuristic.d.ts.map +1 -0
- package/src/extraction/heuristic.js.map +1 -0
- package/src/extraction/heuristic.ts +341 -0
- package/src/extraction/index.ts +9 -0
- package/src/extraction/llm-extractor.d.ts +21 -0
- package/src/extraction/llm-extractor.d.ts.map +1 -0
- package/src/extraction/llm-extractor.js.map +1 -0
- package/src/extraction/llm-extractor.ts +267 -0
- package/src/extraction/pipeline.d.ts +27 -0
- package/src/extraction/pipeline.d.ts.map +1 -0
- package/src/extraction/pipeline.js.map +1 -0
- package/src/extraction/pipeline.ts +515 -0
- package/src/extraction/prompts.js.map +1 -0
- package/src/extraction/prompts.ts +233 -0
- package/src/extraction/sliding-window.d.ts +41 -0
- package/src/extraction/sliding-window.d.ts.map +1 -0
- package/src/extraction/sliding-window.js.map +1 -0
- package/src/extraction/sliding-window.ts +121 -0
- package/src/extraction/types.d.ts +68 -0
- package/src/extraction/types.d.ts.map +1 -0
- package/src/extraction/types.js.map +1 -0
- package/src/extraction/types.ts +80 -0
- package/src/feedback/index.ts +1 -0
- package/src/feedback/tracker.d.ts +25 -0
- package/src/feedback/tracker.d.ts.map +1 -0
- package/src/feedback/tracker.js.map +1 -0
- package/src/feedback/tracker.ts +119 -0
- package/src/index.ts +12 -0
- package/src/models/api-key.d.ts +54 -0
- package/src/models/api-key.d.ts.map +1 -0
- package/src/models/api-key.js.map +1 -0
- package/src/models/api-key.ts +26 -0
- package/src/models/edge.d.ts +78 -0
- package/src/models/edge.d.ts.map +1 -0
- package/src/models/edge.js.map +1 -0
- package/src/models/edge.ts +34 -0
- package/src/models/entity.d.ts +60 -0
- package/src/models/entity.d.ts.map +1 -0
- package/src/models/entity.js.map +1 -0
- package/src/models/entity.ts +27 -0
- package/src/models/extraction.d.ts +111 -0
- package/src/models/extraction.d.ts.map +1 -0
- package/src/models/extraction.js.map +1 -0
- package/src/models/extraction.ts +45 -0
- package/src/models/fact-entity.d.ts +33 -0
- package/src/models/fact-entity.d.ts.map +1 -0
- package/src/models/fact-entity.js.map +1 -0
- package/src/models/fact-entity.ts +19 -0
- package/src/models/fact.ts +85 -0
- package/src/models/index.d.ts +13 -0
- package/src/models/index.d.ts.map +1 -0
- package/src/models/index.js.map +1 -0
- package/src/models/index.ts +12 -0
- package/src/models/memory-access.d.ts +89 -0
- package/src/models/memory-access.d.ts.map +1 -0
- package/src/models/memory-access.js.map +1 -0
- package/src/models/memory-access.ts +41 -0
- package/src/models/session.d.ts +60 -0
- package/src/models/session.d.ts.map +1 -0
- package/src/models/session.js.map +1 -0
- package/src/models/session.ts +28 -0
- package/src/models/tenant.d.ts +214 -0
- package/src/models/tenant.d.ts.map +1 -0
- package/src/models/tenant.js.map +1 -0
- package/src/models/tenant.ts +28 -0
- package/src/models/trigger.d.ts +87 -0
- package/src/models/trigger.d.ts.map +1 -0
- package/src/models/trigger.js.map +1 -0
- package/src/models/trigger.ts +58 -0
- package/src/models/usage-record.d.ts +37 -0
- package/src/models/usage-record.d.ts.map +1 -0
- package/src/models/usage-record.js.map +1 -0
- package/src/models/usage-record.ts +16 -0
- package/src/models/webhook.d.ts +50 -0
- package/src/models/webhook.d.ts.map +1 -0
- package/src/models/webhook.js.map +1 -0
- package/src/models/webhook.ts +30 -0
- package/src/profiles/index.ts +2 -0
- package/src/profiles/profile.ts +81 -0
- package/src/retrieval/compound-search.d.ts +13 -0
- package/src/retrieval/compound-search.d.ts.map +1 -0
- package/src/retrieval/compound-search.js.map +1 -0
- package/src/retrieval/compound-search.ts +104 -0
- package/src/retrieval/contradiction-surfacer.d.ts +18 -0
- package/src/retrieval/contradiction-surfacer.d.ts.map +1 -0
- package/src/retrieval/contradiction-surfacer.js.map +1 -0
- package/src/retrieval/contradiction-surfacer.ts +87 -0
- package/src/retrieval/embedding-cache.d.ts +17 -0
- package/src/retrieval/embedding-cache.d.ts.map +1 -0
- package/src/retrieval/embedding-cache.js.map +1 -0
- package/src/retrieval/embedding-cache.ts +63 -0
- package/src/retrieval/fusion.d.ts +26 -0
- package/src/retrieval/fusion.d.ts.map +1 -0
- package/src/retrieval/fusion.js.map +1 -0
- package/src/retrieval/fusion.ts +129 -0
- package/src/retrieval/graph-traversal.d.ts +28 -0
- package/src/retrieval/graph-traversal.d.ts.map +1 -0
- package/src/retrieval/graph-traversal.js.map +1 -0
- package/src/retrieval/graph-traversal.ts +235 -0
- package/src/retrieval/index.ts +13 -0
- package/src/retrieval/keyword-search.ts +39 -0
- package/src/retrieval/query-expansion.d.ts +20 -0
- package/src/retrieval/query-expansion.d.ts.map +1 -0
- package/src/retrieval/query-expansion.js.map +1 -0
- package/src/retrieval/query-expansion.ts +86 -0
- package/src/retrieval/reranker.d.ts +15 -0
- package/src/retrieval/reranker.d.ts.map +1 -0
- package/src/retrieval/reranker.js.map +1 -0
- package/src/retrieval/reranker.ts +56 -0
- package/src/retrieval/salience-scorer.d.ts +15 -0
- package/src/retrieval/salience-scorer.d.ts.map +1 -0
- package/src/retrieval/salience-scorer.js.map +1 -0
- package/src/retrieval/salience-scorer.ts +57 -0
- package/src/retrieval/search.d.ts +21 -0
- package/src/retrieval/search.d.ts.map +1 -0
- package/src/retrieval/search.js.map +1 -0
- package/src/retrieval/search.ts +271 -0
- package/src/retrieval/temporal-scorer.ts +111 -0
- package/src/retrieval/trigger-matcher.d.ts +18 -0
- package/src/retrieval/trigger-matcher.d.ts.map +1 -0
- package/src/retrieval/trigger-matcher.js.map +1 -0
- package/src/retrieval/trigger-matcher.ts +180 -0
- package/src/retrieval/types.d.ts +66 -0
- package/src/retrieval/types.d.ts.map +1 -0
- package/src/retrieval/types.js.map +1 -0
- package/src/retrieval/types.ts +82 -0
- package/src/retrieval/vector-search.d.ts +5 -0
- package/src/retrieval/vector-search.d.ts.map +1 -0
- package/src/retrieval/vector-search.js.map +1 -0
- package/src/retrieval/vector-search.ts +38 -0
- package/src/salience/decay.d.ts +9 -0
- package/src/salience/decay.d.ts.map +1 -0
- package/src/salience/decay.js.map +1 -0
- package/src/salience/decay.ts +25 -0
- package/src/salience/index.ts +1 -0
- package/src/scratchpad/index.ts +1 -0
- package/src/scratchpad/scratchpad.d.ts +23 -0
- package/src/scratchpad/scratchpad.d.ts.map +1 -0
- package/src/scratchpad/scratchpad.js.map +1 -0
- package/src/scratchpad/scratchpad.ts +140 -0
- package/src/sessions/index.ts +1 -0
- package/src/sessions/manager.ts +87 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-cache.d.ts","sourceRoot":"","sources":["embedding-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD;;;GAGG;AACH,qBAAa,sBAAuB,YAAW,gBAAgB;IAK3D,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,UAAU;IANpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAGlB,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,YAAY,EACnB,UAAU,GAAE,MAAa;IAM7B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAUtC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;CA0BvD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-cache.js","sourceRoot":"","sources":["embedding-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { EmbeddingAdapter } from '../adapters/embedding.js';
|
|
2
|
+
import type { CacheAdapter } from '../adapters/cache.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Wraps an EmbeddingAdapter with caching.
|
|
6
|
+
* Same query text -> cached embedding (skip OpenAI call).
|
|
7
|
+
*/
|
|
8
|
+
export class CachedEmbeddingAdapter implements EmbeddingAdapter {
|
|
9
|
+
readonly model: string;
|
|
10
|
+
readonly dimensions: number;
|
|
11
|
+
|
|
12
|
+
constructor(
|
|
13
|
+
private inner: EmbeddingAdapter,
|
|
14
|
+
private cache: CacheAdapter,
|
|
15
|
+
private ttlSeconds: number = 3600, // 1 hour default
|
|
16
|
+
) {
|
|
17
|
+
this.model = inner.model;
|
|
18
|
+
this.dimensions = inner.dimensions;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async embed(text: string): Promise<number[]> {
|
|
22
|
+
const key = `emb:${this.model}:${await hashText(text)}`;
|
|
23
|
+
const cached = await this.cache.get<number[]>(key);
|
|
24
|
+
if (cached) return cached;
|
|
25
|
+
|
|
26
|
+
const result = await this.inner.embed(text);
|
|
27
|
+
await this.cache.set(key, result, this.ttlSeconds);
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async embedBatch(texts: string[]): Promise<number[][]> {
|
|
32
|
+
// For batch, check cache for each, only embed uncached ones
|
|
33
|
+
const results: (number[] | null)[] = [];
|
|
34
|
+
const uncachedIndices: number[] = [];
|
|
35
|
+
|
|
36
|
+
for (let i = 0; i < texts.length; i++) {
|
|
37
|
+
const key = `emb:${this.model}:${await hashText(texts[i]!)}`;
|
|
38
|
+
const cached = await this.cache.get<number[]>(key);
|
|
39
|
+
results.push(cached);
|
|
40
|
+
if (!cached) uncachedIndices.push(i);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (uncachedIndices.length > 0) {
|
|
44
|
+
const uncachedTexts = uncachedIndices.map(i => texts[i]!);
|
|
45
|
+
const freshEmbeddings = await this.inner.embedBatch(uncachedTexts);
|
|
46
|
+
|
|
47
|
+
for (let j = 0; j < uncachedIndices.length; j++) {
|
|
48
|
+
const idx = uncachedIndices[j]!;
|
|
49
|
+
results[idx] = freshEmbeddings[j]!;
|
|
50
|
+
const key = `emb:${this.model}:${await hashText(texts[idx]!)}`;
|
|
51
|
+
await this.cache.set(key, freshEmbeddings[j]!, this.ttlSeconds);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return results as number[][];
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async function hashText(text: string): Promise<string> {
|
|
60
|
+
const encoded = new TextEncoder().encode(text);
|
|
61
|
+
const hash = await crypto.subtle.digest('SHA-256', encoded);
|
|
62
|
+
return Array.from(new Uint8Array(hash)).map(b => b.toString(16).padStart(2, '0')).join('').slice(0, 16);
|
|
63
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Candidate, FusionWeights } from './types.js';
|
|
2
|
+
import type { Fact } from '../models/fact.js';
|
|
3
|
+
export interface FusionResult {
|
|
4
|
+
fact: Fact;
|
|
5
|
+
score: number;
|
|
6
|
+
signals: {
|
|
7
|
+
vectorScore: number;
|
|
8
|
+
keywordScore: number;
|
|
9
|
+
graphScore: number;
|
|
10
|
+
recencyScore: number;
|
|
11
|
+
salienceScore: number;
|
|
12
|
+
};
|
|
13
|
+
source: string;
|
|
14
|
+
triggeredBy?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Fuse candidates from multiple retrieval signals into a single ranked list.
|
|
18
|
+
*
|
|
19
|
+
* 1. Normalizes weights so they sum to 1.0
|
|
20
|
+
* 2. Deduplicates by fact ID, keeping the highest score per signal
|
|
21
|
+
* 3. Computes a weighted sum for each unique fact
|
|
22
|
+
* 4. Sorts by score descending
|
|
23
|
+
* 5. Returns the top `limit` results
|
|
24
|
+
*/
|
|
25
|
+
export declare function fuseAndRank(candidates: Candidate[], weights: FusionWeights, limit: number): FusionResult[];
|
|
26
|
+
//# sourceMappingURL=fusion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fusion.d.ts","sourceRoot":"","sources":["fusion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,SAAS,EAAE,EACvB,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,MAAM,GACZ,YAAY,EAAE,CA0FhB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fusion.js","sourceRoot":"","sources":["fusion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import type { Candidate, FusionWeights } from './types.js';
|
|
2
|
+
import type { Fact } from '../models/fact.js';
|
|
3
|
+
|
|
4
|
+
export interface FusionResult {
|
|
5
|
+
fact: Fact;
|
|
6
|
+
score: number;
|
|
7
|
+
signals: {
|
|
8
|
+
vectorScore: number;
|
|
9
|
+
keywordScore: number;
|
|
10
|
+
graphScore: number;
|
|
11
|
+
recencyScore: number;
|
|
12
|
+
salienceScore: number;
|
|
13
|
+
temporalScore: number;
|
|
14
|
+
};
|
|
15
|
+
source: string;
|
|
16
|
+
triggeredBy?: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Fuse candidates from multiple retrieval signals into a single ranked list.
|
|
21
|
+
*
|
|
22
|
+
* 1. Normalizes weights so they sum to 1.0
|
|
23
|
+
* 2. Deduplicates by fact ID, keeping the highest score per signal
|
|
24
|
+
* 3. Computes a weighted sum for each unique fact
|
|
25
|
+
* 4. Sorts by score descending
|
|
26
|
+
* 5. Returns the top `limit` results
|
|
27
|
+
*/
|
|
28
|
+
export function fuseAndRank(
|
|
29
|
+
candidates: Candidate[],
|
|
30
|
+
weights: FusionWeights,
|
|
31
|
+
limit: number,
|
|
32
|
+
): FusionResult[] {
|
|
33
|
+
if (candidates.length === 0) return [];
|
|
34
|
+
|
|
35
|
+
// 1. Normalize weights so they sum to 1.0
|
|
36
|
+
const sum =
|
|
37
|
+
weights.vector +
|
|
38
|
+
weights.keyword +
|
|
39
|
+
weights.graph +
|
|
40
|
+
weights.recency +
|
|
41
|
+
weights.salience +
|
|
42
|
+
weights.temporal;
|
|
43
|
+
|
|
44
|
+
const w: FusionWeights =
|
|
45
|
+
sum === 0
|
|
46
|
+
? { vector: 1/6, keyword: 1/6, graph: 1/6, recency: 1/6, salience: 1/6, temporal: 1/6 }
|
|
47
|
+
: {
|
|
48
|
+
vector: weights.vector / sum,
|
|
49
|
+
keyword: weights.keyword / sum,
|
|
50
|
+
graph: weights.graph / sum,
|
|
51
|
+
recency: weights.recency / sum,
|
|
52
|
+
salience: weights.salience / sum,
|
|
53
|
+
temporal: weights.temporal / sum,
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
// 2. Deduplicate by fact ID — keep highest score per signal
|
|
57
|
+
const factMap = new Map<
|
|
58
|
+
string,
|
|
59
|
+
{
|
|
60
|
+
fact: Fact;
|
|
61
|
+
vectorScore: number;
|
|
62
|
+
keywordScore: number;
|
|
63
|
+
graphScore: number;
|
|
64
|
+
recencyScore: number;
|
|
65
|
+
salienceScore: number;
|
|
66
|
+
temporalScore: number;
|
|
67
|
+
source: string;
|
|
68
|
+
triggeredBy?: string;
|
|
69
|
+
}
|
|
70
|
+
>();
|
|
71
|
+
|
|
72
|
+
for (const c of candidates) {
|
|
73
|
+
const existing = factMap.get(c.fact.id);
|
|
74
|
+
if (existing) {
|
|
75
|
+
existing.vectorScore = Math.max(existing.vectorScore, c.vectorScore);
|
|
76
|
+
existing.keywordScore = Math.max(existing.keywordScore, c.keywordScore);
|
|
77
|
+
existing.graphScore = Math.max(existing.graphScore, c.graphScore);
|
|
78
|
+
existing.recencyScore = Math.max(existing.recencyScore, c.recencyScore);
|
|
79
|
+
existing.salienceScore = Math.max(existing.salienceScore, c.salienceScore);
|
|
80
|
+
existing.temporalScore = Math.max(existing.temporalScore, c.temporalScore);
|
|
81
|
+
if (c.triggeredBy) existing.triggeredBy = c.triggeredBy;
|
|
82
|
+
} else {
|
|
83
|
+
factMap.set(c.fact.id, {
|
|
84
|
+
fact: c.fact,
|
|
85
|
+
vectorScore: c.vectorScore,
|
|
86
|
+
keywordScore: c.keywordScore,
|
|
87
|
+
graphScore: c.graphScore,
|
|
88
|
+
recencyScore: c.recencyScore,
|
|
89
|
+
salienceScore: c.salienceScore,
|
|
90
|
+
temporalScore: c.temporalScore,
|
|
91
|
+
source: c.source,
|
|
92
|
+
triggeredBy: c.triggeredBy,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// 3. Compute final score for each unique fact
|
|
98
|
+
const results: FusionResult[] = [];
|
|
99
|
+
for (const entry of factMap.values()) {
|
|
100
|
+
const score =
|
|
101
|
+
entry.vectorScore * w.vector +
|
|
102
|
+
entry.keywordScore * w.keyword +
|
|
103
|
+
entry.graphScore * w.graph +
|
|
104
|
+
entry.recencyScore * w.recency +
|
|
105
|
+
entry.salienceScore * w.salience +
|
|
106
|
+
entry.temporalScore * w.temporal;
|
|
107
|
+
|
|
108
|
+
results.push({
|
|
109
|
+
fact: entry.fact,
|
|
110
|
+
score,
|
|
111
|
+
signals: {
|
|
112
|
+
vectorScore: entry.vectorScore,
|
|
113
|
+
keywordScore: entry.keywordScore,
|
|
114
|
+
graphScore: entry.graphScore,
|
|
115
|
+
recencyScore: entry.recencyScore,
|
|
116
|
+
salienceScore: entry.salienceScore,
|
|
117
|
+
temporalScore: entry.temporalScore,
|
|
118
|
+
},
|
|
119
|
+
source: entry.source,
|
|
120
|
+
triggeredBy: entry.triggeredBy,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// 4. Sort by score descending
|
|
125
|
+
results.sort((a, b) => b.score - a.score);
|
|
126
|
+
|
|
127
|
+
// 5. Take top N
|
|
128
|
+
return results.slice(0, limit);
|
|
129
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { StorageAdapter } from '../adapters/storage.js';
|
|
2
|
+
import type { EmbeddingAdapter } from '../adapters/embedding.js';
|
|
3
|
+
import type { Candidate } from './types.js';
|
|
4
|
+
export interface GraphSearchConfig {
|
|
5
|
+
maxDepth: number;
|
|
6
|
+
maxEntities: number;
|
|
7
|
+
asOf?: Date;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Tokenize query into candidate entity names.
|
|
11
|
+
* Splits on whitespace, filters short words (< 3 chars), lowercases for canonical lookup.
|
|
12
|
+
*/
|
|
13
|
+
export declare function tokenizeQuery(query: string): string[];
|
|
14
|
+
/**
|
|
15
|
+
* Graph-based retrieval module.
|
|
16
|
+
*
|
|
17
|
+
* 1. Extracts potential entity names from query (simple tokenization)
|
|
18
|
+
* 2. For each token, tries to find matching entities by canonical name
|
|
19
|
+
* 3. Uses found entity IDs as seeds for graphTraversal
|
|
20
|
+
* 4. Gets facts connected to discovered entities via getFactsForEntity
|
|
21
|
+
* 5. Assigns graphScore based on hop distance: 1/(2^hop_depth)
|
|
22
|
+
* - 0-hop (seed) = 1.0
|
|
23
|
+
* - 1-hop = 0.5
|
|
24
|
+
* - 2-hop = 0.25
|
|
25
|
+
* - 3-hop = 0.125
|
|
26
|
+
*/
|
|
27
|
+
export declare function graphSearch(storage: StorageAdapter, embedding: EmbeddingAdapter, query: string, tenantId: string, _scope: string, _scopeId: string, limit: number, config?: Partial<GraphSearchConfig>): Promise<Candidate[]>;
|
|
28
|
+
//# sourceMappingURL=graph-traversal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-traversal.d.ts","sourceRoot":"","sources":["graph-traversal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AAUD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAMrD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,gBAAgB,EAC3B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAClC,OAAO,CAAC,SAAS,EAAE,CAAC,CAkKtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-traversal.js","sourceRoot":"","sources":["graph-traversal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import type { StorageAdapter } from '../adapters/storage.js';
|
|
2
|
+
import type { EmbeddingAdapter } from '../adapters/embedding.js';
|
|
3
|
+
import type { Candidate } from './types.js';
|
|
4
|
+
|
|
5
|
+
export interface GraphSearchConfig {
|
|
6
|
+
maxDepth: number; // default 3, max 5
|
|
7
|
+
maxEntities: number; // default 200
|
|
8
|
+
asOf?: Date; // point-in-time temporal filter
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const DEFAULT_MAX_DEPTH = 2;
|
|
12
|
+
const MAX_ALLOWED_DEPTH = 5;
|
|
13
|
+
const DEFAULT_MAX_ENTITIES = 200;
|
|
14
|
+
const MIN_TOKEN_LENGTH = 2;
|
|
15
|
+
|
|
16
|
+
/** Known entity types to search against for each token */
|
|
17
|
+
const ENTITY_TYPES = ['person', 'organization', 'location', 'topic', 'concept', 'product', 'event'] as const;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Tokenize query into candidate entity names.
|
|
21
|
+
* Splits on whitespace and dots, filters short words (< 2 chars), lowercases for canonical lookup.
|
|
22
|
+
* Also preserves dot-separated names as candidate names (e.g., "clean.ai" → tokens ["clean", "ai"] + candidate "clean.ai")
|
|
23
|
+
*/
|
|
24
|
+
export function tokenizeQuery(query: string): string[] {
|
|
25
|
+
return query
|
|
26
|
+
.split(/[\s.]+/)
|
|
27
|
+
.map((t) => t.replace(/[^\w-]/g, ''))
|
|
28
|
+
.filter((t) => t.length >= MIN_TOKEN_LENGTH)
|
|
29
|
+
.map((t) => t.toLowerCase());
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Graph-based retrieval module.
|
|
34
|
+
*
|
|
35
|
+
* 1. Extracts potential entity names from query (simple tokenization)
|
|
36
|
+
* 2. For each token, tries to find matching entities by canonical name
|
|
37
|
+
* 3. Uses found entity IDs as seeds for graphTraversal
|
|
38
|
+
* 4. Gets facts connected to discovered entities via getFactsForEntity
|
|
39
|
+
* 5. Assigns graphScore based on hop distance: 1/(2^hop_depth)
|
|
40
|
+
* - 0-hop (seed) = 1.0
|
|
41
|
+
* - 1-hop = 0.5
|
|
42
|
+
* - 2-hop = 0.25
|
|
43
|
+
* - 3-hop = 0.125
|
|
44
|
+
*/
|
|
45
|
+
export async function graphSearch(
|
|
46
|
+
storage: StorageAdapter,
|
|
47
|
+
embedding: EmbeddingAdapter,
|
|
48
|
+
query: string,
|
|
49
|
+
tenantId: string,
|
|
50
|
+
_scope: string,
|
|
51
|
+
_scopeId: string,
|
|
52
|
+
limit: number,
|
|
53
|
+
config?: Partial<GraphSearchConfig>,
|
|
54
|
+
): Promise<Candidate[]> {
|
|
55
|
+
const maxDepth = Math.min(config?.maxDepth ?? DEFAULT_MAX_DEPTH, MAX_ALLOWED_DEPTH);
|
|
56
|
+
const maxEntities = Math.min(config?.maxEntities ?? DEFAULT_MAX_ENTITIES, 500);
|
|
57
|
+
|
|
58
|
+
const tokens = tokenizeQuery(query);
|
|
59
|
+
if (tokens.length === 0) return [];
|
|
60
|
+
|
|
61
|
+
const seedEntityIds: string[] = [];
|
|
62
|
+
|
|
63
|
+
// Build all candidate names to search for (tokens + multi-word combos + original query forms)
|
|
64
|
+
// NOTE: We intentionally do NOT always include 'user' — it's linked to nearly every fact
|
|
65
|
+
// and floods results. The 'user' entity is only included if the query mentions "user" or "me".
|
|
66
|
+
const candidateNames: string[] = [];
|
|
67
|
+
if (/\b(user|me|my|i)\b/i.test(query)) {
|
|
68
|
+
candidateNames.push('user');
|
|
69
|
+
}
|
|
70
|
+
for (const token of tokens) {
|
|
71
|
+
if (token.length >= 2) candidateNames.push(token);
|
|
72
|
+
}
|
|
73
|
+
// Add multi-word combos from adjacent tokens
|
|
74
|
+
if (tokens.length >= 2) {
|
|
75
|
+
for (let i = 0; i < tokens.length - 1; i++) {
|
|
76
|
+
candidateNames.push(`${tokens[i]} ${tokens[i + 1]}`);
|
|
77
|
+
// Also try dot-separated form (for entities like "clean.ai")
|
|
78
|
+
candidateNames.push(`${tokens[i]}.${tokens[i + 1]}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Add the full lowercased query as a candidate (catches exact entity names)
|
|
82
|
+
const fullQuery = query.toLowerCase().trim();
|
|
83
|
+
if (fullQuery.length >= 2 && !candidateNames.includes(fullQuery)) {
|
|
84
|
+
candidateNames.push(fullQuery);
|
|
85
|
+
}
|
|
86
|
+
// Also add dot-stripped version (e.g., "clean.ai" → "clean ai")
|
|
87
|
+
const dotStripped = fullQuery.replace(/\./g, ' ').replace(/\s+/g, ' ').trim();
|
|
88
|
+
if (dotStripped !== fullQuery && !candidateNames.includes(dotStripped)) {
|
|
89
|
+
candidateNames.push(dotStripped);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// ONE query to find all matching entities instead of 78 sequential calls
|
|
93
|
+
try {
|
|
94
|
+
const { data } = await (storage as any).client
|
|
95
|
+
.from('entities')
|
|
96
|
+
.select('id, canonical_name')
|
|
97
|
+
.eq('tenant_id', tenantId)
|
|
98
|
+
.in('canonical_name', candidateNames);
|
|
99
|
+
if (data) {
|
|
100
|
+
for (const row of data as Array<{ id: string; canonical_name: string }>) {
|
|
101
|
+
if (!seedEntityIds.includes(row.id)) {
|
|
102
|
+
seedEntityIds.push(row.id);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
} catch (err) {
|
|
107
|
+
console.error('[steno-graph] Batch entity lookup failed, falling back to sequential:', err instanceof Error ? err.message : err);
|
|
108
|
+
// Fallback: sequential lookups if batch fails
|
|
109
|
+
const userEntity = await storage.findEntityByCanonicalName(tenantId, 'user', 'person');
|
|
110
|
+
if (userEntity) seedEntityIds.push(userEntity.id);
|
|
111
|
+
for (const token of tokens) {
|
|
112
|
+
for (const entityType of ENTITY_TYPES) {
|
|
113
|
+
const entity = await storage.findEntityByCanonicalName(tenantId, token, entityType);
|
|
114
|
+
if (entity && !seedEntityIds.includes(entity.id)) {
|
|
115
|
+
seedEntityIds.push(entity.id);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (seedEntityIds.length === 0) return [];
|
|
122
|
+
|
|
123
|
+
// 2. Graph traversal from seed entities
|
|
124
|
+
const traversalResult = await storage.graphTraversal({
|
|
125
|
+
tenantId,
|
|
126
|
+
entityIds: seedEntityIds,
|
|
127
|
+
maxDepth,
|
|
128
|
+
maxEntities,
|
|
129
|
+
asOf: config?.asOf,
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
if (traversalResult.entities.length === 0) return [];
|
|
133
|
+
|
|
134
|
+
// Build hop-depth map from traversal result using BFS from seed entities
|
|
135
|
+
// via the edge list returned by the traversal
|
|
136
|
+
const entityHopMap = new Map<string, number>();
|
|
137
|
+
|
|
138
|
+
// Initialize seed entities at depth 0
|
|
139
|
+
for (const entity of traversalResult.entities) {
|
|
140
|
+
if (seedEntityIds.includes(entity.id)) {
|
|
141
|
+
entityHopMap.set(entity.id, 0);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Build adjacency list from edges
|
|
146
|
+
const adjacency = new Map<string, string[]>();
|
|
147
|
+
for (const edge of traversalResult.edges) {
|
|
148
|
+
if (!adjacency.has(edge.sourceId)) adjacency.set(edge.sourceId, []);
|
|
149
|
+
if (!adjacency.has(edge.targetId)) adjacency.set(edge.targetId, []);
|
|
150
|
+
adjacency.get(edge.sourceId)!.push(edge.targetId);
|
|
151
|
+
adjacency.get(edge.targetId)!.push(edge.sourceId);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// BFS to compute min hop depth for all reachable entities
|
|
155
|
+
const queue = [...entityHopMap.keys()];
|
|
156
|
+
while (queue.length > 0) {
|
|
157
|
+
const currentId = queue.shift()!;
|
|
158
|
+
const currentDepth = entityHopMap.get(currentId)!;
|
|
159
|
+
const neighbors = adjacency.get(currentId) ?? [];
|
|
160
|
+
for (const neighborId of neighbors) {
|
|
161
|
+
if (!entityHopMap.has(neighborId)) {
|
|
162
|
+
entityHopMap.set(neighborId, currentDepth + 1);
|
|
163
|
+
queue.push(neighborId);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Any entity not reached by BFS gets maxDepth
|
|
169
|
+
for (const entity of traversalResult.entities) {
|
|
170
|
+
if (!entityHopMap.has(entity.id)) {
|
|
171
|
+
entityHopMap.set(entity.id, maxDepth);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// 3. Get facts for ALL discovered entities in ONE query via fact_entities join
|
|
176
|
+
// This replaces N sequential getFactsForEntity calls with 1 batch query.
|
|
177
|
+
const candidateMap = new Map<string, Candidate>();
|
|
178
|
+
const entityIds = traversalResult.entities.map(e => e.id);
|
|
179
|
+
|
|
180
|
+
if (entityIds.length > 0) {
|
|
181
|
+
const PER_ENTITY_LIMIT = Math.max(3, Math.ceil(limit / Math.max(entityIds.length, 1)));
|
|
182
|
+
|
|
183
|
+
// Single query: get all facts linked to any of these entities
|
|
184
|
+
try {
|
|
185
|
+
const batchResult = await storage.getFactsForEntities(
|
|
186
|
+
tenantId, entityIds, PER_ENTITY_LIMIT
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
for (const { entityId, fact } of batchResult) {
|
|
190
|
+
const hopDepth = entityHopMap.get(entityId) ?? maxDepth;
|
|
191
|
+
const graphScore = 1 / Math.pow(2, hopDepth);
|
|
192
|
+
const existing = candidateMap.get(fact.id);
|
|
193
|
+
if (existing) {
|
|
194
|
+
if (graphScore > existing.graphScore) {
|
|
195
|
+
existing.graphScore = graphScore;
|
|
196
|
+
}
|
|
197
|
+
} else {
|
|
198
|
+
candidateMap.set(fact.id, {
|
|
199
|
+
fact,
|
|
200
|
+
vectorScore: 0,
|
|
201
|
+
keywordScore: 0,
|
|
202
|
+
graphScore,
|
|
203
|
+
recencyScore: 0,
|
|
204
|
+
salienceScore: 0,
|
|
205
|
+
temporalScore: 0,
|
|
206
|
+
source: 'graph' as const,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
} catch (err) {
|
|
211
|
+
console.error('[steno-graph] Batch getFactsForEntities failed, falling back to sequential:', err instanceof Error ? err.message : err);
|
|
212
|
+
// Fallback to sequential if batch not supported
|
|
213
|
+
for (const entity of traversalResult.entities) {
|
|
214
|
+
const hopDepth = entityHopMap.get(entity.id) ?? maxDepth;
|
|
215
|
+
const graphScore = 1 / Math.pow(2, hopDepth);
|
|
216
|
+
try {
|
|
217
|
+
const factsResult = await storage.getFactsForEntity(tenantId, entity.id, { limit: 3 });
|
|
218
|
+
for (const fact of factsResult.data) {
|
|
219
|
+
if (!candidateMap.has(fact.id)) {
|
|
220
|
+
candidateMap.set(fact.id, {
|
|
221
|
+
fact, vectorScore: 0, keywordScore: 0, graphScore,
|
|
222
|
+
recencyScore: 0, salienceScore: 0, temporalScore: 0, source: 'graph' as const,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
} catch (err) { console.error('[steno-graph] getFactsForEntity failed for entity:', entity.id, err instanceof Error ? err.message : err); }
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// 4. Return candidates, sorted by graphScore descending, limited
|
|
232
|
+
return Array.from(candidateMap.values())
|
|
233
|
+
.sort((a, b) => b.graphScore - a.graphScore)
|
|
234
|
+
.slice(0, limit);
|
|
235
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export * from './types.js';
|
|
2
|
+
export * from './vector-search.js';
|
|
3
|
+
export { keywordSearch } from './keyword-search.js';
|
|
4
|
+
export { graphSearch, tokenizeQuery } from './graph-traversal.js';
|
|
5
|
+
export type { GraphSearchConfig } from './graph-traversal.js';
|
|
6
|
+
export { matchTriggers, evaluateCondition, cosineSimilarity } from './trigger-matcher.js';
|
|
7
|
+
export { scoreSalience, type SalienceConfig } from './salience-scorer.js';
|
|
8
|
+
export { fuseAndRank, type FusionResult } from './fusion.js';
|
|
9
|
+
export { surfaceContradictions, buildTimeline } from './contradiction-surfacer.js';
|
|
10
|
+
export { search, type SearchConfig } from './search.js';
|
|
11
|
+
export { rerank } from './reranker.js';
|
|
12
|
+
export { compoundSearchSignal } from './compound-search.js';
|
|
13
|
+
export { CachedEmbeddingAdapter } from './embedding-cache.js';
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { StorageAdapter } from '../adapters/storage.js';
|
|
2
|
+
import type { Candidate } from './types.js';
|
|
3
|
+
|
|
4
|
+
export async function keywordSearch(
|
|
5
|
+
storage: StorageAdapter,
|
|
6
|
+
query: string,
|
|
7
|
+
tenantId: string,
|
|
8
|
+
scope: string,
|
|
9
|
+
scopeId: string,
|
|
10
|
+
limit: number,
|
|
11
|
+
asOf?: Date,
|
|
12
|
+
): Promise<Candidate[]> {
|
|
13
|
+
const results = await storage.keywordSearch({
|
|
14
|
+
query,
|
|
15
|
+
tenantId,
|
|
16
|
+
scope,
|
|
17
|
+
scopeId,
|
|
18
|
+
limit,
|
|
19
|
+
validOnly: true,
|
|
20
|
+
asOf,
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
if (results.length === 0) return [];
|
|
24
|
+
|
|
25
|
+
// Normalize rank scores to [0, 1] range.
|
|
26
|
+
// ts_rank returns arbitrary positive values; normalize by dividing by max.
|
|
27
|
+
const maxRank = Math.max(...results.map((r) => r.rankScore));
|
|
28
|
+
|
|
29
|
+
return results.map((r) => ({
|
|
30
|
+
fact: r.fact,
|
|
31
|
+
vectorScore: 0,
|
|
32
|
+
keywordScore: maxRank > 0 ? r.rankScore / maxRank : 0,
|
|
33
|
+
graphScore: 0,
|
|
34
|
+
recencyScore: 0,
|
|
35
|
+
salienceScore: 0,
|
|
36
|
+
temporalScore: 0,
|
|
37
|
+
source: 'keyword' as const,
|
|
38
|
+
}));
|
|
39
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { LLMAdapter } from '../adapters/llm.js';
|
|
2
|
+
/**
|
|
3
|
+
* Multi-query expansion — like Hydra DB's Adaptive Query Expansion.
|
|
4
|
+
*
|
|
5
|
+
* Takes a single query and generates 3-4 semantically diverse reformulations.
|
|
6
|
+
* Each captures a different interpretation of the user's intent:
|
|
7
|
+
* - Paraphrases
|
|
8
|
+
* - Temporal concretizations ("last week" → "projects from March 18-25")
|
|
9
|
+
* - Domain-specific restatements
|
|
10
|
+
*
|
|
11
|
+
* All expanded queries are searched in parallel for higher recall.
|
|
12
|
+
*/
|
|
13
|
+
export declare function expandQuery(llm: LLMAdapter, query: string): Promise<string[]>;
|
|
14
|
+
/**
|
|
15
|
+
* Fast heuristic expansion — no LLM needed.
|
|
16
|
+
* Generates simple reformulations using string manipulation.
|
|
17
|
+
* Use this when you don't have an LLM available or want zero latency.
|
|
18
|
+
*/
|
|
19
|
+
export declare function expandQueryHeuristic(query: string): string[];
|
|
20
|
+
//# sourceMappingURL=query-expansion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-expansion.d.ts","sourceRoot":"","sources":["query-expansion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CAoCnB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CA0B5D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-expansion.js","sourceRoot":"","sources":["query-expansion.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,GAAe,EACf,KAAa;IAEb,2DAA2D;IAC3D,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtD,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC;YAClC;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE;;;;;;;sEAOqD;aAC/D;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,KAAK;aACf;SACF,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC;QAEjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YACtC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;YACjF,CAAC,CAAC,EAAE,CAAC;QAEP,0CAA0C;QAC1C,OAAO,CAAC,KAAK,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,kDAAkD;QAClD,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;IACxB,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAElC,2CAA2C;IAC3C,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,+BAA+B;IAC/B,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,kCAAkC;IAClC,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACrH,MAAM,SAAS,GAAG,KAAK;aACpB,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC;aACvC,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC;aACtC,OAAO,CAAC,oCAAoC,EAAE,EAAE,CAAC;aACjD,OAAO,CAAC,+BAA+B,EAAE,EAAE,CAAC;aAC5C,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACtB,IAAI,SAAS,KAAK,KAAK;YAAE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7B,CAAC"}
|