maestro-flow 0.5.2 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (485) hide show
  1. package/.agents/skills/insight-challenge/SKILL.md +228 -0
  2. package/.agents/skills/insight-challenge/specs/challenge-protocol.md +154 -0
  3. package/.agents/skills/insight-challenge/specs/verdict-schema.md +239 -0
  4. package/.agents/skills/maestro/SKILL.md +6 -6
  5. package/.agents/skills/maestro-help/SKILL.md +1 -1
  6. package/.agents/skills/maestro-help/index/catalog.json +3 -2
  7. package/.agents/skills/maestro-ralph/SKILL.md +11 -10
  8. package/.agents/skills/maestro-ralph-beta/SKILL.md +11 -10
  9. package/.agents/skills/odyssey-debug/SKILL.md +475 -0
  10. package/.agents/skills/odyssey-improve/SKILL.md +507 -0
  11. package/.agents/skills/odyssey-planex/SKILL.md +603 -0
  12. package/.agents/skills/odyssey-review-test-fix/SKILL.md +429 -0
  13. package/.agents/skills/odyssey-ui/SKILL.md +464 -0
  14. package/.agy/skills/insight-challenge/SKILL.md +230 -0
  15. package/.agy/skills/insight-challenge/specs/challenge-protocol.md +154 -0
  16. package/.agy/skills/insight-challenge/specs/verdict-schema.md +239 -0
  17. package/.agy/skills/maestro/SKILL.md +6 -6
  18. package/.agy/skills/maestro-help/SKILL.md +1 -1
  19. package/.agy/skills/maestro-help/index/catalog.json +3 -2
  20. package/.agy/skills/maestro-ralph/SKILL.md +11 -10
  21. package/.agy/skills/maestro-ralph-beta/SKILL.md +11 -10
  22. package/.agy/skills/odyssey-debug/SKILL.md +475 -0
  23. package/.agy/skills/odyssey-improve/SKILL.md +507 -0
  24. package/.agy/skills/odyssey-planex/SKILL.md +603 -0
  25. package/.agy/skills/odyssey-review-test-fix/SKILL.md +429 -0
  26. package/.agy/skills/odyssey-ui/SKILL.md +464 -0
  27. package/.claude/commands/maestro-ralph-beta.md +11 -10
  28. package/.claude/commands/maestro-ralph.md +11 -10
  29. package/.claude/commands/maestro.md +6 -6
  30. package/.claude/commands/odyssey-debug.md +473 -0
  31. package/.claude/commands/odyssey-improve.md +505 -0
  32. package/.claude/commands/odyssey-planex.md +601 -0
  33. package/.claude/commands/odyssey-review-test-fix.md +427 -0
  34. package/.claude/commands/odyssey-ui.md +462 -0
  35. package/.claude/skills/insight-challenge/SKILL.md +226 -0
  36. package/.claude/skills/insight-challenge/specs/challenge-protocol.md +154 -0
  37. package/.claude/skills/insight-challenge/specs/verdict-schema.md +239 -0
  38. package/.claude/skills/maestro-help/SKILL.md +1 -1
  39. package/.claude/skills/maestro-help/index/catalog.json +3 -2
  40. package/.codex/skills/codify-to-knowhow/SKILL.md +1 -1
  41. package/.codex/skills/maestro-companion/SKILL.md +1 -1
  42. package/.codex/skills/maestro-help/SKILL.md +1 -1
  43. package/.codex/skills/maestro-impeccable/SKILL.md +1 -1
  44. package/.codex/skills/maestro-next/SKILL.md +1 -1
  45. package/.codex/skills/maestro-ralph-beta/SKILL.md +1 -1
  46. package/.codex/skills/odyssey-debug/SKILL.md +456 -0
  47. package/.codex/skills/odyssey-improve/SKILL.md +466 -0
  48. package/.codex/skills/odyssey-planex/SKILL.md +409 -0
  49. package/.codex/skills/odyssey-review-test-fix/SKILL.md +377 -0
  50. package/.codex/skills/odyssey-ui/SKILL.md +411 -0
  51. package/dashboard/dist/assets/{ArtifactsPage-BLvAqQlQ.js → ArtifactsPage-B6z23DfG.js} +2 -2
  52. package/dashboard/dist/assets/{ChatInput-DU9YGZKX.js → ChatInput-tBtGKV2i.js} +1 -1
  53. package/dashboard/dist/assets/{ChatPage-DYHfheXC.js → ChatPage-CcggDVs4.js} +2 -2
  54. package/dashboard/dist/assets/{CollabPage-CSlmvEa-.js → CollabPage-FaZeqqeS.js} +1 -1
  55. package/dashboard/dist/assets/{ExecutionPanel-RYWf0dYC.js → ExecutionPanel-DNRwYDXp.js} +1 -1
  56. package/dashboard/dist/assets/{KanbanPage-N55Iv0-X.js → KanbanPage-B2xh2s_N.js} +1 -1
  57. package/dashboard/dist/assets/{MaestroCoordinatePage-BxwZ6yy5.js → MaestroCoordinatePage-DCMGHDAL.js} +1 -1
  58. package/dashboard/dist/assets/{MarkdownRenderer-ZGtOY7Ti.js → MarkdownRenderer-C3FvTqVe.js} +1 -1
  59. package/dashboard/dist/assets/McpPage-HKaJ8cQP.js +16 -0
  60. package/dashboard/dist/assets/{MeetingRoomPage-CxHRn1xx.js → MeetingRoomPage-DGN5oUXH.js} +1 -1
  61. package/dashboard/dist/assets/{OutputPanel-DaL8c1i5.js → OutputPanel-BiCteH5k.js} +1 -1
  62. package/dashboard/dist/assets/{ProblemsPanel-BQTd5812.js → ProblemsPanel-Dk4v9tol.js} +1 -1
  63. package/dashboard/dist/assets/{RequirementBoardPage-22y9u1qh.js → RequirementBoardPage-D10A26gi.js} +1 -1
  64. package/dashboard/dist/assets/{RequirementPage-_mO743Xm.js → RequirementPage-Cs-2omLz.js} +1 -1
  65. package/dashboard/dist/assets/{RoomsPage-CExTbOGr.js → RoomsPage-tKQQhw1W.js} +1 -1
  66. package/dashboard/dist/assets/SpecsPage-LK1QCtcg.js +36 -0
  67. package/dashboard/dist/assets/{TeamsPage-BxEXLb5g.js → TeamsPage-C-bEwB8E.js} +1 -1
  68. package/dashboard/dist/assets/{TreeBrowser-CVtPF5C9.js → TreeBrowser-1YP-DfTY.js} +2 -2
  69. package/dashboard/dist/assets/{WorkflowPage-BoN18Lhs.js → WorkflowPage-dGHPsDDr.js} +2 -2
  70. package/dashboard/dist/assets/{arrow-left-C5ROg97G.js → arrow-left-BPFSEpfO.js} +1 -1
  71. package/dashboard/dist/assets/{check-Bs8PM0tQ.js → check-D5hOViiQ.js} +1 -1
  72. package/dashboard/dist/assets/{chevron-right-SmErd_1F.js → chevron-right-D9BsXrIg.js} +1 -1
  73. package/dashboard/dist/assets/{circle-CjpslL_D.js → circle-Cn5fNpmp.js} +1 -1
  74. package/dashboard/dist/assets/{circle-alert-CuzAg2fd.js → circle-alert-CZvK3B1K.js} +1 -1
  75. package/dashboard/dist/assets/{circle-check-BIkDU5D5.js → circle-check-DApOBP0J.js} +1 -1
  76. package/dashboard/dist/assets/{circle-check-big-CYctV8bK.js → circle-check-big-Cd9ztJpl.js} +1 -1
  77. package/dashboard/dist/assets/{code-DoB7rfxt.js → code-C3TuHjMs.js} +1 -1
  78. package/dashboard/dist/assets/{columns-3-Ch5KIyRa.js → columns-3-CO2SvNJb.js} +1 -1
  79. package/dashboard/dist/assets/{download-DadtG2Nr.js → download-BuKGI7KX.js} +1 -1
  80. package/dashboard/dist/assets/{en-2h6fD0j8.js → en-BmpYsIfb.js} +1 -1
  81. package/dashboard/dist/assets/folder-Chwj_P4A.js +11 -0
  82. package/dashboard/dist/assets/folder-open-S72FbKvn.js +6 -0
  83. package/dashboard/dist/assets/{index-BL4h1OKY.js → index-CN0YdC9M.js} +1 -1
  84. package/dashboard/dist/assets/{index-DQIlX2w_.js → index-Cbs79erW.js} +5 -5
  85. package/dashboard/dist/assets/{index-DaFwSmVJ.js → index-CdT1WNND.js} +1 -1
  86. package/dashboard/dist/assets/index-DEvP8cgc.css +1 -0
  87. package/dashboard/dist/assets/{list-CI-XIPZh.js → list-Dg_ojUpi.js} +1 -1
  88. package/dashboard/dist/assets/{loader-DpdMoQvh.js → loader-CMcc73C_.js} +1 -1
  89. package/dashboard/dist/assets/{minus-BVbfXGrC.js → minus-KxmVOIB7.js} +1 -1
  90. package/dashboard/dist/assets/pen-line-D1YTNDPw.js +11 -0
  91. package/dashboard/dist/assets/{pencil-I7GE0y29.js → pencil-BAjxSHuh.js} +1 -1
  92. package/dashboard/dist/assets/{proxy-CcYyZZWI.js → proxy-BewnIei6.js} +1 -1
  93. package/dashboard/dist/assets/{refresh-cw-BG9V_T4R.js → refresh-cw-Chc0RcRY.js} +1 -1
  94. package/dashboard/dist/assets/{rows-2-DP6NjQFk.js → rows-2-DWJuw8OM.js} +1 -1
  95. package/dashboard/dist/assets/{search-b78eLlw2.js → search-CPGb2sEw.js} +1 -1
  96. package/dashboard/dist/assets/{shallow-CJEesgtu.js → shallow-Dy0-7n5s.js} +1 -1
  97. package/dashboard/dist/assets/{table-B_lk-a1d.js → table-VI5scWpO.js} +1 -1
  98. package/dashboard/dist/assets/{team-types-Se7f9LfJ.js → team-types-Cu8zCPN3.js} +1 -1
  99. package/dashboard/dist/assets/{terminal-DXx4tvzq.js → terminal-Bqt5c6Ny.js} +1 -1
  100. package/dashboard/dist/assets/{trash-2-CVh9mnRj.js → trash-2-BcTVifbw.js} +1 -1
  101. package/dashboard/dist/assets/{users-Da9zGME5.js → users-BhFAHz4H.js} +1 -1
  102. package/dashboard/dist/assets/{zap-C0zaC7gJ.js → zap-BWbLhgr6.js} +1 -1
  103. package/dashboard/dist/assets/{zh-CN-r3AvxxOL.js → zh-CN-BIRiTdAD.js} +1 -1
  104. package/dashboard/dist/index.html +2 -2
  105. package/dashboard/dist-server/dashboard/src/server/routes/wiki.js +1 -0
  106. package/dashboard/dist-server/dashboard/src/server/routes/wiki.js.map +1 -1
  107. package/dashboard/dist-server/dashboard/src/server/wiki/search.d.ts +14 -14
  108. package/dashboard/dist-server/dashboard/src/server/wiki/search.js +188 -56
  109. package/dashboard/dist-server/dashboard/src/server/wiki/search.js.map +1 -1
  110. package/dashboard/dist-server/dashboard/src/server/wiki/stress.test.js +1 -0
  111. package/dashboard/dist-server/dashboard/src/server/wiki/stress.test.js.map +1 -1
  112. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.d.ts +37 -0
  113. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js +560 -22
  114. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js.map +1 -1
  115. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-types.d.ts +6 -2
  116. package/dashboard/dist-server/src/types/index.d.ts +9 -0
  117. package/dist/src/cli.js +3 -0
  118. package/dist/src/cli.js.map +1 -1
  119. package/dist/src/commands/delegate.d.ts.map +1 -1
  120. package/dist/src/commands/delegate.js +50 -8
  121. package/dist/src/commands/delegate.js.map +1 -1
  122. package/dist/src/commands/domain.d.ts +9 -0
  123. package/dist/src/commands/domain.d.ts.map +1 -0
  124. package/dist/src/commands/domain.js +445 -0
  125. package/dist/src/commands/domain.js.map +1 -0
  126. package/dist/src/commands/hooks.d.ts +10 -0
  127. package/dist/src/commands/hooks.d.ts.map +1 -1
  128. package/dist/src/commands/hooks.js +132 -22
  129. package/dist/src/commands/hooks.js.map +1 -1
  130. package/dist/src/commands/install.d.ts.map +1 -1
  131. package/dist/src/commands/install.js +82 -204
  132. package/dist/src/commands/install.js.map +1 -1
  133. package/dist/src/commands/kg.d.ts.map +1 -1
  134. package/dist/src/commands/kg.js +183 -90
  135. package/dist/src/commands/kg.js.map +1 -1
  136. package/dist/src/commands/search.d.ts +15 -8
  137. package/dist/src/commands/search.d.ts.map +1 -1
  138. package/dist/src/commands/search.js +205 -59
  139. package/dist/src/commands/search.js.map +1 -1
  140. package/dist/src/commands/spec.d.ts.map +1 -1
  141. package/dist/src/commands/spec.js +9 -1
  142. package/dist/src/commands/spec.js.map +1 -1
  143. package/dist/src/commands/update.d.ts.map +1 -1
  144. package/dist/src/commands/update.js +0 -7
  145. package/dist/src/commands/update.js.map +1 -1
  146. package/dist/src/commands/wiki.d.ts.map +1 -1
  147. package/dist/src/commands/wiki.js +8 -1
  148. package/dist/src/commands/wiki.js.map +1 -1
  149. package/dist/src/commands/workspace.d.ts +12 -0
  150. package/dist/src/commands/workspace.d.ts.map +1 -0
  151. package/dist/src/commands/workspace.js +230 -0
  152. package/dist/src/commands/workspace.js.map +1 -0
  153. package/dist/src/config/cli-tools-config.d.ts +5 -0
  154. package/dist/src/config/cli-tools-config.d.ts.map +1 -1
  155. package/dist/src/config/cli-tools-config.js +31 -0
  156. package/dist/src/config/cli-tools-config.js.map +1 -1
  157. package/dist/src/config/index.d.ts +9 -1
  158. package/dist/src/config/index.d.ts.map +1 -1
  159. package/dist/src/config/index.js +35 -1
  160. package/dist/src/config/index.js.map +1 -1
  161. package/dist/src/core/install-executor.d.ts +31 -0
  162. package/dist/src/core/install-executor.d.ts.map +1 -0
  163. package/dist/src/core/install-executor.js +231 -0
  164. package/dist/src/core/install-executor.js.map +1 -0
  165. package/dist/src/core/install-profile.d.ts +103 -0
  166. package/dist/src/core/install-profile.d.ts.map +1 -0
  167. package/dist/src/core/install-profile.js +225 -0
  168. package/dist/src/core/install-profile.js.map +1 -0
  169. package/dist/src/graph/kg/credibility.d.ts +37 -0
  170. package/dist/src/graph/kg/credibility.d.ts.map +1 -0
  171. package/dist/src/graph/kg/credibility.js +141 -0
  172. package/dist/src/graph/kg/credibility.js.map +1 -0
  173. package/dist/src/graph/kg/db/connection.d.ts +28 -0
  174. package/dist/src/graph/kg/db/connection.d.ts.map +1 -0
  175. package/dist/src/graph/kg/db/connection.js +142 -0
  176. package/dist/src/graph/kg/db/connection.js.map +1 -0
  177. package/dist/src/graph/kg/db/index.d.ts +5 -0
  178. package/dist/src/graph/kg/db/index.d.ts.map +1 -0
  179. package/dist/src/graph/kg/db/index.js +6 -0
  180. package/dist/src/graph/kg/db/index.js.map +1 -0
  181. package/dist/src/graph/kg/db/migrations.d.ts +8 -0
  182. package/dist/src/graph/kg/db/migrations.d.ts.map +1 -0
  183. package/dist/src/graph/kg/db/migrations.js +88 -0
  184. package/dist/src/graph/kg/db/migrations.js.map +1 -0
  185. package/dist/src/graph/kg/db/queries.d.ts +84 -0
  186. package/dist/src/graph/kg/db/queries.d.ts.map +1 -0
  187. package/dist/src/graph/kg/db/queries.js +471 -0
  188. package/dist/src/graph/kg/db/queries.js.map +1 -0
  189. package/dist/src/graph/kg/db/types.d.ts +123 -0
  190. package/dist/src/graph/kg/db/types.d.ts.map +1 -0
  191. package/dist/src/graph/kg/db/types.js +75 -0
  192. package/dist/src/graph/kg/db/types.js.map +1 -0
  193. package/dist/src/graph/kg/engine.d.ts +87 -0
  194. package/dist/src/graph/kg/engine.d.ts.map +1 -0
  195. package/dist/src/graph/kg/engine.js +247 -0
  196. package/dist/src/graph/kg/engine.js.map +1 -0
  197. package/dist/src/graph/kg/extraction/code/code-extractor.d.ts +40 -0
  198. package/dist/src/graph/kg/extraction/code/code-extractor.d.ts.map +1 -0
  199. package/dist/src/graph/kg/extraction/code/code-extractor.js +296 -0
  200. package/dist/src/graph/kg/extraction/code/code-extractor.js.map +1 -0
  201. package/dist/src/graph/kg/extraction/code/dfm-extractor.d.ts +3 -0
  202. package/dist/src/graph/kg/extraction/code/dfm-extractor.d.ts.map +1 -0
  203. package/dist/src/graph/kg/extraction/code/dfm-extractor.js +122 -0
  204. package/dist/src/graph/kg/extraction/code/dfm-extractor.js.map +1 -0
  205. package/dist/src/graph/kg/extraction/code/generated-detection.d.ts +14 -0
  206. package/dist/src/graph/kg/extraction/code/generated-detection.d.ts.map +1 -0
  207. package/dist/src/graph/kg/extraction/code/generated-detection.js +65 -0
  208. package/dist/src/graph/kg/extraction/code/generated-detection.js.map +1 -0
  209. package/dist/src/graph/kg/extraction/code/languages/index.d.ts +9 -0
  210. package/dist/src/graph/kg/extraction/code/languages/index.d.ts.map +1 -0
  211. package/dist/src/graph/kg/extraction/code/languages/index.js +2119 -0
  212. package/dist/src/graph/kg/extraction/code/languages/index.js.map +1 -0
  213. package/dist/src/graph/kg/extraction/code/languages/typescript.d.ts +5 -0
  214. package/dist/src/graph/kg/extraction/code/languages/typescript.d.ts.map +1 -0
  215. package/dist/src/graph/kg/extraction/code/languages/typescript.js +191 -0
  216. package/dist/src/graph/kg/extraction/code/languages/typescript.js.map +1 -0
  217. package/dist/src/graph/kg/extraction/code/liquid-extractor.d.ts +3 -0
  218. package/dist/src/graph/kg/extraction/code/liquid-extractor.d.ts.map +1 -0
  219. package/dist/src/graph/kg/extraction/code/liquid-extractor.js +117 -0
  220. package/dist/src/graph/kg/extraction/code/liquid-extractor.js.map +1 -0
  221. package/dist/src/graph/kg/extraction/code/mybatis-extractor.d.ts +3 -0
  222. package/dist/src/graph/kg/extraction/code/mybatis-extractor.d.ts.map +1 -0
  223. package/dist/src/graph/kg/extraction/code/mybatis-extractor.js +84 -0
  224. package/dist/src/graph/kg/extraction/code/mybatis-extractor.js.map +1 -0
  225. package/dist/src/graph/kg/extraction/code/svelte-extractor.d.ts +3 -0
  226. package/dist/src/graph/kg/extraction/code/svelte-extractor.d.ts.map +1 -0
  227. package/dist/src/graph/kg/extraction/code/svelte-extractor.js +92 -0
  228. package/dist/src/graph/kg/extraction/code/svelte-extractor.js.map +1 -0
  229. package/dist/src/graph/kg/extraction/code/tree-sitter-types.d.ts +61 -0
  230. package/dist/src/graph/kg/extraction/code/tree-sitter-types.d.ts.map +1 -0
  231. package/dist/src/graph/kg/extraction/code/tree-sitter-types.js +53 -0
  232. package/dist/src/graph/kg/extraction/code/tree-sitter-types.js.map +1 -0
  233. package/dist/src/graph/kg/extraction/code/tree-sitter.d.ts +55 -0
  234. package/dist/src/graph/kg/extraction/code/tree-sitter.d.ts.map +1 -0
  235. package/dist/src/graph/kg/extraction/code/tree-sitter.js +227 -0
  236. package/dist/src/graph/kg/extraction/code/tree-sitter.js.map +1 -0
  237. package/dist/src/graph/kg/extraction/code/vue-extractor.d.ts +6 -0
  238. package/dist/src/graph/kg/extraction/code/vue-extractor.d.ts.map +1 -0
  239. package/dist/src/graph/kg/extraction/code/vue-extractor.js +109 -0
  240. package/dist/src/graph/kg/extraction/code/vue-extractor.js.map +1 -0
  241. package/dist/src/graph/kg/extraction/code/wasm-stability.d.ts +44 -0
  242. package/dist/src/graph/kg/extraction/code/wasm-stability.d.ts.map +1 -0
  243. package/dist/src/graph/kg/extraction/code/wasm-stability.js +140 -0
  244. package/dist/src/graph/kg/extraction/code/wasm-stability.js.map +1 -0
  245. package/dist/src/graph/kg/extraction/knowledge/codebase-extractor.d.ts +3 -0
  246. package/dist/src/graph/kg/extraction/knowledge/codebase-extractor.d.ts.map +1 -0
  247. package/dist/src/graph/kg/extraction/knowledge/codebase-extractor.js +149 -0
  248. package/dist/src/graph/kg/extraction/knowledge/codebase-extractor.js.map +1 -0
  249. package/dist/src/graph/kg/extraction/knowledge/domain-extractor.d.ts +4 -0
  250. package/dist/src/graph/kg/extraction/knowledge/domain-extractor.d.ts.map +1 -0
  251. package/dist/src/graph/kg/extraction/knowledge/domain-extractor.js +114 -0
  252. package/dist/src/graph/kg/extraction/knowledge/domain-extractor.js.map +1 -0
  253. package/dist/src/graph/kg/extraction/knowledge/issue-extractor.d.ts +3 -0
  254. package/dist/src/graph/kg/extraction/knowledge/issue-extractor.d.ts.map +1 -0
  255. package/dist/src/graph/kg/extraction/knowledge/issue-extractor.js +84 -0
  256. package/dist/src/graph/kg/extraction/knowledge/issue-extractor.js.map +1 -0
  257. package/dist/src/graph/kg/extraction/knowledge/spec-extractor.d.ts +3 -0
  258. package/dist/src/graph/kg/extraction/knowledge/spec-extractor.d.ts.map +1 -0
  259. package/dist/src/graph/kg/extraction/knowledge/spec-extractor.js +173 -0
  260. package/dist/src/graph/kg/extraction/knowledge/spec-extractor.js.map +1 -0
  261. package/dist/src/graph/kg/extraction/knowledge/wiki-extractor.d.ts +3 -0
  262. package/dist/src/graph/kg/extraction/knowledge/wiki-extractor.d.ts.map +1 -0
  263. package/dist/src/graph/kg/extraction/knowledge/wiki-extractor.js +165 -0
  264. package/dist/src/graph/kg/extraction/knowledge/wiki-extractor.js.map +1 -0
  265. package/dist/src/graph/kg/extraction/orchestrator.d.ts +6 -0
  266. package/dist/src/graph/kg/extraction/orchestrator.d.ts.map +1 -0
  267. package/dist/src/graph/kg/extraction/orchestrator.js +208 -0
  268. package/dist/src/graph/kg/extraction/orchestrator.js.map +1 -0
  269. package/dist/src/graph/kg/index.d.ts +29 -0
  270. package/dist/src/graph/kg/index.d.ts.map +1 -0
  271. package/dist/src/graph/kg/index.js +35 -0
  272. package/dist/src/graph/kg/index.js.map +1 -0
  273. package/dist/src/graph/kg/query/context-builder.d.ts +38 -0
  274. package/dist/src/graph/kg/query/context-builder.d.ts.map +1 -0
  275. package/dist/src/graph/kg/query/context-builder.js +184 -0
  276. package/dist/src/graph/kg/query/context-builder.js.map +1 -0
  277. package/dist/src/graph/kg/query/index.d.ts +8 -0
  278. package/dist/src/graph/kg/query/index.d.ts.map +1 -0
  279. package/dist/src/graph/kg/query/index.js +6 -0
  280. package/dist/src/graph/kg/query/index.js.map +1 -0
  281. package/dist/src/graph/kg/query/scoring.d.ts +19 -0
  282. package/dist/src/graph/kg/query/scoring.d.ts.map +1 -0
  283. package/dist/src/graph/kg/query/scoring.js +158 -0
  284. package/dist/src/graph/kg/query/scoring.js.map +1 -0
  285. package/dist/src/graph/kg/query/search.d.ts +59 -0
  286. package/dist/src/graph/kg/query/search.d.ts.map +1 -0
  287. package/dist/src/graph/kg/query/search.js +158 -0
  288. package/dist/src/graph/kg/query/search.js.map +1 -0
  289. package/dist/src/graph/kg/query/traversal.d.ts +75 -0
  290. package/dist/src/graph/kg/query/traversal.d.ts.map +1 -0
  291. package/dist/src/graph/kg/query/traversal.js +420 -0
  292. package/dist/src/graph/kg/query/traversal.js.map +1 -0
  293. package/dist/src/graph/kg/resolution/callback-synthesizer.d.ts +41 -0
  294. package/dist/src/graph/kg/resolution/callback-synthesizer.d.ts.map +1 -0
  295. package/dist/src/graph/kg/resolution/callback-synthesizer.js +450 -0
  296. package/dist/src/graph/kg/resolution/callback-synthesizer.js.map +1 -0
  297. package/dist/src/graph/kg/resolution/frameworks/index.d.ts +18 -0
  298. package/dist/src/graph/kg/resolution/frameworks/index.d.ts.map +1 -0
  299. package/dist/src/graph/kg/resolution/frameworks/index.js +632 -0
  300. package/dist/src/graph/kg/resolution/frameworks/index.js.map +1 -0
  301. package/dist/src/graph/kg/resolution/import-resolver.d.ts +73 -0
  302. package/dist/src/graph/kg/resolution/import-resolver.d.ts.map +1 -0
  303. package/dist/src/graph/kg/resolution/import-resolver.js +257 -0
  304. package/dist/src/graph/kg/resolution/import-resolver.js.map +1 -0
  305. package/dist/src/graph/kg/resolution/index.d.ts +11 -0
  306. package/dist/src/graph/kg/resolution/index.d.ts.map +1 -0
  307. package/dist/src/graph/kg/resolution/index.js +7 -0
  308. package/dist/src/graph/kg/resolution/index.js.map +1 -0
  309. package/dist/src/graph/kg/resolution/knowledge-resolver.d.ts +22 -0
  310. package/dist/src/graph/kg/resolution/knowledge-resolver.d.ts.map +1 -0
  311. package/dist/src/graph/kg/resolution/knowledge-resolver.js +288 -0
  312. package/dist/src/graph/kg/resolution/knowledge-resolver.js.map +1 -0
  313. package/dist/src/graph/kg/resolution/name-matcher.d.ts +25 -0
  314. package/dist/src/graph/kg/resolution/name-matcher.d.ts.map +1 -0
  315. package/dist/src/graph/kg/resolution/name-matcher.js +162 -0
  316. package/dist/src/graph/kg/resolution/name-matcher.js.map +1 -0
  317. package/dist/src/graph/kg/schema.sql +210 -0
  318. package/dist/src/graph/kg/surface/cli.d.ts +3 -0
  319. package/dist/src/graph/kg/surface/cli.d.ts.map +1 -0
  320. package/dist/src/graph/kg/surface/cli.js +500 -0
  321. package/dist/src/graph/kg/surface/cli.js.map +1 -0
  322. package/dist/src/graph/kg/surface/hook-injector.d.ts +33 -0
  323. package/dist/src/graph/kg/surface/hook-injector.d.ts.map +1 -0
  324. package/dist/src/graph/kg/surface/hook-injector.js +172 -0
  325. package/dist/src/graph/kg/surface/hook-injector.js.map +1 -0
  326. package/dist/src/graph/kg/surface/index.d.ts +6 -0
  327. package/dist/src/graph/kg/surface/index.d.ts.map +1 -0
  328. package/dist/src/graph/kg/surface/index.js +5 -0
  329. package/dist/src/graph/kg/surface/index.js.map +1 -0
  330. package/dist/src/graph/kg/surface/mcp-tools.d.ts +20 -0
  331. package/dist/src/graph/kg/surface/mcp-tools.d.ts.map +1 -0
  332. package/dist/src/graph/kg/surface/mcp-tools.js +253 -0
  333. package/dist/src/graph/kg/surface/mcp-tools.js.map +1 -0
  334. package/dist/src/graph/kg/sync/incremental-sync.d.ts +24 -0
  335. package/dist/src/graph/kg/sync/incremental-sync.d.ts.map +1 -0
  336. package/dist/src/graph/kg/sync/incremental-sync.js +71 -0
  337. package/dist/src/graph/kg/sync/incremental-sync.js.map +1 -0
  338. package/dist/src/graph/kg/sync/index.d.ts +5 -0
  339. package/dist/src/graph/kg/sync/index.d.ts.map +1 -0
  340. package/dist/src/graph/kg/sync/index.js +4 -0
  341. package/dist/src/graph/kg/sync/index.js.map +1 -0
  342. package/dist/src/graph/kg/sync/watch-policy.d.ts +33 -0
  343. package/dist/src/graph/kg/sync/watch-policy.d.ts.map +1 -0
  344. package/dist/src/graph/kg/sync/watch-policy.js +90 -0
  345. package/dist/src/graph/kg/sync/watch-policy.js.map +1 -0
  346. package/dist/src/hooks/constants.d.ts +0 -2
  347. package/dist/src/hooks/constants.d.ts.map +1 -1
  348. package/dist/src/hooks/constants.js +0 -2
  349. package/dist/src/hooks/constants.js.map +1 -1
  350. package/dist/src/hooks/keyword-spec-injector.d.ts +6 -0
  351. package/dist/src/hooks/keyword-spec-injector.d.ts.map +1 -1
  352. package/dist/src/hooks/keyword-spec-injector.js +157 -81
  353. package/dist/src/hooks/keyword-spec-injector.js.map +1 -1
  354. package/dist/src/hooks/kg-auto-init.d.ts +13 -0
  355. package/dist/src/hooks/kg-auto-init.d.ts.map +1 -0
  356. package/dist/src/hooks/kg-auto-init.js +38 -0
  357. package/dist/src/hooks/kg-auto-init.js.map +1 -0
  358. package/dist/src/hooks/kg-context-injector.d.ts +1 -3
  359. package/dist/src/hooks/kg-context-injector.d.ts.map +1 -1
  360. package/dist/src/hooks/kg-context-injector.js +12 -17
  361. package/dist/src/hooks/kg-context-injector.js.map +1 -1
  362. package/dist/src/hooks/kg-sync-hook.d.ts +1 -9
  363. package/dist/src/hooks/kg-sync-hook.d.ts.map +1 -1
  364. package/dist/src/hooks/kg-sync-hook.js +21 -90
  365. package/dist/src/hooks/kg-sync-hook.js.map +1 -1
  366. package/dist/src/hooks/spec-analytics.d.ts +1 -0
  367. package/dist/src/hooks/spec-analytics.d.ts.map +1 -1
  368. package/dist/src/hooks/spec-analytics.js +1 -3
  369. package/dist/src/hooks/spec-analytics.js.map +1 -1
  370. package/dist/src/hooks/spec-injector.d.ts.map +1 -1
  371. package/dist/src/hooks/spec-injector.js +65 -1
  372. package/dist/src/hooks/spec-injector.js.map +1 -1
  373. package/dist/src/i18n/locales/en.d.ts.map +1 -1
  374. package/dist/src/i18n/locales/en.js +52 -9
  375. package/dist/src/i18n/locales/en.js.map +1 -1
  376. package/dist/src/i18n/locales/zh.d.ts.map +1 -1
  377. package/dist/src/i18n/locales/zh.js +52 -9
  378. package/dist/src/i18n/locales/zh.js.map +1 -1
  379. package/dist/src/i18n/types.d.ts +40 -4
  380. package/dist/src/i18n/types.d.ts.map +1 -1
  381. package/dist/src/tools/__tests__/domain-search-debug.d.ts +2 -0
  382. package/dist/src/tools/__tests__/domain-search-debug.d.ts.map +1 -0
  383. package/dist/src/tools/__tests__/domain-search-debug.js +32 -0
  384. package/dist/src/tools/__tests__/domain-search-debug.js.map +1 -0
  385. package/dist/src/tools/domain-loader.d.ts +63 -0
  386. package/dist/src/tools/domain-loader.d.ts.map +1 -0
  387. package/dist/src/tools/domain-loader.js +295 -0
  388. package/dist/src/tools/domain-loader.js.map +1 -0
  389. package/dist/src/tools/domain-matcher.d.ts +24 -0
  390. package/dist/src/tools/domain-matcher.d.ts.map +1 -0
  391. package/dist/src/tools/domain-matcher.js +117 -0
  392. package/dist/src/tools/domain-matcher.js.map +1 -0
  393. package/dist/src/tools/domain-scanner.d.ts +32 -0
  394. package/dist/src/tools/domain-scanner.d.ts.map +1 -0
  395. package/dist/src/tools/domain-scanner.js +263 -0
  396. package/dist/src/tools/domain-scanner.js.map +1 -0
  397. package/dist/src/tools/domain-schema.d.ts +18 -0
  398. package/dist/src/tools/domain-schema.d.ts.map +1 -0
  399. package/dist/src/tools/domain-schema.js +104 -0
  400. package/dist/src/tools/domain-schema.js.map +1 -0
  401. package/dist/src/tools/spec-entry-parser.d.ts +1 -0
  402. package/dist/src/tools/spec-entry-parser.d.ts.map +1 -1
  403. package/dist/src/tools/spec-entry-parser.js +1 -0
  404. package/dist/src/tools/spec-entry-parser.js.map +1 -1
  405. package/dist/src/tools/spec-loader.d.ts +5 -0
  406. package/dist/src/tools/spec-loader.d.ts.map +1 -1
  407. package/dist/src/tools/spec-loader.js +10 -2
  408. package/dist/src/tools/spec-loader.js.map +1 -1
  409. package/dist/src/tui/install-ui/ConfigPanel.d.ts.map +1 -1
  410. package/dist/src/tui/install-ui/ConfigPanel.js +9 -1
  411. package/dist/src/tui/install-ui/ConfigPanel.js.map +1 -1
  412. package/dist/src/tui/install-ui/GroupedHub.d.ts +55 -0
  413. package/dist/src/tui/install-ui/GroupedHub.d.ts.map +1 -0
  414. package/dist/src/tui/install-ui/GroupedHub.js +210 -0
  415. package/dist/src/tui/install-ui/GroupedHub.js.map +1 -0
  416. package/dist/src/tui/install-ui/HooksConfig.d.ts +10 -5
  417. package/dist/src/tui/install-ui/HooksConfig.d.ts.map +1 -1
  418. package/dist/src/tui/install-ui/HooksConfig.js +83 -18
  419. package/dist/src/tui/install-ui/HooksConfig.js.map +1 -1
  420. package/dist/src/tui/install-ui/InstallConfirm.d.ts +1 -30
  421. package/dist/src/tui/install-ui/InstallConfirm.d.ts.map +1 -1
  422. package/dist/src/tui/install-ui/InstallConfirm.js +72 -12
  423. package/dist/src/tui/install-ui/InstallConfirm.js.map +1 -1
  424. package/dist/src/tui/install-ui/InstallExecution.d.ts +4 -21
  425. package/dist/src/tui/install-ui/InstallExecution.d.ts.map +1 -1
  426. package/dist/src/tui/install-ui/InstallExecution.js +89 -260
  427. package/dist/src/tui/install-ui/InstallExecution.js.map +1 -1
  428. package/dist/src/tui/install-ui/InstallFlow.d.ts +3 -7
  429. package/dist/src/tui/install-ui/InstallFlow.d.ts.map +1 -1
  430. package/dist/src/tui/install-ui/InstallFlow.js +45 -267
  431. package/dist/src/tui/install-ui/InstallFlow.js.map +1 -1
  432. package/dist/src/tui/install-ui/InstallHub.d.ts.map +1 -1
  433. package/dist/src/tui/install-ui/InstallHub.js +2 -4
  434. package/dist/src/tui/install-ui/InstallHub.js.map +1 -1
  435. package/dist/src/tui/install-ui/InstallResult.d.ts.map +1 -1
  436. package/dist/src/tui/install-ui/InstallResult.js +1 -5
  437. package/dist/src/tui/install-ui/InstallResult.js.map +1 -1
  438. package/dist/src/tui/install-ui/index.d.ts +5 -1
  439. package/dist/src/tui/install-ui/index.d.ts.map +1 -1
  440. package/dist/src/tui/install-ui/index.js +1 -0
  441. package/dist/src/tui/install-ui/index.js.map +1 -1
  442. package/dist/src/tui/install-ui/types.d.ts +39 -0
  443. package/dist/src/tui/install-ui/types.d.ts.map +1 -1
  444. package/dist/src/tui/install-ui/types.js +1 -1
  445. package/dist/src/tui/install-ui/types.js.map +1 -1
  446. package/dist/src/tui/install-ui/useInstallFlowState.d.ts +69 -0
  447. package/dist/src/tui/install-ui/useInstallFlowState.d.ts.map +1 -0
  448. package/dist/src/tui/install-ui/useInstallFlowState.js +288 -0
  449. package/dist/src/tui/install-ui/useInstallFlowState.js.map +1 -0
  450. package/dist/src/tui/shared/components.d.ts +4 -0
  451. package/dist/src/tui/shared/components.d.ts.map +1 -1
  452. package/dist/src/tui/shared/components.js +4 -0
  453. package/dist/src/tui/shared/components.js.map +1 -1
  454. package/dist/src/tui/shared/index.d.ts +1 -1
  455. package/dist/src/tui/shared/index.d.ts.map +1 -1
  456. package/dist/src/tui/shared/index.js +1 -1
  457. package/dist/src/tui/shared/index.js.map +1 -1
  458. package/dist/src/tui/shared/tokens.d.ts +5 -5
  459. package/dist/src/tui/shared/tokens.js +5 -5
  460. package/dist/src/tui/shared/tokens.js.map +1 -1
  461. package/dist/src/types/index.d.ts +9 -0
  462. package/dist/src/types/index.d.ts.map +1 -1
  463. package/dist/src/utils/cli-format.d.ts +2 -1
  464. package/dist/src/utils/cli-format.d.ts.map +1 -1
  465. package/dist/src/utils/cli-format.js +14 -3
  466. package/dist/src/utils/cli-format.js.map +1 -1
  467. package/dist/src/utils/cooldown-guard.d.ts +17 -0
  468. package/dist/src/utils/cooldown-guard.d.ts.map +1 -0
  469. package/dist/src/utils/cooldown-guard.js +59 -0
  470. package/dist/src/utils/cooldown-guard.js.map +1 -0
  471. package/dist/src/utils/jsonl-log.d.ts.map +1 -1
  472. package/dist/src/utils/jsonl-log.js +2 -1
  473. package/dist/src/utils/jsonl-log.js.map +1 -1
  474. package/dist/src/utils/update-notices.js +17 -4
  475. package/dist/src/utils/update-notices.js.map +1 -1
  476. package/package.json +4 -5
  477. package/workflows/claude-instructions.md +23 -0
  478. package/workflows/codex-instructions.md +22 -0
  479. package/workflows/finish-work.md +25 -0
  480. package/workflows/updates/update-v3-setup.md +7 -15
  481. package/dashboard/dist/assets/McpPage-Im6s4pGR.js +0 -21
  482. package/dashboard/dist/assets/SpecsPage-gr4KX51-.js +0 -36
  483. package/dashboard/dist/assets/folder-B8ODoZfb.js +0 -16
  484. package/dashboard/dist/assets/index-6-yE5Yl9.css +0 -1
  485. package/dashboard/dist/assets/pen-line-CR8GaHt-.js +0 -6
