kagent-ts 0.1.3 → 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 (349) 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 +407 -35
  16. package/dist/core/agent.d.ts.map +1 -1
  17. package/dist/core/agent.js +685 -70
  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 +144 -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 +128 -101
  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 +61 -14
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +121 -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/index.d.ts +4 -0
  114. package/dist/mcp/index.d.ts.map +1 -0
  115. package/dist/mcp/index.js +8 -0
  116. package/dist/mcp/index.js.map +1 -0
  117. package/dist/mcp/mcp-client-manager.d.ts +72 -0
  118. package/dist/mcp/mcp-client-manager.d.ts.map +1 -0
  119. package/dist/mcp/mcp-client-manager.js +235 -0
  120. package/dist/mcp/mcp-client-manager.js.map +1 -0
  121. package/dist/mcp/mcp-types.d.ts +58 -0
  122. package/dist/mcp/mcp-types.d.ts.map +1 -0
  123. package/dist/mcp/mcp-types.js +20 -0
  124. package/dist/mcp/mcp-types.js.map +1 -0
  125. package/dist/memory/index.d.ts +3 -0
  126. package/dist/memory/index.d.ts.map +1 -0
  127. package/dist/memory/index.js +6 -0
  128. package/dist/memory/index.js.map +1 -0
  129. package/dist/memory/memory-manager.d.ts +119 -0
  130. package/dist/memory/memory-manager.d.ts.map +1 -0
  131. package/dist/memory/memory-manager.js +334 -0
  132. package/dist/memory/memory-manager.js.map +1 -0
  133. package/dist/messages/types.d.ts +2 -0
  134. package/dist/messages/types.d.ts.map +1 -1
  135. package/dist/orchestrator/index.d.ts +5 -0
  136. package/dist/orchestrator/index.d.ts.map +1 -0
  137. package/dist/orchestrator/index.js +13 -0
  138. package/dist/orchestrator/index.js.map +1 -0
  139. package/dist/orchestrator/json-extractor.d.ts +18 -0
  140. package/dist/orchestrator/json-extractor.d.ts.map +1 -0
  141. package/dist/orchestrator/json-extractor.js +111 -0
  142. package/dist/orchestrator/json-extractor.js.map +1 -0
  143. package/dist/orchestrator/orchestrator-agent.d.ts +152 -0
  144. package/dist/orchestrator/orchestrator-agent.d.ts.map +1 -0
  145. package/dist/orchestrator/orchestrator-agent.js +675 -0
  146. package/dist/orchestrator/orchestrator-agent.js.map +1 -0
  147. package/dist/orchestrator/orchestrator-response.d.ts +40 -0
  148. package/dist/orchestrator/orchestrator-response.d.ts.map +1 -0
  149. package/dist/orchestrator/orchestrator-response.js +275 -0
  150. package/dist/orchestrator/orchestrator-response.js.map +1 -0
  151. package/dist/orchestrator/orchestrator-types.d.ts +116 -0
  152. package/dist/orchestrator/orchestrator-types.d.ts.map +1 -0
  153. package/dist/orchestrator/orchestrator-types.js +3 -0
  154. package/dist/orchestrator/orchestrator-types.js.map +1 -0
  155. package/dist/preferences/preference-manager.d.ts +8 -3
  156. package/dist/preferences/preference-manager.d.ts.map +1 -1
  157. package/dist/preferences/preference-manager.js +17 -4
  158. package/dist/preferences/preference-manager.js.map +1 -1
  159. package/dist/rag/chroma-store.d.ts +52 -0
  160. package/dist/rag/chroma-store.d.ts.map +1 -0
  161. package/dist/rag/chroma-store.js +110 -0
  162. package/dist/rag/chroma-store.js.map +1 -0
  163. package/dist/rag/document-loader.d.ts +21 -0
  164. package/dist/rag/document-loader.d.ts.map +1 -0
  165. package/dist/rag/document-loader.js +129 -0
  166. package/dist/rag/document-loader.js.map +1 -0
  167. package/dist/rag/embedding-provider.d.ts +36 -0
  168. package/dist/rag/embedding-provider.d.ts.map +1 -0
  169. package/dist/rag/embedding-provider.js +74 -0
  170. package/dist/rag/embedding-provider.js.map +1 -0
  171. package/dist/rag/index.d.ts +17 -0
  172. package/dist/rag/index.d.ts.map +1 -0
  173. package/dist/rag/index.js +27 -0
  174. package/dist/rag/index.js.map +1 -0
  175. package/dist/rag/keyword-index.d.ts +53 -0
  176. package/dist/rag/keyword-index.d.ts.map +1 -0
  177. package/dist/rag/keyword-index.js +161 -0
  178. package/dist/rag/keyword-index.js.map +1 -0
  179. package/dist/rag/llm-reranker.d.ts +36 -0
  180. package/dist/rag/llm-reranker.d.ts.map +1 -0
  181. package/dist/rag/llm-reranker.js +95 -0
  182. package/dist/rag/llm-reranker.js.map +1 -0
  183. package/dist/rag/rag-manager.d.ts +54 -0
  184. package/dist/rag/rag-manager.d.ts.map +1 -0
  185. package/dist/rag/rag-manager.js +179 -0
  186. package/dist/rag/rag-manager.js.map +1 -0
  187. package/dist/rag/rag-types.d.ts +143 -0
  188. package/dist/rag/rag-types.d.ts.map +1 -0
  189. package/dist/rag/rag-types.js +9 -0
  190. package/dist/rag/rag-types.js.map +1 -0
  191. package/dist/rag/rrf.d.ts +47 -0
  192. package/dist/rag/rrf.d.ts.map +1 -0
  193. package/dist/rag/rrf.js +70 -0
  194. package/dist/rag/rrf.js.map +1 -0
  195. package/dist/rag/search-knowledge.d.ts +24 -0
  196. package/dist/rag/search-knowledge.d.ts.map +1 -0
  197. package/dist/rag/search-knowledge.js +86 -0
  198. package/dist/rag/search-knowledge.js.map +1 -0
  199. package/dist/rag/text-splitter.d.ts +25 -0
  200. package/dist/rag/text-splitter.d.ts.map +1 -0
  201. package/dist/rag/text-splitter.js +136 -0
  202. package/dist/rag/text-splitter.js.map +1 -0
  203. package/dist/rag/vector-store.d.ts +34 -0
  204. package/dist/rag/vector-store.d.ts.map +1 -0
  205. package/dist/rag/vector-store.js +73 -0
  206. package/dist/rag/vector-store.js.map +1 -0
  207. package/dist/reflection/error-notebook.d.ts +125 -0
  208. package/dist/reflection/error-notebook.d.ts.map +1 -0
  209. package/dist/reflection/error-notebook.js +368 -0
  210. package/dist/reflection/error-notebook.js.map +1 -0
  211. package/dist/reflection/index.d.ts +8 -0
  212. package/dist/reflection/index.d.ts.map +1 -0
  213. package/dist/reflection/index.js +12 -0
  214. package/dist/reflection/index.js.map +1 -0
  215. package/dist/reflection/memory-reflector.d.ts +97 -0
  216. package/dist/reflection/memory-reflector.d.ts.map +1 -0
  217. package/dist/reflection/memory-reflector.js +215 -0
  218. package/dist/reflection/memory-reflector.js.map +1 -0
  219. package/dist/reflection/reflection-agent.d.ts +105 -0
  220. package/dist/reflection/reflection-agent.d.ts.map +1 -0
  221. package/dist/reflection/reflection-agent.js +234 -0
  222. package/dist/reflection/reflection-agent.js.map +1 -0
  223. package/dist/reflection/reflection-hook.d.ts +50 -0
  224. package/dist/reflection/reflection-hook.d.ts.map +1 -0
  225. package/dist/reflection/reflection-hook.js +108 -0
  226. package/dist/reflection/reflection-hook.js.map +1 -0
  227. package/dist/rules/project-rules.d.ts +47 -0
  228. package/dist/rules/project-rules.d.ts.map +1 -0
  229. package/dist/rules/project-rules.js +166 -0
  230. package/dist/rules/project-rules.js.map +1 -0
  231. package/dist/security/boundaries.d.ts +81 -0
  232. package/dist/security/boundaries.d.ts.map +1 -0
  233. package/dist/security/boundaries.js +158 -0
  234. package/dist/security/boundaries.js.map +1 -0
  235. package/dist/security/index.d.ts +2 -0
  236. package/dist/security/index.d.ts.map +1 -0
  237. package/dist/security/index.js +11 -0
  238. package/dist/security/index.js.map +1 -0
  239. package/dist/session/session-types.d.ts +25 -4
  240. package/dist/session/session-types.d.ts.map +1 -1
  241. package/dist/skills/file-skill-loader.d.ts +9 -20
  242. package/dist/skills/file-skill-loader.d.ts.map +1 -1
  243. package/dist/skills/file-skill-loader.js +35 -164
  244. package/dist/skills/file-skill-loader.js.map +1 -1
  245. package/dist/skills/index.d.ts +1 -1
  246. package/dist/skills/index.d.ts.map +1 -1
  247. package/dist/skills/index.js +1 -2
  248. package/dist/skills/index.js.map +1 -1
  249. package/dist/skills/skill-manager.d.ts +22 -29
  250. package/dist/skills/skill-manager.d.ts.map +1 -1
  251. package/dist/skills/skill-manager.js +63 -85
  252. package/dist/skills/skill-manager.js.map +1 -1
  253. package/dist/skills/types.d.ts +4 -16
  254. package/dist/skills/types.d.ts.map +1 -1
  255. package/dist/subagent/index.d.ts +4 -0
  256. package/dist/subagent/index.d.ts.map +1 -0
  257. package/dist/subagent/index.js +8 -0
  258. package/dist/subagent/index.js.map +1 -0
  259. package/dist/subagent/subagent-loader.d.ts +53 -0
  260. package/dist/subagent/subagent-loader.d.ts.map +1 -0
  261. package/dist/subagent/subagent-loader.js +155 -0
  262. package/dist/subagent/subagent-loader.js.map +1 -0
  263. package/dist/subagent/subagent-manager.d.ts +161 -0
  264. package/dist/subagent/subagent-manager.d.ts.map +1 -0
  265. package/dist/subagent/subagent-manager.js +468 -0
  266. package/dist/subagent/subagent-manager.js.map +1 -0
  267. package/dist/subagent/subagent-types.d.ts +77 -0
  268. package/dist/subagent/subagent-types.d.ts.map +1 -0
  269. package/dist/subagent/subagent-types.js +3 -0
  270. package/dist/subagent/subagent-types.js.map +1 -0
  271. package/dist/tools/builtin/bash.d.ts +3 -0
  272. package/dist/tools/builtin/bash.d.ts.map +1 -0
  273. package/dist/tools/builtin/bash.js +87 -0
  274. package/dist/tools/builtin/bash.js.map +1 -0
  275. package/dist/tools/builtin/edit-file.d.ts.map +1 -1
  276. package/dist/tools/builtin/edit-file.js +1 -0
  277. package/dist/tools/builtin/edit-file.js.map +1 -1
  278. package/dist/tools/builtin/index.d.ts +14 -0
  279. package/dist/tools/builtin/index.d.ts.map +1 -1
  280. package/dist/tools/builtin/index.js +45 -1
  281. package/dist/tools/builtin/index.js.map +1 -1
  282. package/dist/tools/builtin/list-errors.d.ts +7 -0
  283. package/dist/tools/builtin/list-errors.d.ts.map +1 -0
  284. package/dist/tools/builtin/list-errors.js +64 -0
  285. package/dist/tools/builtin/list-errors.js.map +1 -0
  286. package/dist/tools/builtin/list-subagents.d.ts +7 -0
  287. package/dist/tools/builtin/list-subagents.d.ts.map +1 -0
  288. package/dist/tools/builtin/list-subagents.js +21 -0
  289. package/dist/tools/builtin/list-subagents.js.map +1 -0
  290. package/dist/tools/builtin/recall.d.ts +11 -0
  291. package/dist/tools/builtin/recall.d.ts.map +1 -0
  292. package/dist/tools/builtin/recall.js +60 -0
  293. package/dist/tools/builtin/recall.js.map +1 -0
  294. package/dist/tools/builtin/remember.d.ts +12 -0
  295. package/dist/tools/builtin/remember.d.ts.map +1 -0
  296. package/dist/tools/builtin/remember.js +72 -0
  297. package/dist/tools/builtin/remember.js.map +1 -0
  298. package/dist/tools/builtin/skill.d.ts +14 -0
  299. package/dist/tools/builtin/skill.d.ts.map +1 -0
  300. package/dist/tools/builtin/skill.js +71 -0
  301. package/dist/tools/builtin/skill.js.map +1 -0
  302. package/dist/tools/builtin/spawn-subagent.d.ts +7 -0
  303. package/dist/tools/builtin/spawn-subagent.d.ts.map +1 -0
  304. package/dist/tools/builtin/spawn-subagent.js +43 -0
  305. package/dist/tools/builtin/spawn-subagent.js.map +1 -0
  306. package/dist/tools/builtin/web-fetch.d.ts +3 -0
  307. package/dist/tools/builtin/web-fetch.d.ts.map +1 -0
  308. package/dist/tools/builtin/web-fetch.js +101 -0
  309. package/dist/tools/builtin/web-fetch.js.map +1 -0
  310. package/dist/tools/builtin/write-file.d.ts.map +1 -1
  311. package/dist/tools/builtin/write-file.js +1 -0
  312. package/dist/tools/builtin/write-file.js.map +1 -1
  313. package/dist/tools/circuit-breaker.d.ts +19 -10
  314. package/dist/tools/circuit-breaker.d.ts.map +1 -1
  315. package/dist/tools/circuit-breaker.js +22 -11
  316. package/dist/tools/circuit-breaker.js.map +1 -1
  317. package/dist/tools/error-tracker.d.ts +28 -44
  318. package/dist/tools/error-tracker.d.ts.map +1 -1
  319. package/dist/tools/error-tracker.js +39 -156
  320. package/dist/tools/error-tracker.js.map +1 -1
  321. package/dist/tools/tool-filter.d.ts +70 -0
  322. package/dist/tools/tool-filter.d.ts.map +1 -0
  323. package/dist/tools/tool-filter.js +92 -0
  324. package/dist/tools/tool-filter.js.map +1 -0
  325. package/dist/tools/tool-output-truncator.d.ts +36 -0
  326. package/dist/tools/tool-output-truncator.d.ts.map +1 -0
  327. package/dist/tools/tool-output-truncator.js +117 -0
  328. package/dist/tools/tool-output-truncator.js.map +1 -0
  329. package/dist/tools/tool-registry.d.ts +25 -9
  330. package/dist/tools/tool-registry.d.ts.map +1 -1
  331. package/dist/tools/tool-registry.js +77 -28
  332. package/dist/tools/tool-registry.js.map +1 -1
  333. package/dist/tools/tool-validator.d.ts +13 -0
  334. package/dist/tools/tool-validator.d.ts.map +1 -0
  335. package/dist/tools/tool-validator.js +116 -0
  336. package/dist/tools/tool-validator.js.map +1 -0
  337. package/dist/tools/types.d.ts +86 -3
  338. package/dist/tools/types.d.ts.map +1 -1
  339. package/dist/tools/types.js +51 -2
  340. package/dist/tools/types.js.map +1 -1
  341. package/dist/trace/trace-logger.d.ts +30 -4
  342. package/dist/trace/trace-logger.d.ts.map +1 -1
  343. package/dist/trace/trace-logger.js +83 -7
  344. package/dist/trace/trace-logger.js.map +1 -1
  345. package/package.json +14 -4
  346. package/dist/compression/sliding-window.d.ts +0 -21
  347. package/dist/compression/sliding-window.d.ts.map +0 -1
  348. package/dist/compression/sliding-window.js +0 -44
  349. package/dist/compression/sliding-window.js.map +0 -1
