bikky 0.3.1 → 0.3.3

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 (342) hide show
  1. package/README.md +124 -35
  2. package/dist/cli.d.ts +1 -0
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +7 -1
  5. package/dist/cli.js.map +1 -1
  6. package/dist/config.d.ts +22 -3
  7. package/dist/config.d.ts.map +1 -1
  8. package/dist/config.js +61 -6
  9. package/dist/config.js.map +1 -1
  10. package/dist/config.test.js +17 -9
  11. package/dist/config.test.js.map +1 -1
  12. package/dist/daemon/capture-policy.d.ts +95 -0
  13. package/dist/daemon/capture-policy.d.ts.map +1 -0
  14. package/dist/daemon/capture-policy.js +139 -0
  15. package/dist/daemon/capture-policy.js.map +1 -0
  16. package/dist/daemon/capture-policy.test.d.ts +2 -0
  17. package/dist/daemon/capture-policy.test.d.ts.map +1 -0
  18. package/dist/daemon/capture-policy.test.js +46 -0
  19. package/dist/daemon/capture-policy.test.js.map +1 -0
  20. package/dist/daemon/consolidation.d.ts.map +1 -1
  21. package/dist/daemon/consolidation.js +84 -98
  22. package/dist/daemon/consolidation.js.map +1 -1
  23. package/dist/daemon/episode-summary.d.ts +72 -0
  24. package/dist/daemon/episode-summary.d.ts.map +1 -0
  25. package/dist/daemon/episode-summary.js +208 -0
  26. package/dist/daemon/episode-summary.js.map +1 -0
  27. package/dist/daemon/episode-summary.test.d.ts +2 -0
  28. package/dist/daemon/episode-summary.test.d.ts.map +1 -0
  29. package/dist/daemon/episode-summary.test.js +101 -0
  30. package/dist/daemon/episode-summary.test.js.map +1 -0
  31. package/dist/daemon/extraction.d.ts +25 -0
  32. package/dist/daemon/extraction.d.ts.map +1 -1
  33. package/dist/daemon/extraction.js +244 -124
  34. package/dist/daemon/extraction.js.map +1 -1
  35. package/dist/daemon/extraction.test.d.ts +2 -0
  36. package/dist/daemon/extraction.test.d.ts.map +1 -0
  37. package/dist/daemon/extraction.test.js +106 -0
  38. package/dist/daemon/extraction.test.js.map +1 -0
  39. package/dist/daemon/loop.d.ts.map +1 -1
  40. package/dist/daemon/loop.js +8 -6
  41. package/dist/daemon/loop.js.map +1 -1
  42. package/dist/daemon/qdrant.d.ts +59 -8
  43. package/dist/daemon/qdrant.d.ts.map +1 -1
  44. package/dist/daemon/qdrant.js +74 -23
  45. package/dist/daemon/qdrant.js.map +1 -1
  46. package/dist/daemon/qdrant.test.js +2 -2
  47. package/dist/daemon/qdrant.test.js.map +1 -1
  48. package/dist/daemon/relations.d.ts +6 -1
  49. package/dist/daemon/relations.d.ts.map +1 -1
  50. package/dist/daemon/relations.js +44 -63
  51. package/dist/daemon/relations.js.map +1 -1
  52. package/dist/daemon/session-index.d.ts +60 -0
  53. package/dist/daemon/session-index.d.ts.map +1 -0
  54. package/dist/daemon/session-index.js +136 -0
  55. package/dist/daemon/session-index.js.map +1 -0
  56. package/dist/daemon/session-index.test.d.ts +2 -0
  57. package/dist/daemon/session-index.test.d.ts.map +1 -0
  58. package/dist/daemon/session-index.test.js +54 -0
  59. package/dist/daemon/session-index.test.js.map +1 -0
  60. package/dist/daemon/session-summary.d.ts +69 -0
  61. package/dist/daemon/session-summary.d.ts.map +1 -0
  62. package/dist/daemon/session-summary.js +200 -0
  63. package/dist/daemon/session-summary.js.map +1 -0
  64. package/dist/daemon/session-summary.test.d.ts +2 -0
  65. package/dist/daemon/session-summary.test.d.ts.map +1 -0
  66. package/dist/daemon/session-summary.test.js +160 -0
  67. package/dist/daemon/session-summary.test.js.map +1 -0
  68. package/dist/daemon/staleness.test.d.ts +7 -0
  69. package/dist/daemon/staleness.test.d.ts.map +1 -0
  70. package/dist/daemon/staleness.test.js +128 -0
  71. package/dist/daemon/staleness.test.js.map +1 -0
  72. package/dist/daemon/workstream-summary.d.ts +61 -0
  73. package/dist/daemon/workstream-summary.d.ts.map +1 -0
  74. package/dist/daemon/workstream-summary.js +220 -0
  75. package/dist/daemon/workstream-summary.js.map +1 -0
  76. package/dist/daemon/workstream-summary.test.d.ts +2 -0
  77. package/dist/daemon/workstream-summary.test.d.ts.map +1 -0
  78. package/dist/daemon/workstream-summary.test.js +86 -0
  79. package/dist/daemon/workstream-summary.test.js.map +1 -0
  80. package/dist/lib/qdrant-client.d.ts +6 -1
  81. package/dist/lib/qdrant-client.d.ts.map +1 -1
  82. package/dist/lib/qdrant-client.js +3 -4
  83. package/dist/lib/qdrant-client.js.map +1 -1
  84. package/dist/lib/qdrant-client.test.js +21 -2
  85. package/dist/lib/qdrant-client.test.js.map +1 -1
  86. package/dist/lifecycle.test.d.ts +8 -0
  87. package/dist/lifecycle.test.d.ts.map +1 -0
  88. package/dist/lifecycle.test.js +74 -0
  89. package/dist/lifecycle.test.js.map +1 -0
  90. package/dist/llm/embedding/index.d.ts +42 -0
  91. package/dist/llm/embedding/index.d.ts.map +1 -0
  92. package/dist/llm/embedding/index.js +78 -0
  93. package/dist/llm/embedding/index.js.map +1 -0
  94. package/dist/llm/embedding/index.test.d.ts +8 -0
  95. package/dist/llm/embedding/index.test.d.ts.map +1 -0
  96. package/dist/llm/embedding/index.test.js +100 -0
  97. package/dist/llm/embedding/index.test.js.map +1 -0
  98. package/dist/llm/embedding/providers/bedrock.d.ts +16 -0
  99. package/dist/llm/embedding/providers/bedrock.d.ts.map +1 -0
  100. package/dist/llm/embedding/providers/bedrock.js +90 -0
  101. package/dist/llm/embedding/providers/bedrock.js.map +1 -0
  102. package/dist/llm/embedding/providers/bedrock.test.d.ts +2 -0
  103. package/dist/llm/embedding/providers/bedrock.test.d.ts.map +1 -0
  104. package/dist/llm/embedding/providers/bedrock.test.js +24 -0
  105. package/dist/llm/embedding/providers/bedrock.test.js.map +1 -0
  106. package/dist/llm/embedding/providers/index.d.ts +9 -0
  107. package/dist/llm/embedding/providers/index.d.ts.map +1 -0
  108. package/dist/llm/embedding/providers/index.js +9 -0
  109. package/dist/llm/embedding/providers/index.js.map +1 -0
  110. package/dist/llm/embedding/providers/ollama.d.ts +6 -0
  111. package/dist/llm/embedding/providers/ollama.d.ts.map +1 -0
  112. package/dist/llm/embedding/providers/ollama.js +39 -0
  113. package/dist/llm/embedding/providers/ollama.js.map +1 -0
  114. package/dist/llm/embedding/providers/ollama.test.d.ts +2 -0
  115. package/dist/llm/embedding/providers/ollama.test.d.ts.map +1 -0
  116. package/dist/llm/embedding/providers/ollama.test.js +54 -0
  117. package/dist/llm/embedding/providers/ollama.test.js.map +1 -0
  118. package/dist/llm/embedding/providers/openai.d.ts +6 -0
  119. package/dist/llm/embedding/providers/openai.d.ts.map +1 -0
  120. package/dist/llm/embedding/providers/openai.js +44 -0
  121. package/dist/llm/embedding/providers/openai.js.map +1 -0
  122. package/dist/llm/embedding/providers/openai.test.d.ts +2 -0
  123. package/dist/llm/embedding/providers/openai.test.d.ts.map +1 -0
  124. package/dist/llm/embedding/providers/openai.test.js +48 -0
  125. package/dist/llm/embedding/providers/openai.test.js.map +1 -0
  126. package/dist/llm/embedding/providers/portkey.d.ts +15 -0
  127. package/dist/llm/embedding/providers/portkey.d.ts.map +1 -0
  128. package/dist/llm/embedding/providers/portkey.js +58 -0
  129. package/dist/llm/embedding/providers/portkey.js.map +1 -0
  130. package/dist/llm/embedding/providers/portkey.test.d.ts +2 -0
  131. package/dist/llm/embedding/providers/portkey.test.d.ts.map +1 -0
  132. package/dist/llm/embedding/providers/portkey.test.js +56 -0
  133. package/dist/llm/embedding/providers/portkey.test.js.map +1 -0
  134. package/dist/llm/embedding/registry.d.ts +14 -0
  135. package/dist/llm/embedding/registry.d.ts.map +1 -0
  136. package/dist/llm/embedding/registry.js +27 -0
  137. package/dist/llm/embedding/registry.js.map +1 -0
  138. package/dist/llm/embedding/registry.test.d.ts +7 -0
  139. package/dist/llm/embedding/registry.test.d.ts.map +1 -0
  140. package/dist/llm/embedding/registry.test.js +68 -0
  141. package/dist/llm/embedding/registry.test.js.map +1 -0
  142. package/dist/llm/embedding/types.d.ts +55 -0
  143. package/dist/llm/embedding/types.d.ts.map +1 -0
  144. package/dist/llm/embedding/types.js +12 -0
  145. package/dist/llm/embedding/types.js.map +1 -0
  146. package/dist/llm/errors.d.ts +95 -0
  147. package/dist/llm/errors.d.ts.map +1 -0
  148. package/dist/llm/errors.js +164 -0
  149. package/dist/llm/errors.js.map +1 -0
  150. package/dist/llm/errors.test.d.ts +2 -0
  151. package/dist/llm/errors.test.d.ts.map +1 -0
  152. package/dist/llm/errors.test.js +103 -0
  153. package/dist/llm/errors.test.js.map +1 -0
  154. package/dist/llm/fetch.d.ts +39 -0
  155. package/dist/llm/fetch.d.ts.map +1 -0
  156. package/dist/llm/fetch.js +52 -0
  157. package/dist/llm/fetch.js.map +1 -0
  158. package/dist/llm/index.d.ts +6 -3
  159. package/dist/llm/index.d.ts.map +1 -1
  160. package/dist/llm/index.js +2 -2
  161. package/dist/llm/index.js.map +1 -1
  162. package/dist/llm/inference/index.d.ts +39 -0
  163. package/dist/llm/inference/index.d.ts.map +1 -0
  164. package/dist/llm/inference/index.js +118 -0
  165. package/dist/llm/inference/index.js.map +1 -0
  166. package/dist/llm/inference/index.test.d.ts +6 -0
  167. package/dist/llm/inference/index.test.d.ts.map +1 -0
  168. package/dist/llm/inference/index.test.js +109 -0
  169. package/dist/llm/inference/index.test.js.map +1 -0
  170. package/dist/llm/inference/providers/bedrock.d.ts +18 -0
  171. package/dist/llm/inference/providers/bedrock.d.ts.map +1 -0
  172. package/dist/llm/inference/providers/bedrock.js +105 -0
  173. package/dist/llm/inference/providers/bedrock.js.map +1 -0
  174. package/dist/llm/inference/providers/bedrock.test.d.ts +2 -0
  175. package/dist/llm/inference/providers/bedrock.test.d.ts.map +1 -0
  176. package/dist/llm/inference/providers/bedrock.test.js +21 -0
  177. package/dist/llm/inference/providers/bedrock.test.js.map +1 -0
  178. package/dist/llm/inference/providers/index.d.ts +10 -0
  179. package/dist/llm/inference/providers/index.d.ts.map +1 -0
  180. package/dist/llm/inference/providers/index.js +10 -0
  181. package/dist/llm/inference/providers/index.js.map +1 -0
  182. package/dist/llm/inference/providers/ollama.d.ts +8 -0
  183. package/dist/llm/inference/providers/ollama.d.ts.map +1 -0
  184. package/dist/llm/inference/providers/ollama.js +63 -0
  185. package/dist/llm/inference/providers/ollama.js.map +1 -0
  186. package/dist/llm/inference/providers/ollama.test.d.ts +2 -0
  187. package/dist/llm/inference/providers/ollama.test.d.ts.map +1 -0
  188. package/dist/llm/inference/providers/ollama.test.js +57 -0
  189. package/dist/llm/inference/providers/ollama.test.js.map +1 -0
  190. package/dist/llm/inference/providers/openai.d.ts +11 -0
  191. package/dist/llm/inference/providers/openai.d.ts.map +1 -0
  192. package/dist/llm/inference/providers/openai.js +73 -0
  193. package/dist/llm/inference/providers/openai.js.map +1 -0
  194. package/dist/llm/inference/providers/openai.test.d.ts +2 -0
  195. package/dist/llm/inference/providers/openai.test.d.ts.map +1 -0
  196. package/dist/llm/inference/providers/openai.test.js +46 -0
  197. package/dist/llm/inference/providers/openai.test.js.map +1 -0
  198. package/dist/llm/inference/providers/portkey.d.ts +13 -0
  199. package/dist/llm/inference/providers/portkey.d.ts.map +1 -0
  200. package/dist/llm/inference/providers/portkey.js +80 -0
  201. package/dist/llm/inference/providers/portkey.js.map +1 -0
  202. package/dist/llm/inference/providers/portkey.test.d.ts +2 -0
  203. package/dist/llm/inference/providers/portkey.test.d.ts.map +1 -0
  204. package/dist/llm/inference/providers/portkey.test.js +48 -0
  205. package/dist/llm/inference/providers/portkey.test.js.map +1 -0
  206. package/dist/llm/inference/registry.d.ts +15 -0
  207. package/dist/llm/inference/registry.d.ts.map +1 -0
  208. package/dist/llm/inference/registry.js +28 -0
  209. package/dist/llm/inference/registry.js.map +1 -0
  210. package/dist/llm/inference/registry.test.d.ts +6 -0
  211. package/dist/llm/inference/registry.test.d.ts.map +1 -0
  212. package/dist/llm/inference/registry.test.js +63 -0
  213. package/dist/llm/inference/registry.test.js.map +1 -0
  214. package/dist/llm/inference/types.d.ts +84 -0
  215. package/dist/llm/inference/types.d.ts.map +1 -0
  216. package/dist/llm/inference/types.js +9 -0
  217. package/dist/llm/inference/types.js.map +1 -0
  218. package/dist/llm/telemetry.d.ts +25 -0
  219. package/dist/llm/telemetry.d.ts.map +1 -0
  220. package/dist/llm/telemetry.js +43 -0
  221. package/dist/llm/telemetry.js.map +1 -0
  222. package/dist/llm/telemetry.test.d.ts +5 -0
  223. package/dist/llm/telemetry.test.d.ts.map +1 -0
  224. package/dist/llm/telemetry.test.js +89 -0
  225. package/dist/llm/telemetry.test.js.map +1 -0
  226. package/dist/llm/types.d.ts +4 -37
  227. package/dist/llm/types.d.ts.map +1 -1
  228. package/dist/llm/types.js +4 -1
  229. package/dist/llm/types.js.map +1 -1
  230. package/dist/logger.d.ts +18 -3
  231. package/dist/logger.d.ts.map +1 -1
  232. package/dist/logger.js +102 -20
  233. package/dist/logger.js.map +1 -1
  234. package/dist/logger.test.d.ts +5 -0
  235. package/dist/logger.test.d.ts.map +1 -0
  236. package/dist/logger.test.js +103 -0
  237. package/dist/logger.test.js.map +1 -0
  238. package/dist/mcp/api.d.ts +15 -1
  239. package/dist/mcp/api.d.ts.map +1 -1
  240. package/dist/mcp/api.js +44 -19
  241. package/dist/mcp/api.js.map +1 -1
  242. package/dist/mcp/api.test.d.ts +6 -0
  243. package/dist/mcp/api.test.d.ts.map +1 -0
  244. package/dist/mcp/api.test.js +130 -0
  245. package/dist/mcp/api.test.js.map +1 -0
  246. package/dist/mcp/helpers.d.ts +1 -0
  247. package/dist/mcp/helpers.d.ts.map +1 -1
  248. package/dist/mcp/helpers.js +62 -6
  249. package/dist/mcp/helpers.js.map +1 -1
  250. package/dist/mcp/helpers.test.js +71 -10
  251. package/dist/mcp/helpers.test.js.map +1 -1
  252. package/dist/mcp/index.d.ts +7 -1
  253. package/dist/mcp/index.d.ts.map +1 -1
  254. package/dist/mcp/index.js +46 -21
  255. package/dist/mcp/index.js.map +1 -1
  256. package/dist/mcp/taxonomy.d.ts +251 -31
  257. package/dist/mcp/taxonomy.d.ts.map +1 -1
  258. package/dist/mcp/taxonomy.js +603 -171
  259. package/dist/mcp/taxonomy.js.map +1 -1
  260. package/dist/mcp/taxonomy.test.d.ts +1 -1
  261. package/dist/mcp/taxonomy.test.js +141 -302
  262. package/dist/mcp/taxonomy.test.js.map +1 -1
  263. package/dist/mcp/tools.d.ts +1 -1
  264. package/dist/mcp/tools.d.ts.map +1 -1
  265. package/dist/mcp/tools.integration.itest.d.ts +23 -0
  266. package/dist/mcp/tools.integration.itest.d.ts.map +1 -0
  267. package/dist/mcp/tools.integration.itest.js +172 -0
  268. package/dist/mcp/tools.integration.itest.js.map +1 -0
  269. package/dist/mcp/tools.js +422 -357
  270. package/dist/mcp/tools.js.map +1 -1
  271. package/dist/mcp/tools.test.d.ts +16 -0
  272. package/dist/mcp/tools.test.d.ts.map +1 -0
  273. package/dist/mcp/tools.test.js +472 -0
  274. package/dist/mcp/tools.test.js.map +1 -0
  275. package/dist/mcp/types.d.ts +63 -8
  276. package/dist/mcp/types.d.ts.map +1 -1
  277. package/dist/prompts/brief.d.ts +19 -0
  278. package/dist/prompts/brief.d.ts.map +1 -0
  279. package/dist/prompts/brief.js +67 -0
  280. package/dist/prompts/brief.js.map +1 -0
  281. package/dist/prompts/contradiction.d.ts +24 -0
  282. package/dist/prompts/contradiction.d.ts.map +1 -0
  283. package/dist/prompts/contradiction.js +73 -0
  284. package/dist/prompts/contradiction.js.map +1 -0
  285. package/dist/prompts/distill.d.ts +21 -0
  286. package/dist/prompts/distill.d.ts.map +1 -0
  287. package/dist/prompts/distill.js +92 -0
  288. package/dist/prompts/distill.js.map +1 -0
  289. package/dist/prompts/episode-summary.d.ts +15 -0
  290. package/dist/prompts/episode-summary.d.ts.map +1 -0
  291. package/dist/prompts/episode-summary.js +60 -0
  292. package/dist/prompts/episode-summary.js.map +1 -0
  293. package/dist/prompts/extraction.d.ts +14 -0
  294. package/dist/prompts/extraction.d.ts.map +1 -0
  295. package/dist/prompts/extraction.js +110 -0
  296. package/dist/prompts/extraction.js.map +1 -0
  297. package/dist/prompts/index.d.ts +52 -0
  298. package/dist/prompts/index.d.ts.map +1 -0
  299. package/dist/prompts/index.js +104 -0
  300. package/dist/prompts/index.js.map +1 -0
  301. package/dist/prompts/prompts.test.d.ts +8 -0
  302. package/dist/prompts/prompts.test.d.ts.map +1 -0
  303. package/dist/prompts/prompts.test.js +140 -0
  304. package/dist/prompts/prompts.test.js.map +1 -0
  305. package/dist/prompts/relations.d.ts +17 -0
  306. package/dist/prompts/relations.d.ts.map +1 -0
  307. package/dist/prompts/relations.js +72 -0
  308. package/dist/prompts/relations.js.map +1 -0
  309. package/dist/prompts/workstream-summary.d.ts +17 -0
  310. package/dist/prompts/workstream-summary.d.ts.map +1 -0
  311. package/dist/prompts/workstream-summary.js +72 -0
  312. package/dist/prompts/workstream-summary.js.map +1 -0
  313. package/dist/render.d.ts +41 -0
  314. package/dist/render.d.ts.map +1 -0
  315. package/dist/render.js +185 -0
  316. package/dist/render.js.map +1 -0
  317. package/dist/render.test.d.ts +8 -0
  318. package/dist/render.test.d.ts.map +1 -0
  319. package/dist/render.test.js +243 -0
  320. package/dist/render.test.js.map +1 -0
  321. package/docs/diagrams/architecture.svg +87 -0
  322. package/docs/diagrams/team-memory.svg +250 -0
  323. package/docs/screenshots/dashboard.png +0 -0
  324. package/docs/screenshots/graph.png +0 -0
  325. package/docs/screenshots/memory.png +0 -0
  326. package/package.json +12 -3
  327. package/dist/llm/embedding.d.ts +0 -13
  328. package/dist/llm/embedding.d.ts.map +0 -1
  329. package/dist/llm/embedding.js +0 -127
  330. package/dist/llm/embedding.js.map +0 -1
  331. package/dist/llm/embedding.test.d.ts +0 -8
  332. package/dist/llm/embedding.test.d.ts.map +0 -1
  333. package/dist/llm/embedding.test.js +0 -117
  334. package/dist/llm/embedding.test.js.map +0 -1
  335. package/dist/llm/inference.d.ts +0 -12
  336. package/dist/llm/inference.d.ts.map +0 -1
  337. package/dist/llm/inference.js +0 -146
  338. package/dist/llm/inference.js.map +0 -1
  339. package/dist/llm/inference.test.d.ts +0 -8
  340. package/dist/llm/inference.test.d.ts.map +0 -1
  341. package/dist/llm/inference.test.js +0 -117
  342. package/dist/llm/inference.test.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"embedding.d.ts","sourceRoot":"","sources":["../../src/llm/embedding.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAkD1D,wBAAgB,aAAa,CAAC,SAAS,GAAE,OAAO,CAAC,uBAAuB,CAAM,GAAG,uBAAuB,CAoBvG;AAMD,wBAAgB,kBAAkB,IAAI,uBAAuB,CAG5D;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAG/C;AAMD,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA2B3D"}
