@mcp-graph-workflow/mcp-graph 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (606) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +157 -0
  3. package/dist/api/middleware/error-handler.d.ts +3 -0
  4. package/dist/api/middleware/error-handler.d.ts.map +1 -0
  5. package/dist/api/middleware/error-handler.js +48 -0
  6. package/dist/api/middleware/error-handler.js.map +1 -0
  7. package/dist/api/middleware/request-logger.d.ts +6 -0
  8. package/dist/api/middleware/request-logger.d.ts.map +1 -0
  9. package/dist/api/middleware/request-logger.js +19 -0
  10. package/dist/api/middleware/request-logger.js.map +1 -0
  11. package/dist/api/middleware/validate.d.ts +5 -0
  12. package/dist/api/middleware/validate.d.ts.map +1 -0
  13. package/dist/api/middleware/validate.js +23 -0
  14. package/dist/api/middleware/validate.js.map +1 -0
  15. package/dist/api/router.d.ts +11 -0
  16. package/dist/api/router.d.ts.map +1 -0
  17. package/dist/api/router.js +51 -0
  18. package/dist/api/router.js.map +1 -0
  19. package/dist/api/routes/benchmark.d.ts +4 -0
  20. package/dist/api/routes/benchmark.d.ts.map +1 -0
  21. package/dist/api/routes/benchmark.js +86 -0
  22. package/dist/api/routes/benchmark.js.map +1 -0
  23. package/dist/api/routes/capture.d.ts +3 -0
  24. package/dist/api/routes/capture.d.ts.map +1 -0
  25. package/dist/api/routes/capture.js +31 -0
  26. package/dist/api/routes/capture.js.map +1 -0
  27. package/dist/api/routes/context.d.ts +4 -0
  28. package/dist/api/routes/context.d.ts.map +1 -0
  29. package/dist/api/routes/context.js +25 -0
  30. package/dist/api/routes/context.js.map +1 -0
  31. package/dist/api/routes/docs-cache.d.ts +4 -0
  32. package/dist/api/routes/docs-cache.d.ts.map +1 -0
  33. package/dist/api/routes/docs-cache.js +79 -0
  34. package/dist/api/routes/docs-cache.js.map +1 -0
  35. package/dist/api/routes/edges.d.ts +4 -0
  36. package/dist/api/routes/edges.d.ts.map +1 -0
  37. package/dist/api/routes/edges.js +50 -0
  38. package/dist/api/routes/edges.js.map +1 -0
  39. package/dist/api/routes/events.d.ts +4 -0
  40. package/dist/api/routes/events.d.ts.map +1 -0
  41. package/dist/api/routes/events.js +37 -0
  42. package/dist/api/routes/events.js.map +1 -0
  43. package/dist/api/routes/gitnexus.d.ts +12 -0
  44. package/dist/api/routes/gitnexus.d.ts.map +1 -0
  45. package/dist/api/routes/gitnexus.js +162 -0
  46. package/dist/api/routes/gitnexus.js.map +1 -0
  47. package/dist/api/routes/graph.d.ts +4 -0
  48. package/dist/api/routes/graph.d.ts.map +1 -0
  49. package/dist/api/routes/graph.js +39 -0
  50. package/dist/api/routes/graph.js.map +1 -0
  51. package/dist/api/routes/import.d.ts +4 -0
  52. package/dist/api/routes/import.d.ts.map +1 -0
  53. package/dist/api/routes/import.js +92 -0
  54. package/dist/api/routes/import.js.map +1 -0
  55. package/dist/api/routes/insights.d.ts +4 -0
  56. package/dist/api/routes/insights.d.ts.map +1 -0
  57. package/dist/api/routes/insights.js +40 -0
  58. package/dist/api/routes/insights.js.map +1 -0
  59. package/dist/api/routes/integrations.d.ts +4 -0
  60. package/dist/api/routes/integrations.d.ts.map +1 -0
  61. package/dist/api/routes/integrations.js +85 -0
  62. package/dist/api/routes/integrations.js.map +1 -0
  63. package/dist/api/routes/knowledge.d.ts +8 -0
  64. package/dist/api/routes/knowledge.d.ts.map +1 -0
  65. package/dist/api/routes/knowledge.js +144 -0
  66. package/dist/api/routes/knowledge.js.map +1 -0
  67. package/dist/api/routes/nodes.d.ts +4 -0
  68. package/dist/api/routes/nodes.d.ts.map +1 -0
  69. package/dist/api/routes/nodes.js +123 -0
  70. package/dist/api/routes/nodes.js.map +1 -0
  71. package/dist/api/routes/project.d.ts +4 -0
  72. package/dist/api/routes/project.d.ts.map +1 -0
  73. package/dist/api/routes/project.js +70 -0
  74. package/dist/api/routes/project.js.map +1 -0
  75. package/dist/api/routes/rag.d.ts +8 -0
  76. package/dist/api/routes/rag.d.ts.map +1 -0
  77. package/dist/api/routes/rag.js +70 -0
  78. package/dist/api/routes/rag.js.map +1 -0
  79. package/dist/api/routes/search.d.ts +4 -0
  80. package/dist/api/routes/search.d.ts.map +1 -0
  81. package/dist/api/routes/search.js +25 -0
  82. package/dist/api/routes/search.js.map +1 -0
  83. package/dist/api/routes/skills.d.ts +3 -0
  84. package/dist/api/routes/skills.d.ts.map +1 -0
  85. package/dist/api/routes/skills.js +16 -0
  86. package/dist/api/routes/skills.js.map +1 -0
  87. package/dist/api/routes/stats.d.ts +4 -0
  88. package/dist/api/routes/stats.d.ts.map +1 -0
  89. package/dist/api/routes/stats.js +14 -0
  90. package/dist/api/routes/stats.js.map +1 -0
  91. package/dist/cli/commands/import-cmd.d.ts +3 -0
  92. package/dist/cli/commands/import-cmd.d.ts.map +1 -0
  93. package/dist/cli/commands/import-cmd.js +38 -0
  94. package/dist/cli/commands/import-cmd.js.map +1 -0
  95. package/dist/cli/commands/index-cmd.d.ts +3 -0
  96. package/dist/cli/commands/index-cmd.d.ts.map +1 -0
  97. package/dist/cli/commands/index-cmd.js +50 -0
  98. package/dist/cli/commands/index-cmd.js.map +1 -0
  99. package/dist/cli/commands/init.d.ts +3 -0
  100. package/dist/cli/commands/init.d.ts.map +1 -0
  101. package/dist/cli/commands/init.js +24 -0
  102. package/dist/cli/commands/init.js.map +1 -0
  103. package/dist/cli/commands/serve.d.ts +3 -0
  104. package/dist/cli/commands/serve.d.ts.map +1 -0
  105. package/dist/cli/commands/serve.js +18 -0
  106. package/dist/cli/commands/serve.js.map +1 -0
  107. package/dist/cli/commands/stats.d.ts +3 -0
  108. package/dist/cli/commands/stats.d.ts.map +1 -0
  109. package/dist/cli/commands/stats.js +39 -0
  110. package/dist/cli/commands/stats.js.map +1 -0
  111. package/dist/cli/index.d.ts +3 -0
  112. package/dist/cli/index.d.ts.map +1 -0
  113. package/dist/cli/index.js +30 -0
  114. package/dist/cli/index.js.map +1 -0
  115. package/dist/core/capture/content-extractor.d.ts +21 -0
  116. package/dist/core/capture/content-extractor.d.ts.map +1 -0
  117. package/dist/core/capture/content-extractor.js +74 -0
  118. package/dist/core/capture/content-extractor.js.map +1 -0
  119. package/dist/core/capture/validate-runner.d.ts +28 -0
  120. package/dist/core/capture/validate-runner.d.ts.map +1 -0
  121. package/dist/core/capture/validate-runner.js +42 -0
  122. package/dist/core/capture/validate-runner.js.map +1 -0
  123. package/dist/core/capture/web-capture.d.ts +20 -0
  124. package/dist/core/capture/web-capture.d.ts.map +1 -0
  125. package/dist/core/capture/web-capture.js +51 -0
  126. package/dist/core/capture/web-capture.js.map +1 -0
  127. package/dist/core/config/ai-memory-generator.d.ts +14 -0
  128. package/dist/core/config/ai-memory-generator.d.ts.map +1 -0
  129. package/dist/core/config/ai-memory-generator.js +130 -0
  130. package/dist/core/config/ai-memory-generator.js.map +1 -0
  131. package/dist/core/config/config-loader.d.ts +3 -0
  132. package/dist/core/config/config-loader.d.ts.map +1 -0
  133. package/dist/core/config/config-loader.js +48 -0
  134. package/dist/core/config/config-loader.js.map +1 -0
  135. package/dist/core/config/config-schema.d.ts +12 -0
  136. package/dist/core/config/config-schema.d.ts.map +1 -0
  137. package/dist/core/config/config-schema.js +13 -0
  138. package/dist/core/config/config-schema.js.map +1 -0
  139. package/dist/core/context/bm25-compressor.d.ts +21 -0
  140. package/dist/core/context/bm25-compressor.d.ts.map +1 -0
  141. package/dist/core/context/bm25-compressor.js +87 -0
  142. package/dist/core/context/bm25-compressor.js.map +1 -0
  143. package/dist/core/context/compact-context.d.ts +56 -0
  144. package/dist/core/context/compact-context.d.ts.map +1 -0
  145. package/dist/core/context/compact-context.js +170 -0
  146. package/dist/core/context/compact-context.js.map +1 -0
  147. package/dist/core/context/context-assembler.d.ts +43 -0
  148. package/dist/core/context/context-assembler.d.ts.map +1 -0
  149. package/dist/core/context/context-assembler.js +113 -0
  150. package/dist/core/context/context-assembler.js.map +1 -0
  151. package/dist/core/context/rag-context.d.ts +44 -0
  152. package/dist/core/context/rag-context.d.ts.map +1 -0
  153. package/dist/core/context/rag-context.js +93 -0
  154. package/dist/core/context/rag-context.js.map +1 -0
  155. package/dist/core/context/tiered-context.d.ts +35 -0
  156. package/dist/core/context/tiered-context.d.ts.map +1 -0
  157. package/dist/core/context/tiered-context.js +92 -0
  158. package/dist/core/context/tiered-context.js.map +1 -0
  159. package/dist/core/context/token-estimator.d.ts +7 -0
  160. package/dist/core/context/token-estimator.d.ts.map +1 -0
  161. package/dist/core/context/token-estimator.js +9 -0
  162. package/dist/core/context/token-estimator.js.map +1 -0
  163. package/dist/core/docs/docs-cache-store.d.ts +24 -0
  164. package/dist/core/docs/docs-cache-store.d.ts.map +1 -0
  165. package/dist/core/docs/docs-cache-store.js +61 -0
  166. package/dist/core/docs/docs-cache-store.js.map +1 -0
  167. package/dist/core/docs/docs-syncer.d.ts +13 -0
  168. package/dist/core/docs/docs-syncer.d.ts.map +1 -0
  169. package/dist/core/docs/docs-syncer.js +38 -0
  170. package/dist/core/docs/docs-syncer.js.map +1 -0
  171. package/dist/core/docs/mcp-context7-fetcher.d.ts +17 -0
  172. package/dist/core/docs/mcp-context7-fetcher.d.ts.map +1 -0
  173. package/dist/core/docs/mcp-context7-fetcher.js +87 -0
  174. package/dist/core/docs/mcp-context7-fetcher.js.map +1 -0
  175. package/dist/core/docs/stack-detector.d.ts +21 -0
  176. package/dist/core/docs/stack-detector.d.ts.map +1 -0
  177. package/dist/core/docs/stack-detector.js +101 -0
  178. package/dist/core/docs/stack-detector.js.map +1 -0
  179. package/dist/core/events/event-bus.d.ts +26 -0
  180. package/dist/core/events/event-bus.d.ts.map +1 -0
  181. package/dist/core/events/event-bus.js +47 -0
  182. package/dist/core/events/event-bus.js.map +1 -0
  183. package/dist/core/events/event-types.d.ts +71 -0
  184. package/dist/core/events/event-types.d.ts.map +1 -0
  185. package/dist/core/events/event-types.js +2 -0
  186. package/dist/core/events/event-types.js.map +1 -0
  187. package/dist/core/graph/graph-indexes.d.ts +3 -0
  188. package/dist/core/graph/graph-indexes.d.ts.map +1 -0
  189. package/dist/core/graph/graph-indexes.js +28 -0
  190. package/dist/core/graph/graph-indexes.js.map +1 -0
  191. package/dist/core/graph/graph-types.d.ts +72 -0
  192. package/dist/core/graph/graph-types.d.ts.map +1 -0
  193. package/dist/core/graph/graph-types.js +2 -0
  194. package/dist/core/graph/graph-types.js.map +1 -0
  195. package/dist/core/graph/mermaid-export.d.ts +9 -0
  196. package/dist/core/graph/mermaid-export.d.ts.map +1 -0
  197. package/dist/core/graph/mermaid-export.js +80 -0
  198. package/dist/core/graph/mermaid-export.js.map +1 -0
  199. package/dist/core/importer/import-prd.d.ts +7 -0
  200. package/dist/core/importer/import-prd.d.ts.map +1 -0
  201. package/dist/core/importer/import-prd.js +7 -0
  202. package/dist/core/importer/import-prd.js.map +1 -0
  203. package/dist/core/importer/prd-to-graph.d.ts +18 -0
  204. package/dist/core/importer/prd-to-graph.d.ts.map +1 -0
  205. package/dist/core/importer/prd-to-graph.js +195 -0
  206. package/dist/core/importer/prd-to-graph.js.map +1 -0
  207. package/dist/core/insights/bottleneck-detector.d.ts +31 -0
  208. package/dist/core/insights/bottleneck-detector.d.ts.map +1 -0
  209. package/dist/core/insights/bottleneck-detector.js +84 -0
  210. package/dist/core/insights/bottleneck-detector.js.map +1 -0
  211. package/dist/core/insights/metrics-calculator.d.ts +31 -0
  212. package/dist/core/insights/metrics-calculator.d.ts.map +1 -0
  213. package/dist/core/insights/metrics-calculator.js +78 -0
  214. package/dist/core/insights/metrics-calculator.js.map +1 -0
  215. package/dist/core/insights/skill-recommender.d.ts +21 -0
  216. package/dist/core/insights/skill-recommender.d.ts.map +1 -0
  217. package/dist/core/insights/skill-recommender.js +129 -0
  218. package/dist/core/insights/skill-recommender.js.map +1 -0
  219. package/dist/core/integrations/enriched-context.d.ts +24 -0
  220. package/dist/core/integrations/enriched-context.d.ts.map +1 -0
  221. package/dist/core/integrations/enriched-context.js +89 -0
  222. package/dist/core/integrations/enriched-context.js.map +1 -0
  223. package/dist/core/integrations/gitnexus-launcher.d.ts +62 -0
  224. package/dist/core/integrations/gitnexus-launcher.d.ts.map +1 -0
  225. package/dist/core/integrations/gitnexus-launcher.js +241 -0
  226. package/dist/core/integrations/gitnexus-launcher.js.map +1 -0
  227. package/dist/core/integrations/gitnexus-queries.d.ts +55 -0
  228. package/dist/core/integrations/gitnexus-queries.d.ts.map +1 -0
  229. package/dist/core/integrations/gitnexus-queries.js +168 -0
  230. package/dist/core/integrations/gitnexus-queries.js.map +1 -0
  231. package/dist/core/integrations/integration-orchestrator.d.ts +51 -0
  232. package/dist/core/integrations/integration-orchestrator.d.ts.map +1 -0
  233. package/dist/core/integrations/integration-orchestrator.js +118 -0
  234. package/dist/core/integrations/integration-orchestrator.js.map +1 -0
  235. package/dist/core/integrations/mcp-deps-installer.d.ts +21 -0
  236. package/dist/core/integrations/mcp-deps-installer.d.ts.map +1 -0
  237. package/dist/core/integrations/mcp-deps-installer.js +114 -0
  238. package/dist/core/integrations/mcp-deps-installer.js.map +1 -0
  239. package/dist/core/integrations/mcp-servers-config.d.ts +21 -0
  240. package/dist/core/integrations/mcp-servers-config.d.ts.map +1 -0
  241. package/dist/core/integrations/mcp-servers-config.js +58 -0
  242. package/dist/core/integrations/mcp-servers-config.js.map +1 -0
  243. package/dist/core/integrations/serena-reader.d.ts +18 -0
  244. package/dist/core/integrations/serena-reader.d.ts.map +1 -0
  245. package/dist/core/integrations/serena-reader.js +68 -0
  246. package/dist/core/integrations/serena-reader.js.map +1 -0
  247. package/dist/core/integrations/tool-status.d.ts +18 -0
  248. package/dist/core/integrations/tool-status.d.ts.map +1 -0
  249. package/dist/core/integrations/tool-status.js +97 -0
  250. package/dist/core/integrations/tool-status.js.map +1 -0
  251. package/dist/core/parser/classify.d.ts +31 -0
  252. package/dist/core/parser/classify.d.ts.map +1 -0
  253. package/dist/core/parser/classify.js +128 -0
  254. package/dist/core/parser/classify.js.map +1 -0
  255. package/dist/core/parser/extract.d.ts +21 -0
  256. package/dist/core/parser/extract.d.ts.map +1 -0
  257. package/dist/core/parser/extract.js +66 -0
  258. package/dist/core/parser/extract.js.map +1 -0
  259. package/dist/core/parser/file-reader.d.ts +13 -0
  260. package/dist/core/parser/file-reader.d.ts.map +1 -0
  261. package/dist/core/parser/file-reader.js +52 -0
  262. package/dist/core/parser/file-reader.js.map +1 -0
  263. package/dist/core/parser/normalize.d.ts +9 -0
  264. package/dist/core/parser/normalize.d.ts.map +1 -0
  265. package/dist/core/parser/normalize.js +22 -0
  266. package/dist/core/parser/normalize.js.map +1 -0
  267. package/dist/core/parser/read-file.d.ts +7 -0
  268. package/dist/core/parser/read-file.d.ts.map +1 -0
  269. package/dist/core/parser/read-file.js +17 -0
  270. package/dist/core/parser/read-file.js.map +1 -0
  271. package/dist/core/parser/read-html.d.ts +7 -0
  272. package/dist/core/parser/read-html.d.ts.map +1 -0
  273. package/dist/core/parser/read-html.js +51 -0
  274. package/dist/core/parser/read-html.js.map +1 -0
  275. package/dist/core/parser/read-pdf.d.ts +10 -0
  276. package/dist/core/parser/read-pdf.d.ts.map +1 -0
  277. package/dist/core/parser/read-pdf.js +16 -0
  278. package/dist/core/parser/read-pdf.js.map +1 -0
  279. package/dist/core/parser/segment.d.ts +13 -0
  280. package/dist/core/parser/segment.d.ts.map +1 -0
  281. package/dist/core/parser/segment.js +53 -0
  282. package/dist/core/parser/segment.js.map +1 -0
  283. package/dist/core/planner/decompose.d.ts +25 -0
  284. package/dist/core/planner/decompose.d.ts.map +1 -0
  285. package/dist/core/planner/decompose.js +100 -0
  286. package/dist/core/planner/decompose.js.map +1 -0
  287. package/dist/core/planner/dependency-chain.d.ts +20 -0
  288. package/dist/core/planner/dependency-chain.d.ts.map +1 -0
  289. package/dist/core/planner/dependency-chain.js +163 -0
  290. package/dist/core/planner/dependency-chain.js.map +1 -0
  291. package/dist/core/planner/enhanced-next.d.ts +25 -0
  292. package/dist/core/planner/enhanced-next.d.ts.map +1 -0
  293. package/dist/core/planner/enhanced-next.js +88 -0
  294. package/dist/core/planner/enhanced-next.js.map +1 -0
  295. package/dist/core/planner/lifecycle-phase.d.ts +21 -0
  296. package/dist/core/planner/lifecycle-phase.d.ts.map +1 -0
  297. package/dist/core/planner/lifecycle-phase.js +93 -0
  298. package/dist/core/planner/lifecycle-phase.js.map +1 -0
  299. package/dist/core/planner/next-task.d.ts +16 -0
  300. package/dist/core/planner/next-task.d.ts.map +1 -0
  301. package/dist/core/planner/next-task.js +146 -0
  302. package/dist/core/planner/next-task.js.map +1 -0
  303. package/dist/core/planner/planning-report.d.ts +38 -0
  304. package/dist/core/planner/planning-report.d.ts.map +1 -0
  305. package/dist/core/planner/planning-report.js +140 -0
  306. package/dist/core/planner/planning-report.js.map +1 -0
  307. package/dist/core/planner/velocity.d.ts +38 -0
  308. package/dist/core/planner/velocity.d.ts.map +1 -0
  309. package/dist/core/planner/velocity.js +92 -0
  310. package/dist/core/planner/velocity.js.map +1 -0
  311. package/dist/core/rag/capture-indexer.d.ts +16 -0
  312. package/dist/core/rag/capture-indexer.d.ts.map +1 -0
  313. package/dist/core/rag/capture-indexer.js +37 -0
  314. package/dist/core/rag/capture-indexer.js.map +1 -0
  315. package/dist/core/rag/chunk-text.d.ts +27 -0
  316. package/dist/core/rag/chunk-text.d.ts.map +1 -0
  317. package/dist/core/rag/chunk-text.js +112 -0
  318. package/dist/core/rag/chunk-text.js.map +1 -0
  319. package/dist/core/rag/docs-indexer.d.ts +18 -0
  320. package/dist/core/rag/docs-indexer.d.ts.map +1 -0
  321. package/dist/core/rag/docs-indexer.js +57 -0
  322. package/dist/core/rag/docs-indexer.js.map +1 -0
  323. package/dist/core/rag/embedding-store.d.ts +51 -0
  324. package/dist/core/rag/embedding-store.d.ts.map +1 -0
  325. package/dist/core/rag/embedding-store.js +134 -0
  326. package/dist/core/rag/embedding-store.js.map +1 -0
  327. package/dist/core/rag/rag-pipeline.d.ts +48 -0
  328. package/dist/core/rag/rag-pipeline.d.ts.map +1 -0
  329. package/dist/core/rag/rag-pipeline.js +276 -0
  330. package/dist/core/rag/rag-pipeline.js.map +1 -0
  331. package/dist/core/rag/serena-indexer.d.ts +16 -0
  332. package/dist/core/rag/serena-indexer.d.ts.map +1 -0
  333. package/dist/core/rag/serena-indexer.js +50 -0
  334. package/dist/core/rag/serena-indexer.js.map +1 -0
  335. package/dist/core/rag/serena-rag-query.d.ts +34 -0
  336. package/dist/core/rag/serena-rag-query.d.ts.map +1 -0
  337. package/dist/core/rag/serena-rag-query.js +83 -0
  338. package/dist/core/rag/serena-rag-query.js.map +1 -0
  339. package/dist/core/search/fts-search.d.ts +16 -0
  340. package/dist/core/search/fts-search.d.ts.map +1 -0
  341. package/dist/core/search/fts-search.js +62 -0
  342. package/dist/core/search/fts-search.js.map +1 -0
  343. package/dist/core/search/tfidf.d.ts +32 -0
  344. package/dist/core/search/tfidf.d.ts.map +1 -0
  345. package/dist/core/search/tfidf.js +67 -0
  346. package/dist/core/search/tfidf.js.map +1 -0
  347. package/dist/core/search/tokenizer.d.ts +9 -0
  348. package/dist/core/search/tokenizer.d.ts.map +1 -0
  349. package/dist/core/search/tokenizer.js +37 -0
  350. package/dist/core/search/tokenizer.js.map +1 -0
  351. package/dist/core/store/knowledge-store.d.ts +72 -0
  352. package/dist/core/store/knowledge-store.d.ts.map +1 -0
  353. package/dist/core/store/knowledge-store.js +166 -0
  354. package/dist/core/store/knowledge-store.js.map +1 -0
  355. package/dist/core/store/migrations.d.ts +4 -0
  356. package/dist/core/store/migrations.d.ts.map +1 -0
  357. package/dist/core/store/migrations.js +223 -0
  358. package/dist/core/store/migrations.js.map +1 -0
  359. package/dist/core/store/sqlite-store.d.ts +86 -0
  360. package/dist/core/store/sqlite-store.d.ts.map +1 -0
  361. package/dist/core/store/sqlite-store.js +707 -0
  362. package/dist/core/store/sqlite-store.js.map +1 -0
  363. package/dist/core/utils/constants.d.ts +10 -0
  364. package/dist/core/utils/constants.d.ts.map +1 -0
  365. package/dist/core/utils/constants.js +10 -0
  366. package/dist/core/utils/constants.js.map +1 -0
  367. package/dist/core/utils/errors.d.ts +20 -0
  368. package/dist/core/utils/errors.d.ts.map +1 -0
  369. package/dist/core/utils/errors.js +39 -0
  370. package/dist/core/utils/errors.js.map +1 -0
  371. package/dist/core/utils/fs.d.ts +2 -0
  372. package/dist/core/utils/fs.d.ts.map +1 -0
  373. package/dist/core/utils/fs.js +11 -0
  374. package/dist/core/utils/fs.js.map +1 -0
  375. package/dist/core/utils/id.d.ts +2 -0
  376. package/dist/core/utils/id.d.ts.map +1 -0
  377. package/dist/core/utils/id.js +6 -0
  378. package/dist/core/utils/id.js.map +1 -0
  379. package/dist/core/utils/logger.d.ts +8 -0
  380. package/dist/core/utils/logger.d.ts.map +1 -0
  381. package/dist/core/utils/logger.js +28 -0
  382. package/dist/core/utils/logger.js.map +1 -0
  383. package/dist/core/utils/platform.d.ts +18 -0
  384. package/dist/core/utils/platform.d.ts.map +1 -0
  385. package/dist/core/utils/platform.js +43 -0
  386. package/dist/core/utils/platform.js.map +1 -0
  387. package/dist/core/utils/time.d.ts +2 -0
  388. package/dist/core/utils/time.d.ts.map +1 -0
  389. package/dist/core/utils/time.js +4 -0
  390. package/dist/core/utils/time.js.map +1 -0
  391. package/dist/index.d.ts +10 -0
  392. package/dist/index.d.ts.map +1 -0
  393. package/dist/index.js +9 -0
  394. package/dist/index.js.map +1 -0
  395. package/dist/mcp/init-project.d.ts +2 -0
  396. package/dist/mcp/init-project.d.ts.map +1 -0
  397. package/dist/mcp/init-project.js +144 -0
  398. package/dist/mcp/init-project.js.map +1 -0
  399. package/dist/mcp/lifecycle-wrapper.d.ts +26 -0
  400. package/dist/mcp/lifecycle-wrapper.d.ts.map +1 -0
  401. package/dist/mcp/lifecycle-wrapper.js +67 -0
  402. package/dist/mcp/lifecycle-wrapper.js.map +1 -0
  403. package/dist/mcp/server.d.ts +3 -0
  404. package/dist/mcp/server.d.ts.map +1 -0
  405. package/dist/mcp/server.js +73 -0
  406. package/dist/mcp/server.js.map +1 -0
  407. package/dist/mcp/stdio.d.ts +3 -0
  408. package/dist/mcp/stdio.d.ts.map +1 -0
  409. package/dist/mcp/stdio.js +20 -0
  410. package/dist/mcp/stdio.js.map +1 -0
  411. package/dist/mcp/tools/add-node.d.ts +4 -0
  412. package/dist/mcp/tools/add-node.d.ts.map +1 -0
  413. package/dist/mcp/tools/add-node.js +83 -0
  414. package/dist/mcp/tools/add-node.js.map +1 -0
  415. package/dist/mcp/tools/bulk-update-status.d.ts +4 -0
  416. package/dist/mcp/tools/bulk-update-status.d.ts.map +1 -0
  417. package/dist/mcp/tools/bulk-update-status.js +22 -0
  418. package/dist/mcp/tools/bulk-update-status.js.map +1 -0
  419. package/dist/mcp/tools/clone-node.d.ts +4 -0
  420. package/dist/mcp/tools/clone-node.d.ts.map +1 -0
  421. package/dist/mcp/tools/clone-node.js +111 -0
  422. package/dist/mcp/tools/clone-node.js.map +1 -0
  423. package/dist/mcp/tools/context.d.ts +4 -0
  424. package/dist/mcp/tools/context.d.ts.map +1 -0
  425. package/dist/mcp/tools/context.js +30 -0
  426. package/dist/mcp/tools/context.js.map +1 -0
  427. package/dist/mcp/tools/decompose.d.ts +4 -0
  428. package/dist/mcp/tools/decompose.d.ts.map +1 -0
  429. package/dist/mcp/tools/decompose.js +25 -0
  430. package/dist/mcp/tools/decompose.js.map +1 -0
  431. package/dist/mcp/tools/delete-node.d.ts +4 -0
  432. package/dist/mcp/tools/delete-node.d.ts.map +1 -0
  433. package/dist/mcp/tools/delete-node.js +29 -0
  434. package/dist/mcp/tools/delete-node.js.map +1 -0
  435. package/dist/mcp/tools/dependencies.d.ts +4 -0
  436. package/dist/mcp/tools/dependencies.d.ts.map +1 -0
  437. package/dist/mcp/tools/dependencies.js +47 -0
  438. package/dist/mcp/tools/dependencies.js.map +1 -0
  439. package/dist/mcp/tools/edge.d.ts +4 -0
  440. package/dist/mcp/tools/edge.d.ts.map +1 -0
  441. package/dist/mcp/tools/edge.js +140 -0
  442. package/dist/mcp/tools/edge.js.map +1 -0
  443. package/dist/mcp/tools/export.d.ts +4 -0
  444. package/dist/mcp/tools/export.d.ts.map +1 -0
  445. package/dist/mcp/tools/export.js +38 -0
  446. package/dist/mcp/tools/export.js.map +1 -0
  447. package/dist/mcp/tools/import-prd.d.ts +4 -0
  448. package/dist/mcp/tools/import-prd.d.ts.map +1 -0
  449. package/dist/mcp/tools/import-prd.js +81 -0
  450. package/dist/mcp/tools/import-prd.js.map +1 -0
  451. package/dist/mcp/tools/index.d.ts +4 -0
  452. package/dist/mcp/tools/index.d.ts.map +1 -0
  453. package/dist/mcp/tools/index.js +58 -0
  454. package/dist/mcp/tools/index.js.map +1 -0
  455. package/dist/mcp/tools/init.d.ts +4 -0
  456. package/dist/mcp/tools/init.d.ts.map +1 -0
  457. package/dist/mcp/tools/init.js +18 -0
  458. package/dist/mcp/tools/init.js.map +1 -0
  459. package/dist/mcp/tools/list.d.ts +4 -0
  460. package/dist/mcp/tools/list.d.ts.map +1 -0
  461. package/dist/mcp/tools/list.js +56 -0
  462. package/dist/mcp/tools/list.js.map +1 -0
  463. package/dist/mcp/tools/move-node.d.ts +4 -0
  464. package/dist/mcp/tools/move-node.d.ts.map +1 -0
  465. package/dist/mcp/tools/move-node.js +110 -0
  466. package/dist/mcp/tools/move-node.js.map +1 -0
  467. package/dist/mcp/tools/next.d.ts +4 -0
  468. package/dist/mcp/tools/next.d.ts.map +1 -0
  469. package/dist/mcp/tools/next.js +32 -0
  470. package/dist/mcp/tools/next.js.map +1 -0
  471. package/dist/mcp/tools/plan-sprint.d.ts +4 -0
  472. package/dist/mcp/tools/plan-sprint.d.ts.map +1 -0
  473. package/dist/mcp/tools/plan-sprint.js +54 -0
  474. package/dist/mcp/tools/plan-sprint.js.map +1 -0
  475. package/dist/mcp/tools/rag-context.d.ts +4 -0
  476. package/dist/mcp/tools/rag-context.d.ts.map +1 -0
  477. package/dist/mcp/tools/rag-context.js +51 -0
  478. package/dist/mcp/tools/rag-context.js.map +1 -0
  479. package/dist/mcp/tools/reindex-knowledge.d.ts +4 -0
  480. package/dist/mcp/tools/reindex-knowledge.d.ts.map +1 -0
  481. package/dist/mcp/tools/reindex-knowledge.js +49 -0
  482. package/dist/mcp/tools/reindex-knowledge.js.map +1 -0
  483. package/dist/mcp/tools/search.d.ts +4 -0
  484. package/dist/mcp/tools/search.d.ts.map +1 -0
  485. package/dist/mcp/tools/search.js +41 -0
  486. package/dist/mcp/tools/search.js.map +1 -0
  487. package/dist/mcp/tools/show.d.ts +4 -0
  488. package/dist/mcp/tools/show.d.ts.map +1 -0
  489. package/dist/mcp/tools/show.js +42 -0
  490. package/dist/mcp/tools/show.js.map +1 -0
  491. package/dist/mcp/tools/snapshot.d.ts +4 -0
  492. package/dist/mcp/tools/snapshot.d.ts.map +1 -0
  493. package/dist/mcp/tools/snapshot.js +45 -0
  494. package/dist/mcp/tools/snapshot.js.map +1 -0
  495. package/dist/mcp/tools/stats.d.ts +4 -0
  496. package/dist/mcp/tools/stats.d.ts.map +1 -0
  497. package/dist/mcp/tools/stats.js +46 -0
  498. package/dist/mcp/tools/stats.js.map +1 -0
  499. package/dist/mcp/tools/sync-stack-docs.d.ts +4 -0
  500. package/dist/mcp/tools/sync-stack-docs.d.ts.map +1 -0
  501. package/dist/mcp/tools/sync-stack-docs.js +77 -0
  502. package/dist/mcp/tools/sync-stack-docs.js.map +1 -0
  503. package/dist/mcp/tools/update-node.d.ts +4 -0
  504. package/dist/mcp/tools/update-node.d.ts.map +1 -0
  505. package/dist/mcp/tools/update-node.js +45 -0
  506. package/dist/mcp/tools/update-node.js.map +1 -0
  507. package/dist/mcp/tools/update-status.d.ts +4 -0
  508. package/dist/mcp/tools/update-status.d.ts.map +1 -0
  509. package/dist/mcp/tools/update-status.js +33 -0
  510. package/dist/mcp/tools/update-status.js.map +1 -0
  511. package/dist/mcp/tools/validate-task.d.ts +4 -0
  512. package/dist/mcp/tools/validate-task.d.ts.map +1 -0
  513. package/dist/mcp/tools/validate-task.js +57 -0
  514. package/dist/mcp/tools/validate-task.js.map +1 -0
  515. package/dist/mcp/tools/velocity.d.ts +4 -0
  516. package/dist/mcp/tools/velocity.d.ts.map +1 -0
  517. package/dist/mcp/tools/velocity.js +25 -0
  518. package/dist/mcp/tools/velocity.js.map +1 -0
  519. package/dist/schemas/edge.schema.d.ts +31 -0
  520. package/dist/schemas/edge.schema.d.ts.map +1 -0
  521. package/dist/schemas/edge.schema.js +16 -0
  522. package/dist/schemas/edge.schema.js.map +1 -0
  523. package/dist/schemas/graph.schema.d.ts +102 -0
  524. package/dist/schemas/graph.schema.d.ts.map +1 -0
  525. package/dist/schemas/graph.schema.js +28 -0
  526. package/dist/schemas/graph.schema.js.map +1 -0
  527. package/dist/schemas/knowledge.schema.d.ts +29 -0
  528. package/dist/schemas/knowledge.schema.d.ts.map +1 -0
  529. package/dist/schemas/knowledge.schema.js +17 -0
  530. package/dist/schemas/knowledge.schema.js.map +1 -0
  531. package/dist/schemas/node.schema.d.ts +80 -0
  532. package/dist/schemas/node.schema.d.ts.map +1 -0
  533. package/dist/schemas/node.schema.js +38 -0
  534. package/dist/schemas/node.schema.js.map +1 -0
  535. package/dist/web/dashboard/dist/assets/benchmark-tab-BTKW3REK.js +1 -0
  536. package/dist/web/dashboard/dist/assets/benchmark-tab-BhbUvjLM.js +1 -0
  537. package/dist/web/dashboard/dist/assets/benchmark-tab-CESZcCtO.js +1 -0
  538. package/dist/web/dashboard/dist/assets/benchmark-tab-D64Ala80.js +1 -0
  539. package/dist/web/dashboard/dist/assets/benchmark-tab-DJ7HyF-u.js +1 -0
  540. package/dist/web/dashboard/dist/assets/benchmark-tab-DVyzQZ2d.js +1 -0
  541. package/dist/web/dashboard/dist/assets/benchmark-tab-XUH7yQNv.js +1 -0
  542. package/dist/web/dashboard/dist/assets/benchmark-tab-ZfJu1pxc.js +1 -0
  543. package/dist/web/dashboard/dist/assets/constants-BIEJOBya.js +1 -0
  544. package/dist/web/dashboard/dist/assets/gitnexus-tab-BFHEXsJm.js +312 -0
  545. package/dist/web/dashboard/dist/assets/gitnexus-tab-Bbp91fom.js +312 -0
  546. package/dist/web/dashboard/dist/assets/gitnexus-tab-C3fPSzYi.js +312 -0
  547. package/dist/web/dashboard/dist/assets/gitnexus-tab-Cd0k8qk3.js +312 -0
  548. package/dist/web/dashboard/dist/assets/gitnexus-tab-ClNGphK5.js +312 -0
  549. package/dist/web/dashboard/dist/assets/gitnexus-tab-Cuc-KSII.js +312 -0
  550. package/dist/web/dashboard/dist/assets/gitnexus-tab-DEqMBSbC.css +1 -0
  551. package/dist/web/dashboard/dist/assets/gitnexus-tab-DEwJXSnD.js +312 -0
  552. package/dist/web/dashboard/dist/assets/gitnexus-tab-DOD7xwmm.js +312 -0
  553. package/dist/web/dashboard/dist/assets/graph-tab-AD7csRcc.js +1 -0
  554. package/dist/web/dashboard/dist/assets/graph-tab-BKyDCyHH.js +1 -0
  555. package/dist/web/dashboard/dist/assets/graph-tab-BUAkTto0.js +1 -0
  556. package/dist/web/dashboard/dist/assets/graph-tab-D0F0WJES.js +1 -0
  557. package/dist/web/dashboard/dist/assets/graph-tab-DA16nThT.js +1 -0
  558. package/dist/web/dashboard/dist/assets/graph-tab-DJknUhrl.js +1 -0
  559. package/dist/web/dashboard/dist/assets/graph-tab-DRPfelKw.js +1 -0
  560. package/dist/web/dashboard/dist/assets/graph-tab-lJ2rPS4Z.js +1 -0
  561. package/dist/web/dashboard/dist/assets/graph-utils-BN7tt0ZS.js +23 -0
  562. package/dist/web/dashboard/dist/assets/graph-utils-BTV1KGUM.js +23 -0
  563. package/dist/web/dashboard/dist/assets/graph-utils-BZV40eAE.css +1 -0
  564. package/dist/web/dashboard/dist/assets/graph-utils-BkfAOVJ9.js +23 -0
  565. package/dist/web/dashboard/dist/assets/graph-utils-Bo7cD1sx.js +23 -0
  566. package/dist/web/dashboard/dist/assets/graph-utils-CI4znRl5.js +23 -0
  567. package/dist/web/dashboard/dist/assets/graph-utils-DrCx5m7q.js +23 -0
  568. package/dist/web/dashboard/dist/assets/graph-utils-KQmzMFXM.js +23 -0
  569. package/dist/web/dashboard/dist/assets/graph-utils-M7iOhRI-.js +23 -0
  570. package/dist/web/dashboard/dist/assets/index-BGMP3W6f.css +1 -0
  571. package/dist/web/dashboard/dist/assets/index-BVXu3x9W.js +53 -0
  572. package/dist/web/dashboard/dist/assets/index-B_T9j86O.js +53 -0
  573. package/dist/web/dashboard/dist/assets/index-Bga9WW2A.css +1 -0
  574. package/dist/web/dashboard/dist/assets/index-BnLPCC8R.css +1 -0
  575. package/dist/web/dashboard/dist/assets/index-BonF71I0.js +53 -0
  576. package/dist/web/dashboard/dist/assets/index-CSyjxREL.js +53 -0
  577. package/dist/web/dashboard/dist/assets/index-CbUKe2Fv.js +53 -0
  578. package/dist/web/dashboard/dist/assets/index-D9i2aVjo.js +53 -0
  579. package/dist/web/dashboard/dist/assets/index-DzM6oBA3.js +53 -0
  580. package/dist/web/dashboard/dist/assets/index-IK005MzD.js +53 -0
  581. package/dist/web/dashboard/dist/assets/insights-tab-B9R3HsMU.js +1 -0
  582. package/dist/web/dashboard/dist/assets/insights-tab-BO_cxLyV.js +1 -0
  583. package/dist/web/dashboard/dist/assets/insights-tab-Brn6IMfQ.js +1 -0
  584. package/dist/web/dashboard/dist/assets/insights-tab-C6x-aJ8p.js +1 -0
  585. package/dist/web/dashboard/dist/assets/insights-tab-CWUU6eDi.js +1 -0
  586. package/dist/web/dashboard/dist/assets/insights-tab-CapL1jP-.js +1 -0
  587. package/dist/web/dashboard/dist/assets/insights-tab-CeWM6zgV.js +1 -0
  588. package/dist/web/dashboard/dist/assets/insights-tab-xQj5e61M.js +1 -0
  589. package/dist/web/dashboard/dist/assets/prd-backlog-tab-0oOO63rA.js +1 -0
  590. package/dist/web/dashboard/dist/assets/prd-backlog-tab-BcWoplsM.js +1 -0
  591. package/dist/web/dashboard/dist/assets/prd-backlog-tab-Bjj5KccG.js +1 -0
  592. package/dist/web/dashboard/dist/assets/prd-backlog-tab-C7cKQyup.js +1 -0
  593. package/dist/web/dashboard/dist/assets/prd-backlog-tab-CT4ja7Ay.js +1 -0
  594. package/dist/web/dashboard/dist/assets/prd-backlog-tab-CmPHHBDQ.js +1 -0
  595. package/dist/web/dashboard/dist/assets/prd-backlog-tab-DAHBiRO-.js +1 -0
  596. package/dist/web/dashboard/dist/assets/prd-backlog-tab-_jmBe3MU.js +1 -0
  597. package/dist/web/dashboard/dist/assets/serena-tab-BVyBTaHC.js +1 -0
  598. package/dist/web/dashboard/dist/assets/serena-tab-CVI1GGRk.js +1 -0
  599. package/dist/web/dashboard/dist/assets/serena-tab-D1ki2NjT.js +1 -0
  600. package/dist/web/dashboard/dist/assets/serena-tab-DRrRfjpO.js +1 -0
  601. package/dist/web/dashboard/dist/assets/serena-tab-DvYbwR4Z.js +1 -0
  602. package/dist/web/dashboard/dist/assets/serena-tab-DwiZ6Jm3.js +1 -0
  603. package/dist/web/dashboard/dist/assets/serena-tab-L6isY0iT.js +1 -0
  604. package/dist/web/dashboard/dist/assets/serena-tab-ba2n0AOh.js +1 -0
  605. package/dist/web/dashboard/dist/index.html +13 -0
  606. package/package.json +86 -0
