cognitive-core 0.0.1 → 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.
Files changed (329) hide show
  1. package/README.md +363 -2
  2. package/SKILL.md +193 -0
  3. package/dist/agents/index.d.ts +3 -0
  4. package/dist/agents/index.d.ts.map +1 -0
  5. package/dist/agents/index.js +5 -0
  6. package/dist/agents/index.js.map +1 -0
  7. package/dist/agents/mock-provider.d.ts +23 -0
  8. package/dist/agents/mock-provider.d.ts.map +1 -0
  9. package/dist/agents/mock-provider.js +71 -0
  10. package/dist/agents/mock-provider.js.map +1 -0
  11. package/dist/agents/types.d.ts +98 -0
  12. package/dist/agents/types.d.ts.map +1 -0
  13. package/dist/agents/types.js +44 -0
  14. package/dist/agents/types.js.map +1 -0
  15. package/dist/atlas.d.ts +196 -0
  16. package/dist/atlas.d.ts.map +1 -0
  17. package/dist/atlas.js +373 -0
  18. package/dist/atlas.js.map +1 -0
  19. package/dist/bin/cognitive-core.d.ts +18 -0
  20. package/dist/bin/cognitive-core.d.ts.map +1 -0
  21. package/dist/bin/cognitive-core.js +419 -0
  22. package/dist/bin/cognitive-core.js.map +1 -0
  23. package/dist/embeddings/bm25.d.ts +104 -0
  24. package/dist/embeddings/bm25.d.ts.map +1 -0
  25. package/dist/embeddings/bm25.js +264 -0
  26. package/dist/embeddings/bm25.js.map +1 -0
  27. package/dist/embeddings/index.d.ts +12 -0
  28. package/dist/embeddings/index.d.ts.map +1 -0
  29. package/dist/embeddings/index.js +16 -0
  30. package/dist/embeddings/index.js.map +1 -0
  31. package/dist/embeddings/manager.d.ts +112 -0
  32. package/dist/embeddings/manager.d.ts.map +1 -0
  33. package/dist/embeddings/manager.js +215 -0
  34. package/dist/embeddings/manager.js.map +1 -0
  35. package/dist/embeddings/provider.d.ts +101 -0
  36. package/dist/embeddings/provider.d.ts.map +1 -0
  37. package/dist/embeddings/provider.js +232 -0
  38. package/dist/embeddings/provider.js.map +1 -0
  39. package/dist/embeddings/vector-store.d.ts +101 -0
  40. package/dist/embeddings/vector-store.d.ts.map +1 -0
  41. package/dist/embeddings/vector-store.js +256 -0
  42. package/dist/embeddings/vector-store.js.map +1 -0
  43. package/dist/factory.d.ts +193 -0
  44. package/dist/factory.d.ts.map +1 -0
  45. package/dist/factory.js +109 -0
  46. package/dist/factory.js.map +1 -0
  47. package/dist/index.d.ts +43 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +84 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/learning/analyzer.d.ts +110 -0
  52. package/dist/learning/analyzer.d.ts.map +1 -0
  53. package/dist/learning/analyzer.js +213 -0
  54. package/dist/learning/analyzer.js.map +1 -0
  55. package/dist/learning/effectiveness.d.ts +158 -0
  56. package/dist/learning/effectiveness.d.ts.map +1 -0
  57. package/dist/learning/effectiveness.js +251 -0
  58. package/dist/learning/effectiveness.js.map +1 -0
  59. package/dist/learning/index.d.ts +8 -0
  60. package/dist/learning/index.d.ts.map +1 -0
  61. package/dist/learning/index.js +11 -0
  62. package/dist/learning/index.js.map +1 -0
  63. package/dist/learning/llm-extractor.d.ts +88 -0
  64. package/dist/learning/llm-extractor.d.ts.map +1 -0
  65. package/dist/learning/llm-extractor.js +372 -0
  66. package/dist/learning/llm-extractor.js.map +1 -0
  67. package/dist/learning/meta-learner.d.ts +80 -0
  68. package/dist/learning/meta-learner.d.ts.map +1 -0
  69. package/dist/learning/meta-learner.js +355 -0
  70. package/dist/learning/meta-learner.js.map +1 -0
  71. package/dist/learning/pipeline.d.ts +65 -0
  72. package/dist/learning/pipeline.d.ts.map +1 -0
  73. package/dist/learning/pipeline.js +170 -0
  74. package/dist/learning/pipeline.js.map +1 -0
  75. package/dist/learning/playbook-extractor.d.ts +113 -0
  76. package/dist/learning/playbook-extractor.d.ts.map +1 -0
  77. package/dist/learning/playbook-extractor.js +523 -0
  78. package/dist/learning/playbook-extractor.js.map +1 -0
  79. package/dist/learning/usage-inference.d.ts +82 -0
  80. package/dist/learning/usage-inference.d.ts.map +1 -0
  81. package/dist/learning/usage-inference.js +261 -0
  82. package/dist/learning/usage-inference.js.map +1 -0
  83. package/dist/mcp/index.d.ts +6 -0
  84. package/dist/mcp/index.d.ts.map +1 -0
  85. package/dist/mcp/index.js +6 -0
  86. package/dist/mcp/index.js.map +1 -0
  87. package/dist/mcp/playbook-server.d.ts +120 -0
  88. package/dist/mcp/playbook-server.d.ts.map +1 -0
  89. package/dist/mcp/playbook-server.js +427 -0
  90. package/dist/mcp/playbook-server.js.map +1 -0
  91. package/dist/memory/curated-loader.d.ts +62 -0
  92. package/dist/memory/curated-loader.d.ts.map +1 -0
  93. package/dist/memory/curated-loader.js +106 -0
  94. package/dist/memory/curated-loader.js.map +1 -0
  95. package/dist/memory/experience.d.ts +122 -0
  96. package/dist/memory/experience.d.ts.map +1 -0
  97. package/dist/memory/experience.js +392 -0
  98. package/dist/memory/experience.js.map +1 -0
  99. package/dist/memory/index.d.ts +6 -0
  100. package/dist/memory/index.d.ts.map +1 -0
  101. package/dist/memory/index.js +9 -0
  102. package/dist/memory/index.js.map +1 -0
  103. package/dist/memory/meta.d.ts +90 -0
  104. package/dist/memory/meta.d.ts.map +1 -0
  105. package/dist/memory/meta.js +362 -0
  106. package/dist/memory/meta.js.map +1 -0
  107. package/dist/memory/playbook.d.ts +133 -0
  108. package/dist/memory/playbook.d.ts.map +1 -0
  109. package/dist/memory/playbook.js +357 -0
  110. package/dist/memory/playbook.js.map +1 -0
  111. package/dist/memory/system.d.ts +167 -0
  112. package/dist/memory/system.d.ts.map +1 -0
  113. package/dist/memory/system.js +383 -0
  114. package/dist/memory/system.js.map +1 -0
  115. package/dist/runtime/backends/acp.d.ts +67 -0
  116. package/dist/runtime/backends/acp.d.ts.map +1 -0
  117. package/dist/runtime/backends/acp.js +290 -0
  118. package/dist/runtime/backends/acp.js.map +1 -0
  119. package/dist/runtime/backends/index.d.ts +5 -0
  120. package/dist/runtime/backends/index.d.ts.map +1 -0
  121. package/dist/runtime/backends/index.js +6 -0
  122. package/dist/runtime/backends/index.js.map +1 -0
  123. package/dist/runtime/backends/mock.d.ts +67 -0
  124. package/dist/runtime/backends/mock.d.ts.map +1 -0
  125. package/dist/runtime/backends/mock.js +153 -0
  126. package/dist/runtime/backends/mock.js.map +1 -0
  127. package/dist/runtime/backends/subprocess.d.ts +56 -0
  128. package/dist/runtime/backends/subprocess.d.ts.map +1 -0
  129. package/dist/runtime/backends/subprocess.js +260 -0
  130. package/dist/runtime/backends/subprocess.js.map +1 -0
  131. package/dist/runtime/flows/learning.d.ts +73 -0
  132. package/dist/runtime/flows/learning.d.ts.map +1 -0
  133. package/dist/runtime/flows/learning.js +116 -0
  134. package/dist/runtime/flows/learning.js.map +1 -0
  135. package/dist/runtime/flows/validation.d.ts +122 -0
  136. package/dist/runtime/flows/validation.d.ts.map +1 -0
  137. package/dist/runtime/flows/validation.js +223 -0
  138. package/dist/runtime/flows/validation.js.map +1 -0
  139. package/dist/runtime/index.d.ts +6 -0
  140. package/dist/runtime/index.d.ts.map +1 -0
  141. package/dist/runtime/index.js +8 -0
  142. package/dist/runtime/index.js.map +1 -0
  143. package/dist/runtime/manager.d.ts +116 -0
  144. package/dist/runtime/manager.d.ts.map +1 -0
  145. package/dist/runtime/manager.js +416 -0
  146. package/dist/runtime/manager.js.map +1 -0
  147. package/dist/runtime/types.d.ts +138 -0
  148. package/dist/runtime/types.d.ts.map +1 -0
  149. package/dist/runtime/types.js +2 -0
  150. package/dist/runtime/types.js.map +1 -0
  151. package/dist/search/evaluator.d.ts +102 -0
  152. package/dist/search/evaluator.d.ts.map +1 -0
  153. package/dist/search/evaluator.js +352 -0
  154. package/dist/search/evaluator.js.map +1 -0
  155. package/dist/search/index.d.ts +7 -0
  156. package/dist/search/index.d.ts.map +1 -0
  157. package/dist/search/index.js +11 -0
  158. package/dist/search/index.js.map +1 -0
  159. package/dist/search/refinement-loop.d.ts +73 -0
  160. package/dist/search/refinement-loop.d.ts.map +1 -0
  161. package/dist/search/refinement-loop.js +245 -0
  162. package/dist/search/refinement-loop.js.map +1 -0
  163. package/dist/search/refinement-types.d.ts +154 -0
  164. package/dist/search/refinement-types.d.ts.map +1 -0
  165. package/dist/search/refinement-types.js +99 -0
  166. package/dist/search/refinement-types.js.map +1 -0
  167. package/dist/search/router.d.ts +61 -0
  168. package/dist/search/router.d.ts.map +1 -0
  169. package/dist/search/router.js +197 -0
  170. package/dist/search/router.js.map +1 -0
  171. package/dist/search/solver.d.ts +75 -0
  172. package/dist/search/solver.d.ts.map +1 -0
  173. package/dist/search/solver.js +216 -0
  174. package/dist/search/solver.js.map +1 -0
  175. package/dist/search/verification-runner.d.ts +125 -0
  176. package/dist/search/verification-runner.d.ts.map +1 -0
  177. package/dist/search/verification-runner.js +440 -0
  178. package/dist/search/verification-runner.js.map +1 -0
  179. package/dist/surfacing/index.d.ts +2 -0
  180. package/dist/surfacing/index.d.ts.map +1 -0
  181. package/dist/surfacing/index.js +2 -0
  182. package/dist/surfacing/index.js.map +1 -0
  183. package/dist/surfacing/skill-library.d.ts +158 -0
  184. package/dist/surfacing/skill-library.d.ts.map +1 -0
  185. package/dist/surfacing/skill-library.js +429 -0
  186. package/dist/surfacing/skill-library.js.map +1 -0
  187. package/dist/types/config.d.ts +1113 -0
  188. package/dist/types/config.d.ts.map +1 -0
  189. package/dist/types/config.js +274 -0
  190. package/dist/types/config.js.map +1 -0
  191. package/dist/types/index.d.ts +9 -0
  192. package/dist/types/index.d.ts.map +1 -0
  193. package/dist/types/index.js +14 -0
  194. package/dist/types/index.js.map +1 -0
  195. package/dist/types/memory.d.ts +339 -0
  196. package/dist/types/memory.d.ts.map +1 -0
  197. package/dist/types/memory.js +207 -0
  198. package/dist/types/memory.js.map +1 -0
  199. package/dist/types/meta.d.ts +146 -0
  200. package/dist/types/meta.d.ts.map +1 -0
  201. package/dist/types/meta.js +51 -0
  202. package/dist/types/meta.js.map +1 -0
  203. package/dist/types/outcome.d.ts +42 -0
  204. package/dist/types/outcome.d.ts.map +1 -0
  205. package/dist/types/outcome.js +50 -0
  206. package/dist/types/outcome.js.map +1 -0
  207. package/dist/types/playbook.d.ts +119 -0
  208. package/dist/types/playbook.d.ts.map +1 -0
  209. package/dist/types/playbook.js +71 -0
  210. package/dist/types/playbook.js.map +1 -0
  211. package/dist/types/step.d.ts +44 -0
  212. package/dist/types/step.d.ts.map +1 -0
  213. package/dist/types/step.js +32 -0
  214. package/dist/types/step.js.map +1 -0
  215. package/dist/types/task.d.ts +91 -0
  216. package/dist/types/task.d.ts.map +1 -0
  217. package/dist/types/task.js +39 -0
  218. package/dist/types/task.js.map +1 -0
  219. package/dist/types/trajectory.d.ts +221 -0
  220. package/dist/types/trajectory.d.ts.map +1 -0
  221. package/dist/types/trajectory.js +60 -0
  222. package/dist/types/trajectory.js.map +1 -0
  223. package/dist/utils/index.d.ts +4 -0
  224. package/dist/utils/index.d.ts.map +1 -0
  225. package/dist/utils/index.js +4 -0
  226. package/dist/utils/index.js.map +1 -0
  227. package/dist/utils/similarity.d.ts +31 -0
  228. package/dist/utils/similarity.d.ts.map +1 -0
  229. package/dist/utils/similarity.js +107 -0
  230. package/dist/utils/similarity.js.map +1 -0
  231. package/dist/utils/storage.d.ts +106 -0
  232. package/dist/utils/storage.d.ts.map +1 -0
  233. package/dist/utils/storage.js +203 -0
  234. package/dist/utils/storage.js.map +1 -0
  235. package/dist/utils/validation.d.ts +129 -0
  236. package/dist/utils/validation.d.ts.map +1 -0
  237. package/dist/utils/validation.js +171 -0
  238. package/dist/utils/validation.js.map +1 -0
  239. package/package.json +61 -9
  240. package/scripts/migrate-to-playbooks.ts +307 -0
  241. package/src/agents/index.ts +14 -0
  242. package/src/agents/mock-provider.ts +93 -0
  243. package/src/agents/types.ts +137 -0
  244. package/src/atlas.ts +560 -0
  245. package/src/bin/cognitive-core.ts +470 -0
  246. package/src/embeddings/bm25.ts +337 -0
  247. package/src/embeddings/index.ts +39 -0
  248. package/src/embeddings/manager.ts +288 -0
  249. package/src/embeddings/provider.ts +311 -0
  250. package/src/embeddings/vector-store.ts +353 -0
  251. package/src/factory.ts +263 -0
  252. package/src/index.ts +246 -0
  253. package/src/learning/analyzer.ts +335 -0
  254. package/src/learning/effectiveness.ts +428 -0
  255. package/src/learning/index.ts +58 -0
  256. package/src/learning/llm-extractor.ts +542 -0
  257. package/src/learning/meta-learner.ts +516 -0
  258. package/src/learning/pipeline.ts +244 -0
  259. package/src/learning/playbook-extractor.ts +702 -0
  260. package/src/learning/usage-inference.ts +372 -0
  261. package/src/mcp/index.ts +12 -0
  262. package/src/mcp/playbook-server.ts +565 -0
  263. package/src/memory/curated-loader.ts +160 -0
  264. package/src/memory/experience.ts +515 -0
  265. package/src/memory/index.ts +27 -0
  266. package/src/memory/meta.ts +506 -0
  267. package/src/memory/playbook.ts +493 -0
  268. package/src/memory/system.ts +551 -0
  269. package/src/runtime/backends/acp.ts +378 -0
  270. package/src/runtime/backends/index.ts +24 -0
  271. package/src/runtime/backends/mock.ts +218 -0
  272. package/src/runtime/backends/subprocess.ts +356 -0
  273. package/src/runtime/flows/learning.ts +183 -0
  274. package/src/runtime/flows/validation.ts +381 -0
  275. package/src/runtime/index.ts +53 -0
  276. package/src/runtime/manager.ts +541 -0
  277. package/src/runtime/types.ts +157 -0
  278. package/src/search/evaluator.ts +474 -0
  279. package/src/search/index.ts +59 -0
  280. package/src/search/refinement-loop.ts +363 -0
  281. package/src/search/refinement-types.ts +159 -0
  282. package/src/search/router.ts +261 -0
  283. package/src/search/solver.ts +303 -0
  284. package/src/search/verification-runner.ts +570 -0
  285. package/src/surfacing/index.ts +6 -0
  286. package/src/surfacing/skill-library.ts +594 -0
  287. package/src/types/config.ts +333 -0
  288. package/src/types/index.ts +130 -0
  289. package/src/types/memory.ts +270 -0
  290. package/src/types/meta.ts +218 -0
  291. package/src/types/outcome.ts +66 -0
  292. package/src/types/playbook.ts +196 -0
  293. package/src/types/step.ts +40 -0
  294. package/src/types/task.ts +52 -0
  295. package/src/types/trajectory.ts +80 -0
  296. package/src/utils/index.ts +38 -0
  297. package/src/utils/similarity.ts +139 -0
  298. package/src/utils/storage.ts +249 -0
  299. package/src/utils/validation.ts +286 -0
  300. package/tests/embeddings/bm25.test.ts +130 -0
  301. package/tests/embeddings/manager.test.ts +205 -0
  302. package/tests/integration/atlas.test.ts +266 -0
  303. package/tests/integration/e2e.test.ts +929 -0
  304. package/tests/learning/analyzer.test.ts +426 -0
  305. package/tests/learning/effectiveness.test.ts +542 -0
  306. package/tests/learning/pipeline.test.ts +176 -0
  307. package/tests/learning/playbook-extractor-provenance.test.ts +114 -0
  308. package/tests/learning/usage-inference.test.ts +254 -0
  309. package/tests/mcp/playbook-server.test.ts +252 -0
  310. package/tests/memory/experience.test.ts +198 -0
  311. package/tests/memory/playbook.test.ts +338 -0
  312. package/tests/memory/provenance.test.ts +639 -0
  313. package/tests/memory/system.test.ts +325 -0
  314. package/tests/runtime/agent-manager.test.ts +512 -0
  315. package/tests/runtime/mock-backend.test.ts +248 -0
  316. package/tests/search/refinement-loop.test.ts +468 -0
  317. package/tests/search/refinement.test.ts +267 -0
  318. package/tests/search/router.test.ts +427 -0
  319. package/tests/surfacing/skill-library.test.ts +292 -0
  320. package/tests/types/outcome.test.ts +147 -0
  321. package/tests/types/step.test.ts +133 -0
  322. package/tests/types/task.test.ts +158 -0
  323. package/tests/types/trajectory.test.ts +253 -0
  324. package/tests/utils/similarity.test.ts +188 -0
  325. package/tests/utils/validation.test.ts +252 -0
  326. package/tsconfig.json +25 -0
  327. package/vitest.config.ts +22 -0
  328. package/index.d.ts +0 -4
  329. package/index.js +0 -4
