kagent-ts 0.1.4 → 0.1.5

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 (341) hide show
  1. package/LICENSE +68 -21
  2. package/README.md +27 -371
  3. package/dist/compression/progressive-compressor.d.ts +66 -0
  4. package/dist/compression/progressive-compressor.d.ts.map +1 -0
  5. package/dist/compression/progressive-compressor.js +367 -0
  6. package/dist/compression/progressive-compressor.js.map +1 -0
  7. package/dist/compression/types.d.ts +1 -5
  8. package/dist/compression/types.d.ts.map +1 -1
  9. package/dist/context/context-manager.d.ts +34 -15
  10. package/dist/context/context-manager.d.ts.map +1 -1
  11. package/dist/context/context-manager.js +78 -28
  12. package/dist/context/context-manager.js.map +1 -1
  13. package/dist/context/types.d.ts +20 -4
  14. package/dist/context/types.d.ts.map +1 -1
  15. package/dist/core/agent.d.ts +354 -25
  16. package/dist/core/agent.d.ts.map +1 -1
  17. package/dist/core/agent.js +646 -64
  18. package/dist/core/agent.js.map +1 -1
  19. package/dist/core/fusion-agent.d.ts +207 -0
  20. package/dist/core/fusion-agent.d.ts.map +1 -0
  21. package/dist/core/fusion-agent.js +769 -0
  22. package/dist/core/fusion-agent.js.map +1 -0
  23. package/dist/core/hooks.d.ts +19 -7
  24. package/dist/core/hooks.d.ts.map +1 -1
  25. package/dist/core/plan-solve-agent.d.ts +1 -15
  26. package/dist/core/plan-solve-agent.d.ts.map +1 -1
  27. package/dist/core/plan-solve-agent.js +142 -117
  28. package/dist/core/plan-solve-agent.js.map +1 -1
  29. package/dist/core/react-agent.d.ts +0 -13
  30. package/dist/core/react-agent.d.ts.map +1 -1
  31. package/dist/core/react-agent.js +127 -102
  32. package/dist/core/react-agent.js.map +1 -1
  33. package/dist/core/response-schema.d.ts +65 -0
  34. package/dist/core/response-schema.d.ts.map +1 -1
  35. package/dist/core/response-schema.js +174 -1
  36. package/dist/core/response-schema.js.map +1 -1
  37. package/dist/core/system-prompts.d.ts +27 -0
  38. package/dist/core/system-prompts.d.ts.map +1 -0
  39. package/dist/core/system-prompts.js +112 -0
  40. package/dist/core/system-prompts.js.map +1 -0
  41. package/dist/eval/benchmark.d.ts +81 -0
  42. package/dist/eval/benchmark.d.ts.map +1 -0
  43. package/dist/eval/benchmark.js +292 -0
  44. package/dist/eval/benchmark.js.map +1 -0
  45. package/dist/eval/eval-runner.d.ts +79 -0
  46. package/dist/eval/eval-runner.d.ts.map +1 -0
  47. package/dist/eval/eval-runner.js +252 -0
  48. package/dist/eval/eval-runner.js.map +1 -0
  49. package/dist/eval/index.d.ts +7 -0
  50. package/dist/eval/index.d.ts.map +1 -0
  51. package/dist/eval/index.js +13 -0
  52. package/dist/eval/index.js.map +1 -0
  53. package/dist/eval/tool-call-evaluator.d.ts +72 -0
  54. package/dist/eval/tool-call-evaluator.d.ts.map +1 -0
  55. package/dist/eval/tool-call-evaluator.js +265 -0
  56. package/dist/eval/tool-call-evaluator.js.map +1 -0
  57. package/dist/eval/types.d.ts +219 -0
  58. package/dist/eval/types.d.ts.map +1 -0
  59. package/dist/eval/types.js +3 -0
  60. package/dist/eval/types.js.map +1 -0
  61. package/dist/index.d.ts +58 -14
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +116 -8
  64. package/dist/index.js.map +1 -1
  65. package/dist/llm/anthropic-provider.d.ts +141 -0
  66. package/dist/llm/anthropic-provider.d.ts.map +1 -0
  67. package/dist/llm/anthropic-provider.js +486 -0
  68. package/dist/llm/anthropic-provider.js.map +1 -0
  69. package/dist/llm/errors.d.ts +26 -0
  70. package/dist/llm/errors.d.ts.map +1 -0
  71. package/dist/llm/errors.js +19 -0
  72. package/dist/llm/errors.js.map +1 -0
  73. package/dist/llm/factory.d.ts +73 -0
  74. package/dist/llm/factory.d.ts.map +1 -0
  75. package/dist/llm/factory.js +77 -0
  76. package/dist/llm/factory.js.map +1 -0
  77. package/dist/llm/fallback-provider.d.ts +47 -0
  78. package/dist/llm/fallback-provider.d.ts.map +1 -0
  79. package/dist/llm/fallback-provider.js +91 -0
  80. package/dist/llm/fallback-provider.js.map +1 -0
  81. package/dist/llm/interface.d.ts +54 -11
  82. package/dist/llm/interface.d.ts.map +1 -1
  83. package/dist/llm/interface.js +34 -0
  84. package/dist/llm/interface.js.map +1 -1
  85. package/dist/llm/model-router.d.ts +126 -0
  86. package/dist/llm/model-router.d.ts.map +1 -0
  87. package/dist/llm/model-router.js +178 -0
  88. package/dist/llm/model-router.js.map +1 -0
  89. package/dist/llm/openai-provider.d.ts +8 -32
  90. package/dist/llm/openai-provider.d.ts.map +1 -1
  91. package/dist/llm/openai-provider.js +27 -60
  92. package/dist/llm/openai-provider.js.map +1 -1
  93. package/dist/llm/rate-limiter.d.ts +41 -0
  94. package/dist/llm/rate-limiter.d.ts.map +1 -0
  95. package/dist/llm/rate-limiter.js +93 -0
  96. package/dist/llm/rate-limiter.js.map +1 -0
  97. package/dist/llm/retry.d.ts +26 -0
  98. package/dist/llm/retry.d.ts.map +1 -0
  99. package/dist/llm/retry.js +44 -0
  100. package/dist/llm/retry.js.map +1 -0
  101. package/dist/llm/token-budget.d.ts +97 -0
  102. package/dist/llm/token-budget.d.ts.map +1 -0
  103. package/dist/llm/token-budget.js +115 -0
  104. package/dist/llm/token-budget.js.map +1 -0
  105. package/dist/logging/index.d.ts +2 -0
  106. package/dist/logging/index.d.ts.map +1 -0
  107. package/dist/logging/index.js +7 -0
  108. package/dist/logging/index.js.map +1 -0
  109. package/dist/logging/logger.d.ts +38 -0
  110. package/dist/logging/logger.d.ts.map +1 -0
  111. package/dist/logging/logger.js +34 -0
  112. package/dist/logging/logger.js.map +1 -0
  113. package/dist/mcp/mcp-client-manager.d.ts +10 -2
  114. package/dist/mcp/mcp-client-manager.d.ts.map +1 -1
  115. package/dist/mcp/mcp-client-manager.js +20 -9
  116. package/dist/mcp/mcp-client-manager.js.map +1 -1
  117. package/dist/memory/index.d.ts +3 -0
  118. package/dist/memory/index.d.ts.map +1 -0
  119. package/dist/memory/index.js +6 -0
  120. package/dist/memory/index.js.map +1 -0
  121. package/dist/memory/memory-manager.d.ts +119 -0
  122. package/dist/memory/memory-manager.d.ts.map +1 -0
  123. package/dist/memory/memory-manager.js +334 -0
  124. package/dist/memory/memory-manager.js.map +1 -0
  125. package/dist/messages/types.d.ts +2 -0
  126. package/dist/messages/types.d.ts.map +1 -1
  127. package/dist/orchestrator/index.d.ts +5 -0
  128. package/dist/orchestrator/index.d.ts.map +1 -0
  129. package/dist/orchestrator/index.js +13 -0
  130. package/dist/orchestrator/index.js.map +1 -0
  131. package/dist/orchestrator/json-extractor.d.ts +18 -0
  132. package/dist/orchestrator/json-extractor.d.ts.map +1 -0
  133. package/dist/orchestrator/json-extractor.js +111 -0
  134. package/dist/orchestrator/json-extractor.js.map +1 -0
  135. package/dist/orchestrator/orchestrator-agent.d.ts +152 -0
  136. package/dist/orchestrator/orchestrator-agent.d.ts.map +1 -0
  137. package/dist/orchestrator/orchestrator-agent.js +675 -0
  138. package/dist/orchestrator/orchestrator-agent.js.map +1 -0
  139. package/dist/orchestrator/orchestrator-response.d.ts +40 -0
  140. package/dist/orchestrator/orchestrator-response.d.ts.map +1 -0
  141. package/dist/orchestrator/orchestrator-response.js +275 -0
  142. package/dist/orchestrator/orchestrator-response.js.map +1 -0
  143. package/dist/orchestrator/orchestrator-types.d.ts +116 -0
  144. package/dist/orchestrator/orchestrator-types.d.ts.map +1 -0
  145. package/dist/orchestrator/orchestrator-types.js +3 -0
  146. package/dist/orchestrator/orchestrator-types.js.map +1 -0
  147. package/dist/preferences/preference-manager.d.ts +8 -3
  148. package/dist/preferences/preference-manager.d.ts.map +1 -1
  149. package/dist/preferences/preference-manager.js +17 -4
  150. package/dist/preferences/preference-manager.js.map +1 -1
  151. package/dist/rag/chroma-store.d.ts +52 -0
  152. package/dist/rag/chroma-store.d.ts.map +1 -0
  153. package/dist/rag/chroma-store.js +110 -0
  154. package/dist/rag/chroma-store.js.map +1 -0
  155. package/dist/rag/document-loader.d.ts +21 -0
  156. package/dist/rag/document-loader.d.ts.map +1 -0
  157. package/dist/rag/document-loader.js +129 -0
  158. package/dist/rag/document-loader.js.map +1 -0
  159. package/dist/rag/embedding-provider.d.ts +36 -0
  160. package/dist/rag/embedding-provider.d.ts.map +1 -0
  161. package/dist/rag/embedding-provider.js +74 -0
  162. package/dist/rag/embedding-provider.js.map +1 -0
  163. package/dist/rag/index.d.ts +17 -0
  164. package/dist/rag/index.d.ts.map +1 -0
  165. package/dist/rag/index.js +27 -0
  166. package/dist/rag/index.js.map +1 -0
  167. package/dist/rag/keyword-index.d.ts +53 -0
  168. package/dist/rag/keyword-index.d.ts.map +1 -0
  169. package/dist/rag/keyword-index.js +161 -0
  170. package/dist/rag/keyword-index.js.map +1 -0
  171. package/dist/rag/llm-reranker.d.ts +36 -0
  172. package/dist/rag/llm-reranker.d.ts.map +1 -0
  173. package/dist/rag/llm-reranker.js +95 -0
  174. package/dist/rag/llm-reranker.js.map +1 -0
  175. package/dist/rag/rag-manager.d.ts +54 -0
  176. package/dist/rag/rag-manager.d.ts.map +1 -0
  177. package/dist/rag/rag-manager.js +179 -0
  178. package/dist/rag/rag-manager.js.map +1 -0
  179. package/dist/rag/rag-types.d.ts +143 -0
  180. package/dist/rag/rag-types.d.ts.map +1 -0
  181. package/dist/rag/rag-types.js +9 -0
  182. package/dist/rag/rag-types.js.map +1 -0
  183. package/dist/rag/rrf.d.ts +47 -0
  184. package/dist/rag/rrf.d.ts.map +1 -0
  185. package/dist/rag/rrf.js +70 -0
  186. package/dist/rag/rrf.js.map +1 -0
  187. package/dist/rag/search-knowledge.d.ts +24 -0
  188. package/dist/rag/search-knowledge.d.ts.map +1 -0
  189. package/dist/rag/search-knowledge.js +86 -0
  190. package/dist/rag/search-knowledge.js.map +1 -0
  191. package/dist/rag/text-splitter.d.ts +25 -0
  192. package/dist/rag/text-splitter.d.ts.map +1 -0
  193. package/dist/rag/text-splitter.js +136 -0
  194. package/dist/rag/text-splitter.js.map +1 -0
  195. package/dist/rag/vector-store.d.ts +34 -0
  196. package/dist/rag/vector-store.d.ts.map +1 -0
  197. package/dist/rag/vector-store.js +73 -0
  198. package/dist/rag/vector-store.js.map +1 -0
  199. package/dist/reflection/error-notebook.d.ts +125 -0
  200. package/dist/reflection/error-notebook.d.ts.map +1 -0
  201. package/dist/reflection/error-notebook.js +368 -0
  202. package/dist/reflection/error-notebook.js.map +1 -0
  203. package/dist/reflection/index.d.ts +8 -0
  204. package/dist/reflection/index.d.ts.map +1 -0
  205. package/dist/reflection/index.js +12 -0
  206. package/dist/reflection/index.js.map +1 -0
  207. package/dist/reflection/memory-reflector.d.ts +97 -0
  208. package/dist/reflection/memory-reflector.d.ts.map +1 -0
  209. package/dist/reflection/memory-reflector.js +215 -0
  210. package/dist/reflection/memory-reflector.js.map +1 -0
  211. package/dist/reflection/reflection-agent.d.ts +105 -0
  212. package/dist/reflection/reflection-agent.d.ts.map +1 -0
  213. package/dist/reflection/reflection-agent.js +234 -0
  214. package/dist/reflection/reflection-agent.js.map +1 -0
  215. package/dist/reflection/reflection-hook.d.ts +50 -0
  216. package/dist/reflection/reflection-hook.d.ts.map +1 -0
  217. package/dist/reflection/reflection-hook.js +108 -0
  218. package/dist/reflection/reflection-hook.js.map +1 -0
  219. package/dist/rules/project-rules.d.ts +47 -0
  220. package/dist/rules/project-rules.d.ts.map +1 -0
  221. package/dist/rules/project-rules.js +166 -0
  222. package/dist/rules/project-rules.js.map +1 -0
  223. package/dist/security/boundaries.d.ts +81 -0
  224. package/dist/security/boundaries.d.ts.map +1 -0
  225. package/dist/security/boundaries.js +158 -0
  226. package/dist/security/boundaries.js.map +1 -0
  227. package/dist/security/index.d.ts +2 -0
  228. package/dist/security/index.d.ts.map +1 -0
  229. package/dist/security/index.js +11 -0
  230. package/dist/security/index.js.map +1 -0
  231. package/dist/session/session-types.d.ts +25 -4
  232. package/dist/session/session-types.d.ts.map +1 -1
  233. package/dist/skills/file-skill-loader.d.ts +4 -6
  234. package/dist/skills/file-skill-loader.d.ts.map +1 -1
  235. package/dist/skills/file-skill-loader.js +8 -19
  236. package/dist/skills/file-skill-loader.js.map +1 -1
  237. package/dist/skills/index.d.ts +1 -1
  238. package/dist/skills/index.d.ts.map +1 -1
  239. package/dist/skills/index.js +1 -2
  240. package/dist/skills/index.js.map +1 -1
  241. package/dist/skills/skill-manager.d.ts +18 -8
  242. package/dist/skills/skill-manager.d.ts.map +1 -1
  243. package/dist/skills/skill-manager.js +58 -36
  244. package/dist/skills/skill-manager.js.map +1 -1
  245. package/dist/skills/types.d.ts +3 -8
  246. package/dist/skills/types.d.ts.map +1 -1
  247. package/dist/subagent/index.d.ts +4 -0
  248. package/dist/subagent/index.d.ts.map +1 -0
  249. package/dist/subagent/index.js +8 -0
  250. package/dist/subagent/index.js.map +1 -0
  251. package/dist/subagent/subagent-loader.d.ts +53 -0
  252. package/dist/subagent/subagent-loader.d.ts.map +1 -0
  253. package/dist/subagent/subagent-loader.js +155 -0
  254. package/dist/subagent/subagent-loader.js.map +1 -0
  255. package/dist/subagent/subagent-manager.d.ts +161 -0
  256. package/dist/subagent/subagent-manager.d.ts.map +1 -0
  257. package/dist/subagent/subagent-manager.js +468 -0
  258. package/dist/subagent/subagent-manager.js.map +1 -0
  259. package/dist/subagent/subagent-types.d.ts +77 -0
  260. package/dist/subagent/subagent-types.d.ts.map +1 -0
  261. package/dist/subagent/subagent-types.js +3 -0
  262. package/dist/subagent/subagent-types.js.map +1 -0
  263. package/dist/tools/builtin/bash.d.ts +3 -0
  264. package/dist/tools/builtin/bash.d.ts.map +1 -0
  265. package/dist/tools/builtin/bash.js +87 -0
  266. package/dist/tools/builtin/bash.js.map +1 -0
  267. package/dist/tools/builtin/edit-file.d.ts.map +1 -1
  268. package/dist/tools/builtin/edit-file.js +1 -0
  269. package/dist/tools/builtin/edit-file.js.map +1 -1
  270. package/dist/tools/builtin/index.d.ts +14 -0
  271. package/dist/tools/builtin/index.d.ts.map +1 -1
  272. package/dist/tools/builtin/index.js +45 -1
  273. package/dist/tools/builtin/index.js.map +1 -1
  274. package/dist/tools/builtin/list-errors.d.ts +7 -0
  275. package/dist/tools/builtin/list-errors.d.ts.map +1 -0
  276. package/dist/tools/builtin/list-errors.js +64 -0
  277. package/dist/tools/builtin/list-errors.js.map +1 -0
  278. package/dist/tools/builtin/list-subagents.d.ts +7 -0
  279. package/dist/tools/builtin/list-subagents.d.ts.map +1 -0
  280. package/dist/tools/builtin/list-subagents.js +21 -0
  281. package/dist/tools/builtin/list-subagents.js.map +1 -0
  282. package/dist/tools/builtin/recall.d.ts +11 -0
  283. package/dist/tools/builtin/recall.d.ts.map +1 -0
  284. package/dist/tools/builtin/recall.js +60 -0
  285. package/dist/tools/builtin/recall.js.map +1 -0
  286. package/dist/tools/builtin/remember.d.ts +12 -0
  287. package/dist/tools/builtin/remember.d.ts.map +1 -0
  288. package/dist/tools/builtin/remember.js +72 -0
  289. package/dist/tools/builtin/remember.js.map +1 -0
  290. package/dist/tools/builtin/skill.d.ts +14 -0
  291. package/dist/tools/builtin/skill.d.ts.map +1 -0
  292. package/dist/tools/builtin/skill.js +71 -0
  293. package/dist/tools/builtin/skill.js.map +1 -0
  294. package/dist/tools/builtin/spawn-subagent.d.ts +7 -0
  295. package/dist/tools/builtin/spawn-subagent.d.ts.map +1 -0
  296. package/dist/tools/builtin/spawn-subagent.js +43 -0
  297. package/dist/tools/builtin/spawn-subagent.js.map +1 -0
  298. package/dist/tools/builtin/web-fetch.d.ts +3 -0
  299. package/dist/tools/builtin/web-fetch.d.ts.map +1 -0
  300. package/dist/tools/builtin/web-fetch.js +101 -0
  301. package/dist/tools/builtin/web-fetch.js.map +1 -0
  302. package/dist/tools/builtin/write-file.d.ts.map +1 -1
  303. package/dist/tools/builtin/write-file.js +1 -0
  304. package/dist/tools/builtin/write-file.js.map +1 -1
  305. package/dist/tools/circuit-breaker.d.ts +19 -10
  306. package/dist/tools/circuit-breaker.d.ts.map +1 -1
  307. package/dist/tools/circuit-breaker.js +22 -11
  308. package/dist/tools/circuit-breaker.js.map +1 -1
  309. package/dist/tools/error-tracker.d.ts +28 -44
  310. package/dist/tools/error-tracker.d.ts.map +1 -1
  311. package/dist/tools/error-tracker.js +39 -156
  312. package/dist/tools/error-tracker.js.map +1 -1
  313. package/dist/tools/tool-filter.d.ts +70 -0
  314. package/dist/tools/tool-filter.d.ts.map +1 -0
  315. package/dist/tools/tool-filter.js +92 -0
  316. package/dist/tools/tool-filter.js.map +1 -0
  317. package/dist/tools/tool-output-truncator.d.ts +36 -0
  318. package/dist/tools/tool-output-truncator.d.ts.map +1 -0
  319. package/dist/tools/tool-output-truncator.js +117 -0
  320. package/dist/tools/tool-output-truncator.js.map +1 -0
  321. package/dist/tools/tool-registry.d.ts +25 -9
  322. package/dist/tools/tool-registry.d.ts.map +1 -1
  323. package/dist/tools/tool-registry.js +77 -28
  324. package/dist/tools/tool-registry.js.map +1 -1
  325. package/dist/tools/tool-validator.d.ts +13 -0
  326. package/dist/tools/tool-validator.d.ts.map +1 -0
  327. package/dist/tools/tool-validator.js +116 -0
  328. package/dist/tools/tool-validator.js.map +1 -0
  329. package/dist/tools/types.d.ts +86 -3
  330. package/dist/tools/types.d.ts.map +1 -1
  331. package/dist/tools/types.js +51 -2
  332. package/dist/tools/types.js.map +1 -1
  333. package/dist/trace/trace-logger.d.ts +30 -4
  334. package/dist/trace/trace-logger.d.ts.map +1 -1
  335. package/dist/trace/trace-logger.js +82 -6
  336. package/dist/trace/trace-logger.js.map +1 -1
  337. package/package.json +13 -4
  338. package/dist/compression/sliding-window.d.ts +0 -21
  339. package/dist/compression/sliding-window.d.ts.map +0 -1
  340. package/dist/compression/sliding-window.js +0 -44
  341. package/dist/compression/sliding-window.js.map +0 -1
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ /**
3
+ * In-memory BM25 keyword index.
4
+ *
5
+ * Builds an inverted index from chunk text during indexing and scores
6
+ * documents against queries using the standard BM25 formula:
7
+ *
8
+ * score(D, Q) = Σ IDF(qᵢ) · (f(qᵢ, D) · (k1+1)) / (f(qᵢ, D) + k1·(1 − b + b·|D|/avgdl))
9
+ *
10
+ * where:
11
+ * f(qᵢ, D) = term frequency of query term qᵢ in document D
12
+ * |D| = document length (token count)
13
+ * avgdl = average document length across the corpus
14
+ * k1 = term saturation parameter (default: 1.5)
15
+ * b = length normalization parameter (default: 0.75)
16
+ * IDF(qᵢ) = log((N − n(qᵢ) + 0.5) / (n(qᵢ) + 0.5) + 1)
17
+ *
18
+ * Zero external dependencies — pure TypeScript implementation suitable
19
+ * for knowledge bases up to ~10K chunks.
20
+ */
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.InMemoryKeywordIndex = void 0;
23
+ // ─── Tokenizer ──────────────────────────────────────────────────────────────
24
+ /**
25
+ * Simple multilingual tokenizer.
26
+ *
27
+ * Splits on word boundaries (Unicode-aware via lookbehind/lookahead for CJK
28
+ * characters, plus standard whitespace/punctuation splitting for Latin text).
29
+ */
30
+ function tokenize(text) {
31
+ const tokens = [];
32
+ // Insert spaces around CJK characters so they split into individual tokens,
33
+ // then split on non-word characters.
34
+ const spaced = text
35
+ .replace(/[一-鿿㐀-䶿]/g, " $& ")
36
+ .replace(/[぀-ゟ゠-ヿ]/g, " $& ") // Hiragana + Katakana
37
+ .replace(/[가-힯]/g, " $& ") // Hangul
38
+ .toLowerCase();
39
+ for (const token of spaced.split(/[^a-z0-9一-鿿㐀-䶿぀-ゟ゠-ヿ가-힯_]+/)) {
40
+ const t = token.trim();
41
+ if (t.length > 0)
42
+ tokens.push(t);
43
+ }
44
+ return tokens;
45
+ }
46
+ // ─── BM25 Parameters ────────────────────────────────────────────────────────
47
+ const BM25_K1 = 1.5;
48
+ const BM25_B = 0.75;
49
+ // ─── InMemoryKeywordIndex ────────────────────────────────────────────────────
50
+ class InMemoryKeywordIndex {
51
+ /** invertedIndex: word → Map<chunkId → term frequency> */
52
+ invertedIndex = new Map();
53
+ /** IDF values: word → idf */
54
+ idfValues = new Map();
55
+ /** Document lengths: chunkId → token count */
56
+ docLengths = new Map();
57
+ /** Average document length across the corpus. */
58
+ avgDocLength = 0;
59
+ /** Total number of indexed chunks. */
60
+ totalDocs = 0;
61
+ /** All chunks indexed (for retrieval). chunkId → RAGChunk */
62
+ chunks = new Map();
63
+ /** Next chunkId. */
64
+ nextId = 0;
65
+ // ─── Write ──────────────────────────────────────────────────────────────
66
+ /**
67
+ * Add chunks to the keyword index.
68
+ * Recomputes IDF and avgDocLength incrementally.
69
+ */
70
+ add(newChunks) {
71
+ for (const chunk of newChunks) {
72
+ const id = this.nextId++;
73
+ this.chunks.set(id, chunk);
74
+ const tokens = tokenize(chunk.text);
75
+ this.docLengths.set(id, tokens.length);
76
+ const tf = new Map();
77
+ for (const token of tokens) {
78
+ tf.set(token, (tf.get(token) || 0) + 1);
79
+ }
80
+ for (const [word, count] of tf) {
81
+ let posting = this.invertedIndex.get(word);
82
+ if (!posting) {
83
+ posting = new Map();
84
+ this.invertedIndex.set(word, posting);
85
+ }
86
+ posting.set(id, count);
87
+ }
88
+ }
89
+ this.recomputeStats();
90
+ }
91
+ // ─── Read ───────────────────────────────────────────────────────────────
92
+ /**
93
+ * Search for the top-K chunks matching the query using BM25 scoring.
94
+ */
95
+ search(query, topK) {
96
+ const queryTokens = tokenize(query);
97
+ if (queryTokens.length === 0 || this.totalDocs === 0)
98
+ return [];
99
+ // Aggregate BM25 scores: chunkId → score
100
+ const scores = new Map();
101
+ for (const token of queryTokens) {
102
+ const posting = this.invertedIndex.get(token);
103
+ if (!posting)
104
+ continue;
105
+ const idf = this.idfValues.get(token) || 0;
106
+ for (const [docId, tf] of posting) {
107
+ const docLen = this.docLengths.get(docId) || 1;
108
+ const numerator = tf * (BM25_K1 + 1);
109
+ const denominator = tf + BM25_K1 * (1 - BM25_B + BM25_B * (docLen / this.avgDocLength));
110
+ const score = idf * (numerator / denominator);
111
+ scores.set(docId, (scores.get(docId) || 0) + score);
112
+ }
113
+ }
114
+ // Sort by score descending, take top-K
115
+ const ranked = Array.from(scores.entries())
116
+ .sort((a, b) => b[1] - a[1])
117
+ .slice(0, topK);
118
+ // Map back to BM25Result
119
+ return ranked
120
+ .map(([docId, score]) => {
121
+ const chunk = this.chunks.get(docId);
122
+ if (!chunk)
123
+ return null;
124
+ return { chunk, score };
125
+ })
126
+ .filter((r) => r !== null);
127
+ }
128
+ // ─── State ──────────────────────────────────────────────────────────────
129
+ get size() {
130
+ return this.totalDocs;
131
+ }
132
+ clear() {
133
+ this.invertedIndex.clear();
134
+ this.idfValues.clear();
135
+ this.docLengths.clear();
136
+ this.chunks.clear();
137
+ this.avgDocLength = 0;
138
+ this.totalDocs = 0;
139
+ this.nextId = 0;
140
+ }
141
+ // ─── Stats ──────────────────────────────────────────────────────────────
142
+ recomputeStats() {
143
+ this.totalDocs = this.chunks.size;
144
+ // Average doc length
145
+ let totalLen = 0;
146
+ for (const len of this.docLengths.values()) {
147
+ totalLen += len;
148
+ }
149
+ this.avgDocLength = this.totalDocs > 0 ? totalLen / this.totalDocs : 1;
150
+ // IDF
151
+ this.idfValues.clear();
152
+ for (const [word, posting] of this.invertedIndex) {
153
+ const n = posting.size; // number of docs containing this word
154
+ // Smooth IDF: log((N - n + 0.5) / (n + 0.5) + 1)
155
+ const idf = Math.log((this.totalDocs - n + 0.5) / (n + 0.5) + 1);
156
+ this.idfValues.set(word, idf);
157
+ }
158
+ }
159
+ }
160
+ exports.InMemoryKeywordIndex = InMemoryKeywordIndex;
161
+ //# sourceMappingURL=keyword-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyword-index.js","sourceRoot":"","sources":["../../src/rag/keyword-index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * LLM-based re-ranker for retrieved results.
3
+ *
4
+ * Uses an LLM (via the framework's LLMProvider interface) to re-score
5
+ * candidate chunks against the original query. This is a simple, zero-new-
6
+ * dependency alternative to a dedicated Cross-Encoder model.
7
+ *
8
+ * For production use with high throughput, consider replacing this with
9
+ * a dedicated rerank API (Cohere, Jina, Voyage AI) or a locally-hosted
10
+ * Cross-Encoder model (e.g., BAAI/bge-reranker-v2-m3 via ONNX).
11
+ */
12
+ import type { ReRanker, RAGSearchResult } from "./rag-types";
13
+ import type { LLMProvider } from "../llm/interface";
14
+ export interface LLMReRankerConfig {
15
+ /** The LLM provider to use for scoring. */
16
+ llm: LLMProvider;
17
+ /**
18
+ * Maximum candidates to send to the LLM in one re-rank request.
19
+ * Default: 20. More candidates = better comparison but higher cost.
20
+ */
21
+ maxCandidates?: number;
22
+ /**
23
+ * Model to use (overrides the LLM provider's default model).
24
+ * Useful for using a cheaper/faster model for re-ranking.
25
+ */
26
+ model?: string;
27
+ }
28
+ export declare class LLMReRanker implements ReRanker {
29
+ private llm;
30
+ private maxCandidates;
31
+ constructor(config: LLMReRankerConfig);
32
+ rerank(query: string, results: RAGSearchResult[]): Promise<RAGSearchResult[]>;
33
+ private buildPrompt;
34
+ private parseScores;
35
+ }
36
+ //# sourceMappingURL=llm-reranker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-reranker.d.ts","sourceRoot":"","sources":["../../src/rag/llm-reranker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAMpD,MAAM,WAAW,iBAAiB;IAChC,2CAA2C;IAC3C,GAAG,EAAE,WAAW,CAAC;IAEjB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID,qBAAa,WAAY,YAAW,QAAQ;IAC1C,OAAO,CAAC,GAAG,CAAc;IACzB,OAAO,CAAC,aAAa,CAAS;gBAElB,MAAM,EAAE,iBAAiB;IAK/B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAsCnF,OAAO,CAAC,WAAW;IA2BnB,OAAO,CAAC,WAAW;CAgBpB"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ /**
3
+ * LLM-based re-ranker for retrieved results.
4
+ *
5
+ * Uses an LLM (via the framework's LLMProvider interface) to re-score
6
+ * candidate chunks against the original query. This is a simple, zero-new-
7
+ * dependency alternative to a dedicated Cross-Encoder model.
8
+ *
9
+ * For production use with high throughput, consider replacing this with
10
+ * a dedicated rerank API (Cohere, Jina, Voyage AI) or a locally-hosted
11
+ * Cross-Encoder model (e.g., BAAI/bge-reranker-v2-m3 via ONNX).
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.LLMReRanker = void 0;
15
+ const types_1 = require("../messages/types");
16
+ // ─── LLMReRanker ─────────────────────────────────────────────────────────────
17
+ class LLMReRanker {
18
+ llm;
19
+ maxCandidates;
20
+ constructor(config) {
21
+ this.llm = config.llm;
22
+ this.maxCandidates = config.maxCandidates ?? 20;
23
+ }
24
+ async rerank(query, results) {
25
+ if (results.length <= 1)
26
+ return results;
27
+ // Limit candidates to avoid huge prompts
28
+ const candidates = results.slice(0, this.maxCandidates);
29
+ const prompt = this.buildPrompt(query, candidates);
30
+ const messages = [
31
+ { role: types_1.Role.User, content: prompt },
32
+ ];
33
+ const response = await this.llm.chat(messages);
34
+ const content = response.content ?? "";
35
+ // Parse scores from the LLM response
36
+ const scores = this.parseScores(content, candidates.length);
37
+ // Apply scores to results
38
+ const reranked = [];
39
+ for (let i = 0; i < candidates.length; i++) {
40
+ reranked.push({
41
+ chunk: candidates[i].chunk,
42
+ score: scores?.[i] ?? candidates[i].score,
43
+ });
44
+ }
45
+ // Append any overflow results with original scores
46
+ for (let i = this.maxCandidates; i < results.length; i++) {
47
+ reranked.push({ ...results[i] });
48
+ }
49
+ // Sort by new score descending
50
+ reranked.sort((a, b) => b.score - a.score);
51
+ return reranked;
52
+ }
53
+ // ─── Prompt ──────────────────────────────────────────────────────────────
54
+ buildPrompt(query, results) {
55
+ const docs = results.map((r, i) => `[${i}] ${r.chunk.text.slice(0, 500)}`).join("\n\n");
56
+ return [
57
+ `You are a relevance scoring assistant. Given a query and a list of ${results.length} document snippets, score each snippet's relevance to the query on a scale of 0–10 (integer).`,
58
+ "",
59
+ "Rules:",
60
+ "- 0 = completely irrelevant",
61
+ "- 10 = perfectly answers the query",
62
+ "- Score based on factual relevance, not just keyword overlap",
63
+ "",
64
+ `Query: ${query}`,
65
+ "",
66
+ "Documents:",
67
+ docs,
68
+ "",
69
+ `Output ONLY a JSON array of ${results.length} integers in order [score_0, score_1, ..., score_${results.length - 1}].`,
70
+ "Example output: [8, 3, 0, 10, 5]",
71
+ "",
72
+ "Scores:",
73
+ ].join("\n");
74
+ }
75
+ // ─── Parsing ─────────────────────────────────────────────────────────────
76
+ parseScores(raw, expectedCount) {
77
+ // Try to extract a JSON array from the response
78
+ const match = raw.match(/\[[\d,\s]+\]/);
79
+ if (!match)
80
+ return null;
81
+ try {
82
+ const arr = JSON.parse(match[0]);
83
+ if (!Array.isArray(arr) || arr.length === 0)
84
+ return null;
85
+ // Normalize to [0, 1]
86
+ const normalized = arr.map((n) => Math.max(0, Math.min(1, Number(n) / 10)));
87
+ return normalized;
88
+ }
89
+ catch {
90
+ return null;
91
+ }
92
+ }
93
+ }
94
+ exports.LLMReRanker = LLMReRanker;
95
+ //# sourceMappingURL=llm-reranker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-reranker.js","sourceRoot":"","sources":["../../src/rag/llm-reranker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * RAG Manager — orchestrates document loading, embedding, and search.
3
+ *
4
+ * Lifecycle:
5
+ * 1. `index()` — load documents from `documentsDir`, chunk, embed, store.
6
+ * 2. `search(query, topK)` — embed query, search vector store, return results.
7
+ * 3. `clear()` — wipe all indexed data.
8
+ *
9
+ * Owned by the main Agent; created during `Agent.init()` when `rag` config
10
+ * is present.
11
+ */
12
+ import type { RAGConfig, RAGSearchResult } from "./rag-types";
13
+ import { Logger } from "../logging/logger";
14
+ export declare class RAGManager {
15
+ private config;
16
+ private store;
17
+ private keywordIndex?;
18
+ private reRanker?;
19
+ private logger;
20
+ private documents;
21
+ private _indexed;
22
+ constructor(config: RAGConfig, logger?: Logger);
23
+ /** Whether the index has been built. */
24
+ get indexed(): boolean;
25
+ /** Number of chunks in the store. */
26
+ get chunkCount(): number;
27
+ /** Number of documents loaded. */
28
+ get documentCount(): number;
29
+ /** List of indexed document paths. */
30
+ get documentPaths(): string[];
31
+ /**
32
+ * Load documents, generate embeddings, and populate the vector store.
33
+ *
34
+ * Idempotent — if already indexed, calling again clears and rebuilds.
35
+ */
36
+ index(): Promise<void>;
37
+ /**
38
+ * Search the knowledge base for chunks relevant to the query.
39
+ *
40
+ * In hybrid mode (hybridSearch: true), runs both vector similarity and
41
+ * BM25 keyword search in parallel, then merges results via RRF.
42
+ *
43
+ * @param query Natural-language search query.
44
+ * @param topK Number of results to return (overrides config default).
45
+ */
46
+ search(query: string, topK?: number): Promise<RAGSearchResult[]>;
47
+ /**
48
+ * Format search results for injection into the LLM context.
49
+ */
50
+ formatResults(results: RAGSearchResult[]): string;
51
+ /** Clear all indexed data. */
52
+ clear(): Promise<void>;
53
+ }
54
+ //# sourceMappingURL=rag-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rag-manager.d.ts","sourceRoot":"","sources":["../../src/rag/rag-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,SAAS,EAET,eAAe,EAGhB,MAAM,aAAa,CAAC;AAKrB,OAAO,EAAE,MAAM,EAAiB,MAAM,mBAAmB,CAAC;AAE1D,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,YAAY,CAAC,CAAuB;IAC5C,OAAO,CAAC,QAAQ,CAAC,CAAW;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM;IAiB9C,wCAAwC;IACxC,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,qCAAqC;IACrC,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,kCAAkC;IAClC,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,sCAAsC;IACtC,IAAI,aAAa,IAAI,MAAM,EAAE,CAE5B;IAED;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuD5B;;;;;;;;OAQG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAqDtE;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM;IAkBjD,8BAA8B;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7B"}
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ /**
3
+ * RAG Manager — orchestrates document loading, embedding, and search.
4
+ *
5
+ * Lifecycle:
6
+ * 1. `index()` — load documents from `documentsDir`, chunk, embed, store.
7
+ * 2. `search(query, topK)` — embed query, search vector store, return results.
8
+ * 3. `clear()` — wipe all indexed data.
9
+ *
10
+ * Owned by the main Agent; created during `Agent.init()` when `rag` config
11
+ * is present.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.RAGManager = void 0;
15
+ const document_loader_1 = require("./document-loader");
16
+ const vector_store_1 = require("./vector-store");
17
+ const keyword_index_1 = require("./keyword-index");
18
+ const rrf_1 = require("./rrf");
19
+ const logger_1 = require("../logging/logger");
20
+ class RAGManager {
21
+ config;
22
+ store;
23
+ keywordIndex;
24
+ reRanker;
25
+ logger;
26
+ documents = [];
27
+ _indexed = false;
28
+ constructor(config, logger) {
29
+ this.config = {
30
+ chunkSize: 1000,
31
+ chunkOverlap: 200,
32
+ topK: 5,
33
+ ...config,
34
+ };
35
+ this.store = config.store ?? new vector_store_1.InMemoryVectorStore();
36
+ if (this.config.hybridSearch) {
37
+ this.keywordIndex = new keyword_index_1.InMemoryKeywordIndex();
38
+ }
39
+ this.reRanker = config.reRanker;
40
+ this.logger = logger ?? new logger_1.ConsoleLogger();
41
+ }
42
+ // ─── Public API ──────────────────────────────────────────────────────────
43
+ /** Whether the index has been built. */
44
+ get indexed() {
45
+ return this._indexed;
46
+ }
47
+ /** Number of chunks in the store. */
48
+ get chunkCount() {
49
+ return this.store.size;
50
+ }
51
+ /** Number of documents loaded. */
52
+ get documentCount() {
53
+ return this.documents.length;
54
+ }
55
+ /** List of indexed document paths. */
56
+ get documentPaths() {
57
+ return this.documents.map((d) => d.path);
58
+ }
59
+ /**
60
+ * Load documents, generate embeddings, and populate the vector store.
61
+ *
62
+ * Idempotent — if already indexed, calling again clears and rebuilds.
63
+ */
64
+ async index() {
65
+ await this.clear();
66
+ this.logger.info("RAG", `Loading documents from "${this.config.documentsDir}"...`);
67
+ this.documents = (0, document_loader_1.loadDocuments)(this.config.documentsDir, this.config.chunkSize, this.config.chunkOverlap);
68
+ if (this.documents.length === 0) {
69
+ this.logger.warn("RAG", `No supported documents found in "${this.config.documentsDir}".`);
70
+ this._indexed = true;
71
+ return;
72
+ }
73
+ const allChunks = this.documents.flatMap((d) => d.chunks);
74
+ this.logger.info("RAG", `Loaded ${this.documents.length} document(s), ${allChunks.length} chunk(s).`);
75
+ if (allChunks.length === 0) {
76
+ this._indexed = true;
77
+ return;
78
+ }
79
+ // Generate embeddings in batches
80
+ this.logger.info("RAG", `Generating embeddings (model: ${this.config.embeddingProvider.model})...`);
81
+ const texts = allChunks.map((c) => c.text);
82
+ const batchSize = 20;
83
+ const embeddings = [];
84
+ for (let i = 0; i < texts.length; i += batchSize) {
85
+ const batch = texts.slice(i, i + batchSize);
86
+ const batchEmbeddings = await this.config.embeddingProvider.embed(batch);
87
+ embeddings.push(...batchEmbeddings);
88
+ }
89
+ // Attach embeddings to chunks
90
+ for (let i = 0; i < allChunks.length; i++) {
91
+ allChunks[i].embedding = embeddings[i];
92
+ }
93
+ await this.store.add(allChunks);
94
+ // Build keyword index for hybrid search (BM25)
95
+ if (this.keywordIndex) {
96
+ this.keywordIndex.add(allChunks);
97
+ }
98
+ this.logger.info("RAG", `Indexing complete — ${this.store.size} chunk(s) in vector store${this.keywordIndex ? `, ${this.keywordIndex.size} in keyword index` : ""}.`);
99
+ this._indexed = true;
100
+ }
101
+ /**
102
+ * Search the knowledge base for chunks relevant to the query.
103
+ *
104
+ * In hybrid mode (hybridSearch: true), runs both vector similarity and
105
+ * BM25 keyword search in parallel, then merges results via RRF.
106
+ *
107
+ * @param query Natural-language search query.
108
+ * @param topK Number of results to return (overrides config default).
109
+ */
110
+ async search(query, topK) {
111
+ if (!this._indexed || this.store.size === 0) {
112
+ return [];
113
+ }
114
+ const k = topK ?? this.config.topK ?? 5;
115
+ // Fetch extra candidates when re-ranking so the re-ranker has more to work with
116
+ const fetchFactor = this.reRanker ? (this.config.hybridRetrievalFactor ?? 3) : 1;
117
+ let results;
118
+ // ── Hybrid mode: vector + BM25 → RRF fusion ──────────────────────
119
+ if (this.keywordIndex) {
120
+ const fetchK = k * fetchFactor;
121
+ const [queryEmbedding] = await this.config.embeddingProvider.embed([query]);
122
+ const [vectorResults, bm25Results] = await Promise.all([
123
+ this.store.search(queryEmbedding, fetchK),
124
+ this.keywordIndex.search(query, fetchK),
125
+ ]);
126
+ const vecRanking = vectorResults.map((r) => ({
127
+ chunk: r.chunk,
128
+ score: r.score,
129
+ }));
130
+ const bm25Ranking = bm25Results.map((r) => ({
131
+ chunk: r.chunk,
132
+ score: r.score,
133
+ }));
134
+ const fused = (0, rrf_1.rrfFusion)([vecRanking, bm25Ranking], 60, fetchK);
135
+ results = fused.map((f) => ({
136
+ chunk: f.chunk,
137
+ score: f.rrfScore,
138
+ }));
139
+ }
140
+ else {
141
+ // ── Pure vector mode ─────────────────────────────────────────
142
+ const fetchK = k * fetchFactor;
143
+ const [queryEmbedding] = await this.config.embeddingProvider.embed([query]);
144
+ results = await this.store.search(queryEmbedding, fetchK);
145
+ }
146
+ // ── Re-rank (optional) ────────────────────────────────────────────
147
+ if (this.reRanker && results.length > 0) {
148
+ results = await this.reRanker.rerank(query, results);
149
+ }
150
+ // Take final top-K
151
+ return results.slice(0, k);
152
+ }
153
+ /**
154
+ * Format search results for injection into the LLM context.
155
+ */
156
+ formatResults(results) {
157
+ if (results.length === 0) {
158
+ return "No relevant documents found in the knowledge base.";
159
+ }
160
+ const lines = [];
161
+ lines.push(`Found ${results.length} relevant document chunk(s):\n`);
162
+ for (let i = 0; i < results.length; i++) {
163
+ const r = results[i];
164
+ lines.push(`### [${i + 1}] ${r.chunk.sourcePath} (chunk ${r.chunk.chunkIndex + 1}, score: ${r.score.toFixed(3)})`);
165
+ lines.push(r.chunk.text);
166
+ lines.push("");
167
+ }
168
+ return lines.join("\n");
169
+ }
170
+ /** Clear all indexed data. */
171
+ async clear() {
172
+ await this.store.clear();
173
+ this.keywordIndex?.clear();
174
+ this.documents = [];
175
+ this._indexed = false;
176
+ }
177
+ }
178
+ exports.RAGManager = RAGManager;
179
+ //# sourceMappingURL=rag-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rag-manager.js","sourceRoot":"","sources":["../../src/rag/rag-manager.ts"],"names":[],"mappings":"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"}