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,127 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useState, useEffect } from 'react';
3
+ import { Box, Text, useInput } from 'ink';
4
+ import { SectionHeader } from '../components/SectionHeader.js';
5
+ import { Table, truncate } from '../components/Table.js';
6
+ import { useAppContext } from '../state.js';
7
+ import { useLogs } from '../hooks/useLogs.js';
8
+ import { useTermSize } from '../App.js';
9
+ import { THEME, ICONS, SEVERITY_COLORS } from '../theme.js';
10
+ const LOG_LEVEL_COLORS = {
11
+ info: THEME.muted,
12
+ warn: THEME.warning,
13
+ block: THEME.critical,
14
+ bypass: THEME.brand,
15
+ };
16
+ const FILTERS = ['all', 'critical', 'high', 'medium', 'low'];
17
+ const activityColumns = [
18
+ {
19
+ header: 'SEV',
20
+ width: 7,
21
+ render: (e) => {
22
+ const color = LOG_LEVEL_COLORS[e.severity ?? 'info']
23
+ ?? SEVERITY_COLORS[e.severity]
24
+ ?? THEME.muted;
25
+ return (_jsx(Text, { color: color, bold: true, children: (e.severity ?? 'info').toUpperCase().padEnd(5) }));
26
+ },
27
+ },
28
+ {
29
+ header: 'TOOL',
30
+ width: 14,
31
+ render: (e) => _jsx(Text, { color: THEME.label, children: truncate(e.tool ?? '', 13) }),
32
+ },
33
+ {
34
+ header: 'CONTENT',
35
+ width: 'flex',
36
+ render: (e) => _jsx(Text, { color: THEME.value, children: e.content || '(no content)' }),
37
+ },
38
+ ];
39
+ function makeHistoryColumns(contentWidth) {
40
+ // Adaptive: at narrow terminals, shrink TIME and hide MS column
41
+ const narrow = contentWidth < 55;
42
+ const cols = [
43
+ {
44
+ header: 'TYPE',
45
+ width: 6,
46
+ render: (e) => (_jsx(Text, { color: e.type === 'scan' ? THEME.primary : THEME.brand, bold: true, children: e.type === 'scan' ? 'SCAN' : 'AUDIT' })),
47
+ },
48
+ {
49
+ header: 'TIME',
50
+ width: narrow ? 12 : 20,
51
+ render: (e) => (_jsx(Text, { color: THEME.filePath, children: narrow
52
+ ? e.timestamp.replace('T', ' ').replace(/:\d{2}\.\d+Z$/, '')
53
+ : e.timestamp.replace('T', ' ').replace(/\.\d+Z$/, 'Z') })),
54
+ },
55
+ {
56
+ header: 'RISK',
57
+ width: 5,
58
+ render: (e) => (_jsx(Text, { color: e.riskScore > 50 ? THEME.critical : e.riskScore > 20 ? THEME.warning : THEME.success, children: e.riskScore })),
59
+ },
60
+ {
61
+ header: 'FINDS',
62
+ width: 5,
63
+ align: 'right',
64
+ render: (e) => _jsx(Text, { color: THEME.value, children: e.findingCount }),
65
+ },
66
+ ];
67
+ if (!narrow) {
68
+ cols.push({
69
+ header: 'MS',
70
+ width: 7,
71
+ align: 'right',
72
+ render: (e) => _jsx(Text, { color: THEME.primaryDim, children: e.durationMs }),
73
+ });
74
+ }
75
+ return cols;
76
+ }
77
+ export function LogsPanel() {
78
+ const { setPanelState, setFocusArea, state: appState } = useAppContext();
79
+ const logs = useLogs();
80
+ const termSize = useTermSize();
81
+ const [selectedIndex, setSelectedIndex] = useState(0);
82
+ const [filterIndex, setFilterIndex] = useState(0);
83
+ useEffect(() => {
84
+ setPanelState(logs.tab);
85
+ }, [logs.tab]);
86
+ useInput((input, key) => {
87
+ if (appState.focusArea !== 'content')
88
+ return;
89
+ if (key.escape) {
90
+ setFocusArea('sidebar');
91
+ return;
92
+ }
93
+ if (key.tab) {
94
+ if (logs.tab === 'activity') {
95
+ logs.setTab('history');
96
+ }
97
+ else {
98
+ logs.setTab('activity');
99
+ }
100
+ setSelectedIndex(0);
101
+ return;
102
+ }
103
+ if (input === 'j' || key.downArrow) {
104
+ const max = logs.tab === 'activity'
105
+ ? logs.filteredEntries.length - 1
106
+ : logs.historyEntries.length - 1;
107
+ setSelectedIndex((i) => Math.min(i + 1, max));
108
+ }
109
+ if (input === 'k' || key.upArrow) {
110
+ setSelectedIndex((i) => Math.max(i - 1, 0));
111
+ }
112
+ if (input === 'f' && logs.tab === 'activity') {
113
+ const newIdx = (filterIndex + 1) % FILTERS.length;
114
+ setFilterIndex(newIdx);
115
+ logs.setFilter(FILTERS[newIdx]);
116
+ setSelectedIndex(0);
117
+ }
118
+ if (input === 'r') {
119
+ logs.reload();
120
+ setSelectedIndex(0);
121
+ }
122
+ });
123
+ const listHeight = termSize.listHeight;
124
+ const historyColumns = React.useMemo(() => makeHistoryColumns(termSize.contentWidth), [termSize.contentWidth]);
125
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { gap: 2, children: [_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: logs.tab === 'activity' ? THEME.brand : THEME.primaryDim, bold: logs.tab === 'activity', children: "ACTIVITY" }), logs.tab === 'activity' && (_jsx(Text, { color: THEME.brand, children: ICONS.section.repeat(8) }))] }), _jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: logs.tab === 'history' ? THEME.brand : THEME.primaryDim, bold: logs.tab === 'history', children: "HISTORY" }), logs.tab === 'history' && (_jsx(Text, { color: THEME.brand, children: ICONS.section.repeat(7) }))] })] }), logs.tab === 'activity' && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: THEME.primaryDim, wrap: "wrap", children: ["Real-time events from hook enforcement ", ICONS.dash, " blocks, bypasses, warnings."] }), _jsx(SectionHeader, { title: "ACTIVITY LOG", rightLabel: `filter: ${FILTERS[filterIndex]}` }), _jsx(Box, { gap: 1, marginTop: 1, marginBottom: 1, children: FILTERS.map((f, i) => (_jsx(Text, { color: i === filterIndex ? THEME.brand : THEME.primaryDim, bold: i === filterIndex, children: i === filterIndex ? `[${f}]` : ` ${f} ` }, f))) }), !logs.loaded ? (_jsx(Text, { color: THEME.primaryDim, children: "Loading..." })) : (_jsx(Table, { columns: activityColumns, data: logs.filteredEntries, selectedIndex: selectedIndex, height: listHeight, keyExtractor: (_e, i) => `log-${i}`, emptyMessage: `No log entries${logs.filter !== 'all' ? ` with severity '${logs.filter}'` : ''}.` }))] })), logs.tab === 'history' && (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: THEME.primaryDim, wrap: "wrap", children: "Completed scan and audit runs. Each entry records the risk score, finding count, and duration." }), _jsx(SectionHeader, { title: "RUN HISTORY" }), _jsx(Box, { marginTop: 1, children: _jsx(Table, { columns: historyColumns, data: logs.historyEntries, selectedIndex: selectedIndex, height: listHeight, keyExtractor: (e, i) => `hist-${i}-${e.timestamp}`, emptyMessage: "No history yet. Run a scan or audit to populate." }) })] }))] }));
126
+ }
127
+ //# sourceMappingURL=LogsPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogsPanel.js","sourceRoot":"","sources":["../../../src/tui/screens/LogsPanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function OverviewPanel(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=OverviewPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OverviewPanel.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/OverviewPanel.tsx"],"names":[],"mappings":"AA4CA,wBAAgB,aAAa,4CAsM5B"}
@@ -0,0 +1,84 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useEffect, useState } from 'react';
3
+ import { Box, Text, useInput } from 'ink';
4
+ import { MetricCard } from '../components/MetricCard.js';
5
+ import { StatusIndicator } from '../components/StatusIndicator.js';
6
+ import { SectionHeader } from '../components/SectionHeader.js';
7
+ import { Table } from '../components/Table.js';
8
+ import { useAppContext } from '../state.js';
9
+ import { useHookStatus } from '../hooks/useHookStatus.js';
10
+ import { useTermSize } from '../App.js';
11
+ import { THEME, ACCESS_COLORS, ACCESS_LABELS, SEVERITY_LABELS } from '../theme.js';
12
+ import { detectInstalledTools } from '../../auditor/tool-detector.js';
13
+ import { allRules } from '../../rules/index.js';
14
+ import { computeFocusLine } from '../educational.js';
15
+ const SEVERITIES = ['critical', 'high', 'medium', 'low'];
16
+ const toolColumns = [
17
+ {
18
+ header: 'NAME',
19
+ width: 'flex',
20
+ render: (tool) => _jsx(Text, { color: THEME.value, children: tool.name }),
21
+ },
22
+ {
23
+ header: 'ACCESS',
24
+ width: 16,
25
+ render: (tool) => (_jsx(Text, { color: ACCESS_COLORS[tool.accessLevel], bold: true, children: ACCESS_LABELS[tool.accessLevel] })),
26
+ },
27
+ {
28
+ header: 'STATUS',
29
+ width: 16,
30
+ render: (tool) => (_jsx(Text, { color: tool.configPaths.length > 0 ? THEME.value : THEME.primaryDim, children: tool.configPaths.length > 0 ? 'Configured' : 'Detected' })),
31
+ },
32
+ ];
33
+ export function OverviewPanel() {
34
+ const { state, setPanel, setPanelState } = useAppContext();
35
+ const hookStatus = useHookStatus();
36
+ const termSize = useTermSize();
37
+ const [tools, setTools] = useState([]);
38
+ const [toolsLoaded, setToolsLoaded] = useState(false);
39
+ useEffect(() => {
40
+ const detected = detectInstalledTools();
41
+ setTools(detected);
42
+ setToolsLoaded(true);
43
+ }, []);
44
+ useEffect(() => {
45
+ setPanelState('idle');
46
+ }, []);
47
+ useInput((input) => {
48
+ if (state.focusArea !== 'content')
49
+ return;
50
+ if (input === 's') {
51
+ setPanel('scan');
52
+ return;
53
+ }
54
+ if (input === 'a') {
55
+ setPanel('audit');
56
+ return;
57
+ }
58
+ });
59
+ // Compute metrics
60
+ const riskScore = state.scanResult?.riskScore ?? state.auditResult?.scanResult.riskScore ?? 0;
61
+ const findingsCount = state.scanResult?.findings.length ?? 0;
62
+ const toolCount = toolsLoaded ? tools.length : 0;
63
+ const fullAccessCount = tools.filter(t => t.accessLevel === 'full').length;
64
+ // Severity breakdown for findings subtitle
65
+ const sevCounts = { critical: 0, high: 0, medium: 0, low: 0 };
66
+ if (state.scanResult) {
67
+ for (const f of state.scanResult.findings)
68
+ sevCounts[f.severity]++;
69
+ }
70
+ const sevParts = SEVERITIES
71
+ .filter(s => sevCounts[s] > 0)
72
+ .map(s => `${SEVERITY_LABELS[s][0]}:${sevCounts[s]}`)
73
+ .join(' ');
74
+ // Risk color
75
+ const riskColor = riskScore <= 2 ? THEME.success : riskScore <= 5 ? THEME.warning : THEME.critical;
76
+ const hooksMissing = hookStatus.checked && !hookStatus.installed;
77
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(SectionHeader, { title: "DASHBOARD" }), hooksMissing && (_jsxs(Box, { borderStyle: "round", borderColor: THEME.warning, paddingX: 1, marginTop: 1, children: [_jsxs(Text, { color: THEME.warning, bold: true, children: ['\u26a0', " Hooks not installed "] }), _jsxs(Text, { color: THEME.primaryDim, children: ["Go to Settings ", '>', " Hook Installation to set up real-time protection."] })] })), _jsxs(Box, { gap: 1, marginTop: 1, flexWrap: "wrap", children: [_jsx(MetricCard, { title: "RISK", value: riskScore > 0 ? `${riskScore.toFixed(1)}/10` : '--', color: riskScore > 0 ? riskColor : THEME.muted, barValue: riskScore, barMax: 10 }), _jsx(MetricCard, { title: "FINDINGS", value: state.scanResult ? String(findingsCount) : '--', color: findingsCount > 0 ? THEME.warning : THEME.success, subtitle: sevParts || undefined }), _jsx(MetricCard, { title: "AI TOOLS", value: toolsLoaded ? String(toolCount) : '--', color: fullAccessCount > 0 ? THEME.critical : THEME.brand, subtitle: fullAccessCount > 0 ? `${fullAccessCount} full` : undefined }), _jsx(MetricCard, { title: "RULES", value: String(allRules.length), color: THEME.brand, subtitle: "loaded" })] }), (state.scanResult || state.auditResult) && (() => {
78
+ const exposures = state.auditResult?.exposures ?? [];
79
+ const auditTools = state.auditResult?.tools ?? tools;
80
+ const focus = computeFocusLine(auditTools, exposures);
81
+ return focus ? (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: THEME.warning, wrap: "wrap", children: ['\u26a0', " ", focus] }) })) : null;
82
+ })(), _jsxs(Box, { marginTop: 1, gap: 4, flexWrap: "wrap", children: [_jsxs(Box, { flexDirection: "column", children: [_jsx(StatusIndicator, { label: "Protection", value: hookStatus.protectionEnabled ? 'ON' : 'OFF', status: hookStatus.protectionEnabled ? 'ok' : 'error' }), _jsx(StatusIndicator, { label: "Hooks", value: hookStatus.checked ? (hookStatus.installed ? 'Installed' : 'Not installed') : 'Checking...', status: hookStatus.checked ? (hookStatus.installed ? 'ok' : 'warning') : 'inactive' })] }), _jsxs(Box, { flexDirection: "column", children: [_jsx(StatusIndicator, { label: "Last Scan", value: state.scanResult ? `${findingsCount} findings` : 'Not run', status: state.scanResult ? (findingsCount > 0 ? 'warning' : 'ok') : 'inactive' }), _jsx(StatusIndicator, { label: "Last Audit", value: state.auditResult ? `${state.auditResult.tools.length} tools` : 'Not run', status: state.auditResult ? 'ok' : 'inactive' })] })] }), _jsx(SectionHeader, { title: "DETECTED AI TOOLS", rightLabel: tools.length > 0 ? `${tools.length} found` : undefined }), tools.length > 0 ? (_jsxs(_Fragment, { children: [_jsx(Box, { marginTop: 1, borderStyle: "single", borderColor: THEME.border, paddingX: 1, flexDirection: "column", children: _jsx(Table, { columns: toolColumns, data: tools, selectedIndex: -1, height: Math.min(tools.length + 1, 8), keyExtractor: (t) => t.name, emptyMessage: "No AI tools detected." }) }), _jsx(Text, { color: THEME.primaryDim, children: "Full Access = entire filesystem | Workspace = project only | Limited = open file only" })] })) : (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: THEME.success, children: "No AI tools detected. Run an audit for a deeper check." }) })), _jsx(SectionHeader, { title: "GETTING STARTED" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", gap: 0, children: [_jsxs(Text, { color: THEME.primaryDim, wrap: "wrap", children: ["Press ", _jsx(Text, { color: THEME.title, bold: true, children: "1" }), "-", _jsx(Text, { color: THEME.title, bold: true, children: "5" }), " to jump between panels, or use the sidebar with arrow keys."] }), _jsx(Text, { children: " " }), _jsxs(Box, { gap: 1, children: [_jsx(Text, { color: THEME.title, bold: true, children: '2 Scan ' }), _jsx(Text, { color: THEME.primaryDim, children: "Find exposed secrets, credentials, crypto keys, and PII on your machine" })] }), _jsxs(Box, { gap: 1, children: [_jsx(Text, { color: THEME.title, bold: true, children: '3 Audit ' }), _jsx(Text, { color: THEME.primaryDim, children: "Discover which AI tools are installed and what they can access" })] }), _jsxs(Box, { gap: 1, children: [_jsx(Text, { color: THEME.title, bold: true, children: '4 Settings' }), _jsx(Text, { color: THEME.primaryDim, children: "Configure allowlists, blocklists, and toggle real-time protection" })] }), _jsxs(Box, { gap: 1, children: [_jsx(Text, { color: THEME.title, bold: true, children: '5 Logs ' }), _jsx(Text, { color: THEME.primaryDim, children: "View hook activity, scan history, and blocked operations" })] }), _jsx(Text, { children: " " }), _jsxs(Text, { color: THEME.muted, children: ["Tip: Start with ", _jsx(Text, { color: THEME.title, bold: true, children: "Audit" }), " to see what's exposed, then ", _jsx(Text, { color: THEME.title, bold: true, children: "Scan" }), " to find specific secrets. Press ", _jsx(Text, { color: THEME.title, bold: true, children: "?" }), " for all keybindings."] })] })] }));
83
+ }
84
+ //# sourceMappingURL=OverviewPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OverviewPanel.js","sourceRoot":"","sources":["../../../src/tui/screens/OverviewPanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function ScanPanel(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ScanPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScanPanel.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/ScanPanel.tsx"],"names":[],"mappings":"AAqDA,wBAAgB,SAAS,4CA6QxB"}
@@ -0,0 +1,188 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useEffect, useState, useRef } from 'react';
3
+ import { Box, Text, useInput } from 'ink';
4
+ import { TextInput } from '@inkjs/ui';
5
+ import { ProgressBar } from '@inkjs/ui';
6
+ import InkSpinner from 'ink-spinner';
7
+ import { SectionHeader } from '../components/SectionHeader.js';
8
+ import { BorderedSection } from '../components/BorderedSection.js';
9
+ import { SeverityBadge } from '../components/SeverityBadge.js';
10
+ import { useAppContext } from '../state.js';
11
+ import { useScan } from '../hooks/useScan.js';
12
+ import { useTermSize } from '../App.js';
13
+ import { THEME, ICONS } from '../theme.js';
14
+ import { truncate } from '../components/Table.js';
15
+ const STAGE_LABELS = {
16
+ walking: 'Scanning files',
17
+ system: 'System targets',
18
+ permissions: 'Permission checks',
19
+ injection: 'Injection scan',
20
+ done: 'Complete',
21
+ };
22
+ const MODES = [
23
+ { key: 'quick', label: 'Quick Scan', desc: 'System credentials & permissions only' },
24
+ { key: 'standard', label: 'Standard Scan', desc: 'Current project + system targets' },
25
+ { key: 'deep', label: 'Deep Scan', desc: 'Full home directory + system targets' },
26
+ { key: 'custom', label: 'Custom Path', desc: 'Specify a directory to scan' },
27
+ ];
28
+ function formatElapsed(ms) {
29
+ const s = Math.floor(ms / 1000);
30
+ const m = Math.floor(s / 60);
31
+ const sec = s % 60;
32
+ if (m > 0)
33
+ return `${m}m ${sec}s`;
34
+ return `${sec}s`;
35
+ }
36
+ function formatETA(ms) {
37
+ if (ms < 1000)
38
+ return '<1s';
39
+ const s = Math.floor(ms / 1000);
40
+ const m = Math.floor(s / 60);
41
+ if (m > 5)
42
+ return '>5m';
43
+ const sec = s % 60;
44
+ if (m > 0)
45
+ return `~${m}m ${sec}s`;
46
+ return `~${s}s`;
47
+ }
48
+ export function ScanPanel() {
49
+ const { setScanResult, setPanel, setInputLocked, setPanelState, setFocusArea, state: appState } = useAppContext();
50
+ const scan = useScan();
51
+ const termSize = useTermSize();
52
+ const hasStarted = useRef(false);
53
+ const [flashIndex, setFlashIndex] = useState(-1);
54
+ const prevFindingsCount = useRef(0);
55
+ const [modeIndex, setModeIndex] = useState(0);
56
+ const [customPath, setCustomPath] = useState('');
57
+ const [enteringPath, setEnteringPath] = useState(false);
58
+ const [cancelConfirm, setCancelConfirm] = useState(false);
59
+ useEffect(() => {
60
+ if (scan.phase === 'idle' || scan.phase === 'selecting') {
61
+ setPanelState('mode-selection');
62
+ }
63
+ else if (scan.phase === 'scanning') {
64
+ setPanelState('scanning');
65
+ }
66
+ else if (scan.phase === 'cancelled') {
67
+ setPanelState('cancelled');
68
+ }
69
+ else if (scan.phase === 'error') {
70
+ setPanelState('error');
71
+ }
72
+ }, [scan.phase]);
73
+ useInput((input, key) => {
74
+ if (appState.focusArea !== 'content')
75
+ return;
76
+ if (scan.phase === 'idle' || scan.phase === 'selecting') {
77
+ if (enteringPath)
78
+ return;
79
+ if (input === 'v' && appState.scanResult) {
80
+ setPanel('scan-results');
81
+ return;
82
+ }
83
+ if (input === 'j' || key.downArrow) {
84
+ setModeIndex((i) => Math.min(i + 1, MODES.length - 1));
85
+ return;
86
+ }
87
+ if (input === 'k' || key.upArrow) {
88
+ setModeIndex((i) => Math.max(i - 1, 0));
89
+ return;
90
+ }
91
+ if (key.return) {
92
+ const mode = MODES[modeIndex];
93
+ if (mode.key === 'custom') {
94
+ setEnteringPath(true);
95
+ setInputLocked(true);
96
+ }
97
+ else {
98
+ hasStarted.current = true;
99
+ scan.startScan(mode.key);
100
+ }
101
+ return;
102
+ }
103
+ if (key.escape) {
104
+ setFocusArea('sidebar');
105
+ return;
106
+ }
107
+ return;
108
+ }
109
+ if (key.escape) {
110
+ if (scan.phase === 'scanning') {
111
+ if (cancelConfirm) {
112
+ scan.cancel();
113
+ setCancelConfirm(false);
114
+ }
115
+ else {
116
+ setCancelConfirm(true);
117
+ setTimeout(() => setCancelConfirm(false), 2000);
118
+ }
119
+ return;
120
+ }
121
+ else if (scan.phase === 'cancelled') {
122
+ if (scan.result) {
123
+ setScanResult(scan.result);
124
+ setPanel('scan-results');
125
+ }
126
+ else {
127
+ setFocusArea('sidebar');
128
+ }
129
+ }
130
+ else {
131
+ setFocusArea('sidebar');
132
+ }
133
+ }
134
+ });
135
+ useEffect(() => {
136
+ if (scan.phase === 'idle' && appState.scanResult) {
137
+ // Show mode selector
138
+ }
139
+ }, []);
140
+ useEffect(() => {
141
+ if (scan.findingsCount > prevFindingsCount.current) {
142
+ setFlashIndex(scan.findingsCount - 1);
143
+ const timer = setTimeout(() => setFlashIndex(-1), 150);
144
+ prevFindingsCount.current = scan.findingsCount;
145
+ return () => clearTimeout(timer);
146
+ }
147
+ }, [scan.findingsCount]);
148
+ useEffect(() => {
149
+ if (scan.phase === 'done' && scan.result) {
150
+ setScanResult(scan.result);
151
+ setPanel('scan-results');
152
+ }
153
+ }, [scan.phase]);
154
+ if (scan.phase === 'error') {
155
+ return (_jsxs(BorderedSection, { title: "SCAN ERROR", borderColor: THEME.critical, children: [_jsx(Text, { color: THEME.critical, children: scan.error }), _jsx(Text, { color: THEME.primaryDim, children: "Press Esc to go back" })] }));
156
+ }
157
+ if (scan.phase === 'idle' || scan.phase === 'selecting') {
158
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(SectionHeader, { title: "SELECT SCAN MODE" }), _jsx(Box, { flexDirection: "column", marginTop: 1, children: MODES.map((mode, i) => (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: i === modeIndex ? THEME.brand : THEME.muted, children: i === modeIndex ? ICONS.arrow : ' ' }), _jsx(Text, { color: i === modeIndex ? THEME.brand : THEME.primary, bold: i === modeIndex, children: mode.label }), _jsx(Text, { color: THEME.label, children: mode.desc })] }), i < MODES.length - 1 && _jsx(Text, { children: " " })] }, mode.key))) }), enteringPath && (_jsxs(Box, { marginTop: 1, children: [_jsx(Text, { color: THEME.brand, children: "Path: " }), _jsx(TextInput, { placeholder: "~/Projects", onSubmit: (value) => {
159
+ const path = value.trim();
160
+ if (path) {
161
+ setCustomPath(path);
162
+ setEnteringPath(false);
163
+ setInputLocked(false);
164
+ hasStarted.current = true;
165
+ const resolved = path.startsWith('~')
166
+ ? path.replace('~', process.env.HOME ?? '')
167
+ : path;
168
+ scan.startScan('custom', resolved);
169
+ }
170
+ else {
171
+ setEnteringPath(false);
172
+ setInputLocked(false);
173
+ }
174
+ } })] })), appState.scanResult && (_jsxs(Text, { color: THEME.primaryDim, dimColor: true, children: ["Previous results available ", ICONS.dash, " press v to view."] }))] }));
175
+ }
176
+ // Cancelled state
177
+ if (scan.phase === 'cancelled') {
178
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(SectionHeader, { title: "SCAN CANCELLED", color: THEME.warning }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Text, { color: THEME.warning, children: ["Scan cancelled ", ICONS.dash, " ", scan.scannedFiles, " files scanned, ", scan.findingsCount, " finding", scan.findingsCount !== 1 ? 's' : ''] }), _jsxs(Text, { children: [_jsx(Text, { color: THEME.label, children: "Elapsed:" }), " ", _jsx(Text, { color: THEME.value, children: formatElapsed(scan.elapsedMs) })] })] }), scan.findingsCount > 0 && (_jsxs(_Fragment, { children: [_jsx(SectionHeader, { title: `FINDINGS (${scan.findingsCount})` }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [scan.findings.slice(0, 8).map((f, i) => (_jsxs(Box, { gap: 1, children: [_jsx(SeverityBadge, { severity: f.severity }), _jsx(Text, { color: THEME.primary, children: f.ruleName }), _jsx(Text, { color: THEME.filePath, children: f.filePath.split('/').pop() })] }, i))), scan.findingsCount > 8 && (_jsxs(Text, { color: THEME.muted, children: ["...and ", scan.findingsCount - 8, " more"] }))] })] }))] }));
179
+ }
180
+ // Scanning state
181
+ const progressPercent = scan.progress;
182
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(SectionHeader, { title: "SCANNING", color: THEME.brand }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: THEME.brand, children: _jsx(InkSpinner, { type: "dots" }) }), _jsxs(Text, { color: THEME.primary, children: [STAGE_LABELS[scan.scanStage] ?? 'Scanning', " ", ICONS.dash, " ", progressPercent, "%"] })] }), _jsx(Box, { marginTop: 1, children: _jsx(ProgressBar, { value: progressPercent }) }), _jsxs(Box, { marginTop: 1, gap: 2, children: [_jsxs(Text, { children: [_jsx(Text, { color: THEME.label, children: "files:" }), " ", _jsx(Text, { color: THEME.value, children: scan.scannedFiles })] }), _jsxs(Text, { children: [_jsx(Text, { color: THEME.label, children: "speed:" }), " ", _jsxs(Text, { color: THEME.value, children: [scan.filesPerSec, "/s"] })] }), _jsxs(Text, { children: [_jsx(Text, { color: THEME.label, children: "elapsed:" }), " ", _jsx(Text, { color: THEME.value, children: formatElapsed(scan.elapsedMs) })] }), scan.estimatedRemainingMs !== null && (_jsxs(Text, { children: [_jsx(Text, { color: THEME.label, children: "ETA:" }), " ", _jsx(Text, { color: THEME.value, children: formatETA(scan.estimatedRemainingMs) })] }))] }), scan.currentDir && (_jsx(Text, { color: THEME.filePath, children: truncate(`${scan.currentDir}/${scan.currentFile}`, Math.max(20, termSize.contentWidth - 2)) })), cancelConfirm && (_jsx(Text, { color: THEME.brand, children: "Press ESC again to cancel" }))] }), scan.findings.length > 0 && (_jsxs(_Fragment, { children: [_jsx(SectionHeader, { title: `LIVE FINDINGS (${scan.findingsCount})`, color: THEME.warning }), _jsx(Box, { flexDirection: "column", marginTop: 1, children: scan.findings.slice(-8).map((f, i) => {
183
+ const actualIndex = scan.findings.length - 8 + i;
184
+ const isFlashing = actualIndex === flashIndex;
185
+ return (_jsxs(Box, { gap: 1, children: [_jsx(SeverityBadge, { severity: f.severity }), _jsx(Text, { color: isFlashing ? THEME.flash : THEME.primary, bold: isFlashing, children: f.ruleName }), _jsxs(Text, { color: isFlashing ? THEME.flash : THEME.filePath, children: [f.filePath.split('/').pop(), f.line > 0 ? `:${f.line}` : ''] })] }, i));
186
+ }) })] }))] }));
187
+ }
188
+ //# sourceMappingURL=ScanPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScanPanel.js","sourceRoot":"","sources":["../../../src/tui/screens/ScanPanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function ScanResultsPanel(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ScanResultsPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScanResultsPanel.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/ScanResultsPanel.tsx"],"names":[],"mappings":"AA2BA,wBAAgB,gBAAgB,4CA0kB/B"}