@vinaes/succ 1.4.0 → 1.5.42

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 (687) hide show
  1. package/README.md +64 -10
  2. package/dist/cli.js +81 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/agents-md.d.ts.map +1 -1
  5. package/dist/commands/agents-md.js +3 -2
  6. package/dist/commands/agents-md.js.map +1 -1
  7. package/dist/commands/analyze-profile.d.ts.map +1 -1
  8. package/dist/commands/analyze-profile.js +32 -8
  9. package/dist/commands/analyze-profile.js.map +1 -1
  10. package/dist/commands/analyze-recursive.d.ts.map +1 -1
  11. package/dist/commands/analyze-recursive.js +6 -2
  12. package/dist/commands/analyze-recursive.js.map +1 -1
  13. package/dist/commands/analyze-utils.d.ts.map +1 -1
  14. package/dist/commands/analyze-utils.js +17 -4
  15. package/dist/commands/analyze-utils.js.map +1 -1
  16. package/dist/commands/benchmark-quality.d.ts.map +1 -1
  17. package/dist/commands/benchmark-quality.js +11 -4
  18. package/dist/commands/benchmark-quality.js.map +1 -1
  19. package/dist/commands/benchmark-sqlite-vec.d.ts.map +1 -1
  20. package/dist/commands/benchmark-sqlite-vec.js +4 -0
  21. package/dist/commands/benchmark-sqlite-vec.js.map +1 -1
  22. package/dist/commands/benchmark.d.ts.map +1 -1
  23. package/dist/commands/benchmark.js +5 -1
  24. package/dist/commands/benchmark.js.map +1 -1
  25. package/dist/commands/codex-chat.d.ts +8 -0
  26. package/dist/commands/codex-chat.d.ts.map +1 -0
  27. package/dist/commands/codex-chat.js +161 -0
  28. package/dist/commands/codex-chat.js.map +1 -0
  29. package/dist/commands/config.d.ts.map +1 -1
  30. package/dist/commands/config.js +32 -4
  31. package/dist/commands/config.js.map +1 -1
  32. package/dist/commands/daemon.d.ts.map +1 -1
  33. package/dist/commands/daemon.js +13 -4
  34. package/dist/commands/daemon.js.map +1 -1
  35. package/dist/commands/index-code.d.ts +4 -0
  36. package/dist/commands/index-code.d.ts.map +1 -1
  37. package/dist/commands/index-code.js +1 -1
  38. package/dist/commands/index-code.js.map +1 -1
  39. package/dist/commands/init.d.ts.map +1 -1
  40. package/dist/commands/init.js +305 -203
  41. package/dist/commands/init.js.map +1 -1
  42. package/dist/commands/memories.d.ts.map +1 -1
  43. package/dist/commands/memories.js +25 -14
  44. package/dist/commands/memories.js.map +1 -1
  45. package/dist/commands/progress.d.ts.map +1 -1
  46. package/dist/commands/progress.js +3 -2
  47. package/dist/commands/progress.js.map +1 -1
  48. package/dist/commands/reindex.d.ts.map +1 -1
  49. package/dist/commands/reindex.js +54 -36
  50. package/dist/commands/reindex.js.map +1 -1
  51. package/dist/commands/retention.d.ts.map +1 -1
  52. package/dist/commands/retention.js +7 -5
  53. package/dist/commands/retention.js.map +1 -1
  54. package/dist/commands/scan-code.d.ts +76 -0
  55. package/dist/commands/scan-code.d.ts.map +1 -0
  56. package/dist/commands/scan-code.js +385 -0
  57. package/dist/commands/scan-code.js.map +1 -0
  58. package/dist/commands/score.d.ts.map +1 -1
  59. package/dist/commands/score.js +3 -2
  60. package/dist/commands/score.js.map +1 -1
  61. package/dist/commands/session.d.ts +33 -0
  62. package/dist/commands/session.d.ts.map +1 -0
  63. package/dist/commands/session.js +163 -0
  64. package/dist/commands/session.js.map +1 -0
  65. package/dist/commands/setup.d.ts.map +1 -1
  66. package/dist/commands/setup.js +254 -15
  67. package/dist/commands/setup.js.map +1 -1
  68. package/dist/commands/soul.js +3 -2
  69. package/dist/commands/soul.js.map +1 -1
  70. package/dist/commands/status.d.ts.map +1 -1
  71. package/dist/commands/status.js +14 -5
  72. package/dist/commands/status.js.map +1 -1
  73. package/dist/commands/watch.d.ts.map +1 -1
  74. package/dist/commands/watch.js +13 -4
  75. package/dist/commands/watch.js.map +1 -1
  76. package/dist/daemon/analyzer.d.ts.map +1 -1
  77. package/dist/daemon/analyzer.js +21 -5
  78. package/dist/daemon/analyzer.js.map +1 -1
  79. package/dist/daemon/client.d.ts.map +1 -1
  80. package/dist/daemon/client.js +32 -8
  81. package/dist/daemon/client.js.map +1 -1
  82. package/dist/daemon/routes/analyzer.d.ts +3 -0
  83. package/dist/daemon/routes/analyzer.d.ts.map +1 -0
  84. package/dist/daemon/routes/analyzer.js +27 -0
  85. package/dist/daemon/routes/analyzer.js.map +1 -0
  86. package/dist/daemon/routes/hooks.d.ts +14 -0
  87. package/dist/daemon/routes/hooks.d.ts.map +1 -0
  88. package/dist/daemon/routes/hooks.js +1212 -0
  89. package/dist/daemon/routes/hooks.js.map +1 -0
  90. package/dist/daemon/routes/memory.d.ts +4 -0
  91. package/dist/daemon/routes/memory.d.ts.map +1 -0
  92. package/dist/daemon/routes/memory.js +71 -0
  93. package/dist/daemon/routes/memory.js.map +1 -0
  94. package/dist/daemon/routes/reflection.d.ts +10 -0
  95. package/dist/daemon/routes/reflection.d.ts.map +1 -0
  96. package/dist/daemon/routes/reflection.js +397 -0
  97. package/dist/daemon/routes/reflection.js.map +1 -0
  98. package/dist/daemon/routes/search.d.ts +5 -0
  99. package/dist/daemon/routes/search.d.ts.map +1 -0
  100. package/dist/daemon/routes/search.js +93 -0
  101. package/dist/daemon/routes/search.js.map +1 -0
  102. package/dist/daemon/routes/sessions.d.ts +3 -0
  103. package/dist/daemon/routes/sessions.d.ts.map +1 -0
  104. package/dist/daemon/routes/sessions.js +160 -0
  105. package/dist/daemon/routes/sessions.js.map +1 -0
  106. package/dist/daemon/routes/skills.d.ts +3 -0
  107. package/dist/daemon/routes/skills.d.ts.map +1 -0
  108. package/dist/daemon/routes/skills.js +36 -0
  109. package/dist/daemon/routes/skills.js.map +1 -0
  110. package/dist/daemon/routes/status.d.ts +3 -0
  111. package/dist/daemon/routes/status.d.ts.map +1 -0
  112. package/dist/daemon/routes/status.js +47 -0
  113. package/dist/daemon/routes/status.js.map +1 -0
  114. package/dist/daemon/routes/types.d.ts +240 -0
  115. package/dist/daemon/routes/types.d.ts.map +1 -0
  116. package/dist/daemon/routes/types.js +97 -0
  117. package/dist/daemon/routes/types.js.map +1 -0
  118. package/dist/daemon/routes/versioning.d.ts +27 -0
  119. package/dist/daemon/routes/versioning.d.ts.map +1 -0
  120. package/dist/daemon/routes/versioning.js +44 -0
  121. package/dist/daemon/routes/versioning.js.map +1 -0
  122. package/dist/daemon/routes/watcher.d.ts +3 -0
  123. package/dist/daemon/routes/watcher.d.ts.map +1 -0
  124. package/dist/daemon/routes/watcher.js +28 -0
  125. package/dist/daemon/routes/watcher.js.map +1 -0
  126. package/dist/daemon/service.d.ts +5 -23
  127. package/dist/daemon/service.d.ts.map +1 -1
  128. package/dist/daemon/service.js +201 -933
  129. package/dist/daemon/service.js.map +1 -1
  130. package/dist/daemon/session-processor.d.ts +4 -8
  131. package/dist/daemon/session-processor.d.ts.map +1 -1
  132. package/dist/daemon/session-processor.js +39 -38
  133. package/dist/daemon/session-processor.js.map +1 -1
  134. package/dist/lib/ai-readiness.d.ts.map +1 -1
  135. package/dist/lib/ai-readiness.js +33 -8
  136. package/dist/lib/ai-readiness.js.map +1 -1
  137. package/dist/lib/analyze-state.d.ts.map +1 -1
  138. package/dist/lib/analyze-state.js +25 -3
  139. package/dist/lib/analyze-state.js.map +1 -1
  140. package/dist/lib/auto-memory/consolidation.d.ts +41 -0
  141. package/dist/lib/auto-memory/consolidation.d.ts.map +1 -0
  142. package/dist/lib/auto-memory/consolidation.js +151 -0
  143. package/dist/lib/auto-memory/consolidation.js.map +1 -0
  144. package/dist/lib/bpe.d.ts.map +1 -1
  145. package/dist/lib/bpe.js +9 -10
  146. package/dist/lib/bpe.js.map +1 -1
  147. package/dist/lib/brain-export.d.ts +65 -0
  148. package/dist/lib/brain-export.d.ts.map +1 -0
  149. package/dist/lib/brain-export.js +413 -0
  150. package/dist/lib/brain-export.js.map +1 -0
  151. package/dist/lib/checkpoint.d.ts.map +1 -1
  152. package/dist/lib/checkpoint.js +22 -6
  153. package/dist/lib/checkpoint.js.map +1 -1
  154. package/dist/lib/chunker.d.ts.map +1 -1
  155. package/dist/lib/chunker.js +6 -1
  156. package/dist/lib/chunker.js.map +1 -1
  157. package/dist/lib/claude-ws-transport.d.ts.map +1 -1
  158. package/dist/lib/claude-ws-transport.js +12 -4
  159. package/dist/lib/claude-ws-transport.js.map +1 -1
  160. package/dist/lib/command-safety.d.ts +64 -0
  161. package/dist/lib/command-safety.d.ts.map +1 -0
  162. package/dist/lib/command-safety.js +625 -0
  163. package/dist/lib/command-safety.js.map +1 -0
  164. package/dist/lib/compact-briefing.d.ts.map +1 -1
  165. package/dist/lib/compact-briefing.js +10 -13
  166. package/dist/lib/compact-briefing.js.map +1 -1
  167. package/dist/lib/config-defaults.d.ts.map +1 -1
  168. package/dist/lib/config-defaults.js +3 -0
  169. package/dist/lib/config-defaults.js.map +1 -1
  170. package/dist/lib/config-display.d.ts +4 -0
  171. package/dist/lib/config-display.d.ts.map +1 -1
  172. package/dist/lib/config-display.js +6 -1
  173. package/dist/lib/config-display.js.map +1 -1
  174. package/dist/lib/config-types.d.ts +156 -0
  175. package/dist/lib/config-types.d.ts.map +1 -1
  176. package/dist/lib/config-validation.d.ts.map +1 -1
  177. package/dist/lib/config-validation.js +5 -0
  178. package/dist/lib/config-validation.js.map +1 -1
  179. package/dist/lib/config.d.ts.map +1 -1
  180. package/dist/lib/config.js +92 -9
  181. package/dist/lib/config.js.map +1 -1
  182. package/dist/lib/consolidate.d.ts.map +1 -1
  183. package/dist/lib/consolidate.js +66 -47
  184. package/dist/lib/consolidate.js.map +1 -1
  185. package/dist/lib/content-sanitizer.d.ts +29 -0
  186. package/dist/lib/content-sanitizer.d.ts.map +1 -0
  187. package/dist/lib/content-sanitizer.js +72 -0
  188. package/dist/lib/content-sanitizer.js.map +1 -0
  189. package/dist/lib/cross-repo.d.ts +44 -0
  190. package/dist/lib/cross-repo.d.ts.map +1 -0
  191. package/dist/lib/cross-repo.js +108 -0
  192. package/dist/lib/cross-repo.js.map +1 -0
  193. package/dist/lib/daemon-port.d.ts +12 -0
  194. package/dist/lib/daemon-port.d.ts.map +1 -0
  195. package/dist/lib/daemon-port.js +20 -0
  196. package/dist/lib/daemon-port.js.map +1 -0
  197. package/dist/lib/db/auto-memory.d.ts +40 -0
  198. package/dist/lib/db/auto-memory.d.ts.map +1 -0
  199. package/dist/lib/db/auto-memory.js +74 -0
  200. package/dist/lib/db/auto-memory.js.map +1 -0
  201. package/dist/lib/db/bm25-indexes.d.ts.map +1 -1
  202. package/dist/lib/db/bm25-indexes.js +16 -4
  203. package/dist/lib/db/bm25-indexes.js.map +1 -1
  204. package/dist/lib/db/documents.d.ts.map +1 -1
  205. package/dist/lib/db/documents.js +4 -1
  206. package/dist/lib/db/documents.js.map +1 -1
  207. package/dist/lib/db/global-memories.d.ts +2 -10
  208. package/dist/lib/db/global-memories.d.ts.map +1 -1
  209. package/dist/lib/db/global-memories.js +13 -6
  210. package/dist/lib/db/global-memories.js.map +1 -1
  211. package/dist/lib/db/graph.d.ts +5 -1
  212. package/dist/lib/db/graph.d.ts.map +1 -1
  213. package/dist/lib/db/graph.js +38 -8
  214. package/dist/lib/db/graph.js.map +1 -1
  215. package/dist/lib/db/hybrid-search.d.ts +4 -2
  216. package/dist/lib/db/hybrid-search.d.ts.map +1 -1
  217. package/dist/lib/db/hybrid-search.js +29 -11
  218. package/dist/lib/db/hybrid-search.js.map +1 -1
  219. package/dist/lib/db/index.d.ts +6 -1
  220. package/dist/lib/db/index.d.ts.map +1 -1
  221. package/dist/lib/db/index.js +5 -1
  222. package/dist/lib/db/index.js.map +1 -1
  223. package/dist/lib/db/memories.d.ts +19 -14
  224. package/dist/lib/db/memories.d.ts.map +1 -1
  225. package/dist/lib/db/memories.js +100 -37
  226. package/dist/lib/db/memories.js.map +1 -1
  227. package/dist/lib/db/parse-helpers.d.ts +14 -0
  228. package/dist/lib/db/parse-helpers.d.ts.map +1 -0
  229. package/dist/lib/db/parse-helpers.js +59 -0
  230. package/dist/lib/db/parse-helpers.js.map +1 -0
  231. package/dist/lib/db/recall-events.d.ts +49 -0
  232. package/dist/lib/db/recall-events.d.ts.map +1 -0
  233. package/dist/lib/db/recall-events.js +196 -0
  234. package/dist/lib/db/recall-events.js.map +1 -0
  235. package/dist/lib/db/retention.d.ts +4 -3
  236. package/dist/lib/db/retention.d.ts.map +1 -1
  237. package/dist/lib/db/retention.js +12 -1
  238. package/dist/lib/db/retention.js.map +1 -1
  239. package/dist/lib/db/schema.d.ts +2 -0
  240. package/dist/lib/db/schema.d.ts.map +1 -1
  241. package/dist/lib/db/schema.js +140 -80
  242. package/dist/lib/db/schema.js.map +1 -1
  243. package/dist/lib/db/skills.d.ts.map +1 -1
  244. package/dist/lib/db/skills.js +10 -6
  245. package/dist/lib/db/skills.js.map +1 -1
  246. package/dist/lib/diff-brain.d.ts +24 -0
  247. package/dist/lib/diff-brain.d.ts.map +1 -0
  248. package/dist/lib/diff-brain.js +114 -0
  249. package/dist/lib/diff-brain.js.map +1 -0
  250. package/dist/lib/diff-parser.d.ts +74 -0
  251. package/dist/lib/diff-parser.d.ts.map +1 -0
  252. package/dist/lib/diff-parser.js +200 -0
  253. package/dist/lib/diff-parser.js.map +1 -0
  254. package/dist/lib/embedding-pool.d.ts.map +1 -1
  255. package/dist/lib/embedding-pool.js +5 -1
  256. package/dist/lib/embedding-pool.js.map +1 -1
  257. package/dist/lib/embeddings.d.ts +12 -0
  258. package/dist/lib/embeddings.d.ts.map +1 -1
  259. package/dist/lib/embeddings.js +77 -19
  260. package/dist/lib/embeddings.js.map +1 -1
  261. package/dist/lib/errors.d.ts +2 -0
  262. package/dist/lib/errors.d.ts.map +1 -1
  263. package/dist/lib/errors.js +4 -0
  264. package/dist/lib/errors.js.map +1 -1
  265. package/dist/lib/fault-logger.d.ts.map +1 -1
  266. package/dist/lib/fault-logger.js +22 -7
  267. package/dist/lib/fault-logger.js.map +1 -1
  268. package/dist/lib/git/co-change.d.ts +39 -0
  269. package/dist/lib/git/co-change.d.ts.map +1 -0
  270. package/dist/lib/git/co-change.js +139 -0
  271. package/dist/lib/git/co-change.js.map +1 -0
  272. package/dist/lib/graph/bridge-edges.d.ts +93 -0
  273. package/dist/lib/graph/bridge-edges.d.ts.map +1 -0
  274. package/dist/lib/graph/bridge-edges.js +276 -0
  275. package/dist/lib/graph/bridge-edges.js.map +1 -0
  276. package/dist/lib/graph/centrality.d.ts +11 -0
  277. package/dist/lib/graph/centrality.d.ts.map +1 -1
  278. package/dist/lib/graph/centrality.js +51 -3
  279. package/dist/lib/graph/centrality.js.map +1 -1
  280. package/dist/lib/graph/cleanup.d.ts.map +1 -1
  281. package/dist/lib/graph/cleanup.js +2 -1
  282. package/dist/lib/graph/cleanup.js.map +1 -1
  283. package/dist/lib/graph/community-detection.d.ts +17 -2
  284. package/dist/lib/graph/community-detection.d.ts.map +1 -1
  285. package/dist/lib/graph/community-detection.js +147 -48
  286. package/dist/lib/graph/community-detection.js.map +1 -1
  287. package/dist/lib/graph/community-summaries.d.ts +26 -0
  288. package/dist/lib/graph/community-summaries.d.ts.map +1 -0
  289. package/dist/lib/graph/community-summaries.js +130 -0
  290. package/dist/lib/graph/community-summaries.js.map +1 -0
  291. package/dist/lib/graph/contextual-proximity.d.ts.map +1 -1
  292. package/dist/lib/graph/contextual-proximity.js +11 -4
  293. package/dist/lib/graph/contextual-proximity.js.map +1 -1
  294. package/dist/lib/graph/graphology-bridge.d.ts +101 -0
  295. package/dist/lib/graph/graphology-bridge.d.ts.map +1 -0
  296. package/dist/lib/graph/graphology-bridge.js +488 -0
  297. package/dist/lib/graph/graphology-bridge.js.map +1 -0
  298. package/dist/lib/graph/llm-relations.d.ts.map +1 -1
  299. package/dist/lib/graph/llm-relations.js +27 -5
  300. package/dist/lib/graph/llm-relations.js.map +1 -1
  301. package/dist/lib/graph-export.d.ts.map +1 -1
  302. package/dist/lib/graph-export.js +2 -2
  303. package/dist/lib/graph-export.js.map +1 -1
  304. package/dist/lib/graph-scheduler.d.ts +0 -5
  305. package/dist/lib/graph-scheduler.d.ts.map +1 -1
  306. package/dist/lib/graph-scheduler.js +5 -1
  307. package/dist/lib/graph-scheduler.js.map +1 -1
  308. package/dist/lib/guardrails.d.ts +50 -0
  309. package/dist/lib/guardrails.d.ts.map +1 -0
  310. package/dist/lib/guardrails.js +502 -0
  311. package/dist/lib/guardrails.js.map +1 -0
  312. package/dist/lib/hook-rules.d.ts +1 -1
  313. package/dist/lib/hook-rules.d.ts.map +1 -1
  314. package/dist/lib/hook-rules.js +8 -2
  315. package/dist/lib/hook-rules.js.map +1 -1
  316. package/dist/lib/ifc/file-labels.d.ts +35 -0
  317. package/dist/lib/ifc/file-labels.d.ts.map +1 -0
  318. package/dist/lib/ifc/file-labels.js +208 -0
  319. package/dist/lib/ifc/file-labels.js.map +1 -0
  320. package/dist/lib/ifc/label.d.ts +38 -0
  321. package/dist/lib/ifc/label.d.ts.map +1 -0
  322. package/dist/lib/ifc/label.js +80 -0
  323. package/dist/lib/ifc/label.js.map +1 -0
  324. package/dist/lib/ifc/session-ifc.d.ts +92 -0
  325. package/dist/lib/ifc/session-ifc.d.ts.map +1 -0
  326. package/dist/lib/ifc/session-ifc.js +222 -0
  327. package/dist/lib/ifc/session-ifc.js.map +1 -0
  328. package/dist/lib/indexer.js +2 -2
  329. package/dist/lib/indexer.js.map +1 -1
  330. package/dist/lib/injection-detector.d.ts +83 -0
  331. package/dist/lib/injection-detector.d.ts.map +1 -0
  332. package/dist/lib/injection-detector.js +586 -0
  333. package/dist/lib/injection-detector.js.map +1 -0
  334. package/dist/lib/injection-semantic.d.ts +31 -0
  335. package/dist/lib/injection-semantic.d.ts.map +1 -0
  336. package/dist/lib/injection-semantic.js +230 -0
  337. package/dist/lib/injection-semantic.js.map +1 -0
  338. package/dist/lib/llm.d.ts.map +1 -1
  339. package/dist/lib/llm.js +19 -4
  340. package/dist/lib/llm.js.map +1 -1
  341. package/dist/lib/lock.d.ts.map +1 -1
  342. package/dist/lib/lock.js +24 -3
  343. package/dist/lib/lock.js.map +1 -1
  344. package/dist/lib/md-fetch.d.ts.map +1 -1
  345. package/dist/lib/md-fetch.js +9 -2
  346. package/dist/lib/md-fetch.js.map +1 -1
  347. package/dist/lib/observability.d.ts +75 -0
  348. package/dist/lib/observability.d.ts.map +1 -0
  349. package/dist/lib/observability.js +201 -0
  350. package/dist/lib/observability.js.map +1 -0
  351. package/dist/lib/ort-session.d.ts +26 -0
  352. package/dist/lib/ort-session.d.ts.map +1 -1
  353. package/dist/lib/ort-session.js +107 -3
  354. package/dist/lib/ort-session.js.map +1 -1
  355. package/dist/lib/prd/codebase-context.d.ts.map +1 -1
  356. package/dist/lib/prd/codebase-context.js +9 -2
  357. package/dist/lib/prd/codebase-context.js.map +1 -1
  358. package/dist/lib/prd/context.d.ts.map +1 -1
  359. package/dist/lib/prd/context.js +11 -3
  360. package/dist/lib/prd/context.js.map +1 -1
  361. package/dist/lib/prd/export.js +1 -1
  362. package/dist/lib/prd/export.js.map +1 -1
  363. package/dist/lib/prd/generate.d.ts.map +1 -1
  364. package/dist/lib/prd/generate.js +17 -4
  365. package/dist/lib/prd/generate.js.map +1 -1
  366. package/dist/lib/prd/parse.d.ts.map +1 -1
  367. package/dist/lib/prd/parse.js +6 -1
  368. package/dist/lib/prd/parse.js.map +1 -1
  369. package/dist/lib/prd/runner.d.ts +1 -2
  370. package/dist/lib/prd/runner.d.ts.map +1 -1
  371. package/dist/lib/prd/runner.js +43 -32
  372. package/dist/lib/prd/runner.js.map +1 -1
  373. package/dist/lib/prd/worktree.d.ts +1 -2
  374. package/dist/lib/prd/worktree.d.ts.map +1 -1
  375. package/dist/lib/prd/worktree.js +62 -70
  376. package/dist/lib/prd/worktree.js.map +1 -1
  377. package/dist/lib/precompute-context.d.ts.map +1 -1
  378. package/dist/lib/precompute-context.js +15 -34
  379. package/dist/lib/precompute-context.js.map +1 -1
  380. package/dist/lib/pricing.d.ts.map +1 -1
  381. package/dist/lib/pricing.js +5 -1
  382. package/dist/lib/pricing.js.map +1 -1
  383. package/dist/lib/process-registry.js +3 -3
  384. package/dist/lib/process-registry.js.map +1 -1
  385. package/dist/lib/public-api.d.ts +41 -1
  386. package/dist/lib/public-api.d.ts.map +1 -1
  387. package/dist/lib/public-api.js +38 -0
  388. package/dist/lib/public-api.js.map +1 -1
  389. package/dist/lib/quality.d.ts.map +1 -1
  390. package/dist/lib/quality.js +15 -6
  391. package/dist/lib/quality.js.map +1 -1
  392. package/dist/lib/query-expansion.d.ts +32 -0
  393. package/dist/lib/query-expansion.d.ts.map +1 -1
  394. package/dist/lib/query-expansion.js +62 -1
  395. package/dist/lib/query-expansion.js.map +1 -1
  396. package/dist/lib/reference-embeddings.d.ts.map +1 -1
  397. package/dist/lib/reference-embeddings.js +17 -4
  398. package/dist/lib/reference-embeddings.js.map +1 -1
  399. package/dist/lib/reflection-synthesizer.d.ts.map +1 -1
  400. package/dist/lib/reflection-synthesizer.js +7 -1
  401. package/dist/lib/reflection-synthesizer.js.map +1 -1
  402. package/dist/lib/reranker.d.ts +41 -0
  403. package/dist/lib/reranker.d.ts.map +1 -0
  404. package/dist/lib/reranker.js +294 -0
  405. package/dist/lib/reranker.js.map +1 -0
  406. package/dist/lib/retrieval-feedback.d.ts +100 -0
  407. package/dist/lib/retrieval-feedback.d.ts.map +1 -0
  408. package/dist/lib/retrieval-feedback.js +174 -0
  409. package/dist/lib/retrieval-feedback.js.map +1 -0
  410. package/dist/lib/review/context-pack.d.ts +58 -0
  411. package/dist/lib/review/context-pack.d.ts.map +1 -0
  412. package/dist/lib/review/context-pack.js +300 -0
  413. package/dist/lib/review/context-pack.js.map +1 -0
  414. package/dist/lib/search/hierarchical-summaries.d.ts +65 -0
  415. package/dist/lib/search/hierarchical-summaries.d.ts.map +1 -0
  416. package/dist/lib/search/hierarchical-summaries.js +423 -0
  417. package/dist/lib/search/hierarchical-summaries.js.map +1 -0
  418. package/dist/lib/search/hyde.d.ts +27 -0
  419. package/dist/lib/search/hyde.d.ts.map +1 -0
  420. package/dist/lib/search/hyde.js +141 -0
  421. package/dist/lib/search/hyde.js.map +1 -0
  422. package/dist/lib/search/late-chunking.d.ts +53 -0
  423. package/dist/lib/search/late-chunking.d.ts.map +1 -0
  424. package/dist/lib/search/late-chunking.js +230 -0
  425. package/dist/lib/search/late-chunking.js.map +1 -0
  426. package/dist/lib/search/ppr-retrieval.d.ts +49 -0
  427. package/dist/lib/search/ppr-retrieval.d.ts.map +1 -0
  428. package/dist/lib/search/ppr-retrieval.js +135 -0
  429. package/dist/lib/search/ppr-retrieval.js.map +1 -0
  430. package/dist/lib/search/repo-map.d.ts +43 -0
  431. package/dist/lib/search/repo-map.d.ts.map +1 -0
  432. package/dist/lib/search/repo-map.js +165 -0
  433. package/dist/lib/search/repo-map.js.map +1 -0
  434. package/dist/lib/session-analyzer.d.ts +90 -0
  435. package/dist/lib/session-analyzer.d.ts.map +1 -0
  436. package/dist/lib/session-analyzer.js +467 -0
  437. package/dist/lib/session-analyzer.js.map +1 -0
  438. package/dist/lib/session-observations.d.ts.map +1 -1
  439. package/dist/lib/session-observations.js +13 -3
  440. package/dist/lib/session-observations.js.map +1 -1
  441. package/dist/lib/session-summary.d.ts.map +1 -1
  442. package/dist/lib/session-summary.js +57 -50
  443. package/dist/lib/session-summary.js.map +1 -1
  444. package/dist/lib/session-surgeon.d.ts +53 -0
  445. package/dist/lib/session-surgeon.d.ts.map +1 -0
  446. package/dist/lib/session-surgeon.js +501 -0
  447. package/dist/lib/session-surgeon.js.map +1 -0
  448. package/dist/lib/similarity-utils.d.ts +26 -0
  449. package/dist/lib/similarity-utils.d.ts.map +1 -0
  450. package/dist/lib/similarity-utils.js +66 -0
  451. package/dist/lib/similarity-utils.js.map +1 -0
  452. package/dist/lib/skills.d.ts.map +1 -1
  453. package/dist/lib/skills.js +11 -11
  454. package/dist/lib/skills.js.map +1 -1
  455. package/dist/lib/storage/backends/interface.d.ts +13 -3
  456. package/dist/lib/storage/backends/interface.d.ts.map +1 -1
  457. package/dist/lib/storage/backends/postgresql.d.ts +52 -3
  458. package/dist/lib/storage/backends/postgresql.d.ts.map +1 -1
  459. package/dist/lib/storage/backends/postgresql.js +694 -49
  460. package/dist/lib/storage/backends/postgresql.js.map +1 -1
  461. package/dist/lib/storage/benchmark.js +2 -2
  462. package/dist/lib/storage/benchmark.js.map +1 -1
  463. package/dist/lib/storage/dispatcher/base.d.ts +114 -0
  464. package/dist/lib/storage/dispatcher/base.d.ts.map +1 -0
  465. package/dist/lib/storage/dispatcher/base.js +160 -0
  466. package/dist/lib/storage/dispatcher/base.js.map +1 -0
  467. package/dist/lib/storage/dispatcher/documents.d.ts +25 -0
  468. package/dist/lib/storage/dispatcher/documents.d.ts.map +1 -0
  469. package/dist/lib/storage/dispatcher/documents.js +194 -0
  470. package/dist/lib/storage/dispatcher/documents.js.map +1 -0
  471. package/dist/lib/storage/dispatcher/embeddings.d.ts +34 -0
  472. package/dist/lib/storage/dispatcher/embeddings.d.ts.map +1 -0
  473. package/dist/lib/storage/dispatcher/embeddings.js +144 -0
  474. package/dist/lib/storage/dispatcher/embeddings.js.map +1 -0
  475. package/dist/lib/storage/dispatcher/export-import.d.ts +139 -0
  476. package/dist/lib/storage/dispatcher/export-import.d.ts.map +1 -0
  477. package/dist/lib/storage/dispatcher/export-import.js +191 -0
  478. package/dist/lib/storage/dispatcher/export-import.js.map +1 -0
  479. package/dist/lib/storage/dispatcher/file-hashes.d.ts +13 -0
  480. package/dist/lib/storage/dispatcher/file-hashes.d.ts.map +1 -0
  481. package/dist/lib/storage/dispatcher/file-hashes.js +36 -0
  482. package/dist/lib/storage/dispatcher/file-hashes.js.map +1 -0
  483. package/dist/lib/storage/dispatcher/global-memories.d.ts +28 -0
  484. package/dist/lib/storage/dispatcher/global-memories.d.ts.map +1 -0
  485. package/dist/lib/storage/dispatcher/global-memories.js +151 -0
  486. package/dist/lib/storage/dispatcher/global-memories.js.map +1 -0
  487. package/dist/lib/storage/dispatcher/graph.d.ts +32 -0
  488. package/dist/lib/storage/dispatcher/graph.d.ts.map +1 -0
  489. package/dist/lib/storage/dispatcher/graph.js +146 -0
  490. package/dist/lib/storage/dispatcher/graph.js.map +1 -0
  491. package/dist/lib/storage/dispatcher/index.d.ts +34 -0
  492. package/dist/lib/storage/dispatcher/index.d.ts.map +1 -0
  493. package/dist/lib/storage/dispatcher/index.js +139 -0
  494. package/dist/lib/storage/dispatcher/index.js.map +1 -0
  495. package/dist/lib/storage/dispatcher/memories.d.ts +65 -0
  496. package/dist/lib/storage/dispatcher/memories.d.ts.map +1 -0
  497. package/dist/lib/storage/dispatcher/memories.js +466 -0
  498. package/dist/lib/storage/dispatcher/memories.js.map +1 -0
  499. package/dist/lib/storage/dispatcher/mixin-helper.d.ts +6 -0
  500. package/dist/lib/storage/dispatcher/mixin-helper.d.ts.map +1 -0
  501. package/dist/lib/storage/dispatcher/mixin-helper.js +10 -0
  502. package/dist/lib/storage/dispatcher/mixin-helper.js.map +1 -0
  503. package/dist/lib/storage/dispatcher/retention.d.ts +20 -0
  504. package/dist/lib/storage/dispatcher/retention.d.ts.map +1 -0
  505. package/dist/lib/storage/dispatcher/retention.js +123 -0
  506. package/dist/lib/storage/dispatcher/retention.js.map +1 -0
  507. package/dist/lib/storage/dispatcher/search.d.ts +34 -0
  508. package/dist/lib/storage/dispatcher/search.d.ts.map +1 -0
  509. package/dist/lib/storage/dispatcher/search.js +222 -0
  510. package/dist/lib/storage/dispatcher/search.js.map +1 -0
  511. package/dist/lib/storage/dispatcher/skills.d.ts +53 -0
  512. package/dist/lib/storage/dispatcher/skills.d.ts.map +1 -0
  513. package/dist/lib/storage/dispatcher/skills.js +98 -0
  514. package/dist/lib/storage/dispatcher/skills.js.map +1 -0
  515. package/dist/lib/storage/dispatcher/token-stats.d.ts +23 -0
  516. package/dist/lib/storage/dispatcher/token-stats.d.ts.map +1 -0
  517. package/dist/lib/storage/dispatcher/token-stats.js +92 -0
  518. package/dist/lib/storage/dispatcher/token-stats.js.map +1 -0
  519. package/dist/lib/storage/dispatcher/web-search.d.ts +10 -0
  520. package/dist/lib/storage/dispatcher/web-search.d.ts.map +1 -0
  521. package/dist/lib/storage/dispatcher/web-search.js +39 -0
  522. package/dist/lib/storage/dispatcher/web-search.js.map +1 -0
  523. package/dist/lib/storage/dispatcher-export.d.ts.map +1 -1
  524. package/dist/lib/storage/dispatcher-export.js +48 -39
  525. package/dist/lib/storage/dispatcher-export.js.map +1 -1
  526. package/dist/lib/storage/dispatcher.d.ts +1 -468
  527. package/dist/lib/storage/dispatcher.d.ts.map +1 -1
  528. package/dist/lib/storage/dispatcher.js +1 -1931
  529. package/dist/lib/storage/dispatcher.js.map +1 -1
  530. package/dist/lib/storage/index.d.ts +20 -5
  531. package/dist/lib/storage/index.d.ts.map +1 -1
  532. package/dist/lib/storage/index.js +36 -7
  533. package/dist/lib/storage/index.js.map +1 -1
  534. package/dist/lib/storage/migration/export-import.d.ts.map +1 -1
  535. package/dist/lib/storage/migration/export-import.js +9 -2
  536. package/dist/lib/storage/migration/export-import.js.map +1 -1
  537. package/dist/lib/storage/types.d.ts +152 -10
  538. package/dist/lib/storage/types.d.ts.map +1 -1
  539. package/dist/lib/storage/types.js +13 -0
  540. package/dist/lib/storage/types.js.map +1 -1
  541. package/dist/lib/storage/vector/interface.d.ts +4 -0
  542. package/dist/lib/storage/vector/interface.d.ts.map +1 -1
  543. package/dist/lib/storage/vector/qdrant.d.ts +13 -2
  544. package/dist/lib/storage/vector/qdrant.d.ts.map +1 -1
  545. package/dist/lib/storage/vector/qdrant.js +147 -61
  546. package/dist/lib/storage/vector/qdrant.js.map +1 -1
  547. package/dist/lib/token-budget.d.ts.map +1 -1
  548. package/dist/lib/token-budget.js +9 -2
  549. package/dist/lib/token-budget.js.map +1 -1
  550. package/dist/lib/transcript-utils.d.ts +60 -0
  551. package/dist/lib/transcript-utils.d.ts.map +1 -0
  552. package/dist/lib/transcript-utils.js +69 -0
  553. package/dist/lib/transcript-utils.js.map +1 -0
  554. package/dist/lib/tree-sitter/extractor.d.ts +1 -1
  555. package/dist/lib/tree-sitter/extractor.d.ts.map +1 -1
  556. package/dist/lib/tree-sitter/extractor.js +34 -9
  557. package/dist/lib/tree-sitter/extractor.js.map +1 -1
  558. package/dist/lib/tree-sitter/parser.d.ts.map +1 -1
  559. package/dist/lib/tree-sitter/parser.js +45 -11
  560. package/dist/lib/tree-sitter/parser.js.map +1 -1
  561. package/dist/lib/tree-sitter/public.d.ts +12 -0
  562. package/dist/lib/tree-sitter/public.d.ts.map +1 -1
  563. package/dist/lib/tree-sitter/public.js +33 -1
  564. package/dist/lib/tree-sitter/public.js.map +1 -1
  565. package/dist/lib/tree-sitter/queries.d.ts.map +1 -1
  566. package/dist/lib/tree-sitter/queries.js +8 -0
  567. package/dist/lib/tree-sitter/queries.js.map +1 -1
  568. package/dist/lib/version-check.d.ts +29 -0
  569. package/dist/lib/version-check.d.ts.map +1 -0
  570. package/dist/lib/version-check.js +187 -0
  571. package/dist/lib/version-check.js.map +1 -0
  572. package/dist/lib/working-memory-pipeline.d.ts.map +1 -1
  573. package/dist/lib/working-memory-pipeline.js +12 -3
  574. package/dist/lib/working-memory-pipeline.js.map +1 -1
  575. package/dist/lib/worktree-detect.d.ts +43 -0
  576. package/dist/lib/worktree-detect.d.ts.map +1 -0
  577. package/dist/lib/worktree-detect.js +154 -0
  578. package/dist/lib/worktree-detect.js.map +1 -0
  579. package/dist/lsp/client.d.ts +96 -0
  580. package/dist/lsp/client.d.ts.map +1 -0
  581. package/dist/lsp/client.js +435 -0
  582. package/dist/lsp/client.js.map +1 -0
  583. package/dist/lsp/installer.d.ts +39 -0
  584. package/dist/lsp/installer.d.ts.map +1 -0
  585. package/dist/lsp/installer.js +275 -0
  586. package/dist/lsp/installer.js.map +1 -0
  587. package/dist/lsp/manager.d.ts +62 -0
  588. package/dist/lsp/manager.d.ts.map +1 -0
  589. package/dist/lsp/manager.js +234 -0
  590. package/dist/lsp/manager.js.map +1 -0
  591. package/dist/lsp/servers.d.ts +52 -0
  592. package/dist/lsp/servers.d.ts.map +1 -0
  593. package/dist/lsp/servers.js +162 -0
  594. package/dist/lsp/servers.js.map +1 -0
  595. package/dist/mcp/helpers.d.ts.map +1 -1
  596. package/dist/mcp/helpers.js +8 -2
  597. package/dist/mcp/helpers.js.map +1 -1
  598. package/dist/mcp/profile.js +1 -1
  599. package/dist/mcp/server.d.ts +3 -2
  600. package/dist/mcp/server.d.ts.map +1 -1
  601. package/dist/mcp/server.js +19 -7
  602. package/dist/mcp/server.js.map +1 -1
  603. package/dist/mcp/tools/config.d.ts.map +1 -1
  604. package/dist/mcp/tools/config.js +28 -118
  605. package/dist/mcp/tools/config.js.map +1 -1
  606. package/dist/mcp/tools/dead-end.d.ts.map +1 -1
  607. package/dist/mcp/tools/dead-end.js +4 -3
  608. package/dist/mcp/tools/dead-end.js.map +1 -1
  609. package/dist/mcp/tools/debug.d.ts.map +1 -1
  610. package/dist/mcp/tools/debug.js +27 -112
  611. package/dist/mcp/tools/debug.js.map +1 -1
  612. package/dist/mcp/tools/graph.d.ts.map +1 -1
  613. package/dist/mcp/tools/graph.js +164 -176
  614. package/dist/mcp/tools/graph.js.map +1 -1
  615. package/dist/mcp/tools/indexing.d.ts +1 -1
  616. package/dist/mcp/tools/indexing.d.ts.map +1 -1
  617. package/dist/mcp/tools/indexing.js +63 -164
  618. package/dist/mcp/tools/indexing.js.map +1 -1
  619. package/dist/mcp/tools/memory/forget.d.ts +3 -0
  620. package/dist/mcp/tools/memory/forget.d.ts.map +1 -0
  621. package/dist/mcp/tools/memory/forget.js +175 -0
  622. package/dist/mcp/tools/memory/forget.js.map +1 -0
  623. package/dist/mcp/tools/memory/memory-helpers.d.ts +45 -0
  624. package/dist/mcp/tools/memory/memory-helpers.d.ts.map +1 -0
  625. package/dist/mcp/tools/memory/memory-helpers.js +291 -0
  626. package/dist/mcp/tools/memory/memory-helpers.js.map +1 -0
  627. package/dist/mcp/tools/memory/recall.d.ts +3 -0
  628. package/dist/mcp/tools/memory/recall.d.ts.map +1 -0
  629. package/dist/mcp/tools/memory/recall.js +495 -0
  630. package/dist/mcp/tools/memory/recall.js.map +1 -0
  631. package/dist/mcp/tools/memory/remember.d.ts +3 -0
  632. package/dist/mcp/tools/memory/remember.d.ts.map +1 -0
  633. package/dist/mcp/tools/memory/remember.js +256 -0
  634. package/dist/mcp/tools/memory/remember.js.map +1 -0
  635. package/dist/mcp/tools/memory/temporal-query.d.ts +8 -0
  636. package/dist/mcp/tools/memory/temporal-query.d.ts.map +1 -0
  637. package/dist/mcp/tools/memory/temporal-query.js +68 -0
  638. package/dist/mcp/tools/memory/temporal-query.js.map +1 -0
  639. package/dist/mcp/tools/memory.d.ts +0 -11
  640. package/dist/mcp/tools/memory.d.ts.map +1 -1
  641. package/dist/mcp/tools/memory.js +6 -1228
  642. package/dist/mcp/tools/memory.js.map +1 -1
  643. package/dist/mcp/tools/prd.d.ts.map +1 -1
  644. package/dist/mcp/tools/prd.js +19 -70
  645. package/dist/mcp/tools/prd.js.map +1 -1
  646. package/dist/mcp/tools/review.d.ts +8 -0
  647. package/dist/mcp/tools/review.d.ts.map +1 -0
  648. package/dist/mcp/tools/review.js +133 -0
  649. package/dist/mcp/tools/review.js.map +1 -0
  650. package/dist/mcp/tools/search.d.ts.map +1 -1
  651. package/dist/mcp/tools/search.js +79 -8
  652. package/dist/mcp/tools/search.js.map +1 -1
  653. package/dist/mcp/tools/status.d.ts.map +1 -1
  654. package/dist/mcp/tools/status.js +50 -75
  655. package/dist/mcp/tools/status.js.map +1 -1
  656. package/dist/mcp/tools/web-fetch.d.ts.map +1 -1
  657. package/dist/mcp/tools/web-fetch.js +5 -1
  658. package/dist/mcp/tools/web-fetch.js.map +1 -1
  659. package/dist/mcp/tools/web-search.d.ts.map +1 -1
  660. package/dist/mcp/tools/web-search.js +25 -103
  661. package/dist/mcp/tools/web-search.js.map +1 -1
  662. package/dist/prompts/guardrails.d.ts +14 -0
  663. package/dist/prompts/guardrails.d.ts.map +1 -0
  664. package/dist/prompts/guardrails.js +115 -0
  665. package/dist/prompts/guardrails.js.map +1 -0
  666. package/dist/prompts/index.d.ts +2 -1
  667. package/dist/prompts/index.d.ts.map +1 -1
  668. package/dist/prompts/index.js +3 -1
  669. package/dist/prompts/index.js.map +1 -1
  670. package/dist/prompts/prd.d.ts +0 -2
  671. package/dist/prompts/prd.d.ts.map +1 -1
  672. package/dist/prompts/prd.js +0 -2
  673. package/dist/prompts/prd.js.map +1 -1
  674. package/hooks/core/__tests__/adapter.test.cjs +340 -0
  675. package/hooks/core/adapter.cjs +463 -0
  676. package/hooks/core/config.cjs +83 -0
  677. package/hooks/core/daemon-boot.cjs +140 -0
  678. package/hooks/core/log.cjs +41 -0
  679. package/hooks/core/worktree.cjs +119 -0
  680. package/hooks/succ-post-tool.cjs +198 -134
  681. package/hooks/succ-pre-compact.cjs +262 -0
  682. package/hooks/succ-pre-tool.cjs +526 -182
  683. package/hooks/succ-session-end.cjs +40 -64
  684. package/hooks/succ-session-start.cjs +528 -427
  685. package/hooks/succ-stop-reflection.cjs +36 -62
  686. package/hooks/succ-user-prompt.cjs +137 -180
  687. package/package.json +17 -6