@@ -1,127 +0,0 @@
1
- /**
2
- * Embedding provider — config-driven, supports Ollama (default), OpenAI, and Bedrock.
3
- *
4
- * Ollama uses the OpenAI-compatible /v1/embeddings HTTP format.
5
- * OpenAI uses the same /v1/embeddings format with an API key.
6
- * Bedrock uses AWS SDK with Titan Embed V2.
7
- */
8
- import { BedrockRuntimeClient, InvokeModelCommand, } from "@aws-sdk/client-bedrock-runtime";
9
- // ---------------------------------------------------------------------------
10
- // Provider defaults
11
- // ---------------------------------------------------------------------------
12
- const PROVIDER_DEFAULTS = {
13
- ollama: {
14
- provider: "ollama",
15
- baseUrl: "http://localhost:11434",
16
- model: "qwen3-embedding:0.6b",
17
- dimensions: 1024,
18
- },
19
- openai: {
20
- provider: "openai",
21
- baseUrl: "https://api.openai.com",
22
- model: "text-embedding-3-small",
23
- dimensions: 1536,
24
- },
25
- bedrock: {
26
- provider: "bedrock",
27
- baseUrl: "",
28
- model: "amazon.titan-embed-text-v2:0",
29
- dimensions: 1024,
30
- },
31
- };
32
- // ---------------------------------------------------------------------------
33
- // State
34
- // ---------------------------------------------------------------------------
35
- let config = null;
36
- let bedrockClient = null;
37
- // ---------------------------------------------------------------------------
38
- // Init
39
- // ---------------------------------------------------------------------------
40
- export function initEmbedding(overrides = {}) {
41
- const provider = overrides.provider ?? "ollama";
42
- const defaults = PROVIDER_DEFAULTS[provider] ?? PROVIDER_DEFAULTS.ollama;
43
- config = {
44
- provider,
45
- baseUrl: (overrides.baseUrl ?? defaults.baseUrl).replace(/\/+$/, ""),
46
- model: overrides.model ?? defaults.model,
47
- dimensions: overrides.dimensions ?? defaults.dimensions,
48
- apiKey: overrides.apiKey ?? null,
49
- };
50
- if (provider === "bedrock") {
51
- const region = process.env.AWS_BEDROCK_REGION ?? process.env.AWS_REGION ?? "us-east-1";
52
- // Let the AWS SDK resolve credentials via its default chain:
53
- // env vars → shared credentials file → SSO → IAM role
54
- bedrockClient = new BedrockRuntimeClient({ region });
55
- }
56
- return config;
57
- }
58
- // ---------------------------------------------------------------------------
59
- // Accessors
60
- // ---------------------------------------------------------------------------
61
- export function getEmbeddingConfig() {
62
- if (!config)
63
- throw new Error("Embedding not initialized — call initEmbedding() first");
64
- return config;
65
- }
66
- export function getEmbeddingDimensions() {
67
- if (!config)
68
- throw new Error("Embedding not initialized — call initEmbedding() first");
69
- return config.dimensions;
70
- }
71
- // ---------------------------------------------------------------------------
72
- // Embed
73
- // ---------------------------------------------------------------------------
74
- export async function embed(text) {
75
- if (!config)
76
- throw new Error("Embedding not initialized — call initEmbedding() first");
77
- if (!text?.trim())
78
- throw new Error("embed() called with empty text");
79
- if (config.provider === "bedrock")
80
- return bedrockEmbed(text);
81
- // Ollama and OpenAI both use OpenAI-compatible /v1/embeddings
82
- const headers = { "Content-Type": "application/json" };
83
- if (config.provider === "openai" && config.apiKey) {
84
- headers["Authorization"] = `Bearer ${config.apiKey}`;
85
- }
86
- const resp = await fetch(`${config.baseUrl}/v1/embeddings`, {
87
- method: "POST",
88
- headers,
89
- body: JSON.stringify({ model: config.model, input: text }),
90
- });
91
- if (!resp.ok) {
92
- const body = await resp.text().catch(() => "");
93
- throw new Error(`Embedding failed [${config.provider}/${config.model}] (${resp.status}): ${body.slice(0, 200)}`);
94
- }
95
- const data = (await resp.json());
96
- const first = data.data[0];
97
- if (!first)
98
- throw new Error(`Embedding response from ${config.provider} missing data`);
99
- return first.embedding;
100
- }
101
- // ---------------------------------------------------------------------------
102
- // Bedrock Embed (Titan Embed V2)
103
- // ---------------------------------------------------------------------------
104
- async function bedrockEmbed(text) {
105
- if (!bedrockClient) {
106
- const region = process.env.AWS_BEDROCK_REGION ?? process.env.AWS_REGION ?? "us-east-1";
107
- bedrockClient = new BedrockRuntimeClient({ region });
108
- }
109
- const payload = JSON.stringify({
110
- inputText: text,
111
- dimensions: config.dimensions,
112
- normalize: true,
113
- });
114
- const command = new InvokeModelCommand({
115
- modelId: config.model,
116
- contentType: "application/json",
117
- accept: "application/json",
118
- body: new TextEncoder().encode(payload),
119
- });
120
- const resp = await bedrockClient.send(command);
121
- const raw = JSON.parse(new TextDecoder().decode(resp.body));
122
- if (!raw.embedding) {
123
- throw new Error(`Bedrock embedding response missing data (model: ${config.model})`);
124
- }
125
- return raw.embedding;
126
- }
127
- //# sourceMappingURL=embedding.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"embedding.js","sourceRoot":"","sources":["../../src/llm/embedding.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- /**
2
- * Tests for the embedding module.
3
- *
4
- * These tests verify initialization and config, NOT actual embedding calls
5
- * (which require a live Ollama/OpenAI/Bedrock service).
6
- */
7
- export {};
8
- //# sourceMappingURL=embedding.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"embedding.test.d.ts","sourceRoot":"","sources":["../../src/llm/embedding.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -1,117 +0,0 @@
1
- /**
2
- * Tests for the embedding module.
3
- *
4
- * These tests verify initialization and config, NOT actual embedding calls
5
- * (which require a live Ollama/OpenAI/Bedrock service).
6
- */
7
- import { describe, it, beforeEach } from "node:test";
8
- import assert from "node:assert/strict";
9
- import { initEmbedding, getEmbeddingConfig, getEmbeddingDimensions, embed, } from "./embedding.js";
10
- // ---------------------------------------------------------------------------
11
- // initEmbedding
12
- // ---------------------------------------------------------------------------
13
- describe("initEmbedding", () => {
14
- it("returns config with ollama defaults when called with no args", () => {
15
- const cfg = initEmbedding();
16
- assert.strictEqual(cfg.provider, "ollama");
17
- assert.strictEqual(cfg.model, "qwen3-embedding:0.6b");
18
- assert.strictEqual(cfg.dimensions, 1024);
19
- assert.strictEqual(cfg.baseUrl, "http://localhost:11434");
20
- assert.strictEqual(cfg.apiKey, null);
21
- });
22
- it("accepts ollama provider with overrides", () => {
23
- const cfg = initEmbedding({
24
- provider: "ollama",
25
- model: "nomic-embed-text",
26
- dimensions: 768,
27
- baseUrl: "http://custom:11434",
28
- });
29
- assert.strictEqual(cfg.provider, "ollama");
30
- assert.strictEqual(cfg.model, "nomic-embed-text");
31
- assert.strictEqual(cfg.dimensions, 768);
32
- assert.strictEqual(cfg.baseUrl, "http://custom:11434");
33
- });
34
- it("accepts openai provider", () => {
35
- const cfg = initEmbedding({
36
- provider: "openai",
37
- apiKey: "sk-test-key",
38
- });
39
- assert.strictEqual(cfg.provider, "openai");
40
- assert.strictEqual(cfg.model, "text-embedding-3-small");
41
- assert.strictEqual(cfg.dimensions, 1536);
42
- assert.strictEqual(cfg.baseUrl, "https://api.openai.com");
43
- assert.strictEqual(cfg.apiKey, "sk-test-key");
44
- });
45
- it("accepts bedrock provider", () => {
46
- const cfg = initEmbedding({ provider: "bedrock" });
47
- assert.strictEqual(cfg.provider, "bedrock");
48
- assert.strictEqual(cfg.model, "amazon.titan-embed-text-v2:0");
49
- assert.strictEqual(cfg.dimensions, 1024);
50
- });
51
- it("strips trailing slashes from baseUrl", () => {
52
- const cfg = initEmbedding({
53
- provider: "ollama",
54
- baseUrl: "http://localhost:11434///",
55
- });
56
- assert.strictEqual(cfg.baseUrl, "http://localhost:11434");
57
- });
58
- it("defaults apiKey to null when not provided", () => {
59
- const cfg = initEmbedding({ provider: "ollama" });
60
- assert.strictEqual(cfg.apiKey, null);
61
- });
62
- });
63
- // ---------------------------------------------------------------------------
64
- // getEmbeddingConfig
65
- // ---------------------------------------------------------------------------
66
- describe("getEmbeddingConfig", () => {
67
- it("returns the initialized config", () => {
68
- const init = initEmbedding({ provider: "openai", apiKey: "key-123" });
69
- const retrieved = getEmbeddingConfig();
70
- assert.deepStrictEqual(retrieved, init);
71
- });
72
- it("returns same object after init", () => {
73
- initEmbedding({ provider: "ollama" });
74
- const cfg = getEmbeddingConfig();
75
- assert.strictEqual(cfg.provider, "ollama");
76
- });
77
- });
78
- // ---------------------------------------------------------------------------
79
- // getEmbeddingDimensions
80
- // ---------------------------------------------------------------------------
81
- describe("getEmbeddingDimensions", () => {
82
- it("returns dimensions from initialized config", () => {
83
- initEmbedding({ provider: "ollama", dimensions: 512 });
84
- assert.strictEqual(getEmbeddingDimensions(), 512);
85
- });
86
- it("returns openai default dimensions", () => {
87
- initEmbedding({ provider: "openai" });
88
- assert.strictEqual(getEmbeddingDimensions(), 1536);
89
- });
90
- });
91
- // ---------------------------------------------------------------------------
92
- // embed — error cases only (no live service calls)
93
- // ---------------------------------------------------------------------------
94
- describe("embed", () => {
95
- beforeEach(() => {
96
- // Ensure we're initialized but pointing to a non-existent server
97
- initEmbedding({
98
- provider: "ollama",
99
- baseUrl: "http://localhost:99999", // nothing listening
100
- });
101
- });
102
- it("throws on empty text", async () => {
103
- await assert.rejects(() => embed(""), {
104
- message: /empty text/,
105
- });
106
- });
107
- it("throws on whitespace-only text", async () => {
108
- await assert.rejects(() => embed(" "), {
109
- message: /empty text/,
110
- });
111
- });
112
- it("throws/rejects when service is unreachable", async () => {
113
- // This will fail to connect — we just verify it throws, not the exact message
114
- await assert.rejects(() => embed("test content"));
115
- });
116
- });
117
- //# sourceMappingURL=embedding.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"embedding.test.js","sourceRoot":"","sources":["../../src/llm/embedding.test.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- /**
2
- * Unified LLM chat-completion client.
3
- * Routes to Ollama (default), OpenAI, or Bedrock based on config.
4
- * Ollama → Bedrock fallback when Ollama is primary and fails.
5
- */
6
- import type { InferenceProviderConfig, ChatCompletionOpts, LogFn } from "./types.js";
7
- export declare function initLLM(opts: {
8
- config: InferenceProviderConfig;
9
- logger?: LogFn;
10
- }): void;
11
- export declare function chatCompletion(opts: ChatCompletionOpts): Promise<string | null>;
12
- //# sourceMappingURL=inference.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"inference.d.ts","sourceRoot":"","sources":["../../src/llm/inference.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,OAAO,KAAK,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAQrF,wBAAgB,OAAO,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,uBAAuB,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAA;CAAE,GAAG,IAAI,CAKvF;AAWD,wBAAsB,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAarF"}
@@ -1,146 +0,0 @@
1
- /**
2
- * Unified LLM chat-completion client.
3
- * Routes to Ollama (default), OpenAI, or Bedrock based on config.
4
- * Ollama → Bedrock fallback when Ollama is primary and fails.
5
- */
6
- import { BedrockRuntimeClient, ConverseCommand, } from "@aws-sdk/client-bedrock-runtime";
7
- // ── Module state ─────────────────────────────────────────────────────────────
8
- let cfg = null;
9
- let log = () => { };
10
- let bedrockClient = null;
11
- export function initLLM(opts) {
12
- cfg = opts.config;
13
- if (opts.logger)
14
- log = opts.logger;
15
- if (cfg.provider === "bedrock")
16
- initBedrockClient();
17
- }
18
- function initBedrockClient() {
19
- const region = cfg?.bedrock_region ?? process.env.AWS_BEDROCK_REGION ?? process.env.AWS_REGION ?? "us-east-1";
20
- // Let the AWS SDK resolve credentials via its default chain:
21
- // env vars → shared credentials file → SSO → IAM role
22
- bedrockClient = new BedrockRuntimeClient({ region });
23
- }
24
- // ── Core function ────────────────────────────────────────────────────────────
25
- export async function chatCompletion(opts) {
26
- const provider = cfg?.provider ?? "ollama";
27
- if (provider === "openai")
28
- return openaiCompletion(opts);
29
- if (provider === "ollama") {
30
- const result = await ollamaCompletion(opts);
31
- if (result !== null)
32
- return result;
33
- log("INFO", "LLM: Ollama failed, falling back to Bedrock");
34
- return bedrockCompletion(opts);
35
- }
36
- return bedrockCompletion(opts);
37
- }
38
- // ── Provider implementations ─────────────────────────────────────────────────
39
- async function ollamaCompletion(opts) {
40
- const baseUrl = cfg?.ollama_url ?? "http://localhost:11434";
41
- const model = cfg?.ollama_model ?? "qwen2.5:7b";
42
- const body = {
43
- model,
44
- messages: opts.messages,
45
- temperature: opts.temperature ?? 0.2,
46
- max_tokens: opts.max_tokens ?? 500,
47
- };
48
- if (opts.response_format) {
49
- body.response_format = opts.response_format.type === "json_schema"
50
- ? { type: "json_object" }
51
- : opts.response_format;
52
- }
53
- try {
54
- const resp = await fetch(`${baseUrl}/v1/chat/completions`, {
55
- method: "POST",
56
- headers: { "Content-Type": "application/json" },
57
- body: JSON.stringify(body),
58
- });
59
- if (!resp.ok) {
60
- const err = await resp.text().catch(() => "");
61
- log("WARN", `LLM Ollama error (${resp.status}): ${err.slice(0, 200)}`);
62
- return null;
63
- }
64
- const data = (await resp.json());
65
- return data.choices?.[0]?.message?.content?.trim() ?? null;
66
- }
67
- catch (e) {
68
- log("WARN", `LLM Ollama unreachable: ${e.message}`);
69
- return null;
70
- }
71
- }
72
- async function openaiCompletion(opts) {
73
- const apiKey = cfg?.openai_api_key;
74
- if (!apiKey) {
75
- log("WARN", "LLM OpenAI: no API key");
76
- return null;
77
- }
78
- const model = cfg?.openai_model ?? "gpt-4.1-mini";
79
- const body = {
80
- model,
81
- messages: opts.messages,
82
- temperature: opts.temperature ?? 0.2,
83
- max_tokens: opts.max_tokens ?? 500,
84
- };
85
- if (opts.response_format)
86
- body.response_format = opts.response_format;
87
- try {
88
- const resp = await fetch("https://api.openai.com/v1/chat/completions", {
89
- method: "POST",
90
- headers: {
91
- "Content-Type": "application/json",
92
- "Authorization": `Bearer ${apiKey}`,
93
- },
94
- body: JSON.stringify(body),
95
- });
96
- if (!resp.ok) {
97
- const err = await resp.text().catch(() => "");
98
- log("WARN", `LLM OpenAI error (${resp.status}): ${err.slice(0, 200)}`);
99
- return null;
100
- }
101
- const data = (await resp.json());
102
- return data.choices?.[0]?.message?.content?.trim() ?? null;
103
- }
104
- catch (e) {
105
- log("WARN", `LLM OpenAI error: ${e.message}`);
106
- return null;
107
- }
108
- }
109
- async function bedrockCompletion(opts) {
110
- if (!bedrockClient)
111
- initBedrockClient();
112
- const modelId = cfg?.bedrock_model ?? "us.anthropic.claude-sonnet-4-20250514";
113
- const systemBlocks = [];
114
- const messages = [];
115
- for (const m of opts.messages) {
116
- if (m.role === "system") {
117
- systemBlocks.push({ text: m.content });
118
- }
119
- else {
120
- messages.push({
121
- role: m.role,
122
- content: [{ text: m.content }],
123
- });
124
- }
125
- }
126
- try {
127
- const command = new ConverseCommand({
128
- modelId,
129
- messages,
130
- ...(systemBlocks.length > 0 ? { system: systemBlocks } : {}),
131
- inferenceConfig: {
132
- maxTokens: opts.max_tokens ?? 500,
133
- temperature: opts.temperature ?? 0.2,
134
- },
135
- });
136
- const resp = await bedrockClient.send(command);
137
- const content = resp.output?.message?.content;
138
- const textBlock = content?.find(c => "text" in c);
139
- return textBlock?.text?.trim() ?? null;
140
- }
141
- catch (e) {
142
- log("WARN", `LLM Bedrock error: ${e.message}`);
143
- return null;
144
- }
145
- }
146
- //# sourceMappingURL=inference.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"inference.js","sourceRoot":"","sources":["../../src/llm/inference.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- /**
2
- * Tests for the inference (LLM) module.
3
- *
4
- * These tests verify initialization and config, NOT actual LLM calls
5
- * (which require a live Ollama/OpenAI/Bedrock service).
6
- */
7
- export {};
8
- //# sourceMappingURL=inference.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"inference.test.d.ts","sourceRoot":"","sources":["../../src/llm/inference.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -1,117 +0,0 @@
1
- /**
2
- * Tests for the inference (LLM) module.
3
- *
4
- * These tests verify initialization and config, NOT actual LLM calls
5
- * (which require a live Ollama/OpenAI/Bedrock service).
6
- */
7
- import { describe, it } from "node:test";
8
- import assert from "node:assert/strict";
9
- import { initLLM, chatCompletion } from "./inference.js";
10
- // ---------------------------------------------------------------------------
11
- // Helpers
12
- // ---------------------------------------------------------------------------
13
- function makeOllamaConfig(overrides = {}) {
14
- return {
15
- provider: "ollama",
16
- ollama_url: "http://localhost:11434",
17
- ollama_model: "qwen2.5:7b",
18
- openai_api_key: null,
19
- openai_model: "gpt-4.1-mini",
20
- bedrock_region: "us-east-1",
21
- bedrock_model: "us.anthropic.claude-sonnet-4-20250514",
22
- ...overrides,
23
- };
24
- }
25
- function makeOpenaiConfig() {
26
- return {
27
- provider: "openai",
28
- ollama_url: "http://localhost:11434",
29
- ollama_model: "qwen2.5:7b",
30
- openai_api_key: "sk-test-key",
31
- openai_model: "gpt-4.1-mini",
32
- bedrock_region: "us-east-1",
33
- bedrock_model: "us.anthropic.claude-sonnet-4-20250514",
34
- };
35
- }
36
- function makeBedrockConfig() {
37
- return {
38
- provider: "bedrock",
39
- ollama_url: "http://localhost:11434",
40
- ollama_model: "qwen2.5:7b",
41
- openai_api_key: null,
42
- openai_model: "gpt-4.1-mini",
43
- bedrock_region: "us-east-1",
44
- bedrock_model: "us.anthropic.claude-sonnet-4-20250514",
45
- };
46
- }
47
- // ---------------------------------------------------------------------------
48
- // initLLM
49
- // ---------------------------------------------------------------------------
50
- describe("initLLM", () => {
51
- it("does not throw with ollama config", () => {
52
- assert.doesNotThrow(() => {
53
- initLLM({ config: makeOllamaConfig() });
54
- });
55
- });
56
- it("does not throw with openai config", () => {
57
- assert.doesNotThrow(() => {
58
- initLLM({ config: makeOpenaiConfig() });
59
- });
60
- });
61
- it("does not throw with bedrock config", () => {
62
- assert.doesNotThrow(() => {
63
- initLLM({ config: makeBedrockConfig() });
64
- });
65
- });
66
- it("accepts optional logger", () => {
67
- const logs = [];
68
- initLLM({
69
- config: makeOllamaConfig(),
70
- logger: (level, ...args) => logs.push(`${level}: ${args.join(" ")}`),
71
- });
72
- // Logger is stored — we can't verify it directly, but it shouldn't throw
73
- assert.ok(true);
74
- });
75
- });
76
- // ---------------------------------------------------------------------------
77
- // chatCompletion — error/fallback behavior (no live calls)
78
- // ---------------------------------------------------------------------------
79
- describe("chatCompletion", () => {
80
- it("returns null when ollama is unreachable (falls back to bedrock which also fails)", async () => {
81
- initLLM({
82
- config: makeOllamaConfig({ ollama_url: "http://localhost:99999" }),
83
- });
84
- const result = await chatCompletion({
85
- messages: [{ role: "user", content: "hello" }],
86
- });
87
- // Ollama fails → falls back to bedrock → which also fails → returns null
88
- assert.strictEqual(result, null);
89
- });
90
- it("returns null when openai has no API key", async () => {
91
- initLLM({
92
- config: makeOpenaiConfig(),
93
- });
94
- // Override to remove API key
95
- initLLM({
96
- config: { ...makeOpenaiConfig(), openai_api_key: null },
97
- });
98
- const result = await chatCompletion({
99
- messages: [{ role: "user", content: "hello" }],
100
- });
101
- assert.strictEqual(result, null);
102
- });
103
- it("respects temperature and max_tokens options", async () => {
104
- // Verify the function at least accepts these options without throwing
105
- initLLM({
106
- config: makeOllamaConfig({ ollama_url: "http://localhost:99999" }),
107
- });
108
- const result = await chatCompletion({
109
- messages: [{ role: "user", content: "test" }],
110
- temperature: 0.5,
111
- max_tokens: 100,
112
- });
113
- // Will fail due to unreachable server, but should not throw on options parsing
114
- assert.strictEqual(result, null);
115
- });
116
- });
117
- //# sourceMappingURL=inference.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"inference.test.js","sourceRoot":"","sources":["../../src/llm/inference.test.ts"],"names":[],"mappings":"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"}