webmcp-cli 1.2.2 → 1.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (330) hide show
  1. package/dist/analysis/form-to-tool-mapper.d.ts +61 -0
  2. package/dist/analysis/form-to-tool-mapper.js +360 -0
  3. package/dist/analysis/form-to-tool-mapper.js.map +1 -0
  4. package/dist/analysis/index.d.ts +84 -0
  5. package/dist/analysis/index.js +81 -0
  6. package/dist/analysis/index.js.map +1 -0
  7. package/dist/analysis/missing-tool-analyzer.d.ts +35 -0
  8. package/dist/analysis/missing-tool-analyzer.js +617 -0
  9. package/dist/analysis/missing-tool-analyzer.js.map +1 -0
  10. package/dist/audit/run-multi-page-audit.d.ts +34 -0
  11. package/dist/audit/run-multi-page-audit.js +233 -0
  12. package/dist/audit/run-multi-page-audit.js.map +1 -0
  13. package/dist/cli/commands/potential.d.ts +8 -0
  14. package/dist/cli/commands/potential.js +323 -0
  15. package/dist/cli/commands/potential.js.map +1 -0
  16. package/dist/cli/commands/report.d.ts +12 -0
  17. package/dist/cli/commands/report.js +89 -0
  18. package/dist/cli/commands/report.js.map +1 -0
  19. package/dist/cli/index.js +35 -0
  20. package/dist/cli/index.js.map +1 -1
  21. package/dist/config/defaults.d.ts +36 -0
  22. package/dist/config/defaults.js +33 -0
  23. package/dist/config/defaults.js.map +1 -0
  24. package/dist/config/index.d.ts +7 -0
  25. package/dist/config/index.js +7 -0
  26. package/dist/config/index.js.map +1 -0
  27. package/dist/config/loader.d.ts +22 -0
  28. package/dist/config/loader.js +91 -0
  29. package/dist/config/loader.js.map +1 -0
  30. package/dist/config/schema.d.ts +280 -0
  31. package/dist/config/schema.js +42 -0
  32. package/dist/config/schema.js.map +1 -0
  33. package/dist/core/types/audit.d.ts +1 -1
  34. package/dist/core/types/index.d.ts +1 -0
  35. package/dist/core/types/index.js +1 -0
  36. package/dist/core/types/index.js.map +1 -1
  37. package/dist/core/types/recon.d.ts +265 -0
  38. package/dist/core/types/recon.js +5 -0
  39. package/dist/core/types/recon.js.map +1 -0
  40. package/dist/core/types/rule.d.ts +1 -1
  41. package/dist/core/types/rule.js +7 -5
  42. package/dist/core/types/rule.js.map +1 -1
  43. package/dist/crawler/depth-crawler.d.ts +29 -0
  44. package/dist/crawler/depth-crawler.js +212 -0
  45. package/dist/crawler/depth-crawler.js.map +1 -0
  46. package/dist/crawler/index.d.ts +2 -0
  47. package/dist/crawler/index.js +3 -0
  48. package/dist/crawler/index.js.map +1 -0
  49. package/dist/crawler/link-extractor.d.ts +1 -0
  50. package/dist/crawler/link-extractor.js +49 -0
  51. package/dist/crawler/link-extractor.js.map +1 -0
  52. package/dist/generators/index.d.ts +10 -0
  53. package/dist/generators/index.js +8 -0
  54. package/dist/generators/index.js.map +1 -0
  55. package/dist/generators/report-html.d.ts +12 -0
  56. package/dist/generators/report-html.js +470 -0
  57. package/dist/generators/report-html.js.map +1 -0
  58. package/dist/generators/report-json.d.ts +95 -0
  59. package/dist/generators/report-json.js +144 -0
  60. package/dist/generators/report-json.js.map +1 -0
  61. package/dist/generators/report-manager.d.ts +31 -0
  62. package/dist/generators/report-manager.js +208 -0
  63. package/dist/generators/report-manager.js.map +1 -0
  64. package/dist/generators/tool-code-generator.d.ts +31 -0
  65. package/dist/generators/tool-code-generator.js +201 -0
  66. package/dist/generators/tool-code-generator.js.map +1 -0
  67. package/dist/potential/ai-recommender.d.ts +33 -0
  68. package/dist/potential/ai-recommender.js +414 -0
  69. package/dist/potential/ai-recommender.js.map +1 -0
  70. package/dist/potential/analyzer.d.ts +32 -0
  71. package/dist/potential/analyzer.js +383 -0
  72. package/dist/potential/analyzer.js.map +1 -0
  73. package/dist/potential/index.d.ts +3 -0
  74. package/dist/potential/index.js +4 -0
  75. package/dist/potential/index.js.map +1 -0
  76. package/dist/potential/prompts.d.ts +20 -0
  77. package/dist/potential/prompts.js +42 -0
  78. package/dist/potential/prompts.js.map +1 -0
  79. package/dist/potential/types.d.ts +40 -0
  80. package/dist/potential/types.js +2 -0
  81. package/dist/potential/types.js.map +1 -0
  82. package/dist/recon/index.d.ts +20 -0
  83. package/dist/recon/index.js +143 -0
  84. package/dist/recon/index.js.map +1 -0
  85. package/dist/recon/manifest.d.ts +16 -0
  86. package/dist/recon/manifest.js +108 -0
  87. package/dist/recon/manifest.js.map +1 -0
  88. package/dist/recon/meta-extractor.d.ts +11 -0
  89. package/dist/recon/meta-extractor.js +276 -0
  90. package/dist/recon/meta-extractor.js.map +1 -0
  91. package/dist/recon/robots.d.ts +16 -0
  92. package/dist/recon/robots.js +158 -0
  93. package/dist/recon/robots.js.map +1 -0
  94. package/dist/recon/route-discovery.d.ts +25 -0
  95. package/dist/recon/route-discovery.js +303 -0
  96. package/dist/recon/route-discovery.js.map +1 -0
  97. package/dist/recon/sitemap.d.ts +12 -0
  98. package/dist/recon/sitemap.js +177 -0
  99. package/dist/recon/sitemap.js.map +1 -0
  100. package/dist/rules/accessibility/AXE-001.d.ts +9 -0
  101. package/dist/rules/accessibility/AXE-001.js +109 -0
  102. package/dist/rules/accessibility/AXE-001.js.map +1 -0
  103. package/dist/rules/accessibility/AXE-002.d.ts +8 -0
  104. package/dist/rules/accessibility/AXE-002.js +85 -0
  105. package/dist/rules/accessibility/AXE-002.js.map +1 -0
  106. package/dist/rules/accessibility/AXE-003.d.ts +8 -0
  107. package/dist/rules/accessibility/AXE-003.js +94 -0
  108. package/dist/rules/accessibility/AXE-003.js.map +1 -0
  109. package/dist/rules/accessibility/AXE-004.d.ts +8 -0
  110. package/dist/rules/accessibility/AXE-004.js +101 -0
  111. package/dist/rules/accessibility/AXE-004.js.map +1 -0
  112. package/dist/rules/accessibility/AXE-005.d.ts +9 -0
  113. package/dist/rules/accessibility/AXE-005.js +89 -0
  114. package/dist/rules/accessibility/AXE-005.js.map +1 -0
  115. package/dist/rules/best-practices/BP-004.d.ts +9 -0
  116. package/dist/rules/best-practices/BP-004.js +96 -0
  117. package/dist/rules/best-practices/BP-004.js.map +1 -0
  118. package/dist/rules/best-practices/BP-005.d.ts +8 -0
  119. package/dist/rules/best-practices/BP-005.js +94 -0
  120. package/dist/rules/best-practices/BP-005.js.map +1 -0
  121. package/dist/rules/best-practices/BP-006.d.ts +8 -0
  122. package/dist/rules/best-practices/BP-006.js +80 -0
  123. package/dist/rules/best-practices/BP-006.js.map +1 -0
  124. package/dist/rules/best-practices/BP-007.d.ts +8 -0
  125. package/dist/rules/best-practices/BP-007.js +92 -0
  126. package/dist/rules/best-practices/BP-007.js.map +1 -0
  127. package/dist/rules/best-practices/BP-008.d.ts +12 -0
  128. package/dist/rules/best-practices/BP-008.js +86 -0
  129. package/dist/rules/best-practices/BP-008.js.map +1 -0
  130. package/dist/rules/best-practices/BP-009.d.ts +9 -0
  131. package/dist/rules/best-practices/BP-009.js +77 -0
  132. package/dist/rules/best-practices/BP-009.js.map +1 -0
  133. package/dist/rules/best-practices/BP-010.d.ts +8 -0
  134. package/dist/rules/best-practices/BP-010.js +85 -0
  135. package/dist/rules/best-practices/BP-010.js.map +1 -0
  136. package/dist/rules/coverage/COV-002.d.ts +8 -0
  137. package/dist/rules/coverage/COV-002.js +68 -0
  138. package/dist/rules/coverage/COV-002.js.map +1 -0
  139. package/dist/rules/coverage/COV-003.d.ts +8 -0
  140. package/dist/rules/coverage/COV-003.js +68 -0
  141. package/dist/rules/coverage/COV-003.js.map +1 -0
  142. package/dist/rules/coverage/COV-004.d.ts +8 -0
  143. package/dist/rules/coverage/COV-004.js +89 -0
  144. package/dist/rules/coverage/COV-004.js.map +1 -0
  145. package/dist/rules/coverage/COV-005.d.ts +8 -0
  146. package/dist/rules/coverage/COV-005.js +67 -0
  147. package/dist/rules/coverage/COV-005.js.map +1 -0
  148. package/dist/rules/coverage/COV-006.d.ts +9 -0
  149. package/dist/rules/coverage/COV-006.js +76 -0
  150. package/dist/rules/coverage/COV-006.js.map +1 -0
  151. package/dist/rules/coverage/COV-007.d.ts +8 -0
  152. package/dist/rules/coverage/COV-007.js +67 -0
  153. package/dist/rules/coverage/COV-007.js.map +1 -0
  154. package/dist/rules/coverage/COV-008.d.ts +9 -0
  155. package/dist/rules/coverage/COV-008.js +87 -0
  156. package/dist/rules/coverage/COV-008.js.map +1 -0
  157. package/dist/rules/coverage/COV-009.d.ts +8 -0
  158. package/dist/rules/coverage/COV-009.js +73 -0
  159. package/dist/rules/coverage/COV-009.js.map +1 -0
  160. package/dist/rules/coverage/COV-010.d.ts +9 -0
  161. package/dist/rules/coverage/COV-010.js +82 -0
  162. package/dist/rules/coverage/COV-010.js.map +1 -0
  163. package/dist/rules/description/DESC-001.d.ts +9 -0
  164. package/dist/rules/description/DESC-001.js +88 -0
  165. package/dist/rules/description/DESC-001.js.map +1 -0
  166. package/dist/rules/description/DESC-002.d.ts +10 -0
  167. package/dist/rules/description/DESC-002.js +99 -0
  168. package/dist/rules/description/DESC-002.js.map +1 -0
  169. package/dist/rules/description/DESC-006.d.ts +9 -0
  170. package/dist/rules/description/DESC-006.js +78 -0
  171. package/dist/rules/description/DESC-006.js.map +1 -0
  172. package/dist/rules/description/DESC-007.d.ts +9 -0
  173. package/dist/rules/description/DESC-007.js +70 -0
  174. package/dist/rules/description/DESC-007.js.map +1 -0
  175. package/dist/rules/description/DESC-008.d.ts +9 -0
  176. package/dist/rules/description/DESC-008.js +70 -0
  177. package/dist/rules/description/DESC-008.js.map +1 -0
  178. package/dist/rules/description/DESC-009.d.ts +8 -0
  179. package/dist/rules/description/DESC-009.js +55 -0
  180. package/dist/rules/description/DESC-009.js.map +1 -0
  181. package/dist/rules/description/DESC-010.d.ts +9 -0
  182. package/dist/rules/description/DESC-010.js +92 -0
  183. package/dist/rules/description/DESC-010.js.map +1 -0
  184. package/dist/rules/description/DESC-011.d.ts +9 -0
  185. package/dist/rules/description/DESC-011.js +81 -0
  186. package/dist/rules/description/DESC-011.js.map +1 -0
  187. package/dist/rules/description/DESC-012.d.ts +9 -0
  188. package/dist/rules/description/DESC-012.js +98 -0
  189. package/dist/rules/description/DESC-012.js.map +1 -0
  190. package/dist/rules/implementation/IMP-002.d.ts +9 -0
  191. package/dist/rules/implementation/IMP-002.js +59 -0
  192. package/dist/rules/implementation/IMP-002.js.map +1 -0
  193. package/dist/rules/implementation/IMP-006.d.ts +9 -0
  194. package/dist/rules/implementation/IMP-006.js +48 -0
  195. package/dist/rules/implementation/IMP-006.js.map +1 -0
  196. package/dist/rules/implementation/IMP-008.d.ts +9 -0
  197. package/dist/rules/implementation/IMP-008.js +46 -0
  198. package/dist/rules/implementation/IMP-008.js.map +1 -0
  199. package/dist/rules/implementation/IMP-009.d.ts +9 -0
  200. package/dist/rules/implementation/IMP-009.js +48 -0
  201. package/dist/rules/implementation/IMP-009.js.map +1 -0
  202. package/dist/rules/implementation/IMP-010.d.ts +9 -0
  203. package/dist/rules/implementation/IMP-010.js +66 -0
  204. package/dist/rules/implementation/IMP-010.js.map +1 -0
  205. package/dist/rules/implementation/IMP-011.d.ts +9 -0
  206. package/dist/rules/implementation/IMP-011.js +82 -0
  207. package/dist/rules/implementation/IMP-011.js.map +1 -0
  208. package/dist/rules/implementation/IMP-012.d.ts +9 -0
  209. package/dist/rules/implementation/IMP-012.js +88 -0
  210. package/dist/rules/implementation/IMP-012.js.map +1 -0
  211. package/dist/rules/implementation/IMP-014.d.ts +9 -0
  212. package/dist/rules/implementation/IMP-014.js +58 -0
  213. package/dist/rules/implementation/IMP-014.js.map +1 -0
  214. package/dist/rules/implementation/IMP-015.d.ts +9 -0
  215. package/dist/rules/implementation/IMP-015.js +64 -0
  216. package/dist/rules/implementation/IMP-015.js.map +1 -0
  217. package/dist/rules/implementation/IMP-016.d.ts +9 -0
  218. package/dist/rules/implementation/IMP-016.js +52 -0
  219. package/dist/rules/implementation/IMP-016.js.map +1 -0
  220. package/dist/rules/implementation/IMP-017.d.ts +8 -0
  221. package/dist/rules/implementation/IMP-017.js +51 -0
  222. package/dist/rules/implementation/IMP-017.js.map +1 -0
  223. package/dist/rules/implementation/IMP-018.d.ts +8 -0
  224. package/dist/rules/implementation/IMP-018.js +52 -0
  225. package/dist/rules/implementation/IMP-018.js.map +1 -0
  226. package/dist/rules/implementation/IMP-019.d.ts +8 -0
  227. package/dist/rules/implementation/IMP-019.js +53 -0
  228. package/dist/rules/implementation/IMP-019.js.map +1 -0
  229. package/dist/rules/implementation/IMP-020.d.ts +9 -0
  230. package/dist/rules/implementation/IMP-020.js +62 -0
  231. package/dist/rules/implementation/IMP-020.js.map +1 -0
  232. package/dist/rules/implementation/IMP-021.d.ts +8 -0
  233. package/dist/rules/implementation/IMP-021.js +64 -0
  234. package/dist/rules/implementation/IMP-021.js.map +1 -0
  235. package/dist/rules/implementation/IMP-022.d.ts +8 -0
  236. package/dist/rules/implementation/IMP-022.js +70 -0
  237. package/dist/rules/implementation/IMP-022.js.map +1 -0
  238. package/dist/rules/index.d.ts +73 -6
  239. package/dist/rules/index.js +141 -6
  240. package/dist/rules/index.js.map +1 -1
  241. package/dist/rules/schema/SCHEMA-004.d.ts +9 -0
  242. package/dist/rules/schema/SCHEMA-004.js +57 -0
  243. package/dist/rules/schema/SCHEMA-004.js.map +1 -0
  244. package/dist/rules/schema/SCHEMA-005.d.ts +9 -0
  245. package/dist/rules/schema/SCHEMA-005.js +61 -0
  246. package/dist/rules/schema/SCHEMA-005.js.map +1 -0
  247. package/dist/rules/schema/SCHEMA-006.d.ts +10 -0
  248. package/dist/rules/schema/SCHEMA-006.js +85 -0
  249. package/dist/rules/schema/SCHEMA-006.js.map +1 -0
  250. package/dist/rules/schema/SCHEMA-007.d.ts +9 -0
  251. package/dist/rules/schema/SCHEMA-007.js +73 -0
  252. package/dist/rules/schema/SCHEMA-007.js.map +1 -0
  253. package/dist/rules/schema/SCHEMA-008.d.ts +9 -0
  254. package/dist/rules/schema/SCHEMA-008.js +70 -0
  255. package/dist/rules/schema/SCHEMA-008.js.map +1 -0
  256. package/dist/rules/schema/SCHEMA-009.d.ts +10 -0
  257. package/dist/rules/schema/SCHEMA-009.js +80 -0
  258. package/dist/rules/schema/SCHEMA-009.js.map +1 -0
  259. package/dist/rules/schema/SCHEMA-010.d.ts +9 -0
  260. package/dist/rules/schema/SCHEMA-010.js +96 -0
  261. package/dist/rules/schema/SCHEMA-010.js.map +1 -0
  262. package/dist/rules/schema/SCHEMA-012.d.ts +9 -0
  263. package/dist/rules/schema/SCHEMA-012.js +65 -0
  264. package/dist/rules/schema/SCHEMA-012.js.map +1 -0
  265. package/dist/rules/security/SEC-002.d.ts +8 -0
  266. package/dist/rules/security/SEC-002.js +81 -0
  267. package/dist/rules/security/SEC-002.js.map +1 -0
  268. package/dist/rules/security/SEC-003.d.ts +8 -0
  269. package/dist/rules/security/SEC-003.js +85 -0
  270. package/dist/rules/security/SEC-003.js.map +1 -0
  271. package/dist/rules/security/SEC-004.d.ts +9 -0
  272. package/dist/rules/security/SEC-004.js +87 -0
  273. package/dist/rules/security/SEC-004.js.map +1 -0
  274. package/dist/rules/security/SEC-005.d.ts +8 -0
  275. package/dist/rules/security/SEC-005.js +87 -0
  276. package/dist/rules/security/SEC-005.js.map +1 -0
  277. package/dist/rules/security/SEC-006.d.ts +10 -0
  278. package/dist/rules/security/SEC-006.js +108 -0
  279. package/dist/rules/security/SEC-006.js.map +1 -0
  280. package/dist/rules/security/SEC-007.d.ts +9 -0
  281. package/dist/rules/security/SEC-007.js +108 -0
  282. package/dist/rules/security/SEC-007.js.map +1 -0
  283. package/dist/rules/security/SEC-008.d.ts +8 -0
  284. package/dist/rules/security/SEC-008.js +109 -0
  285. package/dist/rules/security/SEC-008.js.map +1 -0
  286. package/dist/rules/security/SEC-009.d.ts +9 -0
  287. package/dist/rules/security/SEC-009.js +93 -0
  288. package/dist/rules/security/SEC-009.js.map +1 -0
  289. package/dist/rules/security/SEC-010.d.ts +8 -0
  290. package/dist/rules/security/SEC-010.js +78 -0
  291. package/dist/rules/security/SEC-010.js.map +1 -0
  292. package/dist/rules/security/SEC-011.d.ts +8 -0
  293. package/dist/rules/security/SEC-011.js +93 -0
  294. package/dist/rules/security/SEC-011.js.map +1 -0
  295. package/dist/rules/security/SEC-012.d.ts +8 -0
  296. package/dist/rules/security/SEC-012.js +79 -0
  297. package/dist/rules/security/SEC-012.js.map +1 -0
  298. package/dist/rules/security/SEC-013.d.ts +9 -0
  299. package/dist/rules/security/SEC-013.js +107 -0
  300. package/dist/rules/security/SEC-013.js.map +1 -0
  301. package/dist/scoring/calculator.js +1 -0
  302. package/dist/scoring/calculator.js.map +1 -1
  303. package/dist/ui/ink/components/AIRecommendationCard.d.ts +11 -0
  304. package/dist/ui/ink/components/AIRecommendationCard.js +23 -0
  305. package/dist/ui/ink/components/AIRecommendationCard.js.map +1 -0
  306. package/dist/ui/ink/components/OpportunityList.d.ts +10 -0
  307. package/dist/ui/ink/components/OpportunityList.js +48 -0
  308. package/dist/ui/ink/components/OpportunityList.js.map +1 -0
  309. package/dist/ui/ink/components/PotentialPageCard.d.ts +13 -0
  310. package/dist/ui/ink/components/PotentialPageCard.js +43 -0
  311. package/dist/ui/ink/components/PotentialPageCard.js.map +1 -0
  312. package/dist/ui/ink/components/PotentialProgress.d.ts +16 -0
  313. package/dist/ui/ink/components/PotentialProgress.js +44 -0
  314. package/dist/ui/ink/components/PotentialProgress.js.map +1 -0
  315. package/dist/ui/ink/components/PotentialSummary.d.ts +10 -0
  316. package/dist/ui/ink/components/PotentialSummary.js +86 -0
  317. package/dist/ui/ink/components/PotentialSummary.js.map +1 -0
  318. package/dist/ui/ink/components/SuggestionCard.d.ts +34 -0
  319. package/dist/ui/ink/components/SuggestionCard.js +36 -0
  320. package/dist/ui/ink/components/SuggestionCard.js.map +1 -0
  321. package/dist/ui/ink/components/views/MultiPageCrawlView.d.ts +21 -0
  322. package/dist/ui/ink/components/views/MultiPageCrawlView.js +55 -0
  323. package/dist/ui/ink/components/views/MultiPageCrawlView.js.map +1 -0
  324. package/dist/ui/ink/components/views/PotentialView.d.ts +18 -0
  325. package/dist/ui/ink/components/views/PotentialView.js +74 -0
  326. package/dist/ui/ink/components/views/PotentialView.js.map +1 -0
  327. package/dist/ui/ink/components/views/ReconView.d.ts +22 -0
  328. package/dist/ui/ink/components/views/ReconView.js +30 -0
  329. package/dist/ui/ink/components/views/ReconView.js.map +1 -0
  330. package/package.json +2 -1
