chainwall 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +278 -0
  3. package/commands/security-scan.md +35 -0
  4. package/dist/auditor/access-mapper.d.ts +3 -0
  5. package/dist/auditor/access-mapper.d.ts.map +1 -0
  6. package/dist/auditor/access-mapper.js +15 -0
  7. package/dist/auditor/access-mapper.js.map +1 -0
  8. package/dist/auditor/cli-detector.d.ts +7 -0
  9. package/dist/auditor/cli-detector.d.ts.map +1 -0
  10. package/dist/auditor/cli-detector.js +63 -0
  11. package/dist/auditor/cli-detector.js.map +1 -0
  12. package/dist/auditor/cross-reference.d.ts +4 -0
  13. package/dist/auditor/cross-reference.d.ts.map +1 -0
  14. package/dist/auditor/cross-reference.js +16 -0
  15. package/dist/auditor/cross-reference.js.map +1 -0
  16. package/dist/auditor/env-auditor.d.ts +9 -0
  17. package/dist/auditor/env-auditor.d.ts.map +1 -0
  18. package/dist/auditor/env-auditor.js +83 -0
  19. package/dist/auditor/env-auditor.js.map +1 -0
  20. package/dist/auditor/mcp-analyzer.d.ts +11 -0
  21. package/dist/auditor/mcp-analyzer.d.ts.map +1 -0
  22. package/dist/auditor/mcp-analyzer.js +145 -0
  23. package/dist/auditor/mcp-analyzer.js.map +1 -0
  24. package/dist/auditor/mcp-detector.d.ts +17 -0
  25. package/dist/auditor/mcp-detector.d.ts.map +1 -0
  26. package/dist/auditor/mcp-detector.js +86 -0
  27. package/dist/auditor/mcp-detector.js.map +1 -0
  28. package/dist/auditor/remediation.d.ts +26 -0
  29. package/dist/auditor/remediation.d.ts.map +1 -0
  30. package/dist/auditor/remediation.js +222 -0
  31. package/dist/auditor/remediation.js.map +1 -0
  32. package/dist/auditor/tool-detector.d.ts +15 -0
  33. package/dist/auditor/tool-detector.d.ts.map +1 -0
  34. package/dist/auditor/tool-detector.js +241 -0
  35. package/dist/auditor/tool-detector.js.map +1 -0
  36. package/dist/auditor/types.d.ts +31 -0
  37. package/dist/auditor/types.d.ts.map +1 -0
  38. package/dist/auditor/types.js +2 -0
  39. package/dist/auditor/types.js.map +1 -0
  40. package/dist/auditor/vscode-extension-scanner.d.ts +8 -0
  41. package/dist/auditor/vscode-extension-scanner.d.ts.map +1 -0
  42. package/dist/auditor/vscode-extension-scanner.js +51 -0
  43. package/dist/auditor/vscode-extension-scanner.js.map +1 -0
  44. package/dist/cli.d.ts +3 -0
  45. package/dist/cli.d.ts.map +1 -0
  46. package/dist/cli.js +159 -0
  47. package/dist/cli.js.map +1 -0
  48. package/dist/commands/audit.d.ts +8 -0
  49. package/dist/commands/audit.d.ts.map +1 -0
  50. package/dist/commands/audit.js +151 -0
  51. package/dist/commands/audit.js.map +1 -0
  52. package/dist/commands/init.d.ts +2 -0
  53. package/dist/commands/init.d.ts.map +1 -0
  54. package/dist/commands/init.js +34 -0
  55. package/dist/commands/init.js.map +1 -0
  56. package/dist/commands/remediate-cli.d.ts +3 -0
  57. package/dist/commands/remediate-cli.d.ts.map +1 -0
  58. package/dist/commands/remediate-cli.js +96 -0
  59. package/dist/commands/remediate-cli.js.map +1 -0
  60. package/dist/commands/scan.d.ts +11 -0
  61. package/dist/commands/scan.d.ts.map +1 -0
  62. package/dist/commands/scan.js +138 -0
  63. package/dist/commands/scan.js.map +1 -0
  64. package/dist/commands/watch.d.ts +6 -0
  65. package/dist/commands/watch.d.ts.map +1 -0
  66. package/dist/commands/watch.js +203 -0
  67. package/dist/commands/watch.js.map +1 -0
  68. package/dist/config.d.ts +19 -0
  69. package/dist/config.d.ts.map +1 -0
  70. package/dist/config.js +235 -0
  71. package/dist/config.js.map +1 -0
  72. package/dist/mcp-server/index.d.ts +3 -0
  73. package/dist/mcp-server/index.d.ts.map +1 -0
  74. package/dist/mcp-server/index.js +69 -0
  75. package/dist/mcp-server/index.js.map +1 -0
  76. package/dist/mcp-server/schemas.d.ts +13 -0
  77. package/dist/mcp-server/schemas.d.ts.map +1 -0
  78. package/dist/mcp-server/schemas.js +13 -0
  79. package/dist/mcp-server/schemas.js.map +1 -0
  80. package/dist/mcp-server/tools/audit-status.d.ts +3 -0
  81. package/dist/mcp-server/tools/audit-status.d.ts.map +1 -0
  82. package/dist/mcp-server/tools/audit-status.js +46 -0
  83. package/dist/mcp-server/tools/audit-status.js.map +1 -0
  84. package/dist/mcp-server/tools/check-command.d.ts +4 -0
  85. package/dist/mcp-server/tools/check-command.d.ts.map +1 -0
  86. package/dist/mcp-server/tools/check-command.js +30 -0
  87. package/dist/mcp-server/tools/check-command.js.map +1 -0
  88. package/dist/mcp-server/tools/scan-content.d.ts +4 -0
  89. package/dist/mcp-server/tools/scan-content.d.ts.map +1 -0
  90. package/dist/mcp-server/tools/scan-content.js +18 -0
  91. package/dist/mcp-server/tools/scan-content.js.map +1 -0
  92. package/dist/mcp-server/tools/scan-file.d.ts +4 -0
  93. package/dist/mcp-server/tools/scan-file.d.ts.map +1 -0
  94. package/dist/mcp-server/tools/scan-file.js +48 -0
  95. package/dist/mcp-server/tools/scan-file.js.map +1 -0
  96. package/dist/mcp-server/types.d.ts +15 -0
  97. package/dist/mcp-server/types.d.ts.map +1 -0
  98. package/dist/mcp-server/types.js +2 -0
  99. package/dist/mcp-server/types.js.map +1 -0
  100. package/dist/reporter/audit-report.d.ts +4 -0
  101. package/dist/reporter/audit-report.d.ts.map +1 -0
  102. package/dist/reporter/audit-report.js +186 -0
  103. package/dist/reporter/audit-report.js.map +1 -0
  104. package/dist/reporter/json-report.d.ts +3 -0
  105. package/dist/reporter/json-report.d.ts.map +1 -0
  106. package/dist/reporter/json-report.js +4 -0
  107. package/dist/reporter/json-report.js.map +1 -0
  108. package/dist/reporter/remediation-text.d.ts +3 -0
  109. package/dist/reporter/remediation-text.d.ts.map +1 -0
  110. package/dist/reporter/remediation-text.js +12 -0
  111. package/dist/reporter/remediation-text.js.map +1 -0
  112. package/dist/reporter/risk-scorer.d.ts +8 -0
  113. package/dist/reporter/risk-scorer.d.ts.map +1 -0
  114. package/dist/reporter/risk-scorer.js +40 -0
  115. package/dist/reporter/risk-scorer.js.map +1 -0
  116. package/dist/reporter/sarif-report.d.ts +3 -0
  117. package/dist/reporter/sarif-report.d.ts.map +1 -0
  118. package/dist/reporter/sarif-report.js +80 -0
  119. package/dist/reporter/sarif-report.js.map +1 -0
  120. package/dist/reporter/shared.d.ts +11 -0
  121. package/dist/reporter/shared.d.ts.map +1 -0
  122. package/dist/reporter/shared.js +85 -0
  123. package/dist/reporter/shared.js.map +1 -0
  124. package/dist/reporter/summary-generator.d.ts +16 -0
  125. package/dist/reporter/summary-generator.d.ts.map +1 -0
  126. package/dist/reporter/summary-generator.js +89 -0
  127. package/dist/reporter/summary-generator.js.map +1 -0
  128. package/dist/reporter/terminal-report.d.ts +4 -0
  129. package/dist/reporter/terminal-report.d.ts.map +1 -0
  130. package/dist/reporter/terminal-report.js +135 -0
  131. package/dist/reporter/terminal-report.js.map +1 -0
  132. package/dist/rules/crypto-rules.d.ts +3 -0
  133. package/dist/rules/crypto-rules.d.ts.map +1 -0
  134. package/dist/rules/crypto-rules.js +252 -0
  135. package/dist/rules/crypto-rules.js.map +1 -0
  136. package/dist/rules/default-rules.d.ts +9 -0
  137. package/dist/rules/default-rules.d.ts.map +1 -0
  138. package/dist/rules/default-rules.js +1319 -0
  139. package/dist/rules/default-rules.js.map +1 -0
  140. package/dist/rules/index.d.ts +7 -0
  141. package/dist/rules/index.d.ts.map +1 -0
  142. package/dist/rules/index.js +7 -0
  143. package/dist/rules/index.js.map +1 -0
  144. package/dist/rules/injection-rules.d.ts +8 -0
  145. package/dist/rules/injection-rules.d.ts.map +1 -0
  146. package/dist/rules/injection-rules.js +108 -0
  147. package/dist/rules/injection-rules.js.map +1 -0
  148. package/dist/rules/types.d.ts +52 -0
  149. package/dist/rules/types.d.ts.map +1 -0
  150. package/dist/rules/types.js +2 -0
  151. package/dist/rules/types.js.map +1 -0
  152. package/dist/scanner/filesystem-scanner.d.ts +26 -0
  153. package/dist/scanner/filesystem-scanner.d.ts.map +1 -0
  154. package/dist/scanner/filesystem-scanner.js +369 -0
  155. package/dist/scanner/filesystem-scanner.js.map +1 -0
  156. package/dist/scanner/injection-scanner.d.ts +12 -0
  157. package/dist/scanner/injection-scanner.d.ts.map +1 -0
  158. package/dist/scanner/injection-scanner.js +136 -0
  159. package/dist/scanner/injection-scanner.js.map +1 -0
  160. package/dist/scanner/permission-checker.d.ts +4 -0
  161. package/dist/scanner/permission-checker.d.ts.map +1 -0
  162. package/dist/scanner/permission-checker.js +37 -0
  163. package/dist/scanner/permission-checker.js.map +1 -0
  164. package/dist/scanner/redact.d.ts +3 -0
  165. package/dist/scanner/redact.d.ts.map +1 -0
  166. package/dist/scanner/redact.js +17 -0
  167. package/dist/scanner/redact.js.map +1 -0
  168. package/dist/scanner/rule-engine.d.ts +9 -0
  169. package/dist/scanner/rule-engine.d.ts.map +1 -0
  170. package/dist/scanner/rule-engine.js +129 -0
  171. package/dist/scanner/rule-engine.js.map +1 -0
  172. package/dist/scanner/system-targets.d.ts +17 -0
  173. package/dist/scanner/system-targets.d.ts.map +1 -0
  174. package/dist/scanner/system-targets.js +81 -0
  175. package/dist/scanner/system-targets.js.map +1 -0
  176. package/dist/tui/App.d.ts +6 -0
  177. package/dist/tui/App.d.ts.map +1 -0
  178. package/dist/tui/App.js +224 -0
  179. package/dist/tui/App.js.map +1 -0
  180. package/dist/tui/components/BootSequence.d.ts +6 -0
  181. package/dist/tui/components/BootSequence.d.ts.map +1 -0
  182. package/dist/tui/components/BootSequence.js +40 -0
  183. package/dist/tui/components/BootSequence.js.map +1 -0
  184. package/dist/tui/components/BorderedSection.d.ts +12 -0
  185. package/dist/tui/components/BorderedSection.d.ts.map +1 -0
  186. package/dist/tui/components/BorderedSection.js +7 -0
  187. package/dist/tui/components/BorderedSection.js.map +1 -0
  188. package/dist/tui/components/ErrorBoundary.d.ts +18 -0
  189. package/dist/tui/components/ErrorBoundary.d.ts.map +1 -0
  190. package/dist/tui/components/ErrorBoundary.js +36 -0
  191. package/dist/tui/components/ErrorBoundary.js.map +1 -0
  192. package/dist/tui/components/FirstUseHint.d.ts +7 -0
  193. package/dist/tui/components/FirstUseHint.d.ts.map +1 -0
  194. package/dist/tui/components/FirstUseHint.js +20 -0
  195. package/dist/tui/components/FirstUseHint.js.map +1 -0
  196. package/dist/tui/components/Footer.d.ts +10 -0
  197. package/dist/tui/components/Footer.d.ts.map +1 -0
  198. package/dist/tui/components/Footer.js +51 -0
  199. package/dist/tui/components/Footer.js.map +1 -0
  200. package/dist/tui/components/MetricCard.d.ts +11 -0
  201. package/dist/tui/components/MetricCard.d.ts.map +1 -0
  202. package/dist/tui/components/MetricCard.js +8 -0
  203. package/dist/tui/components/MetricCard.js.map +1 -0
  204. package/dist/tui/components/Panel.d.ts +15 -0
  205. package/dist/tui/components/Panel.d.ts.map +1 -0
  206. package/dist/tui/components/Panel.js +25 -0
  207. package/dist/tui/components/Panel.js.map +1 -0
  208. package/dist/tui/components/RemediationMenu.d.ts +10 -0
  209. package/dist/tui/components/RemediationMenu.d.ts.map +1 -0
  210. package/dist/tui/components/RemediationMenu.js +84 -0
  211. package/dist/tui/components/RemediationMenu.js.map +1 -0
  212. package/dist/tui/components/RiskGauge.d.ts +7 -0
  213. package/dist/tui/components/RiskGauge.d.ts.map +1 -0
  214. package/dist/tui/components/RiskGauge.js +55 -0
  215. package/dist/tui/components/RiskGauge.js.map +1 -0
  216. package/dist/tui/components/ScrollableList.d.ts +11 -0
  217. package/dist/tui/components/ScrollableList.d.ts.map +1 -0
  218. package/dist/tui/components/ScrollableList.js +14 -0
  219. package/dist/tui/components/ScrollableList.js.map +1 -0
  220. package/dist/tui/components/Section.d.ts +9 -0
  221. package/dist/tui/components/Section.d.ts.map +1 -0
  222. package/dist/tui/components/Section.js +7 -0
  223. package/dist/tui/components/Section.js.map +1 -0
  224. package/dist/tui/components/SectionHeader.d.ts +8 -0
  225. package/dist/tui/components/SectionHeader.d.ts.map +1 -0
  226. package/dist/tui/components/SectionHeader.js +15 -0
  227. package/dist/tui/components/SectionHeader.js.map +1 -0
  228. package/dist/tui/components/SeverityBadge.d.ts +5 -0
  229. package/dist/tui/components/SeverityBadge.d.ts.map +1 -0
  230. package/dist/tui/components/SeverityBadge.js +7 -0
  231. package/dist/tui/components/SeverityBadge.js.map +1 -0
  232. package/dist/tui/components/Sidebar.d.ts +2 -0
  233. package/dist/tui/components/Sidebar.d.ts.map +1 -0
  234. package/dist/tui/components/Sidebar.js +40 -0
  235. package/dist/tui/components/Sidebar.js.map +1 -0
  236. package/dist/tui/components/StatusIndicator.d.ts +8 -0
  237. package/dist/tui/components/StatusIndicator.d.ts.map +1 -0
  238. package/dist/tui/components/StatusIndicator.js +15 -0
  239. package/dist/tui/components/StatusIndicator.js.map +1 -0
  240. package/dist/tui/components/Table.d.ts +21 -0
  241. package/dist/tui/components/Table.d.ts.map +1 -0
  242. package/dist/tui/components/Table.js +38 -0
  243. package/dist/tui/components/Table.js.map +1 -0
  244. package/dist/tui/components/Transition.d.ts +8 -0
  245. package/dist/tui/components/Transition.d.ts.map +1 -0
  246. package/dist/tui/components/Transition.js +38 -0
  247. package/dist/tui/components/Transition.js.map +1 -0
  248. package/dist/tui/components/WelcomeScreen.d.ts +6 -0
  249. package/dist/tui/components/WelcomeScreen.d.ts.map +1 -0
  250. package/dist/tui/components/WelcomeScreen.js +14 -0
  251. package/dist/tui/components/WelcomeScreen.js.map +1 -0
  252. package/dist/tui/educational.d.ts +32 -0
  253. package/dist/tui/educational.d.ts.map +1 -0
  254. package/dist/tui/educational.js +117 -0
  255. package/dist/tui/educational.js.map +1 -0
  256. package/dist/tui/hooks/useAudit.d.ts +24 -0
  257. package/dist/tui/hooks/useAudit.d.ts.map +1 -0
  258. package/dist/tui/hooks/useAudit.js +263 -0
  259. package/dist/tui/hooks/useAudit.js.map +1 -0
  260. package/dist/tui/hooks/useConfig.d.ts +18 -0
  261. package/dist/tui/hooks/useConfig.d.ts.map +1 -0
  262. package/dist/tui/hooks/useConfig.js +85 -0
  263. package/dist/tui/hooks/useConfig.js.map +1 -0
  264. package/dist/tui/hooks/useHookStatus.d.ts +10 -0
  265. package/dist/tui/hooks/useHookStatus.d.ts.map +1 -0
  266. package/dist/tui/hooks/useHookStatus.js +59 -0
  267. package/dist/tui/hooks/useHookStatus.js.map +1 -0
  268. package/dist/tui/hooks/useLogs.d.ts +42 -0
  269. package/dist/tui/hooks/useLogs.d.ts.map +1 -0
  270. package/dist/tui/hooks/useLogs.js +105 -0
  271. package/dist/tui/hooks/useLogs.js.map +1 -0
  272. package/dist/tui/hooks/useScan.d.ts +39 -0
  273. package/dist/tui/hooks/useScan.d.ts.map +1 -0
  274. package/dist/tui/hooks/useScan.js +255 -0
  275. package/dist/tui/hooks/useScan.js.map +1 -0
  276. package/dist/tui/hooks/useTerminalSize.d.ts +10 -0
  277. package/dist/tui/hooks/useTerminalSize.d.ts.map +1 -0
  278. package/dist/tui/hooks/useTerminalSize.js +27 -0
  279. package/dist/tui/hooks/useTerminalSize.js.map +1 -0
  280. package/dist/tui/index.d.ts +2 -0
  281. package/dist/tui/index.d.ts.map +1 -0
  282. package/dist/tui/index.js +8 -0
  283. package/dist/tui/index.js.map +1 -0
  284. package/dist/tui/screens/AuditPanel.d.ts +7 -0
  285. package/dist/tui/screens/AuditPanel.d.ts.map +1 -0
  286. package/dist/tui/screens/AuditPanel.js +467 -0
  287. package/dist/tui/screens/AuditPanel.js.map +1 -0
  288. package/dist/tui/screens/LogsPanel.d.ts +2 -0
  289. package/dist/tui/screens/LogsPanel.d.ts.map +1 -0
  290. package/dist/tui/screens/LogsPanel.js +127 -0
  291. package/dist/tui/screens/LogsPanel.js.map +1 -0
  292. package/dist/tui/screens/OverviewPanel.d.ts +2 -0
  293. package/dist/tui/screens/OverviewPanel.d.ts.map +1 -0
  294. package/dist/tui/screens/OverviewPanel.js +84 -0
  295. package/dist/tui/screens/OverviewPanel.js.map +1 -0
  296. package/dist/tui/screens/ScanPanel.d.ts +2 -0
  297. package/dist/tui/screens/ScanPanel.d.ts.map +1 -0
  298. package/dist/tui/screens/ScanPanel.js +188 -0
  299. package/dist/tui/screens/ScanPanel.js.map +1 -0
  300. package/dist/tui/screens/ScanResultsPanel.d.ts +2 -0
  301. package/dist/tui/screens/ScanResultsPanel.d.ts.map +1 -0
  302. package/dist/tui/screens/ScanResultsPanel.js +394 -0
  303. package/dist/tui/screens/ScanResultsPanel.js.map +1 -0
  304. package/dist/tui/screens/SettingsPanel.d.ts +2 -0
  305. package/dist/tui/screens/SettingsPanel.d.ts.map +1 -0
  306. package/dist/tui/screens/SettingsPanel.js +353 -0
  307. package/dist/tui/screens/SettingsPanel.js.map +1 -0
  308. package/dist/tui/state.d.ts +35 -0
  309. package/dist/tui/state.d.ts.map +1 -0
  310. package/dist/tui/state.js +13 -0
  311. package/dist/tui/state.js.map +1 -0
  312. package/dist/tui/theme.d.ts +58 -0
  313. package/dist/tui/theme.d.ts.map +1 -0
  314. package/dist/tui/theme.js +80 -0
  315. package/dist/tui/theme.js.map +1 -0
  316. package/dist/version.d.ts +2 -0
  317. package/dist/version.d.ts.map +1 -0
  318. package/dist/version.js +5 -0
  319. package/dist/version.js.map +1 -0
  320. package/hooks/audit-logger.sh +74 -0
  321. package/hooks/detection-lib.sh +301 -0
  322. package/hooks/git-pre-commit.sh +195 -0
  323. package/hooks/git-pre-push.sh +125 -0
  324. package/hooks/git-safety.sh +152 -0
  325. package/hooks/security-scanner.sh +527 -0
  326. package/install.sh +543 -0
  327. package/package.json +67 -0
  328. package/patterns/credentials.yaml +317 -0
  329. package/patterns/dangerous-commands.yaml +167 -0
  330. package/patterns/pii.yaml +95 -0
  331. package/patterns/prompt-injection.yaml +131 -0
  332. package/patterns/supply-chain.yaml +119 -0
  333. package/rules/AGENTS.md +60 -0
  334. package/rules/SECURITY-RULES.md +177 -0
  335. package/rules/claude.md +9 -0
  336. package/rules/clinerules +29 -0
  337. package/rules/continuerules +29 -0
  338. package/rules/copilot-instructions.md +9 -0
  339. package/rules/cursor-security.mdc +14 -0
  340. package/rules/gemini.md +9 -0
  341. package/rules/kiro-security.md +29 -0
  342. package/rules/roocode-security.md +29 -0
  343. package/rules/trae-security.md +29 -0
  344. package/rules/windsurfrules +9 -0
  345. package/skill/llm-antivirus/SKILL.md +73 -0
  346. package/skill/llm-antivirus/references/threat-patterns.yaml +82 -0
  347. package/skill/llm-antivirus/scripts/security-audit.sh +244 -0
  348. package/uninstall.sh +215 -0
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ interface Props {
3
+ children: React.ReactNode;
4
+ onReset: () => void;
5
+ }
6
+ interface State {
7
+ hasError: boolean;
8
+ error: string;
9
+ }
10
+ export declare class ErrorBoundary extends React.Component<Props, State> {
11
+ constructor(props: Props);
12
+ static getDerivedStateFromError(error: Error): State;
13
+ componentDidCatch(error: Error): void;
14
+ handleReset: () => void;
15
+ render(): string | number | bigint | boolean | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | import("react/jsx-runtime").JSX.Element | null | undefined;
16
+ }
17
+ export {};
18
+ //# sourceMappingURL=ErrorBoundary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../../../src/tui/components/ErrorBoundary.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,UAAU,KAAK;IACb,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,UAAU,KAAK;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAsBD,qBAAa,aAAc,SAAQ,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC;gBAClD,KAAK,EAAE,KAAK;IAKxB,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK;IAIpD,iBAAiB,CAAC,KAAK,EAAE,KAAK;IAK9B,WAAW,aAGT;IAEF,MAAM;CAMP"}
@@ -0,0 +1,36 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { Box, Text, useInput } from 'ink';
4
+ import { THEME } from '../theme.js';
5
+ function ErrorFallback({ error, onReset }) {
6
+ useInput((input, key) => {
7
+ if (key.escape) {
8
+ onReset();
9
+ }
10
+ });
11
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [_jsx(Text, { color: THEME.critical, bold: true, children: "Something went wrong" }), _jsx(Text, { color: THEME.primaryDim, children: error }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: THEME.brand, children: "Press Esc to return to dashboard" }) })] }));
12
+ }
13
+ export class ErrorBoundary extends React.Component {
14
+ constructor(props) {
15
+ super(props);
16
+ this.state = { hasError: false, error: '' };
17
+ }
18
+ static getDerivedStateFromError(error) {
19
+ return { hasError: true, error: error.message };
20
+ }
21
+ componentDidCatch(error) {
22
+ // Log to stderr — avoid corrupting TUI output
23
+ process.stderr.write(`[chainwall] TUI error: ${error.message}\n`);
24
+ }
25
+ handleReset = () => {
26
+ this.setState({ hasError: false, error: '' });
27
+ this.props.onReset();
28
+ };
29
+ render() {
30
+ if (this.state.hasError) {
31
+ return _jsx(ErrorFallback, { error: this.state.error, onReset: this.handleReset });
32
+ }
33
+ return this.props.children;
34
+ }
35
+ }
36
+ //# sourceMappingURL=ErrorBoundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorBoundary.js","sourceRoot":"","sources":["../../../src/tui/components/ErrorBoundary.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAYpC,SAAS,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,EAA0C;IAC/E,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,aAClD,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,2CAE1B,EACP,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,UAAU,YAAG,KAAK,GAAQ,EAC7C,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,iDAAyC,GAC7D,IACF,CACP,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,aAAc,SAAQ,KAAK,CAAC,SAAuB;IAC9D,YAAY,KAAY;QACtB,KAAK,CAAC,KAAK,CAAC,CAAC;QACb,IAAI,CAAC,KAAK,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC9C,CAAC;IAED,MAAM,CAAC,wBAAwB,CAAC,KAAY;QAC1C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;IAClD,CAAC;IAED,iBAAiB,CAAC,KAAY;QAC5B,8CAA8C;QAC9C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;IACpE,CAAC;IAED,WAAW,GAAG,GAAG,EAAE;QACjB,IAAI,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM;QACJ,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACxB,OAAO,KAAC,aAAa,IAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,GAAI,CAAC;QAC/E,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC7B,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ interface FirstUseHintProps {
2
+ id: string;
3
+ message: string;
4
+ }
5
+ export declare function FirstUseHint({ id, message }: FirstUseHintProps): import("react/jsx-runtime").JSX.Element | null;
6
+ export {};
7
+ //# sourceMappingURL=FirstUseHint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FirstUseHint.d.ts","sourceRoot":"","sources":["../../../src/tui/components/FirstUseHint.tsx"],"names":[],"mappings":"AAMA,UAAU,iBAAiB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,iBAAiB,kDAmB9D"}
@@ -0,0 +1,20 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useState, useEffect } from 'react';
3
+ import { Box, Text } from 'ink';
4
+ import { THEME } from '../theme.js';
5
+ const shownHints = new Set();
6
+ export function FirstUseHint({ id, message }) {
7
+ const [visible, setVisible] = useState(false);
8
+ useEffect(() => {
9
+ if (shownHints.has(id))
10
+ return;
11
+ shownHints.add(id);
12
+ setVisible(true);
13
+ const timer = setTimeout(() => setVisible(false), 5000);
14
+ return () => clearTimeout(timer);
15
+ }, [id]);
16
+ if (!visible)
17
+ return null;
18
+ return (_jsxs(Box, { paddingX: 1, marginBottom: 1, children: [_jsxs(Text, { color: THEME.brand, children: ['\u25b8', " "] }), _jsx(Text, { color: THEME.primary, children: message })] }));
19
+ }
20
+ //# sourceMappingURL=FirstUseHint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FirstUseHint.js","sourceRoot":"","sources":["../../../src/tui/components/FirstUseHint.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;AAOrC,MAAM,UAAU,YAAY,CAAC,EAAE,EAAE,EAAE,OAAO,EAAqB;IAC7D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO;QAC/B,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnB,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QACxD,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAET,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,OAAO,CACL,MAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,aAC/B,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,aAAG,QAAQ,SAAS,EAC5C,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,OAAO,YAAG,OAAO,GAAQ,IACxC,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Panel } from '../state.js';
2
+ import type { FocusArea } from '../state.js';
3
+ interface FooterProps {
4
+ panel: Panel;
5
+ panelState?: string;
6
+ focusArea: FocusArea;
7
+ }
8
+ export declare function Footer({ panel, panelState, focusArea }: FooterProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=Footer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Footer.d.ts","sourceRoot":"","sources":["../../../src/tui/components/Footer.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AA+B7C,UAAU,WAAW;IACnB,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,WAAW,2CAiCnE"}
@@ -0,0 +1,51 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import { THEME, ICONS } from '../theme.js';
4
+ import { useTermSize } from '../App.js';
5
+ const SIDEBAR_HINTS = 'up/down:navigate Enter/->:open 1-5:jump ?:help q:quit';
6
+ const DYNAMIC_HINTS = {
7
+ 'overview:idle': '<-:sidebar s:scan a:audit ?:help q:quit',
8
+ 'scan:mode-selection': '<-:sidebar j/k:mode Enter:start v:view last',
9
+ 'scan:scanning': 'Esc:cancel',
10
+ 'scan:cancelled': 'Esc:back',
11
+ 'scan:error': 'Esc:back',
12
+ 'scan-results:viewing': '<-:sidebar /:search f:sev c:cat t:view a:allow A:rule e:export',
13
+ 'scan-results:searching': 'Enter:apply Esc:clear',
14
+ 'audit:mode-selection': '<-:sidebar j/k:mode Enter:start',
15
+ 'audit:running': 'Esc:cancel',
16
+ 'audit:error': 'Esc:back',
17
+ 'audit:results': '<-:sidebar j/k:nav Enter:expand r:fix Esc:collapse',
18
+ 'settings:idle': '<-:sidebar p:toggle Enter:select Esc:back',
19
+ 'logs:activity': '<-:sidebar Tab:switch f:filter j/k:nav r:reload',
20
+ 'logs:history': '<-:sidebar Tab:switch j/k:nav r:reload',
21
+ };
22
+ const PANEL_FALLBACKS = {
23
+ overview: '<-:sidebar s:scan a:audit ?:help q:quit',
24
+ scan: '<-:sidebar j/k:mode Enter:start',
25
+ 'scan-results': '<-:sidebar /:search f:sev c:cat t:view e:export',
26
+ audit: '<-:sidebar j/k:mode Enter:start',
27
+ settings: '<-:sidebar p:toggle Esc:back',
28
+ logs: '<-:sidebar Tab:switch j/k:nav r:reload',
29
+ };
30
+ export function Footer({ panel, panelState, focusArea }) {
31
+ const termSize = useTermSize();
32
+ let hints;
33
+ if (focusArea === 'sidebar') {
34
+ hints = SIDEBAR_HINTS;
35
+ }
36
+ else {
37
+ const key = panelState ? `${panel}:${panelState}` : `${panel}:idle`;
38
+ hints = DYNAMIC_HINTS[key] ?? PANEL_FALLBACKS[panel];
39
+ }
40
+ const separatorWidth = Math.max(termSize.cols, 40);
41
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: THEME.border, children: ICONS.section.repeat(separatorWidth) }), _jsx(Box, { paddingX: 1, children: _jsx(Text, { children: hints.split(' ').filter(Boolean).map((chunk, i) => {
42
+ const parts = chunk.split(':');
43
+ if (parts.length >= 2) {
44
+ const key = parts[0];
45
+ const desc = parts.slice(1).join(':');
46
+ return _jsxs(Text, { children: [_jsx(Text, { color: THEME.title, children: key }), _jsxs(Text, { color: THEME.primaryDim, children: [":", desc, " "] })] }, i);
47
+ }
48
+ return _jsxs(Text, { color: THEME.primaryDim, children: [chunk, " "] }, i);
49
+ }) }) })] }));
50
+ }
51
+ //# sourceMappingURL=Footer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Footer.js","sourceRoot":"","sources":["../../../src/tui/components/Footer.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,aAAa,GAAG,2DAA2D,CAAC;AAElF,MAAM,aAAa,GAA2B;IAC5C,eAAe,EAAW,6CAA6C;IACvE,qBAAqB,EAAK,gDAAgD;IAC1E,eAAe,EAAW,YAAY;IACtC,gBAAgB,EAAU,UAAU;IACpC,YAAY,EAAc,UAAU;IACpC,sBAAsB,EAAI,uEAAuE;IACjG,wBAAwB,EAAE,wBAAwB;IAClD,sBAAsB,EAAI,mCAAmC;IAC7D,eAAe,EAAW,YAAY;IACtC,aAAa,EAAa,UAAU;IACpC,eAAe,EAAW,wDAAwD;IAClF,eAAe,EAAW,8CAA8C;IACxE,eAAe,EAAW,qDAAqD;IAC/E,cAAc,EAAY,2CAA2C;CACtE,CAAC;AAEF,MAAM,eAAe,GAA0B;IAC7C,QAAQ,EAAE,6CAA6C;IACvD,IAAI,EAAE,mCAAmC;IACzC,cAAc,EAAE,sDAAsD;IACtE,KAAK,EAAE,mCAAmC;IAC1C,QAAQ,EAAE,gCAAgC;IAC1C,IAAI,EAAE,2CAA2C;CAClD,CAAC;AAQF,MAAM,UAAU,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAe;IAClE,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAE/B,IAAI,KAAa,CAAC;IAClB,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,KAAK,GAAG,aAAa,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC;QACpE,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEnD,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,YACtB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,GAChC,EACP,KAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,YACd,KAAC,IAAI,cACF,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;wBAClD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;wBAC/B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;4BACtB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;4BACrB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;4BACtC,OAAO,MAAC,IAAI,eAAS,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,YAAG,GAAG,GAAQ,EAAA,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,UAAU,kBAAI,IAAI,UAAU,KAAxF,CAAC,CAA8F,CAAC;wBACpH,CAAC;wBACD,OAAO,MAAC,IAAI,IAAS,KAAK,EAAE,KAAK,CAAC,UAAU,aAAG,KAAK,WAAlC,CAAC,CAA2C,CAAC;oBACjE,CAAC,CAAC,GACG,GACH,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ interface MetricCardProps {
2
+ title: string;
3
+ value: string | number;
4
+ subtitle?: string;
5
+ barValue?: number;
6
+ barMax?: number;
7
+ color: string;
8
+ }
9
+ export declare function MetricCard({ title, value, subtitle, barValue, barMax, color }: MetricCardProps): import("react/jsx-runtime").JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=MetricCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetricCard.d.ts","sourceRoot":"","sources":["../../../src/tui/components/MetricCard.tsx"],"names":[],"mappings":"AAIA,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,eAAe,2CA8B9F"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import { THEME, ICONS } from '../theme.js';
4
+ export function MetricCard({ title, value, subtitle, barValue, barMax, color }) {
5
+ const barWidth = 14;
6
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: THEME.border, paddingX: 1, width: 18, children: [_jsx(Text, { color: THEME.title, children: title }), _jsxs(Text, { color: color, bold: true, children: [' ', value] }), barValue !== undefined && barMax !== undefined && barMax > 0 && (_jsxs(Text, { children: [_jsx(Text, { color: color, children: ICONS.bar.repeat(Math.round((barValue / barMax) * barWidth)) }), _jsx(Text, { color: THEME.muted, children: ICONS.barLight.repeat(Math.max(0, barWidth - Math.round((barValue / barMax) * barWidth))) })] })), subtitle && (_jsx(Text, { color: THEME.value, children: subtitle }))] }));
7
+ }
8
+ //# sourceMappingURL=MetricCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetricCard.js","sourceRoot":"","sources":["../../../src/tui/components/MetricCard.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAW3C,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAmB;IAC7F,MAAM,QAAQ,GAAG,EAAE,CAAC;IAEpB,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,KAAK,CAAC,MAAM,EACzB,QAAQ,EAAE,CAAC,EACX,KAAK,EAAE,EAAE,aAET,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,YAAG,KAAK,GAAQ,EACxC,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,EAAE,IAAI,mBACrB,IAAI,EAAE,KAAK,IACP,EACN,QAAQ,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,GAAG,CAAC,IAAI,CAC/D,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,YACf,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,GACxD,EACP,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,YACrB,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GACrF,IACF,CACR,EACA,QAAQ,IAAI,CACX,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,YAAG,QAAQ,GAAQ,CAC5C,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import { type BoxProps } from 'ink';
3
+ interface PanelProps {
4
+ title?: string;
5
+ children: React.ReactNode;
6
+ width?: number;
7
+ borderColor?: string;
8
+ padding?: number;
9
+ flexDirection?: BoxProps['flexDirection'];
10
+ active?: boolean;
11
+ }
12
+ /** Bordered panel — use for dialogs, overlays, and error states only. */
13
+ export declare function Panel({ title, children, width, borderColor, padding, flexDirection, active, }: PanelProps): import("react/jsx-runtime").JSX.Element;
14
+ export {};
15
+ //# sourceMappingURL=Panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Panel.d.ts","sourceRoot":"","sources":["../../../src/tui/components/Panel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AACnD,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,KAAK,CAAC;AAG/C,UAAU,UAAU;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IAC1C,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,yEAAyE;AACzE,wBAAgB,KAAK,CAAC,EACpB,KAAK,EACL,QAAQ,EACR,KAAK,EACL,WAA0B,EAC1B,OAAW,EACX,aAAwB,EACxB,MAAc,GACf,EAAE,UAAU,2CAwCZ"}
@@ -0,0 +1,25 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useState, useEffect } from 'react';
3
+ import { Box, Text } from 'ink';
4
+ import { THEME, BOX } from '../theme.js';
5
+ /** Bordered panel — use for dialogs, overlays, and error states only. */
6
+ export function Panel({ title, children, width, borderColor = THEME.border, padding = 1, flexDirection = 'column', active = false, }) {
7
+ const [pulseOn, setPulseOn] = useState(false);
8
+ useEffect(() => {
9
+ if (!active) {
10
+ setPulseOn(false);
11
+ return;
12
+ }
13
+ const timer = setInterval(() => {
14
+ setPulseOn((v) => !v);
15
+ }, 800);
16
+ return () => clearInterval(timer);
17
+ }, [active]);
18
+ const currentBorderColor = active
19
+ ? pulseOn
20
+ ? THEME.borderActive
21
+ : THEME.border
22
+ : borderColor;
23
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: currentBorderColor, paddingX: padding, width: width, children: [title && (_jsx(Box, { marginBottom: 0, children: _jsxs(Text, { color: THEME.brand, bold: true, children: [BOX.horizontal, " ", title, " ", BOX.horizontal] }) })), _jsx(Box, { flexDirection: flexDirection, children: children })] }));
24
+ }
25
+ //# sourceMappingURL=Panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Panel.js","sourceRoot":"","sources":["../../../src/tui/components/Panel.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAiB,MAAM,KAAK,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAYzC,yEAAyE;AACzE,MAAM,UAAU,KAAK,CAAC,EACpB,KAAK,EACL,QAAQ,EACR,KAAK,EACL,WAAW,GAAG,KAAK,CAAC,MAAM,EAC1B,OAAO,GAAG,CAAC,EACX,aAAa,GAAG,QAAQ,EACxB,MAAM,GAAG,KAAK,GACH;IACX,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,UAAU,CAAC,KAAK,CAAC,CAAC;YAClB,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC,EAAE,GAAG,CAAC,CAAC;QAER,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,MAAM,kBAAkB,GAAG,MAAM;QAC/B,CAAC,CAAC,OAAO;YACP,CAAC,CAAC,KAAK,CAAC,YAAY;YACpB,CAAC,CAAC,KAAK,CAAC,MAAM;QAChB,CAAC,CAAC,WAAW,CAAC;IAEhB,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAE,kBAAkB,EAC/B,QAAQ,EAAE,OAAO,EACjB,KAAK,EAAE,KAAK,aAEX,KAAK,IAAI,CACR,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,YAClB,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,mBAC3B,GAAG,CAAC,UAAU,OAAG,KAAK,OAAG,GAAG,CAAC,UAAU,IACnC,GACH,CACP,EACD,KAAC,GAAG,IAAC,aAAa,EAAE,aAAa,YAAG,QAAQ,GAAO,IAC/C,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { RemediationAction, RemediationResult } from '../../auditor/remediation.js';
2
+ interface RemediationMenuProps {
3
+ title: string;
4
+ actions: RemediationAction[];
5
+ onClose: () => void;
6
+ onActionComplete?: (result: RemediationResult) => void;
7
+ }
8
+ export declare function RemediationMenu({ title, actions, onClose, onActionComplete }: RemediationMenuProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=RemediationMenu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RemediationMenu.d.ts","sourceRoot":"","sources":["../../../src/tui/components/RemediationMenu.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEzF,UAAU,oBAAoB;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACxD;AAID,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE,oBAAoB,2CAsKlG"}
@@ -0,0 +1,84 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useState, useEffect } from 'react';
3
+ import { Box, Text, useInput } from 'ink';
4
+ import { THEME, ICONS } from '../theme.js';
5
+ export function RemediationMenu({ title, actions, onClose, onActionComplete }) {
6
+ const [selectedIndex, setSelectedIndex] = useState(0);
7
+ const [menuState, setMenuState] = useState('selecting');
8
+ const [result, setResult] = useState(null);
9
+ // Auto-close after showing result
10
+ useEffect(() => {
11
+ if (menuState === 'result' && result) {
12
+ const timer = setTimeout(() => {
13
+ onActionComplete?.(result);
14
+ onClose();
15
+ }, 3000);
16
+ return () => clearTimeout(timer);
17
+ }
18
+ }, [menuState, result]);
19
+ useInput((input, key) => {
20
+ if (menuState === 'executing')
21
+ return;
22
+ if (menuState === 'result') {
23
+ // Any key closes
24
+ onActionComplete?.(result);
25
+ onClose();
26
+ return;
27
+ }
28
+ if (key.escape) {
29
+ if (menuState === 'confirming') {
30
+ setMenuState('selecting');
31
+ }
32
+ else {
33
+ onClose();
34
+ }
35
+ return;
36
+ }
37
+ if (menuState === 'selecting') {
38
+ if (input === 'j' || key.downArrow) {
39
+ setSelectedIndex(i => Math.min(i + 1, actions.length - 1));
40
+ return;
41
+ }
42
+ if (input === 'k' || key.upArrow) {
43
+ setSelectedIndex(i => Math.max(i - 1, 0));
44
+ return;
45
+ }
46
+ if (key.return) {
47
+ const action = actions[selectedIndex];
48
+ if (action.riskLevel === 'caution') {
49
+ setMenuState('confirming');
50
+ }
51
+ else {
52
+ executeAction(action);
53
+ }
54
+ return;
55
+ }
56
+ }
57
+ if (menuState === 'confirming') {
58
+ if (key.return) {
59
+ executeAction(actions[selectedIndex]);
60
+ }
61
+ return;
62
+ }
63
+ });
64
+ const executeAction = async (action) => {
65
+ setMenuState('executing');
66
+ try {
67
+ const res = await action.execute();
68
+ setResult(res);
69
+ setMenuState('result');
70
+ }
71
+ catch (err) {
72
+ setResult({
73
+ success: false,
74
+ message: `Unexpected error: ${err instanceof Error ? err.message : String(err)}`,
75
+ });
76
+ setMenuState('result');
77
+ }
78
+ };
79
+ if (actions.length === 0) {
80
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: THEME.border, paddingX: 2, paddingY: 1, children: [_jsxs(Text, { color: THEME.brand, bold: true, children: ["Remediate: ", title] }), _jsx(Text, { color: THEME.primaryDim, children: "No remediation actions available for this item." }), _jsx(Text, { color: THEME.hint, children: "ESC: close" })] }));
81
+ }
82
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: THEME.brand, paddingX: 2, paddingY: 1, children: [_jsxs(Text, { color: THEME.brand, bold: true, children: [ICONS.section, ICONS.section, " Remediate: ", title, " ", ICONS.section, ICONS.section] }), _jsx(Text, { children: " " }), menuState === 'selecting' && (_jsxs(Box, { flexDirection: "column", children: [actions.map((action, i) => (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { children: [_jsx(Text, { color: i === selectedIndex ? THEME.brand : undefined, children: i === selectedIndex ? '\u25B8 ' : ' ' }), _jsxs(Text, { color: action.riskLevel === 'caution' ? THEME.medium : THEME.success, children: ["[", action.riskLevel === 'caution' ? 'CAUTION' : 'SAFE', "]"] }), _jsx(Text, { children: " " }), _jsx(Text, { color: THEME.value, children: action.label })] }), _jsxs(Box, { marginLeft: 4, children: [_jsx(Text, { color: THEME.label, children: "What this does: " }), _jsx(Text, { color: THEME.primaryDim, children: action.description })] })] }, i))), _jsx(Text, { color: THEME.hint, children: "j/k: select Enter: execute Esc: cancel" })] })), menuState === 'confirming' && (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: THEME.title, bold: true, children: "Confirm action:" }), _jsx(Text, { children: " " }), _jsx(Text, { color: THEME.value, children: actions[selectedIndex].label }), _jsx(Text, { color: THEME.primaryDim, children: actions[selectedIndex].description }), _jsx(Text, { children: " " }), _jsx(Text, { color: THEME.medium, children: "This action modifies files. A backup will be created." }), _jsx(Text, { children: " " }), _jsx(Text, { color: THEME.hint, children: "Enter: proceed Esc: cancel" })] })), menuState === 'executing' && (_jsx(Text, { color: THEME.brand, children: "Executing..." })), menuState === 'result' && result && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: result.success ? THEME.success : THEME.critical, children: [result.success ? '\u2713' : '\u2717', " ", result.message] }), result.backupPath && (_jsxs(Text, { children: [_jsx(Text, { color: THEME.label, children: "Backup: " }), _jsx(Text, { color: THEME.filePath, children: result.backupPath })] })), _jsx(Text, { children: " " }), _jsx(Text, { color: THEME.hint, children: "Auto-closing in 3s... (any key to close)" })] }))] }));
83
+ }
84
+ //# sourceMappingURL=RemediationMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RemediationMenu.js","sourceRoot":"","sources":["../../../src/tui/components/RemediationMenu.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ interface RiskGaugeProps {
2
+ score: number;
3
+ label: string;
4
+ }
5
+ export declare function RiskGauge({ score, label }: RiskGaugeProps): import("react/jsx-runtime").JSX.Element;
6
+ export {};
7
+ //# sourceMappingURL=RiskGauge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RiskGauge.d.ts","sourceRoot":"","sources":["../../../src/tui/components/RiskGauge.tsx"],"names":[],"mappings":"AAKA,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,cAAc,2CAoEzD"}
@@ -0,0 +1,55 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useState, useEffect, useRef } from 'react';
3
+ import { Box, Text } from 'ink';
4
+ import { THEME } from '../theme.js';
5
+ import { useTermSize } from '../App.js';
6
+ export function RiskGauge({ score, label }) {
7
+ const termSize = useTermSize();
8
+ const barWidth = Math.max(10, Math.round(termSize.contentWidth * 0.4));
9
+ const [displayedScore, setDisplayedScore] = useState(0);
10
+ const [pulseOn, setPulseOn] = useState(false);
11
+ const pulseCount = useRef(0);
12
+ useEffect(() => {
13
+ if (score === 0) {
14
+ setDisplayedScore(0);
15
+ return;
16
+ }
17
+ setDisplayedScore(0);
18
+ pulseCount.current = 0;
19
+ const step = score / 15;
20
+ let current = 0;
21
+ const timer = setInterval(() => {
22
+ current += step;
23
+ if (current >= score) {
24
+ current = score;
25
+ clearInterval(timer);
26
+ startPulse();
27
+ }
28
+ setDisplayedScore(Math.min(current, score));
29
+ }, 33);
30
+ return () => clearInterval(timer);
31
+ }, [score]);
32
+ const startPulse = () => {
33
+ pulseCount.current = 0;
34
+ const pulseTimer = setInterval(() => {
35
+ setPulseOn((v) => !v);
36
+ pulseCount.current++;
37
+ if (pulseCount.current >= 6) {
38
+ clearInterval(pulseTimer);
39
+ setPulseOn(false);
40
+ }
41
+ }, 200);
42
+ };
43
+ const filled = Math.round((displayedScore / 10) * barWidth);
44
+ const empty = barWidth - filled;
45
+ const getColor = (val) => {
46
+ if (val <= 2)
47
+ return THEME.success;
48
+ if (val <= 5)
49
+ return THEME.warning;
50
+ return THEME.critical;
51
+ };
52
+ const color = getColor(displayedScore);
53
+ return (_jsxs(Box, { children: [_jsxs(Text, { color: color, bold: !pulseOn, children: [displayedScore.toFixed(1), "/10"] }), _jsx(Text, { children: " " }), _jsx(Text, { color: color, children: '\u2588'.repeat(filled) }), _jsx(Text, { color: THEME.muted, children: '\u2591'.repeat(empty) }), _jsx(Text, { children: " " }), _jsx(Text, { color: color, bold: !pulseOn, children: label })] }));
54
+ }
55
+ //# sourceMappingURL=RiskGauge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RiskGauge.js","sourceRoot":"","sources":["../../../src/tui/components/RiskGauge.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ interface ScrollableListProps<T> {
3
+ items: T[];
4
+ selectedIndex: number;
5
+ height: number;
6
+ renderItem: (item: T, index: number, selected: boolean) => React.ReactNode;
7
+ keyExtractor?: (item: T, index: number) => string;
8
+ }
9
+ export declare function ScrollableList<T>({ items, selectedIndex, height, renderItem, keyExtractor, }: ScrollableListProps<T>): import("react/jsx-runtime").JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=ScrollableList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScrollableList.d.ts","sourceRoot":"","sources":["../../../src/tui/components/ScrollableList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,UAAU,mBAAmB,CAAC,CAAC;IAC7B,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,KAAK,CAAC,SAAS,CAAC;IAC3E,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACnD;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,EAChC,KAAK,EACL,aAAa,EACb,MAAM,EACN,UAAU,EACV,YAAY,GACb,EAAE,mBAAmB,CAAC,CAAC,CAAC,2CA6BxB"}
@@ -0,0 +1,14 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import { THEME } from '../theme.js';
4
+ export function ScrollableList({ items, selectedIndex, height, renderItem, keyExtractor, }) {
5
+ const visibleStart = Math.max(0, Math.min(selectedIndex - Math.floor(height / 2), items.length - height));
6
+ const visibleEnd = Math.min(items.length, visibleStart + height);
7
+ const visible = items.slice(visibleStart, visibleEnd);
8
+ return (_jsxs(Box, { flexDirection: "column", children: [visibleStart > 0 && (_jsxs(Text, { color: THEME.muted, children: [" ", '\u25b4', " ", visibleStart, " more above"] })), visible.map((item, i) => {
9
+ const realIndex = visibleStart + i;
10
+ const key = keyExtractor ? keyExtractor(item, realIndex) : String(realIndex);
11
+ return (_jsx(Box, { children: renderItem(item, realIndex, realIndex === selectedIndex) }, key));
12
+ }), visibleEnd < items.length && (_jsxs(Text, { color: THEME.muted, children: [' ', '\u25be', " ", items.length - visibleEnd, " more below"] }))] }));
13
+ }
14
+ //# sourceMappingURL=ScrollableList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScrollableList.js","sourceRoot":"","sources":["../../../src/tui/components/ScrollableList.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAUpC,MAAM,UAAU,cAAc,CAAI,EAChC,KAAK,EACL,aAAa,EACb,MAAM,EACN,UAAU,EACV,YAAY,GACW;IACvB,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAC3B,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CACxE,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IAEtD,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACxB,YAAY,GAAG,CAAC,IAAI,CACnB,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,mBAAK,QAAQ,OAAG,YAAY,mBAAmB,CACxE,EACA,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;gBACvB,MAAM,SAAS,GAAG,YAAY,GAAG,CAAC,CAAC;gBACnC,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC7E,OAAO,CACL,KAAC,GAAG,cACD,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,KAAK,aAAa,CAAC,IADjD,GAAG,CAEP,CACP,CAAC;YACJ,CAAC,CAAC,EACD,UAAU,GAAG,KAAK,CAAC,MAAM,IAAI,CAC5B,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,aACrB,IAAI,EAAE,QAAQ,OAAG,KAAK,CAAC,MAAM,GAAG,UAAU,mBACtC,CACR,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ interface SectionProps {
3
+ title: string;
4
+ children: React.ReactNode;
5
+ titleColor?: string;
6
+ }
7
+ export declare function Section({ title, children, titleColor }: SectionProps): import("react/jsx-runtime").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=Section.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Section.d.ts","sourceRoot":"","sources":["../../../src/tui/components/Section.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAwB,EAAE,EAAE,YAAY,2CAOlF"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import { THEME } from '../theme.js';
4
+ export function Section({ title, children, titleColor = THEME.brand }) {
5
+ return (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: titleColor, bold: true, children: title }), children] }));
6
+ }
7
+ //# sourceMappingURL=Section.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Section.js","sourceRoot":"","sources":["../../../src/tui/components/Section.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAQpC,MAAM,UAAU,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,GAAG,KAAK,CAAC,KAAK,EAAgB;IACjF,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,aACtC,KAAC,IAAI,IAAC,KAAK,EAAE,UAAU,EAAE,IAAI,kBAAE,KAAK,GAAQ,EAC3C,QAAQ,IACL,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ interface SectionHeaderProps {
2
+ title: string;
3
+ color?: string;
4
+ rightLabel?: string;
5
+ }
6
+ export declare function SectionHeader({ title, color, rightLabel }: SectionHeaderProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=SectionHeader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SectionHeader.d.ts","sourceRoot":"","sources":["../../../src/tui/components/SectionHeader.tsx"],"names":[],"mappings":"AAKA,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,KAAmB,EAAE,UAAU,EAAE,EAAE,kBAAkB,2CAuB3F"}
@@ -0,0 +1,15 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import { THEME, ICONS } from '../theme.js';
4
+ import { useTermSize } from '../App.js';
5
+ export function SectionHeader({ title, color = THEME.brand, rightLabel }) {
6
+ const termSize = useTermSize();
7
+ const availableWidth = termSize.contentWidth;
8
+ const prefix = `${ICONS.section}${ICONS.section} `;
9
+ const titlePart = `${title} `;
10
+ const rightPart = rightLabel ? ` ${rightLabel} ` : '';
11
+ const usedChars = prefix.length + titlePart.length + rightPart.length;
12
+ const fillCount = Math.max(3, availableWidth - usedChars);
13
+ return (_jsxs(Box, { marginTop: 1, children: [_jsxs(Text, { color: color, bold: true, children: [prefix, titlePart] }), _jsx(Text, { color: THEME.border, children: ICONS.section.repeat(fillCount) }), rightLabel && (_jsxs(Text, { color: THEME.primaryDim, children: [" ", rightLabel] }))] }));
14
+ }
15
+ //# sourceMappingURL=SectionHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SectionHeader.js","sourceRoot":"","sources":["../../../src/tui/components/SectionHeader.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAQxC,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,UAAU,EAAsB;IAC1F,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,cAAc,GAAG,QAAQ,CAAC,YAAY,CAAC;IAE7C,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,GAAG,CAAC;IACnD,MAAM,SAAS,GAAG,GAAG,KAAK,GAAG,CAAC;IAC9B,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;IACtE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC;IAE1D,OAAO,CACL,MAAC,GAAG,IAAC,SAAS,EAAE,CAAC,aACf,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,EAAE,IAAI,mBACrB,MAAM,EAAE,SAAS,IACb,EACP,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,YACtB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,GAC3B,EACN,UAAU,IAAI,CACb,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,UAAU,kBAAI,UAAU,IAAQ,CACpD,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Severity } from '../../rules/types.js';
2
+ export declare function SeverityBadge({ severity }: {
3
+ severity: Severity;
4
+ }): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=SeverityBadge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SeverityBadge.d.ts","sourceRoot":"","sources":["../../../src/tui/components/SeverityBadge.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,2CAMjE"}
@@ -0,0 +1,7 @@
1
+ import { jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Text } from 'ink';
3
+ import { SEVERITY_COLORS, SEVERITY_LABELS, ICONS } from '../theme.js';
4
+ export function SeverityBadge({ severity }) {
5
+ return (_jsxs(Text, { color: SEVERITY_COLORS[severity], bold: true, children: [ICONS.bar, " ", SEVERITY_LABELS[severity]] }));
6
+ }
7
+ //# sourceMappingURL=SeverityBadge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SeverityBadge.js","sourceRoot":"","sources":["../../../src/tui/components/SeverityBadge.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAE3B,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEtE,MAAM,UAAU,aAAa,CAAC,EAAE,QAAQ,EAA0B;IAChE,OAAO,CACL,MAAC,IAAI,IAAC,KAAK,EAAE,eAAe,CAAC,QAAQ,CAAC,EAAE,IAAI,mBACzC,KAAK,CAAC,GAAG,OAAG,eAAe,CAAC,QAAQ,CAAC,IACjC,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function Sidebar(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=Sidebar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sidebar.d.ts","sourceRoot":"","sources":["../../../src/tui/components/Sidebar.tsx"],"names":[],"mappings":"AAaA,wBAAgB,OAAO,4CAwEtB"}