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,40 @@
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, ICONS, SIDEBAR_WIDTH } from '../theme.js';
5
+ import { MENU_ITEMS, useAppContext } from '../state.js';
6
+ import { useHookStatus } from '../hooks/useHookStatus.js';
7
+ import { allRules } from '../../rules/index.js';
8
+ function panelToMenuIndex(panel) {
9
+ if (panel === 'scan-results')
10
+ return 1;
11
+ const idx = MENU_ITEMS.findIndex((m) => m.panel === panel);
12
+ return idx >= 0 ? idx : 0;
13
+ }
14
+ export function Sidebar() {
15
+ const { state } = useAppContext();
16
+ const hookStatus = useHookStatus();
17
+ const activeMenuIndex = panelToMenuIndex(state.activePanel);
18
+ const sidebarFocused = state.focusArea === 'sidebar';
19
+ const scanCount = state.scanResult?.findings.length ?? 0;
20
+ const auditCount = state.auditResult?.tools.length ?? 0;
21
+ const badgeCounts = {
22
+ scan: scanCount,
23
+ audit: auditCount,
24
+ };
25
+ // Pulsing dot animation for protection status
26
+ const [pulseBold, setPulseBold] = useState(true);
27
+ useEffect(() => {
28
+ const timer = setInterval(() => {
29
+ setPulseBold((v) => !v);
30
+ }, 800);
31
+ return () => clearInterval(timer);
32
+ }, []);
33
+ return (_jsxs(Box, { flexDirection: "column", width: SIDEBAR_WIDTH, borderStyle: "double", borderColor: THEME.border, paddingX: 1, children: [_jsx(Box, { flexDirection: "column", flexGrow: 1, children: MENU_ITEMS.map((item, i) => {
34
+ const isActive = activeMenuIndex === i;
35
+ const isCursor = sidebarFocused && state.menuIndex === i;
36
+ const badge = badgeCounts[item.panel] ?? 0;
37
+ return (_jsxs(Box, { justifyContent: "space-between", children: [_jsxs(Text, { color: isActive ? THEME.brand : isCursor ? THEME.primary : THEME.primaryDim, bold: isActive || isCursor, backgroundColor: isActive ? THEME.rowHighlight : undefined, children: [isActive || isCursor ? ICONS.arrow : ' ', " ", i + 1, " ", item.label] }), badge > 0 && (_jsx(Text, { color: THEME.value, children: String(badge).padStart(3) }))] }, item.panel));
38
+ }) }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Text, { color: hookStatus.protectionEnabled ? THEME.success : THEME.critical, bold: pulseBold, children: [ICONS.dot, " ", hookStatus.protectionEnabled ? 'PROTECTED' : 'UNPROTECTED'] }), _jsxs(Text, { color: THEME.primaryDim, children: [allRules.length, " rules loaded"] })] })] }));
39
+ }
40
+ //# sourceMappingURL=Sidebar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sidebar.js","sourceRoot":"","sources":["../../../src/tui/components/Sidebar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ interface StatusIndicatorProps {
2
+ label: string;
3
+ value: string;
4
+ status: 'ok' | 'warning' | 'error' | 'inactive';
5
+ }
6
+ export declare function StatusIndicator({ label, value, status }: StatusIndicatorProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=StatusIndicator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusIndicator.d.ts","sourceRoot":"","sources":["../../../src/tui/components/StatusIndicator.tsx"],"names":[],"mappings":"AAIA,UAAU,oBAAoB;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,IAAI,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;CACjD;AASD,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,oBAAoB,2CAa7E"}
@@ -0,0 +1,15 @@
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
+ const STATUS_COLORS = {
5
+ ok: THEME.success,
6
+ warning: THEME.warning,
7
+ error: THEME.critical,
8
+ inactive: THEME.muted,
9
+ };
10
+ export function StatusIndicator({ label, value, status }) {
11
+ const dotColor = STATUS_COLORS[status] ?? THEME.muted;
12
+ const dot = status === 'inactive' ? ICONS.ring : ICONS.dot;
13
+ return (_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: dotColor, children: dot }), _jsx(Text, { color: THEME.label, children: label.padEnd(14) }), _jsx(Text, { color: status === 'ok' ? THEME.value : dotColor, bold: status !== 'inactive', children: value })] }));
14
+ }
15
+ //# sourceMappingURL=StatusIndicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusIndicator.js","sourceRoot":"","sources":["../../../src/tui/components/StatusIndicator.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAQ3C,MAAM,aAAa,GAA2B;IAC5C,EAAE,EAAE,KAAK,CAAC,OAAO;IACjB,OAAO,EAAE,KAAK,CAAC,OAAO;IACtB,KAAK,EAAE,KAAK,CAAC,QAAQ;IACrB,QAAQ,EAAE,KAAK,CAAC,KAAK;CACtB,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAwB;IAC5E,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC;IACtD,MAAM,GAAG,GAAG,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;IAE3D,OAAO,CACL,MAAC,GAAG,IAAC,GAAG,EAAE,CAAC,aACT,KAAC,IAAI,IAAC,KAAK,EAAE,QAAQ,YAAG,GAAG,GAAQ,EACnC,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,YAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,GAAQ,EACnD,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,KAAK,UAAU,YAC/E,KAAK,GACD,IACH,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ export interface Column<T> {
3
+ header: string;
4
+ width: number | 'flex';
5
+ align?: 'left' | 'right';
6
+ render: (item: T, selected: boolean) => React.ReactNode;
7
+ }
8
+ interface TableProps<T> {
9
+ columns: Column<T>[];
10
+ data: T[];
11
+ selectedIndex: number;
12
+ height: number;
13
+ keyExtractor: (item: T, index: number) => string;
14
+ emptyMessage?: string;
15
+ spanningRow?: (item: T, index: number) => boolean;
16
+ spanningRowRender?: (item: T, index: number, selected: boolean) => React.ReactNode;
17
+ }
18
+ declare function truncate(text: string, maxWidth: number): string;
19
+ export { truncate };
20
+ export declare function Table<T>({ columns, data, selectedIndex, height, keyExtractor, emptyMessage, spanningRow, spanningRowRender, }: TableProps<T>): import("react/jsx-runtime").JSX.Element;
21
+ //# sourceMappingURL=Table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Table.d.ts","sourceRoot":"","sources":["../../../src/tui/components/Table.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,WAAW,MAAM,CAAC,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,KAAK,KAAK,CAAC,SAAS,CAAC;CACzD;AAED,UAAU,UAAU,CAAC,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACrB,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACjD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IAClD,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,KAAK,CAAC,SAAS,CAAC;CACpF;AAED,iBAAS,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIxD;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC;AAEpB,wBAAgB,KAAK,CAAC,CAAC,EAAE,EACvB,OAAO,EACP,IAAI,EACJ,aAAa,EACb,MAAM,EACN,YAAY,EACZ,YAA0B,EAC1B,WAAW,EACX,iBAAiB,GAClB,EAAE,UAAU,CAAC,CAAC,CAAC,2CA6Ef"}
@@ -0,0 +1,38 @@
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
+ function truncate(text, maxWidth) {
5
+ if (text.length <= maxWidth)
6
+ return text;
7
+ if (maxWidth <= 1)
8
+ return text.slice(0, maxWidth);
9
+ return text.slice(0, maxWidth - 1) + '\u2026';
10
+ }
11
+ export { truncate };
12
+ export function Table({ columns, data, selectedIndex, height, keyExtractor, emptyMessage = 'No items.', spanningRow, spanningRowRender, }) {
13
+ if (data.length === 0) {
14
+ return _jsx(Text, { color: THEME.primaryDim, children: emptyMessage });
15
+ }
16
+ // Compute scroll window
17
+ const visibleStart = Math.max(0, Math.min(selectedIndex - Math.floor(height / 2), data.length - height));
18
+ const visibleEnd = Math.min(data.length, visibleStart + height);
19
+ const visible = data.slice(visibleStart, visibleEnd);
20
+ const aboveCount = visibleStart;
21
+ const belowCount = data.length - visibleEnd;
22
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { gap: 2, children: columns.map((col, ci) => {
23
+ const w = col.width === 'flex' ? undefined : col.width;
24
+ return (_jsx(Box, { width: w, flexGrow: col.width === 'flex' ? 1 : 0, children: _jsx(Text, { color: THEME.title, bold: true, children: typeof w === 'number' ? truncate(col.header, w) : col.header }) }, ci));
25
+ }) }), aboveCount > 0 && (_jsxs(Text, { color: THEME.muted, children: [" ", ICONS.scrollUp, " ", aboveCount, " more above"] })), visible.map((item, i) => {
26
+ const realIndex = visibleStart + i;
27
+ const selected = realIndex === selectedIndex;
28
+ // Spanning row (e.g. category header)
29
+ if (spanningRow?.(item, realIndex)) {
30
+ return (_jsx(Box, { backgroundColor: selected ? THEME.rowHighlight : undefined, children: spanningRowRender?.(item, realIndex, selected) }, keyExtractor(item, realIndex)));
31
+ }
32
+ return (_jsx(Box, { backgroundColor: selected ? THEME.rowHighlight : undefined, gap: 2, children: columns.map((col, ci) => {
33
+ const w = col.width === 'flex' ? undefined : col.width;
34
+ return (_jsx(Box, { width: w, flexGrow: col.width === 'flex' ? 1 : 0, children: col.render(item, selected) }, ci));
35
+ }) }, keyExtractor(item, realIndex)));
36
+ }), belowCount > 0 && (_jsxs(Text, { color: THEME.muted, children: [" ", ICONS.scrollDown, " ", belowCount, " more below"] }))] }));
37
+ }
38
+ //# sourceMappingURL=Table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Table.js","sourceRoot":"","sources":["../../../src/tui/components/Table.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ interface TransitionProps {
3
+ active: boolean;
4
+ children: React.ReactNode;
5
+ }
6
+ export declare function Transition({ active, children }: TransitionProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=Transition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Transition.d.ts","sourceRoot":"","sources":["../../../src/tui/components/Transition.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAKnD,UAAU,eAAe;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,eAAe,2CA4C/D"}
@@ -0,0 +1,38 @@
1
+ import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState, useEffect } from 'react';
3
+ import { Box, Text } from 'ink';
4
+ import { THEME, ICONS } from '../theme.js';
5
+ import { useTermSize } from '../App.js';
6
+ export function Transition({ active, children }) {
7
+ const termSize = useTermSize();
8
+ const width = termSize.contentWidth;
9
+ const [linePos, setLinePos] = useState(-1);
10
+ const [showContent, setShowContent] = useState(!active);
11
+ useEffect(() => {
12
+ if (!active) {
13
+ setShowContent(true);
14
+ return;
15
+ }
16
+ setShowContent(false);
17
+ setLinePos(0);
18
+ const steps = 3;
19
+ let step = 0;
20
+ const timer = setInterval(() => {
21
+ step++;
22
+ if (step >= steps) {
23
+ clearInterval(timer);
24
+ setLinePos(-1);
25
+ setShowContent(true);
26
+ }
27
+ else {
28
+ setLinePos(step);
29
+ }
30
+ }, 50);
31
+ return () => clearInterval(timer);
32
+ }, [active]);
33
+ if (!showContent && linePos >= 0) {
34
+ return (_jsx(Box, { flexDirection: "column", children: Array.from({ length: 3 }).map((_, i) => (_jsx(Text, { color: i === linePos ? THEME.brand : THEME.border, children: i === linePos ? ICONS.section.repeat(width) : ' '.repeat(width) }, i))) }));
35
+ }
36
+ return _jsx(_Fragment, { children: children });
37
+ }
38
+ //# sourceMappingURL=Transition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Transition.js","sourceRoot":"","sources":["../../../src/tui/components/Transition.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,KAAK,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAOxC,MAAM,UAAU,UAAU,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAmB;IAC9D,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC;IACpC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;IAExD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,cAAc,CAAC,IAAI,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,cAAc,CAAC,KAAK,CAAC,CAAC;QACtB,UAAU,CAAC,CAAC,CAAC,CAAC;QAEd,MAAM,KAAK,GAAG,CAAC,CAAC;QAChB,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,IAAI,EAAE,CAAC;YACP,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;gBAClB,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrB,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;gBACf,cAAc,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;QACH,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,IAAI,CAAC,WAAW,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACjC,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACxB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACvC,KAAC,IAAI,IAAS,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,YAC5D,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IADvD,CAAC,CAEL,CACR,CAAC,GACE,CACP,CAAC;IACJ,CAAC;IAED,OAAO,4BAAG,QAAQ,GAAI,CAAC;AACzB,CAAC"}
@@ -0,0 +1,6 @@
1
+ interface WelcomeScreenProps {
2
+ onComplete: () => void;
3
+ }
4
+ export declare function WelcomeScreen({ onComplete }: WelcomeScreenProps): import("react/jsx-runtime").JSX.Element;
5
+ export {};
6
+ //# sourceMappingURL=WelcomeScreen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WelcomeScreen.d.ts","sourceRoot":"","sources":["../../../src/tui/components/WelcomeScreen.tsx"],"names":[],"mappings":"AAMA,UAAU,kBAAkB;IAC1B,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,wBAAgB,aAAa,CAAC,EAAE,UAAU,EAAE,EAAE,kBAAkB,2CAuC/D"}
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text, useInput } from 'ink';
3
+ import BigText from 'ink-big-text';
4
+ import Gradient from 'ink-gradient';
5
+ import { THEME, ICONS } from '../theme.js';
6
+ export function WelcomeScreen({ onComplete }) {
7
+ useInput((_input, key) => {
8
+ if (key.return) {
9
+ onComplete();
10
+ }
11
+ });
12
+ return (_jsxs(Box, { flexDirection: "column", alignItems: "center", justifyContent: "center", paddingY: 2, children: [_jsx(Gradient, { colors: [THEME.brand, THEME.brandDim], children: _jsx(BigText, { text: "CHAINWALL", font: "tiny" }) }), _jsxs(Text, { color: THEME.label, children: [ICONS.shield, " Antivirus for AI Coding Agents"] }), _jsx(Text, { children: " " }), _jsx(Text, { color: THEME.value, children: "ChainWall protects your machine from AI tools that can reach your secrets." }), _jsx(Text, { children: " " }), _jsxs(Box, { flexDirection: "column", paddingX: 2, children: [_jsxs(Text, { color: THEME.success, children: [" ", ICONS.shieldCheck, " Scan for exposed API keys, SSH keys, and credentials"] }), _jsxs(Text, { color: THEME.success, children: [" ", ICONS.shieldCheck, " Map which AI tools can reach your secrets"] }), _jsxs(Text, { color: THEME.success, children: [" ", ICONS.shieldCheck, " Real-time blocking of dangerous operations"] }), _jsxs(Text, { color: THEME.success, children: [" ", ICONS.shieldCheck, " Detect MCP servers, CLI tools, and VS Code extensions"] })] }), _jsx(Text, { children: " " }), _jsx(Box, { borderStyle: "round", borderColor: THEME.brand, paddingX: 2, paddingY: 0, children: _jsx(Text, { color: THEME.brand, bold: true, children: "Press ENTER to run a quick security audit" }) })] }));
13
+ }
14
+ //# sourceMappingURL=WelcomeScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WelcomeScreen.js","sourceRoot":"","sources":["../../../src/tui/components/WelcomeScreen.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,QAAQ,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAM3C,MAAM,UAAU,aAAa,CAAC,EAAE,UAAU,EAAsB;IAC9D,QAAQ,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QACvB,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,UAAU,EAAE,CAAC;QACf,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,cAAc,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,aACjF,KAAC,QAAQ,IAAC,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,YAC7C,KAAC,OAAO,IAAC,IAAI,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,GAAG,GAC/B,EACX,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,aACrB,KAAK,CAAC,MAAM,uCACR,EACP,KAAC,IAAI,oBAAS,EACd,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,2FAEjB,EACP,KAAC,IAAI,oBAAS,EACd,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,aACrC,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,OAAO,mBAAK,KAAK,CAAC,WAAW,6DAA6D,EAC7G,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,OAAO,mBAAK,KAAK,CAAC,WAAW,kDAAkD,EAClG,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,OAAO,mBAAK,KAAK,CAAC,WAAW,mDAAmD,EACnG,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,OAAO,mBAAK,KAAK,CAAC,WAAW,8DAA8D,IAC1G,EACN,KAAC,IAAI,oBAAS,EACd,KAAC,GAAG,IACF,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,KAAK,CAAC,KAAK,EACxB,QAAQ,EAAE,CAAC,EACX,QAAQ,EAAE,CAAC,YAEX,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,gEAEvB,GACH,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { Category, Severity } from '../rules/types.js';
2
+ import type { AccessLevel } from '../auditor/types.js';
3
+ export declare const CATEGORY_EXPLAINERS: Record<Category, {
4
+ risk: string;
5
+ aiImpact: string;
6
+ action: string;
7
+ }>;
8
+ export declare const ACCESS_EXPLAINERS: Record<AccessLevel, {
9
+ summary: string;
10
+ detail: string;
11
+ examples: string;
12
+ concern: string;
13
+ }>;
14
+ export declare const SEVERITY_EXPLAINERS: Record<Severity, {
15
+ meaning: string;
16
+ urgency: string;
17
+ }>;
18
+ export declare const MCP_CAPABILITY_EXPLAINERS: Record<string, string>;
19
+ /**
20
+ * Compute the focus line for the audit summary — highlights the single most
21
+ * important thing the user should address.
22
+ */
23
+ export declare function computeFocusLine(tools: {
24
+ accessLevel: AccessLevel;
25
+ name: string;
26
+ }[], exposures: {
27
+ tool: {
28
+ accessLevel: AccessLevel;
29
+ };
30
+ counts: Record<Severity, number>;
31
+ }[]): string | null;
32
+ //# sourceMappingURL=educational.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"educational.d.ts","sourceRoot":"","sources":["../../src/tui/educational.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,QAAQ,EAAE;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CA8CA,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,WAAW,EAAE;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,CAmBA,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,QAAQ,EAAE;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,CAiBA,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQ5D,CAAC;AAEF;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IAAE,WAAW,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,EAAE,SAAS,EAAE;IAAE,IAAI,EAAE;QAAE,WAAW,EAAE,WAAW,CAAA;KAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;CAAE,EAAE,GAAG,MAAM,GAAG,IAAI,CAmB1L"}
@@ -0,0 +1,117 @@
1
+ export const CATEGORY_EXPLAINERS = {
2
+ credential: {
3
+ risk: 'Exposed API keys, passwords, or authentication tokens.',
4
+ aiImpact: 'An AI tool with access can use these to call external APIs, access cloud services, or authenticate as you.',
5
+ action: 'Rotate the key immediately, then move it to an environment variable or secrets manager.',
6
+ },
7
+ private_key: {
8
+ risk: 'SSH keys, TLS certificates, or GPG private keys.',
9
+ aiImpact: 'An AI tool reading this can authenticate as you to servers, sign code in your name, or decrypt your data.',
10
+ action: 'Move to ~/.ssh with chmod 600 permissions, or use a hardware key / SSH agent.',
11
+ },
12
+ dangerous_command: {
13
+ risk: 'Shell commands that could damage your system or leak data.',
14
+ aiImpact: 'If an AI runs these (rm -rf, curl|sh, chmod 777), it could delete files, install malware, or expose your system.',
15
+ action: 'Replace with safe alternatives. ChainWall hooks block these in real-time when enabled.',
16
+ },
17
+ pii: {
18
+ risk: 'Personal data — emails, phone numbers, IPs, or government IDs.',
19
+ aiImpact: 'AI tools may send file contents to external APIs for processing. PII in code can leak to model providers.',
20
+ action: 'Remove PII from source code. Use tokenization, redaction, or environment variables.',
21
+ },
22
+ injection: {
23
+ risk: 'Text that could manipulate AI behavior — prompt injection or instruction override.',
24
+ aiImpact: 'Embedded instructions can hijack AI tools to ignore safety rules, exfiltrate data, or execute arbitrary actions.',
25
+ action: 'Review flagged content. Remove or sanitize any embedded instructions.',
26
+ },
27
+ prompt_injection: {
28
+ risk: 'Text that could manipulate AI behavior — prompt injection or instruction override.',
29
+ aiImpact: 'Embedded instructions can hijack AI tools to ignore safety rules, exfiltrate data, or execute arbitrary actions.',
30
+ action: 'Review flagged content. Remove or sanitize any embedded instructions.',
31
+ },
32
+ supply_chain: {
33
+ risk: 'Package configs, dependency files, or registry URLs that could introduce malicious code.',
34
+ aiImpact: 'An AI modifying package.json, requirements.txt, or registry settings could inject backdoors into your build.',
35
+ action: 'Pin dependency versions. Verify package integrity. Use lockfiles.',
36
+ },
37
+ crypto: {
38
+ risk: 'Cryptocurrency wallet seeds, private keys, or mnemonic phrases.',
39
+ aiImpact: 'Anyone (or any AI) with a seed phrase or wallet key can drain funds irreversibly. There is no recovery.',
40
+ action: 'Move to a hardware wallet immediately. Never store seed phrases in files.',
41
+ },
42
+ permission: {
43
+ risk: 'Files with overly permissive access (e.g., 0644 on an SSH key).',
44
+ aiImpact: 'Other processes — including AI tools running as your user — can read these files freely.',
45
+ action: 'Run chmod 600 on key files and chmod 700 on key directories.',
46
+ },
47
+ };
48
+ export const ACCESS_EXPLAINERS = {
49
+ full: {
50
+ summary: 'Can read and write ANY file on your machine.',
51
+ detail: 'This tool has the same filesystem access as your user account. It can browse directories, read file contents, and modify any file you own.',
52
+ examples: '~/.ssh/id_rsa, ~/.aws/credentials, ~/.env, all project files, browser cookies, shell history',
53
+ concern: 'Every secret on your machine is reachable. Treat full-access tools like giving someone your laptop password.',
54
+ },
55
+ workspace: {
56
+ summary: 'Can only access files in the open project folder.',
57
+ detail: 'This tool is sandboxed to the current workspace. It cannot see files outside the project directory.',
58
+ examples: '.env, config.yaml, src/**/* — but NOT ~/.ssh, ~/.aws, or other projects',
59
+ concern: 'Secrets inside your project (like .env files) are exposed, but system-level credentials are safe.',
60
+ },
61
+ limited: {
62
+ summary: 'Can only see the currently open file and nearby context.',
63
+ detail: 'This tool gets code snippets for autocompletion but cannot browse your filesystem or read arbitrary files.',
64
+ examples: 'The file open in your editor, plus a few lines of surrounding context',
65
+ concern: 'Low risk — only secrets in the file you are actively editing are visible.',
66
+ },
67
+ };
68
+ export const SEVERITY_EXPLAINERS = {
69
+ critical: {
70
+ meaning: 'Actively exploitable secrets that could cause immediate damage.',
71
+ urgency: 'Fix immediately — these are the highest priority.',
72
+ },
73
+ high: {
74
+ meaning: 'Significant secrets that are likely exploitable.',
75
+ urgency: 'Fix within the current session before committing code.',
76
+ },
77
+ medium: {
78
+ meaning: 'Potentially sensitive data that may pose risk in context.',
79
+ urgency: 'Review and decide — some may be intentional (test fixtures, docs).',
80
+ },
81
+ low: {
82
+ meaning: 'Informational findings — patterns that could be sensitive in other contexts.',
83
+ urgency: 'Optional review — low likelihood of real exposure.',
84
+ },
85
+ };
86
+ export const MCP_CAPABILITY_EXPLAINERS = {
87
+ 'filesystem-read': 'Can read files from your disk — credentials, configs, source code.',
88
+ 'filesystem-write': 'Can create or modify files on your disk.',
89
+ 'command-execution': 'Can run shell commands as your user — the most dangerous capability.',
90
+ 'network-access': 'Can make HTTP requests to external servers — could exfiltrate data.',
91
+ 'database-access': 'Can connect to databases — could read or modify stored data.',
92
+ 'env-access': 'Can read environment variables — API keys, tokens, passwords.',
93
+ 'file-deletion': 'Can delete files from your disk.',
94
+ };
95
+ /**
96
+ * Compute the focus line for the audit summary — highlights the single most
97
+ * important thing the user should address.
98
+ */
99
+ export function computeFocusLine(tools, exposures) {
100
+ const fullAccessTools = tools.filter(t => t.accessLevel === 'full');
101
+ if (fullAccessTools.length === 0)
102
+ return null;
103
+ let criticalCount = 0;
104
+ let highCount = 0;
105
+ for (const e of exposures) {
106
+ if (e.tool.accessLevel === 'full') {
107
+ criticalCount += e.counts.critical ?? 0;
108
+ highCount += e.counts.high ?? 0;
109
+ }
110
+ }
111
+ const urgentCount = criticalCount + highCount;
112
+ if (urgentCount === 0) {
113
+ return `${fullAccessTools.length} tool${fullAccessTools.length !== 1 ? 's' : ''} with FULL ACCESS — no critical findings exposed.`;
114
+ }
115
+ return `${fullAccessTools.length} tool${fullAccessTools.length !== 1 ? 's' : ''} with FULL ACCESS can reach ${urgentCount} ${criticalCount > 0 ? 'critical' : 'high-priority'} finding${urgentCount !== 1 ? 's' : ''}.`;
116
+ }
117
+ //# sourceMappingURL=educational.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"educational.js","sourceRoot":"","sources":["../../src/tui/educational.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,mBAAmB,GAI3B;IACH,UAAU,EAAE;QACV,IAAI,EAAE,wDAAwD;QAC9D,QAAQ,EAAE,4GAA4G;QACtH,MAAM,EAAE,yFAAyF;KAClG;IACD,WAAW,EAAE;QACX,IAAI,EAAE,kDAAkD;QACxD,QAAQ,EAAE,2GAA2G;QACrH,MAAM,EAAE,+EAA+E;KACxF;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,4DAA4D;QAClE,QAAQ,EAAE,kHAAkH;QAC5H,MAAM,EAAE,wFAAwF;KACjG;IACD,GAAG,EAAE;QACH,IAAI,EAAE,gEAAgE;QACtE,QAAQ,EAAE,2GAA2G;QACrH,MAAM,EAAE,qFAAqF;KAC9F;IACD,SAAS,EAAE;QACT,IAAI,EAAE,oFAAoF;QAC1F,QAAQ,EAAE,kHAAkH;QAC5H,MAAM,EAAE,uEAAuE;KAChF;IACD,gBAAgB,EAAE;QAChB,IAAI,EAAE,oFAAoF;QAC1F,QAAQ,EAAE,kHAAkH;QAC5H,MAAM,EAAE,uEAAuE;KAChF;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,0FAA0F;QAChG,QAAQ,EAAE,8GAA8G;QACxH,MAAM,EAAE,mEAAmE;KAC5E;IACD,MAAM,EAAE;QACN,IAAI,EAAE,iEAAiE;QACvE,QAAQ,EAAE,yGAAyG;QACnH,MAAM,EAAE,2EAA2E;KACpF;IACD,UAAU,EAAE;QACV,IAAI,EAAE,iEAAiE;QACvE,QAAQ,EAAE,0FAA0F;QACpG,MAAM,EAAE,8DAA8D;KACvE;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAKzB;IACH,IAAI,EAAE;QACJ,OAAO,EAAE,8CAA8C;QACvD,MAAM,EAAE,4IAA4I;QACpJ,QAAQ,EAAE,8FAA8F;QACxG,OAAO,EAAE,8GAA8G;KACxH;IACD,SAAS,EAAE;QACT,OAAO,EAAE,mDAAmD;QAC5D,MAAM,EAAE,qGAAqG;QAC7G,QAAQ,EAAE,yEAAyE;QACnF,OAAO,EAAE,mGAAmG;KAC7G;IACD,OAAO,EAAE;QACP,OAAO,EAAE,0DAA0D;QACnE,MAAM,EAAE,4GAA4G;QACpH,QAAQ,EAAE,uEAAuE;QACjF,OAAO,EAAE,2EAA2E;KACrF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAG3B;IACH,QAAQ,EAAE;QACR,OAAO,EAAE,iEAAiE;QAC1E,OAAO,EAAE,mDAAmD;KAC7D;IACD,IAAI,EAAE;QACJ,OAAO,EAAE,kDAAkD;QAC3D,OAAO,EAAE,wDAAwD;KAClE;IACD,MAAM,EAAE;QACN,OAAO,EAAE,2DAA2D;QACpE,OAAO,EAAE,oEAAoE;KAC9E;IACD,GAAG,EAAE;QACH,OAAO,EAAE,8EAA8E;QACvF,OAAO,EAAE,oDAAoD;KAC9D;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAA2B;IAC/D,iBAAiB,EAAE,oEAAoE;IACvF,kBAAkB,EAAE,0CAA0C;IAC9D,mBAAmB,EAAE,sEAAsE;IAC3F,gBAAgB,EAAE,qEAAqE;IACvF,iBAAiB,EAAE,8DAA8D;IACjF,YAAY,EAAE,+DAA+D;IAC7E,eAAe,EAAE,kCAAkC;CACpD,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAmD,EAAE,SAAqF;IACzK,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC;IACpE,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9C,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,KAAK,MAAM,EAAE,CAAC;YAClC,aAAa,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;YACxC,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,aAAa,GAAG,SAAS,CAAC;IAC9C,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,GAAG,eAAe,CAAC,MAAM,QAAQ,eAAe,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,mDAAmD,CAAC;IACrI,CAAC;IAED,OAAO,GAAG,eAAe,CAAC,MAAM,QAAQ,eAAe,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,+BAA+B,WAAW,IAAI,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,WAAW,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;AAC1N,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { AuditResult } from '../../auditor/types.js';
2
+ export type AuditPhase = 'idle' | 'detecting' | 'scanning' | 'mapping' | 'done' | 'error';
3
+ export interface AuditState {
4
+ phase: AuditPhase;
5
+ progress: number;
6
+ currentFile: string;
7
+ result: AuditResult | null;
8
+ error: string | null;
9
+ estimatedRemainingMs: number | null;
10
+ filesScanned: number;
11
+ }
12
+ export declare function useAudit(): {
13
+ startAudit: (mode?: "quick" | "project" | "home") => Promise<void>;
14
+ cancel: () => void;
15
+ reset: () => void;
16
+ phase: AuditPhase;
17
+ progress: number;
18
+ currentFile: string;
19
+ result: AuditResult | null;
20
+ error: string | null;
21
+ estimatedRemainingMs: number | null;
22
+ filesScanned: number;
23
+ };
24
+ //# sourceMappingURL=useAudit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAudit.d.ts","sourceRoot":"","sources":["../../../src/tui/hooks/useAudit.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAG1D,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAE1F,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,YAAY,EAAE,MAAM,CAAC;CACtB;AAiDD,wBAAgB,QAAQ;wBAYsB,OAAO,GAAG,SAAS,GAAG,MAAM;;;WApEjE,UAAU;cACP,MAAM;iBACH,MAAM;YACX,WAAW,GAAG,IAAI;WACnB,MAAM,GAAG,IAAI;0BACE,MAAM,GAAG,IAAI;kBACrB,MAAM;EA2RrB"}