@dreb/coding-agent 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (809) hide show
  1. package/CHANGELOG.md +3316 -0
  2. package/README.md +657 -0
  3. package/agents/code-reviewer.md +55 -0
  4. package/agents/completeness-checker.md +71 -0
  5. package/agents/error-auditor.md +65 -0
  6. package/agents/explore.md +13 -0
  7. package/agents/feature-dev.md +23 -0
  8. package/agents/independent-assessor.md +61 -0
  9. package/agents/sandbox.md +14 -0
  10. package/agents/simplifier.md +69 -0
  11. package/agents/test-reviewer.md +63 -0
  12. package/dist/bun/cli.d.ts +3 -0
  13. package/dist/bun/cli.d.ts.map +1 -0
  14. package/dist/bun/cli.js +7 -0
  15. package/dist/bun/cli.js.map +1 -0
  16. package/dist/bun/register-bedrock.d.ts +2 -0
  17. package/dist/bun/register-bedrock.d.ts.map +1 -0
  18. package/dist/bun/register-bedrock.js +4 -0
  19. package/dist/bun/register-bedrock.js.map +1 -0
  20. package/dist/cli/args.d.ts +50 -0
  21. package/dist/cli/args.d.ts.map +1 -0
  22. package/dist/cli/args.js +310 -0
  23. package/dist/cli/args.js.map +1 -0
  24. package/dist/cli/config-selector.d.ts +14 -0
  25. package/dist/cli/config-selector.d.ts.map +1 -0
  26. package/dist/cli/config-selector.js +31 -0
  27. package/dist/cli/config-selector.js.map +1 -0
  28. package/dist/cli/file-processor.d.ts +15 -0
  29. package/dist/cli/file-processor.d.ts.map +1 -0
  30. package/dist/cli/file-processor.js +83 -0
  31. package/dist/cli/file-processor.js.map +1 -0
  32. package/dist/cli/initial-message.d.ts +18 -0
  33. package/dist/cli/initial-message.d.ts.map +1 -0
  34. package/dist/cli/initial-message.js +22 -0
  35. package/dist/cli/initial-message.js.map +1 -0
  36. package/dist/cli/list-models.d.ts +9 -0
  37. package/dist/cli/list-models.d.ts.map +1 -0
  38. package/dist/cli/list-models.js +92 -0
  39. package/dist/cli/list-models.js.map +1 -0
  40. package/dist/cli/session-picker.d.ts +9 -0
  41. package/dist/cli/session-picker.d.ts.map +1 -0
  42. package/dist/cli/session-picker.js +35 -0
  43. package/dist/cli/session-picker.js.map +1 -0
  44. package/dist/cli.d.ts +3 -0
  45. package/dist/cli.d.ts.map +1 -0
  46. package/dist/cli.js +14 -0
  47. package/dist/cli.js.map +1 -0
  48. package/dist/config.d.ts +76 -0
  49. package/dist/config.d.ts.map +1 -0
  50. package/dist/config.js +234 -0
  51. package/dist/config.js.map +1 -0
  52. package/dist/core/agent-session.d.ts +658 -0
  53. package/dist/core/agent-session.d.ts.map +1 -0
  54. package/dist/core/agent-session.js +2898 -0
  55. package/dist/core/agent-session.js.map +1 -0
  56. package/dist/core/auth-storage.d.ts +130 -0
  57. package/dist/core/auth-storage.d.ts.map +1 -0
  58. package/dist/core/auth-storage.js +421 -0
  59. package/dist/core/auth-storage.js.map +1 -0
  60. package/dist/core/bash-executor.d.ts +46 -0
  61. package/dist/core/bash-executor.d.ts.map +1 -0
  62. package/dist/core/bash-executor.js +113 -0
  63. package/dist/core/bash-executor.js.map +1 -0
  64. package/dist/core/buddy/buddy-controller.d.ts +139 -0
  65. package/dist/core/buddy/buddy-controller.d.ts.map +1 -0
  66. package/dist/core/buddy/buddy-controller.js +428 -0
  67. package/dist/core/buddy/buddy-controller.js.map +1 -0
  68. package/dist/core/buddy/buddy-manager.d.ts +68 -0
  69. package/dist/core/buddy/buddy-manager.d.ts.map +1 -0
  70. package/dist/core/buddy/buddy-manager.js +399 -0
  71. package/dist/core/buddy/buddy-manager.js.map +1 -0
  72. package/dist/core/buddy/buddy-prng.d.ts +28 -0
  73. package/dist/core/buddy/buddy-prng.d.ts.map +1 -0
  74. package/dist/core/buddy/buddy-prng.js +65 -0
  75. package/dist/core/buddy/buddy-prng.js.map +1 -0
  76. package/dist/core/buddy/buddy-species.d.ts +37 -0
  77. package/dist/core/buddy/buddy-species.d.ts.map +1 -0
  78. package/dist/core/buddy/buddy-species.js +287 -0
  79. package/dist/core/buddy/buddy-species.js.map +1 -0
  80. package/dist/core/buddy/buddy-types.d.ts +58 -0
  81. package/dist/core/buddy/buddy-types.d.ts.map +1 -0
  82. package/dist/core/buddy/buddy-types.js +46 -0
  83. package/dist/core/buddy/buddy-types.js.map +1 -0
  84. package/dist/core/buddy/index.d.ts +7 -0
  85. package/dist/core/buddy/index.d.ts.map +1 -0
  86. package/dist/core/buddy/index.js +6 -0
  87. package/dist/core/buddy/index.js.map +1 -0
  88. package/dist/core/compaction/branch-summarization.d.ts +86 -0
  89. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  90. package/dist/core/compaction/branch-summarization.js +243 -0
  91. package/dist/core/compaction/branch-summarization.js.map +1 -0
  92. package/dist/core/compaction/compaction.d.ts +121 -0
  93. package/dist/core/compaction/compaction.d.ts.map +1 -0
  94. package/dist/core/compaction/compaction.js +612 -0
  95. package/dist/core/compaction/compaction.js.map +1 -0
  96. package/dist/core/compaction/index.d.ts +7 -0
  97. package/dist/core/compaction/index.d.ts.map +1 -0
  98. package/dist/core/compaction/index.js +7 -0
  99. package/dist/core/compaction/index.js.map +1 -0
  100. package/dist/core/compaction/utils.d.ts +38 -0
  101. package/dist/core/compaction/utils.d.ts.map +1 -0
  102. package/dist/core/compaction/utils.js +153 -0
  103. package/dist/core/compaction/utils.js.map +1 -0
  104. package/dist/core/defaults.d.ts +3 -0
  105. package/dist/core/defaults.d.ts.map +1 -0
  106. package/dist/core/defaults.js +2 -0
  107. package/dist/core/defaults.js.map +1 -0
  108. package/dist/core/diagnostics.d.ts +15 -0
  109. package/dist/core/diagnostics.d.ts.map +1 -0
  110. package/dist/core/diagnostics.js +2 -0
  111. package/dist/core/diagnostics.js.map +1 -0
  112. package/dist/core/event-bus.d.ts +9 -0
  113. package/dist/core/event-bus.d.ts.map +1 -0
  114. package/dist/core/event-bus.js +25 -0
  115. package/dist/core/event-bus.js.map +1 -0
  116. package/dist/core/exec.d.ts +29 -0
  117. package/dist/core/exec.d.ts.map +1 -0
  118. package/dist/core/exec.js +75 -0
  119. package/dist/core/exec.js.map +1 -0
  120. package/dist/core/export-html/ansi-to-html.d.ts +22 -0
  121. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  122. package/dist/core/export-html/ansi-to-html.js +249 -0
  123. package/dist/core/export-html/ansi-to-html.js.map +1 -0
  124. package/dist/core/export-html/index.d.ts +37 -0
  125. package/dist/core/export-html/index.d.ts.map +1 -0
  126. package/dist/core/export-html/index.js +224 -0
  127. package/dist/core/export-html/index.js.map +1 -0
  128. package/dist/core/export-html/template.css +1001 -0
  129. package/dist/core/export-html/template.html +55 -0
  130. package/dist/core/export-html/template.js +1690 -0
  131. package/dist/core/export-html/tool-renderer.d.ts +38 -0
  132. package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  133. package/dist/core/export-html/tool-renderer.js +95 -0
  134. package/dist/core/export-html/tool-renderer.js.map +1 -0
  135. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  136. package/dist/core/export-html/vendor/marked.min.js +6 -0
  137. package/dist/core/extensions/index.d.ts +12 -0
  138. package/dist/core/extensions/index.d.ts.map +1 -0
  139. package/dist/core/extensions/index.js +9 -0
  140. package/dist/core/extensions/index.js.map +1 -0
  141. package/dist/core/extensions/loader.d.ts +25 -0
  142. package/dist/core/extensions/loader.d.ts.map +1 -0
  143. package/dist/core/extensions/loader.js +436 -0
  144. package/dist/core/extensions/loader.js.map +1 -0
  145. package/dist/core/extensions/runner.d.ts +147 -0
  146. package/dist/core/extensions/runner.d.ts.map +1 -0
  147. package/dist/core/extensions/runner.js +696 -0
  148. package/dist/core/extensions/runner.js.map +1 -0
  149. package/dist/core/extensions/types.d.ts +1072 -0
  150. package/dist/core/extensions/types.d.ts.map +1 -0
  151. package/dist/core/extensions/types.js +35 -0
  152. package/dist/core/extensions/types.js.map +1 -0
  153. package/dist/core/extensions/wrapper.d.ts +20 -0
  154. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  155. package/dist/core/extensions/wrapper.js +22 -0
  156. package/dist/core/extensions/wrapper.js.map +1 -0
  157. package/dist/core/footer-data-provider.d.ts +44 -0
  158. package/dist/core/footer-data-provider.d.ts.map +1 -0
  159. package/dist/core/footer-data-provider.js +252 -0
  160. package/dist/core/footer-data-provider.js.map +1 -0
  161. package/dist/core/forbidden-commands.d.ts +31 -0
  162. package/dist/core/forbidden-commands.d.ts.map +1 -0
  163. package/dist/core/forbidden-commands.js +184 -0
  164. package/dist/core/forbidden-commands.js.map +1 -0
  165. package/dist/core/git-root.d.ts +6 -0
  166. package/dist/core/git-root.d.ts.map +1 -0
  167. package/dist/core/git-root.js +32 -0
  168. package/dist/core/git-root.js.map +1 -0
  169. package/dist/core/index.d.ts +10 -0
  170. package/dist/core/index.d.ts.map +1 -0
  171. package/dist/core/index.js +10 -0
  172. package/dist/core/index.js.map +1 -0
  173. package/dist/core/keybindings.d.ts +280 -0
  174. package/dist/core/keybindings.d.ts.map +1 -0
  175. package/dist/core/keybindings.js +245 -0
  176. package/dist/core/keybindings.js.map +1 -0
  177. package/dist/core/memory-prompt.d.ts +10 -0
  178. package/dist/core/memory-prompt.d.ts.map +1 -0
  179. package/dist/core/memory-prompt.js +95 -0
  180. package/dist/core/memory-prompt.js.map +1 -0
  181. package/dist/core/messages.d.ts +77 -0
  182. package/dist/core/messages.d.ts.map +1 -0
  183. package/dist/core/messages.js +123 -0
  184. package/dist/core/messages.js.map +1 -0
  185. package/dist/core/model-registry.d.ts +114 -0
  186. package/dist/core/model-registry.d.ts.map +1 -0
  187. package/dist/core/model-registry.js +563 -0
  188. package/dist/core/model-registry.js.map +1 -0
  189. package/dist/core/model-resolver.d.ts +116 -0
  190. package/dist/core/model-resolver.d.ts.map +1 -0
  191. package/dist/core/model-resolver.js +465 -0
  192. package/dist/core/model-resolver.js.map +1 -0
  193. package/dist/core/output-guard.d.ts +6 -0
  194. package/dist/core/output-guard.d.ts.map +1 -0
  195. package/dist/core/output-guard.js +59 -0
  196. package/dist/core/output-guard.js.map +1 -0
  197. package/dist/core/package-manager.d.ts +172 -0
  198. package/dist/core/package-manager.d.ts.map +1 -0
  199. package/dist/core/package-manager.js +1767 -0
  200. package/dist/core/package-manager.js.map +1 -0
  201. package/dist/core/prompt-templates.d.ts +51 -0
  202. package/dist/core/prompt-templates.d.ts.map +1 -0
  203. package/dist/core/prompt-templates.js +251 -0
  204. package/dist/core/prompt-templates.js.map +1 -0
  205. package/dist/core/resolve-config-value.d.ts +17 -0
  206. package/dist/core/resolve-config-value.d.ts.map +1 -0
  207. package/dist/core/resolve-config-value.js +94 -0
  208. package/dist/core/resolve-config-value.js.map +1 -0
  209. package/dist/core/resource-loader.d.ts +205 -0
  210. package/dist/core/resource-loader.d.ts.map +1 -0
  211. package/dist/core/resource-loader.js +866 -0
  212. package/dist/core/resource-loader.js.map +1 -0
  213. package/dist/core/sdk.d.ts +92 -0
  214. package/dist/core/sdk.d.ts.map +1 -0
  215. package/dist/core/sdk.js +258 -0
  216. package/dist/core/sdk.js.map +1 -0
  217. package/dist/core/search/chunker.d.ts +21 -0
  218. package/dist/core/search/chunker.d.ts.map +1 -0
  219. package/dist/core/search/chunker.js +51 -0
  220. package/dist/core/search/chunker.js.map +1 -0
  221. package/dist/core/search/db.d.ts +89 -0
  222. package/dist/core/search/db.d.ts.map +1 -0
  223. package/dist/core/search/db.js +406 -0
  224. package/dist/core/search/db.js.map +1 -0
  225. package/dist/core/search/embedder.d.ts +51 -0
  226. package/dist/core/search/embedder.d.ts.map +1 -0
  227. package/dist/core/search/embedder.js +143 -0
  228. package/dist/core/search/embedder.js.map +1 -0
  229. package/dist/core/search/index-manager.d.ts +55 -0
  230. package/dist/core/search/index-manager.d.ts.map +1 -0
  231. package/dist/core/search/index-manager.js +311 -0
  232. package/dist/core/search/index-manager.js.map +1 -0
  233. package/dist/core/search/metrics/bm25.d.ts +10 -0
  234. package/dist/core/search/metrics/bm25.d.ts.map +1 -0
  235. package/dist/core/search/metrics/bm25.js +32 -0
  236. package/dist/core/search/metrics/bm25.js.map +1 -0
  237. package/dist/core/search/metrics/git-recency.d.ts +14 -0
  238. package/dist/core/search/metrics/git-recency.d.ts.map +1 -0
  239. package/dist/core/search/metrics/git-recency.js +123 -0
  240. package/dist/core/search/metrics/git-recency.js.map +1 -0
  241. package/dist/core/search/metrics/import-graph.d.ts +15 -0
  242. package/dist/core/search/metrics/import-graph.d.ts.map +1 -0
  243. package/dist/core/search/metrics/import-graph.js +115 -0
  244. package/dist/core/search/metrics/import-graph.js.map +1 -0
  245. package/dist/core/search/metrics/path-match.d.ts +13 -0
  246. package/dist/core/search/metrics/path-match.d.ts.map +1 -0
  247. package/dist/core/search/metrics/path-match.js +54 -0
  248. package/dist/core/search/metrics/path-match.js.map +1 -0
  249. package/dist/core/search/metrics/symbol-match.d.ts +12 -0
  250. package/dist/core/search/metrics/symbol-match.d.ts.map +1 -0
  251. package/dist/core/search/metrics/symbol-match.js +62 -0
  252. package/dist/core/search/metrics/symbol-match.js.map +1 -0
  253. package/dist/core/search/metrics/tokenize.d.ts +12 -0
  254. package/dist/core/search/metrics/tokenize.d.ts.map +1 -0
  255. package/dist/core/search/metrics/tokenize.js +29 -0
  256. package/dist/core/search/metrics/tokenize.js.map +1 -0
  257. package/dist/core/search/poem.d.ts +38 -0
  258. package/dist/core/search/poem.d.ts.map +1 -0
  259. package/dist/core/search/poem.js +214 -0
  260. package/dist/core/search/poem.js.map +1 -0
  261. package/dist/core/search/query-classifier.d.ts +17 -0
  262. package/dist/core/search/query-classifier.d.ts.map +1 -0
  263. package/dist/core/search/query-classifier.js +54 -0
  264. package/dist/core/search/query-classifier.js.map +1 -0
  265. package/dist/core/search/scanner.d.ts +30 -0
  266. package/dist/core/search/scanner.d.ts.map +1 -0
  267. package/dist/core/search/scanner.js +335 -0
  268. package/dist/core/search/scanner.js.map +1 -0
  269. package/dist/core/search/search.d.ts +42 -0
  270. package/dist/core/search/search.d.ts.map +1 -0
  271. package/dist/core/search/search.js +337 -0
  272. package/dist/core/search/search.js.map +1 -0
  273. package/dist/core/search/text-chunker.d.ts +15 -0
  274. package/dist/core/search/text-chunker.d.ts.map +1 -0
  275. package/dist/core/search/text-chunker.js +580 -0
  276. package/dist/core/search/text-chunker.js.map +1 -0
  277. package/dist/core/search/tree-sitter-chunker.d.ts +25 -0
  278. package/dist/core/search/tree-sitter-chunker.d.ts.map +1 -0
  279. package/dist/core/search/tree-sitter-chunker.js +357 -0
  280. package/dist/core/search/tree-sitter-chunker.js.map +1 -0
  281. package/dist/core/search/types.d.ts +96 -0
  282. package/dist/core/search/types.d.ts.map +1 -0
  283. package/dist/core/search/types.js +6 -0
  284. package/dist/core/search/types.js.map +1 -0
  285. package/dist/core/search/vector-store.d.ts +43 -0
  286. package/dist/core/search/vector-store.d.ts.map +1 -0
  287. package/dist/core/search/vector-store.js +73 -0
  288. package/dist/core/search/vector-store.js.map +1 -0
  289. package/dist/core/session-manager.d.ts +329 -0
  290. package/dist/core/session-manager.d.ts.map +1 -0
  291. package/dist/core/session-manager.js +1097 -0
  292. package/dist/core/session-manager.js.map +1 -0
  293. package/dist/core/settings-manager.d.ts +239 -0
  294. package/dist/core/settings-manager.d.ts.map +1 -0
  295. package/dist/core/settings-manager.js +705 -0
  296. package/dist/core/settings-manager.js.map +1 -0
  297. package/dist/core/skills.d.ts +67 -0
  298. package/dist/core/skills.d.ts.map +1 -0
  299. package/dist/core/skills.js +428 -0
  300. package/dist/core/skills.js.map +1 -0
  301. package/dist/core/slash-commands.d.ts +14 -0
  302. package/dist/core/slash-commands.d.ts.map +1 -0
  303. package/dist/core/slash-commands.js +23 -0
  304. package/dist/core/slash-commands.js.map +1 -0
  305. package/dist/core/source-info.d.ts +18 -0
  306. package/dist/core/source-info.d.ts.map +1 -0
  307. package/dist/core/source-info.js +19 -0
  308. package/dist/core/source-info.js.map +1 -0
  309. package/dist/core/system-prompt.d.ts +33 -0
  310. package/dist/core/system-prompt.d.ts.map +1 -0
  311. package/dist/core/system-prompt.js +184 -0
  312. package/dist/core/system-prompt.js.map +1 -0
  313. package/dist/core/timings.d.ts +8 -0
  314. package/dist/core/timings.d.ts.map +1 -0
  315. package/dist/core/timings.js +31 -0
  316. package/dist/core/timings.js.map +1 -0
  317. package/dist/core/tools/bash.d.ts +73 -0
  318. package/dist/core/tools/bash.d.ts.map +1 -0
  319. package/dist/core/tools/bash.js +342 -0
  320. package/dist/core/tools/bash.js.map +1 -0
  321. package/dist/core/tools/edit-diff.d.ts +63 -0
  322. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  323. package/dist/core/tools/edit-diff.js +244 -0
  324. package/dist/core/tools/edit-diff.js.map +1 -0
  325. package/dist/core/tools/edit.d.ts +51 -0
  326. package/dist/core/tools/edit.d.ts.map +1 -0
  327. package/dist/core/tools/edit.js +218 -0
  328. package/dist/core/tools/edit.js.map +1 -0
  329. package/dist/core/tools/file-mutation-queue.d.ts +6 -0
  330. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
  331. package/dist/core/tools/file-mutation-queue.js +37 -0
  332. package/dist/core/tools/file-mutation-queue.js.map +1 -0
  333. package/dist/core/tools/find.d.ts +46 -0
  334. package/dist/core/tools/find.d.ts.map +1 -0
  335. package/dist/core/tools/find.js +241 -0
  336. package/dist/core/tools/find.js.map +1 -0
  337. package/dist/core/tools/grep.d.ts +56 -0
  338. package/dist/core/tools/grep.d.ts.map +1 -0
  339. package/dist/core/tools/grep.js +293 -0
  340. package/dist/core/tools/grep.js.map +1 -0
  341. package/dist/core/tools/index.d.ts +176 -0
  342. package/dist/core/tools/index.d.ts.map +1 -0
  343. package/dist/core/tools/index.js +137 -0
  344. package/dist/core/tools/index.js.map +1 -0
  345. package/dist/core/tools/ls.d.ts +46 -0
  346. package/dist/core/tools/ls.d.ts.map +1 -0
  347. package/dist/core/tools/ls.js +172 -0
  348. package/dist/core/tools/ls.js.map +1 -0
  349. package/dist/core/tools/path-utils.d.ts +8 -0
  350. package/dist/core/tools/path-utils.d.ts.map +1 -0
  351. package/dist/core/tools/path-utils.js +81 -0
  352. package/dist/core/tools/path-utils.js.map +1 -0
  353. package/dist/core/tools/read.d.ts +46 -0
  354. package/dist/core/tools/read.d.ts.map +1 -0
  355. package/dist/core/tools/read.js +225 -0
  356. package/dist/core/tools/read.js.map +1 -0
  357. package/dist/core/tools/render-utils.d.ts +21 -0
  358. package/dist/core/tools/render-utils.d.ts.map +1 -0
  359. package/dist/core/tools/render-utils.js +49 -0
  360. package/dist/core/tools/render-utils.js.map +1 -0
  361. package/dist/core/tools/search.d.ts +29 -0
  362. package/dist/core/tools/search.d.ts.map +1 -0
  363. package/dist/core/tools/search.js +187 -0
  364. package/dist/core/tools/search.js.map +1 -0
  365. package/dist/core/tools/skill.d.ts +26 -0
  366. package/dist/core/tools/skill.d.ts.map +1 -0
  367. package/dist/core/tools/skill.js +127 -0
  368. package/dist/core/tools/skill.js.map +1 -0
  369. package/dist/core/tools/subagent.d.ts +147 -0
  370. package/dist/core/tools/subagent.d.ts.map +1 -0
  371. package/dist/core/tools/subagent.js +950 -0
  372. package/dist/core/tools/subagent.js.map +1 -0
  373. package/dist/core/tools/tasks.d.ts +32 -0
  374. package/dist/core/tools/tasks.d.ts.map +1 -0
  375. package/dist/core/tools/tasks.js +110 -0
  376. package/dist/core/tools/tasks.js.map +1 -0
  377. package/dist/core/tools/tmp-read.d.ts +11 -0
  378. package/dist/core/tools/tmp-read.d.ts.map +1 -0
  379. package/dist/core/tools/tmp-read.js +63 -0
  380. package/dist/core/tools/tmp-read.js.map +1 -0
  381. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  382. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  383. package/dist/core/tools/tool-definition-wrapper.js +30 -0
  384. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  385. package/dist/core/tools/truncate.d.ts +70 -0
  386. package/dist/core/tools/truncate.d.ts.map +1 -0
  387. package/dist/core/tools/truncate.js +205 -0
  388. package/dist/core/tools/truncate.js.map +1 -0
  389. package/dist/core/tools/web.d.ts +42 -0
  390. package/dist/core/tools/web.d.ts.map +1 -0
  391. package/dist/core/tools/web.js +518 -0
  392. package/dist/core/tools/web.js.map +1 -0
  393. package/dist/core/tools/write.d.ts +35 -0
  394. package/dist/core/tools/write.d.ts.map +1 -0
  395. package/dist/core/tools/write.js +216 -0
  396. package/dist/core/tools/write.js.map +1 -0
  397. package/dist/index.d.ts +28 -0
  398. package/dist/index.d.ts.map +1 -0
  399. package/dist/index.js +43 -0
  400. package/dist/index.js.map +1 -0
  401. package/dist/main.d.ts +8 -0
  402. package/dist/main.d.ts.map +1 -0
  403. package/dist/main.js +789 -0
  404. package/dist/main.js.map +1 -0
  405. package/dist/migrations.d.ts +33 -0
  406. package/dist/migrations.d.ts.map +1 -0
  407. package/dist/migrations.js +261 -0
  408. package/dist/migrations.js.map +1 -0
  409. package/dist/modes/index.d.ts +9 -0
  410. package/dist/modes/index.d.ts.map +1 -0
  411. package/dist/modes/index.js +8 -0
  412. package/dist/modes/index.js.map +1 -0
  413. package/dist/modes/interactive/components/armin.d.ts +34 -0
  414. package/dist/modes/interactive/components/armin.d.ts.map +1 -0
  415. package/dist/modes/interactive/components/armin.js +333 -0
  416. package/dist/modes/interactive/components/armin.js.map +1 -0
  417. package/dist/modes/interactive/components/assistant-message.d.ts +16 -0
  418. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  419. package/dist/modes/interactive/components/assistant-message.js +96 -0
  420. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  421. package/dist/modes/interactive/components/bash-execution.d.ts +34 -0
  422. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  423. package/dist/modes/interactive/components/bash-execution.js +175 -0
  424. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  425. package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  426. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  427. package/dist/modes/interactive/components/bordered-loader.js +51 -0
  428. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  429. package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  430. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  431. package/dist/modes/interactive/components/branch-summary-message.js +44 -0
  432. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  433. package/dist/modes/interactive/components/buddy-component.d.ts +58 -0
  434. package/dist/modes/interactive/components/buddy-component.d.ts.map +1 -0
  435. package/dist/modes/interactive/components/buddy-component.js +351 -0
  436. package/dist/modes/interactive/components/buddy-component.js.map +1 -0
  437. package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  438. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  439. package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
  440. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  441. package/dist/modes/interactive/components/config-selector.d.ts +71 -0
  442. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  443. package/dist/modes/interactive/components/config-selector.js +479 -0
  444. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  445. package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  446. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  447. package/dist/modes/interactive/components/countdown-timer.js +33 -0
  448. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  449. package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
  450. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  451. package/dist/modes/interactive/components/custom-editor.js +70 -0
  452. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  453. package/dist/modes/interactive/components/custom-message.d.ts +20 -0
  454. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  455. package/dist/modes/interactive/components/custom-message.js +79 -0
  456. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  457. package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
  458. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
  459. package/dist/modes/interactive/components/daxnuts.js +140 -0
  460. package/dist/modes/interactive/components/daxnuts.js.map +1 -0
  461. package/dist/modes/interactive/components/diff.d.ts +12 -0
  462. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  463. package/dist/modes/interactive/components/diff.js +133 -0
  464. package/dist/modes/interactive/components/diff.js.map +1 -0
  465. package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  466. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  467. package/dist/modes/interactive/components/dynamic-border.js +21 -0
  468. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  469. package/dist/modes/interactive/components/extension-editor.d.ts +20 -0
  470. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  471. package/dist/modes/interactive/components/extension-editor.js +111 -0
  472. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  473. package/dist/modes/interactive/components/extension-input.d.ts +23 -0
  474. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  475. package/dist/modes/interactive/components/extension-input.js +61 -0
  476. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  477. package/dist/modes/interactive/components/extension-selector.d.ts +24 -0
  478. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  479. package/dist/modes/interactive/components/extension-selector.js +78 -0
  480. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  481. package/dist/modes/interactive/components/footer.d.ts +26 -0
  482. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  483. package/dist/modes/interactive/components/footer.js +198 -0
  484. package/dist/modes/interactive/components/footer.js.map +1 -0
  485. package/dist/modes/interactive/components/index.d.ts +33 -0
  486. package/dist/modes/interactive/components/index.d.ts.map +1 -0
  487. package/dist/modes/interactive/components/index.js +34 -0
  488. package/dist/modes/interactive/components/index.js.map +1 -0
  489. package/dist/modes/interactive/components/keybinding-hints.d.ts +8 -0
  490. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
  491. package/dist/modes/interactive/components/keybinding-hints.js +22 -0
  492. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
  493. package/dist/modes/interactive/components/login-dialog.d.ts +42 -0
  494. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
  495. package/dist/modes/interactive/components/login-dialog.js +145 -0
  496. package/dist/modes/interactive/components/login-dialog.js.map +1 -0
  497. package/dist/modes/interactive/components/model-selector.d.ts +47 -0
  498. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  499. package/dist/modes/interactive/components/model-selector.js +275 -0
  500. package/dist/modes/interactive/components/model-selector.js.map +1 -0
  501. package/dist/modes/interactive/components/oauth-selector.d.ts +19 -0
  502. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
  503. package/dist/modes/interactive/components/oauth-selector.js +97 -0
  504. package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
  505. package/dist/modes/interactive/components/scoped-models-selector.d.ts +49 -0
  506. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  507. package/dist/modes/interactive/components/scoped-models-selector.js +275 -0
  508. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  509. package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  510. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
  511. package/dist/modes/interactive/components/session-selector-search.js +155 -0
  512. package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
  513. package/dist/modes/interactive/components/session-selector.d.ts +95 -0
  514. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  515. package/dist/modes/interactive/components/session-selector.js +848 -0
  516. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  517. package/dist/modes/interactive/components/settings-selector.d.ts +58 -0
  518. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  519. package/dist/modes/interactive/components/settings-selector.js +301 -0
  520. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  521. package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  522. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  523. package/dist/modes/interactive/components/show-images-selector.js +39 -0
  524. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  525. package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  526. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  527. package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
  528. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  529. package/dist/modes/interactive/components/tasks-panel.d.ts +20 -0
  530. package/dist/modes/interactive/components/tasks-panel.d.ts.map +1 -0
  531. package/dist/modes/interactive/components/tasks-panel.js +66 -0
  532. package/dist/modes/interactive/components/tasks-panel.js.map +1 -0
  533. package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  534. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  535. package/dist/modes/interactive/components/theme-selector.js +50 -0
  536. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  537. package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  538. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  539. package/dist/modes/interactive/components/thinking-selector.js +51 -0
  540. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  541. package/dist/modes/interactive/components/tool-execution.d.ts +59 -0
  542. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  543. package/dist/modes/interactive/components/tool-execution.js +279 -0
  544. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  545. package/dist/modes/interactive/components/tree-selector.d.ts +87 -0
  546. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  547. package/dist/modes/interactive/components/tree-selector.js +1051 -0
  548. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  549. package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  550. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  551. package/dist/modes/interactive/components/user-message-selector.js +113 -0
  552. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  553. package/dist/modes/interactive/components/user-message.d.ts +9 -0
  554. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  555. package/dist/modes/interactive/components/user-message.js +28 -0
  556. package/dist/modes/interactive/components/user-message.js.map +1 -0
  557. package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  558. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  559. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  560. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  561. package/dist/modes/interactive/interactive-mode.d.ts +338 -0
  562. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  563. package/dist/modes/interactive/interactive-mode.js +4167 -0
  564. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  565. package/dist/modes/interactive/theme/dark.json +85 -0
  566. package/dist/modes/interactive/theme/light.json +84 -0
  567. package/dist/modes/interactive/theme/theme-schema.json +335 -0
  568. package/dist/modes/interactive/theme/theme.d.ts +81 -0
  569. package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  570. package/dist/modes/interactive/theme/theme.js +975 -0
  571. package/dist/modes/interactive/theme/theme.js.map +1 -0
  572. package/dist/modes/print-mode.d.ts +28 -0
  573. package/dist/modes/print-mode.d.ts.map +1 -0
  574. package/dist/modes/print-mode.js +107 -0
  575. package/dist/modes/print-mode.js.map +1 -0
  576. package/dist/modes/rpc/index.d.ts +10 -0
  577. package/dist/modes/rpc/index.d.ts.map +1 -0
  578. package/dist/modes/rpc/index.js +8 -0
  579. package/dist/modes/rpc/index.js.map +1 -0
  580. package/dist/modes/rpc/jsonl.d.ts +17 -0
  581. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  582. package/dist/modes/rpc/jsonl.js +49 -0
  583. package/dist/modes/rpc/jsonl.js.map +1 -0
  584. package/dist/modes/rpc/rpc-client.d.ts +237 -0
  585. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  586. package/dist/modes/rpc/rpc-client.js +448 -0
  587. package/dist/modes/rpc/rpc-client.js.map +1 -0
  588. package/dist/modes/rpc/rpc-mode.d.ts +20 -0
  589. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  590. package/dist/modes/rpc/rpc-mode.js +592 -0
  591. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  592. package/dist/modes/rpc/rpc-types.d.ts +471 -0
  593. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  594. package/dist/modes/rpc/rpc-types.js +8 -0
  595. package/dist/modes/rpc/rpc-types.js.map +1 -0
  596. package/dist/utils/changelog.d.ts +21 -0
  597. package/dist/utils/changelog.d.ts.map +1 -0
  598. package/dist/utils/changelog.js +87 -0
  599. package/dist/utils/changelog.js.map +1 -0
  600. package/dist/utils/child-process.d.ts +11 -0
  601. package/dist/utils/child-process.d.ts.map +1 -0
  602. package/dist/utils/child-process.js +78 -0
  603. package/dist/utils/child-process.js.map +1 -0
  604. package/dist/utils/clipboard-image.d.ts +11 -0
  605. package/dist/utils/clipboard-image.d.ts.map +1 -0
  606. package/dist/utils/clipboard-image.js +245 -0
  607. package/dist/utils/clipboard-image.js.map +1 -0
  608. package/dist/utils/clipboard-native.d.ts +8 -0
  609. package/dist/utils/clipboard-native.d.ts.map +1 -0
  610. package/dist/utils/clipboard-native.js +14 -0
  611. package/dist/utils/clipboard-native.js.map +1 -0
  612. package/dist/utils/clipboard.d.ts +2 -0
  613. package/dist/utils/clipboard.d.ts.map +1 -0
  614. package/dist/utils/clipboard.js +78 -0
  615. package/dist/utils/clipboard.js.map +1 -0
  616. package/dist/utils/exif-orientation.d.ts +5 -0
  617. package/dist/utils/exif-orientation.d.ts.map +1 -0
  618. package/dist/utils/exif-orientation.js +158 -0
  619. package/dist/utils/exif-orientation.js.map +1 -0
  620. package/dist/utils/frontmatter.d.ts +8 -0
  621. package/dist/utils/frontmatter.d.ts.map +1 -0
  622. package/dist/utils/frontmatter.js +26 -0
  623. package/dist/utils/frontmatter.js.map +1 -0
  624. package/dist/utils/git.d.ts +26 -0
  625. package/dist/utils/git.d.ts.map +1 -0
  626. package/dist/utils/git.js +163 -0
  627. package/dist/utils/git.js.map +1 -0
  628. package/dist/utils/image-convert.d.ts +9 -0
  629. package/dist/utils/image-convert.d.ts.map +1 -0
  630. package/dist/utils/image-convert.js +39 -0
  631. package/dist/utils/image-convert.js.map +1 -0
  632. package/dist/utils/image-resize.d.ts +36 -0
  633. package/dist/utils/image-resize.d.ts.map +1 -0
  634. package/dist/utils/image-resize.js +137 -0
  635. package/dist/utils/image-resize.js.map +1 -0
  636. package/dist/utils/mime.d.ts +2 -0
  637. package/dist/utils/mime.d.ts.map +1 -0
  638. package/dist/utils/mime.js +26 -0
  639. package/dist/utils/mime.js.map +1 -0
  640. package/dist/utils/photon.d.ts +21 -0
  641. package/dist/utils/photon.d.ts.map +1 -0
  642. package/dist/utils/photon.js +121 -0
  643. package/dist/utils/photon.js.map +1 -0
  644. package/dist/utils/shell.d.ts +26 -0
  645. package/dist/utils/shell.d.ts.map +1 -0
  646. package/dist/utils/shell.js +186 -0
  647. package/dist/utils/shell.js.map +1 -0
  648. package/dist/utils/sleep.d.ts +5 -0
  649. package/dist/utils/sleep.d.ts.map +1 -0
  650. package/dist/utils/sleep.js +17 -0
  651. package/dist/utils/sleep.js.map +1 -0
  652. package/dist/utils/tools-manager.d.ts +3 -0
  653. package/dist/utils/tools-manager.d.ts.map +1 -0
  654. package/dist/utils/tools-manager.js +252 -0
  655. package/dist/utils/tools-manager.js.map +1 -0
  656. package/dist/utils/xml.d.ts +2 -0
  657. package/dist/utils/xml.d.ts.map +1 -0
  658. package/dist/utils/xml.js +9 -0
  659. package/dist/utils/xml.js.map +1 -0
  660. package/docs/buddy.md +111 -0
  661. package/docs/compaction.md +392 -0
  662. package/docs/custom-provider.md +599 -0
  663. package/docs/development.md +108 -0
  664. package/docs/extensions.md +2130 -0
  665. package/docs/images/doom-extension.png +0 -0
  666. package/docs/images/interactive-mode.png +0 -0
  667. package/docs/images/tree-view.png +0 -0
  668. package/docs/json.md +112 -0
  669. package/docs/keybindings.md +174 -0
  670. package/docs/mach6.md +150 -0
  671. package/docs/models.md +335 -0
  672. package/docs/packages.md +197 -0
  673. package/docs/prompt-templates.md +67 -0
  674. package/docs/providers.md +194 -0
  675. package/docs/rpc.md +1426 -0
  676. package/docs/sdk.md +969 -0
  677. package/docs/session.md +412 -0
  678. package/docs/settings.md +247 -0
  679. package/docs/shell-aliases.md +55 -0
  680. package/docs/skills.md +296 -0
  681. package/docs/terminal-setup.md +104 -0
  682. package/docs/termux.md +127 -0
  683. package/docs/themes.md +295 -0
  684. package/docs/tmux.md +61 -0
  685. package/docs/tree.md +228 -0
  686. package/docs/tui.md +887 -0
  687. package/docs/windows.md +61 -0
  688. package/examples/README.md +25 -0
  689. package/examples/extensions/README.md +205 -0
  690. package/examples/extensions/antigravity-image-gen.ts +418 -0
  691. package/examples/extensions/auto-commit-on-exit.ts +49 -0
  692. package/examples/extensions/bash-spawn-hook.ts +30 -0
  693. package/examples/extensions/bookmark.ts +50 -0
  694. package/examples/extensions/built-in-tool-renderer.ts +246 -0
  695. package/examples/extensions/claude-rules.ts +86 -0
  696. package/examples/extensions/commands.ts +72 -0
  697. package/examples/extensions/confirm-destructive.ts +59 -0
  698. package/examples/extensions/custom-compaction.ts +114 -0
  699. package/examples/extensions/custom-footer.ts +64 -0
  700. package/examples/extensions/custom-header.ts +73 -0
  701. package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
  702. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  703. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  704. package/examples/extensions/custom-provider-gitlab-duo/index.ts +349 -0
  705. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  706. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  707. package/examples/extensions/custom-provider-qwen-cli/index.ts +345 -0
  708. package/examples/extensions/custom-provider-qwen-cli/package.json +16 -0
  709. package/examples/extensions/dirty-repo-guard.ts +56 -0
  710. package/examples/extensions/doom-overlay/README.md +46 -0
  711. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  712. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  713. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  714. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +73 -0
  715. package/examples/extensions/doom-overlay/doom-component.ts +132 -0
  716. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  717. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  718. package/examples/extensions/doom-overlay/index.ts +74 -0
  719. package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  720. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  721. package/examples/extensions/dynamic-resources/dynamic.json +79 -0
  722. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  723. package/examples/extensions/dynamic-resources/index.ts +15 -0
  724. package/examples/extensions/dynamic-tools.ts +74 -0
  725. package/examples/extensions/event-bus.ts +43 -0
  726. package/examples/extensions/file-trigger.ts +41 -0
  727. package/examples/extensions/git-checkpoint.ts +53 -0
  728. package/examples/extensions/handoff.ts +150 -0
  729. package/examples/extensions/hello.ts +25 -0
  730. package/examples/extensions/inline-bash.ts +94 -0
  731. package/examples/extensions/input-transform.ts +43 -0
  732. package/examples/extensions/interactive-shell.ts +196 -0
  733. package/examples/extensions/mac-system-theme.ts +47 -0
  734. package/examples/extensions/message-renderer.ts +59 -0
  735. package/examples/extensions/minimal-mode.ts +426 -0
  736. package/examples/extensions/modal-editor.ts +85 -0
  737. package/examples/extensions/model-status.ts +31 -0
  738. package/examples/extensions/notify.ts +55 -0
  739. package/examples/extensions/overlay-qa-tests.ts +1348 -0
  740. package/examples/extensions/overlay-test.ts +150 -0
  741. package/examples/extensions/permission-gate.ts +34 -0
  742. package/examples/extensions/pirate.ts +47 -0
  743. package/examples/extensions/plan-mode/README.md +65 -0
  744. package/examples/extensions/plan-mode/index.ts +340 -0
  745. package/examples/extensions/plan-mode/utils.ts +168 -0
  746. package/examples/extensions/preset.ts +403 -0
  747. package/examples/extensions/protected-paths.ts +30 -0
  748. package/examples/extensions/provider-payload.ts +14 -0
  749. package/examples/extensions/qna.ts +119 -0
  750. package/examples/extensions/question.ts +264 -0
  751. package/examples/extensions/questionnaire.ts +427 -0
  752. package/examples/extensions/rainbow-editor.ts +88 -0
  753. package/examples/extensions/reload-runtime.ts +37 -0
  754. package/examples/extensions/rpc-demo.ts +124 -0
  755. package/examples/extensions/sandbox/index.ts +317 -0
  756. package/examples/extensions/sandbox/package-lock.json +92 -0
  757. package/examples/extensions/sandbox/package.json +19 -0
  758. package/examples/extensions/send-user-message.ts +97 -0
  759. package/examples/extensions/session-name.ts +27 -0
  760. package/examples/extensions/shutdown-command.ts +63 -0
  761. package/examples/extensions/snake.ts +343 -0
  762. package/examples/extensions/space-invaders.ts +560 -0
  763. package/examples/extensions/ssh.ts +220 -0
  764. package/examples/extensions/status-line.ts +40 -0
  765. package/examples/extensions/subagent/README.md +172 -0
  766. package/examples/extensions/subagent/agents/planner.md +37 -0
  767. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  768. package/examples/extensions/subagent/agents/scout.md +50 -0
  769. package/examples/extensions/subagent/agents/worker.md +24 -0
  770. package/examples/extensions/subagent/agents.ts +126 -0
  771. package/examples/extensions/subagent/index.ts +986 -0
  772. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  773. package/examples/extensions/subagent/prompts/implement.md +10 -0
  774. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  775. package/examples/extensions/summarize.ts +195 -0
  776. package/examples/extensions/system-prompt-header.ts +17 -0
  777. package/examples/extensions/timed-confirm.ts +70 -0
  778. package/examples/extensions/titlebar-spinner.ts +58 -0
  779. package/examples/extensions/todo.ts +299 -0
  780. package/examples/extensions/tool-override.ts +144 -0
  781. package/examples/extensions/tools.ts +146 -0
  782. package/examples/extensions/trigger-compact.ts +40 -0
  783. package/examples/extensions/truncated-tool.ts +195 -0
  784. package/examples/extensions/widget-placement.ts +17 -0
  785. package/examples/extensions/with-deps/index.ts +32 -0
  786. package/examples/extensions/with-deps/package-lock.json +31 -0
  787. package/examples/extensions/with-deps/package.json +22 -0
  788. package/examples/rpc-extension-ui.ts +632 -0
  789. package/examples/sdk/01-minimal.ts +22 -0
  790. package/examples/sdk/02-custom-model.ts +49 -0
  791. package/examples/sdk/03-custom-prompt.ts +55 -0
  792. package/examples/sdk/04-skills.ts +53 -0
  793. package/examples/sdk/05-tools.ts +56 -0
  794. package/examples/sdk/06-extensions.ts +88 -0
  795. package/examples/sdk/07-context-files.ts +40 -0
  796. package/examples/sdk/08-prompt-templates.ts +48 -0
  797. package/examples/sdk/09-api-keys-and-oauth.ts +48 -0
  798. package/examples/sdk/10-settings.ts +51 -0
  799. package/examples/sdk/11-sessions.ts +48 -0
  800. package/examples/sdk/12-full-control.ts +87 -0
  801. package/examples/sdk/README.md +144 -0
  802. package/package.json +123 -0
  803. package/skills/mach6-implement/SKILL.md +170 -0
  804. package/skills/mach6-issue/SKILL.md +129 -0
  805. package/skills/mach6-plan/SKILL.md +123 -0
  806. package/skills/mach6-publish/SKILL.md +188 -0
  807. package/skills/mach6-push/SKILL.md +101 -0
  808. package/skills/mach6-review/SKILL.md +192 -0
  809. package/skills/telegram-send/SKILL.md +46 -0
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Import graph proximity metric.
3
+ *
4
+ * Files that import or are imported by high-scoring files get a boost.
5
+ * Uses a simple 1-hop propagation from seed scores.
6
+ */
7
+ /** Fraction of seed score propagated to neighbors. */
8
+ const PROPAGATION_FACTOR = 0.5;
9
+ /** Fraction of propagated score given back to seed files with many connections. */
10
+ const SELF_BOOST_FACTOR = 0.25;
11
+ /**
12
+ * Compute import graph proximity scores.
13
+ * Files that import/are imported by high-scoring files get a boost.
14
+ * Seed files also get a connectivity bonus based on how many of their
15
+ * neighbors are in the seed set.
16
+ */
17
+ export function computeImportGraphScores(db, seedScores, fileIdToChunkIds) {
18
+ const scores = new Map();
19
+ try {
20
+ if (seedScores.size === 0)
21
+ return scores;
22
+ // Build fileId → filePath lookup and extension-stripped path index
23
+ const allFiles = db.getAllFiles();
24
+ const fileIdToPath = new Map();
25
+ const pathToFileId = new Map();
26
+ const strippedToFileId = new Map();
27
+ for (const f of allFiles) {
28
+ fileIdToPath.set(f.id, f.filePath);
29
+ pathToFileId.set(f.filePath, f.id);
30
+ // Also index without extension so import paths (which strip .js/.ts)
31
+ // can match stored file paths (which keep the extension)
32
+ const stripped = stripExtension(f.filePath);
33
+ if (!strippedToFileId.has(stripped)) {
34
+ strippedToFileId.set(stripped, f.id);
35
+ }
36
+ }
37
+ /** Resolve an import target path to a fileId. Tries exact match first, then extension-stripped. */
38
+ function resolveTarget(targetPath) {
39
+ return pathToFileId.get(targetPath) ?? strippedToFileId.get(targetPath);
40
+ }
41
+ // Propagate scores to neighbors
42
+ const propagated = new Map(); // fileId → accumulated propagated score
43
+ for (const [fileId, seedScore] of seedScores) {
44
+ const propagatedScore = seedScore * PROPAGATION_FACTOR;
45
+ if (propagatedScore <= 0)
46
+ continue;
47
+ let connectedSeedCount = 0;
48
+ // Files this file imports
49
+ const importedPaths = db.getImportsFrom(fileId);
50
+ for (const targetPath of importedPaths) {
51
+ const targetFileId = resolveTarget(targetPath);
52
+ if (targetFileId === undefined)
53
+ continue;
54
+ if (seedScores.has(targetFileId)) {
55
+ connectedSeedCount++;
56
+ }
57
+ else {
58
+ propagated.set(targetFileId, (propagated.get(targetFileId) ?? 0) + propagatedScore);
59
+ }
60
+ }
61
+ // Files that import this file
62
+ const filePath = fileIdToPath.get(fileId);
63
+ if (filePath) {
64
+ const importerIds = db.getImportersOf(filePath);
65
+ // Also check extension-stripped variant
66
+ const stripped = stripExtension(filePath);
67
+ const strippedImporterIds = stripped !== filePath ? db.getImportersOf(stripped) : [];
68
+ const allImporterIds = new Set([...importerIds, ...strippedImporterIds]);
69
+ for (const importerFileId of allImporterIds) {
70
+ if (seedScores.has(importerFileId)) {
71
+ connectedSeedCount++;
72
+ }
73
+ else {
74
+ propagated.set(importerFileId, (propagated.get(importerFileId) ?? 0) + propagatedScore);
75
+ }
76
+ }
77
+ }
78
+ // Self-boost: seed files with many connections to other seeds get a bonus
79
+ if (connectedSeedCount > 0) {
80
+ const selfBoost = seedScore * SELF_BOOST_FACTOR * Math.min(connectedSeedCount / 3, 1);
81
+ propagated.set(fileId, (propagated.get(fileId) ?? 0) + selfBoost);
82
+ }
83
+ }
84
+ if (propagated.size === 0)
85
+ return scores;
86
+ // Find max for normalization
87
+ let maxScore = 0;
88
+ for (const score of propagated.values()) {
89
+ if (score > maxScore)
90
+ maxScore = score;
91
+ }
92
+ if (maxScore <= 0)
93
+ return scores;
94
+ // Distribute to chunks and normalize
95
+ for (const [fileId, fileScore] of propagated) {
96
+ const chunkIds = fileIdToChunkIds.get(fileId);
97
+ if (!chunkIds || chunkIds.length === 0)
98
+ continue;
99
+ // Distribute equally among chunks in this file
100
+ const perChunkScore = fileScore / maxScore / chunkIds.length;
101
+ for (const chunkId of chunkIds) {
102
+ scores.set(chunkId, perChunkScore);
103
+ }
104
+ }
105
+ }
106
+ catch {
107
+ // If anything fails, return empty map
108
+ }
109
+ return scores;
110
+ }
111
+ /** Strip common source file extensions for path matching. */
112
+ function stripExtension(filePath) {
113
+ return filePath.replace(/\.[jt]sx?$|\.py$|\.go$|\.rs$|\.java$|\.c$|\.h$|\.cpp$|\.hpp$|\.cc$|\.cxx$/, "");
114
+ }
115
+ //# sourceMappingURL=import-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-graph.js","sourceRoot":"","sources":["../../../../src/core/search/metrics/import-graph.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,sDAAsD;AACtD,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAE/B,mFAAmF;AACnF,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAE/B;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CACvC,EAAkB,EAClB,UAA+B,EAC/B,gBAAuC,EACjB;IACtB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEzC,IAAI,CAAC;QACJ,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC;QAEzC,qEAAmE;QACnE,MAAM,QAAQ,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;QAClC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC/C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC/C,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAkB,CAAC;QAEnD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YAC1B,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;YACnC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACnC,qEAAqE;YACrE,yDAAyD;YACzD,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC5C,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACrC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACtC,CAAC;QACF,CAAC;QAED,mGAAmG;QACnG,SAAS,aAAa,CAAC,UAAkB,EAAsB;YAC9D,OAAO,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAAA,CACxE;QAED,gCAAgC;QAChC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,0CAAwC;QAEtF,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,UAAU,EAAE,CAAC;YAC9C,MAAM,eAAe,GAAG,SAAS,GAAG,kBAAkB,CAAC;YACvD,IAAI,eAAe,IAAI,CAAC;gBAAE,SAAS;YAEnC,IAAI,kBAAkB,GAAG,CAAC,CAAC;YAE3B,0BAA0B;YAC1B,MAAM,aAAa,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAChD,KAAK,MAAM,UAAU,IAAI,aAAa,EAAE,CAAC;gBACxC,MAAM,YAAY,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;gBAC/C,IAAI,YAAY,KAAK,SAAS;oBAAE,SAAS;gBAEzC,IAAI,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;oBAClC,kBAAkB,EAAE,CAAC;gBACtB,CAAC;qBAAM,CAAC;oBACP,UAAU,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC;gBACrF,CAAC;YACF,CAAC;YAED,8BAA8B;YAC9B,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,QAAQ,EAAE,CAAC;gBACd,MAAM,WAAW,GAAG,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;gBAChD,wCAAwC;gBACxC,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;gBAC1C,MAAM,mBAAmB,GAAG,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrF,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,WAAW,EAAE,GAAG,mBAAmB,CAAC,CAAC,CAAC;gBAEzE,KAAK,MAAM,cAAc,IAAI,cAAc,EAAE,CAAC;oBAC7C,IAAI,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;wBACpC,kBAAkB,EAAE,CAAC;oBACtB,CAAC;yBAAM,CAAC;wBACP,UAAU,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC;oBACzF,CAAC;gBACF,CAAC;YACF,CAAC;YAED,0EAA0E;YAC1E,IAAI,kBAAkB,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,SAAS,GAAG,SAAS,GAAG,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,kBAAkB,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBACtF,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;YACnE,CAAC;QACF,CAAC;QAED,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC;QAEzC,6BAA6B;QAC7B,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,IAAI,KAAK,GAAG,QAAQ;gBAAE,QAAQ,GAAG,KAAK,CAAC;QACxC,CAAC;QAED,IAAI,QAAQ,IAAI,CAAC;YAAE,OAAO,MAAM,CAAC;QAEjC,qCAAqC;QACrC,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,UAAU,EAAE,CAAC;YAC9C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC9C,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAEjD,+CAA+C;YAC/C,MAAM,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC7D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAChC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YACpC,CAAC;QACF,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,sCAAsC;IACvC,CAAC;IAED,OAAO,MAAM,CAAC;AAAA,CACd;AAED,6DAA6D;AAC7D,SAAS,cAAc,CAAC,QAAgB,EAAU;IACjD,OAAO,QAAQ,CAAC,OAAO,CAAC,2EAA2E,EAAE,EAAE,CAAC,CAAC;AAAA,CACzG","sourcesContent":["/**\n * Import graph proximity metric.\n *\n * Files that import or are imported by high-scoring files get a boost.\n * Uses a simple 1-hop propagation from seed scores.\n */\n\nimport type { SearchDatabase } from \"../db.js\";\n\n/** Fraction of seed score propagated to neighbors. */\nconst PROPAGATION_FACTOR = 0.5;\n\n/** Fraction of propagated score given back to seed files with many connections. */\nconst SELF_BOOST_FACTOR = 0.25;\n\n/**\n * Compute import graph proximity scores.\n * Files that import/are imported by high-scoring files get a boost.\n * Seed files also get a connectivity bonus based on how many of their\n * neighbors are in the seed set.\n */\nexport function computeImportGraphScores(\n\tdb: SearchDatabase,\n\tseedScores: Map<number, number>,\n\tfileIdToChunkIds: Map<number, number[]>,\n): Map<number, number> {\n\tconst scores = new Map<number, number>();\n\n\ttry {\n\t\tif (seedScores.size === 0) return scores;\n\n\t\t// Build fileId → filePath lookup and extension-stripped path index\n\t\tconst allFiles = db.getAllFiles();\n\t\tconst fileIdToPath = new Map<number, string>();\n\t\tconst pathToFileId = new Map<string, number>();\n\t\tconst strippedToFileId = new Map<string, number>();\n\n\t\tfor (const f of allFiles) {\n\t\t\tfileIdToPath.set(f.id, f.filePath);\n\t\t\tpathToFileId.set(f.filePath, f.id);\n\t\t\t// Also index without extension so import paths (which strip .js/.ts)\n\t\t\t// can match stored file paths (which keep the extension)\n\t\t\tconst stripped = stripExtension(f.filePath);\n\t\t\tif (!strippedToFileId.has(stripped)) {\n\t\t\t\tstrippedToFileId.set(stripped, f.id);\n\t\t\t}\n\t\t}\n\n\t\t/** Resolve an import target path to a fileId. Tries exact match first, then extension-stripped. */\n\t\tfunction resolveTarget(targetPath: string): number | undefined {\n\t\t\treturn pathToFileId.get(targetPath) ?? strippedToFileId.get(targetPath);\n\t\t}\n\n\t\t// Propagate scores to neighbors\n\t\tconst propagated = new Map<number, number>(); // fileId → accumulated propagated score\n\n\t\tfor (const [fileId, seedScore] of seedScores) {\n\t\t\tconst propagatedScore = seedScore * PROPAGATION_FACTOR;\n\t\t\tif (propagatedScore <= 0) continue;\n\n\t\t\tlet connectedSeedCount = 0;\n\n\t\t\t// Files this file imports\n\t\t\tconst importedPaths = db.getImportsFrom(fileId);\n\t\t\tfor (const targetPath of importedPaths) {\n\t\t\t\tconst targetFileId = resolveTarget(targetPath);\n\t\t\t\tif (targetFileId === undefined) continue;\n\n\t\t\t\tif (seedScores.has(targetFileId)) {\n\t\t\t\t\tconnectedSeedCount++;\n\t\t\t\t} else {\n\t\t\t\t\tpropagated.set(targetFileId, (propagated.get(targetFileId) ?? 0) + propagatedScore);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Files that import this file\n\t\t\tconst filePath = fileIdToPath.get(fileId);\n\t\t\tif (filePath) {\n\t\t\t\tconst importerIds = db.getImportersOf(filePath);\n\t\t\t\t// Also check extension-stripped variant\n\t\t\t\tconst stripped = stripExtension(filePath);\n\t\t\t\tconst strippedImporterIds = stripped !== filePath ? db.getImportersOf(stripped) : [];\n\t\t\t\tconst allImporterIds = new Set([...importerIds, ...strippedImporterIds]);\n\n\t\t\t\tfor (const importerFileId of allImporterIds) {\n\t\t\t\t\tif (seedScores.has(importerFileId)) {\n\t\t\t\t\t\tconnectedSeedCount++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpropagated.set(importerFileId, (propagated.get(importerFileId) ?? 0) + propagatedScore);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Self-boost: seed files with many connections to other seeds get a bonus\n\t\t\tif (connectedSeedCount > 0) {\n\t\t\t\tconst selfBoost = seedScore * SELF_BOOST_FACTOR * Math.min(connectedSeedCount / 3, 1);\n\t\t\t\tpropagated.set(fileId, (propagated.get(fileId) ?? 0) + selfBoost);\n\t\t\t}\n\t\t}\n\n\t\tif (propagated.size === 0) return scores;\n\n\t\t// Find max for normalization\n\t\tlet maxScore = 0;\n\t\tfor (const score of propagated.values()) {\n\t\t\tif (score > maxScore) maxScore = score;\n\t\t}\n\n\t\tif (maxScore <= 0) return scores;\n\n\t\t// Distribute to chunks and normalize\n\t\tfor (const [fileId, fileScore] of propagated) {\n\t\t\tconst chunkIds = fileIdToChunkIds.get(fileId);\n\t\t\tif (!chunkIds || chunkIds.length === 0) continue;\n\n\t\t\t// Distribute equally among chunks in this file\n\t\t\tconst perChunkScore = fileScore / maxScore / chunkIds.length;\n\t\t\tfor (const chunkId of chunkIds) {\n\t\t\t\tscores.set(chunkId, perChunkScore);\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// If anything fails, return empty map\n\t}\n\n\treturn scores;\n}\n\n/** Strip common source file extensions for path matching. */\nfunction stripExtension(filePath: string): string {\n\treturn filePath.replace(/\\.[jt]sx?$|\\.py$|\\.go$|\\.rs$|\\.java$|\\.c$|\\.h$|\\.cpp$|\\.hpp$|\\.cc$|\\.cxx$/, \"\");\n}\n"]}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Path/filename similarity metric.
3
+ *
4
+ * Tokenizes query and file paths, computes a recall-oriented overlap score
5
+ * (what fraction of query tokens appear in the path).
6
+ */
7
+ import type { StoredChunk } from "../types.js";
8
+ /**
9
+ * Compute path/filename similarity scores.
10
+ * Tokenizes query and file paths, returns Jaccard-like overlap score.
11
+ */
12
+ export declare function computePathMatchScores(query: string, chunks: StoredChunk[]): Map<number, number>;
13
+ //# sourceMappingURL=path-match.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-match.d.ts","sourceRoot":"","sources":["../../../../src/core/search/metrics/path-match.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA+ChG","sourcesContent":["/**\n * Path/filename similarity metric.\n *\n * Tokenizes query and file paths, computes a recall-oriented overlap score\n * (what fraction of query tokens appear in the path).\n */\n\nimport type { StoredChunk } from \"../types.js\";\nimport { tokenize } from \"./tokenize.js\";\n\n/**\n * Compute path/filename similarity scores.\n * Tokenizes query and file paths, returns Jaccard-like overlap score.\n */\nexport function computePathMatchScores(query: string, chunks: StoredChunk[]): Map<number, number> {\n\tconst scores = new Map<number, number>();\n\n\ttry {\n\t\tconst queryTokens = tokenize(query);\n\t\tif (queryTokens.length === 0) return scores;\n\n\t\tconst querySet = new Set(queryTokens);\n\n\t\t// Cache path tokens per file path (many chunks share the same file)\n\t\tconst pathTokenCache = new Map<string, Set<string>>();\n\n\t\tlet maxScore = 0;\n\n\t\tfor (const chunk of chunks) {\n\t\t\tlet pathTokenSet = pathTokenCache.get(chunk.filePath);\n\t\t\tif (!pathTokenSet) {\n\t\t\t\tpathTokenSet = new Set(tokenize(chunk.filePath));\n\t\t\t\tpathTokenCache.set(chunk.filePath, pathTokenSet);\n\t\t\t}\n\n\t\t\t// Score = |intersection| / |query tokens| (recall-oriented)\n\t\t\tlet intersection = 0;\n\t\t\tfor (const qt of querySet) {\n\t\t\t\tif (pathTokenSet.has(qt)) {\n\t\t\t\t\tintersection++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst score = intersection / queryTokens.length;\n\t\t\tif (score > 0) {\n\t\t\t\tscores.set(chunk.id, score);\n\t\t\t\tif (score > maxScore) maxScore = score;\n\t\t\t}\n\t\t}\n\n\t\t// Normalize to 0-1 (divide by max if not already bounded)\n\t\tif (maxScore > 0 && maxScore !== 1) {\n\t\t\tfor (const [id, score] of scores) {\n\t\t\t\tscores.set(id, score / maxScore);\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// If anything fails, return empty map\n\t}\n\n\treturn scores;\n}\n"]}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Path/filename similarity metric.
3
+ *
4
+ * Tokenizes query and file paths, computes a recall-oriented overlap score
5
+ * (what fraction of query tokens appear in the path).
6
+ */
7
+ import { tokenize } from "./tokenize.js";
8
+ /**
9
+ * Compute path/filename similarity scores.
10
+ * Tokenizes query and file paths, returns Jaccard-like overlap score.
11
+ */
12
+ export function computePathMatchScores(query, chunks) {
13
+ const scores = new Map();
14
+ try {
15
+ const queryTokens = tokenize(query);
16
+ if (queryTokens.length === 0)
17
+ return scores;
18
+ const querySet = new Set(queryTokens);
19
+ // Cache path tokens per file path (many chunks share the same file)
20
+ const pathTokenCache = new Map();
21
+ let maxScore = 0;
22
+ for (const chunk of chunks) {
23
+ let pathTokenSet = pathTokenCache.get(chunk.filePath);
24
+ if (!pathTokenSet) {
25
+ pathTokenSet = new Set(tokenize(chunk.filePath));
26
+ pathTokenCache.set(chunk.filePath, pathTokenSet);
27
+ }
28
+ // Score = |intersection| / |query tokens| (recall-oriented)
29
+ let intersection = 0;
30
+ for (const qt of querySet) {
31
+ if (pathTokenSet.has(qt)) {
32
+ intersection++;
33
+ }
34
+ }
35
+ const score = intersection / queryTokens.length;
36
+ if (score > 0) {
37
+ scores.set(chunk.id, score);
38
+ if (score > maxScore)
39
+ maxScore = score;
40
+ }
41
+ }
42
+ // Normalize to 0-1 (divide by max if not already bounded)
43
+ if (maxScore > 0 && maxScore !== 1) {
44
+ for (const [id, score] of scores) {
45
+ scores.set(id, score / maxScore);
46
+ }
47
+ }
48
+ }
49
+ catch {
50
+ // If anything fails, return empty map
51
+ }
52
+ return scores;
53
+ }
54
+ //# sourceMappingURL=path-match.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-match.js","sourceRoot":"","sources":["../../../../src/core/search/metrics/path-match.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAa,EAAE,MAAqB,EAAuB;IACjG,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEzC,IAAI,CAAC;QACJ,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC;QAE5C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;QAEtC,oEAAoE;QACpE,MAAM,cAAc,GAAG,IAAI,GAAG,EAAuB,CAAC;QAEtD,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC5B,IAAI,YAAY,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACtD,IAAI,CAAC,YAAY,EAAE,CAAC;gBACnB,YAAY,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACjD,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAClD,CAAC;YAED,4DAA4D;YAC5D,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC3B,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;oBAC1B,YAAY,EAAE,CAAC;gBAChB,CAAC;YACF,CAAC;YAED,MAAM,KAAK,GAAG,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC;YAChD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACf,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBAC5B,IAAI,KAAK,GAAG,QAAQ;oBAAE,QAAQ,GAAG,KAAK,CAAC;YACxC,CAAC;QACF,CAAC;QAED,0DAA0D;QAC1D,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACpC,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;gBAClC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,QAAQ,CAAC,CAAC;YAClC,CAAC;QACF,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,sCAAsC;IACvC,CAAC;IAED,OAAO,MAAM,CAAC;AAAA,CACd","sourcesContent":["/**\n * Path/filename similarity metric.\n *\n * Tokenizes query and file paths, computes a recall-oriented overlap score\n * (what fraction of query tokens appear in the path).\n */\n\nimport type { StoredChunk } from \"../types.js\";\nimport { tokenize } from \"./tokenize.js\";\n\n/**\n * Compute path/filename similarity scores.\n * Tokenizes query and file paths, returns Jaccard-like overlap score.\n */\nexport function computePathMatchScores(query: string, chunks: StoredChunk[]): Map<number, number> {\n\tconst scores = new Map<number, number>();\n\n\ttry {\n\t\tconst queryTokens = tokenize(query);\n\t\tif (queryTokens.length === 0) return scores;\n\n\t\tconst querySet = new Set(queryTokens);\n\n\t\t// Cache path tokens per file path (many chunks share the same file)\n\t\tconst pathTokenCache = new Map<string, Set<string>>();\n\n\t\tlet maxScore = 0;\n\n\t\tfor (const chunk of chunks) {\n\t\t\tlet pathTokenSet = pathTokenCache.get(chunk.filePath);\n\t\t\tif (!pathTokenSet) {\n\t\t\t\tpathTokenSet = new Set(tokenize(chunk.filePath));\n\t\t\t\tpathTokenCache.set(chunk.filePath, pathTokenSet);\n\t\t\t}\n\n\t\t\t// Score = |intersection| / |query tokens| (recall-oriented)\n\t\t\tlet intersection = 0;\n\t\t\tfor (const qt of querySet) {\n\t\t\t\tif (pathTokenSet.has(qt)) {\n\t\t\t\t\tintersection++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst score = intersection / queryTokens.length;\n\t\t\tif (score > 0) {\n\t\t\t\tscores.set(chunk.id, score);\n\t\t\t\tif (score > maxScore) maxScore = score;\n\t\t\t}\n\t\t}\n\n\t\t// Normalize to 0-1 (divide by max if not already bounded)\n\t\tif (maxScore > 0 && maxScore !== 1) {\n\t\t\tfor (const [id, score] of scores) {\n\t\t\t\tscores.set(id, score / maxScore);\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// If anything fails, return empty map\n\t}\n\n\treturn scores;\n}\n"]}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Symbol name match metric.
3
+ *
4
+ * Compares query terms against symbol names (function/class/etc names)
5
+ * using tokenized overlap with bonuses for exact substring matches.
6
+ */
7
+ /**
8
+ * Compute symbol name match scores.
9
+ * Compares query terms against symbol names (function/class/etc names).
10
+ */
11
+ export declare function computeSymbolMatchScores(query: string, symbols: Map<number, string[]>): Map<number, number>;
12
+ //# sourceMappingURL=symbol-match.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol-match.d.ts","sourceRoot":"","sources":["../../../../src/core/search/metrics/symbol-match.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAyD3G","sourcesContent":["/**\n * Symbol name match metric.\n *\n * Compares query terms against symbol names (function/class/etc names)\n * using tokenized overlap with bonuses for exact substring matches.\n */\n\nimport { tokenize } from \"./tokenize.js\";\n\n/**\n * Compute symbol name match scores.\n * Compares query terms against symbol names (function/class/etc names).\n */\nexport function computeSymbolMatchScores(query: string, symbols: Map<number, string[]>): Map<number, number> {\n\tconst scores = new Map<number, number>();\n\n\ttry {\n\t\tconst queryTokens = tokenize(query);\n\t\tif (queryTokens.length === 0) return scores;\n\n\t\tconst queryLower = query.toLowerCase();\n\n\t\tlet maxScore = 0;\n\n\t\tfor (const [chunkId, symbolNames] of symbols) {\n\t\t\tlet bestScore = 0;\n\n\t\t\tfor (const symbolName of symbolNames) {\n\t\t\t\tconst symbolTokens = new Set(tokenize(symbolName));\n\t\t\t\tconst symbolLower = symbolName.toLowerCase();\n\n\t\t\t\t// Token overlap: fraction of query tokens found in symbol\n\t\t\t\tlet matchCount = 0;\n\t\t\t\tfor (const qt of queryTokens) {\n\t\t\t\t\tif (symbolTokens.has(qt)) {\n\t\t\t\t\t\tmatchCount++;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet score = matchCount / queryTokens.length;\n\n\t\t\t\t// Bonus for exact substring match of query in symbol name\n\t\t\t\tif (symbolLower.includes(queryLower)) {\n\t\t\t\t\tscore = Math.min(1, score + 0.3);\n\t\t\t\t}\n\t\t\t\t// Bonus for exact substring match of symbol in query\n\t\t\t\telse if (queryLower.includes(symbolLower) && symbolLower.length >= 3) {\n\t\t\t\t\tscore = Math.min(1, score + 0.2);\n\t\t\t\t}\n\n\t\t\t\tif (score > bestScore) bestScore = score;\n\t\t\t}\n\n\t\t\tif (bestScore > 0) {\n\t\t\t\tscores.set(chunkId, bestScore);\n\t\t\t\tif (bestScore > maxScore) maxScore = bestScore;\n\t\t\t}\n\t\t}\n\n\t\t// Normalize to 0-1\n\t\tif (maxScore > 0 && maxScore !== 1) {\n\t\t\tfor (const [id, score] of scores) {\n\t\t\t\tscores.set(id, score / maxScore);\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// If anything fails, return empty map\n\t}\n\n\treturn scores;\n}\n"]}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Symbol name match metric.
3
+ *
4
+ * Compares query terms against symbol names (function/class/etc names)
5
+ * using tokenized overlap with bonuses for exact substring matches.
6
+ */
7
+ import { tokenize } from "./tokenize.js";
8
+ /**
9
+ * Compute symbol name match scores.
10
+ * Compares query terms against symbol names (function/class/etc names).
11
+ */
12
+ export function computeSymbolMatchScores(query, symbols) {
13
+ const scores = new Map();
14
+ try {
15
+ const queryTokens = tokenize(query);
16
+ if (queryTokens.length === 0)
17
+ return scores;
18
+ const queryLower = query.toLowerCase();
19
+ let maxScore = 0;
20
+ for (const [chunkId, symbolNames] of symbols) {
21
+ let bestScore = 0;
22
+ for (const symbolName of symbolNames) {
23
+ const symbolTokens = new Set(tokenize(symbolName));
24
+ const symbolLower = symbolName.toLowerCase();
25
+ // Token overlap: fraction of query tokens found in symbol
26
+ let matchCount = 0;
27
+ for (const qt of queryTokens) {
28
+ if (symbolTokens.has(qt)) {
29
+ matchCount++;
30
+ }
31
+ }
32
+ let score = matchCount / queryTokens.length;
33
+ // Bonus for exact substring match of query in symbol name
34
+ if (symbolLower.includes(queryLower)) {
35
+ score = Math.min(1, score + 0.3);
36
+ }
37
+ // Bonus for exact substring match of symbol in query
38
+ else if (queryLower.includes(symbolLower) && symbolLower.length >= 3) {
39
+ score = Math.min(1, score + 0.2);
40
+ }
41
+ if (score > bestScore)
42
+ bestScore = score;
43
+ }
44
+ if (bestScore > 0) {
45
+ scores.set(chunkId, bestScore);
46
+ if (bestScore > maxScore)
47
+ maxScore = bestScore;
48
+ }
49
+ }
50
+ // Normalize to 0-1
51
+ if (maxScore > 0 && maxScore !== 1) {
52
+ for (const [id, score] of scores) {
53
+ scores.set(id, score / maxScore);
54
+ }
55
+ }
56
+ }
57
+ catch {
58
+ // If anything fails, return empty map
59
+ }
60
+ return scores;
61
+ }
62
+ //# sourceMappingURL=symbol-match.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol-match.js","sourceRoot":"","sources":["../../../../src/core/search/metrics/symbol-match.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAAa,EAAE,OAA8B,EAAuB;IAC5G,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEzC,IAAI,CAAC;QACJ,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC;QAE5C,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAEvC,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,OAAO,EAAE,CAAC;YAC9C,IAAI,SAAS,GAAG,CAAC,CAAC;YAElB,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACtC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;gBACnD,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;gBAE7C,0DAA0D;gBAC1D,IAAI,UAAU,GAAG,CAAC,CAAC;gBACnB,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;oBAC9B,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;wBAC1B,UAAU,EAAE,CAAC;oBACd,CAAC;gBACF,CAAC;gBAED,IAAI,KAAK,GAAG,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC;gBAE5C,0DAA0D;gBAC1D,IAAI,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;oBACtC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,GAAG,CAAC,CAAC;gBAClC,CAAC;gBACD,qDAAqD;qBAChD,IAAI,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;oBACtE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,GAAG,CAAC,CAAC;gBAClC,CAAC;gBAED,IAAI,KAAK,GAAG,SAAS;oBAAE,SAAS,GAAG,KAAK,CAAC;YAC1C,CAAC;YAED,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;gBACnB,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBAC/B,IAAI,SAAS,GAAG,QAAQ;oBAAE,QAAQ,GAAG,SAAS,CAAC;YAChD,CAAC;QACF,CAAC;QAED,mBAAmB;QACnB,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACpC,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;gBAClC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,QAAQ,CAAC,CAAC;YAClC,CAAC;QACF,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,sCAAsC;IACvC,CAAC;IAED,OAAO,MAAM,CAAC;AAAA,CACd","sourcesContent":["/**\n * Symbol name match metric.\n *\n * Compares query terms against symbol names (function/class/etc names)\n * using tokenized overlap with bonuses for exact substring matches.\n */\n\nimport { tokenize } from \"./tokenize.js\";\n\n/**\n * Compute symbol name match scores.\n * Compares query terms against symbol names (function/class/etc names).\n */\nexport function computeSymbolMatchScores(query: string, symbols: Map<number, string[]>): Map<number, number> {\n\tconst scores = new Map<number, number>();\n\n\ttry {\n\t\tconst queryTokens = tokenize(query);\n\t\tif (queryTokens.length === 0) return scores;\n\n\t\tconst queryLower = query.toLowerCase();\n\n\t\tlet maxScore = 0;\n\n\t\tfor (const [chunkId, symbolNames] of symbols) {\n\t\t\tlet bestScore = 0;\n\n\t\t\tfor (const symbolName of symbolNames) {\n\t\t\t\tconst symbolTokens = new Set(tokenize(symbolName));\n\t\t\t\tconst symbolLower = symbolName.toLowerCase();\n\n\t\t\t\t// Token overlap: fraction of query tokens found in symbol\n\t\t\t\tlet matchCount = 0;\n\t\t\t\tfor (const qt of queryTokens) {\n\t\t\t\t\tif (symbolTokens.has(qt)) {\n\t\t\t\t\t\tmatchCount++;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet score = matchCount / queryTokens.length;\n\n\t\t\t\t// Bonus for exact substring match of query in symbol name\n\t\t\t\tif (symbolLower.includes(queryLower)) {\n\t\t\t\t\tscore = Math.min(1, score + 0.3);\n\t\t\t\t}\n\t\t\t\t// Bonus for exact substring match of symbol in query\n\t\t\t\telse if (queryLower.includes(symbolLower) && symbolLower.length >= 3) {\n\t\t\t\t\tscore = Math.min(1, score + 0.2);\n\t\t\t\t}\n\n\t\t\t\tif (score > bestScore) bestScore = score;\n\t\t\t}\n\n\t\t\tif (bestScore > 0) {\n\t\t\t\tscores.set(chunkId, bestScore);\n\t\t\t\tif (bestScore > maxScore) maxScore = bestScore;\n\t\t\t}\n\t\t}\n\n\t\t// Normalize to 0-1\n\t\tif (maxScore > 0 && maxScore !== 1) {\n\t\t\tfor (const [id, score] of scores) {\n\t\t\t\tscores.set(id, score / maxScore);\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// If anything fails, return empty map\n\t}\n\n\treturn scores;\n}\n"]}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Shared tokenizer for path-match and symbol-match metrics.
3
+ *
4
+ * Splits text on common code boundaries (spaces, path separators, dots,
5
+ * dashes, underscores, camelCase) and normalizes to lowercase.
6
+ */
7
+ /**
8
+ * Tokenize text by splitting on spaces, `/`, `\`, `.`, `-`, `_`, and
9
+ * camelCase boundaries. Returns unique, lowercase tokens ≥ 2 chars.
10
+ */
11
+ export declare function tokenize(text: string): string[];
12
+ //# sourceMappingURL=tokenize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenize.d.ts","sourceRoot":"","sources":["../../../../src/core/search/metrics/tokenize.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAoB/C","sourcesContent":["/**\n * Shared tokenizer for path-match and symbol-match metrics.\n *\n * Splits text on common code boundaries (spaces, path separators, dots,\n * dashes, underscores, camelCase) and normalizes to lowercase.\n */\n\n/**\n * Tokenize text by splitting on spaces, `/`, `\\`, `.`, `-`, `_`, and\n * camelCase boundaries. Returns unique, lowercase tokens ≥ 2 chars.\n */\nexport function tokenize(text: string): string[] {\n\t// Insert a space before uppercase letters that follow lowercase letters (camelCase)\n\t// or before uppercase letters followed by lowercase (e.g., \"XMLParser\" → \"XML Parser\")\n\tconst spaced = text.replace(/([a-z])([A-Z])/g, \"$1 $2\").replace(/([A-Z]+)([A-Z][a-z])/g, \"$1 $2\");\n\n\t// Split on common delimiters\n\tconst parts = spaced.split(/[\\s/\\\\.\\-_]+/);\n\n\t// Lowercase, deduplicate, filter short tokens\n\tconst seen = new Set<string>();\n\tconst tokens: string[] = [];\n\tfor (const part of parts) {\n\t\tconst lower = part.toLowerCase();\n\t\tif (lower.length >= 2 && !seen.has(lower)) {\n\t\t\tseen.add(lower);\n\t\t\ttokens.push(lower);\n\t\t}\n\t}\n\n\treturn tokens;\n}\n"]}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Shared tokenizer for path-match and symbol-match metrics.
3
+ *
4
+ * Splits text on common code boundaries (spaces, path separators, dots,
5
+ * dashes, underscores, camelCase) and normalizes to lowercase.
6
+ */
7
+ /**
8
+ * Tokenize text by splitting on spaces, `/`, `\`, `.`, `-`, `_`, and
9
+ * camelCase boundaries. Returns unique, lowercase tokens ≥ 2 chars.
10
+ */
11
+ export function tokenize(text) {
12
+ // Insert a space before uppercase letters that follow lowercase letters (camelCase)
13
+ // or before uppercase letters followed by lowercase (e.g., "XMLParser" → "XML Parser")
14
+ const spaced = text.replace(/([a-z])([A-Z])/g, "$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2");
15
+ // Split on common delimiters
16
+ const parts = spaced.split(/[\s/\\.\-_]+/);
17
+ // Lowercase, deduplicate, filter short tokens
18
+ const seen = new Set();
19
+ const tokens = [];
20
+ for (const part of parts) {
21
+ const lower = part.toLowerCase();
22
+ if (lower.length >= 2 && !seen.has(lower)) {
23
+ seen.add(lower);
24
+ tokens.push(lower);
25
+ }
26
+ }
27
+ return tokens;
28
+ }
29
+ //# sourceMappingURL=tokenize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenize.js","sourceRoot":"","sources":["../../../../src/core/search/metrics/tokenize.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAY;IAChD,oFAAoF;IACpF,yFAAuF;IACvF,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC;IAElG,6BAA6B;IAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAE3C,8CAA8C;IAC9C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACF,CAAC;IAED,OAAO,MAAM,CAAC;AAAA,CACd","sourcesContent":["/**\n * Shared tokenizer for path-match and symbol-match metrics.\n *\n * Splits text on common code boundaries (spaces, path separators, dots,\n * dashes, underscores, camelCase) and normalizes to lowercase.\n */\n\n/**\n * Tokenize text by splitting on spaces, `/`, `\\`, `.`, `-`, `_`, and\n * camelCase boundaries. Returns unique, lowercase tokens ≥ 2 chars.\n */\nexport function tokenize(text: string): string[] {\n\t// Insert a space before uppercase letters that follow lowercase letters (camelCase)\n\t// or before uppercase letters followed by lowercase (e.g., \"XMLParser\" → \"XML Parser\")\n\tconst spaced = text.replace(/([a-z])([A-Z])/g, \"$1 $2\").replace(/([A-Z]+)([A-Z][a-z])/g, \"$1 $2\");\n\n\t// Split on common delimiters\n\tconst parts = spaced.split(/[\\s/\\\\.\\-_]+/);\n\n\t// Lowercase, deduplicate, filter short tokens\n\tconst seen = new Set<string>();\n\tconst tokens: string[] = [];\n\tfor (const part of parts) {\n\t\tconst lower = part.toLowerCase();\n\t\tif (lower.length >= 2 && !seen.has(lower)) {\n\t\t\tseen.add(lower);\n\t\t\ttokens.push(lower);\n\t\t}\n\t}\n\n\treturn tokens;\n}\n"]}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * POEM — Pareto-Optimal Embedded Modeling, multi-metric ranking.
3
+ *
4
+ * Ranks search candidates across multiple relevance metrics without requiring
5
+ * hand-tuned weights. Uses the TFPR (Top-Fraction Pareto Ranker) approach:
6
+ * vectorized dominance matrix computation with column duplication for
7
+ * query-type-dependent metric weighting.
8
+ *
9
+ * Algorithm:
10
+ * 1. Prune: per-metric top-K → union of survivors
11
+ * 2. Build objectives matrix with column duplication for query-type weighting
12
+ * 3. For each objective column, sort candidates and accumulate pairwise
13
+ * dominance counts (duplicate columns contribute via weight multiplier)
14
+ * 4. Compute fitness: meanDominance × (numDominating + ε) / (numSubmitting + ε)
15
+ * 5. Sort by fitness, assign ranks
16
+ *
17
+ * References:
18
+ * - POEM paper: https://iopscience.iop.org/article/10.1088/2632-2153/ab891b
19
+ * - TFPR: https://github.com/merckgroup/aidd_tfpr
20
+ * - colourdle: https://github.com/aebrer/colourdle
21
+ */
22
+ import type { QueryType } from "./query-classifier.js";
23
+ import { type MetricScores } from "./types.js";
24
+ export interface RankedCandidate {
25
+ id: number;
26
+ scores: MetricScores;
27
+ rank: number;
28
+ }
29
+ /**
30
+ * Rank candidates using POEM / TFPR.
31
+ *
32
+ * @param candidates Map of candidateId → MetricScores (all values 0–1)
33
+ * @param queryType Query type for column duplication weighting
34
+ * @param topK Per-metric pruning limit (default: 1000)
35
+ * @returns Candidates ordered best-first with assigned ranks (0 = best)
36
+ */
37
+ export declare function poemRank(candidates: Map<number, MetricScores>, queryType: QueryType, topK?: number): RankedCandidate[];
38
+ //# sourceMappingURL=poem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poem.d.ts","sourceRoot":"","sources":["../../../src/core/search/poem.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAiC,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAM9E,MAAM,WAAW,eAAe;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACb;AA4KD;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,SAAO,GAAG,eAAe,EAAE,CA+CpH","sourcesContent":["/**\n * POEM — Pareto-Optimal Embedded Modeling, multi-metric ranking.\n *\n * Ranks search candidates across multiple relevance metrics without requiring\n * hand-tuned weights. Uses the TFPR (Top-Fraction Pareto Ranker) approach:\n * vectorized dominance matrix computation with column duplication for\n * query-type-dependent metric weighting.\n *\n * Algorithm:\n * 1. Prune: per-metric top-K → union of survivors\n * 2. Build objectives matrix with column duplication for query-type weighting\n * 3. For each objective column, sort candidates and accumulate pairwise\n * dominance counts (duplicate columns contribute via weight multiplier)\n * 4. Compute fitness: meanDominance × (numDominating + ε) / (numSubmitting + ε)\n * 5. Sort by fitness, assign ranks\n *\n * References:\n * - POEM paper: https://iopscience.iop.org/article/10.1088/2632-2153/ab891b\n * - TFPR: https://github.com/merckgroup/aidd_tfpr\n * - colourdle: https://github.com/aebrer/colourdle\n */\n\nimport type { QueryType } from \"./query-classifier.js\";\nimport { METRIC_NAMES, type MetricName, type MetricScores } from \"./types.js\";\n\n// ============================================================================\n// Public types\n// ============================================================================\n\nexport interface RankedCandidate {\n\tid: number;\n\tscores: MetricScores;\n\trank: number;\n}\n\n// ============================================================================\n// Column duplication config per query type\n// ============================================================================\n\n/** How many times each metric column appears in the objectives matrix. */\ntype ColumnWeights = Record<MetricName, number>;\n\nconst COLUMN_WEIGHTS: Record<QueryType, ColumnWeights> = {\n\tidentifier: {\n\t\tbm25: 2,\n\t\tcosine: 1,\n\t\tpathMatch: 1,\n\t\tsymbolMatch: 2,\n\t\timportGraph: 1,\n\t\tgitRecency: 1,\n\t},\n\tnatural_language: {\n\t\tbm25: 1,\n\t\tcosine: 2,\n\t\tpathMatch: 1,\n\t\tsymbolMatch: 1,\n\t\timportGraph: 1,\n\t\tgitRecency: 1,\n\t},\n\tpath_like: {\n\t\tbm25: 1,\n\t\tcosine: 1,\n\t\tpathMatch: 3,\n\t\tsymbolMatch: 1,\n\t\timportGraph: 1,\n\t\tgitRecency: 1,\n\t},\n};\n\n// ============================================================================\n// Fitness smoothing constant (avoids division by zero)\n// ============================================================================\n\nconst EPSILON = 0.05;\n\n// ============================================================================\n// Pruning\n// ============================================================================\n\n/**\n * Per-metric top-K pruning → union of surviving candidate IDs.\n */\nfunction pruneTopK(candidates: Map<number, MetricScores>, topK: number): Set<number> {\n\tif (candidates.size <= topK) {\n\t\treturn new Set(candidates.keys());\n\t}\n\n\tconst union = new Set<number>();\n\n\tfor (const metric of METRIC_NAMES) {\n\t\tconst pairs: Array<[number, number]> = [];\n\t\tfor (const [id, scores] of candidates) {\n\t\t\tpairs.push([id, scores[metric] ?? 0]);\n\t\t}\n\t\tpairs.sort((a, b) => b[1] - a[1]);\n\t\tconst limit = Math.min(topK, pairs.length);\n\t\tfor (let i = 0; i < limit; i++) {\n\t\t\tunion.add(pairs[i][0]);\n\t\t}\n\t}\n\n\treturn union;\n}\n\n// ============================================================================\n// Dominance matrix computation\n// ============================================================================\n\n/**\n * Build the dominance count matrix using the TFPR approach.\n *\n * For each objective (metric), sorts candidates and accumulates pairwise\n * dominance: if candidate i ranks above candidate j on an objective,\n * dominanceCounts[i][j] increases by the column weight.\n *\n * Duplicate columns (from column duplication) are handled by multiplying\n * the contribution by the weight rather than re-sorting — same result,\n * no redundant work.\n *\n * Uses Uint16Array to keep memory compact (max possible value per cell\n * is the sum of all weights, which is ≤ 10).\n *\n * @param scores Dense array of MetricScores, indexed 0..n-1\n * @param weights Column weights from query type\n * @param topK Only top-K per objective contribute to pairwise dominance\n * @returns Flat dominance count matrix [n × n] and the total weight sum\n */\nfunction buildDominanceCounts(\n\tscores: MetricScores[],\n\tweights: ColumnWeights,\n\ttopK: number,\n): [counts: Uint16Array, totalWeight: number] {\n\tconst n = scores.length;\n\tconst counts = new Uint16Array(n * n);\n\tlet totalWeight = 0;\n\n\t// Reusable index array for sorting\n\tconst indices = new Array<number>(n);\n\tfor (let i = 0; i < n; i++) indices[i] = i;\n\n\tfor (const metric of METRIC_NAMES) {\n\t\tconst weight = weights[metric];\n\t\tif (weight === 0) continue;\n\t\ttotalWeight += weight;\n\n\t\t// Sort candidates by this metric (descending)\n\t\tconst sorted = indices.slice();\n\t\tsorted.sort((a, b) => (scores[b][metric] ?? 0) - (scores[a][metric] ?? 0));\n\n\t\t// Only consider top-K for pairwise dominance\n\t\tconst k = Math.min(topK, n);\n\n\t\t// For each pair in the top-K where i ranks above j:\n\t\t// i dominates j on this objective → add weight to counts[i, j]\n\t\tfor (let ri = 0; ri < k; ri++) {\n\t\t\tconst i = sorted[ri];\n\t\t\tconst iBase = i * n;\n\t\t\tfor (let rj = ri + 1; rj < k; rj++) {\n\t\t\t\tcounts[iBase + sorted[rj]] += weight;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn [counts, totalWeight];\n}\n\n/**\n * Compute fitness scores from the dominance count matrix.\n *\n * Fitness = meanDominance × (numDominating + ε) / (numSubmitting + ε)\n *\n * Where:\n * - meanDominance = average normalized dominance across all other candidates\n * - numDominating = count of candidates this one dominates (>50% of objectives)\n * - numSubmitting = count of candidates this one fails to dominate (<50%)\n */\nfunction computeFitness(counts: Uint16Array, n: number, totalWeight: number): Float64Array {\n\tconst fitness = new Float64Array(n);\n\tconst threshold = totalWeight * 0.5;\n\n\tfor (let i = 0; i < n; i++) {\n\t\tlet sumDom = 0;\n\t\tlet numDominating = 0;\n\t\tlet numSubmitting = 0;\n\t\tconst iBase = i * n;\n\n\t\tfor (let j = 0; j < n; j++) {\n\t\t\tif (i === j) continue;\n\t\t\tconst count = counts[iBase + j];\n\t\t\tsumDom += count;\n\t\t\tif (count > threshold) numDominating++;\n\t\t\tif (count < threshold) numSubmitting++;\n\t\t}\n\n\t\tconst meanDom = n > 1 ? sumDom / ((n - 1) * totalWeight) : 0;\n\t\tfitness[i] = (meanDom * (numDominating + EPSILON)) / (numSubmitting + EPSILON);\n\t}\n\n\treturn fitness;\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Rank candidates using POEM / TFPR.\n *\n * @param candidates Map of candidateId → MetricScores (all values 0–1)\n * @param queryType Query type for column duplication weighting\n * @param topK Per-metric pruning limit (default: 1000)\n * @returns Candidates ordered best-first with assigned ranks (0 = best)\n */\nexport function poemRank(candidates: Map<number, MetricScores>, queryType: QueryType, topK = 1000): RankedCandidate[] {\n\tif (candidates.size === 0) return [];\n\n\t// 1. Prune: per-metric top-K → union\n\tconst surviving = pruneTopK(candidates, topK);\n\n\t// 2. Build dense arrays\n\tconst ids: number[] = [];\n\tconst scores: MetricScores[] = [];\n\n\tfor (const id of surviving) {\n\t\tconst s = candidates.get(id)!;\n\t\tids.push(id);\n\t\tscores.push({\n\t\t\tbm25: s.bm25 ?? 0,\n\t\t\tcosine: s.cosine ?? 0,\n\t\t\tpathMatch: s.pathMatch ?? 0,\n\t\t\tsymbolMatch: s.symbolMatch ?? 0,\n\t\t\timportGraph: s.importGraph ?? 0,\n\t\t\tgitRecency: s.gitRecency ?? 0,\n\t\t});\n\t}\n\n\tconst n = ids.length;\n\n\t// Single candidate → rank 0\n\tif (n === 1) {\n\t\treturn [{ id: ids[0], scores: scores[0], rank: 0 }];\n\t}\n\n\t// 3. Compute dominance matrix with column duplication\n\tconst weights = COLUMN_WEIGHTS[queryType];\n\tconst [counts, totalWeight] = buildDominanceCounts(scores, weights, topK);\n\n\t// 4. Compute fitness scores\n\tconst fitness = computeFitness(counts, n, totalWeight);\n\n\t// 5. Sort by fitness (descending) and assign ranks\n\tconst order = new Array<number>(n);\n\tfor (let i = 0; i < n; i++) order[i] = i;\n\torder.sort((a, b) => fitness[b] - fitness[a]);\n\n\treturn order.map((idx, rank) => ({\n\t\tid: ids[idx],\n\t\tscores: scores[idx],\n\t\trank,\n\t}));\n}\n"]}
@@ -0,0 +1,214 @@
1
+ /**
2
+ * POEM — Pareto-Optimal Embedded Modeling, multi-metric ranking.
3
+ *
4
+ * Ranks search candidates across multiple relevance metrics without requiring
5
+ * hand-tuned weights. Uses the TFPR (Top-Fraction Pareto Ranker) approach:
6
+ * vectorized dominance matrix computation with column duplication for
7
+ * query-type-dependent metric weighting.
8
+ *
9
+ * Algorithm:
10
+ * 1. Prune: per-metric top-K → union of survivors
11
+ * 2. Build objectives matrix with column duplication for query-type weighting
12
+ * 3. For each objective column, sort candidates and accumulate pairwise
13
+ * dominance counts (duplicate columns contribute via weight multiplier)
14
+ * 4. Compute fitness: meanDominance × (numDominating + ε) / (numSubmitting + ε)
15
+ * 5. Sort by fitness, assign ranks
16
+ *
17
+ * References:
18
+ * - POEM paper: https://iopscience.iop.org/article/10.1088/2632-2153/ab891b
19
+ * - TFPR: https://github.com/merckgroup/aidd_tfpr
20
+ * - colourdle: https://github.com/aebrer/colourdle
21
+ */
22
+ import { METRIC_NAMES } from "./types.js";
23
+ const COLUMN_WEIGHTS = {
24
+ identifier: {
25
+ bm25: 2,
26
+ cosine: 1,
27
+ pathMatch: 1,
28
+ symbolMatch: 2,
29
+ importGraph: 1,
30
+ gitRecency: 1,
31
+ },
32
+ natural_language: {
33
+ bm25: 1,
34
+ cosine: 2,
35
+ pathMatch: 1,
36
+ symbolMatch: 1,
37
+ importGraph: 1,
38
+ gitRecency: 1,
39
+ },
40
+ path_like: {
41
+ bm25: 1,
42
+ cosine: 1,
43
+ pathMatch: 3,
44
+ symbolMatch: 1,
45
+ importGraph: 1,
46
+ gitRecency: 1,
47
+ },
48
+ };
49
+ // ============================================================================
50
+ // Fitness smoothing constant (avoids division by zero)
51
+ // ============================================================================
52
+ const EPSILON = 0.05;
53
+ // ============================================================================
54
+ // Pruning
55
+ // ============================================================================
56
+ /**
57
+ * Per-metric top-K pruning → union of surviving candidate IDs.
58
+ */
59
+ function pruneTopK(candidates, topK) {
60
+ if (candidates.size <= topK) {
61
+ return new Set(candidates.keys());
62
+ }
63
+ const union = new Set();
64
+ for (const metric of METRIC_NAMES) {
65
+ const pairs = [];
66
+ for (const [id, scores] of candidates) {
67
+ pairs.push([id, scores[metric] ?? 0]);
68
+ }
69
+ pairs.sort((a, b) => b[1] - a[1]);
70
+ const limit = Math.min(topK, pairs.length);
71
+ for (let i = 0; i < limit; i++) {
72
+ union.add(pairs[i][0]);
73
+ }
74
+ }
75
+ return union;
76
+ }
77
+ // ============================================================================
78
+ // Dominance matrix computation
79
+ // ============================================================================
80
+ /**
81
+ * Build the dominance count matrix using the TFPR approach.
82
+ *
83
+ * For each objective (metric), sorts candidates and accumulates pairwise
84
+ * dominance: if candidate i ranks above candidate j on an objective,
85
+ * dominanceCounts[i][j] increases by the column weight.
86
+ *
87
+ * Duplicate columns (from column duplication) are handled by multiplying
88
+ * the contribution by the weight rather than re-sorting — same result,
89
+ * no redundant work.
90
+ *
91
+ * Uses Uint16Array to keep memory compact (max possible value per cell
92
+ * is the sum of all weights, which is ≤ 10).
93
+ *
94
+ * @param scores Dense array of MetricScores, indexed 0..n-1
95
+ * @param weights Column weights from query type
96
+ * @param topK Only top-K per objective contribute to pairwise dominance
97
+ * @returns Flat dominance count matrix [n × n] and the total weight sum
98
+ */
99
+ function buildDominanceCounts(scores, weights, topK) {
100
+ const n = scores.length;
101
+ const counts = new Uint16Array(n * n);
102
+ let totalWeight = 0;
103
+ // Reusable index array for sorting
104
+ const indices = new Array(n);
105
+ for (let i = 0; i < n; i++)
106
+ indices[i] = i;
107
+ for (const metric of METRIC_NAMES) {
108
+ const weight = weights[metric];
109
+ if (weight === 0)
110
+ continue;
111
+ totalWeight += weight;
112
+ // Sort candidates by this metric (descending)
113
+ const sorted = indices.slice();
114
+ sorted.sort((a, b) => (scores[b][metric] ?? 0) - (scores[a][metric] ?? 0));
115
+ // Only consider top-K for pairwise dominance
116
+ const k = Math.min(topK, n);
117
+ // For each pair in the top-K where i ranks above j:
118
+ // i dominates j on this objective → add weight to counts[i, j]
119
+ for (let ri = 0; ri < k; ri++) {
120
+ const i = sorted[ri];
121
+ const iBase = i * n;
122
+ for (let rj = ri + 1; rj < k; rj++) {
123
+ counts[iBase + sorted[rj]] += weight;
124
+ }
125
+ }
126
+ }
127
+ return [counts, totalWeight];
128
+ }
129
+ /**
130
+ * Compute fitness scores from the dominance count matrix.
131
+ *
132
+ * Fitness = meanDominance × (numDominating + ε) / (numSubmitting + ε)
133
+ *
134
+ * Where:
135
+ * - meanDominance = average normalized dominance across all other candidates
136
+ * - numDominating = count of candidates this one dominates (>50% of objectives)
137
+ * - numSubmitting = count of candidates this one fails to dominate (<50%)
138
+ */
139
+ function computeFitness(counts, n, totalWeight) {
140
+ const fitness = new Float64Array(n);
141
+ const threshold = totalWeight * 0.5;
142
+ for (let i = 0; i < n; i++) {
143
+ let sumDom = 0;
144
+ let numDominating = 0;
145
+ let numSubmitting = 0;
146
+ const iBase = i * n;
147
+ for (let j = 0; j < n; j++) {
148
+ if (i === j)
149
+ continue;
150
+ const count = counts[iBase + j];
151
+ sumDom += count;
152
+ if (count > threshold)
153
+ numDominating++;
154
+ if (count < threshold)
155
+ numSubmitting++;
156
+ }
157
+ const meanDom = n > 1 ? sumDom / ((n - 1) * totalWeight) : 0;
158
+ fitness[i] = (meanDom * (numDominating + EPSILON)) / (numSubmitting + EPSILON);
159
+ }
160
+ return fitness;
161
+ }
162
+ // ============================================================================
163
+ // Public API
164
+ // ============================================================================
165
+ /**
166
+ * Rank candidates using POEM / TFPR.
167
+ *
168
+ * @param candidates Map of candidateId → MetricScores (all values 0–1)
169
+ * @param queryType Query type for column duplication weighting
170
+ * @param topK Per-metric pruning limit (default: 1000)
171
+ * @returns Candidates ordered best-first with assigned ranks (0 = best)
172
+ */
173
+ export function poemRank(candidates, queryType, topK = 1000) {
174
+ if (candidates.size === 0)
175
+ return [];
176
+ // 1. Prune: per-metric top-K → union
177
+ const surviving = pruneTopK(candidates, topK);
178
+ // 2. Build dense arrays
179
+ const ids = [];
180
+ const scores = [];
181
+ for (const id of surviving) {
182
+ const s = candidates.get(id);
183
+ ids.push(id);
184
+ scores.push({
185
+ bm25: s.bm25 ?? 0,
186
+ cosine: s.cosine ?? 0,
187
+ pathMatch: s.pathMatch ?? 0,
188
+ symbolMatch: s.symbolMatch ?? 0,
189
+ importGraph: s.importGraph ?? 0,
190
+ gitRecency: s.gitRecency ?? 0,
191
+ });
192
+ }
193
+ const n = ids.length;
194
+ // Single candidate → rank 0
195
+ if (n === 1) {
196
+ return [{ id: ids[0], scores: scores[0], rank: 0 }];
197
+ }
198
+ // 3. Compute dominance matrix with column duplication
199
+ const weights = COLUMN_WEIGHTS[queryType];
200
+ const [counts, totalWeight] = buildDominanceCounts(scores, weights, topK);
201
+ // 4. Compute fitness scores
202
+ const fitness = computeFitness(counts, n, totalWeight);
203
+ // 5. Sort by fitness (descending) and assign ranks
204
+ const order = new Array(n);
205
+ for (let i = 0; i < n; i++)
206
+ order[i] = i;
207
+ order.sort((a, b) => fitness[b] - fitness[a]);
208
+ return order.map((idx, rank) => ({
209
+ id: ids[idx],
210
+ scores: scores[idx],
211
+ rank,
212
+ }));
213
+ }
214
+ //# sourceMappingURL=poem.js.map