codebase-onboarder 0.6.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (526) hide show
  1. package/README.md +284 -53
  2. package/bin/build-if-source.js +23 -0
  3. package/bin/onboarder.js +0 -0
  4. package/cli/agent/command.d.ts +71 -0
  5. package/cli/agent/command.js +177 -0
  6. package/cli/agent/command.js.map +1 -0
  7. package/cli/agent/config.d.ts +31 -0
  8. package/cli/agent/config.js +98 -0
  9. package/cli/agent/config.js.map +1 -0
  10. package/cli/agent/contracts.d.ts +77 -0
  11. package/cli/agent/contracts.js +2 -0
  12. package/cli/agent/contracts.js.map +1 -0
  13. package/cli/agent/files.d.ts +19 -0
  14. package/cli/agent/files.js +109 -0
  15. package/cli/agent/files.js.map +1 -0
  16. package/cli/agent/gitSource.d.ts +18 -0
  17. package/cli/agent/gitSource.js +69 -0
  18. package/cli/agent/gitSource.js.map +1 -0
  19. package/cli/agent/github.d.ts +21 -0
  20. package/cli/agent/github.js +94 -0
  21. package/cli/agent/github.js.map +1 -0
  22. package/cli/agent/mcp.d.ts +15 -0
  23. package/cli/agent/mcp.js +78 -0
  24. package/cli/agent/mcp.js.map +1 -0
  25. package/cli/agent/process.d.ts +18 -0
  26. package/cli/agent/process.js +118 -0
  27. package/cli/agent/process.js.map +1 -0
  28. package/cli/agent/protocol.d.ts +3 -0
  29. package/cli/agent/protocol.js +26 -0
  30. package/cli/agent/protocol.js.map +1 -0
  31. package/cli/agent/runner.d.ts +34 -0
  32. package/cli/agent/runner.js +152 -0
  33. package/cli/agent/runner.js.map +1 -0
  34. package/cli/agent/stdio.d.ts +1 -0
  35. package/cli/agent/stdio.js +62 -0
  36. package/cli/agent/stdio.js.map +1 -0
  37. package/cli/agent/tools.d.ts +7 -0
  38. package/cli/agent/tools.js +201 -0
  39. package/cli/agent/tools.js.map +1 -0
  40. package/cli/chat/app.d.ts +16 -0
  41. package/cli/chat/app.js +345 -0
  42. package/cli/chat/app.js.map +1 -0
  43. package/cli/chat/commands.d.ts +11 -0
  44. package/cli/chat/commands.js +120 -0
  45. package/cli/chat/commands.js.map +1 -0
  46. package/cli/chat/composer.d.ts +75 -0
  47. package/cli/chat/composer.js +467 -0
  48. package/cli/chat/composer.js.map +1 -0
  49. package/cli/chat/controller.d.ts +60 -0
  50. package/cli/chat/controller.js +393 -0
  51. package/cli/chat/controller.js.map +1 -0
  52. package/cli/chat/logo.d.ts +3 -0
  53. package/cli/chat/logo.js +14 -0
  54. package/cli/chat/logo.js.map +1 -0
  55. package/cli/chat/models.d.ts +18 -0
  56. package/cli/chat/models.js +88 -0
  57. package/cli/chat/models.js.map +1 -0
  58. package/cli/chat/profile.d.ts +5 -0
  59. package/cli/chat/profile.js +98 -0
  60. package/cli/chat/profile.js.map +1 -0
  61. package/cli/chat/render.d.ts +40 -0
  62. package/cli/chat/render.js +259 -0
  63. package/cli/chat/render.js.map +1 -0
  64. package/cli/chat/screen.d.ts +26 -0
  65. package/cli/chat/screen.js +117 -0
  66. package/cli/chat/screen.js.map +1 -0
  67. package/cli/chat/source.d.ts +29 -0
  68. package/cli/chat/source.js +116 -0
  69. package/cli/chat/source.js.map +1 -0
  70. package/cli/chat/store.d.ts +43 -0
  71. package/cli/chat/store.js +94 -0
  72. package/cli/chat/store.js.map +1 -0
  73. package/cli/chat/text.d.ts +4 -0
  74. package/cli/chat/text.js +27 -0
  75. package/cli/chat/text.js.map +1 -0
  76. package/cli/commands.d.ts +26 -0
  77. package/cli/commands.js +836 -811
  78. package/cli/commands.js.map +1 -0
  79. package/cli/explorer/advanced.d.ts +14 -0
  80. package/cli/explorer/advanced.js +321 -329
  81. package/cli/explorer/advanced.js.map +1 -0
  82. package/cli/explorer/app.d.ts +2 -0
  83. package/cli/explorer/app.js +404 -314
  84. package/cli/explorer/app.js.map +1 -0
  85. package/cli/explorer/assistant.d.ts +9 -0
  86. package/cli/explorer/assistant.js +58 -0
  87. package/cli/explorer/assistant.js.map +1 -0
  88. package/cli/explorer/commands.d.ts +17 -0
  89. package/cli/explorer/commands.js +373 -302
  90. package/cli/explorer/commands.js.map +1 -0
  91. package/cli/explorer/featureViews.d.ts +124 -0
  92. package/cli/explorer/featureViews.js +179 -0
  93. package/cli/explorer/featureViews.js.map +1 -0
  94. package/cli/explorer/github.d.ts +21 -0
  95. package/cli/explorer/github.js +42 -44
  96. package/cli/explorer/github.js.map +1 -0
  97. package/cli/explorer/graphs.d.ts +7 -0
  98. package/cli/explorer/graphs.js +90 -95
  99. package/cli/explorer/graphs.js.map +1 -0
  100. package/cli/explorer/picker.d.ts +22 -0
  101. package/cli/explorer/picker.js +150 -0
  102. package/cli/explorer/picker.js.map +1 -0
  103. package/cli/explorer/report.d.ts +85 -0
  104. package/cli/explorer/report.js +60 -0
  105. package/cli/explorer/report.js.map +1 -0
  106. package/cli/explorer/session.d.ts +449 -0
  107. package/cli/explorer/session.js +143 -144
  108. package/cli/explorer/session.js.map +1 -0
  109. package/cli/explorer/views.d.ts +19 -0
  110. package/cli/explorer/views.js +465 -482
  111. package/cli/explorer/views.js.map +1 -0
  112. package/cli/explorer/wrap.d.ts +1 -0
  113. package/cli/explorer/wrap.js +28 -44
  114. package/cli/explorer/wrap.js.map +1 -0
  115. package/cli/main.d.ts +1 -0
  116. package/cli/main.js +251 -164
  117. package/cli/main.js.map +1 -0
  118. package/cli/prompt.d.ts +5 -0
  119. package/cli/prompt.js +84 -80
  120. package/cli/prompt.js.map +1 -0
  121. package/cli/scanOptions.d.ts +2 -0
  122. package/cli/scanOptions.js +11 -0
  123. package/cli/scanOptions.js.map +1 -0
  124. package/cli/ui.d.ts +33 -0
  125. package/cli/ui.js +35 -44
  126. package/cli/ui.js.map +1 -0
  127. package/cli/wizard.d.ts +187 -0
  128. package/cli/wizard.js +304 -284
  129. package/cli/wizard.js.map +1 -0
  130. package/docs/HERMES_RESEARCH.md +51 -0
  131. package/package.json +16 -4
  132. package/public/app.d.ts +1 -0
  133. package/public/app.js +1133 -1011
  134. package/public/app.js.map +1 -0
  135. package/public/assets/onboarder-mark.svg +11 -0
  136. package/public/browser.d.ts +71 -0
  137. package/public/browser.js +2 -0
  138. package/public/browser.js.map +1 -0
  139. package/public/index.html +54 -20
  140. package/public/js/about.d.ts +6 -0
  141. package/public/js/about.js +152 -172
  142. package/public/js/about.js.map +1 -0
  143. package/public/js/aiDraft.d.ts +4 -0
  144. package/public/js/aiDraft.js +166 -125
  145. package/public/js/aiDraft.js.map +1 -0
  146. package/public/js/analysisPanel.d.ts +7 -0
  147. package/public/js/analysisPanel.js +166 -166
  148. package/public/js/analysisPanel.js.map +1 -0
  149. package/public/js/analysisReport.d.ts +38 -0
  150. package/public/js/analysisReport.js +105 -110
  151. package/public/js/analysisReport.js.map +1 -0
  152. package/public/js/api.d.ts +29 -0
  153. package/public/js/api.js +198 -166
  154. package/public/js/api.js.map +1 -0
  155. package/public/js/atlas.d.ts +6 -0
  156. package/public/js/atlas.js +50 -58
  157. package/public/js/atlas.js.map +1 -0
  158. package/public/js/blameView.d.ts +2 -0
  159. package/public/js/blameView.js +36 -37
  160. package/public/js/blameView.js.map +1 -0
  161. package/public/js/codeTab.d.ts +3 -0
  162. package/public/js/codeTab.js +175 -180
  163. package/public/js/codeTab.js.map +1 -0
  164. package/public/js/codeViewer.d.ts +5 -0
  165. package/public/js/codeViewer.js +162 -150
  166. package/public/js/codeViewer.js.map +1 -0
  167. package/public/js/components/FileChip.d.ts +9 -0
  168. package/public/js/components/FileChip.js +45 -49
  169. package/public/js/components/FileChip.js.map +1 -0
  170. package/public/js/components/MetricSparkline.d.ts +7 -0
  171. package/public/js/components/MetricSparkline.js +35 -44
  172. package/public/js/components/MetricSparkline.js.map +1 -0
  173. package/public/js/components/RiskBadge.d.ts +9 -0
  174. package/public/js/components/RiskBadge.js +55 -63
  175. package/public/js/components/RiskBadge.js.map +1 -0
  176. package/public/js/deepAnalysisView.d.ts +99 -0
  177. package/public/js/deepAnalysisView.js +282 -302
  178. package/public/js/deepAnalysisView.js.map +1 -0
  179. package/public/js/diagramPane.d.ts +9 -0
  180. package/public/js/diagramPane.js +138 -135
  181. package/public/js/diagramPane.js.map +1 -0
  182. package/public/js/diffView.d.ts +6 -0
  183. package/public/js/diffView.js +222 -209
  184. package/public/js/diffView.js.map +1 -0
  185. package/public/js/docsView.d.ts +2 -0
  186. package/public/js/docsView.js +441 -442
  187. package/public/js/docsView.js.map +1 -0
  188. package/public/js/dom.d.ts +197 -0
  189. package/public/js/dom.js +5 -0
  190. package/public/js/dom.js.map +1 -0
  191. package/public/js/fileSourceBrowser.d.ts +5 -0
  192. package/public/js/fileSourceBrowser.js +33 -41
  193. package/public/js/fileSourceBrowser.js.map +1 -0
  194. package/public/js/flameGraph.d.ts +5 -0
  195. package/public/js/flameGraph.js +62 -72
  196. package/public/js/flameGraph.js.map +1 -0
  197. package/public/js/forceGraph.d.ts +10 -0
  198. package/public/js/forceGraph.js +581 -556
  199. package/public/js/forceGraph.js.map +1 -0
  200. package/public/js/heatmap.d.ts +4 -0
  201. package/public/js/heatmap.js +142 -164
  202. package/public/js/heatmap.js.map +1 -0
  203. package/public/js/highlight.d.ts +2 -0
  204. package/public/js/highlight.js +116 -107
  205. package/public/js/highlight.js.map +1 -0
  206. package/public/js/html.d.ts +2 -0
  207. package/public/js/html.js +14 -44
  208. package/public/js/html.js.map +1 -0
  209. package/public/js/insightsView.d.ts +5 -0
  210. package/public/js/insightsView.js +93 -111
  211. package/public/js/insightsView.js.map +1 -0
  212. package/public/js/inspector.d.ts +37 -0
  213. package/public/js/inspector.js +416 -445
  214. package/public/js/inspector.js.map +1 -0
  215. package/public/js/llm.d.ts +115 -0
  216. package/public/js/llm.js +246 -278
  217. package/public/js/llm.js.map +1 -0
  218. package/public/js/mapView.d.ts +3 -0
  219. package/public/js/mapView.js +121 -120
  220. package/public/js/mapView.js.map +1 -0
  221. package/public/js/markdown.d.ts +3 -0
  222. package/public/js/markdown.js +84 -91
  223. package/public/js/markdown.js.map +1 -0
  224. package/public/js/mindmap.d.ts +32 -0
  225. package/public/js/mindmap.js +244 -259
  226. package/public/js/mindmap.js.map +1 -0
  227. package/public/js/mobilePanels.d.ts +5 -0
  228. package/public/js/mobilePanels.js +50 -0
  229. package/public/js/mobilePanels.js.map +1 -0
  230. package/public/js/repoFiles.d.ts +12 -0
  231. package/public/js/repoFiles.js +29 -28
  232. package/public/js/repoFiles.js.map +1 -0
  233. package/public/js/reviewView.d.ts +28 -0
  234. package/public/js/reviewView.js +256 -0
  235. package/public/js/reviewView.js.map +1 -0
  236. package/public/js/sbomView.d.ts +3 -0
  237. package/public/js/sbomView.js +59 -67
  238. package/public/js/sbomView.js.map +1 -0
  239. package/public/js/scanCache.d.ts +16 -0
  240. package/public/js/scanCache.js +67 -65
  241. package/public/js/scanCache.js.map +1 -0
  242. package/public/js/search.d.ts +7 -0
  243. package/public/js/search.js +868 -800
  244. package/public/js/search.js.map +1 -0
  245. package/public/js/searchLocal.d.ts +42 -0
  246. package/public/js/searchLocal.js +87 -0
  247. package/public/js/searchLocal.js.map +1 -0
  248. package/public/js/serverSettings.d.ts +5 -0
  249. package/public/js/serverSettings.js +153 -164
  250. package/public/js/serverSettings.js.map +1 -0
  251. package/public/js/state.d.ts +798 -0
  252. package/public/js/state.js +114 -122
  253. package/public/js/state.js.map +1 -0
  254. package/public/js/tour.d.ts +6 -0
  255. package/public/js/tour.js +5 -7
  256. package/public/js/tour.js.map +1 -0
  257. package/public/js/transitions.d.ts +2 -0
  258. package/public/js/transitions.js +9 -10
  259. package/public/js/transitions.js.map +1 -0
  260. package/public/js/tree.d.ts +12 -0
  261. package/public/js/tree.js +157 -154
  262. package/public/js/tree.js.map +1 -0
  263. package/public/js/workflowsView.d.ts +3 -0
  264. package/public/js/workflowsView.js +15 -22
  265. package/public/js/workflowsView.js.map +1 -0
  266. package/public/search.css +495 -0
  267. package/public/styles.css +188 -346
  268. package/public/workbench.css +166 -0
  269. package/server/apiAuth.d.ts +3 -0
  270. package/server/apiAuth.js +18 -20
  271. package/server/apiAuth.js.map +1 -0
  272. package/server/apiDiff.d.ts +2 -0
  273. package/server/apiDiff.js +20 -18
  274. package/server/apiDiff.js.map +1 -0
  275. package/server/apiDocs.d.ts +2 -0
  276. package/server/apiDocs.js +38 -40
  277. package/server/apiDocs.js.map +1 -0
  278. package/server/apiFile.d.ts +1 -0
  279. package/server/apiFile.js +14 -17
  280. package/server/apiFile.js.map +1 -0
  281. package/server/apiGitBlame.d.ts +2 -0
  282. package/server/apiGitBlame.js +50 -51
  283. package/server/apiGitBlame.js.map +1 -0
  284. package/server/apiMcp.d.ts +4 -0
  285. package/server/apiMcp.js +64 -66
  286. package/server/apiMcp.js.map +1 -0
  287. package/server/apiReview.d.ts +2 -0
  288. package/server/apiReview.js +45 -0
  289. package/server/apiReview.js.map +1 -0
  290. package/server/apiScan.d.ts +5 -0
  291. package/server/apiScan.js +90 -71
  292. package/server/apiScan.js.map +1 -0
  293. package/server/apiSearch.d.ts +33 -0
  294. package/server/apiSearch.js +184 -200
  295. package/server/apiSearch.js.map +1 -0
  296. package/server/apiSettings.d.ts +4 -0
  297. package/server/apiSettings.js +84 -85
  298. package/server/apiSettings.js.map +1 -0
  299. package/server/apiTools.d.ts +3 -0
  300. package/server/apiTools.js +55 -56
  301. package/server/apiTools.js.map +1 -0
  302. package/server/auth.d.ts +5 -0
  303. package/server/auth.js +54 -51
  304. package/server/auth.js.map +1 -0
  305. package/server/config.d.ts +42 -0
  306. package/server/config.js +189 -194
  307. package/server/config.js.map +1 -0
  308. package/server/daemon.d.ts +12 -0
  309. package/server/daemon.js +124 -114
  310. package/server/daemon.js.map +1 -0
  311. package/server/fileSourceNode.d.ts +2 -0
  312. package/server/fileSourceNode.js +34 -36
  313. package/server/fileSourceNode.js.map +1 -0
  314. package/server/gitClone.d.ts +9 -0
  315. package/server/gitClone.js +59 -61
  316. package/server/gitClone.js.map +1 -0
  317. package/server/gitDiff.d.ts +36 -0
  318. package/server/gitDiff.js +271 -169
  319. package/server/gitDiff.js.map +1 -0
  320. package/server/gitHistory.d.ts +12 -0
  321. package/server/gitHistory.js +80 -80
  322. package/server/gitHistory.js.map +1 -0
  323. package/server/gitRemote.d.ts +12 -0
  324. package/server/gitRemote.js +37 -38
  325. package/server/gitRemote.js.map +1 -0
  326. package/server/hermesChat.d.ts +13 -0
  327. package/server/hermesChat.js +145 -0
  328. package/server/hermesChat.js.map +1 -0
  329. package/server/htmlText.d.ts +4 -0
  330. package/server/htmlText.js +16 -23
  331. package/server/htmlText.js.map +1 -0
  332. package/server/http.d.ts +6 -0
  333. package/server/http.js +27 -34
  334. package/server/http.js.map +1 -0
  335. package/server/httpGuards.d.ts +2 -0
  336. package/server/httpGuards.js +47 -43
  337. package/server/httpGuards.js.map +1 -0
  338. package/server/https.d.ts +34 -0
  339. package/server/https.js +121 -111
  340. package/server/https.js.map +1 -0
  341. package/server/index.d.ts +40 -0
  342. package/server/index.js +139 -147
  343. package/server/index.js.map +1 -0
  344. package/server/layout.d.ts +26 -0
  345. package/server/layout.js +59 -64
  346. package/server/layout.js.map +1 -0
  347. package/server/llmProxy.d.ts +3 -0
  348. package/server/llmProxy.js +137 -135
  349. package/server/llmProxy.js.map +1 -0
  350. package/server/logger.d.ts +38 -0
  351. package/server/logger.js +198 -211
  352. package/server/logger.js.map +1 -0
  353. package/server/mcp/analysis.d.ts +29 -0
  354. package/server/mcp/analysis.js +99 -120
  355. package/server/mcp/analysis.js.map +1 -0
  356. package/server/mcp/http.d.ts +9 -0
  357. package/server/mcp/http.js +128 -137
  358. package/server/mcp/http.js.map +1 -0
  359. package/server/mcp/runner.d.ts +68 -0
  360. package/server/mcp/runner.js +208 -218
  361. package/server/mcp/runner.js.map +1 -0
  362. package/server/mcp/server.d.ts +29 -0
  363. package/server/mcp/server.js +167 -180
  364. package/server/mcp/server.js.map +1 -0
  365. package/server/mcp/standalone.d.ts +1 -0
  366. package/server/mcp/standalone.js +8 -10
  367. package/server/mcp/standalone.js.map +1 -0
  368. package/server/mcp/tools.d.ts +2020 -0
  369. package/server/mcp/tools.js +523 -574
  370. package/server/mcp/tools.js.map +1 -0
  371. package/server/paths.d.ts +3 -0
  372. package/server/paths.js +17 -15
  373. package/server/paths.js.map +1 -0
  374. package/server/pidfile.d.ts +9 -0
  375. package/server/pidfile.js +43 -45
  376. package/server/pidfile.js.map +1 -0
  377. package/server/review.d.ts +5 -0
  378. package/server/review.js +35 -0
  379. package/server/review.js.map +1 -0
  380. package/server/router.d.ts +33 -0
  381. package/server/router.js +195 -197
  382. package/server/router.js.map +1 -0
  383. package/server/scanRequest.d.ts +3 -0
  384. package/server/scanRequest.js +36 -0
  385. package/server/scanRequest.js.map +1 -0
  386. package/server/searchIndex.d.ts +17 -0
  387. package/server/searchIndex.js +83 -80
  388. package/server/searchIndex.js.map +1 -0
  389. package/server/sessions.d.ts +14 -0
  390. package/server/sessions.js +62 -70
  391. package/server/sessions.js.map +1 -0
  392. package/server/startup.d.ts +118 -0
  393. package/server/startup.js +143 -148
  394. package/server/startup.js.map +1 -0
  395. package/server/static.d.ts +6 -0
  396. package/server/static.js +28 -31
  397. package/server/static.js.map +1 -0
  398. package/server/tools/install.d.ts +4 -0
  399. package/server/tools/install.js +176 -185
  400. package/server/tools/install.js.map +1 -0
  401. package/server/tools/parse.d.ts +8 -0
  402. package/server/tools/parse.js +112 -114
  403. package/server/tools/parse.js.map +1 -0
  404. package/server/tools/platform.d.ts +9 -0
  405. package/server/tools/platform.js +49 -47
  406. package/server/tools/platform.js.map +1 -0
  407. package/server/tools/registry.d.ts +137 -0
  408. package/server/tools/registry.js +173 -172
  409. package/server/tools/registry.js.map +1 -0
  410. package/server/tools/scan.d.ts +34 -0
  411. package/server/tools/scan.js +89 -98
  412. package/server/tools/scan.js.map +1 -0
  413. package/server/tools.d.ts +34 -0
  414. package/server/tools.js +94 -107
  415. package/server/tools.js.map +1 -0
  416. package/server/tunnel.d.ts +29 -0
  417. package/server/tunnel.js +61 -66
  418. package/server/tunnel.js.map +1 -0
  419. package/shared/analyzer/docs.d.ts +16 -0
  420. package/shared/analyzer/docs.js +99 -93
  421. package/shared/analyzer/docs.js.map +1 -0
  422. package/shared/analyzer/explainLocal.d.ts +4 -0
  423. package/shared/analyzer/explainLocal.js +122 -142
  424. package/shared/analyzer/explainLocal.js.map +1 -0
  425. package/shared/analyzer/github.d.ts +37 -0
  426. package/shared/analyzer/github.js +41 -43
  427. package/shared/analyzer/github.js.map +1 -0
  428. package/shared/analyzer/graph.d.ts +41 -0
  429. package/shared/analyzer/graph.js +393 -400
  430. package/shared/analyzer/graph.js.map +1 -0
  431. package/shared/analyzer/health.d.ts +33 -0
  432. package/shared/analyzer/health.js +197 -193
  433. package/shared/analyzer/health.js.map +1 -0
  434. package/shared/analyzer/history.d.ts +29 -0
  435. package/shared/analyzer/history.js +110 -111
  436. package/shared/analyzer/history.js.map +1 -0
  437. package/shared/analyzer/jsonConfig.d.ts +2 -0
  438. package/shared/analyzer/jsonConfig.js +61 -0
  439. package/shared/analyzer/jsonConfig.js.map +1 -0
  440. package/shared/analyzer/languages/csharp.d.ts +26 -0
  441. package/shared/analyzer/languages/csharp.js +83 -88
  442. package/shared/analyzer/languages/csharp.js.map +1 -0
  443. package/shared/analyzer/languages/generic.d.ts +23 -0
  444. package/shared/analyzer/languages/generic.js +94 -105
  445. package/shared/analyzer/languages/generic.js.map +1 -0
  446. package/shared/analyzer/languages/go.d.ts +24 -0
  447. package/shared/analyzer/languages/go.js +45 -54
  448. package/shared/analyzer/languages/go.js.map +1 -0
  449. package/shared/analyzer/languages/index.d.ts +6 -0
  450. package/shared/analyzer/languages/index.js +19 -20
  451. package/shared/analyzer/languages/index.js.map +1 -0
  452. package/shared/analyzer/languages/java.d.ts +20 -0
  453. package/shared/analyzer/languages/java.js +73 -78
  454. package/shared/analyzer/languages/java.js.map +1 -0
  455. package/shared/analyzer/languages/javascript.d.ts +12 -0
  456. package/shared/analyzer/languages/javascript.js +258 -209
  457. package/shared/analyzer/languages/javascript.js.map +1 -0
  458. package/shared/analyzer/languages/python.d.ts +23 -0
  459. package/shared/analyzer/languages/python.js +92 -100
  460. package/shared/analyzer/languages/python.js.map +1 -0
  461. package/shared/analyzer/languages/rust.d.ts +17 -0
  462. package/shared/analyzer/languages/rust.js +96 -98
  463. package/shared/analyzer/languages/rust.js.map +1 -0
  464. package/shared/analyzer/languages/typescript.d.ts +11 -0
  465. package/shared/analyzer/languages/typescript.js +117 -116
  466. package/shared/analyzer/languages/typescript.js.map +1 -0
  467. package/shared/analyzer/licenses.d.ts +18 -0
  468. package/shared/analyzer/licenses.js +130 -133
  469. package/shared/analyzer/licenses.js.map +1 -0
  470. package/shared/analyzer/metrics.d.ts +20 -0
  471. package/shared/analyzer/metrics.js +112 -104
  472. package/shared/analyzer/metrics.js.map +1 -0
  473. package/shared/analyzer/pathUtil.d.ts +10 -0
  474. package/shared/analyzer/pathUtil.js +29 -35
  475. package/shared/analyzer/pathUtil.js.map +1 -0
  476. package/shared/analyzer/patterns.d.ts +11 -0
  477. package/shared/analyzer/patterns.js +231 -253
  478. package/shared/analyzer/patterns.js.map +1 -0
  479. package/shared/analyzer/scan.d.ts +62 -0
  480. package/shared/analyzer/scan.js +451 -442
  481. package/shared/analyzer/scan.js.map +1 -0
  482. package/shared/analyzer/scanControl.d.ts +11 -0
  483. package/shared/analyzer/scanControl.js +62 -0
  484. package/shared/analyzer/scanControl.js.map +1 -0
  485. package/shared/analyzer/security.d.ts +18 -0
  486. package/shared/analyzer/security.js +159 -159
  487. package/shared/analyzer/security.js.map +1 -0
  488. package/shared/analyzer/services.d.ts +5 -0
  489. package/shared/analyzer/services.js +141 -138
  490. package/shared/analyzer/services.js.map +1 -0
  491. package/shared/analyzer/stack.d.ts +6 -0
  492. package/shared/analyzer/stack.js +134 -141
  493. package/shared/analyzer/stack.js.map +1 -0
  494. package/shared/analyzer/tour.d.ts +2 -0
  495. package/shared/analyzer/tour.js +45 -53
  496. package/shared/analyzer/tour.js.map +1 -0
  497. package/shared/analyzer/util.d.ts +8 -0
  498. package/shared/analyzer/util.js +130 -76
  499. package/shared/analyzer/util.js.map +1 -0
  500. package/shared/analyzer/workflows.d.ts +8 -0
  501. package/shared/analyzer/workflows.js +139 -134
  502. package/shared/analyzer/workflows.js.map +1 -0
  503. package/shared/contracts.d.ts +250 -0
  504. package/shared/contracts.js +2 -0
  505. package/shared/contracts.js.map +1 -0
  506. package/shared/diagram/aiFacts.d.ts +35 -0
  507. package/shared/diagram/aiFacts.js +102 -105
  508. package/shared/diagram/aiFacts.js.map +1 -0
  509. package/shared/diagram/aiMermaid.d.ts +5 -0
  510. package/shared/diagram/aiMermaid.js +50 -46
  511. package/shared/diagram/aiMermaid.js.map +1 -0
  512. package/shared/diagram/atlas.d.ts +16 -0
  513. package/shared/diagram/atlas.js +51 -60
  514. package/shared/diagram/atlas.js.map +1 -0
  515. package/shared/diagram/mermaid.d.ts +43 -0
  516. package/shared/diagram/mermaid.js +348 -370
  517. package/shared/diagram/mermaid.js.map +1 -0
  518. package/shared/review/contracts.d.ts +95 -0
  519. package/shared/review/contracts.js +2 -0
  520. package/shared/review/contracts.js.map +1 -0
  521. package/shared/review/review.d.ts +10 -0
  522. package/shared/review/review.js +184 -0
  523. package/shared/review/review.js.map +1 -0
  524. package/shared/search/query.d.ts +32 -0
  525. package/shared/search/query.js +395 -388
  526. package/shared/search/query.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/chat/commands.ts"],"names":[],"mappings":"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","sourcesContent":["import { AGENT_MODES } from '../agent/contracts.js';\n\nexport const CHAT_COMMANDS = [\n ['help', '[command]', 'Show commands and examples'],\n ['ask', '<question>', 'Ask about this repository'],\n ['review', '[PR number] [task]', 'Review local changes or a GitHub PR'],\n ['triage', '[issue number] [task]', 'Investigate issues and suggest fixes'],\n ['implement', '<task>', 'Make changes in an isolated Git workspace'],\n ['pr', '<task>', 'Prepare a draft PR; publish when GitHub writes are enabled'],\n ['github', '<task>', 'Work with GitHub issues, reviews, labels, and CI'],\n ['mode', '[ask|review|triage|implement|pr|github]', 'Choose the workflow for following messages'],\n ['permissions', '[checks|github] [on|off]', 'Control test execution and GitHub writes'],\n ['model', '[name] [provider]', 'Open the provider/model picker; configure opens full Hermes setup'],\n ['limits', '[seconds] [turns]', 'Set the run timeout and tool-turn budget'],\n ['repo', '[folder|GitHub URL]', 'Show or switch the repository; clone GitHub URLs'],\n ['clone', '<GitHub URL>', 'Clone a repository into a saved local checkout'],\n ['pull', '', 'Update the saved checkout without overwriting local changes'],\n ['new', '', 'Start a fresh conversation'],\n ['history', '', 'List saved conversations for this repository'],\n ['resume', '<conversation ID>', 'Continue a saved conversation'],\n ['status', '', 'Show model, permissions, workspace, and last run'],\n ['paste', '', 'Enter a multiline message; finish with /send or /discard'],\n ['cancel', '', 'Stop the active task (Ctrl-C also works)'],\n ['map', '', 'Repository overview, available offline'],\n ['tree', '[folder] [depth]', 'Browse repository files'],\n ['find', '<query>', 'Search files, symbols, and contents'],\n ['show', '<file> [from] [count]', 'Read a file'],\n ['diff', '[base] [head] [file]', 'Inspect changes in the current workspace'],\n ['health', '', 'Inspect repository health'],\n ['rescan', '', 'Refresh the cached repository analysis'],\n ['tour', '', 'Find the best reading order for this codebase'],\n ['explain', '[file|folder]', 'Explain a module using local analysis'],\n ['deps', '<file>', 'Trace imports and reverse dependencies'],\n ['inspect', '<file>', 'Inspect role, complexity, exports, and findings'],\n ['graph', '<file> [depth]', 'Explore the dependency graph'],\n ['blast', '<file>', 'Show the impact of changing a file'],\n ['symbols', '<file>', 'List functions, classes, and exports'],\n ['hubs', '', 'Find the most depended-on modules'],\n ['layers', '', 'Inspect architecture layers'],\n ['patterns', '', 'Discover architecture patterns'],\n ['stats', '', 'Inspect language and complexity statistics'],\n ['security', '', 'Show local security findings'],\n ['stack', '', 'Inspect frameworks and dependencies'],\n ['entry', '', 'Locate application entry points'],\n ['externals', '', 'Inspect external dependencies and drift'],\n ['coupling', '', 'Explore traffic between folders'],\n ['clusters', '', 'Find groups of related modules'],\n ['risks', '', 'Inspect code and architecture risks'],\n ['log', '[count]', 'Read recent Git commits'],\n ['hotspots', '[count]', 'Find frequently changed complex files'],\n ['blame', '<file>', 'Read line authorship'],\n ['diagram', '[file|folder]', 'Generate Mermaid diagram source'],\n ['layers-diagram', '', 'Generate an architecture layer diagram'],\n ['atlas', '', 'Browse available diagrams'],\n ['docs', '[file|folder] [--write]', 'Read or explicitly generate repository documentation'],\n ['workflows', '', 'Inspect GitHub Actions workflows'],\n ['sbom', '[package]', 'Inspect dependencies and licenses'],\n ['engines', '', 'Show available optional analyzers'],\n ['deep', '<engine|all>', 'Run an optional analyzer when checks are enabled'],\n ['web', '', 'Open the repository in the web interface'],\n ['about', '', 'Show repository and application information'],\n ['tools', '', 'List the actual tools available to Hermes'],\n ['skills', '', 'Discover the six built-in agent workflows'],\n ['runs', '', 'List saved agent runs'],\n ['run', '<run ID>', 'Read a saved result from this repository'],\n ['export', '', 'Save this conversation as Markdown'],\n ['send', '', 'Submit the message composed with /paste'],\n ['discard', '', 'Discard the message composed with /paste'],\n ['doctor', '', 'Check the Hermes runtime and profile'],\n ['setup', '', 'Prepare the dedicated Hermes profile'],\n ['clear', '', 'Clear the screen; keep the conversation'],\n ['exit', '', 'Save and exit (Ctrl-D also works)'],\n] as const;\nexport type ChatCommand = typeof CHAT_COMMANDS[number][0];\nexport const BROWSE_COMMANDS = ['map', 'tree', 'find', 'show', 'diff', 'health', 'rescan', 'tour', 'explain', 'deps', 'inspect', 'graph', 'blast', 'symbols', 'hubs', 'layers', 'patterns', 'stats', 'security', 'stack', 'entry', 'externals', 'coupling', 'clusters', 'risks', 'log', 'hotspots', 'blame', 'diagram', 'layers-diagram', 'atlas', 'docs', 'workflows', 'sbom', 'engines', 'deep', 'web', 'about'] as const;\n\nexport function suggestCommands(line: string): typeof CHAT_COMMANDS[number][] {\n if (!/^\\/[\\w-]*$/.test(line)) return [];\n const query = line.slice(1).toLowerCase();\n return CHAT_COMMANDS.filter(([name, , summary]) => name.startsWith(query) || query.length > 1 && summary.toLowerCase().includes(query))\n .sort((a, b) => Number(b[0].startsWith(query)) - Number(a[0].startsWith(query)));\n}\n\nexport function slashInput(line: string): { name: string; args: string[]; body: string } | null {\n const match = /^\\/([\\w-]*)(?:\\s+([\\s\\S]*))?$/.exec(line.trim());\n if (!match) return null;\n const body = match[2] || '';\n // Quotes are useful for file paths. Workflow tasks retain the original body.\n const args = [...body.matchAll(/\"([^\"]*)\"|'([^']*)'|(\\S+)/g)].map(m => m[1] ?? m[2] ?? m[3]!);\n return { name: match[1]!, args, body };\n}\nexport function chatHelp(topic = ''): string {\n const commands = topic ? CHAT_COMMANDS.filter(c => c[0] === topic.replace(/^\\//, '')) : CHAT_COMMANDS;\n if (!commands.length) return `Unknown command /${topic}. Use /help.`;\n return ['Slash commands', '', ...commands.map(([name, args, detail]) => ` /${name}${args ? ' ' + args : ''}\\n ${detail}`), '',\n 'Type / for live suggestions. ↑/↓ select; Tab or Enter fills the command. Esc dismisses.',\n 'Alt-Enter adds a line. Bracketed paste preserves multiline text. Ctrl-C cancels a task.',\n '/review 42 /triage 12 /implement Fix the failing test',\n '/permissions checks on /permissions github on',\n 'Paste a GitHub URL to clone and open it, then type your question.',\n 'Follow-ups reuse the Hermes session. Mode, target, model, or permission changes start a new session.',\n 'Use /paste for multiline text. /new resets context; /clear only clears the screen.'].join('\\n');\n}\nexport function completeChat(line: string, files: string[] = []): [string[], string] {\n if (!line.startsWith('/')) return [[], line];\n if (!line.includes(' ')) return [CHAT_COMMANDS.map(c => '/' + c[0]).filter(c => c.startsWith(line)), line];\n const [command, ...args] = line.split(/\\s+/), fragment = args.at(-1) || '';\n let candidates: readonly string[] = [];\n if (command === '/mode') candidates = AGENT_MODES;\n if (command === '/permissions') candidates = args.length === 1 ? ['checks', 'github'] : ['on', 'off'];\n if (command === '/model' && args.length === 1) candidates = ['configure', 'default'];\n if (['/show', '/tree', '/repo', '/deps', '/inspect', '/graph', '/blast', '/symbols', '/explain', '/blame', '/docs', '/diagram'].includes(command!)) candidates = files;\n return [candidates.filter(c => c.startsWith(fragment)).slice(0, 100), fragment];\n}\n"]}
@@ -0,0 +1,75 @@
1
+ import readline from 'node:readline';
2
+ import { type ChatTheme } from './render.js';
3
+ export interface ComposerOptions {
4
+ input: NodeJS.ReadStream;
5
+ output: NodeJS.WriteStream;
6
+ theme?: ChatTheme;
7
+ state: () => {
8
+ mode: string;
9
+ status: string;
10
+ busy: boolean;
11
+ pasting: boolean;
12
+ files: string[];
13
+ };
14
+ submit: (message: string) => void;
15
+ cancel: () => void;
16
+ exit: () => void;
17
+ fullscreen?: boolean;
18
+ welcome?: (columns: number, rows: number) => string;
19
+ header?: () => string;
20
+ }
21
+ export interface PickerChoice {
22
+ value: string;
23
+ label: string;
24
+ detail?: string;
25
+ }
26
+ export interface PickerOptions {
27
+ title: string;
28
+ hint?: string;
29
+ choices: PickerChoice[];
30
+ selected?: string;
31
+ signal?: AbortSignal;
32
+ }
33
+ /** Raw-input composer with a full-screen viewport or an inline terminal footer. */
34
+ export declare class TerminalComposer {
35
+ private options;
36
+ value: string;
37
+ private cursor;
38
+ private selected;
39
+ private dismissed;
40
+ private history;
41
+ private historyIndex;
42
+ private draft;
43
+ private paste;
44
+ private pasteCR;
45
+ private suspended;
46
+ private attached;
47
+ private drawnRows;
48
+ private cursorRow;
49
+ private timer;
50
+ private rawBefore;
51
+ private theme;
52
+ private screen;
53
+ private viewHeight;
54
+ private picker;
55
+ private onKey;
56
+ private onResize;
57
+ constructor(options: ComposerOptions);
58
+ get choosing(): boolean;
59
+ start(): void;
60
+ suspend(): void;
61
+ close(): void;
62
+ refresh(): void;
63
+ print(text: string): void;
64
+ clear(): void;
65
+ choose(options: PickerOptions): Promise<string | null>;
66
+ private pickerChoices;
67
+ private pickerKey;
68
+ private erase;
69
+ private replace;
70
+ private insert;
71
+ private suggestions;
72
+ key(text: string, key?: readline.Key): void;
73
+ private deleteNext;
74
+ private render;
75
+ }
@@ -0,0 +1,467 @@
1
+ import readline from 'node:readline';
2
+ import { terminalText } from '../agent/process.js';
3
+ import { completeChat, suggestCommands } from './commands.js';
4
+ import { cells, clusterCells, clip, graphemes } from './text.js';
5
+ import { plainTheme } from './render.js';
6
+ import { TerminalScreen, wrapScreenLine } from './screen.js';
7
+ /** Raw-input composer with a full-screen viewport or an inline terminal footer. */
8
+ export class TerminalComposer {
9
+ options;
10
+ value = '';
11
+ cursor = 0;
12
+ selected = 0;
13
+ dismissed = false;
14
+ history = [];
15
+ historyIndex = -1;
16
+ draft = '';
17
+ paste = false;
18
+ pasteCR = false;
19
+ suspended = true;
20
+ attached = false;
21
+ drawnRows = 0;
22
+ cursorRow = 0;
23
+ timer = null;
24
+ rawBefore = false;
25
+ theme;
26
+ screen;
27
+ viewHeight = 1;
28
+ picker = null;
29
+ onKey = (text, key = {}) => this.key(text, key);
30
+ onResize = () => this.refresh();
31
+ constructor(options) {
32
+ this.options = options;
33
+ this.theme = options.theme || plainTheme;
34
+ this.screen = options.fullscreen ? new TerminalScreen(options.output) : null;
35
+ }
36
+ get choosing() { return this.picker !== null; }
37
+ start() {
38
+ if (this.attached)
39
+ return;
40
+ this.attached = true;
41
+ this.suspended = false;
42
+ this.rawBefore = !!this.options.input.isRaw;
43
+ readline.emitKeypressEvents(this.options.input);
44
+ this.options.input.setRawMode?.(true);
45
+ this.options.input.resume();
46
+ this.options.input.on('keypress', this.onKey);
47
+ this.options.input.on('end', this.options.exit);
48
+ this.options.output.on('resize', this.onResize);
49
+ this.screen?.enter();
50
+ this.options.output.write('\x1b[?2004h');
51
+ this.render();
52
+ }
53
+ suspend() {
54
+ this.picker?.finish(null);
55
+ this.erase();
56
+ this.suspended = true;
57
+ if (this.timer) {
58
+ clearTimeout(this.timer);
59
+ this.timer = null;
60
+ }
61
+ if (!this.attached)
62
+ return;
63
+ this.options.input.off('keypress', this.onKey);
64
+ this.options.input.off('end', this.options.exit);
65
+ this.options.output.off('resize', this.onResize);
66
+ this.options.output.write('\x1b[?2004l');
67
+ this.screen?.leave();
68
+ this.options.input.setRawMode?.(this.rawBefore);
69
+ // The keypress decoder remains attached to this stream. Pause the parent's
70
+ // reads so the inherited wizard TTY receives every keystroke exclusively.
71
+ this.options.input.pause();
72
+ this.attached = false;
73
+ }
74
+ close() { if (this.screen && !this.suspended)
75
+ this.render(); this.suspend(); this.options.input.pause(); }
76
+ refresh() {
77
+ if (this.suspended || this.timer)
78
+ return;
79
+ this.timer = setTimeout(() => { this.timer = null; this.render(); }, 24);
80
+ this.timer.unref();
81
+ }
82
+ print(text) {
83
+ if (this.screen) {
84
+ this.screen.append(text);
85
+ this.refresh();
86
+ return;
87
+ }
88
+ if (this.suspended) {
89
+ this.options.output.write(text + '\n');
90
+ return;
91
+ }
92
+ this.erase();
93
+ this.options.output.write(text + '\n');
94
+ this.refresh();
95
+ }
96
+ clear() { if (this.screen) {
97
+ this.screen.clear();
98
+ this.refresh();
99
+ }
100
+ else {
101
+ this.erase();
102
+ this.options.output.write('\x1b[2J\x1b[H');
103
+ } }
104
+ choose(options) {
105
+ this.picker?.finish(null);
106
+ if (this.suspended || options.signal?.aborted)
107
+ return Promise.resolve(null);
108
+ return new Promise(resolve => {
109
+ const abort = () => finish(null);
110
+ const finish = (value) => {
111
+ options.signal?.removeEventListener('abort', abort);
112
+ if (this.picker?.finish !== finish)
113
+ return;
114
+ this.picker = null;
115
+ this.paste = false;
116
+ this.refresh();
117
+ resolve(value);
118
+ };
119
+ this.picker = { ...options, query: '', index: Math.max(0, options.choices.findIndex(c => c.value === options.selected)), finish };
120
+ options.signal?.addEventListener('abort', abort, { once: true });
121
+ if (options.signal?.aborted)
122
+ finish(null);
123
+ else
124
+ this.refresh();
125
+ });
126
+ }
127
+ pickerChoices() {
128
+ const query = this.picker?.query.toLowerCase() || '';
129
+ return this.picker?.choices.filter(c => !query || (c.label + ' ' + (c.detail || '')).toLowerCase().includes(query)) || [];
130
+ }
131
+ pickerKey(text, key) {
132
+ const picker = this.picker;
133
+ if (key.name === 'paste-start') {
134
+ this.paste = true;
135
+ return;
136
+ }
137
+ if (key.name === 'paste-end') {
138
+ this.paste = false;
139
+ this.refresh();
140
+ return;
141
+ }
142
+ if (this.paste) {
143
+ if (text && !key.ctrl && !key.meta)
144
+ picker.query = (picker.query + terminalText(text).replace(/[\r\n\t]/g, ' ')).slice(0, 512);
145
+ picker.index = 0;
146
+ this.refresh();
147
+ return;
148
+ }
149
+ if (key.name === 'escape' || (key.ctrl && key.name === 'c')) {
150
+ picker.finish(null);
151
+ return;
152
+ }
153
+ if (key.ctrl && key.name === 'd') {
154
+ picker.finish(null);
155
+ this.options.exit();
156
+ return;
157
+ }
158
+ const choices = this.pickerChoices();
159
+ if (key.name === 'return' || key.name === 'enter') {
160
+ if (choices.length)
161
+ picker.finish(choices[picker.index % choices.length].value);
162
+ }
163
+ else if (['up', 'down', 'tab', 'pageup', 'pagedown'].includes(key.name || '')) {
164
+ const step = key.name === 'pageup' ? -6 : key.name === 'pagedown' ? 6 : key.name === 'up' || key.shift ? -1 : 1;
165
+ picker.index = choices.length ? (picker.index + step + choices.length * 6) % choices.length : 0;
166
+ }
167
+ else if (key.ctrl && key.name === 'u') {
168
+ picker.query = '';
169
+ picker.index = 0;
170
+ }
171
+ else if (key.name === 'backspace') {
172
+ picker.query = graphemes(picker.query).slice(0, -1).join('');
173
+ picker.index = 0;
174
+ }
175
+ else if (text && !key.ctrl && !key.meta && !/^[\x00-\x1f\x7f]/.test(text)) {
176
+ picker.query = (picker.query + terminalText(text)).slice(0, 512);
177
+ picker.index = 0;
178
+ }
179
+ this.refresh();
180
+ }
181
+ erase() {
182
+ if (this.screen)
183
+ return;
184
+ if (!this.drawnRows)
185
+ return;
186
+ if (this.cursorRow)
187
+ readline.moveCursor(this.options.output, 0, -this.cursorRow);
188
+ readline.cursorTo(this.options.output, 0);
189
+ readline.clearScreenDown(this.options.output);
190
+ this.drawnRows = 0;
191
+ this.cursorRow = 0;
192
+ }
193
+ replace(text) { this.value = text; this.cursor = text.length; this.selected = 0; this.dismissed = false; }
194
+ insert(text) {
195
+ const clean = terminalText(text).replace(/\r\n?/g, '\n').replace(/\t/g, ' ');
196
+ if (this.value.length + clean.length > 16000)
197
+ return;
198
+ this.value = this.value.slice(0, this.cursor) + clean + this.value.slice(this.cursor);
199
+ this.cursor += clean.length;
200
+ this.selected = 0;
201
+ this.dismissed = false;
202
+ this.historyIndex = -1;
203
+ }
204
+ suggestions() { return this.options.state().pasting || this.dismissed || this.cursor !== this.value.length ? [] : suggestCommands(this.value); }
205
+ key(text, key = {}) {
206
+ if (this.suspended)
207
+ return;
208
+ if (this.picker) {
209
+ this.pickerKey(text, key);
210
+ return;
211
+ }
212
+ if (this.screen && (key.name === 'pageup' || key.name === 'pagedown')) {
213
+ this.screen.scroll(key.name === 'pageup' ? 1 : -1, Math.max(1, (this.options.output.columns || 80) - 1), this.viewHeight);
214
+ this.refresh();
215
+ return;
216
+ }
217
+ if (key.name === 'paste-start') {
218
+ this.paste = true;
219
+ this.pasteCR = false;
220
+ this.dismissed = true;
221
+ return;
222
+ }
223
+ if (key.name === 'paste-end') {
224
+ this.paste = false;
225
+ this.refresh();
226
+ return;
227
+ }
228
+ if (this.paste) {
229
+ if (key.name === 'return') {
230
+ this.insert('\n');
231
+ this.pasteCR = true;
232
+ }
233
+ else if (key.name === 'enter') {
234
+ if (!this.pasteCR)
235
+ this.insert('\n');
236
+ this.pasteCR = false;
237
+ }
238
+ else {
239
+ this.pasteCR = false;
240
+ if (text && !key.ctrl && !key.meta)
241
+ this.insert(text);
242
+ }
243
+ this.refresh();
244
+ return;
245
+ }
246
+ const suggestions = this.suggestions();
247
+ if (key.ctrl) {
248
+ if (key.name === 'c') {
249
+ this.replace('');
250
+ this.options.cancel();
251
+ }
252
+ else if (key.name === 'd') {
253
+ if (!this.value)
254
+ this.options.exit();
255
+ else
256
+ this.deleteNext();
257
+ }
258
+ else if (key.name === 'a')
259
+ this.cursor = 0;
260
+ else if (key.name === 'e')
261
+ this.cursor = this.value.length;
262
+ else if (key.name === 'u') {
263
+ this.value = this.value.slice(this.cursor);
264
+ this.cursor = 0;
265
+ }
266
+ else if (key.name === 'k')
267
+ this.value = this.value.slice(0, this.cursor);
268
+ else if (key.name === 'w') {
269
+ const left = this.value.slice(0, this.cursor).replace(/\s*\S+\s*$/, '');
270
+ this.value = left + this.value.slice(this.cursor);
271
+ this.cursor = left.length;
272
+ }
273
+ this.refresh();
274
+ return;
275
+ }
276
+ if (key.name === 'escape') {
277
+ this.dismissed = true;
278
+ this.refresh();
279
+ return;
280
+ }
281
+ if ((key.name === 'up' || key.name === 'down') && suggestions.length) {
282
+ this.selected = (this.selected + (key.name === 'up' ? -1 : 1) + suggestions.length) % suggestions.length;
283
+ }
284
+ else if (key.name === 'tab' || ((key.name === 'return' || key.name === 'enter') && suggestions.length &&
285
+ this.value !== '/' + suggestions[this.selected % suggestions.length][0] && !key.meta && !key.shift)) {
286
+ if (suggestions.length) {
287
+ const name = suggestions[this.selected % suggestions.length][0];
288
+ this.replace('/' + name + (name === 'model' ? '' : ' '));
289
+ this.dismissed = true;
290
+ }
291
+ else {
292
+ const [hits, fragment] = completeChat(this.value, this.options.state().files);
293
+ if (hits.length)
294
+ this.replace(this.value.slice(0, this.value.length - fragment.length) + hits[0]);
295
+ }
296
+ }
297
+ else if (key.name === 'return' || key.name === 'enter') {
298
+ if (key.meta || key.shift)
299
+ this.insert('\n');
300
+ else {
301
+ const message = this.value;
302
+ if (message.trim()) {
303
+ this.history = [message, ...this.history.filter(h => h !== message)].slice(0, 200);
304
+ }
305
+ this.replace('');
306
+ this.historyIndex = -1;
307
+ if (this.screen)
308
+ this.screen.append(this.theme.muted('you') + ' › ' + terminalText(message));
309
+ else {
310
+ this.erase();
311
+ this.options.output.write(this.theme.muted('you') + ' › ' + terminalText(message) + '\n');
312
+ }
313
+ this.options.submit(message);
314
+ }
315
+ }
316
+ else if (key.name === 'up' || key.name === 'down') {
317
+ if (this.historyIndex === -1)
318
+ this.draft = this.value;
319
+ this.historyIndex = Math.max(-1, Math.min(this.history.length - 1, this.historyIndex + (key.name === 'up' ? 1 : -1)));
320
+ const index = this.historyIndex;
321
+ this.replace(index < 0 ? this.draft : this.history[index]);
322
+ this.historyIndex = index;
323
+ this.dismissed = true;
324
+ }
325
+ else if (key.name === 'left')
326
+ this.cursor -= graphemes(this.value.slice(0, this.cursor)).at(-1)?.length || 0;
327
+ else if (key.name === 'right')
328
+ this.cursor += graphemes(this.value.slice(this.cursor))[0]?.length || 0;
329
+ else if (key.name === 'home')
330
+ this.cursor = 0;
331
+ else if (key.name === 'end')
332
+ this.cursor = this.value.length;
333
+ else if (key.name === 'backspace') {
334
+ const count = graphemes(this.value.slice(0, this.cursor)).at(-1)?.length || 0;
335
+ this.value = this.value.slice(0, this.cursor - count) + this.value.slice(this.cursor);
336
+ this.cursor -= count;
337
+ this.selected = 0;
338
+ this.dismissed = false;
339
+ }
340
+ else if (key.name === 'delete')
341
+ this.deleteNext();
342
+ else if (text && !key.meta && !/^[\x00-\x1f\x7f]/.test(text))
343
+ this.insert(text);
344
+ this.refresh();
345
+ }
346
+ deleteNext() { const count = graphemes(this.value.slice(this.cursor))[0]?.length || 0; this.value = this.value.slice(0, this.cursor) + this.value.slice(this.cursor + count); }
347
+ render() {
348
+ if (this.suspended)
349
+ return;
350
+ this.erase();
351
+ const columns = Math.max(2, this.options.output.columns || Number(process.env.COLUMNS) || 80), room = columns - 1;
352
+ const state = this.options.state(), prefix = this.picker ? 'filter › ' : state.pasting ? 'paste › ' : state.mode + ' › ';
353
+ const value = this.picker ? this.picker.query : this.value, cursor = this.picker ? value.length : this.cursor;
354
+ const lead = clip(prefix, Math.max(1, room - 1), false);
355
+ const lines = [''];
356
+ let row = 0, col = 0, cursorRow = 0, cursorCol = 0, offset = -lead.length;
357
+ for (const g of graphemes(lead + value)) {
358
+ if (offset === cursor) {
359
+ cursorRow = row;
360
+ cursorCol = col;
361
+ }
362
+ if (g === '\n') {
363
+ lines.push('');
364
+ row++;
365
+ col = 0;
366
+ }
367
+ else {
368
+ const actualSize = clusterCells(g), size = Math.min(room, actualSize);
369
+ if (col + size > room) {
370
+ lines.push('');
371
+ row++;
372
+ col = 0;
373
+ if (offset === cursor) {
374
+ cursorRow = row;
375
+ cursorCol = 0;
376
+ }
377
+ }
378
+ lines[row] += actualSize > room ? '?' : g;
379
+ col += size;
380
+ }
381
+ offset += g.length;
382
+ }
383
+ if (cursor === value.length) {
384
+ cursorRow = row;
385
+ cursorCol = col;
386
+ }
387
+ const maxInput = Math.max(1, Math.min(8, (this.options.output.rows || 24) - (this.screen ? 12 : 7)));
388
+ const start = Math.max(0, cursorRow - maxInput + 1);
389
+ const inputLines = lines.slice(start, start + maxInput);
390
+ cursorRow -= start;
391
+ if (start === 0)
392
+ inputLines[0] = this.theme.accent(lead) + inputLines[0].slice(lead.length);
393
+ if (!value)
394
+ inputLines[0] += this.theme.muted(clip(this.picker ? 'Type to search · arrows to choose' : 'Ask about the repo, or type / for commands…', Math.max(0, room - cells(lead))));
395
+ const rows = [(this.theme.status || this.theme.muted)(clip(state.status, room)), this.theme.accent('─'.repeat(room)), ...inputLines,
396
+ this.theme.accent('─'.repeat(room))];
397
+ cursorRow += 2;
398
+ const suggestions = this.picker ? [] : this.suggestions();
399
+ if (this.picker) {
400
+ const picker = this.picker, choices = this.pickerChoices();
401
+ const count = Math.max(1, Math.min(8, (this.options.output.rows || 24) - rows.length - (this.screen ? 6 : 4)));
402
+ const begin = Math.max(0, picker.index - count + 1);
403
+ const inner = Math.max(0, room - 4);
404
+ const box = (text) => { const shown = clip(text, inner); return room >= 6 ? '│ ' + shown + ' '.repeat(inner - cells(shown)) + ' │' : clip(text, room); };
405
+ const heading = clip(' ' + picker.title + ' ', Math.max(0, room - 4));
406
+ rows.push(this.theme.accent(room >= 6 ? '╭─' + heading + '─'.repeat(room - 3 - cells(heading)) + '╮' : clip(picker.title, room)));
407
+ if (picker.hint)
408
+ rows.push(this.theme.muted(box(picker.hint)));
409
+ if (!choices.length)
410
+ rows.push(this.theme.muted(box('No matches · clear the filter with Ctrl-U')));
411
+ choices.slice(begin, begin + count).forEach((choice, i) => {
412
+ const chosen = begin + i === picker.index;
413
+ const text = `${chosen ? '❯' : ' '} ${choice.label}${choice.detail ? ' · ' + choice.detail : ''}`;
414
+ rows.push((chosen ? this.theme.accent : this.theme.muted)(box(text)));
415
+ });
416
+ const hint = clip(` ↑/↓ select · Enter choose · Esc cancel · ${choices.length ? picker.index + 1 : 0}/${choices.length} `, Math.max(0, room - 4));
417
+ rows.push(this.theme.accent(room >= 6 ? '╰─' + hint + '─'.repeat(room - 3 - cells(hint)) + '╯' : clip(hint, room)));
418
+ }
419
+ else if (suggestions.length) {
420
+ const count = Math.max(1, Math.min(6, (this.options.output.rows || 24) - rows.length - (this.screen ? 4 : 2)));
421
+ const begin = Math.max(0, this.selected - count + 1), visible = suggestions.slice(begin, begin + count);
422
+ visible.forEach(([name, usage, summary], index) => {
423
+ const chosen = begin + index === this.selected;
424
+ const label = `${chosen ? '›' : ' '} /${name}${usage ? ' ' + usage : ''}`;
425
+ const shown = clip(label, Math.min(36, Math.floor(room * 0.5)));
426
+ const detail = room > 45 ? ' ' + clip(summary, room - cells(shown) - 2) : '';
427
+ rows.push((chosen ? this.theme.accent : this.theme.muted)(shown + detail));
428
+ });
429
+ rows.push(this.theme.muted(clip(`↑/↓ select · Tab/Enter insert · Esc close · ${this.selected + 1}/${suggestions.length}`, room)));
430
+ }
431
+ else
432
+ rows.push(this.theme.muted(clip(state.busy ? 'Working · /cancel or Ctrl-C to stop' : state.pasting ? '/send submit · /discard cancel' : this.screen ? 'Type / for commands · PgUp/PgDn scroll · Alt-Enter newline · Ctrl-D exit' : 'Type / for commands · Alt-Enter newline · Ctrl-D exit', room)));
433
+ if (this.screen) {
434
+ const height = Math.max(1, this.options.output.rows || 24);
435
+ if (height < 3) {
436
+ const tiny = [inputLines[Math.max(0, cursorRow - 2)] || inputLines[0], this.theme.muted(clip(state.status, room))].slice(0, height);
437
+ this.viewHeight = 1;
438
+ this.screen.draw(tiny, columns, 0, cursorCol);
439
+ return;
440
+ }
441
+ let footer = rows, footerCursorRow = cursorRow;
442
+ // Tiny windows keep the active input visible; menus simplify to one choice.
443
+ if (footer.length > height - 2) {
444
+ const choices = this.picker ? this.pickerChoices() : [];
445
+ const hint = this.picker ? choices[this.picker.index]?.label || 'No matches' : suggestions[this.selected]?.[0] ? '/' + suggestions[this.selected][0] : 'Enter send · Esc cancel';
446
+ footer = [inputLines[Math.max(0, cursorRow - 2)] || inputLines[0], this.theme.muted(clip(hint, room))].slice(0, Math.max(1, height - 2));
447
+ footerCursorRow = 0;
448
+ }
449
+ this.viewHeight = height - footer.length - 1;
450
+ const welcome = this.options.welcome?.(columns, this.viewHeight) || '';
451
+ const content = this.screen.view(room, this.viewHeight, welcome);
452
+ const header = (this.options.header?.() || 'ONBOARDER') + (this.screen.scrolled ? ' · history · PgDn to return' : '');
453
+ const frame = [wrapScreenLine(header, room)[0], ...content,
454
+ ...Array(Math.max(0, this.viewHeight - content.length)).fill(''), ...footer];
455
+ this.screen.draw(frame, columns, height - footer.length + footerCursorRow, cursorCol);
456
+ return;
457
+ }
458
+ this.options.output.write(rows.join('\n'));
459
+ const up = rows.length - 1 - cursorRow;
460
+ if (up)
461
+ readline.moveCursor(this.options.output, 0, -up);
462
+ readline.cursorTo(this.options.output, cursorCol);
463
+ this.drawnRows = rows.length;
464
+ this.cursorRow = cursorRow;
465
+ }
466
+ }
467
+ //# sourceMappingURL=composer.js.map