codebase-onboarder 0.5.0 → 0.7.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 (448) hide show
  1. package/README.md +196 -47
  2. package/bin/build-if-source.js +23 -0
  3. package/cli/commands.d.ts +26 -0
  4. package/cli/commands.js +836 -811
  5. package/cli/commands.js.map +1 -0
  6. package/cli/explorer/advanced.d.ts +14 -0
  7. package/cli/explorer/advanced.js +449 -0
  8. package/cli/explorer/advanced.js.map +1 -0
  9. package/cli/explorer/app.d.ts +1 -0
  10. package/cli/explorer/app.js +396 -229
  11. package/cli/explorer/app.js.map +1 -0
  12. package/cli/explorer/assistant.d.ts +9 -0
  13. package/cli/explorer/assistant.js +58 -0
  14. package/cli/explorer/assistant.js.map +1 -0
  15. package/cli/explorer/commands.d.ts +17 -0
  16. package/cli/explorer/commands.js +400 -162
  17. package/cli/explorer/commands.js.map +1 -0
  18. package/cli/explorer/featureViews.d.ts +124 -0
  19. package/cli/explorer/featureViews.js +179 -0
  20. package/cli/explorer/featureViews.js.map +1 -0
  21. package/cli/explorer/github.d.ts +21 -0
  22. package/cli/explorer/github.js +73 -0
  23. package/cli/explorer/github.js.map +1 -0
  24. package/cli/explorer/graphs.d.ts +7 -0
  25. package/cli/explorer/graphs.js +173 -0
  26. package/cli/explorer/graphs.js.map +1 -0
  27. package/cli/explorer/picker.d.ts +22 -0
  28. package/cli/explorer/picker.js +150 -0
  29. package/cli/explorer/picker.js.map +1 -0
  30. package/cli/explorer/report.d.ts +85 -0
  31. package/cli/explorer/report.js +60 -0
  32. package/cli/explorer/report.js.map +1 -0
  33. package/cli/explorer/session.d.ts +449 -0
  34. package/cli/explorer/session.js +184 -95
  35. package/cli/explorer/session.js.map +1 -0
  36. package/cli/explorer/views.d.ts +19 -0
  37. package/cli/explorer/views.js +496 -412
  38. package/cli/explorer/views.js.map +1 -0
  39. package/cli/explorer/wrap.d.ts +1 -0
  40. package/cli/explorer/wrap.js +33 -0
  41. package/cli/explorer/wrap.js.map +1 -0
  42. package/cli/main.d.ts +1 -0
  43. package/cli/main.js +235 -138
  44. package/cli/main.js.map +1 -0
  45. package/cli/prompt.d.ts +5 -0
  46. package/cli/prompt.js +84 -80
  47. package/cli/prompt.js.map +1 -0
  48. package/cli/scanOptions.d.ts +2 -0
  49. package/cli/scanOptions.js +11 -0
  50. package/cli/scanOptions.js.map +1 -0
  51. package/cli/ui.d.ts +33 -0
  52. package/cli/ui.js +55 -35
  53. package/cli/ui.js.map +1 -0
  54. package/cli/wizard.d.ts +187 -0
  55. package/cli/wizard.js +304 -284
  56. package/cli/wizard.js.map +1 -0
  57. package/package.json +15 -4
  58. package/public/app.d.ts +1 -0
  59. package/public/app.js +1057 -1009
  60. package/public/app.js.map +1 -0
  61. package/public/browser.d.ts +68 -0
  62. package/public/browser.js +2 -0
  63. package/public/browser.js.map +1 -0
  64. package/public/index.html +30 -13
  65. package/public/js/about.d.ts +6 -0
  66. package/public/js/about.js +165 -172
  67. package/public/js/about.js.map +1 -0
  68. package/public/js/aiDraft.d.ts +3 -0
  69. package/public/js/aiDraft.js +116 -124
  70. package/public/js/aiDraft.js.map +1 -0
  71. package/public/js/analysisPanel.d.ts +7 -0
  72. package/public/js/analysisPanel.js +166 -166
  73. package/public/js/analysisPanel.js.map +1 -0
  74. package/public/js/analysisReport.d.ts +38 -0
  75. package/public/js/analysisReport.js +105 -110
  76. package/public/js/analysisReport.js.map +1 -0
  77. package/public/js/api.d.ts +26 -0
  78. package/public/js/api.js +176 -167
  79. package/public/js/api.js.map +1 -0
  80. package/public/js/atlas.d.ts +6 -0
  81. package/public/js/atlas.js +50 -58
  82. package/public/js/atlas.js.map +1 -0
  83. package/public/js/blameView.d.ts +2 -0
  84. package/public/js/blameView.js +36 -37
  85. package/public/js/blameView.js.map +1 -0
  86. package/public/js/codeTab.d.ts +3 -0
  87. package/public/js/codeTab.js +175 -180
  88. package/public/js/codeTab.js.map +1 -0
  89. package/public/js/codeViewer.d.ts +5 -0
  90. package/public/js/codeViewer.js +162 -150
  91. package/public/js/codeViewer.js.map +1 -0
  92. package/public/js/components/FileChip.d.ts +9 -0
  93. package/public/js/components/FileChip.js +45 -49
  94. package/public/js/components/FileChip.js.map +1 -0
  95. package/public/js/components/MetricSparkline.d.ts +7 -0
  96. package/public/js/components/MetricSparkline.js +35 -44
  97. package/public/js/components/MetricSparkline.js.map +1 -0
  98. package/public/js/components/RiskBadge.d.ts +9 -0
  99. package/public/js/components/RiskBadge.js +55 -63
  100. package/public/js/components/RiskBadge.js.map +1 -0
  101. package/public/js/deepAnalysisView.d.ts +99 -0
  102. package/public/js/deepAnalysisView.js +282 -302
  103. package/public/js/deepAnalysisView.js.map +1 -0
  104. package/public/js/diagramPane.d.ts +8 -0
  105. package/public/js/diagramPane.js +133 -135
  106. package/public/js/diagramPane.js.map +1 -0
  107. package/public/js/diffView.d.ts +6 -0
  108. package/public/js/diffView.js +222 -209
  109. package/public/js/diffView.js.map +1 -0
  110. package/public/js/docsView.d.ts +2 -0
  111. package/public/js/docsView.js +441 -442
  112. package/public/js/docsView.js.map +1 -0
  113. package/public/js/dom.d.ts +189 -0
  114. package/public/js/dom.js +5 -0
  115. package/public/js/dom.js.map +1 -0
  116. package/public/js/fileSourceBrowser.d.ts +5 -0
  117. package/public/js/fileSourceBrowser.js +33 -41
  118. package/public/js/fileSourceBrowser.js.map +1 -0
  119. package/public/js/flameGraph.d.ts +5 -0
  120. package/public/js/flameGraph.js +62 -72
  121. package/public/js/flameGraph.js.map +1 -0
  122. package/public/js/forceGraph.d.ts +10 -0
  123. package/public/js/forceGraph.js +581 -556
  124. package/public/js/forceGraph.js.map +1 -0
  125. package/public/js/heatmap.d.ts +4 -0
  126. package/public/js/heatmap.js +142 -164
  127. package/public/js/heatmap.js.map +1 -0
  128. package/public/js/highlight.d.ts +2 -0
  129. package/public/js/highlight.js +116 -107
  130. package/public/js/highlight.js.map +1 -0
  131. package/public/js/html.d.ts +2 -0
  132. package/public/js/html.js +14 -44
  133. package/public/js/html.js.map +1 -0
  134. package/public/js/insightsView.d.ts +5 -0
  135. package/public/js/insightsView.js +93 -111
  136. package/public/js/insightsView.js.map +1 -0
  137. package/public/js/inspector.d.ts +37 -0
  138. package/public/js/inspector.js +416 -445
  139. package/public/js/inspector.js.map +1 -0
  140. package/public/js/llm.d.ts +113 -0
  141. package/public/js/llm.js +233 -272
  142. package/public/js/llm.js.map +1 -0
  143. package/public/js/mapView.d.ts +3 -0
  144. package/public/js/mapView.js +121 -120
  145. package/public/js/mapView.js.map +1 -0
  146. package/public/js/markdown.d.ts +3 -0
  147. package/public/js/markdown.js +84 -91
  148. package/public/js/markdown.js.map +1 -0
  149. package/public/js/mindmap.d.ts +32 -0
  150. package/public/js/mindmap.js +244 -259
  151. package/public/js/mindmap.js.map +1 -0
  152. package/public/js/mobilePanels.d.ts +5 -0
  153. package/public/js/mobilePanels.js +50 -0
  154. package/public/js/mobilePanels.js.map +1 -0
  155. package/public/js/repoFiles.d.ts +12 -0
  156. package/public/js/repoFiles.js +28 -27
  157. package/public/js/repoFiles.js.map +1 -0
  158. package/public/js/reviewView.d.ts +28 -0
  159. package/public/js/reviewView.js +256 -0
  160. package/public/js/reviewView.js.map +1 -0
  161. package/public/js/sbomView.d.ts +3 -0
  162. package/public/js/sbomView.js +59 -67
  163. package/public/js/sbomView.js.map +1 -0
  164. package/public/js/scanCache.d.ts +16 -0
  165. package/public/js/scanCache.js +67 -65
  166. package/public/js/scanCache.js.map +1 -0
  167. package/public/js/search.d.ts +7 -0
  168. package/public/js/search.js +868 -800
  169. package/public/js/search.js.map +1 -0
  170. package/public/js/searchLocal.d.ts +42 -0
  171. package/public/js/searchLocal.js +87 -0
  172. package/public/js/searchLocal.js.map +1 -0
  173. package/public/js/serverSettings.d.ts +5 -0
  174. package/public/js/serverSettings.js +153 -164
  175. package/public/js/serverSettings.js.map +1 -0
  176. package/public/js/state.d.ts +798 -0
  177. package/public/js/state.js +114 -122
  178. package/public/js/state.js.map +1 -0
  179. package/public/js/tour.d.ts +6 -0
  180. package/public/js/tour.js +5 -7
  181. package/public/js/tour.js.map +1 -0
  182. package/public/js/transitions.d.ts +2 -0
  183. package/public/js/transitions.js +9 -10
  184. package/public/js/transitions.js.map +1 -0
  185. package/public/js/tree.d.ts +12 -0
  186. package/public/js/tree.js +157 -154
  187. package/public/js/tree.js.map +1 -0
  188. package/public/js/workflowsView.d.ts +3 -0
  189. package/public/js/workflowsView.js +15 -22
  190. package/public/js/workflowsView.js.map +1 -0
  191. package/public/search.css +495 -0
  192. package/public/styles.css +163 -346
  193. package/public/workbench.css +166 -0
  194. package/server/apiAuth.d.ts +3 -0
  195. package/server/apiAuth.js +18 -20
  196. package/server/apiAuth.js.map +1 -0
  197. package/server/apiDiff.d.ts +2 -0
  198. package/server/apiDiff.js +20 -18
  199. package/server/apiDiff.js.map +1 -0
  200. package/server/apiDocs.d.ts +2 -0
  201. package/server/apiDocs.js +38 -40
  202. package/server/apiDocs.js.map +1 -0
  203. package/server/apiFile.d.ts +1 -0
  204. package/server/apiFile.js +14 -17
  205. package/server/apiFile.js.map +1 -0
  206. package/server/apiGitBlame.d.ts +2 -0
  207. package/server/apiGitBlame.js +50 -51
  208. package/server/apiGitBlame.js.map +1 -0
  209. package/server/apiMcp.d.ts +4 -0
  210. package/server/apiMcp.js +64 -66
  211. package/server/apiMcp.js.map +1 -0
  212. package/server/apiReview.d.ts +2 -0
  213. package/server/apiReview.js +45 -0
  214. package/server/apiReview.js.map +1 -0
  215. package/server/apiScan.d.ts +5 -0
  216. package/server/apiScan.js +90 -71
  217. package/server/apiScan.js.map +1 -0
  218. package/server/apiSearch.d.ts +33 -0
  219. package/server/apiSearch.js +184 -200
  220. package/server/apiSearch.js.map +1 -0
  221. package/server/apiSettings.d.ts +4 -0
  222. package/server/apiSettings.js +84 -85
  223. package/server/apiSettings.js.map +1 -0
  224. package/server/apiTools.d.ts +3 -0
  225. package/server/apiTools.js +55 -56
  226. package/server/apiTools.js.map +1 -0
  227. package/server/auth.d.ts +5 -0
  228. package/server/auth.js +54 -51
  229. package/server/auth.js.map +1 -0
  230. package/server/config.d.ts +42 -0
  231. package/server/config.js +189 -194
  232. package/server/config.js.map +1 -0
  233. package/server/daemon.d.ts +12 -0
  234. package/server/daemon.js +124 -114
  235. package/server/daemon.js.map +1 -0
  236. package/server/fileSourceNode.d.ts +2 -0
  237. package/server/fileSourceNode.js +34 -36
  238. package/server/fileSourceNode.js.map +1 -0
  239. package/server/gitClone.d.ts +9 -0
  240. package/server/gitClone.js +59 -61
  241. package/server/gitClone.js.map +1 -0
  242. package/server/gitDiff.d.ts +36 -0
  243. package/server/gitDiff.js +271 -169
  244. package/server/gitDiff.js.map +1 -0
  245. package/server/gitHistory.d.ts +12 -0
  246. package/server/gitHistory.js +80 -80
  247. package/server/gitHistory.js.map +1 -0
  248. package/server/gitRemote.d.ts +12 -0
  249. package/server/gitRemote.js +60 -0
  250. package/server/gitRemote.js.map +1 -0
  251. package/server/htmlText.d.ts +4 -0
  252. package/server/htmlText.js +16 -23
  253. package/server/htmlText.js.map +1 -0
  254. package/server/http.d.ts +5 -0
  255. package/server/http.js +27 -30
  256. package/server/http.js.map +1 -0
  257. package/server/httpGuards.d.ts +2 -0
  258. package/server/httpGuards.js +47 -43
  259. package/server/httpGuards.js.map +1 -0
  260. package/server/https.d.ts +34 -0
  261. package/server/https.js +121 -111
  262. package/server/https.js.map +1 -0
  263. package/server/index.d.ts +40 -0
  264. package/server/index.js +139 -147
  265. package/server/index.js.map +1 -0
  266. package/server/layout.d.ts +26 -0
  267. package/server/layout.js +59 -37
  268. package/server/layout.js.map +1 -0
  269. package/server/llmProxy.d.ts +3 -0
  270. package/server/llmProxy.js +137 -135
  271. package/server/llmProxy.js.map +1 -0
  272. package/server/logger.d.ts +38 -0
  273. package/server/logger.js +198 -211
  274. package/server/logger.js.map +1 -0
  275. package/server/mcp/analysis.d.ts +29 -0
  276. package/server/mcp/analysis.js +99 -120
  277. package/server/mcp/analysis.js.map +1 -0
  278. package/server/mcp/http.d.ts +9 -0
  279. package/server/mcp/http.js +128 -137
  280. package/server/mcp/http.js.map +1 -0
  281. package/server/mcp/runner.d.ts +68 -0
  282. package/server/mcp/runner.js +208 -218
  283. package/server/mcp/runner.js.map +1 -0
  284. package/server/mcp/server.d.ts +29 -0
  285. package/server/mcp/server.js +166 -179
  286. package/server/mcp/server.js.map +1 -0
  287. package/server/mcp/standalone.d.ts +1 -0
  288. package/server/mcp/standalone.js +8 -10
  289. package/server/mcp/standalone.js.map +1 -0
  290. package/server/mcp/tools.d.ts +2020 -0
  291. package/server/mcp/tools.js +523 -574
  292. package/server/mcp/tools.js.map +1 -0
  293. package/server/paths.d.ts +3 -0
  294. package/server/paths.js +17 -15
  295. package/server/paths.js.map +1 -0
  296. package/server/pidfile.d.ts +9 -0
  297. package/server/pidfile.js +43 -45
  298. package/server/pidfile.js.map +1 -0
  299. package/server/review.d.ts +5 -0
  300. package/server/review.js +35 -0
  301. package/server/review.js.map +1 -0
  302. package/server/router.d.ts +33 -0
  303. package/server/router.js +191 -197
  304. package/server/router.js.map +1 -0
  305. package/server/scanRequest.d.ts +3 -0
  306. package/server/scanRequest.js +36 -0
  307. package/server/scanRequest.js.map +1 -0
  308. package/server/searchIndex.d.ts +17 -0
  309. package/server/searchIndex.js +83 -80
  310. package/server/searchIndex.js.map +1 -0
  311. package/server/sessions.d.ts +14 -0
  312. package/server/sessions.js +62 -70
  313. package/server/sessions.js.map +1 -0
  314. package/server/startup.d.ts +118 -0
  315. package/server/startup.js +143 -148
  316. package/server/startup.js.map +1 -0
  317. package/server/static.d.ts +6 -0
  318. package/server/static.js +28 -31
  319. package/server/static.js.map +1 -0
  320. package/server/tools/install.d.ts +4 -0
  321. package/server/tools/install.js +176 -185
  322. package/server/tools/install.js.map +1 -0
  323. package/server/tools/parse.d.ts +8 -0
  324. package/server/tools/parse.js +112 -114
  325. package/server/tools/parse.js.map +1 -0
  326. package/server/tools/platform.d.ts +9 -0
  327. package/server/tools/platform.js +49 -47
  328. package/server/tools/platform.js.map +1 -0
  329. package/server/tools/registry.d.ts +137 -0
  330. package/server/tools/registry.js +173 -172
  331. package/server/tools/registry.js.map +1 -0
  332. package/server/tools/scan.d.ts +34 -0
  333. package/server/tools/scan.js +89 -98
  334. package/server/tools/scan.js.map +1 -0
  335. package/server/tools.d.ts +34 -0
  336. package/server/tools.js +94 -107
  337. package/server/tools.js.map +1 -0
  338. package/server/tunnel.d.ts +29 -0
  339. package/server/tunnel.js +61 -66
  340. package/server/tunnel.js.map +1 -0
  341. package/shared/analyzer/docs.d.ts +16 -0
  342. package/shared/analyzer/docs.js +99 -93
  343. package/shared/analyzer/docs.js.map +1 -0
  344. package/shared/analyzer/explainLocal.d.ts +4 -0
  345. package/shared/analyzer/explainLocal.js +122 -142
  346. package/shared/analyzer/explainLocal.js.map +1 -0
  347. package/shared/analyzer/github.d.ts +37 -0
  348. package/shared/analyzer/github.js +79 -0
  349. package/shared/analyzer/github.js.map +1 -0
  350. package/shared/analyzer/graph.d.ts +41 -0
  351. package/shared/analyzer/graph.js +393 -400
  352. package/shared/analyzer/graph.js.map +1 -0
  353. package/shared/analyzer/health.d.ts +33 -0
  354. package/shared/analyzer/health.js +197 -193
  355. package/shared/analyzer/health.js.map +1 -0
  356. package/shared/analyzer/history.d.ts +29 -0
  357. package/shared/analyzer/history.js +110 -111
  358. package/shared/analyzer/history.js.map +1 -0
  359. package/shared/analyzer/jsonConfig.d.ts +2 -0
  360. package/shared/analyzer/jsonConfig.js +61 -0
  361. package/shared/analyzer/jsonConfig.js.map +1 -0
  362. package/shared/analyzer/languages/csharp.d.ts +26 -0
  363. package/shared/analyzer/languages/csharp.js +83 -88
  364. package/shared/analyzer/languages/csharp.js.map +1 -0
  365. package/shared/analyzer/languages/generic.d.ts +23 -0
  366. package/shared/analyzer/languages/generic.js +94 -105
  367. package/shared/analyzer/languages/generic.js.map +1 -0
  368. package/shared/analyzer/languages/go.d.ts +24 -0
  369. package/shared/analyzer/languages/go.js +45 -54
  370. package/shared/analyzer/languages/go.js.map +1 -0
  371. package/shared/analyzer/languages/index.d.ts +6 -0
  372. package/shared/analyzer/languages/index.js +19 -20
  373. package/shared/analyzer/languages/index.js.map +1 -0
  374. package/shared/analyzer/languages/java.d.ts +20 -0
  375. package/shared/analyzer/languages/java.js +73 -78
  376. package/shared/analyzer/languages/java.js.map +1 -0
  377. package/shared/analyzer/languages/javascript.d.ts +12 -0
  378. package/shared/analyzer/languages/javascript.js +258 -209
  379. package/shared/analyzer/languages/javascript.js.map +1 -0
  380. package/shared/analyzer/languages/python.d.ts +23 -0
  381. package/shared/analyzer/languages/python.js +92 -100
  382. package/shared/analyzer/languages/python.js.map +1 -0
  383. package/shared/analyzer/languages/rust.d.ts +17 -0
  384. package/shared/analyzer/languages/rust.js +96 -98
  385. package/shared/analyzer/languages/rust.js.map +1 -0
  386. package/shared/analyzer/languages/typescript.d.ts +11 -0
  387. package/shared/analyzer/languages/typescript.js +117 -116
  388. package/shared/analyzer/languages/typescript.js.map +1 -0
  389. package/shared/analyzer/licenses.d.ts +18 -0
  390. package/shared/analyzer/licenses.js +130 -133
  391. package/shared/analyzer/licenses.js.map +1 -0
  392. package/shared/analyzer/metrics.d.ts +20 -0
  393. package/shared/analyzer/metrics.js +112 -104
  394. package/shared/analyzer/metrics.js.map +1 -0
  395. package/shared/analyzer/pathUtil.d.ts +10 -0
  396. package/shared/analyzer/pathUtil.js +29 -35
  397. package/shared/analyzer/pathUtil.js.map +1 -0
  398. package/shared/analyzer/patterns.d.ts +11 -0
  399. package/shared/analyzer/patterns.js +231 -253
  400. package/shared/analyzer/patterns.js.map +1 -0
  401. package/shared/analyzer/scan.d.ts +62 -0
  402. package/shared/analyzer/scan.js +451 -442
  403. package/shared/analyzer/scan.js.map +1 -0
  404. package/shared/analyzer/scanControl.d.ts +11 -0
  405. package/shared/analyzer/scanControl.js +62 -0
  406. package/shared/analyzer/scanControl.js.map +1 -0
  407. package/shared/analyzer/security.d.ts +18 -0
  408. package/shared/analyzer/security.js +159 -159
  409. package/shared/analyzer/security.js.map +1 -0
  410. package/shared/analyzer/services.d.ts +5 -0
  411. package/shared/analyzer/services.js +141 -138
  412. package/shared/analyzer/services.js.map +1 -0
  413. package/shared/analyzer/stack.d.ts +6 -0
  414. package/shared/analyzer/stack.js +134 -141
  415. package/shared/analyzer/stack.js.map +1 -0
  416. package/shared/analyzer/tour.d.ts +2 -0
  417. package/shared/analyzer/tour.js +45 -53
  418. package/shared/analyzer/tour.js.map +1 -0
  419. package/shared/analyzer/util.d.ts +8 -0
  420. package/shared/analyzer/util.js +130 -76
  421. package/shared/analyzer/util.js.map +1 -0
  422. package/shared/analyzer/workflows.d.ts +8 -0
  423. package/shared/analyzer/workflows.js +139 -134
  424. package/shared/analyzer/workflows.js.map +1 -0
  425. package/shared/contracts.d.ts +250 -0
  426. package/shared/contracts.js +2 -0
  427. package/shared/contracts.js.map +1 -0
  428. package/shared/diagram/aiFacts.d.ts +35 -0
  429. package/shared/diagram/aiFacts.js +102 -105
  430. package/shared/diagram/aiFacts.js.map +1 -0
  431. package/shared/diagram/aiMermaid.d.ts +5 -0
  432. package/shared/diagram/aiMermaid.js +46 -45
  433. package/shared/diagram/aiMermaid.js.map +1 -0
  434. package/shared/diagram/atlas.d.ts +16 -0
  435. package/shared/diagram/atlas.js +51 -60
  436. package/shared/diagram/atlas.js.map +1 -0
  437. package/shared/diagram/mermaid.d.ts +43 -0
  438. package/shared/diagram/mermaid.js +348 -370
  439. package/shared/diagram/mermaid.js.map +1 -0
  440. package/shared/review/contracts.d.ts +95 -0
  441. package/shared/review/contracts.js +2 -0
  442. package/shared/review/contracts.js.map +1 -0
  443. package/shared/review/review.d.ts +10 -0
  444. package/shared/review/review.js +184 -0
  445. package/shared/review/review.js.map +1 -0
  446. package/shared/search/query.d.ts +32 -0
  447. package/shared/search/query.js +395 -388
  448. package/shared/search/query.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/public/js/search.ts"],"names":[],"mappings":"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","sourcesContent":["// The search palette: one query language over files, symbols and contents.\n//\n// Three passes, in the order that keeps it feeling instant:\n//\n// 1. Files and symbols come from the scan the tab already holds, so they are\n// filtered and ranked synchronously on every keystroke. No round trip, no\n// spinner, no waiting on a server to tell you the file you are looking at\n// is the file you are looking at.\n// 2. Code contents come from `/api/search`, which owns the TF-IDF index built\n// once when the scan finished. That request is debounced, abortable and\n// *sequenced*: an answer for a query you have already moved on from can\n// never paint over the newer one.\n// 3. The query itself is parsed by `shared/search/query.js` — the same module\n// the server parses it with — so `ext:js` filters the list here and the\n// contents there, and the two cannot drift apart. That module's header is\n// the grammar reference.\n//\n// The shell is built by this module, into the `#searchOverlay` element that is\n// already in `index.html`. The previous version looked that element up, found\n// it, and returned early on the assumption that something had filled it in —\n// nothing had, so `input` was null and the first keystroke after opening the\n// palette threw. Building the contents here is what makes the palette work at\n// all; the empty overlay in the page is only a placeholder for position.\n//\n// All DOM work happens inside `initSearch`. The module is importable in Node,\n// which is the rule that keeps it testable — see Agent.md.\n\nimport { escapeHtml } from './html.js';\nimport { eventElement } from './dom.js';\nimport { buildLocalSearchIndex, searchLocalIndex } from './searchLocal.js';\nimport {\n highlightRanges, matchesPathFilters, parseQuery, queryIsEmpty,\n removeClause,\n} from '/shared/search/query.js';\n\n// Remembering what you searched for is a courtesy, never a hard dependency.\nconst RECENTS_KEY = 'onboarder:recent-searches';\nconst MAX_RECENTS = 8;\n\n// Rows drawn per group. The *counts* stay honest — the header says how many\n// there are — but the palette is for jumping somewhere, not for scrolling a\n// list of four hundred files.\nconst PREVIEW_LIMIT = 40;\nconst CODE_LIMIT = 40;\n\n// Long enough that a fast typist makes one request instead of nine, short\n// enough that a slow one never notices.\nconst DEBOUNCE_MS = 140;\n\nconst EXAMPLES = [\n { query: 'ext:js createServer', hint: 'a function, in one language' },\n { query: 'is:test', hint: 'tests only' },\n { query: 'path:server -vendor', hint: 'somewhere, minus a folder' },\n { query: '\"exact phrase\"', hint: 'words in that order' },\n { query: '/create.*Router/', hint: 'a regular expression' },\n { query: 'kind:class', hint: 'declarations of one kind' },\n];\n\n// localStorage throws in private windows, and in browser settings that forbid\n// it. A search box that refused to open because it could not remember your last\n// query would be an absurd way to fail, so every access is guarded.\nfunction readRecents() {\n try {\n const raw = localStorage.getItem(RECENTS_KEY);\n const list = raw ? JSON.parse(raw) : [];\n if (!Array.isArray(list)) return [];\n return list.filter((entry) => typeof entry === 'string' && entry.trim()).slice(0, MAX_RECENTS);\n } catch {\n return [];\n }\n}\n\nfunction writeRecents(list) {\n try {\n localStorage.setItem(RECENTS_KEY, JSON.stringify(list.slice(0, MAX_RECENTS)));\n } catch {\n /* remembering is optional */\n }\n}\n\nfunction extensionOf(path) {\n const name = path.split('/').pop() || '';\n const dot = name.lastIndexOf('.');\n if (dot <= 0) return 'FILE';\n return name.slice(dot + 1).toUpperCase();\n}\n\n// The human word for each clause the parser found, used on the chips row.\nconst CLAUSE_LABELS = {\n ext: 'ext', path: 'path', kind: 'kind', is: 'is',\n neg: 'not', phrase: 'phrase', regex: 'regex',\n};\n\n// One palette is live at a time, and one Cmd+K listener serves them all — it is\n// installed once, on the first `initSearch`, and routes to the newest controller.\nlet keyListenerAttached = false;\nlet activeInstance = null;\n\nexport function initSearch(files = [], options) {\n activeInstance?.destroy();\n const opts = options || {};\n let fileList = Array.isArray(files) ? files : [];\n let localIndex = buildLocalSearchIndex(fileList);\n const localCache = new Map<string, ReturnType<typeof searchLocalIndex>>();\n const listeners = new AbortController();\n let localFrame: number | null = null;\n let focusBefore: HTMLElement | null = null;\n let selectedRow: HTMLElement | null = null;\n const background = new Map<HTMLElement, boolean>();\n let scanIdProvider = opts.getScanId || (() => opts.scanId || null);\n\n let isShowing = false;\n let overlay = null;\n let input = null;\n let modeBar = null;\n let chipsBar = null;\n let chipMarkup = '';\n let resultsList = null;\n let statusBar = null;\n\n let activeMode = 'all'; // 'all' | 'files' | 'symbols' | 'code'\n let caseSensitive = false;\n let selectedIndex = 0;\n let groups = []; // what is rendered, in order\n let flat = []; // `groups` flattened — what the arrow keys walk\n let localFiles = [];\n let localSymbols = [];\n let localCounts = { files: 0, symbols: 0 };\n let code = null; // the last /api/search payload\n let codeLoading = false;\n let codeError = null;\n let parseError = null;\n let requestSeq = 0; // every request gets a number; only the newest paints\n let inFlight = null; // the AbortController for the request above\n let debounceTimer = null;\n let recents = [];\n let lastQuery = '';\n\n function getPath(file) {\n if (!file) return '';\n return typeof file === 'string' ? file : file.path || '';\n }\n\n // The shell is built once and then reused for the session. It goes *into* the\n // `#searchOverlay` element the page already has rather than replacing it, so\n // the markup in `index.html` stays the single source of position and z-index.\n function buildShell() {\n overlay = document.getElementById('searchOverlay');\n if (!overlay) {\n overlay = document.createElement('div');\n overlay.id = 'searchOverlay';\n overlay.className = 'search-overlay';\n document.body.appendChild(overlay);\n }\n\n if (overlay.querySelector('.search-modal')) {\n input = overlay.querySelector('.search-input');\n modeBar = overlay.querySelector('.search-modes');\n chipsBar = overlay.querySelector('.search-chips');\n resultsList = overlay.querySelector('.search-results');\n statusBar = overlay.querySelector('.search-status');\n return;\n }\n\n overlay.hidden = true;\n overlay.setAttribute('role', 'dialog');\n overlay.setAttribute('aria-modal', 'true');\n overlay.setAttribute('aria-label', 'Search this codebase');\n overlay.innerHTML = `<div class=\"search-modal\">\n <div class=\"search-header\">\n <div class=\"search-inputrow\">\n <span class=\"search-icon\" aria-hidden=\"true\"><svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.3-4.3\"/></svg></span>\n <input class=\"search-input\" type=\"text\" role=\"combobox\" aria-expanded=\"true\"\n aria-controls=\"searchResultList\" aria-autocomplete=\"list\" autocomplete=\"off\"\n aria-label=\"Search files, symbols and contents\" spellcheck=\"false\" placeholder=\"Search files, symbols and contents\\u2026\">\n <button class=\"search-toggle\" data-toggle=\"case\" title=\"Match case\" aria-label=\"Match case\" aria-pressed=\"false\">Aa</button>\n <button class=\"search-close\" type=\"button\" aria-label=\"Close search\" title=\"Close search\">×</button>\n </div>\n <div class=\"search-modes\" role=\"tablist\" aria-label=\"Result kinds\"></div>\n <div class=\"search-chips\"></div>\n </div>\n <div class=\"search-results\" id=\"searchResultList\" role=\"listbox\" aria-label=\"Search results\"></div>\n <div class=\"search-status\"></div>\n</div>`;\n\n input = overlay.querySelector('.search-input');\n modeBar = overlay.querySelector('.search-modes');\n chipsBar = overlay.querySelector('.search-chips');\n resultsList = overlay.querySelector('.search-results');\n statusBar = overlay.querySelector('.search-status');\n\n input.addEventListener('input', (event: InputEvent) => {\n if (event.isComposing) return;\n selectedIndex = 0;\n scheduleLocalSearch();\n }, { signal: listeners.signal });\n input.addEventListener('compositionend', () => {\n selectedIndex = 0;\n scheduleLocalSearch();\n }, { signal: listeners.signal });\n input.addEventListener('keydown', onInputKeyDown, { signal: listeners.signal });\n overlay.addEventListener('keydown', onDialogKeyDown, { signal: listeners.signal });\n\n // One delegated listener for the whole palette. Every row in it is rebuilt\n // on each keystroke, so per-row listeners would be churn; the shape of the\n // markup is the only contract this needs.\n overlay.addEventListener('click', (event) => {\n if (event.target === overlay) return hide();\n const target = eventElement(event);\n if (!target) return;\n if (target.closest('.search-close')) return hide();\n\n const mode = eventElement(event)?.closest<HTMLElement>('.search-mode-chip');\n if (mode) return setMode(mode.dataset.mode);\n\n const toggle = eventElement(event)?.closest<HTMLElement>('.search-toggle');\n if (toggle) return toggleCase();\n\n const remove = eventElement(event)?.closest<HTMLElement>('.search-chip-remove');\n if (remove) return removeChip(Number(remove.dataset.clause));\n\n const row = eventElement(event)?.closest<HTMLElement>('.search-result');\n if (row) {\n const index = Number(row.dataset.index);\n if (Number.isFinite(index) && flat[index]) select(flat[index]);\n }\n return undefined;\n }, { signal: listeners.signal });\n\n overlay.addEventListener('mouseover', (event) => {\n const row = eventElement(event)?.closest<HTMLElement>('.search-result');\n if (!row) return;\n const index = Number(row.dataset.index);\n if (!Number.isFinite(index) || index === selectedIndex) return;\n selectedIndex = index;\n paintSelection(false);\n }, { signal: listeners.signal });\n }\n\n // ---- the pipeline -------------------------------------------------------\n\n // The symbol index belongs to the scan; repeated queries reuse their bounded\n // previews rather than extracting declarations and sorting every match again.\n function collectLocal(parsed) {\n const key = `${caseSensitive}:${parsed.raw}`;\n const cached = localCache.get(key);\n if (cached) return cached;\n const result = searchLocalIndex(localIndex, parsed, PREVIEW_LIMIT);\n if (localCache.size >= 12) localCache.delete(localCache.keys().next().value);\n localCache.set(key, result);\n return result;\n }\n\n // Coalesce keys in the same frame and invalidate wire results immediately.\n function scheduleLocalSearch() {\n requestSeq++;\n inFlight?.abort(); inFlight = null;\n clearTimeout(debounceTimer);\n if (localFrame !== null) cancelAnimationFrame(localFrame);\n localFrame = requestAnimationFrame(() => { localFrame = null; if (isShowing) runSearch(); });\n }\n\n // Is a content search worth a round trip? In a single-kind view, only that\n // kind matters. In the combined view a filter-only query — `is:test`, say —\n // is already answered by the file list, so asking the server would be a\n // request whose answer we would throw away.\n function wantsCode(parsed) {\n if (queryIsEmpty(parsed) || !scanIdProvider()) return false;\n if (activeMode === 'files' || activeMode === 'symbols') return false;\n if (activeMode === 'code') return true;\n return parsed.terms.some((term) => term.length >= 2)\n || parsed.phrases.length > 0 || parsed.regex !== null;\n }\n\n function scheduleCodeSearch(raw) {\n clearTimeout(debounceTimer);\n codeLoading = true;\n debounceTimer = setTimeout(() => {\n sendCodeSearch(raw);\n }, DEBOUNCE_MS);\n }\n\n // The sequencing is the point. `requestSeq` is bumped by every keystroke *and*\n // by every send, and a response is only allowed to paint if its number is\n // still the current one. Without that, a slow answer to a short query could\n // land after a fast answer to a longer one, and the palette would show results\n // for something you had already stopped typing — the bug that made fast\n // typing untrustworthy.\n async function sendCodeSearch(raw) {\n const scanId = scanIdProvider();\n if (!scanId) {\n codeLoading = false;\n render(currentParsed);\n return;\n }\n\n const seq = ++requestSeq;\n const controller = new AbortController();\n inFlight = controller;\n\n try {\n const res = await fetch('/api/search', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n signal: controller.signal,\n body: JSON.stringify({ scanId, query: raw, limit: CODE_LIMIT, caseSensitive }),\n });\n if (seq !== requestSeq) return;\n\n const data = await res.json().catch(() => null);\n if (seq !== requestSeq) return;\n\n if (!res.ok) throw new Error(data?.error || `Search failed (${res.status}).`);\n if (!data) {\n code = null;\n codeError = 'The search endpoint returned nothing readable.';\n return;\n }\n code = data;\n codeError = data.error || null;\n } catch (err) {\n // An aborted request is not a failure; it is the newer query arriving.\n if (seq !== requestSeq || (err && err.name === 'AbortError')) return;\n code = null;\n codeError = 'Could not search file contents: ' + ((err && err.message) || err);\n } finally {\n if (seq === requestSeq) {\n codeLoading = false;\n inFlight = null;\n render(currentParsed);\n }\n }\n }\n\n // The whole keystroke-to-pixels path. Local work first, so results are on\n // screen before the request for the slower half has even been sent.\n function runSearch() {\n if (localFrame !== null) { cancelAnimationFrame(localFrame); localFrame = null; }\n const raw = input ? input.value.trim() : '';\n lastQuery = raw;\n const parsed = parsedQuery(raw);\n currentParsed = parsed;\n parseError = parsed.error;\n\n const local = collectLocal(parsed);\n localFiles = local.files;\n localSymbols = local.symbols;\n localCounts = local.counts;\n\n // Whatever was asked before this keystroke is stale now, on the wire or not.\n requestSeq++;\n if (inFlight) {\n inFlight.abort();\n inFlight = null;\n }\n clearTimeout(debounceTimer);\n code = null;\n codeError = null;\n codeLoading = false;\n\n if (!parseError && wantsCode(parsed)) scheduleCodeSearch(raw);\n render(parsed);\n }\n\n // ---- what to show -------------------------------------------------------\n\n function flatten(list) {\n const out = [];\n for (const group of list) {\n for (const item of group.items) out.push(item);\n }\n return out;\n }\n\n // A content hit on the line a symbol row already names is the same\n // destination twice, and the symbol row is the more useful label (\"createRouter\n // in server/router.js, line 90\" beats \"a line that contains createRouter\").\n function codeMatches() {\n if (!code || !Array.isArray(code.results)) return [];\n const claimed = new Set(localSymbols.map((sym) => `${sym.path}:${sym.line || ''}`));\n return code.results\n .filter((hit) => hit && hit.path && !claimed.has(`${hit.path}:${hit.line || ''}`))\n .map((hit) => ({\n type: 'code',\n path: hit.path,\n line: hit.line,\n snippet: hit.snippet || '',\n score: hit.score || 0,\n }));\n }\n\n function buildGroups(parsed) {\n const list = [];\n\n if (queryIsEmpty(parsed)) {\n // Nothing typed: offer what was typed before, then the way in, then the\n // syntax — which is the only place the advanced grammar is discoverable.\n if (recents.length) {\n list.push({\n key: 'recents',\n label: 'Recent searches',\n items: recents.map((query, i) => ({ type: 'recent', query, score: MAX_RECENTS - i })),\n });\n }\n if (fileList.length) {\n list.push({\n key: 'start',\n label: 'Start somewhere',\n items: fileList.slice(0, 8).map((file) => ({ type: 'file', path: getPath(file), score: 1 })),\n });\n }\n list.push({\n key: 'examples',\n label: 'Search syntax',\n items: EXAMPLES.map((example) => ({\n type: 'example', query: example.query, hint: example.hint, score: 1,\n })),\n });\n groups = list;\n flat = flatten(list);\n return;\n }\n\n const showFiles = activeMode === 'all' || activeMode === 'files';\n const showSymbols = activeMode === 'all' || activeMode === 'symbols';\n const showCode = activeMode === 'all' || activeMode === 'code';\n\n if (showFiles && localFiles.length) {\n list.push({ key: 'files', label: 'Files', total: localCounts.files, items: localFiles.slice(0, PREVIEW_LIMIT) });\n }\n if (showSymbols && localSymbols.length) {\n list.push({ key: 'symbols', label: 'Symbols', total: localCounts.symbols, items: localSymbols.slice(0, PREVIEW_LIMIT) });\n }\n if (showCode) {\n const hits = codeMatches();\n if (hits.length) {\n list.push({\n key: 'code',\n label: 'Code matches',\n total: (code && code.total) || hits.length,\n items: hits.slice(0, PREVIEW_LIMIT),\n });\n }\n }\n\n groups = list;\n flat = flatten(list);\n }\n\n // ---- painting -----------------------------------------------------------\n\n // Every span the query matched, not just the first. The old highlighter\n // stopped at one occurrence, which made a two-word query look like it had\n // only matched half of itself.\n function highlightAll(text, parsed) {\n const value = String(text ?? '');\n const ranges = highlightRanges(value, parsed);\n if (!ranges.length) return escapeHtml(value);\n let out = '';\n let at = 0;\n for (const [start, end] of ranges) {\n if (start < at) continue; // merged already, but never double-wrap\n out += escapeHtml(value.slice(at, start));\n out += `<mark class=\"search-match\">${escapeHtml(value.slice(start, end))}</mark>`;\n at = end;\n }\n return out + escapeHtml(value.slice(at));\n }\n\n function render(parsed) {\n if (!isShowing || !overlay || !resultsList) return;\n buildGroups(parsed);\n renderModes(parsed);\n renderChips(parsed);\n renderRows(parsed);\n renderStatus(parsed);\n }\n\n function renderModes(parsed) {\n if (!modeBar) return;\n const empty = queryIsEmpty(parsed);\n const localSum = localCounts.files + localCounts.symbols;\n const codeTotal = (code && code.total) || 0;\n const codeText = codeLoading ? '\\u2026' : (code ? String(codeTotal) : '');\n const allText = codeLoading ? `${localSum}+` : String(localSum + codeTotal);\n\n const chips = [\n ['all', 'All', allText],\n ['files', 'Files', String(localCounts.files)],\n ['symbols', 'Symbols', String(localCounts.symbols)],\n ['code', 'Code', codeText],\n ];\n\n if (!modeBar.children.length) modeBar.innerHTML = chips.map(([mode, label]) => `<button class=\"search-mode-chip\" data-mode=\"${mode}\" role=\"tab\"><span>${label}</span><span class=\"search-mode-count\"></span></button>`).join('');\n for (const [mode, , count] of chips) {\n const button = modeBar.querySelector(`[data-mode=\"${mode}\"]`);\n const active = mode === activeMode;\n button.classList.toggle('is-active', active); button.setAttribute('aria-selected', String(active));\n button.tabIndex = active ? 0 : -1;\n const badge = button.querySelector('.search-mode-count'); badge.hidden = empty || count === ''; badge.textContent = count;\n }\n const toggle = overlay.querySelector('.search-toggle');\n toggle.classList.toggle('is-active', caseSensitive); toggle.setAttribute('aria-pressed', String(caseSensitive));\n }\n\n function renderChips(parsed) {\n if (!chipsBar) return;\n // Terms are deliberately not chipped: they are already legible in the input,\n // and a chip per word would double the width of the row to say what you can\n // see. Filters, phrases and regexes are the decisions worth showing — and\n // worth being able to take back with one click. The case toggle is not a\n // clause, so it lives beside the input rather than here; without a chip of\n // its own, an empty query leaves this row hidden.\n const parts = queryIsEmpty(parsed)\n ? []\n : parsed.clauses\n .map((clause, index) => ({ clause, index }))\n .filter((entry) => entry.clause.kind !== 'term')\n .map(({ clause, index }) => {\n const kind = CLAUSE_LABELS[clause.kind] || clause.kind;\n return `<span class=\"search-chip\"><span class=\"search-chip-kind\">${escapeHtml(kind)}</span>`\n + `${escapeHtml(clause.raw)}<button class=\"search-chip-remove\" data-clause=\"${index}\" `\n + `title=\"Remove this filter\" aria-label=\"Remove this filter\">\\u00d7</button></span>`;\n });\n\n const markup = parts.join('');\n // A content response should not replace a filter button that has focus.\n if (markup !== chipMarkup) {\n chipsBar.innerHTML = markup;\n chipMarkup = markup;\n }\n chipsBar.hidden = !parts.length;\n }\n\n function rowHtml(item, index, parsed) {\n const on = index === selectedIndex;\n const attrs = `class=\"search-result is-${item.type}${on ? ' is-selected' : ''}\" `\n + `role=\"option\" aria-selected=\"${on}\" id=\"search-option-${index}\" data-index=\"${index}\"`;\n\n if (item.type === 'recent') {\n return `<div ${attrs}><div class=\"search-item-main\">`\n + `<span class=\"search-ext-badge is-recent\">\\u21ba</span>`\n + `<span class=\"search-title\"><span class=\"search-name\">${escapeHtml(item.query)}</span>`\n + `<span class=\"search-dir\">recent search</span></span></div></div>`;\n }\n\n if (item.type === 'example') {\n return `<div ${attrs}><div class=\"search-item-main\">`\n + `<span class=\"search-ext-badge is-syntax\">/</span>`\n + `<span class=\"search-title\"><span class=\"search-name\">${escapeHtml(item.query)}</span>`\n + `<span class=\"search-dir\">${escapeHtml(item.hint || '')}</span></span></div></div>`;\n }\n\n const path = item.path;\n const name = path.split('/').pop();\n const dir = path.includes('/') ? path.slice(0, path.lastIndexOf('/')) : '';\n\n if (item.type === 'symbol') {\n return `<div ${attrs}><div class=\"search-item-main\">`\n + `<span class=\"search-ext-badge is-symbol\">SYM</span>`\n + `<span class=\"search-title\"><span class=\"search-name\">${highlightAll(item.name, parsed)}</span>`\n + `<span class=\"search-dir\">${escapeHtml(path)}${item.line ? ' \\u00b7 L' + item.line : ''}</span></span>`\n + `<span class=\"search-type-tag is-sym\">${escapeHtml(item.kind || 'symbol')}</span>`\n + `</div></div>`;\n }\n\n if (item.type === 'code') {\n const snippet = item.snippet\n ? `<div class=\"search-snippet\"><code>${highlightAll(item.snippet, parsed)}</code></div>`\n : '';\n return `<div ${attrs}><div class=\"search-item-main\">`\n + `<span class=\"search-ext-badge is-code\">CODE</span>`\n + `<span class=\"search-title\"><span class=\"search-name\">${escapeHtml(name)}</span>`\n + `<span class=\"search-dir\">${escapeHtml(path)}${item.line ? ' \\u00b7 Line ' + item.line : ''}</span></span>`\n + `<span class=\"search-type-tag is-code\">match</span>`\n + `</div>${snippet}</div>`;\n }\n\n return `<div ${attrs}><div class=\"search-item-main\">`\n + `<span class=\"search-ext-badge\">${escapeHtml(extensionOf(path))}</span>`\n + `<span class=\"search-title\"><span class=\"search-name\">${highlightAll(name, parsed)}</span>`\n + `<span class=\"search-dir\">${escapeHtml(dir)}</span></span>`\n + `<span class=\"search-type-tag\">file</span></div></div>`;\n }\n\n function renderRows(parsed) {\n if (!resultsList) return;\n selectedRow = null;\n input?.removeAttribute('aria-activedescendant');\n if (!groups.length) {\n resultsList.innerHTML = emptyState(parsed);\n return;\n }\n if (selectedIndex >= flat.length) selectedIndex = Math.max(0, flat.length - 1);\n\n let index = -1;\n resultsList.innerHTML = groups.map((group) => {\n const rows = group.items.map((item) => {\n index++;\n return rowHtml(item, index, parsed);\n }).join('');\n const count = group.total === undefined ? group.items.length : group.total;\n return `<div class=\"search-group\" role=\"group\" aria-label=\"${escapeHtml(group.label)}\">`\n + `<div class=\"search-group-head\"><span>${escapeHtml(group.label)}</span>`\n + `<span class=\"search-group-count\">${escapeHtml(String(count))}</span></div>`\n + `${rows}</div>`;\n }).join('');\n selectedRow = resultsList.querySelector(`[data-index=\"${selectedIndex}\"]`);\n if (selectedRow) input.setAttribute('aria-activedescendant', selectedRow.id);\n }\n\n function emptyState(parsed) {\n if (parseError) {\n return '<div class=\"search-empty\"><strong>That pattern will not compile.</strong>'\n + `<div class=\"search-empty-hint\">${escapeHtml(parseError)}</div></div>`;\n }\n if (codeLoading) {\n return '<div class=\"search-empty\"><span class=\"search-spinner\"></span> Searching file contents\\u2026</div>';\n }\n if (queryIsEmpty(parsed)) {\n return '<div class=\"search-empty\">Type to search this codebase.</div>';\n }\n return `<div class=\"search-empty\">Nothing matched <code>${escapeHtml(parsed.raw.trim())}</code>.`\n + '<div class=\"search-empty-hint\">Try fewer words, or drop a filter — <code>ext:</code>, '\n + '<code>path:</code> and <code>-word</code> all narrow the same list, and <kbd>Alt + ←/→</kbd> '\n + 'switches what kind of result you are looking at.</div></div>';\n }\n\n function renderStatus(parsed) {\n if (!statusBar) return;\n const bits = [];\n\n if (parseError) {\n bits.push(`<span class=\"search-err\">${escapeHtml(parseError)}</span>`);\n } else if (codeError) {\n bits.push(`<span class=\"search-err\">${escapeHtml(codeError)}</span>`);\n } else if (queryIsEmpty(parsed)) {\n bits.push('Type to search. <kbd>Tab</kbd> moves focus, <kbd>Esc</kbd> clears or closes.');\n } else {\n const total = localCounts.files + localCounts.symbols + ((code && code.total) || 0);\n bits.push(`${total} match${total === 1 ? '' : 'es'}`);\n if (codeLoading) bits.push('<span class=\"search-spinner\"></span> searching contents');\n if (code) {\n bits.push(`${code.indexed || 0} files indexed`);\n if (code.capped) bits.push(`showing the top ${code.results.length}`);\n // Saying that the filters are enforced is the honest counterpart to the\n // forgiving ranking a plain word search still gets.\n if (code.advanced) bits.push('filters enforced');\n }\n const skipped = code && code.stats && code.stats.skipped;\n if (skipped) {\n const count = Object.keys(skipped).reduce((sum, key) => sum + (skipped[key] || 0), 0);\n if (count) bits.push(`${count} not indexed`);\n }\n }\n\n statusBar.innerHTML = `<div class=\"search-status-line\">${bits.join('<span class=\"search-sep\">\\u00b7</span>')}</div>`\n + '<div class=\"search-keys\"><span><kbd>\\u2191</kbd><kbd>\\u2193</kbd> move</span>'\n + '<span><kbd>\\u21b5</kbd> open</span><span><kbd>\\u2318\\u21b5</kbd> code</span>'\n + '<span><kbd>alt</kbd><kbd>←/→</kbd> kind</span><span><kbd>esc</kbd> close</span></div>';\n }\n\n // ---- interaction --------------------------------------------------------\n\n let currentParsed = parseQuery('');\n\n function parsedQuery(raw) {\n return parseQuery(raw, { caseSensitive });\n }\n\n function moveSelection(delta) {\n if (!flat.length) return;\n selectedIndex = Math.min(Math.max(selectedIndex + delta, 0), flat.length - 1);\n paintSelection();\n }\n\n function paintSelection(scroll = true) {\n if (!resultsList) return;\n const next = resultsList.querySelector(`[data-index=\"${selectedIndex}\"]`);\n if (selectedRow && selectedRow !== next) {\n selectedRow.classList.remove('is-selected'); selectedRow.setAttribute('aria-selected', 'false');\n }\n selectedRow = next;\n if (!next) { input.removeAttribute('aria-activedescendant'); return; }\n next.classList.add('is-selected'); next.setAttribute('aria-selected', 'true');\n input.setAttribute('aria-activedescendant', next.id);\n if (scroll) {\n const row = next.getBoundingClientRect(); const list = resultsList.getBoundingClientRect();\n if (row.bottom > list.bottom) resultsList.scrollTop += row.bottom - list.bottom;\n else if (row.top < list.top) resultsList.scrollTop -= list.top - row.top;\n }\n }\n\n function onDialogKeyDown(event: KeyboardEvent) {\n if (event.key === 'Escape' && event.target !== input) { event.preventDefault(); event.stopPropagation(); hide(); return; }\n const tab = eventElement(event)?.closest<HTMLElement>('.search-mode-chip');\n if (tab && ['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key)) {\n event.preventDefault(); event.stopPropagation();\n const tabs = [...modeBar.querySelectorAll('.search-mode-chip')] as HTMLElement[];\n const at = tabs.indexOf(tab);\n const next = event.key === 'Home' ? 0 : event.key === 'End' ? tabs.length - 1\n : (at + (event.key === 'ArrowLeft' ? -1 : 1) + tabs.length) % tabs.length;\n setMode(tabs[next].dataset.mode); tabs[next].focus({ preventScroll: true });\n return;\n }\n // Tab follows the controls and wraps inside the modal.\n if (event.key !== 'Tab') return;\n const focusable = [...overlay.querySelectorAll('input, button')].filter((el: HTMLElement) => !el.hidden && el.getClientRects().length) as HTMLElement[];\n const at = focusable.indexOf(document.activeElement as HTMLElement);\n event.preventDefault(); event.stopPropagation();\n focusable[(at + (event.shiftKey ? -1 : 1) + focusable.length) % focusable.length]?.focus({ preventScroll: true });\n }\n\n function onInputKeyDown(event) {\n const key = event.key;\n if (event.isComposing) return;\n if (localFrame !== null && ['ArrowDown', 'ArrowUp', 'Home', 'End', 'Enter'].includes(key)) runSearch();\n if (key === 'Tab') return;\n if (event.altKey && (key === 'ArrowLeft' || key === 'ArrowRight')) { event.preventDefault(); event.stopPropagation(); return cycleMode(key === 'ArrowLeft' ? -1 : 1); }\n // The palette is modal, so the keys it handles stop here instead of reaching\n // the window listener — otherwise one Escape would clear the query and close\n // the palette in the same keystroke.\n if (key === 'ArrowDown' || key === 'ArrowUp' || key === 'Tab' || key === 'Home'\n || key === 'End' || key === 'Enter' || key === 'Escape') {\n event.stopPropagation();\n }\n\n if (key === 'ArrowDown') { event.preventDefault(); return moveSelection(1); }\n if (key === 'ArrowUp') { event.preventDefault(); return moveSelection(-1); }\n if (key === 'Home') { event.preventDefault(); selectedIndex = 0; return paintSelection(); }\n if (key === 'End') {\n event.preventDefault();\n selectedIndex = Math.max(0, flat.length - 1);\n return paintSelection();\n }\n\n if (key === 'Enter') {\n event.preventDefault();\n const item = flat[selectedIndex];\n if (item) select(item, { forceCode: event.metaKey || event.ctrlKey });\n return undefined;\n }\n\n if (key === 'Escape') {\n event.preventDefault();\n // One Escape clears the query, a second closes the palette. Losing a long\n // query to a stray keypress is worse than one more keystroke to close.\n if (input && input.value) {\n input.value = '';\n selectedIndex = 0;\n return runSearch();\n }\n return hide();\n }\n\n if (key === 'Backspace' && input && !input.value) {\n // Backspace on an empty input takes back the last filter, the way a token\n // editor does. There is nothing else for the key to mean here.\n const removable = currentParsed.clauses.filter((clause) => clause.kind !== 'term');\n if (removable.length) {\n event.preventDefault();\n return removeChip(currentParsed.clauses.indexOf(removable[removable.length - 1]));\n }\n }\n return undefined;\n }\n\n function setMode(mode) {\n if (!mode || mode === activeMode) return;\n activeMode = mode;\n selectedIndex = 0;\n runSearch();\n if (input) input.focus();\n }\n\n function cycleMode(delta) {\n const order = ['all', 'files', 'symbols', 'code'];\n const at = order.indexOf(activeMode);\n setMode(order[(at + delta + order.length) % order.length]);\n }\n\n function toggleCase() {\n caseSensitive = !caseSensitive;\n selectedIndex = 0;\n runSearch();\n if (input) input.focus();\n }\n\n function useQuery(query) {\n if (!input) return;\n input.value = query;\n selectedIndex = 0;\n runSearch();\n input.focus();\n }\n\n function removeChip(index) {\n if (!input) return;\n const clause = currentParsed.clauses[index];\n if (!clause) return;\n input.value = removeClause(input.value, clause);\n selectedIndex = 0;\n runSearch();\n input.focus();\n }\n\n function rememberSearch(query) {\n const value = (query || '').trim();\n if (!value) return;\n const list = recents.filter((entry) => entry !== value);\n list.unshift(value);\n recents = list.slice(0, MAX_RECENTS);\n writeRecents(recents);\n }\n\n // Where a result takes you. A content match belongs in the Code tab at the\n // line it matched, and a symbol belongs there too, at the line it was\n // declared — both are facts the scan already knows, so neither should dump\n // you at line 1. A file's natural home is the graph. Cmd+Enter overrides all\n // of it for when the graph is not what you meant.\n function select(item, flags?: any) {\n if (!item) return;\n if (item.type === 'example' || item.type === 'recent') return useQuery(item.query);\n\n rememberSearch(lastQuery);\n const toCode = !!((flags && flags.forceCode)\n || item.type === 'symbol' || item.type === 'code');\n hide(false);\n document.dispatchEvent(new CustomEvent('search-select', {\n detail: { path: item.path, line: item.line, target: toCode ? 'code' : 'files' },\n }));\n return undefined;\n }\n\n function show(opener?: HTMLElement) {\n if (isShowing) return;\n buildShell();\n // Pointer clicks do not focus buttons in WebKit; remember the explicit trigger.\n focusBefore = opener || (document.activeElement instanceof HTMLElement ? document.activeElement : null);\n recents = readRecents(); selectedIndex = 0;\n for (const el of document.querySelectorAll<HTMLElement>('.topbar, #landing, #explorer')) { background.set(el, el.inert); el.inert = true; }\n overlay.hidden = false; isShowing = true;\n if (input) input.value = '';\n runSearch(); input?.focus({ preventScroll: true });\n document.dispatchEvent(new CustomEvent('search-visibility', { detail: { visible: true } }));\n }\n\n function hide(restoreFocus = true) {\n const wasShowing = isShowing;\n requestSeq++;\n inFlight?.abort(); inFlight = null;\n clearTimeout(debounceTimer);\n if (localFrame !== null) { cancelAnimationFrame(localFrame); localFrame = null; }\n if (overlay) overlay.hidden = true;\n isShowing = false;\n for (const [el, inert] of background) el.inert = inert;\n background.clear();\n if (wasShowing) {\n document.dispatchEvent(new CustomEvent('search-visibility', { detail: { visible: false } }));\n if (restoreFocus && focusBefore?.isConnected) focusBefore.focus({ preventScroll: true });\n }\n }\n\n function destroy() {\n hide(); listeners.abort();\n if (overlay) overlay.replaceChildren();\n localCache.clear();\n }\n\n function updateFiles(newFiles, newScanId) {\n fileList = Array.isArray(newFiles) ? newFiles : [];\n localIndex = buildLocalSearchIndex(fileList); localCache.clear();\n if (newScanId !== undefined) scanIdProvider = () => newScanId;\n // A new scan brings a new session, and the old session's content index went\n // with it. So the previous payload is not merely stale — it is unreachable,\n // and showing it would offer hits into a repo that is no longer loaded.\n code = null;\n codeError = null;\n if (isShowing) runSearch();\n }\n\n const controller = {\n show,\n hide,\n destroy,\n updateFiles,\n isShowing: () => isShowing,\n };\n activeInstance = controller;\n\n // One listener for the life of the page, because Cmd+K has to work before any\n // scan exists. Only one palette is ever live, so the listener talks to the\n // newest controller and *asks* whether it is open, rather than keeping its own\n // idea of that — the old version captured the first instance's flag in a\n // closure, so Cmd+K stopped toggling correctly after a second scan.\n if (!keyListenerAttached) {\n keyListenerAttached = true;\n window.addEventListener('keydown', (event) => {\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'k') {\n event.preventDefault();\n if (!activeInstance) return;\n if (activeInstance.isShowing()) activeInstance.hide();\n else activeInstance.show();\n return;\n }\n if (event.key === 'Escape' && activeInstance && activeInstance.isShowing()) {\n activeInstance.hide();\n }\n });\n }\n\n return controller;\n}\n"]}
