@steno-ai/engine 0.1.15 → 0.1.17

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.
Files changed (255) hide show
  1. package/dist/adapters/storage.d.ts +29 -2
  2. package/dist/adapters/storage.d.ts.map +1 -1
  3. package/dist/config.d.ts +3 -3
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +9 -0
  6. package/dist/config.js.map +1 -1
  7. package/dist/extraction/index.d.ts +2 -0
  8. package/dist/extraction/index.d.ts.map +1 -1
  9. package/dist/extraction/index.js +2 -0
  10. package/dist/extraction/index.js.map +1 -1
  11. package/dist/extraction/pipeline.d.ts.map +1 -1
  12. package/dist/extraction/pipeline.js +48 -1
  13. package/dist/extraction/pipeline.js.map +1 -1
  14. package/dist/extraction/structured-cross-linker.d.ts +55 -0
  15. package/dist/extraction/structured-cross-linker.d.ts.map +1 -0
  16. package/dist/extraction/structured-cross-linker.js +195 -0
  17. package/dist/extraction/structured-cross-linker.js.map +1 -0
  18. package/dist/extraction/structured-extractor.d.ts +59 -0
  19. package/dist/extraction/structured-extractor.d.ts.map +1 -0
  20. package/dist/extraction/structured-extractor.js +389 -0
  21. package/dist/extraction/structured-extractor.js.map +1 -0
  22. package/dist/extraction/types.d.ts +3 -1
  23. package/dist/extraction/types.d.ts.map +1 -1
  24. package/dist/identity/index.d.ts +2 -0
  25. package/dist/identity/index.d.ts.map +1 -0
  26. package/dist/identity/index.js +2 -0
  27. package/dist/identity/index.js.map +1 -0
  28. package/dist/identity/resolver.d.ts +31 -0
  29. package/dist/identity/resolver.d.ts.map +1 -0
  30. package/dist/identity/resolver.js +122 -0
  31. package/dist/identity/resolver.js.map +1 -0
  32. package/dist/index.d.ts +1 -0
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +1 -0
  35. package/dist/index.js.map +1 -1
  36. package/dist/models/edge.d.ts +6 -6
  37. package/dist/models/entity.d.ts +32 -0
  38. package/dist/models/entity.d.ts.map +1 -1
  39. package/dist/models/entity.js +11 -0
  40. package/dist/models/entity.js.map +1 -1
  41. package/dist/models/extraction.d.ts +6 -6
  42. package/dist/models/fact.d.ts +6 -6
  43. package/dist/retrieval/graph-traversal.d.ts +4 -1
  44. package/dist/retrieval/graph-traversal.d.ts.map +1 -1
  45. package/dist/retrieval/graph-traversal.js +6 -3
  46. package/dist/retrieval/graph-traversal.js.map +1 -1
  47. package/dist/retrieval/search.d.ts.map +1 -1
  48. package/dist/retrieval/search.js +56 -3
  49. package/dist/retrieval/search.js.map +1 -1
  50. package/dist/retrieval/types.d.ts +1 -0
  51. package/dist/retrieval/types.d.ts.map +1 -1
  52. package/dist/retrieval/types.js.map +1 -1
  53. package/package.json +1 -1
  54. package/src/adapters/storage.ts +35 -2
  55. package/src/config.ts +9 -0
  56. package/src/extraction/index.ts +2 -0
  57. package/src/extraction/pipeline.ts +63 -1
  58. package/src/extraction/structured-cross-linker.ts +259 -0
  59. package/src/extraction/structured-extractor.ts +463 -0
  60. package/src/extraction/types.ts +3 -1
  61. package/src/identity/index.ts +1 -0
  62. package/src/identity/resolver.ts +149 -0
  63. package/src/index.ts +1 -0
  64. package/src/models/entity.ts +13 -0
  65. package/src/retrieval/graph-traversal.ts +7 -4
  66. package/src/retrieval/search.ts +58 -3
  67. package/src/retrieval/types.ts +1 -0
  68. package/src/adapters/cache.d.ts +0 -9
  69. package/src/adapters/cache.d.ts.map +0 -1
  70. package/src/adapters/cache.js +0 -2
  71. package/src/adapters/cache.js.map +0 -1
  72. package/src/adapters/embedding.d.ts +0 -7
  73. package/src/adapters/embedding.d.ts.map +0 -1
  74. package/src/adapters/embedding.js +0 -2
  75. package/src/adapters/embedding.js.map +0 -1
  76. package/src/adapters/llm.d.ts +0 -19
  77. package/src/adapters/llm.d.ts.map +0 -1
  78. package/src/adapters/llm.js +0 -2
  79. package/src/adapters/llm.js.map +0 -1
  80. package/src/adapters/perplexity-embedding.d.ts +0 -24
  81. package/src/adapters/perplexity-embedding.d.ts.map +0 -1
  82. package/src/adapters/perplexity-embedding.js +0 -78
  83. package/src/adapters/perplexity-embedding.js.map +0 -1
  84. package/src/adapters/storage.d.ts +0 -173
  85. package/src/adapters/storage.d.ts.map +0 -1
  86. package/src/adapters/storage.js +0 -2
  87. package/src/adapters/storage.js.map +0 -1
  88. package/src/config.d.ts +0 -296
  89. package/src/config.d.ts.map +0 -1
  90. package/src/config.js +0 -92
  91. package/src/config.js.map +0 -1
  92. package/src/extraction/contradiction.d.ts +0 -15
  93. package/src/extraction/contradiction.d.ts.map +0 -1
  94. package/src/extraction/contradiction.js +0 -23
  95. package/src/extraction/contradiction.js.map +0 -1
  96. package/src/extraction/cross-linker.d.ts +0 -23
  97. package/src/extraction/cross-linker.d.ts.map +0 -1
  98. package/src/extraction/cross-linker.js +0 -146
  99. package/src/extraction/cross-linker.js.map +0 -1
  100. package/src/extraction/dedup.d.ts +0 -12
  101. package/src/extraction/dedup.d.ts.map +0 -1
  102. package/src/extraction/dedup.js +0 -93
  103. package/src/extraction/dedup.js.map +0 -1
  104. package/src/extraction/entity-extractor.d.ts +0 -30
  105. package/src/extraction/entity-extractor.d.ts.map +0 -1
  106. package/src/extraction/entity-extractor.js +0 -145
  107. package/src/extraction/entity-extractor.js.map +0 -1
  108. package/src/extraction/hasher.d.ts +0 -5
  109. package/src/extraction/hasher.d.ts.map +0 -1
  110. package/src/extraction/hasher.js +0 -8
  111. package/src/extraction/hasher.js.map +0 -1
  112. package/src/extraction/heuristic.d.ts +0 -3
  113. package/src/extraction/heuristic.d.ts.map +0 -1
  114. package/src/extraction/heuristic.js +0 -282
  115. package/src/extraction/heuristic.js.map +0 -1
  116. package/src/extraction/llm-extractor.d.ts +0 -23
  117. package/src/extraction/llm-extractor.d.ts.map +0 -1
  118. package/src/extraction/llm-extractor.js +0 -240
  119. package/src/extraction/llm-extractor.js.map +0 -1
  120. package/src/extraction/pipeline.d.ts +0 -30
  121. package/src/extraction/pipeline.d.ts.map +0 -1
  122. package/src/extraction/pipeline.js +0 -413
  123. package/src/extraction/pipeline.js.map +0 -1
  124. package/src/extraction/prompts.d.ts +0 -28
  125. package/src/extraction/prompts.d.ts.map +0 -1
  126. package/src/extraction/prompts.js +0 -205
  127. package/src/extraction/prompts.js.map +0 -1
  128. package/src/extraction/sliding-window.d.ts +0 -41
  129. package/src/extraction/sliding-window.d.ts.map +0 -1
  130. package/src/extraction/sliding-window.js +0 -84
  131. package/src/extraction/sliding-window.js.map +0 -1
  132. package/src/extraction/types.d.ts +0 -80
  133. package/src/extraction/types.d.ts.map +0 -1
  134. package/src/extraction/types.js +0 -2
  135. package/src/extraction/types.js.map +0 -1
  136. package/src/feedback/tracker.d.ts +0 -25
  137. package/src/feedback/tracker.d.ts.map +0 -1
  138. package/src/feedback/tracker.js +0 -90
  139. package/src/feedback/tracker.js.map +0 -1
  140. package/src/models/api-key.d.ts +0 -54
  141. package/src/models/api-key.d.ts.map +0 -1
  142. package/src/models/api-key.js +0 -21
  143. package/src/models/api-key.js.map +0 -1
  144. package/src/models/edge.d.ts +0 -78
  145. package/src/models/edge.d.ts.map +0 -1
  146. package/src/models/edge.js +0 -29
  147. package/src/models/edge.js.map +0 -1
  148. package/src/models/entity.d.ts +0 -60
  149. package/src/models/entity.d.ts.map +0 -1
  150. package/src/models/entity.js +0 -22
  151. package/src/models/entity.js.map +0 -1
  152. package/src/models/extraction.d.ts +0 -111
  153. package/src/models/extraction.d.ts.map +0 -1
  154. package/src/models/extraction.js +0 -40
  155. package/src/models/extraction.js.map +0 -1
  156. package/src/models/fact-entity.d.ts +0 -33
  157. package/src/models/fact-entity.d.ts.map +0 -1
  158. package/src/models/fact-entity.js +0 -14
  159. package/src/models/fact-entity.js.map +0 -1
  160. package/src/models/fact.d.ts +0 -191
  161. package/src/models/fact.d.ts.map +0 -1
  162. package/src/models/fact.js +0 -72
  163. package/src/models/fact.js.map +0 -1
  164. package/src/models/index.d.ts +0 -13
  165. package/src/models/index.d.ts.map +0 -1
  166. package/src/models/index.js +0 -13
  167. package/src/models/index.js.map +0 -1
  168. package/src/models/memory-access.d.ts +0 -89
  169. package/src/models/memory-access.d.ts.map +0 -1
  170. package/src/models/memory-access.js +0 -33
  171. package/src/models/memory-access.js.map +0 -1
  172. package/src/models/session.d.ts +0 -60
  173. package/src/models/session.d.ts.map +0 -1
  174. package/src/models/session.js +0 -23
  175. package/src/models/session.js.map +0 -1
  176. package/src/models/tenant.d.ts +0 -448
  177. package/src/models/tenant.d.ts.map +0 -1
  178. package/src/models/tenant.js +0 -23
  179. package/src/models/tenant.js.map +0 -1
  180. package/src/models/trigger.d.ts +0 -87
  181. package/src/models/trigger.d.ts.map +0 -1
  182. package/src/models/trigger.js +0 -41
  183. package/src/models/trigger.js.map +0 -1
  184. package/src/models/usage-record.d.ts +0 -37
  185. package/src/models/usage-record.d.ts.map +0 -1
  186. package/src/models/usage-record.js +0 -14
  187. package/src/models/usage-record.js.map +0 -1
  188. package/src/models/webhook.d.ts +0 -50
  189. package/src/models/webhook.d.ts.map +0 -1
  190. package/src/models/webhook.js +0 -25
  191. package/src/models/webhook.js.map +0 -1
  192. package/src/retrieval/compound-search.d.ts +0 -13
  193. package/src/retrieval/compound-search.d.ts.map +0 -1
  194. package/src/retrieval/compound-search.js +0 -87
  195. package/src/retrieval/compound-search.js.map +0 -1
  196. package/src/retrieval/contradiction-surfacer.d.ts +0 -18
  197. package/src/retrieval/contradiction-surfacer.d.ts.map +0 -1
  198. package/src/retrieval/contradiction-surfacer.js +0 -64
  199. package/src/retrieval/contradiction-surfacer.js.map +0 -1
  200. package/src/retrieval/embedding-cache.d.ts +0 -17
  201. package/src/retrieval/embedding-cache.d.ts.map +0 -1
  202. package/src/retrieval/embedding-cache.js +0 -56
  203. package/src/retrieval/embedding-cache.js.map +0 -1
  204. package/src/retrieval/fusion.d.ts +0 -27
  205. package/src/retrieval/fusion.d.ts.map +0 -1
  206. package/src/retrieval/fusion.js +0 -87
  207. package/src/retrieval/fusion.js.map +0 -1
  208. package/src/retrieval/graph-traversal.d.ts +0 -29
  209. package/src/retrieval/graph-traversal.d.ts.map +0 -1
  210. package/src/retrieval/graph-traversal.js +0 -208
  211. package/src/retrieval/graph-traversal.js.map +0 -1
  212. package/src/retrieval/query-expansion.d.ts +0 -20
  213. package/src/retrieval/query-expansion.d.ts.map +0 -1
  214. package/src/retrieval/query-expansion.js +0 -76
  215. package/src/retrieval/query-expansion.js.map +0 -1
  216. package/src/retrieval/reranker.d.ts +0 -15
  217. package/src/retrieval/reranker.d.ts.map +0 -1
  218. package/src/retrieval/reranker.js +0 -47
  219. package/src/retrieval/reranker.js.map +0 -1
  220. package/src/retrieval/salience-scorer.d.ts +0 -15
  221. package/src/retrieval/salience-scorer.d.ts.map +0 -1
  222. package/src/retrieval/salience-scorer.js +0 -41
  223. package/src/retrieval/salience-scorer.js.map +0 -1
  224. package/src/retrieval/search.d.ts +0 -21
  225. package/src/retrieval/search.d.ts.map +0 -1
  226. package/src/retrieval/search.js +0 -228
  227. package/src/retrieval/search.js.map +0 -1
  228. package/src/retrieval/temporal-scorer.d.ts +0 -18
  229. package/src/retrieval/temporal-scorer.d.ts.map +0 -1
  230. package/src/retrieval/temporal-scorer.js +0 -106
  231. package/src/retrieval/temporal-scorer.js.map +0 -1
  232. package/src/retrieval/trigger-matcher.d.ts +0 -18
  233. package/src/retrieval/trigger-matcher.d.ts.map +0 -1
  234. package/src/retrieval/trigger-matcher.js +0 -134
  235. package/src/retrieval/trigger-matcher.js.map +0 -1
  236. package/src/retrieval/types.d.ts +0 -70
  237. package/src/retrieval/types.d.ts.map +0 -1
  238. package/src/retrieval/types.js +0 -9
  239. package/src/retrieval/types.js.map +0 -1
  240. package/src/retrieval/vector-search.d.ts +0 -5
  241. package/src/retrieval/vector-search.d.ts.map +0 -1
  242. package/src/retrieval/vector-search.js +0 -24
  243. package/src/retrieval/vector-search.js.map +0 -1
  244. package/src/salience/decay.d.ts +0 -9
  245. package/src/salience/decay.d.ts.map +0 -1
  246. package/src/salience/decay.js +0 -15
  247. package/src/salience/decay.js.map +0 -1
  248. package/src/scratchpad/scratchpad.d.ts +0 -23
  249. package/src/scratchpad/scratchpad.d.ts.map +0 -1
  250. package/src/scratchpad/scratchpad.js +0 -137
  251. package/src/scratchpad/scratchpad.js.map +0 -1
  252. package/src/sessions/manager.d.ts +0 -11
  253. package/src/sessions/manager.d.ts.map +0 -1
  254. package/src/sessions/manager.js +0 -63
  255. package/src/sessions/manager.js.map +0 -1