@@ -0,0 +1,143 @@
1
+ /**
2
+ * RAG (Retrieval-Augmented Generation) type definitions.
3
+ *
4
+ * The RAG module provides document indexing and semantic retrieval,
5
+ * exposed to the LLM as callable tools (`search_knowledge`, `list_knowledge_documents`).
6
+ */
7
+ /** A loaded document with its original metadata. */
8
+ export interface RAGDocument {
9
+ /** Relative path from the documents root directory. */
10
+ path: string;
11
+ /** Raw document text (before chunking). */
12
+ content: string;
13
+ /** Chunks produced by the text splitter. */
14
+ chunks: RAGChunk[];
15
+ }
16
+ /** A single chunk of text with its embedding vector. */
17
+ export interface RAGChunk {
18
+ /** The chunk text content. */
19
+ text: string;
20
+ /** The embedding vector (populated by the EmbeddingProvider). */
21
+ embedding: number[];
22
+ /** Source document path. */
23
+ sourcePath: string;
24
+ /** Zero-based chunk index within the source document. */
25
+ chunkIndex: number;
26
+ }
27
+ /**
28
+ * Interface for generating text embeddings.
29
+ *
30
+ * Built-in implementation: OpenAIEmbeddingProvider (text-embedding-3-small / etc.).
31
+ * Users can provide their own implementation for local models or other providers.
32
+ */
33
+ export interface EmbeddingProvider {
34
+ /** Model identifier (for logging / cost tracking). */
35
+ readonly model: string;
36
+ /**
37
+ * Generate embedding vectors for the given texts.
38
+ *
39
+ * Batch-friendly: the implementation should send all texts in one API call
40
+ * when the provider supports it.
41
+ */
42
+ embed(texts: string[]): Promise<number[][]>;
43
+ /** Dimension of the embedding vectors this provider produces. */
44
+ readonly dimensions: number;
45
+ }
46
+ /** A single search result returned by the vector store. */
47
+ export interface RAGSearchResult {
48
+ /** The matched chunk. */
49
+ chunk: RAGChunk;
50
+ /** Cosine similarity score (0–1). */
51
+ score: number;
52
+ }
53
+ /**
54
+ * Interface for storing and searching embeddings.
55
+ *
56
+ * Built-in implementation: InMemoryVectorStore (cosine similarity, no deps).
57
+ */
58
+ export interface VectorStore {
59
+ /** Add chunks with their embeddings to the store. */
60
+ add(chunks: RAGChunk[]): Promise<void>;
61
+ /**
62
+ * Search for the top-K most similar chunks to the query embedding.
63
+ * Returns results sorted by similarity descending.
64
+ */
65
+ search(queryEmbedding: number[], topK: number): Promise<RAGSearchResult[]>;
66
+ /** Number of chunks currently stored. */
67
+ readonly size: number;
68
+ /** Remove all chunks. */
69
+ clear(): Promise<void>;
70
+ }
71
+ /**
72
+ * Interface for re-ranking retrieved results.
73
+ *
74
+ * After vector search (and optionally BM25 + RRF), a re-ranker can
75
+ * re-score the candidates using a more expensive but accurate model
76
+ * (e.g., a Cross-Encoder or LLM).
77
+ */
78
+ export interface ReRanker {
79
+ /**
80
+ * Re-rank a list of candidate results for a given query.
81
+ *
82
+ * @param query The original search query.
83
+ * @param results The candidate results to re-rank (typically 2–3× topK).
84
+ * @returns Re-ranked results with updated scores, sorted descending.
85
+ */
86
+ rerank(query: string, results: RAGSearchResult[]): Promise<RAGSearchResult[]>;
87
+ }
88
+ /** Configuration for the RAG module (passed via AgentConfig.rag). */
89
+ export interface RAGConfig {
90
+ /** Path to the directory containing documents to index. */
91
+ documentsDir: string;
92
+ /** Provider for generating embeddings. */
93
+ embeddingProvider: EmbeddingProvider;
94
+ /** Maximum characters per chunk (default: 1000). */
95
+ chunkSize?: number;
96
+ /** Characters of overlap between adjacent chunks (default: 200). */
97
+ chunkOverlap?: number;
98
+ /** Number of top results to return per search (default: 5). */
99
+ topK?: number;
100
+ /**
101
+ * Custom vector store instance (default: InMemoryVectorStore).
102
+ *
103
+ * Use this to plug in a persistent or database-backed store:
104
+ * ```ts
105
+ * store: new ChromaVectorStore({ embeddingDimension: 1536 })
106
+ * ```
107
+ */
108
+ store?: VectorStore;
109
+ /**
110
+ * Enable hybrid retrieval (BM25 keyword + vector + RRF fusion).
111
+ *
112
+ * When true, each search runs both a vector similarity search and a BM25
113
+ * keyword search in parallel, then merges the results using Reciprocal
114
+ * Rank Fusion. This improves recall for queries with rare keywords or
115
+ * domain-specific terminology.
116
+ *
117
+ * Default: false (pure vector search).
118
+ */
119
+ hybridSearch?: boolean;
120
+ /**
121
+ * When hybridSearch is enabled, each retrieval system fetches
122
+ * `topK * hybridRetrievalFactor` candidates before RRF fusion.
123
+ *
124
+ * Higher values improve recall at a small latency cost.
125
+ * Default: 3.
126
+ */
127
+ hybridRetrievalFactor?: number;
128
+ /**
129
+ * Optional re-ranker for post-retrieval refinement.
130
+ *
131
+ * After retrieval (and optionally RRF fusion), the candidate results
132
+ * are passed to the re-ranker, which re-scores them using a more
133
+ * accurate model (e.g., a Cross-Encoder or an LLM).
134
+ *
135
+ * The re-ranker receives all pre-ranked candidates and returns a
136
+ * re-sorted list. The final top-K results are taken from the
137
+ * re-ranker's output.
138
+ *
139
+ * Without a re-ranker, results are returned as-is from retrieval/RRF.
140
+ */
141
+ reRanker?: ReRanker;
142
+ }
143
+ //# sourceMappingURL=rag-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rag-types.d.ts","sourceRoot":"","sources":["../../src/rag/rag-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,oDAAoD;AACpD,MAAM,WAAW,WAAW;IAC1B,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,MAAM,EAAE,QAAQ,EAAE,CAAC;CACpB;AAED,wDAAwD;AACxD,MAAM,WAAW,QAAQ;IACvB,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;CACpB;AAID;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,sDAAsD;IACtD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAE5C,iEAAiE;IACjE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAID,2DAA2D;AAC3D,MAAM,WAAW,eAAe;IAC9B,yBAAyB;IACzB,KAAK,EAAE,QAAQ,CAAC;IAChB,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,qDAAqD;IACrD,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvC;;;OAGG;IACH,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAE3E,yCAAyC;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,yBAAyB;IACzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAID;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;CAC/E;AAID,qEAAqE;AACrE,MAAM,WAAW,SAAS;IACxB,2DAA2D;IAC3D,YAAY,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,WAAW,CAAC;IAEpB;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;;;;OAMG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ /**
3
+ * RAG (Retrieval-Augmented Generation) type definitions.
4
+ *
5
+ * The RAG module provides document indexing and semantic retrieval,
6
+ * exposed to the LLM as callable tools (`search_knowledge`, `list_knowledge_documents`).
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ //# sourceMappingURL=rag-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rag-types.js","sourceRoot":"","sources":["../../src/rag/rag-types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Reciprocal Rank Fusion (RRF) — merge multiple ranked result sets
3
+ * into a single combined ranking.
4
+ *
5
+ * RRF is a simple, hyperparameter-free method for combining rankings
6
+ * from different retrieval systems (e.g. vector search + BM25).
7
+ *
8
+ * Formula:
9
+ * RRFscore(d) = Σ_{r ∈ R} 1 / (k + rank_r(d))
10
+ * where `k` is a smoothing constant (default 60) and `rank_r(d)` is the
11
+ * 1-based rank position of document `d` in ranking `r`.
12
+ *
13
+ * Reference: Cormack et al. "Reciprocal Rank Fusion outperforms Condorcet
14
+ * and individual rank learning methods" (SIGIR 2009).
15
+ */
16
+ import type { RAGChunk } from "./rag-types";
17
+ /** A single result from one retrieval system. */
18
+ export interface RankedResult {
19
+ chunk: RAGChunk;
20
+ score: number;
21
+ }
22
+ /** The output of RRF fusion. */
23
+ export interface RRFFusionResult {
24
+ chunk: RAGChunk;
25
+ rrfScore: number;
26
+ /** Which rankings contributed to this result (bitmask: 1<<0 = vec, 1<<1 = bm25, etc.). */
27
+ sources: number;
28
+ }
29
+ /**
30
+ * Generate a unique key for a chunk.
31
+ * Uses sourcePath + chunkIndex to uniquely identify a chunk across rankings.
32
+ */
33
+ export declare function chunkKey(chunk: RAGChunk): string;
34
+ /**
35
+ * Fuse multiple ranked result lists using Reciprocal Rank Fusion.
36
+ *
37
+ * Each element of `rankings` is one ranked result list (best first).
38
+ * Results from the same chunk (identified by `chunkKey`) across different
39
+ * rankings have their RRF scores summed.
40
+ *
41
+ * @param rankings Array of ranked result lists, one per retrieval system.
42
+ * @param k RRF smoothing constant (default: 60).
43
+ * @param topN Number of top results to return (default: 10).
44
+ * @returns Combined results sorted by RRF score descending.
45
+ */
46
+ export declare function rrfFusion(rankings: RankedResult[][], k?: number, topN?: number): RRFFusionResult[];
47
+ //# sourceMappingURL=rrf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rrf.d.ts","sourceRoot":"","sources":["../../src/rag/rrf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAI5C,iDAAiD;AACjD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,QAAQ,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,gCAAgC;AAChC,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,QAAQ,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,0FAA0F;IAC1F,OAAO,EAAE,MAAM,CAAC;CACjB;AAID;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAEhD;AAID;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CACvB,QAAQ,EAAE,YAAY,EAAE,EAAE,EAC1B,CAAC,GAAE,MAAW,EACd,IAAI,GAAE,MAAW,GAChB,eAAe,EAAE,CA+BnB"}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ /**
3
+ * Reciprocal Rank Fusion (RRF) — merge multiple ranked result sets
4
+ * into a single combined ranking.
5
+ *
6
+ * RRF is a simple, hyperparameter-free method for combining rankings
7
+ * from different retrieval systems (e.g. vector search + BM25).
8
+ *
9
+ * Formula:
10
+ * RRFscore(d) = Σ_{r ∈ R} 1 / (k + rank_r(d))
11
+ * where `k` is a smoothing constant (default 60) and `rank_r(d)` is the
12
+ * 1-based rank position of document `d` in ranking `r`.
13
+ *
14
+ * Reference: Cormack et al. "Reciprocal Rank Fusion outperforms Condorcet
15
+ * and individual rank learning methods" (SIGIR 2009).
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.chunkKey = chunkKey;
19
+ exports.rrfFusion = rrfFusion;
20
+ // ─── Chunk key ───────────────────────────────────────────────────────────────
21
+ /**
22
+ * Generate a unique key for a chunk.
23
+ * Uses sourcePath + chunkIndex to uniquely identify a chunk across rankings.
24
+ */
25
+ function chunkKey(chunk) {
26
+ return `${chunk.sourcePath}#${chunk.chunkIndex}`;
27
+ }
28
+ // ─── RRF ─────────────────────────────────────────────────────────────────────
29
+ /**
30
+ * Fuse multiple ranked result lists using Reciprocal Rank Fusion.
31
+ *
32
+ * Each element of `rankings` is one ranked result list (best first).
33
+ * Results from the same chunk (identified by `chunkKey`) across different
34
+ * rankings have their RRF scores summed.
35
+ *
36
+ * @param rankings Array of ranked result lists, one per retrieval system.
37
+ * @param k RRF smoothing constant (default: 60).
38
+ * @param topN Number of top results to return (default: 10).
39
+ * @returns Combined results sorted by RRF score descending.
40
+ */
41
+ function rrfFusion(rankings, k = 60, topN = 10) {
42
+ // Map chunkKey → { chunk, accumulated RRF score, source bitmask }
43
+ const fused = new Map();
44
+ for (let r = 0; r < rankings.length; r++) {
45
+ const ranking = rankings[r];
46
+ const sourceBit = 1 << r;
47
+ for (let i = 0; i < ranking.length; i++) {
48
+ const item = ranking[i];
49
+ const key = chunkKey(item.chunk);
50
+ const rank = i + 1; // 1-based rank
51
+ const existing = fused.get(key);
52
+ if (existing) {
53
+ existing.rrfScore += 1 / (k + rank);
54
+ existing.sources |= sourceBit;
55
+ }
56
+ else {
57
+ fused.set(key, {
58
+ chunk: item.chunk,
59
+ rrfScore: 1 / (k + rank),
60
+ sources: sourceBit,
61
+ });
62
+ }
63
+ }
64
+ }
65
+ // Sort by RRF score descending, take top-N
66
+ return Array.from(fused.values())
67
+ .sort((a, b) => b.rrfScore - a.rrfScore)
68
+ .slice(0, topN);
69
+ }
70
+ //# sourceMappingURL=rrf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rrf.js","sourceRoot":"","sources":["../../src/rag/rrf.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;AA0BH,4BAEC;AAgBD,8BAmCC;AA3DD,gFAAgF;AAEhF;;;GAGG;AACH,SAAgB,QAAQ,CAAC,KAAe;IACtC,OAAO,GAAG,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;AACnD,CAAC;AAED,gFAAgF;AAEhF;;;;;;;;;;;GAWG;AACH,SAAgB,SAAS,CACvB,QAA0B,EAC1B,IAAY,EAAE,EACd,OAAe,EAAE;IAEjB,kEAAkE;IAClE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkE,CAAC;IAExF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,CAAC;QAEzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjC,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe;YAEnC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;gBACpC,QAAQ,CAAC,OAAO,IAAI,SAAS,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;oBACb,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;oBACxB,OAAO,EAAE,SAAS;iBACnB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;SAC9B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;SACvC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AACpB,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Built-in RAG tools registered into the main agent's ToolRegistry.
3
+ *
4
+ * These tools are callable by the LLM:
5
+ * - `search_knowledge` — semantic search over the indexed knowledge base
6
+ * - `list_knowledge_documents` — list available document paths
7
+ */
8
+ import type { Tool } from "../tools/types";
9
+ import type { RAGManager } from "./rag-manager";
10
+ /**
11
+ * Create the `search_knowledge` tool.
12
+ *
13
+ * The LLM calls this to find relevant context from the indexed document
14
+ * store before generating an answer.
15
+ */
16
+ export declare function createSearchKnowledgeTool(manager: RAGManager): Tool;
17
+ /**
18
+ * Create the `list_knowledge_documents` tool.
19
+ *
20
+ * The LLM can call this to discover what documents are available before
21
+ * performing a targeted search.
22
+ */
23
+ export declare function createListKnowledgeDocumentsTool(manager: RAGManager): Tool;
24
+ //# sourceMappingURL=search-knowledge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-knowledge.d.ts","sourceRoot":"","sources":["../../src/rag/search-knowledge.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAsCnE;AAED;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CA6B1E"}
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ /**
3
+ * Built-in RAG tools registered into the main agent's ToolRegistry.
4
+ *
5
+ * These tools are callable by the LLM:
6
+ * - `search_knowledge` — semantic search over the indexed knowledge base
7
+ * - `list_knowledge_documents` — list available document paths
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.createSearchKnowledgeTool = createSearchKnowledgeTool;
11
+ exports.createListKnowledgeDocumentsTool = createListKnowledgeDocumentsTool;
12
+ /**
13
+ * Create the `search_knowledge` tool.
14
+ *
15
+ * The LLM calls this to find relevant context from the indexed document
16
+ * store before generating an answer.
17
+ */
18
+ function createSearchKnowledgeTool(manager) {
19
+ return {
20
+ name: "search_knowledge",
21
+ description: "Search the knowledge base for documents relevant to a query. " +
22
+ "Use this when you need context from the indexed documents to answer " +
23
+ "a question. Returns the top matching text chunks with source paths " +
24
+ "and similarity scores.",
25
+ parameters: {
26
+ type: "object",
27
+ properties: {
28
+ query: {
29
+ type: "string",
30
+ description: "The natural-language search query. Be specific — include key terms and concepts.",
31
+ },
32
+ },
33
+ required: ["query"],
34
+ },
35
+ execute: async (args) => {
36
+ const query = String(args.query ?? "").trim();
37
+ if (!query) {
38
+ return "Error: `query` is required and must be non-empty.";
39
+ }
40
+ if (!manager.indexed || manager.chunkCount === 0) {
41
+ return "The knowledge base is empty. No documents have been indexed yet.";
42
+ }
43
+ try {
44
+ const results = await manager.search(query);
45
+ return manager.formatResults(results);
46
+ }
47
+ catch (err) {
48
+ const message = err instanceof Error ? err.message : String(err);
49
+ return `Error searching knowledge base: ${message}`;
50
+ }
51
+ },
52
+ };
53
+ }
54
+ /**
55
+ * Create the `list_knowledge_documents` tool.
56
+ *
57
+ * The LLM can call this to discover what documents are available before
58
+ * performing a targeted search.
59
+ */
60
+ function createListKnowledgeDocumentsTool(manager) {
61
+ return {
62
+ name: "list_knowledge_documents",
63
+ description: "List all documents currently indexed in the knowledge base. " +
64
+ "Use this to see what topics are covered before searching.",
65
+ parameters: {
66
+ type: "object",
67
+ properties: {},
68
+ required: [],
69
+ },
70
+ execute: async (_args) => {
71
+ if (!manager.indexed) {
72
+ return "The knowledge base has not been indexed yet.";
73
+ }
74
+ const paths = manager.documentPaths;
75
+ if (paths.length === 0) {
76
+ return "No documents in the knowledge base.";
77
+ }
78
+ const lines = [
79
+ `${paths.length} document(s) indexed:\n`,
80
+ ...paths.map((p) => `- ${p}`),
81
+ ];
82
+ return lines.join("\n");
83
+ },
84
+ };
85
+ }
86
+ //# sourceMappingURL=search-knowledge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-knowledge.js","sourceRoot":"","sources":["../../src/rag/search-knowledge.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAWH,8DAsCC;AAQD,4EA6BC;AAjFD;;;;;GAKG;AACH,SAAgB,yBAAyB,CAAC,OAAmB;IAC3D,OAAO;QACL,IAAI,EAAE,kBAAkB;QACxB,WAAW,EACT,+DAA+D;YAC/D,sEAAsE;YACtE,qEAAqE;YACrE,wBAAwB;QAC1B,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,kFAAkF;iBACrF;aACF;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB;QACD,OAAO,EAAE,KAAK,EAAE,IAA6B,EAAmB,EAAE;YAChE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,mDAAmD,CAAC;YAC7D,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;gBACjD,OAAO,kEAAkE,CAAC;YAC5E,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC5C,OAAO,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACxC,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjE,OAAO,mCAAmC,OAAO,EAAE,CAAC;YACtD,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAgB,gCAAgC,CAAC,OAAmB;IAClE,OAAO;QACL,IAAI,EAAE,0BAA0B;QAChC,WAAW,EACT,8DAA8D;YAC9D,2DAA2D;QAC7D,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;YACd,QAAQ,EAAE,EAAE;SACb;QACD,OAAO,EAAE,KAAK,EAAE,KAA8B,EAAmB,EAAE;YACjE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACrB,OAAO,8CAA8C,CAAC;YACxD,CAAC;YAED,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC;YACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,qCAAqC,CAAC;YAC/C,CAAC;YAED,MAAM,KAAK,GAAa;gBACtB,GAAG,KAAK,CAAC,MAAM,yBAAyB;gBACxC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;aAC9B,CAAC;YAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Recursive priority-based text splitter.
3
+ *
4
+ * Splits text into chunks by trying separators in priority order:
5
+ * 1. Markdown heading boundaries (##, ###)
6
+ * 2. Paragraph boundaries (double newline)
7
+ * 3. Sentence endings (。!?. ! ? + single newline)
8
+ * 4. Clause pauses (;,、, ; :)
9
+ * 5. Hard cutoff (character-level, last resort)
10
+ *
11
+ * At each level the splitter finds the last separator within the chunk_size
12
+ * window and breaks there. If no separator is found, it falls back to the
13
+ * next priority level.
14
+ *
15
+ * Chunks overlap: adjacent chunks share `chunkOverlap` characters of context.
16
+ * The overlap boundary also respects separator priorities.
17
+ */
18
+ /**
19
+ * Split `text` into chunks not exceeding `chunkSize` characters,
20
+ * with `chunkOverlap` characters of context between adjacent chunks.
21
+ *
22
+ * Returns an array of chunk text strings (no empty strings).
23
+ */
24
+ export declare function splitText(text: string, chunkSize: number, chunkOverlap: number): string[];
25
+ //# sourceMappingURL=text-splitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-splitter.d.ts","sourceRoot":"","sources":["../../src/rag/text-splitter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAqBH;;;;;GAKG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,MAAM,EAAE,CA8BV"}
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ /**
3
+ * Recursive priority-based text splitter.
4
+ *
5
+ * Splits text into chunks by trying separators in priority order:
6
+ * 1. Markdown heading boundaries (##, ###)
7
+ * 2. Paragraph boundaries (double newline)
8
+ * 3. Sentence endings (。!?. ! ? + single newline)
9
+ * 4. Clause pauses (;,、, ; :)
10
+ * 5. Hard cutoff (character-level, last resort)
11
+ *
12
+ * At each level the splitter finds the last separator within the chunk_size
13
+ * window and breaks there. If no separator is found, it falls back to the
14
+ * next priority level.
15
+ *
16
+ * Chunks overlap: adjacent chunks share `chunkOverlap` characters of context.
17
+ * The overlap boundary also respects separator priorities.
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.splitText = splitText;
21
+ // ─── Separator definitions ───────────────────────────────────────────────────
22
+ /**
23
+ * Separators at each priority level (ordered highest → lowest).
24
+ * Each entry is a list of equivalent separators.
25
+ */
26
+ const SEPARATOR_PRIORITIES = [
27
+ // Priority 1: Markdown heading boundaries
28
+ ["\n## ", "\n### ", "\n#### ", "\n# "],
29
+ // Priority 2: Paragraph boundaries
30
+ ["\n\n", "\r\n\r\n"],
31
+ // Priority 3: Sentence endings (Chinese + English)
32
+ ["。", "!", "?", ". ", "! ", "? ", "\n", ".\n", "!\n", "?\n"],
33
+ // Priority 4: Clause pauses
34
+ [";", ",", ":", "、", "; ", ", ", ": ", ";\n", ",\n"],
35
+ ];
36
+ // ─── Public API ──────────────────────────────────────────────────────────────
37
+ /**
38
+ * Split `text` into chunks not exceeding `chunkSize` characters,
39
+ * with `chunkOverlap` characters of context between adjacent chunks.
40
+ *
41
+ * Returns an array of chunk text strings (no empty strings).
42
+ */
43
+ function splitText(text, chunkSize, chunkOverlap) {
44
+ if (text.trim().length === 0)
45
+ return [];
46
+ if (text.length <= chunkSize)
47
+ return [text];
48
+ const chunks = [];
49
+ let start = 0;
50
+ while (start < text.length) {
51
+ // How far ahead we can look for a split point
52
+ const windowEnd = Math.min(start + chunkSize, text.length);
53
+ // If the remainder fits in one chunk, take it all
54
+ if (windowEnd >= text.length) {
55
+ const remainder = text.slice(start).trim();
56
+ if (remainder.length > 0)
57
+ chunks.push(remainder);
58
+ break;
59
+ }
60
+ // Find the best split point within [start, windowEnd]
61
+ const splitAt = findSplitPoint(text, start, windowEnd);
62
+ const chunk = text.slice(start, splitAt).trim();
63
+ if (chunk.length > 0)
64
+ chunks.push(chunk);
65
+ // Advance start: split point minus overlap, bounded by previous start
66
+ const overlapStart = findOverlapStart(text, splitAt, start, chunkOverlap);
67
+ start = overlapStart;
68
+ }
69
+ return chunks;
70
+ }
71
+ // ─── Internal helpers ────────────────────────────────────────────────────────
72
+ /**
73
+ * Find the best split position within the window [start, windowEnd].
74
+ *
75
+ * Tries each priority level; returns the position of the *last* matching
76
+ * separator + its length (so the separator stays with the left chunk).
77
+ * Falls back to `windowEnd` (hard cut) if no separator is found.
78
+ */
79
+ function findSplitPoint(text, start, windowEnd) {
80
+ for (const separators of SEPARATOR_PRIORITIES) {
81
+ let bestPos = -1;
82
+ let bestSepLen = 0;
83
+ for (const sep of separators) {
84
+ // Search backwards from windowEnd for the last occurrence of this separator
85
+ let pos = text.lastIndexOf(sep, windowEnd);
86
+ while (pos >= start && pos + sep.length > windowEnd) {
87
+ // Separator straddles the window boundary — try earlier
88
+ pos = text.lastIndexOf(sep, pos - 1);
89
+ }
90
+ if (pos >= start && pos > bestPos) {
91
+ bestPos = pos;
92
+ bestSepLen = sep.length;
93
+ }
94
+ }
95
+ if (bestPos >= start) {
96
+ return bestPos + bestSepLen; // Include the separator in the left chunk
97
+ }
98
+ }
99
+ // Last resort: hard cut at windowEnd
100
+ return windowEnd;
101
+ }
102
+ /**
103
+ * Calculate the start position for the next chunk, accounting for overlap.
104
+ *
105
+ * From `splitAt`, step back by approximately `chunkOverlap` characters,
106
+ * then walk further back to the nearest high-priority separator so the
107
+ * overlap starts at a natural boundary.
108
+ */
109
+ function findOverlapStart(text, splitAt, minStart, chunkOverlap) {
110
+ if (chunkOverlap <= 0)
111
+ return splitAt;
112
+ const target = Math.max(minStart, splitAt - chunkOverlap);
113
+ if (target <= minStart)
114
+ return target;
115
+ // Look for a natural boundary near the target position
116
+ for (const separators of SEPARATOR_PRIORITIES) {
117
+ let bestPos = -1;
118
+ for (const sep of separators) {
119
+ // Search forward from target
120
+ let pos = text.indexOf(sep, target);
121
+ if (pos >= target && pos < splitAt && (bestPos === -1 || pos < bestPos)) {
122
+ bestPos = pos;
123
+ }
124
+ // Also try backward from target
125
+ pos = text.lastIndexOf(sep, target);
126
+ if (pos >= minStart && (bestPos === -1 || Math.abs(pos - target) < Math.abs(bestPos - target))) {
127
+ bestPos = pos;
128
+ }
129
+ }
130
+ if (bestPos >= minStart) {
131
+ return bestPos + 1; // Start after the separator
132
+ }
133
+ }
134
+ return target;
135
+ }
136
+ //# sourceMappingURL=text-splitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-splitter.js","sourceRoot":"","sources":["../../src/rag/text-splitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * In-memory vector store with cosine similarity search.
3
+ *
4
+ * Zero external dependencies — pure TypeScript implementation suitable
5
+ * for knowledge bases with up to ~10K chunks.
6
+ */
7
+ import type { VectorStore, RAGChunk, RAGSearchResult } from "./rag-types";
8
+ /**
9
+ * An in-memory vector store backed by a simple array.
10
+ *
11
+ * Search uses brute-force cosine similarity, which is fast enough
12
+ * for typical knowledge base sizes (a few thousand chunks).
13
+ */
14
+ export declare class InMemoryVectorStore implements VectorStore {
15
+ private chunks;
16
+ add(chunks: RAGChunk[]): Promise<void>;
17
+ get size(): number;
18
+ clear(): Promise<void>;
19
+ /**
20
+ * Search for the top-K most similar chunks via cosine similarity.
21
+ *
22
+ * Returns results sorted by similarity score descending (best match first).
23
+ * Chunks with near-zero-norm embeddings are excluded from results.
24
+ */
25
+ search(queryEmbedding: number[], topK: number): Promise<RAGSearchResult[]>;
26
+ }
27
+ /**
28
+ * Compute cosine similarity between two vectors.
29
+ *
30
+ * Returns a value in [0, 1] for non-negative embeddings (the usual case),
31
+ * or [-1, 1] in the general case. Returns 0 for zero-norm vectors.
32
+ */
33
+ export declare function cosineSimilarity(a: number[], b: number[]): number;
34
+ //# sourceMappingURL=vector-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-store.d.ts","sourceRoot":"","sources":["../../src/rag/vector-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE1E;;;;;GAKG;AACH,qBAAa,mBAAoB,YAAW,WAAW;IACrD,OAAO,CAAC,MAAM,CAAkB;IAE1B,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,IAAI,IAAI,IAAI,MAAM,CAEjB;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;;;;OAKG;IACG,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;CAejF;AAID;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAoBjE"}