@@ -0,0 +1,48 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * OpportunityList Component
4
+ *
5
+ * Displays grouped opportunity lists color-coded by agentic value.
6
+ */
7
+ import { memo, useMemo } from 'react';
8
+ import { Box, Text } from 'ink';
9
+ import figures from 'figures';
10
+ const GROUP_LABELS = {
11
+ form: 'Forms',
12
+ search: 'Search',
13
+ filter: 'Filters',
14
+ action: 'Actions',
15
+ navigation: 'Navigation',
16
+ dynamic: 'Dynamic Flows',
17
+ };
18
+ const PRIORITY_COLORS = {
19
+ critical: 'red',
20
+ high: 'yellow',
21
+ medium: 'cyan',
22
+ low: 'gray',
23
+ };
24
+ function groupOpportunities(opportunities) {
25
+ return opportunities.reduce((acc, opp) => {
26
+ const key = opp.type;
27
+ if (!acc[key])
28
+ acc[key] = [];
29
+ acc[key].push(opp);
30
+ return acc;
31
+ }, {});
32
+ }
33
+ function OpportunityItem({ opportunity }) {
34
+ const color = PRIORITY_COLORS[opportunity.agenticValue] ?? 'gray';
35
+ return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: color, children: figures.bullet }), _jsx(Text, { bold: true, color: color, children: opportunity.suggestedToolName }), _jsxs(Text, { dimColor: true, children: ["(", Math.round(opportunity.confidence * 100), "% confidence)"] })] }), _jsx(Box, { marginLeft: 3, children: _jsx(Text, { wrap: "wrap", children: opportunity.suggestedDescription }) })] }));
36
+ }
37
+ export const OpportunityList = memo(function OpportunityList({ opportunities }) {
38
+ const groups = useMemo(() => groupOpportunities(opportunities), [opportunities]);
39
+ const orderedGroups = useMemo(() => {
40
+ const order = ['form', 'search', 'filter', 'action', 'navigation', 'dynamic'];
41
+ return order.filter((key) => groups[key]?.length).map((key) => ({ key, items: groups[key] }));
42
+ }, [groups]);
43
+ if (opportunities.length === 0) {
44
+ return (_jsx(Box, { padding: 1, children: _jsxs(Text, { dimColor: true, children: [figures.info, " No opportunities detected yet."] }) }));
45
+ }
46
+ return (_jsx(Box, { flexDirection: "column", paddingX: 2, children: orderedGroups.map(({ key, items }) => (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Text, { bold: true, color: "cyan", children: [GROUP_LABELS[key] ?? key, " (", items.length, ")"] }), _jsx(Box, { marginLeft: 1, flexDirection: "column", marginTop: 1, children: items.map((item) => (_jsx(OpportunityItem, { opportunity: item }, `${item.type}-${item.element}-${item.suggestedToolName}`))) })] }, key))) }));
47
+ });
48
+ //# sourceMappingURL=OpportunityList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpportunityList.js","sourceRoot":"","sources":["../../../../src/ui/ink/components/OpportunityList.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * PotentialPageCard Component
3
+ *
4
+ * Shows opportunity summary for a single crawled page.
5
+ */
6
+ import type { PagePotential } from '../../../potential/types.js';
7
+ interface PotentialPageCardProps {
8
+ page: PagePotential;
9
+ isActive?: boolean;
10
+ maxWidth?: number;
11
+ }
12
+ export declare const PotentialPageCard: import("react").NamedExoticComponent<PotentialPageCardProps>;
13
+ export {};
@@ -0,0 +1,43 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * PotentialPageCard Component
4
+ *
5
+ * Shows opportunity summary for a single crawled page.
6
+ */
7
+ import { memo, useMemo } from 'react';
8
+ import { Box, Text } from 'ink';
9
+ import figures from 'figures';
10
+ import chalk from 'chalk';
11
+ import { Card } from './shared/Card.js';
12
+ const PRIORITY_COLORS = {
13
+ critical: 'red',
14
+ high: 'yellow',
15
+ medium: 'cyan',
16
+ low: 'gray',
17
+ };
18
+ function renderScoreDots(score) {
19
+ const clamped = Math.max(0, Math.min(100, score));
20
+ const filled = Math.round(clamped / 10);
21
+ return `${'●'.repeat(filled)}${'○'.repeat(10 - filled)}`;
22
+ }
23
+ function formatUrlPath(url) {
24
+ try {
25
+ const parsed = new URL(url);
26
+ return parsed.pathname === '/' ? '/' : parsed.pathname;
27
+ }
28
+ catch {
29
+ return url;
30
+ }
31
+ }
32
+ function OpportunityRow({ opportunity }) {
33
+ const color = PRIORITY_COLORS[opportunity.agenticValue] ?? 'gray';
34
+ return (_jsxs(Box, { gap: 1, flexWrap: "wrap", children: [_jsx(Text, { color: color, children: figures.bullet }), _jsx(Text, { bold: true, color: color, children: opportunity.suggestedToolName }), _jsxs(Text, { dimColor: true, children: ["(", opportunity.agenticValue, ")"] }), _jsxs(Text, { wrap: "wrap", children: ["\u2014 ", opportunity.suggestedDescription] })] }, `${opportunity.type}-${opportunity.element}`));
35
+ }
36
+ export const PotentialPageCard = memo(function PotentialPageCard({ page, isActive = false, maxWidth, }) {
37
+ const opportunities = page.opportunities.slice(0, 5);
38
+ const hasMore = page.opportunities.length > opportunities.length;
39
+ const titlePath = formatUrlPath(page.url);
40
+ const scoreDots = useMemo(() => renderScoreDots(page.potentialScore), [page.potentialScore]);
41
+ return (_jsx(Card, { borderColor: isActive ? 'cyan' : 'gray', borderStyle: isActive ? 'bold' : 'single', marginBottom: 1, width: maxWidth, children: _jsxs(Box, { flexDirection: "column", gap: 1, children: [_jsxs(Box, { justifyContent: "space-between", flexWrap: "wrap", children: [_jsxs(Text, { children: [chalk.bold(titlePath), " ", _jsxs(Text, { dimColor: true, children: ["(depth ", page.depth, ")"] })] }), _jsxs(Text, { color: "cyan", children: ["Potential Score: ", page.potentialScore, "/100"] })] }), _jsx(Box, { children: _jsx(Text, { color: "yellow", children: scoreDots }) }), _jsxs(Box, { gap: 3, flexWrap: "wrap", children: [_jsxs(Text, { dimColor: true, children: ["Existing Tools: ", page.existingTools] }), _jsxs(Text, { dimColor: true, children: ["Opportunities: ", page.opportunities.length] })] }), _jsxs(Box, { flexDirection: "column", marginTop: 1, gap: 0, children: [opportunities.length === 0 ? (_jsx(Text, { dimColor: true, children: "No high-impact opportunities detected." })) : (opportunities.map((opp) => (_jsx(OpportunityRow, { opportunity: opp }, `${opp.type}-${opp.element}-${opp.suggestedToolName}`)))), hasMore && (_jsxs(Text, { dimColor: true, children: ["\u2026and ", page.opportunities.length - opportunities.length, " more"] }))] })] }) }));
42
+ });
43
+ //# sourceMappingURL=PotentialPageCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PotentialPageCard.js","sourceRoot":"","sources":["../../../../src/ui/ink/components/PotentialPageCard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * PotentialProgress Component
3
+ *
4
+ * Displays crawl + analysis progress for the potential command.
5
+ */
6
+ export interface PotentialProgressProps {
7
+ targetUrl: string;
8
+ depthLimit?: number;
9
+ pagesFound: number;
10
+ crawledPages: number;
11
+ totalPages?: number;
12
+ currentPath?: string;
13
+ phase?: string;
14
+ statusMessage?: string;
15
+ }
16
+ export declare const PotentialProgress: import("react").NamedExoticComponent<PotentialProgressProps>;
@@ -0,0 +1,44 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * PotentialProgress Component
4
+ *
5
+ * Displays crawl + analysis progress for the potential command.
6
+ */
7
+ import { memo, useMemo } from 'react';
8
+ import { Box, Text } from 'ink';
9
+ import chalk from 'chalk';
10
+ import figures from 'figures';
11
+ const BAR_LENGTH = 24;
12
+ function formatPhase(value) {
13
+ if (!value)
14
+ return 'In progress';
15
+ return value
16
+ .replace(/[-_]/g, ' ')
17
+ .replace(/\b\w/g, (char) => char.toUpperCase());
18
+ }
19
+ function formatPath(targetUrl, currentPath) {
20
+ if (currentPath)
21
+ return currentPath;
22
+ try {
23
+ const parsed = new URL(targetUrl);
24
+ return parsed.pathname === '/' ? parsed.hostname : parsed.pathname;
25
+ }
26
+ catch {
27
+ return targetUrl;
28
+ }
29
+ }
30
+ export const PotentialProgress = memo(function PotentialProgress({ targetUrl, depthLimit = 2, pagesFound, crawledPages, totalPages, currentPath, phase, statusMessage, }) {
31
+ const denominator = Math.max(totalPages ?? pagesFound, 1);
32
+ const percent = Math.min(100, Math.round((crawledPages / denominator) * 100));
33
+ const filled = Math.min(BAR_LENGTH, Math.round((percent / 100) * BAR_LENGTH));
34
+ const empty = Math.max(0, BAR_LENGTH - filled);
35
+ const bar = useMemo(() => {
36
+ const filledPart = filled > 0 ? chalk.cyan('█'.repeat(filled)) : '';
37
+ const emptyPart = empty > 0 ? chalk.gray('░'.repeat(empty)) : '';
38
+ return `${filledPart}${emptyPart}`;
39
+ }, [filled, empty]);
40
+ const phaseLabel = formatPhase(phase);
41
+ const currentLabel = formatPath(targetUrl, currentPath);
42
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 1, borderStyle: "round", borderColor: "cyan", children: [_jsxs(Box, { gap: 1, children: [_jsxs(Text, { children: [figures.pointerSmall, " Crawling"] }), _jsx(Text, { color: "cyan", children: targetUrl }), _jsxs(Text, { dimColor: true, children: ["(depth ", depthLimit, ")"] })] }), _jsxs(Box, { marginTop: 1, gap: 2, children: [_jsx(Text, { dimColor: true, children: "Pages found:" }), _jsx(Text, { children: pagesFound }), _jsx(Text, { dimColor: true, children: "| Crawled:" }), _jsxs(Text, { children: [crawledPages, "/", denominator] }), _jsx(Text, { dimColor: true, children: "| Progress:" }), _jsxs(Text, { children: [percent, "%"] })] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { children: bar }) }), _jsxs(Box, { marginTop: 1, gap: 1, children: [_jsx(Text, { dimColor: true, children: "Current:" }), _jsx(Text, { children: currentLabel })] }), _jsxs(Box, { marginTop: 1, gap: 1, children: [_jsx(Text, { dimColor: true, children: "Phase:" }), _jsx(Text, { color: "magenta", children: phaseLabel })] }), statusMessage && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { wrap: "wrap", dimColor: true, children: statusMessage }) }))] }));
43
+ });
44
+ //# sourceMappingURL=PotentialProgress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PotentialProgress.js","sourceRoot":"","sources":["../../../../src/ui/ink/components/PotentialProgress.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * PotentialSummary Component
3
+ *
4
+ * Overview of potential analysis results with stats + AI summary.
5
+ */
6
+ import type { PotentialReport } from '../../../potential/types.js';
7
+ export interface PotentialSummaryProps {
8
+ report: PotentialReport;
9
+ }
10
+ export declare const PotentialSummary: import("react").NamedExoticComponent<PotentialSummaryProps>;
@@ -0,0 +1,86 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * PotentialSummary Component
4
+ *
5
+ * Overview of potential analysis results with stats + AI summary.
6
+ */
7
+ import { memo, useMemo } from 'react';
8
+ import { Box, Text } from 'ink';
9
+ import chalk from 'chalk';
10
+ import { truncateText } from '../../design-tokens.js';
11
+ const severityOrder = ['critical', 'high', 'medium', 'low'];
12
+ function countByPriority(report) {
13
+ const counts = { critical: 0, high: 0, medium: 0, low: 0 };
14
+ for (const page of report.pages) {
15
+ for (const opp of page.opportunities) {
16
+ counts[opp.agenticValue] = (counts[opp.agenticValue] ?? 0) + 1;
17
+ }
18
+ }
19
+ return counts;
20
+ }
21
+ function gradientScore(score) {
22
+ const clamped = Math.max(0, Math.min(100, score));
23
+ const color = clamped >= 70 ? 'green' : clamped >= 40 ? 'yellow' : 'red';
24
+ const plain = `${clamped}/100`;
25
+ return { colored: chalk[color].bold(plain), plain };
26
+ }
27
+ function borderLine(width, cornerLeft, cornerRight) {
28
+ const horizontal = '═'.repeat(width - 2);
29
+ return `${cornerLeft}${horizontal}${cornerRight}`;
30
+ }
31
+ function formatLine(content, width) {
32
+ const innerWidth = width - 2;
33
+ const safe = content.length > innerWidth
34
+ ? truncateText(content, innerWidth)
35
+ : content;
36
+ return `║${safe.padEnd(innerWidth)}║`;
37
+ }
38
+ function formatCentered(text, width) {
39
+ const innerWidth = width - 2;
40
+ const safe = truncateText(text, innerWidth);
41
+ const padding = Math.max(0, Math.floor((innerWidth - safe.length) / 2));
42
+ const line = `${' '.repeat(padding)}${safe}`;
43
+ return formatLine(line, width);
44
+ }
45
+ function formatLabelLine(label, value, width) {
46
+ const innerWidth = width - 2;
47
+ const prefix = ` ${label}: `;
48
+ const available = Math.max(0, innerWidth - prefix.length);
49
+ const safeValue = truncateText(value, available);
50
+ return formatLine(`${prefix}${safeValue}`, width);
51
+ }
52
+ export const PotentialSummary = memo(function PotentialSummary({ report }) {
53
+ const priorityCounts = useMemo(() => countByPriority(report), [report]);
54
+ const width = 59;
55
+ const innerWidth = width - 2;
56
+ const readiness = gradientScore(report.overallReadinessScore);
57
+ const readinessPrefix = ' Overall Readiness: ';
58
+ const readinessSpacing = Math.max(0, innerWidth - readinessPrefix.length - readiness.plain.length);
59
+ const readinessLine = `║${readinessPrefix}${readiness.colored}${' '.repeat(readinessSpacing)}║`;
60
+ const lines = [
61
+ borderLine(width, '╔', '╗'),
62
+ formatCentered('WEBMCP POTENTIAL ANALYSIS', width),
63
+ formatLine('', width),
64
+ formatLabelLine('Target', report.targetUrl, width),
65
+ formatLabelLine('Pages Crawled', String(report.crawledPages), width),
66
+ readinessLine,
67
+ formatLine('', width),
68
+ formatLabelLine('Opportunities Found', String(report.totalOpportunities), width),
69
+ formatLine(` Critical: ${priorityCounts['critical']} | High: ${priorityCounts['high']} | Medium: ${priorityCounts['medium']} | Low: ${priorityCounts['low']}`, width),
70
+ formatLine('', width),
71
+ ];
72
+ const summaryLines = report.summary
73
+ .split(/\r?\n/)
74
+ .map((line) => line.trim())
75
+ .filter(Boolean)
76
+ .slice(0, 3);
77
+ for (const line of summaryLines) {
78
+ lines.push(formatLine(` ${line}`, width));
79
+ }
80
+ while (lines.length < 12) {
81
+ lines.push(formatLine('', width));
82
+ }
83
+ lines.push(borderLine(width, '╚', '╝'));
84
+ return (_jsx(Box, { flexDirection: "column", paddingX: 2, children: lines.map((line, index) => (_jsx(Text, { color: index === 0 || index === lines.length - 1 ? 'cyan' : undefined, children: line }, index))) }));
85
+ });
86
+ //# sourceMappingURL=PotentialSummary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PotentialSummary.js","sourceRoot":"","sources":["../../../../src/ui/ink/components/PotentialSummary.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * SuggestionCard Component
3
+ *
4
+ * Displays a suggested tool definition with name, description,
5
+ * schema, agentic value rating, and estimated score impact.
6
+ */
7
+ export interface SuggestedToolSchema {
8
+ type: 'object';
9
+ properties?: Record<string, {
10
+ type: string;
11
+ description?: string;
12
+ }>;
13
+ required?: string[];
14
+ }
15
+ export interface SuggestedTool {
16
+ name: string;
17
+ description: string;
18
+ schema: SuggestedToolSchema;
19
+ agenticValue: 'low' | 'medium' | 'high' | 'critical';
20
+ estimatedScoreImpact: number;
21
+ sourceForm?: string;
22
+ }
23
+ interface SuggestionCardProps {
24
+ suggestion: SuggestedTool;
25
+ index?: number;
26
+ isSelected?: boolean;
27
+ }
28
+ export declare function SuggestionCard({ suggestion, index, isSelected }: SuggestionCardProps): import("react/jsx-runtime").JSX.Element;
29
+ interface SuggestionListProps {
30
+ suggestions: SuggestedTool[];
31
+ selectedIndex?: number;
32
+ }
33
+ export declare function SuggestionList({ suggestions, selectedIndex }: SuggestionListProps): import("react/jsx-runtime").JSX.Element;
34
+ export {};
@@ -0,0 +1,36 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * SuggestionCard Component
4
+ *
5
+ * Displays a suggested tool definition with name, description,
6
+ * schema, agentic value rating, and estimated score impact.
7
+ */
8
+ import { Box, Text } from 'ink';
9
+ import figures from 'figures';
10
+ import { Card } from './shared/Card.js';
11
+ import { Badge } from './shared/Badge.js';
12
+ import { theme } from '../theme.js';
13
+ const VALUE_CONFIG = {
14
+ critical: { color: theme.colors.error, label: 'CRITICAL' },
15
+ high: { color: theme.colors.warning, label: 'HIGH' },
16
+ medium: { color: theme.colors.info, label: 'MEDIUM' },
17
+ low: { color: theme.colors.muted, label: 'LOW' },
18
+ };
19
+ export function SuggestionCard({ suggestion, index, isSelected }) {
20
+ const valueConfig = VALUE_CONFIG[suggestion.agenticValue] ?? VALUE_CONFIG['low'];
21
+ const properties = suggestion.schema.properties ?? {};
22
+ const paramNames = Object.keys(properties);
23
+ const requiredParams = suggestion.schema.required ?? [];
24
+ return (_jsxs(Card, { borderColor: isSelected ? 'cyan' : 'gray', borderStyle: isSelected ? 'bold' : 'single', marginBottom: 1, children: [_jsxs(Box, { gap: 2, marginBottom: 1, children: [index !== undefined && (_jsxs(Text, { dimColor: true, children: ["[", index + 1, "]"] })), _jsx(Text, { bold: true, color: "cyan", children: suggestion.name }), _jsx(Badge, { label: valueConfig.label, color: valueConfig.color })] }), _jsx(Box, { marginBottom: 1, children: _jsx(Text, { children: suggestion.description }) }), paramNames.length > 0 && (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { bold: true, dimColor: true, children: "Parameters:" }), paramNames.map((paramName) => {
25
+ const prop = properties[paramName];
26
+ const isRequired = requiredParams.includes(paramName);
27
+ return (_jsxs(Box, { gap: 1, paddingLeft: 2, children: [_jsx(Text, { color: "yellow", children: paramName }), _jsxs(Text, { dimColor: true, children: ["(", prop?.type ?? 'string', ")"] }), isRequired && _jsx(Text, { color: "red", children: "*" }), prop?.description && (_jsxs(Text, { dimColor: true, children: ["- ", prop.description] }))] }, paramName));
28
+ })] })), _jsxs(Box, { gap: 3, children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: "Value:" }), _jsx(Text, { color: valueConfig.color, bold: true, children: valueConfig.label })] }), _jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: "Score impact:" }), _jsxs(Text, { color: "green", bold: true, children: ["+", suggestion.estimatedScoreImpact, " pts"] })] }), suggestion.sourceForm && (_jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: "From:" }), _jsx(Text, { children: suggestion.sourceForm })] }))] })] }));
29
+ }
30
+ export function SuggestionList({ suggestions, selectedIndex }) {
31
+ if (suggestions.length === 0) {
32
+ return (_jsx(Box, { paddingX: 2, paddingY: 1, children: _jsxs(Text, { dimColor: true, children: [figures.info, " No tool suggestions available. All forms are already covered."] }) }));
33
+ }
34
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 2, children: [_jsxs(Text, { bold: true, color: "cyan", children: ["Suggested Tools (", suggestions.length, ")"] }), _jsx(Box, { flexDirection: "column", marginTop: 1, children: suggestions.map((suggestion, i) => (_jsx(SuggestionCard, { suggestion: suggestion, index: i, isSelected: selectedIndex === i }, suggestion.name))) })] }));
35
+ }
36
+ //# sourceMappingURL=SuggestionCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SuggestionCard.js","sourceRoot":"","sources":["../../../../src/ui/ink/components/SuggestionCard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * MultiPageCrawlView Component
3
+ *
4
+ * Displays multi-page crawl progress with per-page status,
5
+ * tool counts, finding counts, and an overall progress bar.
6
+ */
7
+ export type CrawlPageStatus = 'pending' | 'crawling' | 'done' | 'error';
8
+ export interface CrawlPageEntry {
9
+ url: string;
10
+ status: CrawlPageStatus;
11
+ toolCount: number;
12
+ findingCount: number;
13
+ depth: number;
14
+ }
15
+ interface MultiPageCrawlViewProps {
16
+ pages: CrawlPageEntry[];
17
+ maxPages: number;
18
+ maxVisible?: number;
19
+ }
20
+ export declare const MultiPageCrawlView: import("react").NamedExoticComponent<MultiPageCrawlViewProps>;
21
+ export {};
@@ -0,0 +1,55 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * MultiPageCrawlView Component
4
+ *
5
+ * Displays multi-page crawl progress with per-page status,
6
+ * tool counts, finding counts, and an overall progress bar.
7
+ */
8
+ import { Box, Text } from 'ink';
9
+ import Spinner from 'ink-spinner';
10
+ import { memo } from 'react';
11
+ import figures from 'figures';
12
+ import { ProgressBar } from '../ProgressBar.js';
13
+ import { theme } from '../../theme.js';
14
+ const PAGE_STATUS_CONFIG = {
15
+ pending: { icon: '○', color: theme.crawl.pending },
16
+ crawling: { icon: '◌', color: theme.crawl.active },
17
+ done: { icon: figures.tick, color: theme.crawl.done },
18
+ error: { icon: figures.cross, color: theme.colors.error },
19
+ };
20
+ function shortenUrl(url, maxLen) {
21
+ try {
22
+ const parsed = new URL(url);
23
+ const path = parsed.pathname + parsed.search;
24
+ if (path.length <= maxLen)
25
+ return path;
26
+ return path.substring(0, maxLen - 3) + '...';
27
+ }
28
+ catch {
29
+ if (url.length <= maxLen)
30
+ return url;
31
+ return url.substring(0, maxLen - 3) + '...';
32
+ }
33
+ }
34
+ export const MultiPageCrawlView = memo(function MultiPageCrawlView({ pages, maxPages, maxVisible = 10, }) {
35
+ const doneCount = pages.filter((p) => p.status === 'done').length;
36
+ const errorCount = pages.filter((p) => p.status === 'error').length;
37
+ const crawlingPage = pages.find((p) => p.status === 'crawling');
38
+ const totalTools = pages.reduce((sum, p) => sum + p.toolCount, 0);
39
+ const totalFindings = pages.reduce((sum, p) => sum + p.findingCount, 0);
40
+ const progress = maxPages > 0 ? (doneCount / maxPages) * 100 : 0;
41
+ // Show a window of pages around the active one
42
+ const activeIndex = pages.findIndex((p) => p.status === 'crawling');
43
+ let startIdx = 0;
44
+ if (pages.length > maxVisible) {
45
+ startIdx = Math.max(0, Math.min(activeIndex >= 0 ? activeIndex - Math.floor(maxVisible / 2) : pages.length - maxVisible, pages.length - maxVisible));
46
+ }
47
+ const visiblePages = pages.slice(startIdx, startIdx + maxVisible);
48
+ const hiddenBefore = startIdx;
49
+ const hiddenAfter = Math.max(0, pages.length - startIdx - maxVisible);
50
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 1, flexGrow: 1, children: [_jsxs(Box, { marginBottom: 1, gap: 2, children: [_jsx(Text, { bold: true, color: "cyan", children: "MULTI-PAGE CRAWL" }), crawlingPage && (_jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) }))] }), _jsx(Box, { marginBottom: 1, children: _jsx(ProgressBar, { value: progress, width: 40, showPercentage: true, color: doneCount === maxPages ? 'green' : 'cyan', label: `${doneCount}/${maxPages}` }) }), _jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: "gray", paddingX: 1, paddingY: 1, marginBottom: 1, children: [_jsxs(Box, { marginBottom: 1, children: [_jsx(Box, { width: 3 }), _jsx(Box, { width: 36, children: _jsx(Text, { bold: true, dimColor: true, children: "PATH" }) }), _jsx(Box, { width: 8, children: _jsx(Text, { bold: true, dimColor: true, children: "DEPTH" }) }), _jsx(Box, { width: 8, children: _jsx(Text, { bold: true, dimColor: true, children: "TOOLS" }) }), _jsx(Box, { width: 10, children: _jsx(Text, { bold: true, dimColor: true, children: "FINDINGS" }) })] }), hiddenBefore > 0 && (_jsx(Box, { children: _jsxs(Text, { dimColor: true, children: [" ... ", hiddenBefore, " more above"] }) })), visiblePages.map((page) => {
51
+ const config = PAGE_STATUS_CONFIG[page.status];
52
+ return (_jsxs(Box, { children: [_jsx(Box, { width: 3, children: page.status === 'crawling' ? (_jsx(Text, { color: config.color, children: _jsx(Spinner, { type: "dots" }) })) : (_jsx(Text, { color: config.color, children: config.icon })) }), _jsx(Box, { width: 36, children: _jsx(Text, { bold: page.status === 'crawling', dimColor: page.status === 'pending', children: shortenUrl(page.url, 34) }) }), _jsx(Box, { width: 8, children: _jsx(Text, { dimColor: true, children: page.depth }) }), _jsx(Box, { width: 8, children: page.status === 'done' ? (_jsx(Text, { color: page.toolCount > 0 ? 'green' : 'gray', children: page.toolCount })) : (_jsx(Text, { dimColor: true, children: "-" })) }), _jsx(Box, { width: 10, children: page.status === 'done' ? (_jsx(Text, { color: page.findingCount > 0 ? 'yellow' : 'green', children: page.findingCount })) : (_jsx(Text, { dimColor: true, children: "-" })) })] }, page.url));
53
+ }), hiddenAfter > 0 && (_jsx(Box, { children: _jsxs(Text, { dimColor: true, children: [" ... ", hiddenAfter, " more below"] }) }))] }), _jsxs(Box, { gap: 4, children: [_jsxs(Box, { borderStyle: "round", paddingX: 2, paddingY: 0, children: [_jsx(Text, { dimColor: true, children: "PAGES " }), _jsx(Text, { bold: true, color: "green", children: doneCount }), _jsxs(Text, { dimColor: true, children: ["/", maxPages] })] }), _jsxs(Box, { borderStyle: "round", paddingX: 2, paddingY: 0, children: [_jsx(Text, { dimColor: true, children: "TOOLS " }), _jsx(Text, { bold: true, color: "cyan", children: totalTools })] }), _jsxs(Box, { borderStyle: "round", paddingX: 2, paddingY: 0, children: [_jsx(Text, { dimColor: true, children: "FINDINGS " }), _jsx(Text, { bold: true, color: totalFindings > 0 ? 'yellow' : 'green', children: totalFindings })] }), errorCount > 0 && (_jsxs(Box, { borderStyle: "round", paddingX: 2, paddingY: 0, children: [_jsx(Text, { dimColor: true, children: "ERRORS " }), _jsx(Text, { bold: true, color: "red", children: errorCount })] }))] }), _jsx(Box, { flexGrow: 1 }), crawlingPage && (_jsx(Box, { marginTop: 2, children: _jsxs(Text, { dimColor: true, italic: true, children: ["Crawling: ", shortenUrl(crawlingPage.url, 60)] }) }))] }));
54
+ });
55
+ //# sourceMappingURL=MultiPageCrawlView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultiPageCrawlView.js","sourceRoot":"","sources":["../../../../../src/ui/ink/components/views/MultiPageCrawlView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * PotentialView Component
3
+ *
4
+ * Orchestrates the potential analysis experience: progress, summary,
5
+ * AI recommendations, and per-page opportunity cards with keyboard nav.
6
+ */
7
+ import type { ComponentProps } from 'react';
8
+ import { PotentialProgress } from '../PotentialProgress.js';
9
+ import type { PotentialReport } from '../../../../potential/types.js';
10
+ interface PotentialViewProps {
11
+ report?: PotentialReport;
12
+ isLoading?: boolean;
13
+ progress?: ComponentProps<typeof PotentialProgress>;
14
+ recommendations?: PotentialReport['topRecommendations'];
15
+ onExit?: () => void;
16
+ }
17
+ export declare function PotentialView({ report, isLoading, progress, recommendations, onExit, }: PotentialViewProps): import("react/jsx-runtime").JSX.Element;
18
+ export {};
@@ -0,0 +1,74 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * PotentialView Component
4
+ *
5
+ * Orchestrates the potential analysis experience: progress, summary,
6
+ * AI recommendations, and per-page opportunity cards with keyboard nav.
7
+ */
8
+ import { useMemo, useState, useEffect } from 'react';
9
+ import { Box, Text, useApp, useInput, useStdout } from 'ink';
10
+ import figures from 'figures';
11
+ import { PotentialSummary } from '../PotentialSummary.js';
12
+ import { PotentialProgress } from '../PotentialProgress.js';
13
+ import { AIRecommendationCard } from '../AIRecommendationCard.js';
14
+ import { PotentialPageCard } from '../PotentialPageCard.js';
15
+ import { OpportunityList } from '../OpportunityList.js';
16
+ const PAGE_WINDOW = 5;
17
+ export function PotentialView({ report, isLoading, progress, recommendations, onExit, }) {
18
+ const { exit } = useApp();
19
+ const { stdout } = useStdout();
20
+ const terminalWidth = stdout?.columns ?? 80;
21
+ const [selectedIndex, setSelectedIndex] = useState(0);
22
+ const [windowStart, setWindowStart] = useState(0);
23
+ const pages = useMemo(() => {
24
+ if (!report)
25
+ return [];
26
+ return [...report.pages].sort((a, b) => b.potentialScore - a.potentialScore);
27
+ }, [report]);
28
+ useEffect(() => {
29
+ setSelectedIndex(0);
30
+ setWindowStart(0);
31
+ }, [report?.targetUrl]);
32
+ useEffect(() => {
33
+ if (pages.length === 0) {
34
+ setWindowStart(0);
35
+ setSelectedIndex(0);
36
+ return;
37
+ }
38
+ if (selectedIndex >= pages.length) {
39
+ setSelectedIndex(pages.length - 1);
40
+ return;
41
+ }
42
+ if (selectedIndex < windowStart) {
43
+ setWindowStart(selectedIndex);
44
+ }
45
+ else if (selectedIndex >= windowStart + PAGE_WINDOW) {
46
+ setWindowStart(Math.max(0, selectedIndex - PAGE_WINDOW + 1));
47
+ }
48
+ }, [pages.length, selectedIndex, windowStart]);
49
+ useInput((input, key) => {
50
+ if (input === 'q') {
51
+ onExit?.();
52
+ exit();
53
+ return;
54
+ }
55
+ if (pages.length === 0)
56
+ return;
57
+ if (key.upArrow || input === 'k') {
58
+ setSelectedIndex((prev) => Math.max(0, prev - 1));
59
+ }
60
+ else if (key.downArrow || input === 'j') {
61
+ setSelectedIndex((prev) => Math.min(pages.length - 1, prev + 1));
62
+ }
63
+ });
64
+ const visiblePages = pages.slice(windowStart, windowStart + PAGE_WINDOW);
65
+ const selectedPage = pages[selectedIndex];
66
+ if (!report) {
67
+ return (_jsx(Box, { flexDirection: "column", padding: 2, children: isLoading && progress ? (_jsx(PotentialProgress, { ...progress })) : (_jsx(Text, { dimColor: true, children: "No potential analysis yet." })) }));
68
+ }
69
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 2, gap: 1, children: [isLoading && progress && (_jsx(PotentialProgress, { ...progress })), _jsx(PotentialSummary, { report: report }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "Top Recommendations" }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [(recommendations ?? report.topRecommendations).slice(0, 5).map((rec, index) => (_jsx(AIRecommendationCard, { recommendation: rec, index: index }, `${rec.title}-${index}`))), (recommendations ?? report.topRecommendations).length === 0 && (_jsx(Box, { paddingY: 1, children: _jsxs(Text, { dimColor: true, children: [figures.info, " AI recommendations will appear here after analysis."] }) }))] })] }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Box, { flexDirection: "row", justifyContent: "space-between", children: [_jsxs(Text, { bold: true, color: "cyan", children: ["Pages (", pages.length, ")"] }), _jsx(Text, { dimColor: true, children: "Use j/k or arrow keys to navigate \u2022 q to quit" })] }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [windowStart > 0 && (_jsxs(Text, { dimColor: true, children: ["\u2026", windowStart, " more above"] })), visiblePages.map((page, index) => {
70
+ const pageIndex = windowStart + index;
71
+ return (_jsx(PotentialPageCard, { page: page, isActive: selectedIndex === pageIndex, maxWidth: terminalWidth - 6 }, page.url));
72
+ }), windowStart + PAGE_WINDOW < pages.length && (_jsxs(Text, { dimColor: true, children: ["\u2026", pages.length - (windowStart + PAGE_WINDOW), " more below"] }))] })] }), selectedPage && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Text, { bold: true, color: "cyan", children: ["Opportunities on ", selectedPage.title || selectedPage.url] }), _jsx(OpportunityList, { opportunities: selectedPage.opportunities })] }))] }));
73
+ }
74
+ //# sourceMappingURL=PotentialView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PotentialView.js","sourceRoot":"","sources":["../../../../../src/ui/ink/components/views/PotentialView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * ReconView Component
3
+ *
4
+ * Displays reconnaissance phase progress: robots.txt, sitemap,
5
+ * manifest, and route discovery status.
6
+ */
7
+ export type ReconTaskStatus = 'pending' | 'running' | 'done' | 'skipped' | 'error';
8
+ export interface ReconTask {
9
+ id: string;
10
+ label: string;
11
+ status: ReconTaskStatus;
12
+ detail?: string;
13
+ }
14
+ interface ReconViewProps {
15
+ tasks: ReconTask[];
16
+ discoveredRoutes: number;
17
+ estimatedCrawlScope: number;
18
+ progress: number;
19
+ isComplete: boolean;
20
+ }
21
+ export declare const ReconView: import("react").NamedExoticComponent<ReconViewProps>;
22
+ export {};