@@ -0,0 +1,276 @@
1
+ /**
2
+ * RAG Semantic Pipeline — indexes nodes as embeddings and provides semantic search.
3
+ *
4
+ * Strategy: Uses lightweight TF-IDF vectorization for embeddings (no external deps).
5
+ * This provides semantic-like search without requiring transformers.js (~400MB).
6
+ * Can be upgraded to real transformer embeddings later.
7
+ *
8
+ * All processing is local — no external API calls.
9
+ */
10
+ import { KnowledgeStore } from "../store/knowledge-store.js";
11
+ import { logger } from "../utils/logger.js";
12
+ // ── TF-IDF Vectorizer ───────────────────────────
13
+ /**
14
+ * Simple tokenizer: lowercase, split on non-alphanumeric, remove stopwords.
15
+ */
16
+ const STOPWORDS = new Set([
17
+ "the", "a", "an", "is", "are", "was", "were", "be", "been", "being",
18
+ "have", "has", "had", "do", "does", "did", "will", "would", "shall",
19
+ "should", "may", "might", "can", "could", "must", "to", "of", "in",
20
+ "for", "on", "with", "at", "by", "from", "as", "into", "through",
21
+ "during", "before", "after", "above", "below", "between", "and", "but",
22
+ "or", "nor", "not", "so", "yet", "both", "either", "neither", "each",
23
+ "every", "all", "any", "few", "more", "most", "other", "some", "such",
24
+ "no", "only", "own", "same", "than", "too", "very", "that", "this",
25
+ "these", "those", "it", "its", "he", "she", "they", "them", "their",
26
+ "we", "our", "you", "your", "i", "me", "my", "what", "which", "who",
27
+ "whom", "when", "where", "why", "how",
28
+ ]);
29
+ function tokenize(text) {
30
+ return text
31
+ .toLowerCase()
32
+ .replace(/[^a-z0-9\s]/g, " ")
33
+ .split(/\s+/)
34
+ .filter((t) => t.length > 1 && !STOPWORDS.has(t));
35
+ }
36
+ /**
37
+ * Build a vocabulary from all documents and compute IDF values.
38
+ */
39
+ function buildVocabulary(documents) {
40
+ const docFreq = new Map();
41
+ const allTerms = new Set();
42
+ for (const tokens of documents) {
43
+ const unique = new Set(tokens);
44
+ for (const term of unique) {
45
+ allTerms.add(term);
46
+ docFreq.set(term, (docFreq.get(term) ?? 0) + 1);
47
+ }
48
+ }
49
+ // Assign index to each term
50
+ const vocab = new Map();
51
+ let idx = 0;
52
+ for (const term of allTerms) {
53
+ vocab.set(term, idx++);
54
+ }
55
+ // Compute IDF: log(N / df)
56
+ const N = documents.length;
57
+ const idf = new Map();
58
+ for (const [term, df] of docFreq) {
59
+ idf.set(term, Math.log((N + 1) / (df + 1)) + 1); // smoothed IDF
60
+ }
61
+ return { vocab, idf };
62
+ }
63
+ /**
64
+ * Compute TF-IDF vector for a document using the given vocabulary.
65
+ */
66
+ function computeTfIdfVector(tokens, vocab, idf) {
67
+ const vector = new Array(vocab.size).fill(0);
68
+ // Term frequency
69
+ const tf = new Map();
70
+ for (const token of tokens) {
71
+ tf.set(token, (tf.get(token) ?? 0) + 1);
72
+ }
73
+ // TF-IDF
74
+ for (const [term, count] of tf) {
75
+ const idx = vocab.get(term);
76
+ if (idx !== undefined) {
77
+ const termIdf = idf.get(term) ?? 1;
78
+ vector[idx] = (count / tokens.length) * termIdf;
79
+ }
80
+ }
81
+ // L2 normalize
82
+ let norm = 0;
83
+ for (const v of vector)
84
+ norm += v * v;
85
+ norm = Math.sqrt(norm);
86
+ if (norm > 0) {
87
+ for (let i = 0; i < vector.length; i++) {
88
+ vector[i] /= norm;
89
+ }
90
+ }
91
+ return vector;
92
+ }
93
+ /**
94
+ * TF-IDF Vectorizer — encapsulates vocabulary and IDF state per instance.
95
+ * Avoids module-level mutable state.
96
+ */
97
+ export class TfIdfVectorizer {
98
+ vocab = null;
99
+ idf = null;
100
+ get vocabSize() {
101
+ return this.vocab?.size ?? 0;
102
+ }
103
+ /**
104
+ * Build vocabulary and IDF from tokenized documents.
105
+ */
106
+ fit(documents) {
107
+ const result = buildVocabulary(documents);
108
+ this.vocab = result.vocab;
109
+ this.idf = result.idf;
110
+ }
111
+ /**
112
+ * Generate an embedding for text using TF-IDF vectorization.
113
+ * Falls back to hash-based embedding if vocabulary not built.
114
+ */
115
+ embed(text) {
116
+ if (!this.vocab || !this.idf) {
117
+ return hashEmbed(text, 128);
118
+ }
119
+ return computeTfIdfVector(tokenize(text), this.vocab, this.idf);
120
+ }
121
+ }
122
+ /**
123
+ * Simple hash-based embedding fallback.
124
+ * Maps text to a fixed-size vector using character hashing.
125
+ */
126
+ function hashEmbed(text, dim) {
127
+ const vector = new Array(dim).fill(0);
128
+ const tokens = tokenize(text);
129
+ for (const token of tokens) {
130
+ let hash = 0;
131
+ for (let i = 0; i < token.length; i++) {
132
+ hash = ((hash << 5) - hash + token.charCodeAt(i)) | 0;
133
+ }
134
+ const idx = Math.abs(hash) % dim;
135
+ vector[idx] += 1;
136
+ }
137
+ // L2 normalize
138
+ let norm = 0;
139
+ for (const v of vector)
140
+ norm += v * v;
141
+ norm = Math.sqrt(norm);
142
+ if (norm > 0) {
143
+ for (let i = 0; i < vector.length; i++) {
144
+ vector[i] /= norm;
145
+ }
146
+ }
147
+ return vector;
148
+ }
149
+ // ── Pipeline functions ──────────────────────────
150
+ // Module-level vectorizer shared between index and search.
151
+ // Encapsulated in class — no raw mutable `let` variables.
152
+ let activeVectorizer = null;
153
+ /**
154
+ * Index all nodes from the store as embeddings.
155
+ * Builds a TF-IDF vocabulary from all node texts, then stores vectors.
156
+ */
157
+ export async function indexNodeEmbeddings(store, embeddingStore) {
158
+ const nodes = store.getAllNodes();
159
+ if (nodes.length === 0) {
160
+ logger.info("No nodes to index for embeddings");
161
+ return 0;
162
+ }
163
+ // Build document texts
164
+ const documents = nodes.map((node) => {
165
+ const text = [
166
+ node.title,
167
+ node.description ?? "",
168
+ (node.tags ?? []).join(" "),
169
+ node.type,
170
+ ].filter(Boolean).join(" | ");
171
+ return {
172
+ id: `node:${node.id}`,
173
+ text,
174
+ tokens: tokenize(text),
175
+ };
176
+ });
177
+ // Build vocabulary and fit vectorizer
178
+ const t0 = performance.now();
179
+ const vectorizer = new TfIdfVectorizer();
180
+ vectorizer.fit(documents.map((d) => d.tokens));
181
+ activeVectorizer = vectorizer;
182
+ // Generate and store embeddings
183
+ let indexed = 0;
184
+ for (const doc of documents) {
185
+ const vector = vectorizer.embed(doc.text);
186
+ embeddingStore.upsert({
187
+ id: doc.id,
188
+ source: "node",
189
+ sourceId: doc.id.replace("node:", ""),
190
+ text: doc.text,
191
+ embedding: vector,
192
+ });
193
+ indexed++;
194
+ }
195
+ const durationMs = Math.round(performance.now() - t0);
196
+ logger.debug("rag:fit+embed:nodes", { vocabSize: vectorizer.vocabSize, indexed, durationMs });
197
+ logger.info(`Indexed ${indexed} node embeddings (vocab size: ${vectorizer.vocabSize})`);
198
+ return indexed;
199
+ }
200
+ /**
201
+ * Index all sources (nodes + knowledge documents) as embeddings with a unified vocabulary.
202
+ * This produces cross-source similarity by fitting TF-IDF on the combined corpus.
203
+ */
204
+ export async function indexAllEmbeddings(store, embeddingStore) {
205
+ const nodes = store.getAllNodes();
206
+ const knowledgeStore = new KnowledgeStore(store.getDb());
207
+ const knowledgeDocs = knowledgeStore.list({ limit: 10000 });
208
+ if (nodes.length === 0 && knowledgeDocs.length === 0) {
209
+ logger.info("No documents to index for embeddings");
210
+ return { nodes: 0, knowledge: 0 };
211
+ }
212
+ // Build combined document corpus
213
+ const allDocuments = [];
214
+ for (const node of nodes) {
215
+ const text = [
216
+ node.title,
217
+ node.description ?? "",
218
+ (node.tags ?? []).join(" "),
219
+ node.type,
220
+ ].filter(Boolean).join(" | ");
221
+ allDocuments.push({
222
+ id: `node:${node.id}`,
223
+ text,
224
+ tokens: tokenize(text),
225
+ });
226
+ }
227
+ for (const doc of knowledgeDocs) {
228
+ const text = [doc.title, doc.content].join(" | ");
229
+ allDocuments.push({
230
+ id: `knowledge:${doc.id}`,
231
+ text,
232
+ tokens: tokenize(text),
233
+ });
234
+ }
235
+ // Build unified vocabulary
236
+ const t0 = performance.now();
237
+ const vectorizer = new TfIdfVectorizer();
238
+ vectorizer.fit(allDocuments.map((d) => d.tokens));
239
+ activeVectorizer = vectorizer;
240
+ // Generate and store embeddings
241
+ let indexedNodes = 0;
242
+ let indexedKnowledge = 0;
243
+ for (const doc of allDocuments) {
244
+ const vector = vectorizer.embed(doc.text);
245
+ const isNode = doc.id.startsWith("node:");
246
+ embeddingStore.upsert({
247
+ id: doc.id,
248
+ source: isNode ? "node" : "knowledge",
249
+ sourceId: doc.id.replace(/^(node|knowledge):/, ""),
250
+ text: doc.text,
251
+ embedding: vector,
252
+ });
253
+ if (isNode)
254
+ indexedNodes++;
255
+ else
256
+ indexedKnowledge++;
257
+ }
258
+ const durationMs = Math.round(performance.now() - t0);
259
+ logger.debug("rag:fit+embed:all", { vocabSize: vectorizer.vocabSize, indexedNodes, indexedKnowledge, durationMs });
260
+ logger.info(`Indexed all embeddings (vocab size: ${vectorizer.vocabSize})`, { nodes: indexedNodes, knowledge: indexedKnowledge });
261
+ return { nodes: indexedNodes, knowledge: indexedKnowledge };
262
+ }
263
+ /**
264
+ * Semantic search using embeddings.
265
+ * Embeds the query and finds similar documents.
266
+ */
267
+ export async function semanticSearch(embeddingStore, query, limit = 10) {
268
+ const t0 = performance.now();
269
+ const vectorizer = activeVectorizer ?? new TfIdfVectorizer();
270
+ const queryVector = vectorizer.embed(query);
271
+ const results = embeddingStore.findSimilar(queryVector, limit);
272
+ const durationMs = Math.round(performance.now() - t0);
273
+ logger.debug("rag:search", { query: query.slice(0, 80), resultCount: results.length, durationMs });
274
+ return results;
275
+ }
276
+ //# sourceMappingURL=rag-pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rag-pipeline.js","sourceRoot":"","sources":["../../../src/core/rag/rag-pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Serena Indexer — reads .serena/memories/*.md and stores them
3
+ * as knowledge documents for unified search.
4
+ */
5
+ import { KnowledgeStore } from "../store/knowledge-store.js";
6
+ export interface SerenaIndexResult {
7
+ memoriesFound: number;
8
+ documentsIndexed: number;
9
+ skippedDuplicates: number;
10
+ }
11
+ /**
12
+ * Index all Serena memory files into the knowledge store.
13
+ * Chunks large memories and deduplicates by content hash.
14
+ */
15
+ export declare function indexSerenaMemories(knowledgeStore: KnowledgeStore, basePath: string): Promise<SerenaIndexResult>;
16
+ //# sourceMappingURL=serena-indexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serena-indexer.d.ts","sourceRoot":"","sources":["../../../src/core/rag/serena-indexer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAI7D,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,iBAAiB,CAAC,CA2C5B"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Serena Indexer — reads .serena/memories/*.md and stores them
3
+ * as knowledge documents for unified search.
4
+ */
5
+ import { readAllSerenaMemories } from "../integrations/serena-reader.js";
6
+ import { chunkText } from "./chunk-text.js";
7
+ import { logger } from "../utils/logger.js";
8
+ /**
9
+ * Index all Serena memory files into the knowledge store.
10
+ * Chunks large memories and deduplicates by content hash.
11
+ */
12
+ export async function indexSerenaMemories(knowledgeStore, basePath) {
13
+ const memories = await readAllSerenaMemories(basePath);
14
+ if (memories.length === 0) {
15
+ logger.info("No Serena memories found to index", { basePath });
16
+ return { memoriesFound: 0, documentsIndexed: 0, skippedDuplicates: 0 };
17
+ }
18
+ let documentsIndexed = 0;
19
+ let skippedDuplicates = 0;
20
+ const countBefore = knowledgeStore.count("serena");
21
+ for (const memory of memories) {
22
+ const chunks = chunkText(memory.content);
23
+ for (const chunk of chunks) {
24
+ const doc = knowledgeStore.insert({
25
+ sourceType: "serena",
26
+ sourceId: `serena:${memory.name}`,
27
+ title: chunks.length > 1
28
+ ? `${memory.name} [${chunk.index + 1}/${chunks.length}]`
29
+ : memory.name,
30
+ content: chunk.content,
31
+ chunkIndex: chunk.index,
32
+ metadata: { sizeBytes: memory.sizeBytes, memoryName: memory.name },
33
+ });
34
+ // Check if this was a dedup hit (id already existed)
35
+ if (knowledgeStore.count("serena") === countBefore + documentsIndexed) {
36
+ skippedDuplicates++;
37
+ }
38
+ else {
39
+ documentsIndexed++;
40
+ }
41
+ }
42
+ }
43
+ logger.info("Serena memories indexed", {
44
+ memoriesFound: memories.length,
45
+ documentsIndexed,
46
+ skippedDuplicates,
47
+ });
48
+ return { memoriesFound: memories.length, documentsIndexed, skippedDuplicates };
49
+ }
50
+ //# sourceMappingURL=serena-indexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serena-indexer.js","sourceRoot":"","sources":["../../../src/core/rag/serena-indexer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAEzE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAQ5C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,cAA8B,EAC9B,QAAgB;IAEhB,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAEvD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/D,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IACzE,CAAC;IAED,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEnD,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEzC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC;gBAChC,UAAU,EAAE,QAAQ;gBACpB,QAAQ,EAAE,UAAU,MAAM,CAAC,IAAI,EAAE;gBACjC,KAAK,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC;oBACtB,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG;oBACxD,CAAC,CAAC,MAAM,CAAC,IAAI;gBACf,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,UAAU,EAAE,KAAK,CAAC,KAAK;gBACvB,QAAQ,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE;aACnE,CAAC,CAAC;YAEH,qDAAqD;YACrD,IAAI,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,WAAW,GAAG,gBAAgB,EAAE,CAAC;gBACtE,iBAAiB,EAAE,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,gBAAgB,EAAE,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;QACrC,aAAa,EAAE,QAAQ,CAAC,MAAM;QAC9B,gBAAgB;QAChB,iBAAiB;KAClB,CAAC,CAAC;IAEH,OAAO,EAAE,aAAa,EAAE,QAAQ,CAAC,MAAM,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,CAAC;AACjF,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Serena RAG Query — semantic search over Serena memory documents.
3
+ *
4
+ * Supports three modes:
5
+ * - fts: keyword search via FTS5 (fast, exact match)
6
+ * - semantic: TF-IDF cosine similarity (broader, cross-vocabulary)
7
+ * - hybrid: combines FTS and semantic results with deduplication
8
+ */
9
+ import type { SqliteStore } from "../store/sqlite-store.js";
10
+ export interface SerenaRagOptions {
11
+ /** Search mode: fts (keyword), semantic (embeddings), hybrid (both) */
12
+ mode?: "fts" | "semantic" | "hybrid";
13
+ /** Maximum results to return */
14
+ limit?: number;
15
+ }
16
+ export interface SerenaRagResultItem {
17
+ id: string;
18
+ title: string;
19
+ content: string;
20
+ sourceId: string;
21
+ score: number;
22
+ method: "fts" | "semantic";
23
+ }
24
+ export interface SerenaRagResult {
25
+ query: string;
26
+ mode: "fts" | "semantic" | "hybrid";
27
+ results: SerenaRagResultItem[];
28
+ totalSerenaDocuments: number;
29
+ }
30
+ /**
31
+ * Query Serena memories using FTS, semantic search, or hybrid.
32
+ */
33
+ export declare function querySerenaMemories(store: SqliteStore, query: string, options?: SerenaRagOptions): Promise<SerenaRagResult>;
34
+ //# sourceMappingURL=serena-rag-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serena-rag-query.d.ts","sourceRoot":"","sources":["../../../src/core/rag/serena-rag-query.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAM5D,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,IAAI,CAAC,EAAE,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAC;IACrC,gCAAgC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,KAAK,GAAG,UAAU,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAC;IACpC,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,CAyE1B"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Serena RAG Query — semantic search over Serena memory documents.
3
+ *
4
+ * Supports three modes:
5
+ * - fts: keyword search via FTS5 (fast, exact match)
6
+ * - semantic: TF-IDF cosine similarity (broader, cross-vocabulary)
7
+ * - hybrid: combines FTS and semantic results with deduplication
8
+ */
9
+ import { KnowledgeStore } from "../store/knowledge-store.js";
10
+ import { EmbeddingStore } from "./embedding-store.js";
11
+ import { indexAllEmbeddings, semanticSearch } from "./rag-pipeline.js";
12
+ import { logger } from "../utils/logger.js";
13
+ /**
14
+ * Query Serena memories using FTS, semantic search, or hybrid.
15
+ */
16
+ export async function querySerenaMemories(store, query, options) {
17
+ const mode = options?.mode ?? "fts";
18
+ const limit = options?.limit ?? 10;
19
+ const knowledgeStore = new KnowledgeStore(store.getDb());
20
+ const totalSerenaDocuments = knowledgeStore.count("serena");
21
+ if (totalSerenaDocuments === 0) {
22
+ logger.info("No Serena memories in knowledge store", { query });
23
+ return { query, mode, results: [], totalSerenaDocuments: 0 };
24
+ }
25
+ const results = [];
26
+ const seenIds = new Set();
27
+ // FTS search
28
+ if (mode === "fts" || mode === "hybrid") {
29
+ const ftsResults = knowledgeStore.search(query, limit);
30
+ for (const doc of ftsResults) {
31
+ if (doc.sourceType !== "serena")
32
+ continue;
33
+ if (seenIds.has(doc.id))
34
+ continue;
35
+ seenIds.add(doc.id);
36
+ results.push({
37
+ id: doc.id,
38
+ title: doc.title,
39
+ content: doc.content,
40
+ sourceId: doc.sourceId,
41
+ score: 1.0, // FTS results are relevance-ranked but no numeric score exposed
42
+ method: "fts",
43
+ });
44
+ }
45
+ }
46
+ // Semantic search
47
+ if (mode === "semantic" || mode === "hybrid") {
48
+ const embeddingStore = new EmbeddingStore(store);
49
+ // Ensure embeddings are indexed
50
+ await indexAllEmbeddings(store, embeddingStore);
51
+ const semanticResults = await semanticSearch(embeddingStore, query, limit);
52
+ for (const result of semanticResults) {
53
+ // Filter to only serena-sourced knowledge
54
+ if (result.source !== "knowledge")
55
+ continue;
56
+ const doc = knowledgeStore.getById(result.sourceId);
57
+ if (!doc || doc.sourceType !== "serena")
58
+ continue;
59
+ if (seenIds.has(doc.id))
60
+ continue;
61
+ seenIds.add(doc.id);
62
+ results.push({
63
+ id: doc.id,
64
+ title: doc.title,
65
+ content: doc.content,
66
+ sourceId: doc.sourceId,
67
+ score: result.similarity,
68
+ method: "semantic",
69
+ });
70
+ }
71
+ }
72
+ // Sort by score descending and limit
73
+ results.sort((a, b) => b.score - a.score);
74
+ const limited = results.slice(0, limit);
75
+ logger.info("Serena RAG query completed", {
76
+ query,
77
+ mode,
78
+ resultsCount: limited.length,
79
+ totalSerenaDocuments,
80
+ });
81
+ return { query, mode, results: limited, totalSerenaDocuments };
82
+ }
83
+ //# sourceMappingURL=serena-rag-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serena-rag-query.js","sourceRoot":"","sources":["../../../src/core/rag/serena-rag-query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { SqliteStore } from "../store/sqlite-store.js";
2
+ import type { GraphNode } from "../graph/graph-types.js";
3
+ export interface SearchResult {
4
+ node: GraphNode;
5
+ score: number;
6
+ }
7
+ export interface SearchOptions {
8
+ limit?: number;
9
+ rerank?: boolean;
10
+ }
11
+ /**
12
+ * Search nodes using FTS5 full-text search with BM25 ranking.
13
+ * Optionally applies TF-IDF reranking for better relevance.
14
+ */
15
+ export declare function searchNodes(store: SqliteStore, query: string, options?: SearchOptions): SearchResult[];
16
+ //# sourceMappingURL=fts-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fts-search.d.ts","sourceRoot":"","sources":["../../../src/core/search/fts-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAIzD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAqBD;;;GAGG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,aAAkB,GAC1B,YAAY,EAAE,CA0ChB"}
@@ -0,0 +1,62 @@
1
+ import { logger } from "../utils/logger.js";
2
+ import { rerankWithTfIdf } from "./tfidf.js";
3
+ /**
4
+ * Sanitize user query for FTS5 — escape special characters and
5
+ * convert spaces to implicit AND (FTS5 default).
6
+ */
7
+ function sanitizeFtsQuery(raw) {
8
+ // Remove FTS5 special operators that could cause syntax errors
9
+ const cleaned = raw
10
+ .replace(/[*"(){}[\]:^~!@#$%&|\\]/g, " ")
11
+ .replace(/\b(AND|OR|NOT|NEAR)\b/gi, " ")
12
+ .trim()
13
+ .replace(/\s+/g, " ");
14
+ if (!cleaned)
15
+ return '""';
16
+ // Wrap each term in double quotes for exact matching, join with space (implicit AND)
17
+ const terms = cleaned.split(" ").filter(Boolean);
18
+ return terms.map((t) => `"${t}"`).join(" ");
19
+ }
20
+ /**
21
+ * Search nodes using FTS5 full-text search with BM25 ranking.
22
+ * Optionally applies TF-IDF reranking for better relevance.
23
+ */
24
+ export function searchNodes(store, query, options = {}) {
25
+ const { limit = 20, rerank = false } = options;
26
+ const sanitized = sanitizeFtsQuery(query);
27
+ logger.debug("FTS search start", { query, sanitized, rerank });
28
+ // Stage 1: FTS5 candidates (fetch extra for reranking)
29
+ const startMs = performance.now();
30
+ const candidateLimit = rerank ? Math.min(limit * 3, 100) : limit;
31
+ const ftsResults = store.searchNodes(sanitized, candidateLimit);
32
+ logger.debug("FTS search complete", {
33
+ resultCount: ftsResults.length,
34
+ durationMs: Math.round(performance.now() - startMs),
35
+ });
36
+ const resultMap = new Map();
37
+ for (const r of ftsResults) {
38
+ const { score, ...node } = r;
39
+ resultMap.set(node.id, node);
40
+ }
41
+ if (!rerank || ftsResults.length === 0) {
42
+ return ftsResults.map((r) => {
43
+ const { score, ...node } = r;
44
+ return { node: node, score };
45
+ });
46
+ }
47
+ // Stage 2: TF-IDF reranking
48
+ const candidates = ftsResults.map((r) => ({
49
+ id: r.id,
50
+ text: [r.title, r.description ?? "", r.tags?.join(" ") ?? ""].join(" "),
51
+ }));
52
+ const reranked = rerankWithTfIdf(candidates, query, limit);
53
+ return reranked
54
+ .map((r) => {
55
+ const node = resultMap.get(r.id);
56
+ if (!node)
57
+ return null;
58
+ return { node, score: r.score };
59
+ })
60
+ .filter((r) => r !== null);
61
+ }
62
+ //# sourceMappingURL=fts-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fts-search.js","sourceRoot":"","sources":["../../../src/core/search/fts-search.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAY7C;;;GAGG;AACH,SAAS,gBAAgB,CAAC,GAAW;IACnC,+DAA+D;IAC/D,MAAM,OAAO,GAAG,GAAG;SAChB,OAAO,CAAC,0BAA0B,EAAE,GAAG,CAAC;SACxC,OAAO,CAAC,yBAAyB,EAAE,GAAG,CAAC;SACvC,IAAI,EAAE;SACN,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAExB,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,qFAAqF;IACrF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,KAAkB,EAClB,KAAa,EACb,UAAyB,EAAE;IAE3B,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAC/C,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;IAE/D,uDAAuD;IACvD,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAClC,MAAM,cAAc,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACjE,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAChE,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE;QAClC,WAAW,EAAE,UAAU,CAAC,MAAM;QAC9B,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;KACpD,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;QAC7B,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAiB,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC1B,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;YAC7B,OAAO,EAAE,IAAI,EAAE,IAAiB,EAAE,KAAK,EAAE,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4BAA4B;IAC5B,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACxC,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE,EAAG,CAAoC,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;KAC5G,CAAC,CAAC,CAAC;IAEJ,MAAM,QAAQ,GAAG,eAAe,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAE3D,OAAO,QAAQ;SACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAClC,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAqB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Lightweight TF-IDF implementation for two-stage search reranking.
3
+ * No external dependencies — pure TypeScript.
4
+ */
5
+ export declare class TfIdfIndex {
6
+ private docs;
7
+ private docFreq;
8
+ /**
9
+ * Add a document to the index.
10
+ */
11
+ addDocument(id: string, text: string): void;
12
+ /**
13
+ * Compute TF-IDF score for a query against all documents.
14
+ * Returns sorted results (highest score first).
15
+ */
16
+ search(query: string, limit?: number): Array<{
17
+ id: string;
18
+ score: number;
19
+ }>;
20
+ }
21
+ /**
22
+ * Build a TF-IDF index from search result nodes and rerank them.
23
+ * Two-stage: FTS5 candidates → TF-IDF reranking.
24
+ */
25
+ export declare function rerankWithTfIdf(candidates: Array<{
26
+ id: string;
27
+ text: string;
28
+ }>, query: string, limit?: number): Array<{
29
+ id: string;
30
+ score: number;
31
+ }>;
32
+ //# sourceMappingURL=tfidf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tfidf.d.ts","sourceRoot":"","sources":["../../../src/core/search/tfidf.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAuB;IACnC,OAAO,CAAC,OAAO,CAAkC;IAEjD;;OAEG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAgB3C;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CA+BhF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EAC/C,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAW,GACjB,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAMtC"}