@@ -0,0 +1,8 @@
1
+ import type { KgDatabaseConnection } from './connection.js';
2
+ export interface MigrationStep {
3
+ version: number;
4
+ description: string;
5
+ sql: string;
6
+ }
7
+ export declare function applyMigrations(conn: KgDatabaseConnection): void;
8
+ //# sourceMappingURL=migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../../../src/graph/kg/db/migrations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAG5D,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AA6ED,wBAAgB,eAAe,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI,CAYhE"}
@@ -0,0 +1,88 @@
1
+ // src/graph/kg/db/migrations.ts — Schema 版本迁移
2
+ import { CREDIBILITY_MIGRATION_SQL } from '../credibility.js';
3
+ const MIGRATIONS = [
4
+ {
5
+ version: 1,
6
+ description: 'Initial CodeGraph-compatible schema',
7
+ sql: '',
8
+ },
9
+ {
10
+ version: 2,
11
+ description: 'MaestroGraph unified schema v2 — knowledge extensions + dual FTS5',
12
+ sql: '',
13
+ },
14
+ {
15
+ version: 3,
16
+ description: 'Credibility tracking — decay scoring + usage counters',
17
+ sql: CREDIBILITY_MIGRATION_SQL,
18
+ },
19
+ {
20
+ version: 4,
21
+ description: 'code_fts adds keywords column for camelCase sub-word search',
22
+ sql: `
23
+ -- Drop old triggers and FTS table
24
+ DROP TRIGGER IF EXISTS nodes_ai;
25
+ DROP TRIGGER IF EXISTS nodes_ad;
26
+ DROP TRIGGER IF EXISTS nodes_au;
27
+ DROP TABLE IF EXISTS code_fts;
28
+
29
+ -- Recreate code_fts with keywords column
30
+ CREATE VIRTUAL TABLE code_fts USING fts5(
31
+ id, name, qualified_name, docstring, signature, keywords,
32
+ tokenize = 'unicode61 remove_diacritics 2',
33
+ content = 'nodes', content_rowid = 'rowid'
34
+ );
35
+
36
+ -- Backfill existing codegraph nodes
37
+ INSERT INTO code_fts(rowid, id, name, qualified_name, docstring, signature, keywords)
38
+ SELECT rowid, id, name, qualified_name, docstring, signature, keywords
39
+ FROM nodes WHERE source_type = 'codegraph';
40
+
41
+ -- Recreate triggers with keywords column
42
+ CREATE TRIGGER nodes_ai AFTER INSERT ON nodes BEGIN
43
+ INSERT INTO code_fts(rowid, id, name, qualified_name, docstring, signature, keywords)
44
+ SELECT NEW.rowid, NEW.id, NEW.name, NEW.qualified_name, NEW.docstring, NEW.signature, NEW.keywords
45
+ WHERE NEW.source_type = 'codegraph';
46
+ INSERT INTO knowledge_fts(rowid, id, name, definition, body, aliases, keywords)
47
+ SELECT NEW.rowid, NEW.id, NEW.name, NEW.definition, NEW.body, NEW.aliases, NEW.keywords
48
+ WHERE NEW.source_type != 'codegraph';
49
+ END;
50
+
51
+ CREATE TRIGGER nodes_ad AFTER DELETE ON nodes BEGIN
52
+ INSERT INTO code_fts(code_fts, rowid, id, name, qualified_name, docstring, signature, keywords)
53
+ SELECT 'delete', OLD.rowid, OLD.id, OLD.name, OLD.qualified_name, OLD.docstring, OLD.signature, OLD.keywords
54
+ WHERE OLD.source_type = 'codegraph';
55
+ INSERT INTO knowledge_fts(knowledge_fts, rowid, id, name, definition, body, aliases, keywords)
56
+ SELECT 'delete', OLD.rowid, OLD.id, OLD.name, OLD.definition, OLD.body, OLD.aliases, OLD.keywords
57
+ WHERE OLD.source_type != 'codegraph';
58
+ END;
59
+
60
+ CREATE TRIGGER nodes_au AFTER UPDATE ON nodes BEGIN
61
+ INSERT INTO code_fts(code_fts, rowid, id, name, qualified_name, docstring, signature, keywords)
62
+ SELECT 'delete', OLD.rowid, OLD.id, OLD.name, OLD.qualified_name, OLD.docstring, OLD.signature, OLD.keywords
63
+ WHERE OLD.source_type = 'codegraph';
64
+ INSERT INTO code_fts(rowid, id, name, qualified_name, docstring, signature, keywords)
65
+ SELECT NEW.rowid, NEW.id, NEW.name, NEW.qualified_name, NEW.docstring, NEW.signature, NEW.keywords
66
+ WHERE NEW.source_type = 'codegraph';
67
+ INSERT INTO knowledge_fts(knowledge_fts, rowid, id, name, definition, body, aliases, keywords)
68
+ SELECT 'delete', OLD.rowid, OLD.id, OLD.name, OLD.definition, OLD.body, OLD.aliases, OLD.keywords
69
+ WHERE OLD.source_type != 'codegraph';
70
+ INSERT INTO knowledge_fts(rowid, id, name, definition, body, aliases, keywords)
71
+ SELECT NEW.rowid, NEW.id, NEW.name, NEW.definition, NEW.body, NEW.aliases, NEW.keywords
72
+ WHERE NEW.source_type != 'codegraph';
73
+ END;
74
+ `,
75
+ },
76
+ ];
77
+ export function applyMigrations(conn) {
78
+ const currentVersion = conn.getSchemaVersion();
79
+ for (const migration of MIGRATIONS) {
80
+ if (migration.version > currentVersion) {
81
+ if (migration.sql) {
82
+ conn.raw.exec(migration.sql);
83
+ }
84
+ conn.raw.prepare('INSERT OR REPLACE INTO schema_versions (version, applied_at, description) VALUES (?, ?, ?)').run(migration.version, Date.now(), migration.description);
85
+ }
86
+ }
87
+ }
88
+ //# sourceMappingURL=migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../../../../src/graph/kg/db/migrations.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAG9C,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAQ9D,MAAM,UAAU,GAAoB;IAClC;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,qCAAqC;QAClD,GAAG,EAAE,EAAE;KACR;IACD;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,mEAAmE;QAChF,GAAG,EAAE,EAAE;KACR;IACD;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,uDAAuD;QACpE,GAAG,EAAE,yBAAyB;KAC/B;IACD;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,6DAA6D;QAC1E,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAoDJ;KACF;CACF,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,IAA0B;IACxD,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC/C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,SAAS,CAAC,OAAO,GAAG,cAAc,EAAE,CAAC;YACvC,IAAI,SAAS,CAAC,GAAG,EAAE,CAAC;gBAClB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC/B,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,OAAO,CACd,4FAA4F,CAC7F,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,84 @@
1
+ import type { KgDatabaseConnection } from './connection.js';
2
+ import type { UnifiedNode, UnifiedEdge, FileRecord, UnifiedNodeKind, UnifiedEdgeKind, SourceType, UnifiedGraphStats } from './types.js';
3
+ interface FileRow {
4
+ path: string;
5
+ content_hash: string | null;
6
+ language: string | null;
7
+ size: number | null;
8
+ modified_at: number | null;
9
+ indexed_at: number | null;
10
+ node_count: number;
11
+ errors: string | null;
12
+ source_type: string | null;
13
+ }
14
+ export declare class KgQueryBuilder {
15
+ private conn;
16
+ constructor(conn: KgDatabaseConnection);
17
+ private get db();
18
+ insertNode(node: UnifiedNode): void;
19
+ insertNodes(nodes: UnifiedNode[]): number;
20
+ getNode(id: string): UnifiedNode | null;
21
+ getNodesByIds(ids: string[]): Map<string, UnifiedNode>;
22
+ getNodesByKind(kinds: UnifiedNodeKind[]): UnifiedNode[];
23
+ getNodesByFile(filePath: string): UnifiedNode[];
24
+ getNodesBySourceType(sourceType: SourceType): UnifiedNode[];
25
+ deleteNode(id: string): void;
26
+ deleteNodesBySourceTypeAndFile(sourceType: SourceType, filePath: string): number;
27
+ deleteNodesBySourceType(sourceType: SourceType): number;
28
+ insertEdge(edge: UnifiedEdge): void;
29
+ insertEdges(edges: UnifiedEdge[]): number;
30
+ getOutgoingEdges(nodeId: string, kind?: UnifiedEdgeKind): UnifiedEdge[];
31
+ getIncomingEdges(nodeId: string, kind?: UnifiedEdgeKind): UnifiedEdge[];
32
+ getOutgoingEdgesBatch(nodeIds: string[]): Map<string, UnifiedEdge[]>;
33
+ getIncomingEdgesBatch(nodeIds: string[]): Map<string, UnifiedEdge[]>;
34
+ deleteEdgesByProvenanceAndSource(provenance: string, sourcePrefix: string): number;
35
+ insertUnresolvedRef(ref: {
36
+ fromNodeId: string;
37
+ referenceName: string;
38
+ referenceKind: string;
39
+ line: number;
40
+ col: number;
41
+ filePath: string;
42
+ language: string;
43
+ candidates?: string[];
44
+ }): void;
45
+ getUnresolvedRefsByFile(filePath: string): Array<{
46
+ id: number;
47
+ fromNodeId: string;
48
+ referenceName: string;
49
+ referenceKind: string;
50
+ line: number;
51
+ col: number;
52
+ filePath: string;
53
+ language: string;
54
+ candidates: string[];
55
+ }>;
56
+ deleteUnresolvedRefsByFile(filePath: string): number;
57
+ upsertFile(record: FileRecord): void;
58
+ getFile(filePath: string): FileRecord | null;
59
+ getStaleFiles(): FileRow[];
60
+ getStats(dbSizeBytes: number): UnifiedGraphStats;
61
+ searchCodeFTS(query: string, opts: {
62
+ limit?: number;
63
+ kinds?: string[];
64
+ languages?: string[];
65
+ pathFilters?: string[];
66
+ }): Array<UnifiedNode & {
67
+ _bm25Score?: number;
68
+ }>;
69
+ searchKnowledgeFTS(query: string, opts: {
70
+ limit?: number;
71
+ sourceTypes?: SourceType[];
72
+ }): Array<UnifiedNode & {
73
+ _bm25Score?: number;
74
+ }>;
75
+ searchUnified(query: string, opts: {
76
+ limit?: number;
77
+ sourceTypes?: SourceType[];
78
+ }): UnifiedNode[];
79
+ private searchNodesLike;
80
+ private searchKnowledgeLike;
81
+ }
82
+ export declare function sanitizeFtsQuery(input: string): string;
83
+ export {};
84
+ //# sourceMappingURL=queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../../../../src/graph/kg/db/queries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,471 @@
1
+ // src/graph/kg/db/queries.ts — MaestroGraph 统一 CRUD
2
+ // 扩展 CodeGraph QueryBuilder 以支持知识节点 + 双 FTS5
3
+ import { tokenize as camelTokenize } from '../resolution/name-matcher.js';
4
+ function safeJsonParse(str, fallback) {
5
+ if (!str)
6
+ return fallback;
7
+ try {
8
+ return JSON.parse(str);
9
+ }
10
+ catch {
11
+ return fallback;
12
+ }
13
+ }
14
+ function rowToNode(row) {
15
+ return {
16
+ id: row.id,
17
+ kind: row.kind,
18
+ name: row.name,
19
+ qualifiedName: row.qualified_name ?? '',
20
+ filePath: row.file_path ?? '',
21
+ language: (row.language ?? 'unknown'),
22
+ startLine: row.start_line,
23
+ endLine: row.end_line,
24
+ startColumn: row.start_column,
25
+ endColumn: row.end_column,
26
+ docstring: row.docstring ?? '',
27
+ signature: row.signature ?? '',
28
+ visibility: (row.visibility ?? ''),
29
+ isExported: Boolean(row.is_exported),
30
+ isAsync: Boolean(row.is_async),
31
+ isStatic: Boolean(row.is_static),
32
+ isAbstract: Boolean(row.is_abstract),
33
+ decorators: safeJsonParse(row.decorators, []),
34
+ typeParameters: safeJsonParse(row.type_parameters, []),
35
+ sourceType: (row.source_type ?? 'codegraph'),
36
+ definition: row.definition ?? '',
37
+ aliases: safeJsonParse(row.aliases, []),
38
+ keywords: safeJsonParse(row.keywords, []),
39
+ category: row.category ?? '',
40
+ roles: safeJsonParse(row.roles, []),
41
+ priority: row.priority ?? '',
42
+ status: row.status ?? 'active',
43
+ body: row.body ?? '',
44
+ metadata: safeJsonParse(row.metadata, {}),
45
+ updatedAt: row.updated_at,
46
+ };
47
+ }
48
+ function nodeToRow(node) {
49
+ return {
50
+ id: node.id,
51
+ kind: node.kind,
52
+ name: node.name,
53
+ qualified_name: node.qualifiedName,
54
+ file_path: node.filePath,
55
+ language: node.language,
56
+ start_line: node.startLine,
57
+ end_line: node.endLine,
58
+ start_column: node.startColumn,
59
+ end_column: node.endColumn,
60
+ docstring: node.docstring || null,
61
+ signature: node.signature || null,
62
+ visibility: node.visibility || null,
63
+ is_exported: node.isExported ? 1 : 0,
64
+ is_async: node.isAsync ? 1 : 0,
65
+ is_static: node.isStatic ? 1 : 0,
66
+ is_abstract: node.isAbstract ? 1 : 0,
67
+ decorators: node.decorators.length > 0 ? JSON.stringify(node.decorators) : null,
68
+ type_parameters: node.typeParameters.length > 0 ? JSON.stringify(node.typeParameters) : null,
69
+ source_type: node.sourceType,
70
+ definition: node.definition || null,
71
+ aliases: node.aliases.length > 0 ? JSON.stringify(node.aliases) : null,
72
+ keywords: node.keywords.length > 0 ? JSON.stringify(node.keywords) : null,
73
+ category: node.category || null,
74
+ roles: node.roles.length > 0 ? JSON.stringify(node.roles) : null,
75
+ priority: node.priority || null,
76
+ status: node.status || null,
77
+ body: node.body || null,
78
+ metadata: Object.keys(node.metadata).length > 0 ? JSON.stringify(node.metadata) : null,
79
+ updated_at: node.updatedAt,
80
+ };
81
+ }
82
+ function rowToEdge(row) {
83
+ return {
84
+ id: row.id,
85
+ source: row.source,
86
+ target: row.target,
87
+ kind: row.kind,
88
+ metadata: safeJsonParse(row.metadata, {}),
89
+ line: row.line ?? undefined,
90
+ column: row.col ?? undefined,
91
+ provenance: row.provenance,
92
+ };
93
+ }
94
+ // ---------------------------------------------------------------------------
95
+ // KgQueryBuilder — 统一 CRUD 操作
96
+ // ---------------------------------------------------------------------------
97
+ export class KgQueryBuilder {
98
+ conn;
99
+ constructor(conn) {
100
+ this.conn = conn;
101
+ }
102
+ get db() {
103
+ return this.conn.raw;
104
+ }
105
+ // ── Node CRUD ──────────────────────────────────────────────────────
106
+ insertNode(node) {
107
+ const row = nodeToRow(node);
108
+ const cols = Object.keys(row);
109
+ const placeholders = cols.map(() => '?').join(',');
110
+ this.db.prepare(`INSERT OR REPLACE INTO nodes (${cols.join(',')}) VALUES (${placeholders})`).run(...cols.map(c => row[c]));
111
+ }
112
+ insertNodes(nodes) {
113
+ if (nodes.length === 0)
114
+ return 0;
115
+ const stmt = this.db.prepare(`INSERT OR REPLACE INTO nodes (
116
+ id, kind, name, qualified_name, file_path, language,
117
+ start_line, end_line, start_column, end_column,
118
+ docstring, signature, visibility, is_exported, is_async, is_static, is_abstract,
119
+ decorators, type_parameters, source_type, definition, aliases, keywords,
120
+ category, roles, priority, status, body, metadata, updated_at
121
+ ) VALUES (
122
+ ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?
123
+ )`);
124
+ let count = 0;
125
+ this.conn.transaction(() => {
126
+ for (const node of nodes) {
127
+ let keywords = node.keywords;
128
+ if (node.sourceType === 'codegraph' && keywords.length === 0) {
129
+ const nameTokens = camelTokenize(node.name);
130
+ const qnTokens = node.qualifiedName ? camelTokenize(node.qualifiedName.split('.').pop() || '') : [];
131
+ const merged = [...new Set([...nameTokens, ...qnTokens])];
132
+ if (merged.length > 1)
133
+ keywords = merged;
134
+ }
135
+ stmt.run(node.id, node.kind, node.name, node.qualifiedName, node.filePath, node.language, node.startLine, node.endLine, node.startColumn, node.endColumn, node.docstring || null, node.signature || null, node.visibility || null, node.isExported ? 1 : 0, node.isAsync ? 1 : 0, node.isStatic ? 1 : 0, node.isAbstract ? 1 : 0, node.decorators.length > 0 ? JSON.stringify(node.decorators) : null, node.typeParameters.length > 0 ? JSON.stringify(node.typeParameters) : null, node.sourceType, node.definition || null, node.aliases.length > 0 ? JSON.stringify(node.aliases) : null, keywords.length > 0 ? JSON.stringify(keywords) : null, node.category || null, node.roles.length > 0 ? JSON.stringify(node.roles) : null, node.priority || null, node.status || null, node.body || null, Object.keys(node.metadata).length > 0 ? JSON.stringify(node.metadata) : null, node.updatedAt);
136
+ count++;
137
+ }
138
+ });
139
+ return count;
140
+ }
141
+ getNode(id) {
142
+ const row = this.db.prepare('SELECT * FROM nodes WHERE id = ?').get(id);
143
+ return row ? rowToNode(row) : null;
144
+ }
145
+ getNodesByIds(ids) {
146
+ if (ids.length === 0)
147
+ return new Map();
148
+ // 分批查询,每批 500 参数 (D2.3: IN-clause 批量匹配)
149
+ const BATCH_SIZE = 500;
150
+ const result = new Map();
151
+ for (let i = 0; i < ids.length; i += BATCH_SIZE) {
152
+ const batch = ids.slice(i, i + BATCH_SIZE);
153
+ const placeholders = batch.map(() => '?').join(',');
154
+ const rows = this.db.prepare(`SELECT * FROM nodes WHERE id IN (${placeholders})`).all(...batch);
155
+ for (const row of rows) {
156
+ result.set(row.id, rowToNode(row));
157
+ }
158
+ }
159
+ return result;
160
+ }
161
+ getNodesByKind(kinds) {
162
+ if (kinds.length === 0)
163
+ return [];
164
+ const placeholders = kinds.map(() => '?').join(',');
165
+ const rows = this.db.prepare(`SELECT * FROM nodes WHERE kind IN (${placeholders})`).all(...kinds);
166
+ return rows.map(rowToNode);
167
+ }
168
+ getNodesByFile(filePath) {
169
+ const rows = this.db.prepare('SELECT * FROM nodes WHERE file_path = ? ORDER BY start_line').all(filePath);
170
+ return rows.map(rowToNode);
171
+ }
172
+ getNodesBySourceType(sourceType) {
173
+ const rows = this.db.prepare('SELECT * FROM nodes WHERE source_type = ?').all(sourceType);
174
+ return rows.map(rowToNode);
175
+ }
176
+ deleteNode(id) {
177
+ this.db.prepare('DELETE FROM nodes WHERE id = ?').run(id);
178
+ }
179
+ deleteNodesBySourceTypeAndFile(sourceType, filePath) {
180
+ return this.db.prepare('DELETE FROM nodes WHERE source_type = ? AND file_path = ?').run(sourceType, filePath).changes;
181
+ }
182
+ deleteNodesBySourceType(sourceType) {
183
+ return this.db.prepare('DELETE FROM nodes WHERE source_type = ?').run(sourceType).changes;
184
+ }
185
+ // ── Edge CRUD ──────────────────────────────────────────────────────
186
+ insertEdge(edge) {
187
+ this.db.prepare(`INSERT INTO edges (source, target, kind, metadata, line, col, provenance)
188
+ VALUES (?, ?, ?, ?, ?, ?, ?)`).run(edge.source, edge.target, edge.kind, edge.metadata && Object.keys(edge.metadata).length > 0 ? JSON.stringify(edge.metadata) : null, edge.line ?? null, edge.column ?? null, edge.provenance ?? null);
189
+ }
190
+ insertEdges(edges) {
191
+ if (edges.length === 0)
192
+ return 0;
193
+ const stmt = this.db.prepare(`INSERT INTO edges (source, target, kind, metadata, line, col, provenance)
194
+ VALUES (?, ?, ?, ?, ?, ?, ?)`);
195
+ let count = 0;
196
+ this.conn.transaction(() => {
197
+ for (const edge of edges) {
198
+ stmt.run(edge.source, edge.target, edge.kind, edge.metadata && Object.keys(edge.metadata).length > 0 ? JSON.stringify(edge.metadata) : null, edge.line ?? null, edge.column ?? null, edge.provenance ?? null);
199
+ count++;
200
+ }
201
+ });
202
+ return count;
203
+ }
204
+ getOutgoingEdges(nodeId, kind) {
205
+ if (kind) {
206
+ const rows = this.db.prepare('SELECT * FROM edges WHERE source = ? AND kind = ?').all(nodeId, kind);
207
+ return rows.map(rowToEdge);
208
+ }
209
+ const rows = this.db.prepare('SELECT * FROM edges WHERE source = ?').all(nodeId);
210
+ return rows.map(rowToEdge);
211
+ }
212
+ getIncomingEdges(nodeId, kind) {
213
+ if (kind) {
214
+ const rows = this.db.prepare('SELECT * FROM edges WHERE target = ? AND kind = ?').all(nodeId, kind);
215
+ return rows.map(rowToEdge);
216
+ }
217
+ const rows = this.db.prepare('SELECT * FROM edges WHERE target = ?').all(nodeId);
218
+ return rows.map(rowToEdge);
219
+ }
220
+ getOutgoingEdgesBatch(nodeIds) {
221
+ const result = new Map();
222
+ if (nodeIds.length === 0)
223
+ return result;
224
+ for (const id of nodeIds)
225
+ result.set(id, []);
226
+ const BATCH_SIZE = 500;
227
+ for (let i = 0; i < nodeIds.length; i += BATCH_SIZE) {
228
+ const batch = nodeIds.slice(i, i + BATCH_SIZE);
229
+ const placeholders = batch.map(() => '?').join(',');
230
+ const rows = this.db.prepare(`SELECT * FROM edges WHERE source IN (${placeholders})`).all(...batch);
231
+ for (const row of rows) {
232
+ const edge = rowToEdge(row);
233
+ result.get(edge.source)?.push(edge);
234
+ }
235
+ }
236
+ return result;
237
+ }
238
+ getIncomingEdgesBatch(nodeIds) {
239
+ const result = new Map();
240
+ if (nodeIds.length === 0)
241
+ return result;
242
+ for (const id of nodeIds)
243
+ result.set(id, []);
244
+ const BATCH_SIZE = 500;
245
+ for (let i = 0; i < nodeIds.length; i += BATCH_SIZE) {
246
+ const batch = nodeIds.slice(i, i + BATCH_SIZE);
247
+ const placeholders = batch.map(() => '?').join(',');
248
+ const rows = this.db.prepare(`SELECT * FROM edges WHERE target IN (${placeholders})`).all(...batch);
249
+ for (const row of rows) {
250
+ const edge = rowToEdge(row);
251
+ result.get(edge.target)?.push(edge);
252
+ }
253
+ }
254
+ return result;
255
+ }
256
+ deleteEdgesByProvenanceAndSource(provenance, sourcePrefix) {
257
+ return this.db.prepare("DELETE FROM edges WHERE provenance = ? AND source LIKE ? ESCAPE '\\'").run(provenance, `${escapeLikePattern(sourcePrefix)}%`).changes;
258
+ }
259
+ // ── Unresolved Refs CRUD ──────────────────────────────────────────
260
+ insertUnresolvedRef(ref) {
261
+ this.db.prepare(`INSERT INTO unresolved_refs (from_node_id, reference_name, reference_kind, line, col, file_path, language, candidates)
262
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(ref.fromNodeId, ref.referenceName, ref.referenceKind, ref.line, ref.col, ref.filePath, ref.language, ref.candidates ? JSON.stringify(ref.candidates) : null);
263
+ }
264
+ getUnresolvedRefsByFile(filePath) {
265
+ const rows = this.db.prepare('SELECT * FROM unresolved_refs WHERE file_path = ?').all(filePath);
266
+ return rows.map(r => ({
267
+ id: r.id, fromNodeId: r.from_node_id, referenceName: r.reference_name,
268
+ referenceKind: r.reference_kind, line: r.line, col: r.col,
269
+ filePath: r.file_path, language: r.language,
270
+ candidates: safeJsonParse(r.candidates, []),
271
+ }));
272
+ }
273
+ deleteUnresolvedRefsByFile(filePath) {
274
+ return this.db.prepare('DELETE FROM unresolved_refs WHERE file_path = ?').run(filePath).changes;
275
+ }
276
+ // ── File CRUD ──────────────────────────────────────────────────────
277
+ upsertFile(record) {
278
+ this.db.prepare(`INSERT OR REPLACE INTO files (path, content_hash, language, size, modified_at, indexed_at, node_count, errors, source_type)
279
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(record.path, record.contentHash, record.language, record.size, record.modifiedAt, record.indexedAt, record.nodeCount, record.errors.length > 0 ? JSON.stringify(record.errors) : null, record.sourceType);
280
+ }
281
+ getFile(filePath) {
282
+ const row = this.db.prepare('SELECT * FROM files WHERE path = ?').get(filePath);
283
+ if (!row)
284
+ return null;
285
+ return {
286
+ path: row.path,
287
+ contentHash: row.content_hash ?? '',
288
+ language: (row.language ?? 'unknown'),
289
+ size: row.size ?? 0,
290
+ modifiedAt: row.modified_at ?? 0,
291
+ indexedAt: row.indexed_at ?? 0,
292
+ nodeCount: row.node_count,
293
+ errors: safeJsonParse(row.errors, []),
294
+ sourceType: (row.source_type ?? 'codegraph'),
295
+ };
296
+ }
297
+ getStaleFiles() {
298
+ return this.db.prepare('SELECT * FROM files WHERE modified_at > indexed_at').all();
299
+ }
300
+ // ── Stats ──────────────────────────────────────────────────────────
301
+ getStats(dbSizeBytes) {
302
+ const nodeCount = this.db.prepare('SELECT COUNT(*) as n FROM nodes').get().n;
303
+ const edgeCount = this.db.prepare('SELECT COUNT(*) as n FROM edges').get().n;
304
+ const fileCount = this.db.prepare('SELECT COUNT(*) as n FROM files').get().n;
305
+ const nodesByKind = {};
306
+ const kindRows = this.db.prepare('SELECT kind, COUNT(*) as n FROM nodes GROUP BY kind').all();
307
+ for (const r of kindRows)
308
+ nodesByKind[r.kind] = r.n;
309
+ const edgesByKind = {};
310
+ const edgeKindRows = this.db.prepare('SELECT kind, COUNT(*) as n FROM edges GROUP BY kind').all();
311
+ for (const r of edgeKindRows)
312
+ edgesByKind[r.kind] = r.n;
313
+ const nodesBySourceType = {};
314
+ const sourceRows = this.db.prepare('SELECT source_type, COUNT(*) as n FROM nodes GROUP BY source_type').all();
315
+ for (const r of sourceRows)
316
+ nodesBySourceType[r.source_type] = r.n;
317
+ const staleCount = this.db.prepare('SELECT COUNT(*) as n FROM files WHERE modified_at > indexed_at').get().n;
318
+ const stalenessRatio = fileCount > 0 ? staleCount / fileCount : 0;
319
+ const detectedFrameworks = [];
320
+ try {
321
+ const fwStr = this.db.prepare("SELECT value FROM project_metadata WHERE key = 'detected_frameworks'").get();
322
+ if (fwStr)
323
+ detectedFrameworks.push(...safeJsonParse(fwStr.value, []));
324
+ }
325
+ catch { /* ignore */ }
326
+ const schemaVersion = this.conn.getSchemaVersion();
327
+ return {
328
+ nodeCount, edgeCount, fileCount, dbSizeBytes,
329
+ nodesByKind, edgesByKind, nodesBySourceType,
330
+ detectedFrameworks, schemaVersion, stalenessRatio,
331
+ };
332
+ }
333
+ // ── Search — FTS5 统一搜索 (D1.5: 输入消毒) ───────────────────────
334
+ searchCodeFTS(query, opts) {
335
+ // CJK 查询降级到 LIKE — unicode61 tokenizer 不支持 CJK 分词
336
+ if (hasCjkChars(query)) {
337
+ return this.searchNodesLike(query, opts);
338
+ }
339
+ const sanitized = sanitizeFtsQuery(query);
340
+ if (!sanitized)
341
+ return [];
342
+ try {
343
+ let sql = `
344
+ SELECT n.*, bm25(code_fts, 0, 20, 5, 1, 2, 10) AS score
345
+ FROM code_fts JOIN nodes n ON code_fts.id = n.id
346
+ WHERE code_fts MATCH ? AND n.source_type = 'codegraph'
347
+ `;
348
+ const params = [sanitized];
349
+ if (opts.kinds && opts.kinds.length > 0) {
350
+ sql += ` AND n.kind IN (${opts.kinds.map(() => '?').join(',')})`;
351
+ params.push(...opts.kinds);
352
+ }
353
+ if (opts.languages && opts.languages.length > 0) {
354
+ sql += ` AND n.language IN (${opts.languages.map(() => '?').join(',')})`;
355
+ params.push(...opts.languages);
356
+ }
357
+ sql += ` ORDER BY score LIMIT ?`;
358
+ params.push(opts.limit ?? 20);
359
+ const rows = this.db.prepare(sql).all(...params);
360
+ const results = rows.map(r => {
361
+ const node = rowToNode(r);
362
+ if (typeof r.score === 'number')
363
+ node._bm25Score = -r.score;
364
+ return node;
365
+ });
366
+ if (results.length > 0)
367
+ return results;
368
+ return this.searchNodesLike(query, opts);
369
+ }
370
+ catch (err) {
371
+ if (process.env.DEBUG)
372
+ console.warn('[KG] code FTS5 failed, LIKE fallback:', err);
373
+ return this.searchNodesLike(query, opts);
374
+ }
375
+ }
376
+ searchKnowledgeFTS(query, opts) {
377
+ // CJK 短查询降级 (D7.1: trigram 最小单元 3 字符)
378
+ const isCjkShort = /^[㐀-䶿一-鿿぀-ヿ가-힯]{1,2}$/.test(query.trim());
379
+ if (isCjkShort) {
380
+ return this.searchKnowledgeLike(query, opts);
381
+ }
382
+ const sanitized = sanitizeFtsQuery(query);
383
+ if (!sanitized)
384
+ return [];
385
+ try {
386
+ let sql = `
387
+ SELECT n.*, bm25(knowledge_fts, 0, 20, 10, 1, 15, 10) AS score
388
+ FROM knowledge_fts JOIN nodes n ON knowledge_fts.id = n.id
389
+ WHERE knowledge_fts MATCH ? AND n.source_type != 'codegraph'
390
+ `;
391
+ const params = [sanitized];
392
+ if (opts.sourceTypes && opts.sourceTypes.length > 0) {
393
+ sql += ` AND n.source_type IN (${opts.sourceTypes.map(() => '?').join(',')})`;
394
+ params.push(...opts.sourceTypes);
395
+ }
396
+ sql += ` ORDER BY score LIMIT ?`;
397
+ params.push(opts.limit ?? 20);
398
+ const rows = this.db.prepare(sql).all(...params);
399
+ return rows.map(r => {
400
+ const node = rowToNode(r);
401
+ if (typeof r.score === 'number')
402
+ node._bm25Score = -r.score;
403
+ return node;
404
+ });
405
+ }
406
+ catch (err) {
407
+ if (process.env.DEBUG)
408
+ console.warn('[KG] knowledge FTS5 failed, LIKE fallback:', err);
409
+ return this.searchKnowledgeLike(query, opts);
410
+ }
411
+ }
412
+ searchUnified(query, opts) {
413
+ const codeResults = this.searchCodeFTS(query, { limit: opts.limit ?? 10 });
414
+ const knowledgeResults = this.searchKnowledgeFTS(query, { limit: opts.limit ?? 10, sourceTypes: opts.sourceTypes });
415
+ return [...codeResults, ...knowledgeResults];
416
+ }
417
+ // LIKE fallback — 当 FTS5 无结果时
418
+ searchNodesLike(query, opts) {
419
+ const escaped = escapeLikePattern(query);
420
+ let sql = `SELECT * FROM nodes WHERE source_type = 'codegraph' AND (name LIKE ? ESCAPE '\\' OR qualified_name LIKE ? ESCAPE '\\' OR docstring LIKE ? ESCAPE '\\' OR signature LIKE ? ESCAPE '\\')`;
421
+ const params = [`%${escaped}%`, `%${escaped}%`, `%${escaped}%`, `%${escaped}%`];
422
+ if (opts.kinds && opts.kinds.length > 0) {
423
+ sql += ` AND kind IN (${opts.kinds.map(() => '?').join(',')})`;
424
+ params.push(...opts.kinds);
425
+ }
426
+ if (opts.languages && opts.languages.length > 0) {
427
+ sql += ` AND language IN (${opts.languages.map(() => '?').join(',')})`;
428
+ params.push(...opts.languages);
429
+ }
430
+ sql += ` ORDER BY name LIMIT ?`;
431
+ params.push(opts.limit ?? 20);
432
+ const rows = this.db.prepare(sql).all(...params);
433
+ return rows.map(rowToNode);
434
+ }
435
+ searchKnowledgeLike(query, opts) {
436
+ const escaped = escapeLikePattern(query);
437
+ let sql = `SELECT * FROM nodes WHERE source_type != 'codegraph' AND (name LIKE ? ESCAPE '\\' OR definition LIKE ? ESCAPE '\\' OR aliases LIKE ? ESCAPE '\\' OR keywords LIKE ? ESCAPE '\\' OR body LIKE ? ESCAPE '\\')`;
438
+ const params = [`%${escaped}%`, `%${escaped}%`, `%${escaped}%`, `%${escaped}%`, `%${escaped}%`];
439
+ if (opts.sourceTypes && opts.sourceTypes.length > 0) {
440
+ sql += ` AND source_type IN (${opts.sourceTypes.map(() => '?').join(',')})`;
441
+ params.push(...opts.sourceTypes);
442
+ }
443
+ sql += ` ORDER BY name LIMIT ?`;
444
+ params.push(opts.limit ?? 20);
445
+ const rows = this.db.prepare(sql).all(...params);
446
+ return rows.map(rowToNode);
447
+ }
448
+ }
449
+ // ---------------------------------------------------------------------------
450
+ // LIKE 通配符转义 (AC13)
451
+ // ---------------------------------------------------------------------------
452
+ function escapeLikePattern(input) {
453
+ return input.replace(/[%_\\]/g, '\\$&');
454
+ }
455
+ // ---------------------------------------------------------------------------
456
+ // FTS5 输入消毒 (D1.5)
457
+ // ---------------------------------------------------------------------------
458
+ function hasCjkChars(input) {
459
+ return /[㐀-䶿一-鿿぀-ヿ가-힯]/.test(input);
460
+ }
461
+ const FTS5_SPECIAL_CHARS = /[*"(){}[\]:^~+\-!\\]/g;
462
+ const FTS5_OPERATORS = new Set(['and', 'or', 'not', 'near']);
463
+ export function sanitizeFtsQuery(input) {
464
+ const tokens = input.replace(FTS5_SPECIAL_CHARS, ' ').split(/\s+/)
465
+ .filter(t => t.length > 0)
466
+ .filter(t => !FTS5_OPERATORS.has(t.toLowerCase()));
467
+ if (tokens.length === 0)
468
+ return '';
469
+ return tokens.map(t => `"${t.replace(/"/g, '""')}"`).join(' ');
470
+ }
471
+ //# sourceMappingURL=queries.js.map