@@ -1,208 +0,0 @@
1
- const DEFAULT_MAX_DEPTH = 2;
2
- const MAX_ALLOWED_DEPTH = 5;
3
- const DEFAULT_MAX_ENTITIES = 200;
4
- const MIN_TOKEN_LENGTH = 2;
5
- /** Known entity types to search against for each token */
6
- const ENTITY_TYPES = ['person', 'organization', 'location', 'topic', 'concept', 'product', 'event'];
7
- /**
8
- * Tokenize query into candidate entity names.
9
- * Splits on whitespace and dots, filters short words (< 2 chars), lowercases for canonical lookup.
10
- * Also preserves dot-separated names as candidate names (e.g., "clean.ai" → tokens ["clean", "ai"] + candidate "clean.ai")
11
- */
12
- export function tokenizeQuery(query) {
13
- return query
14
- .split(/[\s.]+/)
15
- .map((t) => t.replace(/[^\w-]/g, ''))
16
- .filter((t) => t.length >= MIN_TOKEN_LENGTH)
17
- .map((t) => t.toLowerCase());
18
- }
19
- /**
20
- * Graph-based retrieval module.
21
- *
22
- * 1. Extracts potential entity names from query (simple tokenization)
23
- * 2. For each token, tries to find matching entities by canonical name
24
- * 3. Uses found entity IDs as seeds for graphTraversal
25
- * 4. Gets facts connected to discovered entities via getFactsForEntity
26
- * 5. Assigns graphScore based on hop distance: 1/(2^hop_depth)
27
- * - 0-hop (seed) = 1.0
28
- * - 1-hop = 0.5
29
- * - 2-hop = 0.25
30
- * - 3-hop = 0.125
31
- */
32
- export async function graphSearch(storage, embedding, query, tenantId, _scope, _scopeId, limit, config) {
33
- const maxDepth = Math.min(config?.maxDepth ?? DEFAULT_MAX_DEPTH, MAX_ALLOWED_DEPTH);
34
- const maxEntities = Math.min(config?.maxEntities ?? DEFAULT_MAX_ENTITIES, 500);
35
- const tokens = tokenizeQuery(query);
36
- if (tokens.length === 0)
37
- return [];
38
- const seedEntityIds = [];
39
- // Build all candidate names to search for (tokens + multi-word combos + original query forms)
40
- // NOTE: We intentionally do NOT always include 'user' — it's linked to nearly every fact
41
- // and floods results. The 'user' entity is only included if the query mentions "user" or "me".
42
- const candidateNames = [];
43
- if (/\b(user|me|my|i)\b/i.test(query)) {
44
- candidateNames.push('user');
45
- }
46
- for (const token of tokens) {
47
- if (token.length >= 2)
48
- candidateNames.push(token);
49
- }
50
- // Add multi-word combos from adjacent tokens
51
- if (tokens.length >= 2) {
52
- for (let i = 0; i < tokens.length - 1; i++) {
53
- candidateNames.push(`${tokens[i]} ${tokens[i + 1]}`);
54
- // Also try dot-separated form (for entities like "clean.ai")
55
- candidateNames.push(`${tokens[i]}.${tokens[i + 1]}`);
56
- }
57
- }
58
- // Add the full lowercased query as a candidate (catches exact entity names)
59
- const fullQuery = query.toLowerCase().trim();
60
- if (fullQuery.length >= 2 && !candidateNames.includes(fullQuery)) {
61
- candidateNames.push(fullQuery);
62
- }
63
- // Also add dot-stripped version (e.g., "clean.ai" → "clean ai")
64
- const dotStripped = fullQuery.replace(/\./g, ' ').replace(/\s+/g, ' ').trim();
65
- if (dotStripped !== fullQuery && !candidateNames.includes(dotStripped)) {
66
- candidateNames.push(dotStripped);
67
- }
68
- // ONE query to find all matching entities instead of 78 sequential calls
69
- try {
70
- const { data } = await storage.client
71
- .from('entities')
72
- .select('id, canonical_name')
73
- .eq('tenant_id', tenantId)
74
- .in('canonical_name', candidateNames);
75
- if (data) {
76
- for (const row of data) {
77
- if (!seedEntityIds.includes(row.id)) {
78
- seedEntityIds.push(row.id);
79
- }
80
- }
81
- }
82
- }
83
- catch (err) {
84
- console.error('[steno-graph] Batch entity lookup failed, falling back to sequential:', err instanceof Error ? err.message : err);
85
- // Fallback: sequential lookups if batch fails
86
- const userEntity = await storage.findEntityByCanonicalName(tenantId, 'user', 'person');
87
- if (userEntity)
88
- seedEntityIds.push(userEntity.id);
89
- for (const token of tokens) {
90
- for (const entityType of ENTITY_TYPES) {
91
- const entity = await storage.findEntityByCanonicalName(tenantId, token, entityType);
92
- if (entity && !seedEntityIds.includes(entity.id)) {
93
- seedEntityIds.push(entity.id);
94
- }
95
- }
96
- }
97
- }
98
- if (seedEntityIds.length === 0)
99
- return [];
100
- // 2. Graph traversal from seed entities
101
- const traversalResult = await storage.graphTraversal({
102
- tenantId,
103
- entityIds: seedEntityIds,
104
- maxDepth,
105
- maxEntities,
106
- asOf: config?.asOf,
107
- });
108
- if (traversalResult.entities.length === 0)
109
- return [];
110
- // Build hop-depth map from traversal result using BFS from seed entities
111
- // via the edge list returned by the traversal
112
- const entityHopMap = new Map();
113
- // Initialize seed entities at depth 0
114
- for (const entity of traversalResult.entities) {
115
- if (seedEntityIds.includes(entity.id)) {
116
- entityHopMap.set(entity.id, 0);
117
- }
118
- }
119
- // Build adjacency list from edges
120
- const adjacency = new Map();
121
- for (const edge of traversalResult.edges) {
122
- if (!adjacency.has(edge.sourceId))
123
- adjacency.set(edge.sourceId, []);
124
- if (!adjacency.has(edge.targetId))
125
- adjacency.set(edge.targetId, []);
126
- adjacency.get(edge.sourceId).push(edge.targetId);
127
- adjacency.get(edge.targetId).push(edge.sourceId);
128
- }
129
- // BFS to compute min hop depth for all reachable entities
130
- const queue = [...entityHopMap.keys()];
131
- while (queue.length > 0) {
132
- const currentId = queue.shift();
133
- const currentDepth = entityHopMap.get(currentId);
134
- const neighbors = adjacency.get(currentId) ?? [];
135
- for (const neighborId of neighbors) {
136
- if (!entityHopMap.has(neighborId)) {
137
- entityHopMap.set(neighborId, currentDepth + 1);
138
- queue.push(neighborId);
139
- }
140
- }
141
- }
142
- // Any entity not reached by BFS gets maxDepth
143
- for (const entity of traversalResult.entities) {
144
- if (!entityHopMap.has(entity.id)) {
145
- entityHopMap.set(entity.id, maxDepth);
146
- }
147
- }
148
- // 3. Get facts for ALL discovered entities in ONE query via fact_entities join
149
- // This replaces N sequential getFactsForEntity calls with 1 batch query.
150
- const candidateMap = new Map();
151
- const entityIds = traversalResult.entities.map(e => e.id);
152
- if (entityIds.length > 0) {
153
- const PER_ENTITY_LIMIT = Math.max(3, Math.ceil(limit / Math.max(entityIds.length, 1)));
154
- // Single query: get all facts linked to any of these entities
155
- try {
156
- const batchResult = await storage.getFactsForEntities(tenantId, entityIds, PER_ENTITY_LIMIT);
157
- for (const { entityId, fact } of batchResult) {
158
- const hopDepth = entityHopMap.get(entityId) ?? maxDepth;
159
- const graphScore = 1 / Math.pow(2, hopDepth);
160
- const existing = candidateMap.get(fact.id);
161
- if (existing) {
162
- if (graphScore > existing.graphScore) {
163
- existing.graphScore = graphScore;
164
- }
165
- }
166
- else {
167
- candidateMap.set(fact.id, {
168
- fact,
169
- vectorScore: 0,
170
- keywordScore: 0,
171
- graphScore,
172
- recencyScore: 0,
173
- salienceScore: 0,
174
- temporalScore: 0,
175
- source: 'graph',
176
- });
177
- }
178
- }
179
- }
180
- catch (err) {
181
- console.error('[steno-graph] Batch getFactsForEntities failed, falling back to sequential:', err instanceof Error ? err.message : err);
182
- // Fallback to sequential if batch not supported
183
- for (const entity of traversalResult.entities) {
184
- const hopDepth = entityHopMap.get(entity.id) ?? maxDepth;
185
- const graphScore = 1 / Math.pow(2, hopDepth);
186
- try {
187
- const factsResult = await storage.getFactsForEntity(tenantId, entity.id, { limit: 3 });
188
- for (const fact of factsResult.data) {
189
- if (!candidateMap.has(fact.id)) {
190
- candidateMap.set(fact.id, {
191
- fact, vectorScore: 0, keywordScore: 0, graphScore,
192
- recencyScore: 0, salienceScore: 0, temporalScore: 0, source: 'graph',
193
- });
194
- }
195
- }
196
- }
197
- catch (err) {
198
- console.error('[steno-graph] getFactsForEntity failed for entity:', entity.id, err instanceof Error ? err.message : err);
199
- }
200
- }
201
- }
202
- }
203
- // 4. Return candidates, sorted by graphScore descending, limited
204
- return Array.from(candidateMap.values())
205
- .sort((a, b) => b.graphScore - a.graphScore)
206
- .slice(0, limit);
207
- }
208
- //# sourceMappingURL=graph-traversal.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"graph-traversal.js","sourceRoot":"","sources":["graph-traversal.ts"],"names":[],"mappings":"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"}
@@ -1,20 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,76 +0,0 @@
1
- /**
2
- * Multi-query expansion — like Hydra DB's Adaptive Query Expansion.
3
- *
4
- * Takes a single query and generates 3-4 semantically diverse reformulations.
5
- * Each captures a different interpretation of the user's intent:
6
- * - Paraphrases
7
- * - Temporal concretizations ("last week" → "projects from March 18-25")
8
- * - Domain-specific restatements
9
- *
10
- * All expanded queries are searched in parallel for higher recall.
11
- */
12
- export async function expandQuery(llm, query) {
13
- // Short queries or very specific ones don't need expansion
14
- if (query.length < 15 || query.split(' ').length <= 3) {
15
- return [query];
16
- }
17
- try {
18
- const response = await llm.complete([
19
- {
20
- role: 'system',
21
- content: `You generate search query expansions for a memory retrieval system. Given a user query, produce 3 alternative phrasings that capture different aspects of the intent.
22
-
23
- Rules:
24
- - Each alternative should use different keywords/phrasing
25
- - Include temporal concretizations if relevant ("recently" → "in the past week")
26
- - Include domain-specific restatements
27
- - Keep each alternative concise (under 15 words)
28
- - Return ONLY a JSON array of strings: ["query1", "query2", "query3"]`,
29
- },
30
- {
31
- role: 'user',
32
- content: query,
33
- },
34
- ], { temperature: 0.3, responseFormat: 'json' });
35
- const parsed = JSON.parse(response.content);
36
- const expansions = Array.isArray(parsed)
37
- ? parsed.filter((q) => typeof q === 'string' && q.trim().length > 0)
38
- : [];
39
- // Always include the original query first
40
- return [query, ...expansions.slice(0, 3)];
41
- }
42
- catch {
43
- // If expansion fails, just use the original query
44
- return [query];
45
- }
46
- }
47
- /**
48
- * Fast heuristic expansion — no LLM needed.
49
- * Generates simple reformulations using string manipulation.
50
- * Use this when you don't have an LLM available or want zero latency.
51
- */
52
- export function expandQueryHeuristic(query) {
53
- const queries = [query];
54
- const lower = query.toLowerCase();
55
- // Add "User" prefix version if not present
56
- if (!lower.startsWith('user') && !lower.includes('my ') && !lower.includes('i ')) {
57
- queries.push(`User ${lower}`);
58
- }
59
- // Convert "my X" to "user's X"
60
- if (lower.includes('my ')) {
61
- queries.push(lower.replace(/\bmy\b/g, "user's"));
62
- }
63
- // Convert questions to statements
64
- if (lower.startsWith('what ') || lower.startsWith('who ') || lower.startsWith('where ') || lower.startsWith('when ')) {
65
- const statement = lower
66
- .replace(/^what (is|are|was|were) /, '')
67
- .replace(/^who (is|are|was|were) /, '')
68
- .replace(/^where (is|are|was|were|does|did) /, '')
69
- .replace(/^when (did|does|was|were|is) /, '')
70
- .replace(/\?$/, '');
71
- if (statement !== lower)
72
- queries.push(statement);
73
- }
74
- return queries.slice(0, 4);
75
- }
76
- //# sourceMappingURL=query-expansion.js.map
@@ -1 +0,0 @@
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"}
@@ -1,15 +0,0 @@
1
- import type { EmbeddingAdapter } from '../adapters/embedding.js';
2
- import type { SearchResult } from './types.js';
3
- /**
4
- * Re-rank search results using embedding cosine similarity.
5
- * Deterministic, free (uses existing embedding model), no LLM call.
6
- *
7
- * How it works:
8
- * 1. Embed the query
9
- * 2. Embed all fact content texts in a single batch call
10
- * 3. Compute cosine similarity between query embedding and each fact embedding
11
- * 4. Blend the similarity score with the original fusion score
12
- * 5. Re-sort by blended score
13
- */
14
- export declare function rerank(embedding: EmbeddingAdapter, query: string, results: SearchResult[], topK?: number): Promise<SearchResult[]>;
15
- //# sourceMappingURL=reranker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reranker.d.ts","sourceRoot":"","sources":["reranker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;;;;;;GAUG;AACH,wBAAsB,MAAM,CAC1B,SAAS,EAAE,gBAAgB,EAC3B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,YAAY,EAAE,EACvB,IAAI,GAAE,MAAW,GAChB,OAAO,CAAC,YAAY,EAAE,CAAC,CAsBzB"}
@@ -1,47 +0,0 @@
1
- /**
2
- * Re-rank search results using embedding cosine similarity.
3
- * Deterministic, free (uses existing embedding model), no LLM call.
4
- *
5
- * How it works:
6
- * 1. Embed the query
7
- * 2. Embed all fact content texts in a single batch call
8
- * 3. Compute cosine similarity between query embedding and each fact embedding
9
- * 4. Blend the similarity score with the original fusion score
10
- * 5. Re-sort by blended score
11
- */
12
- export async function rerank(embedding, query, results, topK = 10) {
13
- if (results.length === 0)
14
- return [];
15
- if (results.length <= 1)
16
- return results;
17
- // Embed query + all fact texts in one batch
18
- const texts = [query, ...results.map(r => r.fact.content)];
19
- const embeddings = await embedding.embedBatch(texts);
20
- const queryEmbedding = embeddings[0];
21
- const factEmbeddings = embeddings.slice(1);
22
- // Score each result by cosine similarity with the query
23
- const RERANK_WEIGHT = 0.4; // 40% embedding similarity, 60% original fusion score
24
- const scored = results.map((r, i) => {
25
- const rerankScore = cosineSimilarity(queryEmbedding, factEmbeddings[i]);
26
- const blendedScore = r.score * (1 - RERANK_WEIGHT) + rerankScore * RERANK_WEIGHT;
27
- return { ...r, score: blendedScore };
28
- });
29
- // Sort by blended score
30
- scored.sort((a, b) => b.score - a.score);
31
- return scored.slice(0, topK);
32
- }
33
- function cosineSimilarity(a, b) {
34
- if (a.length !== b.length || a.length === 0)
35
- return 0;
36
- let dotProduct = 0;
37
- let normA = 0;
38
- let normB = 0;
39
- for (let i = 0; i < a.length; i++) {
40
- dotProduct += a[i] * b[i];
41
- normA += a[i] * a[i];
42
- normB += b[i] * b[i];
43
- }
44
- const denom = Math.sqrt(normA) * Math.sqrt(normB);
45
- return denom === 0 ? 0 : dotProduct / denom;
46
- }
47
- //# sourceMappingURL=reranker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reranker.js","sourceRoot":"","sources":["reranker.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,SAA2B,EAC3B,KAAa,EACb,OAAuB,EACvB,OAAe,EAAE;IAEjB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IAExC,4CAA4C;IAC5C,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,cAAc,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;IACtC,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3C,wDAAwD;IACxD,MAAM,aAAa,GAAG,GAAG,CAAC,CAAC,sDAAsD;IACjF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAClC,MAAM,WAAW,GAAG,gBAAgB,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,CAAE,CAAC,CAAC;QACzE,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,GAAG,WAAW,GAAG,aAAa,CAAC;QACjF,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,wBAAwB;IACxB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAEzC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAW,EAAE,CAAW;IAChD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtD,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACvB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACzB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC;AAC9C,CAAC"}
@@ -1,15 +0,0 @@
1
- import type { Candidate } from './types.js';
2
- export interface SalienceConfig {
3
- halfLifeDays: number;
4
- normalizationK: number;
5
- }
6
- /**
7
- * Score all candidates with recency and salience signals.
8
- *
9
- * recencyScore = pure time decay (how recently the fact was accessed)
10
- * salienceScore = importance x frequency factor (how important and reinforced)
11
- *
12
- * These are separate signals that feed into fusion with independent weights.
13
- */
14
- export declare function scoreSalience(candidates: Candidate[], config?: Partial<SalienceConfig>): Candidate[];
15
- //# sourceMappingURL=salience-scorer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"salience-scorer.d.ts","sourceRoot":"","sources":["salience-scorer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,UAAU,EAAE,SAAS,EAAE,EACvB,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAC/B,SAAS,EAAE,CAsCb"}
@@ -1,41 +0,0 @@
1
- /**
2
- * Score all candidates with recency and salience signals.
3
- *
4
- * recencyScore = pure time decay (how recently the fact was accessed)
5
- * salienceScore = importance x frequency factor (how important and reinforced)
6
- *
7
- * These are separate signals that feed into fusion with independent weights.
8
- */
9
- export function scoreSalience(candidates, config) {
10
- const halfLifeDays = config?.halfLifeDays ?? 30;
11
- const normalizationK = config?.normalizationK ?? 50;
12
- return candidates.map(candidate => {
13
- const { fact } = candidate;
14
- // Recency: blend of access recency + creation recency
15
- // Access recency = how recently the fact was recalled (reinforcement)
16
- // Creation recency = how recently the fact was created (freshness)
17
- // Git-style versioning needs creation recency so newer versions of
18
- // the same lineage naturally rank higher.
19
- const lambda = Math.LN2 / halfLifeDays;
20
- const daysSinceAccess = fact.lastAccessed
21
- ? (Date.now() - new Date(fact.lastAccessed).getTime()) / (1000 * 60 * 60 * 24)
22
- : Infinity;
23
- const accessRecency = fact.lastAccessed ? Math.exp(-lambda * daysSinceAccess) : 0;
24
- const daysSinceCreation = fact.createdAt
25
- ? (Date.now() - new Date(fact.createdAt).getTime()) / (1000 * 60 * 60 * 24)
26
- : Infinity;
27
- const creationRecency = fact.createdAt ? Math.exp(-lambda * daysSinceCreation) : 0;
28
- // Blend: 50% access recency + 50% creation recency
29
- const recencyScore = 0.5 * accessRecency + 0.5 * creationRecency;
30
- // Salience: importance x frequency factor
31
- // This captures "how important is this fact AND how often has it been reinforced"
32
- const frequencyFactor = Math.min(1.0, Math.log(1 + fact.frequency) / Math.log(1 + normalizationK));
33
- const salienceScore = fact.importance * frequencyFactor;
34
- return {
35
- ...candidate,
36
- recencyScore: Math.max(0, Math.min(1, recencyScore)),
37
- salienceScore: Math.max(0, Math.min(1, salienceScore)),
38
- };
39
- });
40
- }
41
- //# sourceMappingURL=salience-scorer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"salience-scorer.js","sourceRoot":"","sources":["salience-scorer.ts"],"names":[],"mappings":"AAOA;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAC3B,UAAuB,EACvB,MAAgC;IAEhC,MAAM,YAAY,GAAG,MAAM,EAAE,YAAY,IAAI,EAAE,CAAC;IAChD,MAAM,cAAc,GAAG,MAAM,EAAE,cAAc,IAAI,EAAE,CAAC;IAEpD,OAAO,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;QAChC,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC;QAE3B,sDAAsD;QACtD,sEAAsE;QACtE,mEAAmE;QACnE,mEAAmE;QACnE,0CAA0C;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC;QAEvC,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY;YACvC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YAC9E,CAAC,CAAC,QAAQ,CAAC;QACb,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAElF,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS;YACtC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YAC3E,CAAC,CAAC,QAAQ,CAAC;QACb,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEnF,mDAAmD;QACnD,MAAM,YAAY,GAAG,GAAG,GAAG,aAAa,GAAG,GAAG,GAAG,eAAe,CAAC;QAEjE,0CAA0C;QAC1C,kFAAkF;QAClF,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;QACnG,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,GAAG,eAAe,CAAC;QAExD,OAAO;YACL,GAAG,SAAS;YACZ,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;YACpD,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;SACvD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,21 +0,0 @@
1
- import type { StorageAdapter } from '../adapters/storage.js';
2
- import type { EmbeddingAdapter } from '../adapters/embedding.js';
3
- import type { CacheAdapter } from '../adapters/cache.js';
4
- import type { LLMAdapter } from '../adapters/llm.js';
5
- import type { SearchOptions, SearchResponse, FusionWeights } from './types.js';
6
- export interface SearchConfig {
7
- storage: StorageAdapter;
8
- embedding: EmbeddingAdapter;
9
- cache?: CacheAdapter;
10
- defaultWeights?: FusionWeights;
11
- salienceHalfLifeDays?: number;
12
- salienceNormalizationK?: number;
13
- graphMaxDepth?: number;
14
- graphMaxEntities?: number;
15
- rerankerLLM?: LLMAdapter;
16
- rerank?: boolean;
17
- /** LLM for query expansion (optional — falls back to heuristic expansion) */
18
- expansionLLM?: LLMAdapter;
19
- }
20
- export declare function search(config: SearchConfig, options: SearchOptions): Promise<SearchResponse>;
21
- //# sourceMappingURL=search.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["search.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,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAa,MAAM,YAAY,CAAC;AAc1F,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,cAAc,CAAC,EAAE,aAAa,CAAC;IAC/B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,UAAU,CAAC;CAC3B;AAED,wBAAsB,MAAM,CAC1B,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,cAAc,CAAC,CA6NzB"}