@@ -0,0 +1,264 @@
1
+ /**
2
+ * BM25 Index
3
+ *
4
+ * A text-based similarity search index using BM25 (Best Match 25) algorithm.
5
+ * Used as a fallback when no embedding provider is configured.
6
+ *
7
+ * BM25 is a ranking function used in information retrieval that considers
8
+ * term frequency, document length, and inverse document frequency.
9
+ */
10
+ /**
11
+ * BM25 text similarity search index
12
+ */
13
+ export class BM25Index {
14
+ documents;
15
+ idf;
16
+ avgDocLength;
17
+ k1;
18
+ b;
19
+ dirty;
20
+ constructor(options) {
21
+ this.documents = new Map();
22
+ this.idf = new Map();
23
+ this.avgDocLength = 0;
24
+ // k1 controls term frequency saturation (typical: 1.2-2.0)
25
+ this.k1 = options?.k1 ?? 1.5;
26
+ // b controls document length normalization (typical: 0.75)
27
+ this.b = options?.b ?? 0.75;
28
+ this.dirty = false;
29
+ }
30
+ /**
31
+ * Add a document to the index
32
+ */
33
+ add(id, content, type) {
34
+ const tokens = this.tokenize(content);
35
+ this.documents.set(id, { id, tokens, type, content });
36
+ this.dirty = true;
37
+ }
38
+ /**
39
+ * Remove a document from the index
40
+ */
41
+ remove(id) {
42
+ const removed = this.documents.delete(id);
43
+ if (removed) {
44
+ this.dirty = true;
45
+ }
46
+ return removed;
47
+ }
48
+ /**
49
+ * Check if a document exists
50
+ */
51
+ has(id) {
52
+ return this.documents.has(id);
53
+ }
54
+ /**
55
+ * Get document count
56
+ */
57
+ get size() {
58
+ return this.documents.size;
59
+ }
60
+ /**
61
+ * Search for similar documents
62
+ */
63
+ search(query, options = {}) {
64
+ // Rebuild IDF if needed
65
+ if (this.dirty) {
66
+ this.rebuildIdf();
67
+ }
68
+ const queryTokens = this.tokenize(query);
69
+ // Return empty for empty query
70
+ if (queryTokens.length === 0) {
71
+ return [];
72
+ }
73
+ const results = [];
74
+ for (const doc of this.documents.values()) {
75
+ // Skip if type filter doesn't match
76
+ if (options.type && doc.type !== options.type)
77
+ continue;
78
+ const score = this.computeScore(queryTokens, doc.tokens);
79
+ // Normalize score to 0-1 range (approximate)
80
+ const normalizedScore = this.normalizeScore(score, queryTokens.length);
81
+ if (normalizedScore >= (options.threshold ?? 0)) {
82
+ results.push({
83
+ id: doc.id,
84
+ score: normalizedScore,
85
+ content: doc.content,
86
+ });
87
+ }
88
+ }
89
+ return results.sort((a, b) => b.score - a.score).slice(0, options.k ?? 10);
90
+ }
91
+ /**
92
+ * Tokenize text for indexing and search
93
+ */
94
+ tokenize(text) {
95
+ return text
96
+ .toLowerCase()
97
+ .replace(/[^\w\s]/g, ' ')
98
+ .split(/\s+/)
99
+ .filter((t) => t.length > 1)
100
+ .filter((t) => !STOP_WORDS.has(t));
101
+ }
102
+ /**
103
+ * Rebuild IDF values for all terms
104
+ */
105
+ rebuildIdf() {
106
+ this.idf.clear();
107
+ const N = this.documents.size;
108
+ if (N === 0) {
109
+ this.avgDocLength = 0;
110
+ this.dirty = false;
111
+ return;
112
+ }
113
+ const termDocCounts = new Map();
114
+ let totalLength = 0;
115
+ for (const doc of this.documents.values()) {
116
+ totalLength += doc.tokens.length;
117
+ const uniqueTerms = new Set(doc.tokens);
118
+ for (const term of uniqueTerms) {
119
+ termDocCounts.set(term, (termDocCounts.get(term) ?? 0) + 1);
120
+ }
121
+ }
122
+ this.avgDocLength = totalLength / N;
123
+ // Calculate IDF for each term
124
+ for (const [term, df] of termDocCounts) {
125
+ // IDF formula: log((N - df + 0.5) / (df + 0.5) + 1)
126
+ this.idf.set(term, Math.log((N - df + 0.5) / (df + 0.5) + 1));
127
+ }
128
+ this.dirty = false;
129
+ }
130
+ /**
131
+ * Compute BM25 score for a document
132
+ */
133
+ computeScore(queryTokens, docTokens) {
134
+ const docLength = docTokens.length;
135
+ // Build term frequency map for document
136
+ const termFreq = new Map();
137
+ for (const token of docTokens) {
138
+ termFreq.set(token, (termFreq.get(token) ?? 0) + 1);
139
+ }
140
+ let score = 0;
141
+ for (const term of queryTokens) {
142
+ const tf = termFreq.get(term) ?? 0;
143
+ const idf = this.idf.get(term) ?? 0;
144
+ if (tf === 0 || idf === 0)
145
+ continue;
146
+ // BM25 formula
147
+ const numerator = tf * (this.k1 + 1);
148
+ const denominator = tf +
149
+ this.k1 * (1 - this.b + this.b * (docLength / this.avgDocLength));
150
+ score += idf * (numerator / denominator);
151
+ }
152
+ return score;
153
+ }
154
+ /**
155
+ * Normalize BM25 score to approximately 0-1 range
156
+ * This is an approximation since BM25 scores are unbounded
157
+ */
158
+ normalizeScore(score, queryLength) {
159
+ if (score <= 0 || queryLength === 0)
160
+ return 0;
161
+ // Approximate maximum possible score per term
162
+ // Assuming perfect TF and high IDF
163
+ const maxScorePerTerm = 2.5; // Typical upper bound
164
+ const maxPossibleScore = queryLength * maxScorePerTerm;
165
+ // Sigmoid-like normalization
166
+ const normalized = score / (score + maxPossibleScore * 0.5);
167
+ return Math.min(1, Math.max(0, normalized));
168
+ }
169
+ /**
170
+ * Serialize index to JSON (for persistence)
171
+ */
172
+ toJSON() {
173
+ return {
174
+ documents: Array.from(this.documents.values()),
175
+ k1: this.k1,
176
+ b: this.b,
177
+ };
178
+ }
179
+ /**
180
+ * Restore index from JSON
181
+ */
182
+ static fromJSON(data) {
183
+ const index = new BM25Index({ k1: data.k1, b: data.b });
184
+ for (const doc of data.documents) {
185
+ index.documents.set(doc.id, doc);
186
+ }
187
+ index.dirty = true;
188
+ return index;
189
+ }
190
+ }
191
+ /**
192
+ * Common English stop words to filter out
193
+ */
194
+ const STOP_WORDS = new Set([
195
+ 'a',
196
+ 'an',
197
+ 'and',
198
+ 'are',
199
+ 'as',
200
+ 'at',
201
+ 'be',
202
+ 'by',
203
+ 'for',
204
+ 'from',
205
+ 'has',
206
+ 'he',
207
+ 'in',
208
+ 'is',
209
+ 'it',
210
+ 'its',
211
+ 'of',
212
+ 'on',
213
+ 'or',
214
+ 'that',
215
+ 'the',
216
+ 'to',
217
+ 'was',
218
+ 'were',
219
+ 'will',
220
+ 'with',
221
+ 'this',
222
+ 'but',
223
+ 'they',
224
+ 'have',
225
+ 'had',
226
+ 'what',
227
+ 'when',
228
+ 'where',
229
+ 'who',
230
+ 'which',
231
+ 'why',
232
+ 'how',
233
+ 'all',
234
+ 'each',
235
+ 'every',
236
+ 'both',
237
+ 'few',
238
+ 'more',
239
+ 'most',
240
+ 'other',
241
+ 'some',
242
+ 'such',
243
+ 'no',
244
+ 'nor',
245
+ 'not',
246
+ 'only',
247
+ 'own',
248
+ 'same',
249
+ 'so',
250
+ 'than',
251
+ 'too',
252
+ 'very',
253
+ 'can',
254
+ 'just',
255
+ 'should',
256
+ 'now',
257
+ ]);
258
+ /**
259
+ * Create a new BM25 index
260
+ */
261
+ export function createBM25Index(options) {
262
+ return new BM25Index(options);
263
+ }
264
+ //# sourceMappingURL=bm25.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bm25.js","sourceRoot":"","sources":["../../src/embeddings/bm25.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Embeddings Module
3
+ *
4
+ * Provides embedding generation, storage, and similarity search capabilities.
5
+ * Supports multiple embedding providers (OpenAI, Voyage, local) with automatic
6
+ * fallback to BM25 text search when no provider is configured.
7
+ */
8
+ export { type EmbeddingProvider, type EmbeddingProviderConfig, OpenAIEmbeddingProvider, VoyageEmbeddingProvider, LocalEmbeddingProvider, createEmbeddingProvider, } from './provider.js';
9
+ export { BM25Index, createBM25Index, type MemoryItemType, } from './bm25.js';
10
+ export { SqliteVectorStore, createVectorStore, type VectorSearchResult, } from './vector-store.js';
11
+ export { EmbeddingManager, createEmbeddingManager, type EmbeddingManagerOptions, type SearchResult, } from './manager.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,SAAS,EACT,eAAe,EACf,KAAK,cAAc,GACpB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,kBAAkB,GACxB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,uBAAuB,EAC5B,KAAK,YAAY,GAClB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Embeddings Module
3
+ *
4
+ * Provides embedding generation, storage, and similarity search capabilities.
5
+ * Supports multiple embedding providers (OpenAI, Voyage, local) with automatic
6
+ * fallback to BM25 text search when no provider is configured.
7
+ */
8
+ // Provider interface and implementations
9
+ export { OpenAIEmbeddingProvider, VoyageEmbeddingProvider, LocalEmbeddingProvider, createEmbeddingProvider, } from './provider.js';
10
+ // BM25 text search (fallback)
11
+ export { BM25Index, createBM25Index, } from './bm25.js';
12
+ // Vector store using sqlite-vec
13
+ export { SqliteVectorStore, createVectorStore, } from './vector-store.js';
14
+ // Embedding manager (main interface)
15
+ export { EmbeddingManager, createEmbeddingManager, } from './manager.js';
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,yCAAyC;AACzC,OAAO,EAGL,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,eAAe,CAAC;AAEvB,8BAA8B;AAC9B,OAAO,EACL,SAAS,EACT,eAAe,GAEhB,MAAM,WAAW,CAAC;AAEnB,gCAAgC;AAChC,OAAO,EACL,iBAAiB,EACjB,iBAAiB,GAElB,MAAM,mBAAmB,CAAC;AAE3B,qCAAqC;AACrC,OAAO,EACL,gBAAgB,EAChB,sBAAsB,GAGvB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Embedding Manager
3
+ *
4
+ * Orchestrates embedding generation, storage, and search.
5
+ * Provides automatic fallback to BM25 when no embedding provider is configured.
6
+ */
7
+ import type { EmbeddingProvider } from './provider.js';
8
+ import { type MemoryItemType } from './bm25.js';
9
+ export { type MemoryItemType } from './bm25.js';
10
+ export interface SearchResult {
11
+ id: string;
12
+ score: number;
13
+ content: string;
14
+ }
15
+ export interface EmbeddingManagerOptions {
16
+ /** Embedding provider (null for BM25-only mode) */
17
+ provider?: EmbeddingProvider | null;
18
+ /** Path to sqlite-vec database file */
19
+ vectorStorePath?: string;
20
+ /** Embedding dimension (required if provider is set) */
21
+ dimension?: number;
22
+ /** BM25 parameters */
23
+ bm25?: {
24
+ k1?: number;
25
+ b?: number;
26
+ };
27
+ }
28
+ /**
29
+ * Manages embeddings with automatic fallback to BM25
30
+ */
31
+ export declare class EmbeddingManager {
32
+ private provider;
33
+ private vectorStore;
34
+ private bm25Index;
35
+ private useVectorSearch;
36
+ constructor(options: EmbeddingManagerOptions);
37
+ /**
38
+ * Check if vector search is available
39
+ */
40
+ get hasVectorSearch(): boolean;
41
+ /**
42
+ * Get the embedding dimension (if available)
43
+ */
44
+ get dimension(): number | null;
45
+ /**
46
+ * Store an item with its embedding
47
+ * Returns the embedding if generated, undefined otherwise
48
+ */
49
+ store(id: string, content: string, type: MemoryItemType): Promise<number[] | undefined>;
50
+ /**
51
+ * Store multiple items with embeddings (batch)
52
+ * More efficient than calling store() multiple times
53
+ */
54
+ storeBatch(items: Array<{
55
+ id: string;
56
+ content: string;
57
+ type: MemoryItemType;
58
+ }>): Promise<Map<string, number[] | undefined>>;
59
+ /**
60
+ * Search for similar items
61
+ * Uses vector search if available, falls back to BM25
62
+ */
63
+ search(query: string, options?: {
64
+ k?: number;
65
+ type?: MemoryItemType;
66
+ threshold?: number;
67
+ }): Promise<SearchResult[]>;
68
+ /**
69
+ * Search using a pre-computed embedding
70
+ * Only works if vector store is available
71
+ */
72
+ searchByEmbedding(embedding: number[], options?: {
73
+ k?: number;
74
+ type?: MemoryItemType;
75
+ threshold?: number;
76
+ }): SearchResult[] | null;
77
+ /**
78
+ * Generate an embedding without storing it
79
+ */
80
+ embed(text: string): Promise<number[] | null>;
81
+ /**
82
+ * Generate embeddings for multiple texts without storing
83
+ */
84
+ embedBatch(texts: string[]): Promise<number[][] | null>;
85
+ /**
86
+ * Remove an item from all indexes
87
+ */
88
+ remove(id: string): void;
89
+ /**
90
+ * Check if an item exists
91
+ */
92
+ has(id: string): boolean;
93
+ /**
94
+ * Get statistics about the indexes
95
+ */
96
+ getStats(): {
97
+ bm25Count: number;
98
+ vectorCount: number | null;
99
+ hasVectorSearch: boolean;
100
+ dimension: number | null;
101
+ providerName: string | null;
102
+ };
103
+ /**
104
+ * Close all resources
105
+ */
106
+ close(): void;
107
+ }
108
+ /**
109
+ * Create an embedding manager
110
+ */
111
+ export declare function createEmbeddingManager(options: EmbeddingManagerOptions): EmbeddingManager;
112
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/embeddings/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,215 @@
1
+ /**
2
+ * Embedding Manager
3
+ *
4
+ * Orchestrates embedding generation, storage, and search.
5
+ * Provides automatic fallback to BM25 when no embedding provider is configured.
6
+ */
7
+ import { SqliteVectorStore } from './vector-store.js';
8
+ import { BM25Index } from './bm25.js';
9
+ /**
10
+ * Manages embeddings with automatic fallback to BM25
11
+ */
12
+ export class EmbeddingManager {
13
+ provider;
14
+ vectorStore;
15
+ bm25Index;
16
+ useVectorSearch;
17
+ constructor(options) {
18
+ this.provider = options.provider ?? null;
19
+ this.useVectorSearch = this.provider !== null && !!options.vectorStorePath;
20
+ // Initialize vector store if we have a provider and path
21
+ if (this.useVectorSearch && options.vectorStorePath) {
22
+ const dimension = options.dimension ?? this.provider.dimension;
23
+ this.vectorStore = new SqliteVectorStore({
24
+ dbPath: options.vectorStorePath,
25
+ dimension,
26
+ });
27
+ }
28
+ else {
29
+ this.vectorStore = null;
30
+ }
31
+ // Always maintain BM25 as fallback
32
+ this.bm25Index = new BM25Index(options.bm25);
33
+ }
34
+ /**
35
+ * Check if vector search is available
36
+ */
37
+ get hasVectorSearch() {
38
+ return this.useVectorSearch && this.vectorStore !== null;
39
+ }
40
+ /**
41
+ * Get the embedding dimension (if available)
42
+ */
43
+ get dimension() {
44
+ return this.provider?.dimension ?? null;
45
+ }
46
+ /**
47
+ * Store an item with its embedding
48
+ * Returns the embedding if generated, undefined otherwise
49
+ */
50
+ async store(id, content, type) {
51
+ // Always add to BM25 index for fallback
52
+ this.bm25Index.add(id, content, type);
53
+ // Generate and store embedding if provider available
54
+ if (this.useVectorSearch && this.provider && this.vectorStore) {
55
+ try {
56
+ const embedding = await this.provider.embed(content);
57
+ this.vectorStore.insert(id, embedding, type, content);
58
+ return embedding;
59
+ }
60
+ catch (error) {
61
+ console.error(`Failed to generate embedding for ${id}:`, error);
62
+ // Fall through to return undefined - BM25 is still available
63
+ }
64
+ }
65
+ return undefined;
66
+ }
67
+ /**
68
+ * Store multiple items with embeddings (batch)
69
+ * More efficient than calling store() multiple times
70
+ */
71
+ async storeBatch(items) {
72
+ const results = new Map();
73
+ // Add all to BM25 index
74
+ for (const item of items) {
75
+ this.bm25Index.add(item.id, item.content, item.type);
76
+ }
77
+ // Batch embed if provider available
78
+ if (this.useVectorSearch && this.provider && this.vectorStore) {
79
+ try {
80
+ const contents = items.map((i) => i.content);
81
+ const embeddings = await this.provider.embedBatch(contents);
82
+ const batchItems = items.map((item, i) => ({
83
+ id: item.id,
84
+ embedding: embeddings[i],
85
+ type: item.type,
86
+ content: item.content,
87
+ }));
88
+ this.vectorStore.insertBatch(batchItems);
89
+ for (let i = 0; i < items.length; i++) {
90
+ results.set(items[i].id, embeddings[i]);
91
+ }
92
+ }
93
+ catch (error) {
94
+ console.error('Failed to generate batch embeddings:', error);
95
+ // Fall through - items are still in BM25 index
96
+ for (const item of items) {
97
+ results.set(item.id, undefined);
98
+ }
99
+ }
100
+ }
101
+ else {
102
+ for (const item of items) {
103
+ results.set(item.id, undefined);
104
+ }
105
+ }
106
+ return results;
107
+ }
108
+ /**
109
+ * Search for similar items
110
+ * Uses vector search if available, falls back to BM25
111
+ */
112
+ async search(query, options = {}) {
113
+ // Use vector search if available
114
+ if (this.useVectorSearch && this.provider && this.vectorStore) {
115
+ try {
116
+ const queryEmbedding = await this.provider.embed(query);
117
+ const results = this.vectorStore.search(queryEmbedding, options);
118
+ return results.map((r) => ({
119
+ id: r.id,
120
+ score: r.score,
121
+ content: r.content,
122
+ }));
123
+ }
124
+ catch (error) {
125
+ console.error('Vector search failed, falling back to BM25:', error);
126
+ // Fall through to BM25
127
+ }
128
+ }
129
+ // Fallback to BM25
130
+ return this.bm25Index.search(query, options);
131
+ }
132
+ /**
133
+ * Search using a pre-computed embedding
134
+ * Only works if vector store is available
135
+ */
136
+ searchByEmbedding(embedding, options = {}) {
137
+ if (!this.vectorStore) {
138
+ return null;
139
+ }
140
+ const results = this.vectorStore.search(embedding, options);
141
+ return results.map((r) => ({
142
+ id: r.id,
143
+ score: r.score,
144
+ content: r.content,
145
+ }));
146
+ }
147
+ /**
148
+ * Generate an embedding without storing it
149
+ */
150
+ async embed(text) {
151
+ if (!this.provider) {
152
+ return null;
153
+ }
154
+ try {
155
+ return await this.provider.embed(text);
156
+ }
157
+ catch (error) {
158
+ console.error('Failed to generate embedding:', error);
159
+ return null;
160
+ }
161
+ }
162
+ /**
163
+ * Generate embeddings for multiple texts without storing
164
+ */
165
+ async embedBatch(texts) {
166
+ if (!this.provider) {
167
+ return null;
168
+ }
169
+ try {
170
+ return await this.provider.embedBatch(texts);
171
+ }
172
+ catch (error) {
173
+ console.error('Failed to generate batch embeddings:', error);
174
+ return null;
175
+ }
176
+ }
177
+ /**
178
+ * Remove an item from all indexes
179
+ */
180
+ remove(id) {
181
+ this.bm25Index.remove(id);
182
+ this.vectorStore?.delete(id);
183
+ }
184
+ /**
185
+ * Check if an item exists
186
+ */
187
+ has(id) {
188
+ return this.bm25Index.has(id);
189
+ }
190
+ /**
191
+ * Get statistics about the indexes
192
+ */
193
+ getStats() {
194
+ return {
195
+ bm25Count: this.bm25Index.size,
196
+ vectorCount: this.vectorStore?.count ?? null,
197
+ hasVectorSearch: this.hasVectorSearch,
198
+ dimension: this.dimension,
199
+ providerName: this.provider?.name ?? null,
200
+ };
201
+ }
202
+ /**
203
+ * Close all resources
204
+ */
205
+ close() {
206
+ this.vectorStore?.close();
207
+ }
208
+ }
209
+ /**
210
+ * Create an embedding manager
211
+ */
212
+ export function createEmbeddingManager(options) {
213
+ return new EmbeddingManager(options);
214
+ }
215
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/embeddings/manager.ts"],"names":[],"mappings":"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"}