@@ -0,0 +1,423 @@
1
+ /**
2
+ * Hierarchical Summaries — RAPTOR-style multi-level abstraction.
3
+ *
4
+ * Generates zoom-level summaries: file → directory → module → repo.
5
+ * Different query granularity needs different zoom levels:
6
+ * "What does hashPassword do?" → file-level
7
+ * "What does the auth module do?" → directory-level
8
+ * "Describe this project" → repo-level
9
+ *
10
+ * Summaries are stored as memory nodes with level metadata,
11
+ * enabling search at the appropriate zoom based on query specificity.
12
+ */
13
+ import * as fs from 'fs';
14
+ import * as path from 'path';
15
+ import { logInfo, logWarn } from '../fault-logger.js';
16
+ import { getProjectRoot } from '../config.js';
17
+ import { callLLM } from '../llm.js';
18
+ import { EXTENSION_TO_LANGUAGE } from '../tree-sitter/types.js';
19
+ // ============================================================================
20
+ // Constants
21
+ // ============================================================================
22
+ const DEFAULT_EXCLUDES = new Set([
23
+ 'node_modules',
24
+ '.git',
25
+ 'dist',
26
+ 'build',
27
+ '.next',
28
+ '.nuxt',
29
+ 'coverage',
30
+ '__pycache__',
31
+ '.pytest_cache',
32
+ 'target',
33
+ 'vendor',
34
+ '.succ',
35
+ '.claude',
36
+ ]);
37
+ const CODE_EXTENSIONS = new Set([
38
+ '.ts',
39
+ '.tsx',
40
+ '.js',
41
+ '.jsx',
42
+ '.py',
43
+ '.go',
44
+ '.rs',
45
+ '.rb',
46
+ '.java',
47
+ '.kt',
48
+ '.cs',
49
+ '.cpp',
50
+ '.c',
51
+ '.h',
52
+ ]);
53
+ // Max chars to send to LLM for summarization
54
+ const MAX_FILE_CONTENT_CHARS = 6000;
55
+ const MAX_DIR_CONTENT_CHARS = 8000;
56
+ function extractExportedSymbols(content, ext) {
57
+ const symbols = [];
58
+ if (['.ts', '.tsx', '.js', '.jsx'].includes(ext)) {
59
+ const patterns = [
60
+ /export\s+(?:default\s+)?(?:async\s+)?function\s+(\w+)/g,
61
+ /export\s+(?:const|let|var)\s+(\w+)/g,
62
+ /export\s+(?:default\s+)?class\s+(\w+)/g,
63
+ /export\s+interface\s+(\w+)/g,
64
+ /export\s+type\s+(\w+)/g,
65
+ /export\s+enum\s+(\w+)/g,
66
+ ];
67
+ for (const pattern of patterns) {
68
+ let match;
69
+ while ((match = pattern.exec(content)) !== null) {
70
+ symbols.push(match[1]);
71
+ }
72
+ }
73
+ }
74
+ else if (ext === '.py') {
75
+ let match;
76
+ const defPat = /^def\s+(\w+)/gm;
77
+ while ((match = defPat.exec(content)) !== null) {
78
+ if (!match[1].startsWith('_'))
79
+ symbols.push(match[1]);
80
+ }
81
+ const classPat = /^class\s+(\w+)/gm;
82
+ while ((match = classPat.exec(content)) !== null) {
83
+ symbols.push(match[1]);
84
+ }
85
+ }
86
+ else if (ext === '.go') {
87
+ const patterns = [/^func\s+(\w+)/gm, /^type\s+(\w+)\s+(?:struct|interface)/gm];
88
+ for (const pattern of patterns) {
89
+ let match;
90
+ while ((match = pattern.exec(content)) !== null) {
91
+ if (match[1][0] === match[1][0].toUpperCase())
92
+ symbols.push(match[1]);
93
+ }
94
+ }
95
+ }
96
+ else if (ext === '.rs') {
97
+ const patterns = [/pub\s+(?:async\s+)?fn\s+(\w+)/g, /pub\s+(?:struct|enum|trait)\s+(\w+)/g];
98
+ for (const pattern of patterns) {
99
+ let match;
100
+ while ((match = pattern.exec(content)) !== null) {
101
+ symbols.push(match[1]);
102
+ }
103
+ }
104
+ }
105
+ return [...new Set(symbols)];
106
+ }
107
+ async function summarizeFile(file) {
108
+ const truncated = file.content.slice(0, MAX_FILE_CONTENT_CHARS);
109
+ const symbolList = file.symbols.length > 0 ? `\nExported symbols: ${file.symbols.join(', ')}` : '';
110
+ const prompt = `Summarize this source file in 2-3 sentences. Focus on its purpose, what it provides, and its role in the project. Be specific about functionality, not generic.
111
+
112
+ File: ${file.relativePath} (${file.lineCount} lines)${symbolList}
113
+
114
+ \`\`\`
115
+ ${truncated}
116
+ \`\`\`
117
+
118
+ Summary:`;
119
+ return callLLM(prompt);
120
+ }
121
+ // ============================================================================
122
+ // Directory-level summary
123
+ // ============================================================================
124
+ async function summarizeDirectory(dirPath, fileSummaries) {
125
+ const fileDescriptions = fileSummaries
126
+ .map((s) => `- ${path.basename(s.path)}: ${s.summary}`)
127
+ .join('\n')
128
+ .slice(0, MAX_DIR_CONTENT_CHARS);
129
+ const prompt = `Summarize what this directory/module does in 2-3 sentences based on its files. Focus on the module's overall responsibility and how its parts work together.
130
+
131
+ Directory: ${dirPath}
132
+ Files (${fileSummaries.length}):
133
+ ${fileDescriptions}
134
+
135
+ Summary:`;
136
+ return callLLM(prompt);
137
+ }
138
+ // ============================================================================
139
+ // Main generation pipeline
140
+ // ============================================================================
141
+ /**
142
+ * Generate hierarchical summaries for a codebase.
143
+ *
144
+ * Builds summaries bottom-up: files → directories → module groups → repo.
145
+ *
146
+ * @param rootPath - Project root (default: getProjectRoot())
147
+ * @param options - Generation options
148
+ */
149
+ export async function generateHierarchicalSummaries(rootPath, options) {
150
+ const root = rootPath ?? getProjectRoot();
151
+ const extensions = options?.extensions ?? CODE_EXTENSIONS;
152
+ const excludes = options?.excludes ?? DEFAULT_EXCLUDES;
153
+ const maxFiles = options?.maxFiles ?? 200;
154
+ const rawConcurrency = options?.concurrency;
155
+ const concurrency = typeof rawConcurrency === 'number' && Number.isFinite(rawConcurrency) && rawConcurrency > 0
156
+ ? Math.floor(rawConcurrency)
157
+ : 3;
158
+ const includeRepo = options?.includeRepo ?? true;
159
+ const summaries = [];
160
+ const levels = { file: 0, directory: 0, module: 0, repo: 0 };
161
+ // 1. Collect all code files
162
+ const files = [];
163
+ collectFiles(root, root, extensions, excludes, files, maxFiles);
164
+ logInfo('hierarchical', `Collected ${files.length} files for summarization`);
165
+ // 2. Generate file-level summaries (with concurrency control)
166
+ const fileSummaries = [];
167
+ for (let i = 0; i < files.length; i += concurrency) {
168
+ const batch = files.slice(i, i + concurrency);
169
+ const results = await Promise.all(batch.map(async (file) => {
170
+ try {
171
+ const summary = await summarizeFile(file);
172
+ return {
173
+ path: file.relativePath,
174
+ level: 'file',
175
+ summary,
176
+ symbols: file.symbols,
177
+ fileCount: 1,
178
+ lineCount: file.lineCount,
179
+ };
180
+ }
181
+ catch (error) {
182
+ logWarn('hierarchical', `Failed to summarize ${file.relativePath}`, {
183
+ error: error instanceof Error ? error.message : String(error),
184
+ });
185
+ return null;
186
+ }
187
+ }));
188
+ for (const result of results) {
189
+ if (result) {
190
+ fileSummaries.push(result);
191
+ summaries.push(result);
192
+ levels.file++;
193
+ }
194
+ }
195
+ }
196
+ // 3. Group by directory and generate directory-level summaries
197
+ const dirGroups = new Map();
198
+ for (const fileSummary of fileSummaries) {
199
+ const dir = path.dirname(fileSummary.path);
200
+ const group = dirGroups.get(dir) ?? [];
201
+ group.push(fileSummary);
202
+ dirGroups.set(dir, group);
203
+ }
204
+ const dirSummaries = [];
205
+ const dirEntries = [...dirGroups.entries()].filter(([, files]) => files.length >= 1);
206
+ for (let i = 0; i < dirEntries.length; i += concurrency) {
207
+ const batch = dirEntries.slice(i, i + concurrency);
208
+ const results = await Promise.all(batch.map(async ([dir, dirFiles]) => {
209
+ try {
210
+ const summary = await summarizeDirectory(dir, dirFiles);
211
+ const totalLines = dirFiles.reduce((sum, f) => sum + f.lineCount, 0);
212
+ return {
213
+ path: dir,
214
+ level: 'directory',
215
+ summary,
216
+ fileCount: dirFiles.length,
217
+ lineCount: totalLines,
218
+ children: dirFiles.map((f) => f.path),
219
+ };
220
+ }
221
+ catch (error) {
222
+ logWarn('hierarchical', `Failed to summarize directory ${dir}`, {
223
+ error: error instanceof Error ? error.message : String(error),
224
+ });
225
+ return null;
226
+ }
227
+ }));
228
+ for (const result of results) {
229
+ if (result) {
230
+ dirSummaries.push(result);
231
+ summaries.push(result);
232
+ levels.directory++;
233
+ }
234
+ }
235
+ }
236
+ // 4. Group directories into modules (top-level src/* directories)
237
+ const moduleGroups = new Map();
238
+ for (const dirSummary of dirSummaries) {
239
+ // Extract module: first 2 path segments (e.g., "src/lib", "src/mcp")
240
+ const parts = dirSummary.path.split('/');
241
+ // Guard against root paths creating a cycle with the repo node
242
+ const moduleKey = dirSummary.path === '.' || dirSummary.path === ''
243
+ ? '__root__'
244
+ : parts.length >= 2
245
+ ? parts.slice(0, 2).join('/')
246
+ : parts[0];
247
+ const group = moduleGroups.get(moduleKey) ?? [];
248
+ group.push(dirSummary);
249
+ moduleGroups.set(moduleKey, group);
250
+ }
251
+ const moduleSummaries = [];
252
+ const moduleEntries = [...moduleGroups.entries()].filter(([, dirs]) => dirs.length >= 1);
253
+ for (const [moduleKey, moduleDirs] of moduleEntries) {
254
+ try {
255
+ const dirDescriptions = moduleDirs
256
+ .map((d) => `- ${d.path}: ${d.summary}`)
257
+ .join('\n')
258
+ .slice(0, MAX_DIR_CONTENT_CHARS);
259
+ const totalFiles = moduleDirs.reduce((sum, d) => sum + d.fileCount, 0);
260
+ const totalLines = moduleDirs.reduce((sum, d) => sum + d.lineCount, 0);
261
+ const prompt = `Summarize this code module in 2-3 sentences. Focus on its architectural role, major subsystems, and how they fit together.
262
+
263
+ Module: ${moduleKey}
264
+ Sub-directories (${moduleDirs.length}):
265
+ ${dirDescriptions}
266
+
267
+ Summary:`;
268
+ const summary = await callLLM(prompt);
269
+ const moduleSummary = {
270
+ path: moduleKey,
271
+ level: 'module',
272
+ summary,
273
+ fileCount: totalFiles,
274
+ lineCount: totalLines,
275
+ children: moduleDirs.map((d) => d.path),
276
+ };
277
+ moduleSummaries.push(moduleSummary);
278
+ summaries.push(moduleSummary);
279
+ levels.module++;
280
+ }
281
+ catch (error) {
282
+ logWarn('hierarchical', `Failed to summarize module ${moduleKey}`, {
283
+ error: error instanceof Error ? error.message : String(error),
284
+ });
285
+ }
286
+ }
287
+ // 5. Generate repo-level summary
288
+ if (includeRepo && moduleSummaries.length > 0) {
289
+ try {
290
+ const moduleDescriptions = moduleSummaries
291
+ .map((m) => `- ${m.path} (${m.fileCount} files): ${m.summary}`)
292
+ .join('\n')
293
+ .slice(0, MAX_DIR_CONTENT_CHARS);
294
+ const totalFiles = files.length;
295
+ const totalLines = files.reduce((sum, f) => sum + f.lineCount, 0);
296
+ const prompt = `Summarize this entire codebase in 3-4 sentences. What does it do? What are its major components? What technologies does it use?
297
+
298
+ Project root: ${path.basename(root)}
299
+ Modules (${moduleSummaries.length}):
300
+ ${moduleDescriptions}
301
+
302
+ Total: ${totalFiles} files, ~${totalLines} lines of code
303
+
304
+ Summary:`;
305
+ const summary = await callLLM(prompt);
306
+ summaries.push({
307
+ path: '.',
308
+ level: 'repo',
309
+ summary,
310
+ fileCount: totalFiles,
311
+ lineCount: totalLines,
312
+ children: moduleSummaries.map((m) => m.path),
313
+ });
314
+ levels.repo++;
315
+ }
316
+ catch (error) {
317
+ logWarn('hierarchical', `Failed to generate repo summary`, {
318
+ error: error instanceof Error ? error.message : String(error),
319
+ });
320
+ }
321
+ }
322
+ logInfo('hierarchical', `Generated ${summaries.length} summaries: ${levels.file} file, ${levels.directory} dir, ${levels.module} module, ${levels.repo} repo`);
323
+ return {
324
+ summaries,
325
+ totalFiles: files.length,
326
+ totalDirectories: dirGroups.size,
327
+ levels,
328
+ };
329
+ }
330
+ /**
331
+ * Get the appropriate summary level for a query based on specificity.
332
+ *
333
+ * Heuristic: specific symbol/file queries → file level first,
334
+ * then explicit scope keywords, then broad repo phrases.
335
+ * Symbol checks must precede generic repo phrases so that
336
+ * "what does myFunction do" resolves to file, not repo.
337
+ */
338
+ export function inferSummaryLevel(query) {
339
+ const lower = query.toLowerCase();
340
+ // File path detection — tokens containing a recognized code extension route to file scope
341
+ const tokens = query.split(/\s+/);
342
+ for (const token of tokens) {
343
+ const ext = path.extname(token).slice(1).toLowerCase(); // strip leading dot
344
+ if (ext && ext in EXTENSION_TO_LANGUAGE)
345
+ return 'file';
346
+ }
347
+ // Specific symbol name check (camelCase, snake_case) — precise signal
348
+ if (/[a-z][A-Z]/.test(query) || /[a-zA-Z]{2,}_[a-zA-Z]{2,}/.test(query))
349
+ return 'file';
350
+ // Directory-level indicators (checked before repo to handle "describe this folder")
351
+ const dirWords = ['directory', 'folder', 'namespace', 'dir '];
352
+ if (dirWords.some((w) => lower.includes(w)))
353
+ return 'directory';
354
+ // Module-level indicators (checked before repo — "describe auth module" → module)
355
+ const moduleWords = ['module', 'subsystem', 'component', 'layer', 'package'];
356
+ if (moduleWords.some((w) => lower.includes(w)))
357
+ return 'module';
358
+ // Repo-level indicators — broad phrases that only match repo-scope queries
359
+ const repoWords = [
360
+ 'project',
361
+ 'codebase',
362
+ 'repository',
363
+ 'overview',
364
+ 'architecture',
365
+ 'describe this',
366
+ 'what does this do',
367
+ ];
368
+ if (repoWords.some((w) => lower.includes(w)))
369
+ return 'repo';
370
+ // Default to directory (good middle ground)
371
+ return 'directory';
372
+ }
373
+ // ============================================================================
374
+ // File Collection
375
+ // ============================================================================
376
+ function collectFiles(dir, root, extensions, excludes, result, maxFiles) {
377
+ if (result.length >= maxFiles)
378
+ return;
379
+ let entries;
380
+ try {
381
+ entries = fs.readdirSync(dir, { withFileTypes: true });
382
+ }
383
+ catch (error) {
384
+ logWarn('hierarchical', `Failed to read directory: ${dir}`, {
385
+ error: error instanceof Error ? error.message : String(error),
386
+ });
387
+ return;
388
+ }
389
+ for (const entry of entries) {
390
+ if (result.length >= maxFiles)
391
+ return;
392
+ if (excludes.has(entry.name) || entry.name.startsWith('.'))
393
+ continue;
394
+ const fullPath = path.join(dir, entry.name);
395
+ if (entry.isDirectory()) {
396
+ collectFiles(fullPath, root, extensions, excludes, result, maxFiles);
397
+ }
398
+ else if (entry.isFile()) {
399
+ const ext = path.extname(entry.name).toLowerCase();
400
+ if (!extensions.has(ext))
401
+ continue;
402
+ try {
403
+ const content = fs.readFileSync(fullPath, 'utf-8');
404
+ const lineCount = content.split('\n').length;
405
+ const symbols = extractExportedSymbols(content, ext);
406
+ const relativePath = path.relative(root, fullPath).replace(/\\/g, '/');
407
+ result.push({
408
+ relativePath,
409
+ absolutePath: fullPath,
410
+ content,
411
+ lineCount,
412
+ symbols,
413
+ });
414
+ }
415
+ catch (error) {
416
+ logWarn('hierarchical', `Failed to read file: ${fullPath}`, {
417
+ error: error instanceof Error ? error.message : String(error),
418
+ });
419
+ }
420
+ }
421
+ }
422
+ }
423
+ //# sourceMappingURL=hierarchical-summaries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hierarchical-summaries.js","sourceRoot":"","sources":["../../../src/lib/search/hierarchical-summaries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * HyDE (Hypothetical Document Embeddings) for Code Search.
3
+ *
4
+ * For natural language queries, generates a hypothetical code snippet
5
+ * via LLM, then embeds the code (not the query) to bridge the
6
+ * NL↔code embedding space gap.
7
+ *
8
+ * "how to debounce" → LLM generates `function debounce(fn, delay) {...}`
9
+ * → embed the code → find real implementations.
10
+ */
11
+ export interface HyDEResult {
12
+ /** Averaged embedding from hypothetical documents */
13
+ embedding: number[];
14
+ /** The generated hypothetical code snippets */
15
+ hypotheticals: string[];
16
+ /** Whether HyDE was used (vs. fallback to direct query embedding) */
17
+ used: boolean;
18
+ }
19
+ /**
20
+ * Generate hypothetical code embeddings for a natural language query.
21
+ *
22
+ * @param query - Natural language search query
23
+ * @param numHypotheticals - Number of hypothetical docs to generate (default: 3)
24
+ * @returns Averaged embedding from hypothetical documents
25
+ */
26
+ export declare function generateHyDE(query: string, numHypotheticals?: number): Promise<HyDEResult>;
27
+ //# sourceMappingURL=hyde.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hyde.d.ts","sourceRoot":"","sources":["../../../src/lib/search/hyde.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH,MAAM,WAAW,UAAU;IACzB,qDAAqD;IACrD,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,+CAA+C;IAC/C,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,qEAAqE;IACrE,IAAI,EAAE,OAAO,CAAC;CACf;AAiBD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,gBAAgB,GAAE,MAAU,GAC3B,OAAO,CAAC,UAAU,CAAC,CA0ErB"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * HyDE (Hypothetical Document Embeddings) for Code Search.
3
+ *
4
+ * For natural language queries, generates a hypothetical code snippet
5
+ * via LLM, then embeds the code (not the query) to bridge the
6
+ * NL↔code embedding space gap.
7
+ *
8
+ * "how to debounce" → LLM generates `function debounce(fn, delay) {...}`
9
+ * → embed the code → find real implementations.
10
+ */
11
+ import { callLLM } from '../llm.js';
12
+ import { getEmbedding, getEmbeddings } from '../embeddings.js';
13
+ import { logInfo, logWarn } from '../fault-logger.js';
14
+ import { parseCode } from '../tree-sitter/index.js';
15
+ // ============================================================================
16
+ // HyDE
17
+ // ============================================================================
18
+ const HYDE_SYSTEM = `You are a code generation assistant. Given a natural language query about code, generate a realistic code snippet that would answer the query. Output ONLY the code, no explanations.`;
19
+ const HYDE_PROMPT = `Generate a code snippet that answers this query:
20
+ "{query}"
21
+
22
+ Requirements:
23
+ - Write realistic, production-quality code
24
+ - Use common patterns and naming conventions
25
+ - Include function signature, types, and core logic
26
+ - Output ONLY the code (no markdown, no explanations)`;
27
+ /**
28
+ * Generate hypothetical code embeddings for a natural language query.
29
+ *
30
+ * @param query - Natural language search query
31
+ * @param numHypotheticals - Number of hypothetical docs to generate (default: 3)
32
+ * @returns Averaged embedding from hypothetical documents
33
+ */
34
+ export async function generateHyDE(query, numHypotheticals = 3) {
35
+ // Reject blank or whitespace-only queries early — they produce nonsense hypotheticals
36
+ if (!query || !query.trim()) {
37
+ throw new Error('generateHyDE: query must not be blank');
38
+ }
39
+ // Clamp to prevent excessive LLM fan-out / rate limiting
40
+ numHypotheticals = Math.max(1, Math.min(numHypotheticals, 10));
41
+ // Use tree-sitter AST to detect if query is already code — skip HyDE if so
42
+ if (await looksLikeCodeAST(query)) {
43
+ const embedding = await getEmbedding(query);
44
+ return { embedding, hypotheticals: [], used: false };
45
+ }
46
+ try {
47
+ // Generate hypothetical code snippets in parallel
48
+ const promises = Array.from({ length: numHypotheticals }, () => callLLM(HYDE_PROMPT.replace('{query}', query), {
49
+ maxTokens: 500,
50
+ systemPrompt: HYDE_SYSTEM,
51
+ timeout: 15000,
52
+ }));
53
+ const responses = await Promise.allSettled(promises);
54
+ const hypotheticals = responses
55
+ .filter((r) => r.status === 'fulfilled')
56
+ .map((r) => r.value.trim())
57
+ .filter((code) => code.length > 20); // Filter empty/tiny responses
58
+ if (hypotheticals.length === 0) {
59
+ logWarn('hyde', 'All hypothetical generations failed, falling back to query embedding');
60
+ const embedding = await getEmbedding(query);
61
+ return { embedding, hypotheticals: [], used: false };
62
+ }
63
+ // Embed only the hypothetical code snippets — not the original NL query.
64
+ // Mixing the query back in pulls the averaged vector toward natural-language
65
+ // space and weakens the code-space bridge HyDE is meant to create.
66
+ const allTexts = hypotheticals;
67
+ const embeddings = await getEmbeddings(allTexts);
68
+ // Average all embeddings
69
+ const dim = embeddings[0].length;
70
+ const averaged = new Array(dim).fill(0);
71
+ for (const emb of embeddings) {
72
+ for (let i = 0; i < dim; i++) {
73
+ averaged[i] += emb[i];
74
+ }
75
+ }
76
+ for (let i = 0; i < dim; i++) {
77
+ averaged[i] /= embeddings.length;
78
+ }
79
+ // Normalize
80
+ const norm = Math.sqrt(averaged.reduce((sum, v) => sum + v * v, 0));
81
+ if (norm > 0) {
82
+ for (let i = 0; i < dim; i++) {
83
+ averaged[i] /= norm;
84
+ }
85
+ }
86
+ logInfo('hyde', `Generated ${hypotheticals.length} hypothetical embeddings for query`);
87
+ return { embedding: averaged, hypotheticals, used: true };
88
+ }
89
+ catch (error) {
90
+ logWarn('hyde', 'HyDE generation failed, falling back to query embedding', {
91
+ error: error instanceof Error ? error.message : String(error),
92
+ });
93
+ const embedding = await getEmbedding(query);
94
+ return { embedding, hypotheticals: [], used: false };
95
+ }
96
+ }
97
+ // Languages to try when checking if a query is code
98
+ const CODE_DETECT_LANGUAGES = ['typescript', 'python', 'go', 'rust'];
99
+ /**
100
+ * Detect if a query is code using tree-sitter AST parsing.
101
+ *
102
+ * Tries parsing the query as several common languages. If any language
103
+ * produces a clean AST (no ERROR nodes), the query is code.
104
+ * Falls back to false if tree-sitter is unavailable.
105
+ */
106
+ async function looksLikeCodeAST(query) {
107
+ // Short strings (< 3 chars) cannot form valid code constructs
108
+ if (query.length < 3)
109
+ return false;
110
+ for (const lang of CODE_DETECT_LANGUAGES) {
111
+ try {
112
+ const tree = await parseCode(query, lang);
113
+ if (!tree)
114
+ continue;
115
+ try {
116
+ const root = tree.rootNode;
117
+ // Clean parse with at least one named child = definitely code
118
+ if (!root.hasError && root.namedChildCount > 0) {
119
+ return true;
120
+ }
121
+ // Mostly clean: few errors relative to named children = likely code
122
+ if (root.namedChildCount >= 2) {
123
+ const errorNodes = root.descendantsOfType('ERROR');
124
+ if (errorNodes.length / root.namedChildCount < 0.3) {
125
+ return true;
126
+ }
127
+ }
128
+ }
129
+ finally {
130
+ tree.delete();
131
+ }
132
+ }
133
+ catch (err) {
134
+ logWarn('hyde', `Tree-sitter parse failed for ${lang}`, {
135
+ error: err instanceof Error ? err.message : String(err),
136
+ });
137
+ }
138
+ }
139
+ return false;
140
+ }
141
+ //# sourceMappingURL=hyde.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hyde.js","sourceRoot":"","sources":["../../../src/lib/search/hyde.ts"],"names":[],"mappings":"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"}