@@ -0,0 +1,42 @@
1
+ interface Declaration {
2
+ name?: string;
3
+ kind?: string;
4
+ line?: number;
5
+ }
6
+ interface SearchFile {
7
+ path: string;
8
+ classes?: Declaration[];
9
+ functions?: Declaration[];
10
+ exports?: Declaration[];
11
+ }
12
+ interface SymbolRecord {
13
+ name: string;
14
+ symbol: string;
15
+ kind: string;
16
+ line?: number;
17
+ }
18
+ export interface LocalSearchRecord {
19
+ path: string;
20
+ symbols: SymbolRecord[];
21
+ }
22
+ export interface LocalSearchRow {
23
+ type: 'file' | 'symbol';
24
+ path: string;
25
+ score: number;
26
+ name?: string;
27
+ symbol?: string;
28
+ kind?: string;
29
+ line?: number;
30
+ order: number;
31
+ }
32
+ /** Extract and deduplicate declarations once per scan, rather than once per key. */
33
+ export declare function buildLocalSearchIndex(files: (SearchFile | string)[]): LocalSearchRecord[];
34
+ export declare function searchLocalIndex(index: LocalSearchRecord[], parsed: ReturnType<typeof import('../../shared/search/query.js').parseQuery>, limit?: number): {
35
+ files: LocalSearchRow[];
36
+ symbols: LocalSearchRow[];
37
+ counts: {
38
+ files: number;
39
+ symbols: number;
40
+ };
41
+ };
42
+ export {};
@@ -0,0 +1,87 @@
1
+ import { matchesPathFilters, queryIsEmpty, scorePath, scoreSymbol } from '../../shared/search/query.js';
2
+ /** Extract and deduplicate declarations once per scan, rather than once per key. */
3
+ export function buildLocalSearchIndex(files) {
4
+ return files.map(file => {
5
+ const path = typeof file === 'string' ? file : file.path;
6
+ const symbols = new Map();
7
+ function put(d, kind, suffix = '') {
8
+ if (!d?.name)
9
+ return;
10
+ const existing = symbols.get(d.name);
11
+ if (existing && (existing.line || !d.line))
12
+ return;
13
+ symbols.set(d.name, { name: d.name + suffix, symbol: d.name, kind, line: d.line });
14
+ }
15
+ if (typeof file !== 'string') {
16
+ for (const d of file.classes || [])
17
+ put(d, d.kind || 'class');
18
+ for (const d of file.functions || [])
19
+ put(d, d.kind || 'function', '()');
20
+ for (const d of file.exports || [])
21
+ put({ ...d, line: undefined }, 'export ' + (d.kind || ''));
22
+ }
23
+ return { path, symbols: [...symbols.values()] };
24
+ }).filter(file => !!file.path);
25
+ }
26
+ const compare = (a, b) => b.score - a.score || a.path.localeCompare(b.path) || a.order - b.order;
27
+ /** A bounded heap keeps the best rows while retaining exact match counts. */
28
+ class BestRows {
29
+ limit;
30
+ rows = [];
31
+ count = 0;
32
+ constructor(limit) {
33
+ this.limit = limit;
34
+ }
35
+ add(row) {
36
+ this.count++;
37
+ if (this.limit === 0)
38
+ return;
39
+ if (this.rows.length < this.limit) {
40
+ this.rows.push(row);
41
+ let i = this.rows.length - 1;
42
+ while (i > 0) {
43
+ const p = (i - 1) >> 1;
44
+ if (compare(this.rows[i], this.rows[p]) <= 0)
45
+ break;
46
+ [this.rows[i], this.rows[p]] = [this.rows[p], this.rows[i]];
47
+ i = p;
48
+ }
49
+ }
50
+ else if (compare(row, this.rows[0]) < 0) {
51
+ this.rows[0] = row;
52
+ let i = 0;
53
+ while (i * 2 + 1 < this.rows.length) {
54
+ let child = i * 2 + 1;
55
+ if (child + 1 < this.rows.length && compare(this.rows[child + 1], this.rows[child]) > 0)
56
+ child++;
57
+ if (compare(this.rows[child], this.rows[i]) <= 0)
58
+ break;
59
+ [this.rows[i], this.rows[child]] = [this.rows[child], this.rows[i]];
60
+ i = child;
61
+ }
62
+ }
63
+ }
64
+ sorted() { return this.rows.sort(compare); }
65
+ }
66
+ export function searchLocalIndex(index, parsed, limit = 40) {
67
+ const cap = Math.max(0, Math.min(200, Math.floor(limit)));
68
+ const files = new BestRows(cap);
69
+ const symbols = new BestRows(cap);
70
+ if (!queryIsEmpty(parsed)) {
71
+ let order = 0;
72
+ for (const file of index) {
73
+ if (!matchesPathFilters(parsed, file.path))
74
+ continue;
75
+ const score = scorePath(parsed, file.path);
76
+ if (score > 0)
77
+ files.add({ type: 'file', path: file.path, score, order: order++ });
78
+ for (const symbol of file.symbols) {
79
+ const score = scoreSymbol(parsed, symbol.name, symbol.kind);
80
+ if (score > 0)
81
+ symbols.add({ type: 'symbol', path: file.path, score, ...symbol, order: order++ });
82
+ }
83
+ }
84
+ }
85
+ return { files: files.sorted(), symbols: symbols.sorted(), counts: { files: files.count, symbols: symbols.count } };
86
+ }
87
+ //# sourceMappingURL=searchLocal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchLocal.js","sourceRoot":"","sources":["../../src/public/js/searchLocal.ts"],"names":[],"mappings":"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","sourcesContent":["import { matchesPathFilters, queryIsEmpty, scorePath, scoreSymbol } from '../../shared/search/query.js';\n\ninterface Declaration { name?: string; kind?: string; line?: number }\ninterface SearchFile { path: string; classes?: Declaration[]; functions?: Declaration[]; exports?: Declaration[] }\ninterface SymbolRecord { name: string; symbol: string; kind: string; line?: number }\nexport interface LocalSearchRecord { path: string; symbols: SymbolRecord[] }\nexport interface LocalSearchRow { type: 'file' | 'symbol'; path: string; score: number; name?: string; symbol?: string; kind?: string; line?: number; order: number }\n\n/** Extract and deduplicate declarations once per scan, rather than once per key. */\nexport function buildLocalSearchIndex(files: (SearchFile | string)[]): LocalSearchRecord[] {\n return files.map(file => {\n const path = typeof file === 'string' ? file : file.path;\n const symbols = new Map<string, SymbolRecord>();\n function put(d: Declaration, kind: string, suffix = '') {\n if (!d?.name) return;\n const existing = symbols.get(d.name);\n if (existing && (existing.line || !d.line)) return;\n symbols.set(d.name, { name: d.name + suffix, symbol: d.name, kind, line: d.line });\n }\n if (typeof file !== 'string') {\n for (const d of file.classes || []) put(d, d.kind || 'class');\n for (const d of file.functions || []) put(d, d.kind || 'function', '()');\n for (const d of file.exports || []) put({ ...d, line: undefined }, 'export ' + (d.kind || ''));\n }\n return { path, symbols: [...symbols.values()] };\n }).filter(file => !!file.path);\n}\nconst compare = (a: LocalSearchRow, b: LocalSearchRow) => b.score - a.score || a.path.localeCompare(b.path) || a.order - b.order;\n/** A bounded heap keeps the best rows while retaining exact match counts. */\nclass BestRows {\n rows: LocalSearchRow[] = [];\n count = 0;\n constructor(private limit: number) {}\n add(row: LocalSearchRow) {\n this.count++;\n if (this.limit === 0) return;\n if (this.rows.length < this.limit) {\n this.rows.push(row);\n let i = this.rows.length - 1;\n while (i > 0) {\n const p = (i - 1) >> 1;\n if (compare(this.rows[i], this.rows[p]) <= 0) break;\n [this.rows[i], this.rows[p]] = [this.rows[p], this.rows[i]]; i = p;\n }\n } else if (compare(row, this.rows[0]) < 0) {\n this.rows[0] = row;\n let i = 0;\n while (i * 2 + 1 < this.rows.length) {\n let child = i * 2 + 1;\n if (child + 1 < this.rows.length && compare(this.rows[child + 1], this.rows[child]) > 0) child++;\n if (compare(this.rows[child], this.rows[i]) <= 0) break;\n [this.rows[i], this.rows[child]] = [this.rows[child], this.rows[i]]; i = child;\n }\n }\n }\n sorted() { return this.rows.sort(compare); }\n}\nexport function searchLocalIndex(index: LocalSearchRecord[], parsed: ReturnType<typeof import('../../shared/search/query.js').parseQuery>, limit = 40) {\n const cap = Math.max(0, Math.min(200, Math.floor(limit)));\n const files = new BestRows(cap); const symbols = new BestRows(cap);\n if (!queryIsEmpty(parsed)) {\n let order = 0;\n for (const file of index) {\n if (!matchesPathFilters(parsed, file.path)) continue;\n const score = scorePath(parsed, file.path);\n if (score > 0) files.add({ type: 'file', path: file.path, score, order: order++ });\n for (const symbol of file.symbols) {\n const score = scoreSymbol(parsed, symbol.name, symbol.kind);\n if (score > 0) symbols.add({ type: 'symbol', path: file.path, score, ...symbol, order: order++ });\n }\n }\n }\n return { files: files.sorted(), symbols: symbols.sorted(), counts: { files: files.count, symbols: symbols.count } };\n}\n"]}
@@ -0,0 +1,5 @@
1
+ export declare function createServerDrawer(options?: Record<string, any>): {
2
+ open: () => Promise<void>;
3
+ close: () => void;
4
+ isOpen: () => boolean;
5
+ };