webmcp-cli 1.0.0 → 1.2.1

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 (347) hide show
  1. package/dist/agent/features/agent-simulator.d.ts +67 -0
  2. package/dist/agent/features/agent-simulator.js +368 -0
  3. package/dist/agent/features/agent-simulator.js.map +1 -0
  4. package/dist/agent/features/index.d.ts +8 -0
  5. package/dist/agent/features/index.js +9 -0
  6. package/dist/agent/features/index.js.map +1 -0
  7. package/dist/agent/features/simulation-judge.d.ts +78 -0
  8. package/dist/agent/features/simulation-judge.js +276 -0
  9. package/dist/agent/features/simulation-judge.js.map +1 -0
  10. package/dist/agent/features/test-case-generator.d.ts +35 -0
  11. package/dist/agent/features/test-case-generator.js +257 -0
  12. package/dist/agent/features/test-case-generator.js.map +1 -0
  13. package/dist/agent/index.d.ts +7 -0
  14. package/dist/agent/index.js +10 -0
  15. package/dist/agent/index.js.map +1 -0
  16. package/dist/agent/llm-client.d.ts +76 -0
  17. package/dist/agent/llm-client.js +198 -0
  18. package/dist/agent/llm-client.js.map +1 -0
  19. package/dist/audit/run-single-page-audit.d.ts +41 -0
  20. package/dist/audit/run-single-page-audit.js +103 -0
  21. package/dist/audit/run-single-page-audit.js.map +1 -0
  22. package/dist/bin/webmcp.d.ts +5 -0
  23. package/dist/bin/webmcp.js +14 -0
  24. package/dist/bin/webmcp.js.map +1 -0
  25. package/dist/browser/audit-runner.d.ts +30 -0
  26. package/dist/browser/audit-runner.js +77 -0
  27. package/dist/browser/audit-runner.js.map +1 -0
  28. package/dist/browser/index.d.ts +6 -0
  29. package/dist/browser/index.js +7 -0
  30. package/dist/browser/index.js.map +1 -0
  31. package/dist/browser/interceptor.d.ts +68 -0
  32. package/dist/browser/interceptor.js +257 -0
  33. package/dist/browser/interceptor.js.map +1 -0
  34. package/dist/browser/playwright.d.ts +98 -0
  35. package/dist/browser/playwright.js +158 -0
  36. package/dist/browser/playwright.js.map +1 -0
  37. package/dist/cli/commands/audit.d.ts +12 -0
  38. package/dist/cli/commands/audit.js +349 -0
  39. package/dist/cli/commands/audit.js.map +1 -0
  40. package/dist/cli/commands/interactive.d.ts +10 -0
  41. package/dist/cli/commands/interactive.js +34 -0
  42. package/dist/cli/commands/interactive.js.map +1 -0
  43. package/dist/cli/index.d.ts +17 -0
  44. package/dist/cli/index.js +84 -0
  45. package/dist/cli/index.js.map +1 -0
  46. package/dist/cli/options/parse-audit-options.d.ts +12 -0
  47. package/dist/cli/options/parse-audit-options.js +64 -0
  48. package/dist/cli/options/parse-audit-options.js.map +1 -0
  49. package/dist/core/constants.d.ts +102 -0
  50. package/dist/core/constants.js +214 -0
  51. package/dist/core/constants.js.map +1 -0
  52. package/dist/core/types/audit.d.ts +260 -0
  53. package/dist/core/types/audit.js +5 -0
  54. package/dist/core/types/audit.js.map +1 -0
  55. package/dist/core/types/index.d.ts +6 -0
  56. package/dist/core/types/index.js +7 -0
  57. package/dist/core/types/index.js.map +1 -0
  58. package/dist/core/types/rule.d.ts +190 -0
  59. package/dist/core/types/rule.js +26 -0
  60. package/dist/core/types/rule.js.map +1 -0
  61. package/dist/core/types/tool.d.ts +312 -0
  62. package/dist/core/types/tool.js +6 -0
  63. package/dist/core/types/tool.js.map +1 -0
  64. package/dist/detection/declarative.d.ts +27 -0
  65. package/dist/detection/declarative.js +343 -0
  66. package/dist/detection/declarative.js.map +1 -0
  67. package/dist/detection/imperative.d.ts +38 -0
  68. package/dist/detection/imperative.js +99 -0
  69. package/dist/detection/imperative.js.map +1 -0
  70. package/dist/detection/index.d.ts +5 -0
  71. package/dist/detection/index.js +6 -0
  72. package/dist/detection/index.js.map +1 -0
  73. package/dist/index.d.ts +12 -0
  74. package/dist/index.js +19 -0
  75. package/dist/index.js.map +1 -0
  76. package/dist/llm/advice-service.d.ts +38 -0
  77. package/dist/llm/advice-service.js +243 -0
  78. package/dist/llm/advice-service.js.map +1 -0
  79. package/dist/llm/evaluator.d.ts +89 -0
  80. package/dist/llm/evaluator.js +274 -0
  81. package/dist/llm/evaluator.js.map +1 -0
  82. package/dist/llm/index.d.ts +11 -0
  83. package/dist/llm/index.js +15 -0
  84. package/dist/llm/index.js.map +1 -0
  85. package/dist/llm/json-response.d.ts +12 -0
  86. package/dist/llm/json-response.js +67 -0
  87. package/dist/llm/json-response.js.map +1 -0
  88. package/dist/llm/providers/mock.d.ts +29 -0
  89. package/dist/llm/providers/mock.js +324 -0
  90. package/dist/llm/providers/mock.js.map +1 -0
  91. package/dist/llm/providers/openrouter.d.ts +53 -0
  92. package/dist/llm/providers/openrouter.js +321 -0
  93. package/dist/llm/providers/openrouter.js.map +1 -0
  94. package/dist/llm/request-cache.d.ts +28 -0
  95. package/dist/llm/request-cache.js +99 -0
  96. package/dist/llm/request-cache.js.map +1 -0
  97. package/dist/llm/types.d.ts +233 -0
  98. package/dist/llm/types.js +7 -0
  99. package/dist/llm/types.js.map +1 -0
  100. package/dist/rules/best-practices/BP-001.d.ts +11 -0
  101. package/dist/rules/best-practices/BP-001.js +56 -0
  102. package/dist/rules/best-practices/BP-001.js.map +1 -0
  103. package/dist/rules/best-practices/BP-002.d.ts +11 -0
  104. package/dist/rules/best-practices/BP-002.js +63 -0
  105. package/dist/rules/best-practices/BP-002.js.map +1 -0
  106. package/dist/rules/best-practices/BP-003.d.ts +11 -0
  107. package/dist/rules/best-practices/BP-003.js +68 -0
  108. package/dist/rules/best-practices/BP-003.js.map +1 -0
  109. package/dist/rules/coverage/COV-001.d.ts +8 -0
  110. package/dist/rules/coverage/COV-001.js +51 -0
  111. package/dist/rules/coverage/COV-001.js.map +1 -0
  112. package/dist/rules/description/DESC-003.d.ts +13 -0
  113. package/dist/rules/description/DESC-003.js +96 -0
  114. package/dist/rules/description/DESC-003.js.map +1 -0
  115. package/dist/rules/description/DESC-004.d.ts +8 -0
  116. package/dist/rules/description/DESC-004.js +61 -0
  117. package/dist/rules/description/DESC-004.js.map +1 -0
  118. package/dist/rules/description/DESC-005.d.ts +12 -0
  119. package/dist/rules/description/DESC-005.js +70 -0
  120. package/dist/rules/description/DESC-005.js.map +1 -0
  121. package/dist/rules/description/index.d.ts +4 -0
  122. package/dist/rules/description/index.js +5 -0
  123. package/dist/rules/description/index.js.map +1 -0
  124. package/dist/rules/implementation/IMP-001.d.ts +10 -0
  125. package/dist/rules/implementation/IMP-001.js +36 -0
  126. package/dist/rules/implementation/IMP-001.js.map +1 -0
  127. package/dist/rules/implementation/IMP-003.d.ts +9 -0
  128. package/dist/rules/implementation/IMP-003.js +45 -0
  129. package/dist/rules/implementation/IMP-003.js.map +1 -0
  130. package/dist/rules/implementation/IMP-004.d.ts +9 -0
  131. package/dist/rules/implementation/IMP-004.js +48 -0
  132. package/dist/rules/implementation/IMP-004.js.map +1 -0
  133. package/dist/rules/implementation/IMP-005.d.ts +9 -0
  134. package/dist/rules/implementation/IMP-005.js +54 -0
  135. package/dist/rules/implementation/IMP-005.js.map +1 -0
  136. package/dist/rules/implementation/IMP-007.d.ts +8 -0
  137. package/dist/rules/implementation/IMP-007.js +79 -0
  138. package/dist/rules/implementation/IMP-007.js.map +1 -0
  139. package/dist/rules/implementation/IMP-013.d.ts +9 -0
  140. package/dist/rules/implementation/IMP-013.js +55 -0
  141. package/dist/rules/implementation/IMP-013.js.map +1 -0
  142. package/dist/rules/implementation/index.d.ts +9 -0
  143. package/dist/rules/implementation/index.js +10 -0
  144. package/dist/rules/implementation/index.js.map +1 -0
  145. package/dist/rules/index.d.ts +51 -0
  146. package/dist/rules/index.js +100 -0
  147. package/dist/rules/index.js.map +1 -0
  148. package/dist/rules/llm/LLM-001.d.ts +14 -0
  149. package/dist/rules/llm/LLM-001.js +78 -0
  150. package/dist/rules/llm/LLM-001.js.map +1 -0
  151. package/dist/rules/llm/LLM-002.d.ts +14 -0
  152. package/dist/rules/llm/LLM-002.js +77 -0
  153. package/dist/rules/llm/LLM-002.js.map +1 -0
  154. package/dist/rules/llm/LLM-003.d.ts +16 -0
  155. package/dist/rules/llm/LLM-003.js +82 -0
  156. package/dist/rules/llm/LLM-003.js.map +1 -0
  157. package/dist/rules/llm/LLM-004.d.ts +14 -0
  158. package/dist/rules/llm/LLM-004.js +87 -0
  159. package/dist/rules/llm/LLM-004.js.map +1 -0
  160. package/dist/rules/llm/LLM-005.d.ts +16 -0
  161. package/dist/rules/llm/LLM-005.js +105 -0
  162. package/dist/rules/llm/LLM-005.js.map +1 -0
  163. package/dist/rules/llm/index.d.ts +10 -0
  164. package/dist/rules/llm/index.js +11 -0
  165. package/dist/rules/llm/index.js.map +1 -0
  166. package/dist/rules/runner.d.ts +54 -0
  167. package/dist/rules/runner.js +138 -0
  168. package/dist/rules/runner.js.map +1 -0
  169. package/dist/rules/schema/SCHEMA-001.d.ts +9 -0
  170. package/dist/rules/schema/SCHEMA-001.js +57 -0
  171. package/dist/rules/schema/SCHEMA-001.js.map +1 -0
  172. package/dist/rules/schema/SCHEMA-002.d.ts +9 -0
  173. package/dist/rules/schema/SCHEMA-002.js +59 -0
  174. package/dist/rules/schema/SCHEMA-002.js.map +1 -0
  175. package/dist/rules/schema/SCHEMA-003.d.ts +10 -0
  176. package/dist/rules/schema/SCHEMA-003.js +66 -0
  177. package/dist/rules/schema/SCHEMA-003.js.map +1 -0
  178. package/dist/rules/schema/SCHEMA-011.d.ts +10 -0
  179. package/dist/rules/schema/SCHEMA-011.js +62 -0
  180. package/dist/rules/schema/SCHEMA-011.js.map +1 -0
  181. package/dist/rules/security/SEC-001.d.ts +12 -0
  182. package/dist/rules/security/SEC-001.js +66 -0
  183. package/dist/rules/security/SEC-001.js.map +1 -0
  184. package/dist/rules/utils/keywords.d.ts +35 -0
  185. package/dist/rules/utils/keywords.js +100 -0
  186. package/dist/rules/utils/keywords.js.map +1 -0
  187. package/dist/scoring/calculator.d.ts +27 -0
  188. package/dist/scoring/calculator.js +194 -0
  189. package/dist/scoring/calculator.js.map +1 -0
  190. package/dist/scoring/grades.d.ts +34 -0
  191. package/dist/scoring/grades.js +167 -0
  192. package/dist/scoring/grades.js.map +1 -0
  193. package/dist/scoring/index.d.ts +5 -0
  194. package/dist/scoring/index.js +6 -0
  195. package/dist/scoring/index.js.map +1 -0
  196. package/dist/ui/banner.d.ts +21 -0
  197. package/dist/ui/banner.js +60 -0
  198. package/dist/ui/banner.js.map +1 -0
  199. package/dist/ui/design-tokens.d.ts +23 -0
  200. package/dist/ui/design-tokens.js +58 -0
  201. package/dist/ui/design-tokens.js.map +1 -0
  202. package/dist/ui/findings.d.ts +23 -0
  203. package/dist/ui/findings.js +190 -0
  204. package/dist/ui/findings.js.map +1 -0
  205. package/dist/ui/index.d.ts +9 -0
  206. package/dist/ui/index.js +10 -0
  207. package/dist/ui/index.js.map +1 -0
  208. package/dist/ui/ink/App.d.ts +14 -0
  209. package/dist/ui/ink/App.js +113 -0
  210. package/dist/ui/ink/App.js.map +1 -0
  211. package/dist/ui/ink/FullScreenLayout.d.ts +16 -0
  212. package/dist/ui/ink/FullScreenLayout.js +29 -0
  213. package/dist/ui/ink/FullScreenLayout.js.map +1 -0
  214. package/dist/ui/ink/InteractiveApp.d.ts +28 -0
  215. package/dist/ui/ink/InteractiveApp.js +229 -0
  216. package/dist/ui/ink/InteractiveApp.js.map +1 -0
  217. package/dist/ui/ink/RealAuditApp.d.ts +19 -0
  218. package/dist/ui/ink/RealAuditApp.js +170 -0
  219. package/dist/ui/ink/RealAuditApp.js.map +1 -0
  220. package/dist/ui/ink/components/AnimatedProgressBar.d.ts +20 -0
  221. package/dist/ui/ink/components/AnimatedProgressBar.js +46 -0
  222. package/dist/ui/ink/components/AnimatedProgressBar.js.map +1 -0
  223. package/dist/ui/ink/components/AsciiLogo.d.ts +12 -0
  224. package/dist/ui/ink/components/AsciiLogo.js +35 -0
  225. package/dist/ui/ink/components/AsciiLogo.js.map +1 -0
  226. package/dist/ui/ink/components/CategoryBars.d.ts +18 -0
  227. package/dist/ui/ink/components/CategoryBars.js +18 -0
  228. package/dist/ui/ink/components/CategoryBars.js.map +1 -0
  229. package/dist/ui/ink/components/FindingsTable.d.ts +18 -0
  230. package/dist/ui/ink/components/FindingsTable.js +19 -0
  231. package/dist/ui/ink/components/FindingsTable.js.map +1 -0
  232. package/dist/ui/ink/components/Footer.d.ts +15 -0
  233. package/dist/ui/ink/components/Footer.js +20 -0
  234. package/dist/ui/ink/components/Footer.js.map +1 -0
  235. package/dist/ui/ink/components/Header.d.ts +11 -0
  236. package/dist/ui/ink/components/Header.js +12 -0
  237. package/dist/ui/ink/components/Header.js.map +1 -0
  238. package/dist/ui/ink/components/LinkList.d.ts +17 -0
  239. package/dist/ui/ink/components/LinkList.js +44 -0
  240. package/dist/ui/ink/components/LinkList.js.map +1 -0
  241. package/dist/ui/ink/components/Navigation.d.ts +26 -0
  242. package/dist/ui/ink/components/Navigation.js +62 -0
  243. package/dist/ui/ink/components/Navigation.js.map +1 -0
  244. package/dist/ui/ink/components/ProgressBar.d.ts +15 -0
  245. package/dist/ui/ink/components/ProgressBar.js +14 -0
  246. package/dist/ui/ink/components/ProgressBar.js.map +1 -0
  247. package/dist/ui/ink/components/ScoreCard.d.ts +30 -0
  248. package/dist/ui/ink/components/ScoreCard.js +26 -0
  249. package/dist/ui/ink/components/ScoreCard.js.map +1 -0
  250. package/dist/ui/ink/components/SimulationResults.d.ts +33 -0
  251. package/dist/ui/ink/components/SimulationResults.js +23 -0
  252. package/dist/ui/ink/components/SimulationResults.js.map +1 -0
  253. package/dist/ui/ink/components/Spinner.d.ts +11 -0
  254. package/dist/ui/ink/components/Spinner.js +12 -0
  255. package/dist/ui/ink/components/Spinner.js.map +1 -0
  256. package/dist/ui/ink/components/ToolCard.d.ts +23 -0
  257. package/dist/ui/ink/components/ToolCard.js +20 -0
  258. package/dist/ui/ink/components/ToolCard.js.map +1 -0
  259. package/dist/ui/ink/components/shared/Badge.d.ts +21 -0
  260. package/dist/ui/ink/components/shared/Badge.js +39 -0
  261. package/dist/ui/ink/components/shared/Badge.js.map +1 -0
  262. package/dist/ui/ink/components/shared/Card.d.ts +18 -0
  263. package/dist/ui/ink/components/shared/Card.js +11 -0
  264. package/dist/ui/ink/components/shared/Card.js.map +1 -0
  265. package/dist/ui/ink/components/shared/HelpOverlay.d.ts +10 -0
  266. package/dist/ui/ink/components/shared/HelpOverlay.js +28 -0
  267. package/dist/ui/ink/components/shared/HelpOverlay.js.map +1 -0
  268. package/dist/ui/ink/components/shared/LoadingWithTimeout.d.ts +11 -0
  269. package/dist/ui/ink/components/shared/LoadingWithTimeout.js +21 -0
  270. package/dist/ui/ink/components/shared/LoadingWithTimeout.js.map +1 -0
  271. package/dist/ui/ink/components/shared/Menu.d.ts +23 -0
  272. package/dist/ui/ink/components/shared/Menu.js +43 -0
  273. package/dist/ui/ink/components/shared/Menu.js.map +1 -0
  274. package/dist/ui/ink/components/shared/Table.d.ts +23 -0
  275. package/dist/ui/ink/components/shared/Table.js +40 -0
  276. package/dist/ui/ink/components/shared/Table.js.map +1 -0
  277. package/dist/ui/ink/components/views/CrawlingView.d.ts +12 -0
  278. package/dist/ui/ink/components/views/CrawlingView.js +34 -0
  279. package/dist/ui/ink/components/views/CrawlingView.js.map +1 -0
  280. package/dist/ui/ink/components/views/DashboardView.d.ts +21 -0
  281. package/dist/ui/ink/components/views/DashboardView.js +51 -0
  282. package/dist/ui/ink/components/views/DashboardView.js.map +1 -0
  283. package/dist/ui/ink/components/views/FindingDetailView.d.ts +16 -0
  284. package/dist/ui/ink/components/views/FindingDetailView.js +34 -0
  285. package/dist/ui/ink/components/views/FindingDetailView.js.map +1 -0
  286. package/dist/ui/ink/components/views/FindingsView.d.ts +16 -0
  287. package/dist/ui/ink/components/views/FindingsView.js +79 -0
  288. package/dist/ui/ink/components/views/FindingsView.js.map +1 -0
  289. package/dist/ui/ink/components/views/OnboardingView.d.ts +12 -0
  290. package/dist/ui/ink/components/views/OnboardingView.js +40 -0
  291. package/dist/ui/ink/components/views/OnboardingView.js.map +1 -0
  292. package/dist/ui/ink/components/views/SimulationView.d.ts +17 -0
  293. package/dist/ui/ink/components/views/SimulationView.js +53 -0
  294. package/dist/ui/ink/components/views/SimulationView.js.map +1 -0
  295. package/dist/ui/ink/components/views/TestCaseDetailView.d.ts +11 -0
  296. package/dist/ui/ink/components/views/TestCaseDetailView.js +53 -0
  297. package/dist/ui/ink/components/views/TestCaseDetailView.js.map +1 -0
  298. package/dist/ui/ink/components/views/ToolDetailView.d.ts +15 -0
  299. package/dist/ui/ink/components/views/ToolDetailView.js +25 -0
  300. package/dist/ui/ink/components/views/ToolDetailView.js.map +1 -0
  301. package/dist/ui/ink/components/views/ToolsView.d.ts +15 -0
  302. package/dist/ui/ink/components/views/ToolsView.js +43 -0
  303. package/dist/ui/ink/components/views/ToolsView.js.map +1 -0
  304. package/dist/ui/ink/demo.d.ts +6 -0
  305. package/dist/ui/ink/demo.js +254 -0
  306. package/dist/ui/ink/demo.js.map +1 -0
  307. package/dist/ui/ink/hooks/useAnimation.d.ts +29 -0
  308. package/dist/ui/ink/hooks/useAnimation.js +89 -0
  309. package/dist/ui/ink/hooks/useAnimation.js.map +1 -0
  310. package/dist/ui/ink/hooks/useAudit.d.ts +69 -0
  311. package/dist/ui/ink/hooks/useAudit.js +99 -0
  312. package/dist/ui/ink/hooks/useAudit.js.map +1 -0
  313. package/dist/ui/ink/hooks/useCrawlAnimation.d.ts +19 -0
  314. package/dist/ui/ink/hooks/useCrawlAnimation.js +204 -0
  315. package/dist/ui/ink/hooks/useCrawlAnimation.js.map +1 -0
  316. package/dist/ui/ink/hooks/useKeyboardNav.d.ts +23 -0
  317. package/dist/ui/ink/hooks/useKeyboardNav.js +81 -0
  318. package/dist/ui/ink/hooks/useKeyboardNav.js.map +1 -0
  319. package/dist/ui/ink/hooks/useNavigation.d.ts +16 -0
  320. package/dist/ui/ink/hooks/useNavigation.js +42 -0
  321. package/dist/ui/ink/hooks/useNavigation.js.map +1 -0
  322. package/dist/ui/ink/hooks/useTerminalSize.d.ts +10 -0
  323. package/dist/ui/ink/hooks/useTerminalSize.js +29 -0
  324. package/dist/ui/ink/hooks/useTerminalSize.js.map +1 -0
  325. package/dist/ui/ink/index.d.ts +43 -0
  326. package/dist/ui/ink/index.js +50 -0
  327. package/dist/ui/ink/index.js.map +1 -0
  328. package/dist/ui/ink/render.d.ts +24 -0
  329. package/dist/ui/ink/render.js +14 -0
  330. package/dist/ui/ink/render.js.map +1 -0
  331. package/dist/ui/ink/theme.d.ts +37 -0
  332. package/dist/ui/ink/theme.js +38 -0
  333. package/dist/ui/ink/theme.js.map +1 -0
  334. package/dist/ui/ink/types.d.ts +77 -0
  335. package/dist/ui/ink/types.js +5 -0
  336. package/dist/ui/ink/types.js.map +1 -0
  337. package/dist/ui/score-display.d.ts +16 -0
  338. package/dist/ui/score-display.js +201 -0
  339. package/dist/ui/score-display.js.map +1 -0
  340. package/dist/ui/spinner.d.ts +45 -0
  341. package/dist/ui/spinner.js +112 -0
  342. package/dist/ui/spinner.js.map +1 -0
  343. package/dist/ui/utils.d.ts +13 -0
  344. package/dist/ui/utils.js +25 -0
  345. package/dist/ui/utils.js.map +1 -0
  346. package/package.json +61 -9
  347. package/index.js +0 -105
@@ -0,0 +1,79 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * FindingsView Component
4
+ *
5
+ * Issues list grouped by severity with responsive layout
6
+ */
7
+ import { memo } from 'react';
8
+ import { Box, Text, useInput } from 'ink';
9
+ import { SeverityBadge } from '../shared/Badge.js';
10
+ import { useTerminalSize } from '../../hooks/useTerminalSize.js';
11
+ // Mapping from category IDs (from dashboard) to rule ID prefixes
12
+ const CATEGORY_TO_RULE_PREFIXES = {
13
+ 'description': ['DESC-', 'LLM-'],
14
+ 'schema': ['SCHEMA-'],
15
+ 'implementation': ['IMP-'],
16
+ 'security': ['SEC-'],
17
+ 'best-practices': ['BP-'],
18
+ 'coverage': ['COV-'],
19
+ };
20
+ export const FindingsView = memo(function FindingsView({ findings, selectedIndex, onIndexChange, onFindingSelect, isActive, filterCategory, }) {
21
+ const { width } = useTerminalSize();
22
+ // Calculate responsive widths
23
+ const contentWidth = Math.max(40, width - 30);
24
+ const ruleIdWidth = Math.min(28, Math.floor(contentWidth * 0.3));
25
+ const messageWidth = Math.max(30, contentWidth - ruleIdWidth - 15);
26
+ // Filter findings if category is specified - use prefix mapping
27
+ const filteredFindings = filterCategory
28
+ ? findings.filter(f => {
29
+ const prefixes = CATEGORY_TO_RULE_PREFIXES[filterCategory] || [];
30
+ return prefixes.length === 0
31
+ ? f.ruleId.toLowerCase().startsWith(filterCategory.toLowerCase())
32
+ : prefixes.some(prefix => f.ruleId.startsWith(prefix));
33
+ })
34
+ : findings;
35
+ // Group by severity
36
+ const critical = filteredFindings.filter(f => f.severity === 'critical');
37
+ const warnings = filteredFindings.filter(f => f.severity === 'warning');
38
+ const info = filteredFindings.filter(f => f.severity === 'info');
39
+ // Flatten for navigation
40
+ const orderedFindings = [...critical, ...warnings, ...info];
41
+ useInput((input, key) => {
42
+ if (!isActive || orderedFindings.length === 0)
43
+ return;
44
+ if (key.upArrow) {
45
+ const newIndex = Math.max(0, selectedIndex - 1);
46
+ onIndexChange(newIndex);
47
+ }
48
+ else if (key.downArrow) {
49
+ const newIndex = Math.min(orderedFindings.length - 1, selectedIndex + 1);
50
+ onIndexChange(newIndex);
51
+ }
52
+ else if (key.return) {
53
+ const finding = orderedFindings[selectedIndex];
54
+ if (finding) {
55
+ onFindingSelect(finding.id);
56
+ }
57
+ }
58
+ }, { isActive });
59
+ if (orderedFindings.length === 0) {
60
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 1, flexGrow: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "FINDINGS" }), _jsx(Box, { marginTop: 2, justifyContent: "center", children: _jsx(Text, { color: "green", children: "No issues found - looking good!" }) })] }));
61
+ }
62
+ // Track current position for rendering
63
+ let currentIndex = 0;
64
+ const renderSection = (title, sectionFindings, color) => {
65
+ if (sectionFindings.length === 0)
66
+ return null;
67
+ const startIndex = currentIndex;
68
+ currentIndex += sectionFindings.length;
69
+ return (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { bold: true, color: color, children: [title, " (", sectionFindings.length, ")"] }) }), sectionFindings.map((finding, i) => {
70
+ const globalIndex = startIndex + i;
71
+ const isSelected = isActive && globalIndex === selectedIndex;
72
+ return (_jsxs(Box, { paddingX: 1, gap: 1, borderStyle: isSelected ? 'round' : undefined, borderColor: isSelected ? 'cyan' : undefined, children: [_jsx(Box, { width: 10, children: _jsx(SeverityBadge, { severity: finding.severity, showLabel: false }) }), _jsx(Box, { width: ruleIdWidth, children: _jsxs(Text, { color: isSelected ? 'cyan' : undefined, bold: isSelected, children: [finding.ruleId.substring(0, ruleIdWidth - 3), finding.ruleId.length > ruleIdWidth - 3 ? '...' : ''] }) }), _jsx(Box, { width: messageWidth, children: _jsxs(Text, { dimColor: !isSelected, children: [finding.message.substring(0, messageWidth - 3), finding.message.length > messageWidth - 3 ? '...' : ''] }) })] }, finding.id));
73
+ })] }, title));
74
+ };
75
+ // Reset currentIndex before rendering
76
+ currentIndex = 0;
77
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 1, flexGrow: 1, children: [_jsxs(Box, { marginBottom: 1, borderStyle: "single", borderBottom: true, borderTop: false, borderLeft: false, borderRight: false, paddingBottom: 1, children: [_jsxs(Text, { bold: true, color: "cyan", children: ["FINDINGS (", orderedFindings.length, ")"] }), filterCategory && (_jsxs(Text, { dimColor: true, children: [" - filtered by: ", filterCategory] })), isActive && (_jsx(Text, { dimColor: true, children: " (Enter to view fix)" }))] }), renderSection('Critical Issues', critical, 'red'), renderSection('Warnings', warnings, 'yellow'), renderSection('Info', info, 'blue'), _jsx(Box, { flexGrow: 1 }), _jsx(Box, { marginTop: 2, children: _jsx(Text, { dimColor: true, italic: true, children: isActive ? 'Use arrow keys to navigate, Enter to view details' : 'Press Tab to focus' }) })] }));
78
+ });
79
+ //# sourceMappingURL=FindingsView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FindingsView.js","sourceRoot":"","sources":["../../../../../src/ui/ink/components/views/FindingsView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * OnboardingView Component
3
+ *
4
+ * Full-screen welcome with ASCII art logo and URL input
5
+ */
6
+ interface OnboardingViewProps {
7
+ onSubmit: (url: string) => void;
8
+ defaultUrl?: string;
9
+ version?: string;
10
+ }
11
+ export declare function OnboardingView({ onSubmit, defaultUrl, version, }: OnboardingViewProps): import("react/jsx-runtime").JSX.Element;
12
+ export {};
@@ -0,0 +1,40 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * OnboardingView Component
4
+ *
5
+ * Full-screen welcome with ASCII art logo and URL input
6
+ */
7
+ import { Box, Text } from 'ink';
8
+ import { TextInput } from '@inkjs/ui';
9
+ import { useState, useCallback } from 'react';
10
+ import { AsciiLogo, LogoSubtitle } from '../AsciiLogo.js';
11
+ import { useTerminalSize } from '../../hooks/useTerminalSize.js';
12
+ export function OnboardingView({ onSubmit, defaultUrl = '', version = '0.1.0', }) {
13
+ const [error, setError] = useState(null);
14
+ const { height } = useTerminalSize();
15
+ const validateUrl = useCallback((input) => {
16
+ // Allow URLs with or without protocol
17
+ const urlPattern = /^(https?:\/\/)?[\w-]+(\.[\w-]+)+([/?#].*)?$/i;
18
+ return urlPattern.test(input.trim());
19
+ }, []);
20
+ const handleSubmit = useCallback((value) => {
21
+ const trimmed = value.trim();
22
+ if (!trimmed) {
23
+ setError('Please enter a URL');
24
+ return;
25
+ }
26
+ if (!validateUrl(trimmed)) {
27
+ setError('Please enter a valid URL (e.g., example.com or https://example.com)');
28
+ return;
29
+ }
30
+ // Add protocol if missing
31
+ const fullUrl = trimmed.startsWith('http') ? trimmed : `https://${trimmed}`;
32
+ setError(null);
33
+ onSubmit(fullUrl);
34
+ }, [onSubmit, validateUrl]);
35
+ // Calculate vertical padding for centering
36
+ const contentHeight = 20; // Approximate height of our content
37
+ const topPadding = Math.max(2, Math.floor((height - contentHeight) / 3));
38
+ return (_jsxs(Box, { flexDirection: "column", alignItems: "center", paddingTop: topPadding, paddingX: 2, children: [_jsx(AsciiLogo, { color: "cyan", size: "large" }), _jsx(LogoSubtitle, {}), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ["v", version] }) }), _jsxs(Box, { marginTop: 3, flexDirection: "column", alignItems: "center", width: 60, children: [_jsxs(Box, { borderStyle: "round", borderColor: error ? 'red' : 'cyan', paddingX: 2, paddingY: 1, flexDirection: "column", width: 56, children: [_jsx(Text, { color: "cyan", bold: true, children: "Enter website URL to audit:" }), _jsxs(Box, { marginTop: 1, children: [_jsx(Text, { color: "gray", children: ' > ' }), _jsx(TextInput, { defaultValue: defaultUrl, onSubmit: handleSubmit, placeholder: "https://example.com" })] })] }), error && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "red", children: error }) })), _jsxs(Box, { marginTop: 2, children: [_jsx(Text, { dimColor: true, children: "Press " }), _jsx(Text, { color: "cyan", bold: true, children: "Enter" }), _jsx(Text, { dimColor: true, children: " to start audit" })] }), _jsxs(Box, { marginTop: 2, flexDirection: "column", alignItems: "center", children: [_jsx(Text, { dimColor: true, children: "Tips:" }), _jsx(Text, { dimColor: true, children: " - Enter domain or full URL" }), _jsx(Text, { dimColor: true, children: " - HTTPS is used by default" }), _jsx(Text, { dimColor: true, children: " - Press Ctrl+C to exit" })] })] })] }));
39
+ }
40
+ //# sourceMappingURL=OnboardingView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OnboardingView.js","sourceRoot":"","sources":["../../../../../src/ui/ink/components/views/OnboardingView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * SimulationView Component
3
+ *
4
+ * Agent simulation test results with responsive layout
5
+ */
6
+ import type { SimulationTestCase } from '../../types.js';
7
+ interface SimulationViewProps {
8
+ testCases: SimulationTestCase[];
9
+ selectedIndex: number;
10
+ onIndexChange: (index: number) => void;
11
+ onTestSelect: (testId: string) => void;
12
+ isActive: boolean;
13
+ totalCost?: number;
14
+ isRunning?: boolean;
15
+ }
16
+ export declare const SimulationView: import("react").NamedExoticComponent<SimulationViewProps>;
17
+ export {};
@@ -0,0 +1,53 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * SimulationView Component
4
+ *
5
+ * Agent simulation test results with responsive layout
6
+ */
7
+ import { memo } from 'react';
8
+ import { Box, Text, useInput } from 'ink';
9
+ import { StatusBadge } from '../shared/Badge.js';
10
+ import { useTerminalSize } from '../../hooks/useTerminalSize.js';
11
+ import { getScoreColor } from '../../theme.js';
12
+ export const SimulationView = memo(function SimulationView({ testCases, selectedIndex, onIndexChange, onTestSelect, isActive, totalCost = 0, isRunning = false, }) {
13
+ const { width } = useTerminalSize();
14
+ // Calculate responsive widths
15
+ const contentWidth = Math.max(60, width - 30);
16
+ const promptWidth = Math.max(25, Math.floor(contentWidth * 0.4));
17
+ useInput((input, key) => {
18
+ if (!isActive || testCases.length === 0)
19
+ return;
20
+ if (key.upArrow) {
21
+ const newIndex = Math.max(0, selectedIndex - 1);
22
+ onIndexChange(newIndex);
23
+ }
24
+ else if (key.downArrow) {
25
+ const newIndex = Math.min(testCases.length - 1, selectedIndex + 1);
26
+ onIndexChange(newIndex);
27
+ }
28
+ else if (key.return) {
29
+ const test = testCases[selectedIndex];
30
+ if (test) {
31
+ onTestSelect(test.id);
32
+ }
33
+ }
34
+ }, { isActive });
35
+ // Calculate stats
36
+ const passed = testCases.filter(t => t.success).length;
37
+ const failed = testCases.length - passed;
38
+ const avgScore = testCases.length > 0
39
+ ? Math.round(testCases.reduce((sum, t) => sum + t.score, 0) / testCases.length)
40
+ : 0;
41
+ const passRate = testCases.length > 0 ? Math.round((passed / testCases.length) * 100) : 0;
42
+ if (isRunning) {
43
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 1, flexGrow: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "AGENT SIMULATION" }), _jsx(Box, { marginTop: 2, justifyContent: "center", children: _jsx(Text, { color: "cyan", children: "Running simulation tests..." }) })] }));
44
+ }
45
+ if (testCases.length === 0) {
46
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 1, flexGrow: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "AGENT SIMULATION" }), _jsx(Box, { marginTop: 2, children: _jsx(Text, { dimColor: true, children: "No simulation tests have been run" }) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Run the audit with simulation enabled to test how AI agents interact with your tools." }) })] }));
47
+ }
48
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 1, flexGrow: 1, children: [_jsxs(Box, { marginBottom: 1, borderStyle: "single", borderBottom: true, borderTop: false, borderLeft: false, borderRight: false, paddingBottom: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "AGENT SIMULATION RESULTS" }), isActive && _jsx(Text, { dimColor: true, children: " (Enter to view trace)" })] }), _jsxs(Box, { marginBottom: 2, gap: 2, flexWrap: "wrap", children: [_jsxs(Box, { borderStyle: "round", paddingX: 2, paddingY: 0, children: [_jsx(Text, { dimColor: true, children: "Tests " }), _jsx(Text, { bold: true, children: testCases.length })] }), _jsxs(Box, { borderStyle: "round", paddingX: 2, paddingY: 0, children: [_jsx(Text, { dimColor: true, children: "Passed " }), _jsx(Text, { bold: true, color: "green", children: passed })] }), _jsxs(Box, { borderStyle: "round", paddingX: 2, paddingY: 0, children: [_jsx(Text, { dimColor: true, children: "Failed " }), _jsx(Text, { bold: true, color: "red", children: failed })] }), _jsxs(Box, { borderStyle: "round", paddingX: 2, paddingY: 0, children: [_jsx(Text, { dimColor: true, children: "Pass Rate " }), _jsxs(Text, { bold: true, color: getScoreColor(passRate), children: [passRate, "%"] })] }), _jsxs(Box, { borderStyle: "round", paddingX: 2, paddingY: 0, children: [_jsx(Text, { dimColor: true, children: "Avg Score " }), _jsxs(Text, { bold: true, color: getScoreColor(avgScore), children: [avgScore, "/100"] })] }), _jsxs(Box, { borderStyle: "round", paddingX: 2, paddingY: 0, children: [_jsx(Text, { dimColor: true, children: "Cost " }), _jsxs(Text, { bold: true, children: ["$", totalCost.toFixed(4)] })] })] }), _jsx(Box, { flexDirection: "column", children: testCases.map((test, index) => {
49
+ const isSelected = isActive && index === selectedIndex;
50
+ return (_jsxs(Box, { paddingX: 1, gap: 2, borderStyle: isSelected ? 'round' : undefined, borderColor: isSelected ? 'cyan' : undefined, children: [_jsx(Box, { width: 8, children: _jsx(StatusBadge, { status: test.success ? 'pass' : 'fail' }) }), _jsx(Box, { width: 20, children: _jsx(Text, { color: isSelected ? 'cyan' : 'green', bold: isSelected, children: test.toolName }) }), _jsx(Box, { width: promptWidth, children: _jsxs(Text, { dimColor: !isSelected, children: [test.prompt.substring(0, promptWidth - 3), test.prompt.length > promptWidth - 3 ? '...' : ''] }) }), _jsx(Box, { width: 10, children: _jsxs(Text, { color: getScoreColor(test.score), bold: isSelected, children: [test.score, "/100"] }) }), _jsxs(Text, { dimColor: true, children: [test.rounds, " rounds"] })] }, test.id));
51
+ }) }), _jsx(Box, { flexGrow: 1 }), _jsx(Box, { marginTop: 2, children: _jsx(Text, { dimColor: true, italic: true, children: isActive ? 'Use arrow keys to navigate, Enter to view trace' : 'Press Tab to focus' }) })] }));
52
+ });
53
+ //# sourceMappingURL=SimulationView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SimulationView.js","sourceRoot":"","sources":["../../../../../src/ui/ink/components/views/SimulationView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * TestCaseDetailView Component
3
+ *
4
+ * Detailed view of a single simulation test case with trace
5
+ */
6
+ import type { SimulationTestCase } from '../../types.js';
7
+ interface TestCaseDetailViewProps {
8
+ testCase: SimulationTestCase;
9
+ }
10
+ export declare function TestCaseDetailView({ testCase }: TestCaseDetailViewProps): import("react/jsx-runtime").JSX.Element;
11
+ export {};
@@ -0,0 +1,53 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * TestCaseDetailView Component
4
+ *
5
+ * Detailed view of a single simulation test case with trace
6
+ */
7
+ import { Box, Text } from 'ink';
8
+ import { Card } from '../shared/Card.js';
9
+ import { StatusBadge } from '../shared/Badge.js';
10
+ import { getScoreColor } from '../../theme.js';
11
+ export function TestCaseDetailView({ testCase }) {
12
+ return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsx(Card, { borderColor: testCase.success ? 'green' : 'red', borderStyle: "round", children: _jsxs(Box, { gap: 2, children: [_jsx(StatusBadge, { status: testCase.success ? 'pass' : 'fail' }), _jsx(Text, { bold: true, children: testCase.toolName }), _jsxs(Text, { color: getScoreColor(testCase.score), children: ["Score: ", testCase.score, "/100"] })] }) }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Test Prompt:" }), _jsx(Box, { marginLeft: 2, marginTop: 1, borderStyle: "single", borderColor: "cyan", paddingX: 1, children: _jsx(Text, { wrap: "wrap", children: testCase.prompt }) })] }), _jsxs(Box, { marginTop: 1, gap: 3, children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { bold: true, children: "Rounds:" }), _jsx(Text, { children: testCase.rounds })] }), _jsxs(Box, { gap: 1, children: [_jsx(Text, { bold: true, children: "Result:" }), _jsx(Text, { color: testCase.success ? 'green' : 'red', children: testCase.success ? 'Success' : 'Failed' })] })] }), testCase.trace && testCase.trace.length > 0 && (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Conversation Trace:" }), _jsx(Box, { marginTop: 1, flexDirection: "column", borderStyle: "single", borderColor: "gray", paddingX: 1, children: testCase.trace.map((step, index) => (_jsx(TraceStep, { step: step, index: index }, index))) })] })), (!testCase.trace || testCase.trace.length === 0) && (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Conversation Trace:" }), _jsx(Box, { marginLeft: 2, children: _jsx(Text, { dimColor: true, children: "No trace data available" }) })] })), _jsx(Box, { marginTop: 2, children: _jsx(Text, { dimColor: true, children: "Press Esc to go back" }) })] }));
13
+ }
14
+ function TraceStep({ step, index }) {
15
+ const getIcon = () => {
16
+ switch (step.type) {
17
+ case 'agent':
18
+ return '>>';
19
+ case 'tool':
20
+ return '⚙';
21
+ case 'result':
22
+ return '→';
23
+ default:
24
+ return '•';
25
+ }
26
+ };
27
+ const getColor = () => {
28
+ switch (step.type) {
29
+ case 'agent':
30
+ return 'cyan';
31
+ case 'tool':
32
+ return 'yellow';
33
+ case 'result':
34
+ return 'green';
35
+ default:
36
+ return 'white';
37
+ }
38
+ };
39
+ const getLabel = () => {
40
+ switch (step.type) {
41
+ case 'agent':
42
+ return 'Agent';
43
+ case 'tool':
44
+ return 'Tool Call';
45
+ case 'result':
46
+ return 'Result';
47
+ default:
48
+ return 'Step';
49
+ }
50
+ };
51
+ return (_jsxs(Box, { flexDirection: "column", marginTop: index > 0 ? 1 : 0, children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { children: getIcon() }), _jsxs(Text, { bold: true, color: getColor(), children: [getLabel(), ":"] })] }), _jsx(Box, { marginLeft: 3, children: _jsxs(Text, { wrap: "wrap", dimColor: true, children: [step.content.substring(0, 200), step.content.length > 200 ? '...' : ''] }) })] }));
52
+ }
53
+ //# sourceMappingURL=TestCaseDetailView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestCaseDetailView.js","sourceRoot":"","sources":["../../../../../src/ui/ink/components/views/TestCaseDetailView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * ToolDetailView Component
3
+ *
4
+ * Detailed view of a single MCP tool with LLM optimization advice
5
+ */
6
+ import type { ToolWithId } from '../../types.js';
7
+ import type { SmartAdvice } from '../../../../llm/types.js';
8
+ interface ToolDetailViewProps {
9
+ tool: ToolWithId;
10
+ advice?: SmartAdvice;
11
+ adviceLoading?: boolean;
12
+ adviceError?: string;
13
+ }
14
+ export declare function ToolDetailView({ tool, advice, adviceLoading, adviceError }: ToolDetailViewProps): import("react/jsx-runtime").JSX.Element;
15
+ export {};
@@ -0,0 +1,25 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /**
3
+ * ToolDetailView Component
4
+ *
5
+ * Detailed view of a single MCP tool with LLM optimization advice
6
+ */
7
+ import { Box, Text } from 'ink';
8
+ import Spinner from 'ink-spinner';
9
+ import { Card } from '../shared/Card.js';
10
+ export function ToolDetailView({ tool, advice, adviceLoading, adviceError }) {
11
+ const properties = tool.inputSchema?.properties || {};
12
+ const requiredFields = tool.inputSchema?.required || [];
13
+ const paramEntries = Object.entries(properties);
14
+ return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsx(Card, { borderColor: "cyan", borderStyle: "round", children: _jsxs(Box, { gap: 2, children: [_jsx(Text, { bold: true, color: "cyan", children: tool.name }), _jsxs(Text, { dimColor: true, children: ["[", tool.source, "]"] })] }) }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Description:" }), _jsx(Box, { marginLeft: 2, children: _jsx(Text, { wrap: "wrap", children: tool.description || '(no description)' }) })] }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Source Page:" }), _jsx(Box, { marginLeft: 2, children: _jsx(Text, { dimColor: true, children: tool.pageUrl }) })] }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsxs(Text, { bold: true, children: ["Parameters (", paramEntries.length, "):"] }), _jsx(Box, { flexDirection: "column", marginLeft: 2, marginTop: 1, children: paramEntries.length === 0 ? (_jsx(Text, { dimColor: true, children: "No parameters defined" })) : (paramEntries.map(([name, schema]) => {
15
+ const isRequired = requiredFields.includes(name);
16
+ const schemaObj = schema;
17
+ return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: "yellow", bold: true, children: name }), _jsxs(Text, { dimColor: true, children: ["(", schemaObj.type, ")"] }), isRequired && (_jsx(Text, { color: "red", children: "*required" }))] }), schemaObj.description && (_jsx(Box, { marginLeft: 2, children: _jsx(Text, { dimColor: true, children: schemaObj.description }) }))] }, name));
18
+ })) })] }), adviceLoading && (_jsxs(Box, { marginY: 1, gap: 2, children: [_jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) }), _jsx(Text, { color: "cyan", children: "Generating optimization advice with AI..." })] })), adviceError && (_jsx(Box, { marginY: 1, children: _jsxs(Text, { color: "yellow", children: ["Warning: ", adviceError] }) })), advice && (_jsxs(_Fragment, { children: [_jsxs(Box, { marginTop: 1, flexDirection: "column", borderStyle: "single", borderColor: "yellow", paddingX: 2, paddingY: 1, children: [_jsx(Text, { bold: true, color: "yellow", children: "Current State Analysis" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { wrap: "wrap", children: advice.currentState.description }), advice.currentState.problemAreas.length > 0 && (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { dimColor: true, children: "Areas to Improve:" }), advice.currentState.problemAreas.map((area, i) => (_jsxs(Text, { color: "yellow", children: [" - ", area] }, i)))] })), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { dimColor: true, italic: true, children: "Agent Impact:" }), _jsx(Box, { marginLeft: 2, children: _jsx(Text, { wrap: "wrap", color: "red", children: advice.currentState.agentImpact }) })] })] })] }), _jsxs(Box, { marginTop: 1, flexDirection: "column", borderStyle: "single", borderColor: "green", paddingX: 2, paddingY: 1, children: [_jsx(Text, { bold: true, color: "green", children: "Suggested Improvements" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { dimColor: true, children: "Recommended changes:" }), _jsx(Box, { marginLeft: 2, marginTop: 1, children: _jsx(Text, { wrap: "wrap", color: "greenBright", children: advice.enhanced.suggestedFix }) }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { dimColor: true, italic: true, children: "Why this helps:" }), _jsx(Box, { marginLeft: 2, children: _jsx(Text, { wrap: "wrap", children: advice.enhanced.explanation }) })] }), advice.enhanced.codeExample && (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { dimColor: true, children: "Code example:" }), _jsx(Box, { marginLeft: 2, marginTop: 1, children: _jsx(Text, { color: "white", children: advice.enhanced.codeExample }) })] }))] })] }), _jsxs(Box, { marginTop: 1, flexDirection: "column", borderStyle: "single", borderColor: "cyan", paddingX: 2, paddingY: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: advice.benefits.title }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: advice.benefits.items.map((benefit, i) => (_jsxs(Box, { marginLeft: 1, children: [_jsx(Text, { color: "green", children: "+ " }), _jsx(Text, { wrap: "wrap", children: benefit })] }, i))) })] }), advice.confidence > 0 && (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ["AI Confidence: ", Math.round(advice.confidence * 100), "%", advice.cached && ' (cached)'] }) }))] })), !advice && !adviceLoading && tool.inputSchema && (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Schema (JSON):" }), _jsx(Box, { marginLeft: 2, marginTop: 1, flexDirection: "column", children: _jsxs(Text, { color: "white", children: [JSON.stringify(tool.inputSchema, null, 2)
19
+ .split('\n')
20
+ .slice(0, 10)
21
+ .join('\n'), JSON.stringify(tool.inputSchema, null, 2).split('\n').length > 10
22
+ ? '\n ...'
23
+ : ''] }) })] })), _jsx(Box, { marginTop: 2, children: _jsx(Text, { dimColor: true, children: "Press Esc to go back" }) })] }));
24
+ }
25
+ //# sourceMappingURL=ToolDetailView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolDetailView.js","sourceRoot":"","sources":["../../../../../src/ui/ink/components/views/ToolDetailView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * ToolsView Component
3
+ *
4
+ * List of detected MCP tools with responsive layout
5
+ */
6
+ import type { ToolWithId } from '../../types.js';
7
+ interface ToolsViewProps {
8
+ tools: ToolWithId[];
9
+ selectedIndex: number;
10
+ onIndexChange: (index: number) => void;
11
+ onToolSelect: (toolId: string) => void;
12
+ isActive: boolean;
13
+ }
14
+ export declare const ToolsView: import("react").NamedExoticComponent<ToolsViewProps>;
15
+ export {};
@@ -0,0 +1,43 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * ToolsView Component
4
+ *
5
+ * List of detected MCP tools with responsive layout
6
+ */
7
+ import { memo } from 'react';
8
+ import { Box, Text, useInput } from 'ink';
9
+ import { useTerminalSize } from '../../hooks/useTerminalSize.js';
10
+ export const ToolsView = memo(function ToolsView({ tools, selectedIndex, onIndexChange, onToolSelect, isActive, }) {
11
+ const { width } = useTerminalSize();
12
+ // Calculate responsive description length (accounting for navigation sidebar)
13
+ const contentWidth = Math.max(40, width - 30);
14
+ const descriptionMaxLen = Math.max(40, contentWidth - 30);
15
+ useInput((input, key) => {
16
+ if (!isActive || tools.length === 0)
17
+ return;
18
+ if (key.upArrow) {
19
+ const newIndex = Math.max(0, selectedIndex - 1);
20
+ onIndexChange(newIndex);
21
+ }
22
+ else if (key.downArrow) {
23
+ const newIndex = Math.min(tools.length - 1, selectedIndex + 1);
24
+ onIndexChange(newIndex);
25
+ }
26
+ else if (key.return) {
27
+ const tool = tools[selectedIndex];
28
+ if (tool) {
29
+ onToolSelect(tool.id);
30
+ }
31
+ }
32
+ }, { isActive });
33
+ if (tools.length === 0) {
34
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 1, flexGrow: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "DETECTED TOOLS" }), _jsx(Box, { marginTop: 2, children: _jsx(Text, { dimColor: true, children: "No MCP tools detected on this site" }) })] }));
35
+ }
36
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 1, flexGrow: 1, children: [_jsxs(Box, { marginBottom: 1, borderStyle: "single", borderBottom: true, borderTop: false, borderLeft: false, borderRight: false, paddingBottom: 1, children: [_jsxs(Text, { bold: true, color: "cyan", children: ["DETECTED TOOLS (", tools.length, ")"] }), isActive && _jsx(Text, { dimColor: true, children: " (Enter to view schema)" })] }), _jsx(Box, { flexDirection: "column", children: tools.map((tool, index) => {
37
+ const isSelected = isActive && index === selectedIndex;
38
+ const paramCount = Object.keys(tool.inputSchema?.properties || {}).length;
39
+ const requiredCount = (tool.inputSchema?.required || []).length;
40
+ return (_jsxs(Box, { paddingX: 1, paddingY: 0, flexDirection: "column", marginBottom: 1, borderStyle: isSelected ? 'round' : 'single', borderColor: isSelected ? 'cyan' : 'gray', children: [_jsxs(Box, { gap: 2, children: [_jsx(Text, { color: isSelected ? 'cyan' : 'green', bold: true, children: tool.name }), _jsxs(Text, { dimColor: true, children: ["[", tool.source, "]"] })] }), _jsx(Box, { marginTop: 0, children: _jsxs(Text, { dimColor: true, children: [tool.description.substring(0, descriptionMaxLen), tool.description.length > descriptionMaxLen ? '...' : ''] }) }), _jsxs(Box, { gap: 3, marginTop: 0, children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: "Params:" }), _jsx(Text, { color: "yellow", children: paramCount })] }), requiredCount > 0 && (_jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: "Required:" }), _jsx(Text, { color: "red", children: requiredCount })] }))] })] }, tool.id));
41
+ }) }), _jsx(Box, { flexGrow: 1 }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, italic: true, children: isActive ? 'Use arrow keys to navigate, Enter to view schema' : 'Press Tab to focus' }) })] }));
42
+ });
43
+ //# sourceMappingURL=ToolsView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolsView.js","sourceRoot":"","sources":["../../../../../src/ui/ink/components/views/ToolsView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Demo Script for Interactive TUI with Onboarding Flow
3
+ *
4
+ * Run with: npx tsx src/ui/ink/demo.tsx
5
+ */
6
+ export {};