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.
- package/LICENSE +21 -0
- package/README.md +278 -0
- package/commands/security-scan.md +35 -0
- package/dist/auditor/access-mapper.d.ts +3 -0
- package/dist/auditor/access-mapper.d.ts.map +1 -0
- package/dist/auditor/access-mapper.js +15 -0
- package/dist/auditor/access-mapper.js.map +1 -0
- package/dist/auditor/cli-detector.d.ts +7 -0
- package/dist/auditor/cli-detector.d.ts.map +1 -0
- package/dist/auditor/cli-detector.js +63 -0
- package/dist/auditor/cli-detector.js.map +1 -0
- package/dist/auditor/cross-reference.d.ts +4 -0
- package/dist/auditor/cross-reference.d.ts.map +1 -0
- package/dist/auditor/cross-reference.js +16 -0
- package/dist/auditor/cross-reference.js.map +1 -0
- package/dist/auditor/env-auditor.d.ts +9 -0
- package/dist/auditor/env-auditor.d.ts.map +1 -0
- package/dist/auditor/env-auditor.js +83 -0
- package/dist/auditor/env-auditor.js.map +1 -0
- package/dist/auditor/mcp-analyzer.d.ts +11 -0
- package/dist/auditor/mcp-analyzer.d.ts.map +1 -0
- package/dist/auditor/mcp-analyzer.js +145 -0
- package/dist/auditor/mcp-analyzer.js.map +1 -0
- package/dist/auditor/mcp-detector.d.ts +17 -0
- package/dist/auditor/mcp-detector.d.ts.map +1 -0
- package/dist/auditor/mcp-detector.js +86 -0
- package/dist/auditor/mcp-detector.js.map +1 -0
- package/dist/auditor/remediation.d.ts +26 -0
- package/dist/auditor/remediation.d.ts.map +1 -0
- package/dist/auditor/remediation.js +222 -0
- package/dist/auditor/remediation.js.map +1 -0
- package/dist/auditor/tool-detector.d.ts +15 -0
- package/dist/auditor/tool-detector.d.ts.map +1 -0
- package/dist/auditor/tool-detector.js +241 -0
- package/dist/auditor/tool-detector.js.map +1 -0
- package/dist/auditor/types.d.ts +31 -0
- package/dist/auditor/types.d.ts.map +1 -0
- package/dist/auditor/types.js +2 -0
- package/dist/auditor/types.js.map +1 -0
- package/dist/auditor/vscode-extension-scanner.d.ts +8 -0
- package/dist/auditor/vscode-extension-scanner.d.ts.map +1 -0
- package/dist/auditor/vscode-extension-scanner.js +51 -0
- package/dist/auditor/vscode-extension-scanner.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +159 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/audit.d.ts +8 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +151 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +34 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/remediate-cli.d.ts +3 -0
- package/dist/commands/remediate-cli.d.ts.map +1 -0
- package/dist/commands/remediate-cli.js +96 -0
- package/dist/commands/remediate-cli.js.map +1 -0
- package/dist/commands/scan.d.ts +11 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +138 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/watch.d.ts +6 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +203 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/config.d.ts +19 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +235 -0
- package/dist/config.js.map +1 -0
- package/dist/mcp-server/index.d.ts +3 -0
- package/dist/mcp-server/index.d.ts.map +1 -0
- package/dist/mcp-server/index.js +69 -0
- package/dist/mcp-server/index.js.map +1 -0
- package/dist/mcp-server/schemas.d.ts +13 -0
- package/dist/mcp-server/schemas.d.ts.map +1 -0
- package/dist/mcp-server/schemas.js +13 -0
- package/dist/mcp-server/schemas.js.map +1 -0
- package/dist/mcp-server/tools/audit-status.d.ts +3 -0
- package/dist/mcp-server/tools/audit-status.d.ts.map +1 -0
- package/dist/mcp-server/tools/audit-status.js +46 -0
- package/dist/mcp-server/tools/audit-status.js.map +1 -0
- package/dist/mcp-server/tools/check-command.d.ts +4 -0
- package/dist/mcp-server/tools/check-command.d.ts.map +1 -0
- package/dist/mcp-server/tools/check-command.js +30 -0
- package/dist/mcp-server/tools/check-command.js.map +1 -0
- package/dist/mcp-server/tools/scan-content.d.ts +4 -0
- package/dist/mcp-server/tools/scan-content.d.ts.map +1 -0
- package/dist/mcp-server/tools/scan-content.js +18 -0
- package/dist/mcp-server/tools/scan-content.js.map +1 -0
- package/dist/mcp-server/tools/scan-file.d.ts +4 -0
- package/dist/mcp-server/tools/scan-file.d.ts.map +1 -0
- package/dist/mcp-server/tools/scan-file.js +48 -0
- package/dist/mcp-server/tools/scan-file.js.map +1 -0
- package/dist/mcp-server/types.d.ts +15 -0
- package/dist/mcp-server/types.d.ts.map +1 -0
- package/dist/mcp-server/types.js +2 -0
- package/dist/mcp-server/types.js.map +1 -0
- package/dist/reporter/audit-report.d.ts +4 -0
- package/dist/reporter/audit-report.d.ts.map +1 -0
- package/dist/reporter/audit-report.js +186 -0
- package/dist/reporter/audit-report.js.map +1 -0
- package/dist/reporter/json-report.d.ts +3 -0
- package/dist/reporter/json-report.d.ts.map +1 -0
- package/dist/reporter/json-report.js +4 -0
- package/dist/reporter/json-report.js.map +1 -0
- package/dist/reporter/remediation-text.d.ts +3 -0
- package/dist/reporter/remediation-text.d.ts.map +1 -0
- package/dist/reporter/remediation-text.js +12 -0
- package/dist/reporter/remediation-text.js.map +1 -0
- package/dist/reporter/risk-scorer.d.ts +8 -0
- package/dist/reporter/risk-scorer.d.ts.map +1 -0
- package/dist/reporter/risk-scorer.js +40 -0
- package/dist/reporter/risk-scorer.js.map +1 -0
- package/dist/reporter/sarif-report.d.ts +3 -0
- package/dist/reporter/sarif-report.d.ts.map +1 -0
- package/dist/reporter/sarif-report.js +80 -0
- package/dist/reporter/sarif-report.js.map +1 -0
- package/dist/reporter/shared.d.ts +11 -0
- package/dist/reporter/shared.d.ts.map +1 -0
- package/dist/reporter/shared.js +85 -0
- package/dist/reporter/shared.js.map +1 -0
- package/dist/reporter/summary-generator.d.ts +16 -0
- package/dist/reporter/summary-generator.d.ts.map +1 -0
- package/dist/reporter/summary-generator.js +89 -0
- package/dist/reporter/summary-generator.js.map +1 -0
- package/dist/reporter/terminal-report.d.ts +4 -0
- package/dist/reporter/terminal-report.d.ts.map +1 -0
- package/dist/reporter/terminal-report.js +135 -0
- package/dist/reporter/terminal-report.js.map +1 -0
- package/dist/rules/crypto-rules.d.ts +3 -0
- package/dist/rules/crypto-rules.d.ts.map +1 -0
- package/dist/rules/crypto-rules.js +252 -0
- package/dist/rules/crypto-rules.js.map +1 -0
- package/dist/rules/default-rules.d.ts +9 -0
- package/dist/rules/default-rules.d.ts.map +1 -0
- package/dist/rules/default-rules.js +1319 -0
- package/dist/rules/default-rules.js.map +1 -0
- package/dist/rules/index.d.ts +7 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +7 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/injection-rules.d.ts +8 -0
- package/dist/rules/injection-rules.d.ts.map +1 -0
- package/dist/rules/injection-rules.js +108 -0
- package/dist/rules/injection-rules.js.map +1 -0
- package/dist/rules/types.d.ts +52 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +2 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/scanner/filesystem-scanner.d.ts +26 -0
- package/dist/scanner/filesystem-scanner.d.ts.map +1 -0
- package/dist/scanner/filesystem-scanner.js +369 -0
- package/dist/scanner/filesystem-scanner.js.map +1 -0
- package/dist/scanner/injection-scanner.d.ts +12 -0
- package/dist/scanner/injection-scanner.d.ts.map +1 -0
- package/dist/scanner/injection-scanner.js +136 -0
- package/dist/scanner/injection-scanner.js.map +1 -0
- package/dist/scanner/permission-checker.d.ts +4 -0
- package/dist/scanner/permission-checker.d.ts.map +1 -0
- package/dist/scanner/permission-checker.js +37 -0
- package/dist/scanner/permission-checker.js.map +1 -0
- package/dist/scanner/redact.d.ts +3 -0
- package/dist/scanner/redact.d.ts.map +1 -0
- package/dist/scanner/redact.js +17 -0
- package/dist/scanner/redact.js.map +1 -0
- package/dist/scanner/rule-engine.d.ts +9 -0
- package/dist/scanner/rule-engine.d.ts.map +1 -0
- package/dist/scanner/rule-engine.js +129 -0
- package/dist/scanner/rule-engine.js.map +1 -0
- package/dist/scanner/system-targets.d.ts +17 -0
- package/dist/scanner/system-targets.d.ts.map +1 -0
- package/dist/scanner/system-targets.js +81 -0
- package/dist/scanner/system-targets.js.map +1 -0
- package/dist/tui/App.d.ts +6 -0
- package/dist/tui/App.d.ts.map +1 -0
- package/dist/tui/App.js +224 -0
- package/dist/tui/App.js.map +1 -0
- package/dist/tui/components/BootSequence.d.ts +6 -0
- package/dist/tui/components/BootSequence.d.ts.map +1 -0
- package/dist/tui/components/BootSequence.js +40 -0
- package/dist/tui/components/BootSequence.js.map +1 -0
- package/dist/tui/components/BorderedSection.d.ts +12 -0
- package/dist/tui/components/BorderedSection.d.ts.map +1 -0
- package/dist/tui/components/BorderedSection.js +7 -0
- package/dist/tui/components/BorderedSection.js.map +1 -0
- package/dist/tui/components/ErrorBoundary.d.ts +18 -0
- package/dist/tui/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/tui/components/ErrorBoundary.js +36 -0
- package/dist/tui/components/ErrorBoundary.js.map +1 -0
- package/dist/tui/components/FirstUseHint.d.ts +7 -0
- package/dist/tui/components/FirstUseHint.d.ts.map +1 -0
- package/dist/tui/components/FirstUseHint.js +20 -0
- package/dist/tui/components/FirstUseHint.js.map +1 -0
- package/dist/tui/components/Footer.d.ts +10 -0
- package/dist/tui/components/Footer.d.ts.map +1 -0
- package/dist/tui/components/Footer.js +51 -0
- package/dist/tui/components/Footer.js.map +1 -0
- package/dist/tui/components/MetricCard.d.ts +11 -0
- package/dist/tui/components/MetricCard.d.ts.map +1 -0
- package/dist/tui/components/MetricCard.js +8 -0
- package/dist/tui/components/MetricCard.js.map +1 -0
- package/dist/tui/components/Panel.d.ts +15 -0
- package/dist/tui/components/Panel.d.ts.map +1 -0
- package/dist/tui/components/Panel.js +25 -0
- package/dist/tui/components/Panel.js.map +1 -0
- package/dist/tui/components/RemediationMenu.d.ts +10 -0
- package/dist/tui/components/RemediationMenu.d.ts.map +1 -0
- package/dist/tui/components/RemediationMenu.js +84 -0
- package/dist/tui/components/RemediationMenu.js.map +1 -0
- package/dist/tui/components/RiskGauge.d.ts +7 -0
- package/dist/tui/components/RiskGauge.d.ts.map +1 -0
- package/dist/tui/components/RiskGauge.js +55 -0
- package/dist/tui/components/RiskGauge.js.map +1 -0
- package/dist/tui/components/ScrollableList.d.ts +11 -0
- package/dist/tui/components/ScrollableList.d.ts.map +1 -0
- package/dist/tui/components/ScrollableList.js +14 -0
- package/dist/tui/components/ScrollableList.js.map +1 -0
- package/dist/tui/components/Section.d.ts +9 -0
- package/dist/tui/components/Section.d.ts.map +1 -0
- package/dist/tui/components/Section.js +7 -0
- package/dist/tui/components/Section.js.map +1 -0
- package/dist/tui/components/SectionHeader.d.ts +8 -0
- package/dist/tui/components/SectionHeader.d.ts.map +1 -0
- package/dist/tui/components/SectionHeader.js +15 -0
- package/dist/tui/components/SectionHeader.js.map +1 -0
- package/dist/tui/components/SeverityBadge.d.ts +5 -0
- package/dist/tui/components/SeverityBadge.d.ts.map +1 -0
- package/dist/tui/components/SeverityBadge.js +7 -0
- package/dist/tui/components/SeverityBadge.js.map +1 -0
- package/dist/tui/components/Sidebar.d.ts +2 -0
- package/dist/tui/components/Sidebar.d.ts.map +1 -0
- package/dist/tui/components/Sidebar.js +40 -0
- package/dist/tui/components/Sidebar.js.map +1 -0
- package/dist/tui/components/StatusIndicator.d.ts +8 -0
- package/dist/tui/components/StatusIndicator.d.ts.map +1 -0
- package/dist/tui/components/StatusIndicator.js +15 -0
- package/dist/tui/components/StatusIndicator.js.map +1 -0
- package/dist/tui/components/Table.d.ts +21 -0
- package/dist/tui/components/Table.d.ts.map +1 -0
- package/dist/tui/components/Table.js +38 -0
- package/dist/tui/components/Table.js.map +1 -0
- package/dist/tui/components/Transition.d.ts +8 -0
- package/dist/tui/components/Transition.d.ts.map +1 -0
- package/dist/tui/components/Transition.js +38 -0
- package/dist/tui/components/Transition.js.map +1 -0
- package/dist/tui/components/WelcomeScreen.d.ts +6 -0
- package/dist/tui/components/WelcomeScreen.d.ts.map +1 -0
- package/dist/tui/components/WelcomeScreen.js +14 -0
- package/dist/tui/components/WelcomeScreen.js.map +1 -0
- package/dist/tui/educational.d.ts +32 -0
- package/dist/tui/educational.d.ts.map +1 -0
- package/dist/tui/educational.js +117 -0
- package/dist/tui/educational.js.map +1 -0
- package/dist/tui/hooks/useAudit.d.ts +24 -0
- package/dist/tui/hooks/useAudit.d.ts.map +1 -0
- package/dist/tui/hooks/useAudit.js +263 -0
- package/dist/tui/hooks/useAudit.js.map +1 -0
- package/dist/tui/hooks/useConfig.d.ts +18 -0
- package/dist/tui/hooks/useConfig.d.ts.map +1 -0
- package/dist/tui/hooks/useConfig.js +85 -0
- package/dist/tui/hooks/useConfig.js.map +1 -0
- package/dist/tui/hooks/useHookStatus.d.ts +10 -0
- package/dist/tui/hooks/useHookStatus.d.ts.map +1 -0
- package/dist/tui/hooks/useHookStatus.js +59 -0
- package/dist/tui/hooks/useHookStatus.js.map +1 -0
- package/dist/tui/hooks/useLogs.d.ts +42 -0
- package/dist/tui/hooks/useLogs.d.ts.map +1 -0
- package/dist/tui/hooks/useLogs.js +105 -0
- package/dist/tui/hooks/useLogs.js.map +1 -0
- package/dist/tui/hooks/useScan.d.ts +39 -0
- package/dist/tui/hooks/useScan.d.ts.map +1 -0
- package/dist/tui/hooks/useScan.js +255 -0
- package/dist/tui/hooks/useScan.js.map +1 -0
- package/dist/tui/hooks/useTerminalSize.d.ts +10 -0
- package/dist/tui/hooks/useTerminalSize.d.ts.map +1 -0
- package/dist/tui/hooks/useTerminalSize.js +27 -0
- package/dist/tui/hooks/useTerminalSize.js.map +1 -0
- package/dist/tui/index.d.ts +2 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +8 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/screens/AuditPanel.d.ts +7 -0
- package/dist/tui/screens/AuditPanel.d.ts.map +1 -0
- package/dist/tui/screens/AuditPanel.js +467 -0
- package/dist/tui/screens/AuditPanel.js.map +1 -0
- package/dist/tui/screens/LogsPanel.d.ts +2 -0
- package/dist/tui/screens/LogsPanel.d.ts.map +1 -0
- package/dist/tui/screens/LogsPanel.js +127 -0
- package/dist/tui/screens/LogsPanel.js.map +1 -0
- package/dist/tui/screens/OverviewPanel.d.ts +2 -0
- package/dist/tui/screens/OverviewPanel.d.ts.map +1 -0
- package/dist/tui/screens/OverviewPanel.js +84 -0
- package/dist/tui/screens/OverviewPanel.js.map +1 -0
- package/dist/tui/screens/ScanPanel.d.ts +2 -0
- package/dist/tui/screens/ScanPanel.d.ts.map +1 -0
- package/dist/tui/screens/ScanPanel.js +188 -0
- package/dist/tui/screens/ScanPanel.js.map +1 -0
- package/dist/tui/screens/ScanResultsPanel.d.ts +2 -0
- package/dist/tui/screens/ScanResultsPanel.d.ts.map +1 -0
- package/dist/tui/screens/ScanResultsPanel.js +394 -0
- package/dist/tui/screens/ScanResultsPanel.js.map +1 -0
- package/dist/tui/screens/SettingsPanel.d.ts +2 -0
- package/dist/tui/screens/SettingsPanel.d.ts.map +1 -0
- package/dist/tui/screens/SettingsPanel.js +353 -0
- package/dist/tui/screens/SettingsPanel.js.map +1 -0
- package/dist/tui/state.d.ts +35 -0
- package/dist/tui/state.d.ts.map +1 -0
- package/dist/tui/state.js +13 -0
- package/dist/tui/state.js.map +1 -0
- package/dist/tui/theme.d.ts +58 -0
- package/dist/tui/theme.d.ts.map +1 -0
- package/dist/tui/theme.js +80 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/hooks/audit-logger.sh +74 -0
- package/hooks/detection-lib.sh +301 -0
- package/hooks/git-pre-commit.sh +195 -0
- package/hooks/git-pre-push.sh +125 -0
- package/hooks/git-safety.sh +152 -0
- package/hooks/security-scanner.sh +527 -0
- package/install.sh +543 -0
- package/package.json +67 -0
- package/patterns/credentials.yaml +317 -0
- package/patterns/dangerous-commands.yaml +167 -0
- package/patterns/pii.yaml +95 -0
- package/patterns/prompt-injection.yaml +131 -0
- package/patterns/supply-chain.yaml +119 -0
- package/rules/AGENTS.md +60 -0
- package/rules/SECURITY-RULES.md +177 -0
- package/rules/claude.md +9 -0
- package/rules/clinerules +29 -0
- package/rules/continuerules +29 -0
- package/rules/copilot-instructions.md +9 -0
- package/rules/cursor-security.mdc +14 -0
- package/rules/gemini.md +9 -0
- package/rules/kiro-security.md +29 -0
- package/rules/roocode-security.md +29 -0
- package/rules/trae-security.md +29 -0
- package/rules/windsurfrules +9 -0
- package/skill/llm-antivirus/SKILL.md +73 -0
- package/skill/llm-antivirus/references/threat-patterns.yaml +82 -0
- package/skill/llm-antivirus/scripts/security-audit.sh +244 -0
- package/uninstall.sh +215 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface Props {
|
|
3
|
+
children: React.ReactNode;
|
|
4
|
+
onReset: () => void;
|
|
5
|
+
}
|
|
6
|
+
interface State {
|
|
7
|
+
hasError: boolean;
|
|
8
|
+
error: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class ErrorBoundary extends React.Component<Props, State> {
|
|
11
|
+
constructor(props: Props);
|
|
12
|
+
static getDerivedStateFromError(error: Error): State;
|
|
13
|
+
componentDidCatch(error: Error): void;
|
|
14
|
+
handleReset: () => void;
|
|
15
|
+
render(): string | number | bigint | boolean | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | import("react/jsx-runtime").JSX.Element | null | undefined;
|
|
16
|
+
}
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=ErrorBoundary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../../../src/tui/components/ErrorBoundary.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,UAAU,KAAK;IACb,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,UAAU,KAAK;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAsBD,qBAAa,aAAc,SAAQ,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC;gBAClD,KAAK,EAAE,KAAK;IAKxB,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK;IAIpD,iBAAiB,CAAC,KAAK,EAAE,KAAK;IAK9B,WAAW,aAGT;IAEF,MAAM;CAMP"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { Box, Text, useInput } from 'ink';
|
|
4
|
+
import { THEME } from '../theme.js';
|
|
5
|
+
function ErrorFallback({ error, onReset }) {
|
|
6
|
+
useInput((input, key) => {
|
|
7
|
+
if (key.escape) {
|
|
8
|
+
onReset();
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [_jsx(Text, { color: THEME.critical, bold: true, children: "Something went wrong" }), _jsx(Text, { color: THEME.primaryDim, children: error }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: THEME.brand, children: "Press Esc to return to dashboard" }) })] }));
|
|
12
|
+
}
|
|
13
|
+
export class ErrorBoundary extends React.Component {
|
|
14
|
+
constructor(props) {
|
|
15
|
+
super(props);
|
|
16
|
+
this.state = { hasError: false, error: '' };
|
|
17
|
+
}
|
|
18
|
+
static getDerivedStateFromError(error) {
|
|
19
|
+
return { hasError: true, error: error.message };
|
|
20
|
+
}
|
|
21
|
+
componentDidCatch(error) {
|
|
22
|
+
// Log to stderr — avoid corrupting TUI output
|
|
23
|
+
process.stderr.write(`[chainwall] TUI error: ${error.message}\n`);
|
|
24
|
+
}
|
|
25
|
+
handleReset = () => {
|
|
26
|
+
this.setState({ hasError: false, error: '' });
|
|
27
|
+
this.props.onReset();
|
|
28
|
+
};
|
|
29
|
+
render() {
|
|
30
|
+
if (this.state.hasError) {
|
|
31
|
+
return _jsx(ErrorFallback, { error: this.state.error, onReset: this.handleReset });
|
|
32
|
+
}
|
|
33
|
+
return this.props.children;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=ErrorBoundary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorBoundary.js","sourceRoot":"","sources":["../../../src/tui/components/ErrorBoundary.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAYpC,SAAS,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,EAA0C;IAC/E,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,aAClD,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,2CAE1B,EACP,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,UAAU,YAAG,KAAK,GAAQ,EAC7C,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,iDAAyC,GAC7D,IACF,CACP,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,aAAc,SAAQ,KAAK,CAAC,SAAuB;IAC9D,YAAY,KAAY;QACtB,KAAK,CAAC,KAAK,CAAC,CAAC;QACb,IAAI,CAAC,KAAK,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC9C,CAAC;IAED,MAAM,CAAC,wBAAwB,CAAC,KAAY;QAC1C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;IAClD,CAAC;IAED,iBAAiB,CAAC,KAAY;QAC5B,8CAA8C;QAC9C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;IACpE,CAAC;IAED,WAAW,GAAG,GAAG,EAAE;QACjB,IAAI,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM;QACJ,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACxB,OAAO,KAAC,aAAa,IAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,GAAI,CAAC;QAC/E,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FirstUseHint.d.ts","sourceRoot":"","sources":["../../../src/tui/components/FirstUseHint.tsx"],"names":[],"mappings":"AAMA,UAAU,iBAAiB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,iBAAiB,kDAmB9D"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
import { Box, Text } from 'ink';
|
|
4
|
+
import { THEME } from '../theme.js';
|
|
5
|
+
const shownHints = new Set();
|
|
6
|
+
export function FirstUseHint({ id, message }) {
|
|
7
|
+
const [visible, setVisible] = useState(false);
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
if (shownHints.has(id))
|
|
10
|
+
return;
|
|
11
|
+
shownHints.add(id);
|
|
12
|
+
setVisible(true);
|
|
13
|
+
const timer = setTimeout(() => setVisible(false), 5000);
|
|
14
|
+
return () => clearTimeout(timer);
|
|
15
|
+
}, [id]);
|
|
16
|
+
if (!visible)
|
|
17
|
+
return null;
|
|
18
|
+
return (_jsxs(Box, { paddingX: 1, marginBottom: 1, children: [_jsxs(Text, { color: THEME.brand, children: ['\u25b8', " "] }), _jsx(Text, { color: THEME.primary, children: message })] }));
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=FirstUseHint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FirstUseHint.js","sourceRoot":"","sources":["../../../src/tui/components/FirstUseHint.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;AAOrC,MAAM,UAAU,YAAY,CAAC,EAAE,EAAE,EAAE,OAAO,EAAqB;IAC7D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO;QAC/B,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnB,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QACxD,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAET,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,OAAO,CACL,MAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,aAC/B,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,aAAG,QAAQ,SAAS,EAC5C,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,OAAO,YAAG,OAAO,GAAQ,IACxC,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Panel } from '../state.js';
|
|
2
|
+
import type { FocusArea } from '../state.js';
|
|
3
|
+
interface FooterProps {
|
|
4
|
+
panel: Panel;
|
|
5
|
+
panelState?: string;
|
|
6
|
+
focusArea: FocusArea;
|
|
7
|
+
}
|
|
8
|
+
export declare function Footer({ panel, panelState, focusArea }: FooterProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=Footer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Footer.d.ts","sourceRoot":"","sources":["../../../src/tui/components/Footer.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AA+B7C,UAAU,WAAW;IACnB,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,WAAW,2CAiCnE"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import { THEME, ICONS } from '../theme.js';
|
|
4
|
+
import { useTermSize } from '../App.js';
|
|
5
|
+
const SIDEBAR_HINTS = 'up/down:navigate Enter/->:open 1-5:jump ?:help q:quit';
|
|
6
|
+
const DYNAMIC_HINTS = {
|
|
7
|
+
'overview:idle': '<-:sidebar s:scan a:audit ?:help q:quit',
|
|
8
|
+
'scan:mode-selection': '<-:sidebar j/k:mode Enter:start v:view last',
|
|
9
|
+
'scan:scanning': 'Esc:cancel',
|
|
10
|
+
'scan:cancelled': 'Esc:back',
|
|
11
|
+
'scan:error': 'Esc:back',
|
|
12
|
+
'scan-results:viewing': '<-:sidebar /:search f:sev c:cat t:view a:allow A:rule e:export',
|
|
13
|
+
'scan-results:searching': 'Enter:apply Esc:clear',
|
|
14
|
+
'audit:mode-selection': '<-:sidebar j/k:mode Enter:start',
|
|
15
|
+
'audit:running': 'Esc:cancel',
|
|
16
|
+
'audit:error': 'Esc:back',
|
|
17
|
+
'audit:results': '<-:sidebar j/k:nav Enter:expand r:fix Esc:collapse',
|
|
18
|
+
'settings:idle': '<-:sidebar p:toggle Enter:select Esc:back',
|
|
19
|
+
'logs:activity': '<-:sidebar Tab:switch f:filter j/k:nav r:reload',
|
|
20
|
+
'logs:history': '<-:sidebar Tab:switch j/k:nav r:reload',
|
|
21
|
+
};
|
|
22
|
+
const PANEL_FALLBACKS = {
|
|
23
|
+
overview: '<-:sidebar s:scan a:audit ?:help q:quit',
|
|
24
|
+
scan: '<-:sidebar j/k:mode Enter:start',
|
|
25
|
+
'scan-results': '<-:sidebar /:search f:sev c:cat t:view e:export',
|
|
26
|
+
audit: '<-:sidebar j/k:mode Enter:start',
|
|
27
|
+
settings: '<-:sidebar p:toggle Esc:back',
|
|
28
|
+
logs: '<-:sidebar Tab:switch j/k:nav r:reload',
|
|
29
|
+
};
|
|
30
|
+
export function Footer({ panel, panelState, focusArea }) {
|
|
31
|
+
const termSize = useTermSize();
|
|
32
|
+
let hints;
|
|
33
|
+
if (focusArea === 'sidebar') {
|
|
34
|
+
hints = SIDEBAR_HINTS;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
const key = panelState ? `${panel}:${panelState}` : `${panel}:idle`;
|
|
38
|
+
hints = DYNAMIC_HINTS[key] ?? PANEL_FALLBACKS[panel];
|
|
39
|
+
}
|
|
40
|
+
const separatorWidth = Math.max(termSize.cols, 40);
|
|
41
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: THEME.border, children: ICONS.section.repeat(separatorWidth) }), _jsx(Box, { paddingX: 1, children: _jsx(Text, { children: hints.split(' ').filter(Boolean).map((chunk, i) => {
|
|
42
|
+
const parts = chunk.split(':');
|
|
43
|
+
if (parts.length >= 2) {
|
|
44
|
+
const key = parts[0];
|
|
45
|
+
const desc = parts.slice(1).join(':');
|
|
46
|
+
return _jsxs(Text, { children: [_jsx(Text, { color: THEME.title, children: key }), _jsxs(Text, { color: THEME.primaryDim, children: [":", desc, " "] })] }, i);
|
|
47
|
+
}
|
|
48
|
+
return _jsxs(Text, { color: THEME.primaryDim, children: [chunk, " "] }, i);
|
|
49
|
+
}) }) })] }));
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=Footer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Footer.js","sourceRoot":"","sources":["../../../src/tui/components/Footer.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,aAAa,GAAG,2DAA2D,CAAC;AAElF,MAAM,aAAa,GAA2B;IAC5C,eAAe,EAAW,6CAA6C;IACvE,qBAAqB,EAAK,gDAAgD;IAC1E,eAAe,EAAW,YAAY;IACtC,gBAAgB,EAAU,UAAU;IACpC,YAAY,EAAc,UAAU;IACpC,sBAAsB,EAAI,uEAAuE;IACjG,wBAAwB,EAAE,wBAAwB;IAClD,sBAAsB,EAAI,mCAAmC;IAC7D,eAAe,EAAW,YAAY;IACtC,aAAa,EAAa,UAAU;IACpC,eAAe,EAAW,wDAAwD;IAClF,eAAe,EAAW,8CAA8C;IACxE,eAAe,EAAW,qDAAqD;IAC/E,cAAc,EAAY,2CAA2C;CACtE,CAAC;AAEF,MAAM,eAAe,GAA0B;IAC7C,QAAQ,EAAE,6CAA6C;IACvD,IAAI,EAAE,mCAAmC;IACzC,cAAc,EAAE,sDAAsD;IACtE,KAAK,EAAE,mCAAmC;IAC1C,QAAQ,EAAE,gCAAgC;IAC1C,IAAI,EAAE,2CAA2C;CAClD,CAAC;AAQF,MAAM,UAAU,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAe;IAClE,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAE/B,IAAI,KAAa,CAAC;IAClB,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,KAAK,GAAG,aAAa,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC;QACpE,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEnD,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,YACtB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,GAChC,EACP,KAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,YACd,KAAC,IAAI,cACF,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;wBAClD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;wBAC/B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;4BACtB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;4BACrB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;4BACtC,OAAO,MAAC,IAAI,eAAS,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,YAAG,GAAG,GAAQ,EAAA,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,UAAU,kBAAI,IAAI,UAAU,KAAxF,CAAC,CAA8F,CAAC;wBACpH,CAAC;wBACD,OAAO,MAAC,IAAI,IAAS,KAAK,EAAE,KAAK,CAAC,UAAU,aAAG,KAAK,WAAlC,CAAC,CAA2C,CAAC;oBACjE,CAAC,CAAC,GACG,GACH,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface MetricCardProps {
|
|
2
|
+
title: string;
|
|
3
|
+
value: string | number;
|
|
4
|
+
subtitle?: string;
|
|
5
|
+
barValue?: number;
|
|
6
|
+
barMax?: number;
|
|
7
|
+
color: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function MetricCard({ title, value, subtitle, barValue, barMax, color }: MetricCardProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=MetricCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MetricCard.d.ts","sourceRoot":"","sources":["../../../src/tui/components/MetricCard.tsx"],"names":[],"mappings":"AAIA,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,eAAe,2CA8B9F"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import { THEME, ICONS } from '../theme.js';
|
|
4
|
+
export function MetricCard({ title, value, subtitle, barValue, barMax, color }) {
|
|
5
|
+
const barWidth = 14;
|
|
6
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: THEME.border, paddingX: 1, width: 18, children: [_jsx(Text, { color: THEME.title, children: title }), _jsxs(Text, { color: color, bold: true, children: [' ', value] }), barValue !== undefined && barMax !== undefined && barMax > 0 && (_jsxs(Text, { children: [_jsx(Text, { color: color, children: ICONS.bar.repeat(Math.round((barValue / barMax) * barWidth)) }), _jsx(Text, { color: THEME.muted, children: ICONS.barLight.repeat(Math.max(0, barWidth - Math.round((barValue / barMax) * barWidth))) })] })), subtitle && (_jsx(Text, { color: THEME.value, children: subtitle }))] }));
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=MetricCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MetricCard.js","sourceRoot":"","sources":["../../../src/tui/components/MetricCard.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAW3C,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAmB;IAC7F,MAAM,QAAQ,GAAG,EAAE,CAAC;IAEpB,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,KAAK,CAAC,MAAM,EACzB,QAAQ,EAAE,CAAC,EACX,KAAK,EAAE,EAAE,aAET,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,YAAG,KAAK,GAAQ,EACxC,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,EAAE,IAAI,mBACrB,IAAI,EAAE,KAAK,IACP,EACN,QAAQ,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,GAAG,CAAC,IAAI,CAC/D,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,YACf,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,GACxD,EACP,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,YACrB,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GACrF,IACF,CACR,EACA,QAAQ,IAAI,CACX,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,YAAG,QAAQ,GAAQ,CAC5C,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { type BoxProps } from 'ink';
|
|
3
|
+
interface PanelProps {
|
|
4
|
+
title?: string;
|
|
5
|
+
children: React.ReactNode;
|
|
6
|
+
width?: number;
|
|
7
|
+
borderColor?: string;
|
|
8
|
+
padding?: number;
|
|
9
|
+
flexDirection?: BoxProps['flexDirection'];
|
|
10
|
+
active?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/** Bordered panel — use for dialogs, overlays, and error states only. */
|
|
13
|
+
export declare function Panel({ title, children, width, borderColor, padding, flexDirection, active, }: PanelProps): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=Panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Panel.d.ts","sourceRoot":"","sources":["../../../src/tui/components/Panel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AACnD,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,KAAK,CAAC;AAG/C,UAAU,UAAU;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IAC1C,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,yEAAyE;AACzE,wBAAgB,KAAK,CAAC,EACpB,KAAK,EACL,QAAQ,EACR,KAAK,EACL,WAA0B,EAC1B,OAAW,EACX,aAAwB,EACxB,MAAc,GACf,EAAE,UAAU,2CAwCZ"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
import { Box, Text } from 'ink';
|
|
4
|
+
import { THEME, BOX } from '../theme.js';
|
|
5
|
+
/** Bordered panel — use for dialogs, overlays, and error states only. */
|
|
6
|
+
export function Panel({ title, children, width, borderColor = THEME.border, padding = 1, flexDirection = 'column', active = false, }) {
|
|
7
|
+
const [pulseOn, setPulseOn] = useState(false);
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
if (!active) {
|
|
10
|
+
setPulseOn(false);
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const timer = setInterval(() => {
|
|
14
|
+
setPulseOn((v) => !v);
|
|
15
|
+
}, 800);
|
|
16
|
+
return () => clearInterval(timer);
|
|
17
|
+
}, [active]);
|
|
18
|
+
const currentBorderColor = active
|
|
19
|
+
? pulseOn
|
|
20
|
+
? THEME.borderActive
|
|
21
|
+
: THEME.border
|
|
22
|
+
: borderColor;
|
|
23
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: currentBorderColor, paddingX: padding, width: width, children: [title && (_jsx(Box, { marginBottom: 0, children: _jsxs(Text, { color: THEME.brand, bold: true, children: [BOX.horizontal, " ", title, " ", BOX.horizontal] }) })), _jsx(Box, { flexDirection: flexDirection, children: children })] }));
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=Panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Panel.js","sourceRoot":"","sources":["../../../src/tui/components/Panel.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAiB,MAAM,KAAK,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAYzC,yEAAyE;AACzE,MAAM,UAAU,KAAK,CAAC,EACpB,KAAK,EACL,QAAQ,EACR,KAAK,EACL,WAAW,GAAG,KAAK,CAAC,MAAM,EAC1B,OAAO,GAAG,CAAC,EACX,aAAa,GAAG,QAAQ,EACxB,MAAM,GAAG,KAAK,GACH;IACX,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,UAAU,CAAC,KAAK,CAAC,CAAC;YAClB,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC,EAAE,GAAG,CAAC,CAAC;QAER,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,MAAM,kBAAkB,GAAG,MAAM;QAC/B,CAAC,CAAC,OAAO;YACP,CAAC,CAAC,KAAK,CAAC,YAAY;YACpB,CAAC,CAAC,KAAK,CAAC,MAAM;QAChB,CAAC,CAAC,WAAW,CAAC;IAEhB,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAE,kBAAkB,EAC/B,QAAQ,EAAE,OAAO,EACjB,KAAK,EAAE,KAAK,aAEX,KAAK,IAAI,CACR,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,YAClB,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,mBAC3B,GAAG,CAAC,UAAU,OAAG,KAAK,OAAG,GAAG,CAAC,UAAU,IACnC,GACH,CACP,EACD,KAAC,GAAG,IAAC,aAAa,EAAE,aAAa,YAAG,QAAQ,GAAO,IAC/C,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { RemediationAction, RemediationResult } from '../../auditor/remediation.js';
|
|
2
|
+
interface RemediationMenuProps {
|
|
3
|
+
title: string;
|
|
4
|
+
actions: RemediationAction[];
|
|
5
|
+
onClose: () => void;
|
|
6
|
+
onActionComplete?: (result: RemediationResult) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare function RemediationMenu({ title, actions, onClose, onActionComplete }: RemediationMenuProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=RemediationMenu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RemediationMenu.d.ts","sourceRoot":"","sources":["../../../src/tui/components/RemediationMenu.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEzF,UAAU,oBAAoB;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACxD;AAID,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE,oBAAoB,2CAsKlG"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
import { Box, Text, useInput } from 'ink';
|
|
4
|
+
import { THEME, ICONS } from '../theme.js';
|
|
5
|
+
export function RemediationMenu({ title, actions, onClose, onActionComplete }) {
|
|
6
|
+
const [selectedIndex, setSelectedIndex] = useState(0);
|
|
7
|
+
const [menuState, setMenuState] = useState('selecting');
|
|
8
|
+
const [result, setResult] = useState(null);
|
|
9
|
+
// Auto-close after showing result
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
if (menuState === 'result' && result) {
|
|
12
|
+
const timer = setTimeout(() => {
|
|
13
|
+
onActionComplete?.(result);
|
|
14
|
+
onClose();
|
|
15
|
+
}, 3000);
|
|
16
|
+
return () => clearTimeout(timer);
|
|
17
|
+
}
|
|
18
|
+
}, [menuState, result]);
|
|
19
|
+
useInput((input, key) => {
|
|
20
|
+
if (menuState === 'executing')
|
|
21
|
+
return;
|
|
22
|
+
if (menuState === 'result') {
|
|
23
|
+
// Any key closes
|
|
24
|
+
onActionComplete?.(result);
|
|
25
|
+
onClose();
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (key.escape) {
|
|
29
|
+
if (menuState === 'confirming') {
|
|
30
|
+
setMenuState('selecting');
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
onClose();
|
|
34
|
+
}
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (menuState === 'selecting') {
|
|
38
|
+
if (input === 'j' || key.downArrow) {
|
|
39
|
+
setSelectedIndex(i => Math.min(i + 1, actions.length - 1));
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (input === 'k' || key.upArrow) {
|
|
43
|
+
setSelectedIndex(i => Math.max(i - 1, 0));
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (key.return) {
|
|
47
|
+
const action = actions[selectedIndex];
|
|
48
|
+
if (action.riskLevel === 'caution') {
|
|
49
|
+
setMenuState('confirming');
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
executeAction(action);
|
|
53
|
+
}
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (menuState === 'confirming') {
|
|
58
|
+
if (key.return) {
|
|
59
|
+
executeAction(actions[selectedIndex]);
|
|
60
|
+
}
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
const executeAction = async (action) => {
|
|
65
|
+
setMenuState('executing');
|
|
66
|
+
try {
|
|
67
|
+
const res = await action.execute();
|
|
68
|
+
setResult(res);
|
|
69
|
+
setMenuState('result');
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
setResult({
|
|
73
|
+
success: false,
|
|
74
|
+
message: `Unexpected error: ${err instanceof Error ? err.message : String(err)}`,
|
|
75
|
+
});
|
|
76
|
+
setMenuState('result');
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
if (actions.length === 0) {
|
|
80
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: THEME.border, paddingX: 2, paddingY: 1, children: [_jsxs(Text, { color: THEME.brand, bold: true, children: ["Remediate: ", title] }), _jsx(Text, { color: THEME.primaryDim, children: "No remediation actions available for this item." }), _jsx(Text, { color: THEME.hint, children: "ESC: close" })] }));
|
|
81
|
+
}
|
|
82
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: THEME.brand, paddingX: 2, paddingY: 1, children: [_jsxs(Text, { color: THEME.brand, bold: true, children: [ICONS.section, ICONS.section, " Remediate: ", title, " ", ICONS.section, ICONS.section] }), _jsx(Text, { children: " " }), menuState === 'selecting' && (_jsxs(Box, { flexDirection: "column", children: [actions.map((action, i) => (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { children: [_jsx(Text, { color: i === selectedIndex ? THEME.brand : undefined, children: i === selectedIndex ? '\u25B8 ' : ' ' }), _jsxs(Text, { color: action.riskLevel === 'caution' ? THEME.medium : THEME.success, children: ["[", action.riskLevel === 'caution' ? 'CAUTION' : 'SAFE', "]"] }), _jsx(Text, { children: " " }), _jsx(Text, { color: THEME.value, children: action.label })] }), _jsxs(Box, { marginLeft: 4, children: [_jsx(Text, { color: THEME.label, children: "What this does: " }), _jsx(Text, { color: THEME.primaryDim, children: action.description })] })] }, i))), _jsx(Text, { color: THEME.hint, children: "j/k: select Enter: execute Esc: cancel" })] })), menuState === 'confirming' && (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: THEME.title, bold: true, children: "Confirm action:" }), _jsx(Text, { children: " " }), _jsx(Text, { color: THEME.value, children: actions[selectedIndex].label }), _jsx(Text, { color: THEME.primaryDim, children: actions[selectedIndex].description }), _jsx(Text, { children: " " }), _jsx(Text, { color: THEME.medium, children: "This action modifies files. A backup will be created." }), _jsx(Text, { children: " " }), _jsx(Text, { color: THEME.hint, children: "Enter: proceed Esc: cancel" })] })), menuState === 'executing' && (_jsx(Text, { color: THEME.brand, children: "Executing..." })), menuState === 'result' && result && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: result.success ? THEME.success : THEME.critical, children: [result.success ? '\u2713' : '\u2717', " ", result.message] }), result.backupPath && (_jsxs(Text, { children: [_jsx(Text, { color: THEME.label, children: "Backup: " }), _jsx(Text, { color: THEME.filePath, children: result.backupPath })] })), _jsx(Text, { children: " " }), _jsx(Text, { color: THEME.hint, children: "Auto-closing in 3s... (any key to close)" })] }))] }));
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=RemediationMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RemediationMenu.js","sourceRoot":"","sources":["../../../src/tui/components/RemediationMenu.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RiskGauge.d.ts","sourceRoot":"","sources":["../../../src/tui/components/RiskGauge.tsx"],"names":[],"mappings":"AAKA,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,cAAc,2CAoEzD"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect, useRef } from 'react';
|
|
3
|
+
import { Box, Text } from 'ink';
|
|
4
|
+
import { THEME } from '../theme.js';
|
|
5
|
+
import { useTermSize } from '../App.js';
|
|
6
|
+
export function RiskGauge({ score, label }) {
|
|
7
|
+
const termSize = useTermSize();
|
|
8
|
+
const barWidth = Math.max(10, Math.round(termSize.contentWidth * 0.4));
|
|
9
|
+
const [displayedScore, setDisplayedScore] = useState(0);
|
|
10
|
+
const [pulseOn, setPulseOn] = useState(false);
|
|
11
|
+
const pulseCount = useRef(0);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
if (score === 0) {
|
|
14
|
+
setDisplayedScore(0);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
setDisplayedScore(0);
|
|
18
|
+
pulseCount.current = 0;
|
|
19
|
+
const step = score / 15;
|
|
20
|
+
let current = 0;
|
|
21
|
+
const timer = setInterval(() => {
|
|
22
|
+
current += step;
|
|
23
|
+
if (current >= score) {
|
|
24
|
+
current = score;
|
|
25
|
+
clearInterval(timer);
|
|
26
|
+
startPulse();
|
|
27
|
+
}
|
|
28
|
+
setDisplayedScore(Math.min(current, score));
|
|
29
|
+
}, 33);
|
|
30
|
+
return () => clearInterval(timer);
|
|
31
|
+
}, [score]);
|
|
32
|
+
const startPulse = () => {
|
|
33
|
+
pulseCount.current = 0;
|
|
34
|
+
const pulseTimer = setInterval(() => {
|
|
35
|
+
setPulseOn((v) => !v);
|
|
36
|
+
pulseCount.current++;
|
|
37
|
+
if (pulseCount.current >= 6) {
|
|
38
|
+
clearInterval(pulseTimer);
|
|
39
|
+
setPulseOn(false);
|
|
40
|
+
}
|
|
41
|
+
}, 200);
|
|
42
|
+
};
|
|
43
|
+
const filled = Math.round((displayedScore / 10) * barWidth);
|
|
44
|
+
const empty = barWidth - filled;
|
|
45
|
+
const getColor = (val) => {
|
|
46
|
+
if (val <= 2)
|
|
47
|
+
return THEME.success;
|
|
48
|
+
if (val <= 5)
|
|
49
|
+
return THEME.warning;
|
|
50
|
+
return THEME.critical;
|
|
51
|
+
};
|
|
52
|
+
const color = getColor(displayedScore);
|
|
53
|
+
return (_jsxs(Box, { children: [_jsxs(Text, { color: color, bold: !pulseOn, children: [displayedScore.toFixed(1), "/10"] }), _jsx(Text, { children: " " }), _jsx(Text, { color: color, children: '\u2588'.repeat(filled) }), _jsx(Text, { color: THEME.muted, children: '\u2591'.repeat(empty) }), _jsx(Text, { children: " " }), _jsx(Text, { color: color, bold: !pulseOn, children: label })] }));
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=RiskGauge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RiskGauge.js","sourceRoot":"","sources":["../../../src/tui/components/RiskGauge.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAOxC,MAAM,UAAU,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAkB;IACxD,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC,CAAC;IACvE,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAE7B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,iBAAiB,CAAC,CAAC,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,iBAAiB,CAAC,CAAC,CAAC,CAAC;QACrB,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC;QACvB,MAAM,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;QACxB,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,OAAO,IAAI,IAAI,CAAC;YAChB,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;gBACrB,OAAO,GAAG,KAAK,CAAC;gBAChB,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrB,UAAU,EAAE,CAAC;YACf,CAAC;YACD,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QAC9C,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC;QACvB,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;YAClC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACtB,UAAU,CAAC,OAAO,EAAE,CAAC;YACrB,IAAI,UAAU,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC;gBAC5B,aAAa,CAAC,UAAU,CAAC,CAAC;gBAC1B,UAAU,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;QACH,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAEhC,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE;QAC/B,IAAI,GAAG,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC,OAAO,CAAC;QACnC,IAAI,GAAG,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC,OAAO,CAAC;QACnC,OAAO,KAAK,CAAC,QAAQ,CAAC;IACxB,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;IAEvC,OAAO,CACL,MAAC,GAAG,eACF,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,OAAO,aAC/B,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,WACrB,EACP,KAAC,IAAI,oBAAS,EACd,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,GAAQ,EACpD,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,YAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAQ,EACzD,KAAC,IAAI,oBAAS,EACd,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,OAAO,YAC/B,KAAK,GACD,IACH,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface ScrollableListProps<T> {
|
|
3
|
+
items: T[];
|
|
4
|
+
selectedIndex: number;
|
|
5
|
+
height: number;
|
|
6
|
+
renderItem: (item: T, index: number, selected: boolean) => React.ReactNode;
|
|
7
|
+
keyExtractor?: (item: T, index: number) => string;
|
|
8
|
+
}
|
|
9
|
+
export declare function ScrollableList<T>({ items, selectedIndex, height, renderItem, keyExtractor, }: ScrollableListProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=ScrollableList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScrollableList.d.ts","sourceRoot":"","sources":["../../../src/tui/components/ScrollableList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,UAAU,mBAAmB,CAAC,CAAC;IAC7B,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,KAAK,CAAC,SAAS,CAAC;IAC3E,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACnD;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,EAChC,KAAK,EACL,aAAa,EACb,MAAM,EACN,UAAU,EACV,YAAY,GACb,EAAE,mBAAmB,CAAC,CAAC,CAAC,2CA6BxB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import { THEME } from '../theme.js';
|
|
4
|
+
export function ScrollableList({ items, selectedIndex, height, renderItem, keyExtractor, }) {
|
|
5
|
+
const visibleStart = Math.max(0, Math.min(selectedIndex - Math.floor(height / 2), items.length - height));
|
|
6
|
+
const visibleEnd = Math.min(items.length, visibleStart + height);
|
|
7
|
+
const visible = items.slice(visibleStart, visibleEnd);
|
|
8
|
+
return (_jsxs(Box, { flexDirection: "column", children: [visibleStart > 0 && (_jsxs(Text, { color: THEME.muted, children: [" ", '\u25b4', " ", visibleStart, " more above"] })), visible.map((item, i) => {
|
|
9
|
+
const realIndex = visibleStart + i;
|
|
10
|
+
const key = keyExtractor ? keyExtractor(item, realIndex) : String(realIndex);
|
|
11
|
+
return (_jsx(Box, { children: renderItem(item, realIndex, realIndex === selectedIndex) }, key));
|
|
12
|
+
}), visibleEnd < items.length && (_jsxs(Text, { color: THEME.muted, children: [' ', '\u25be', " ", items.length - visibleEnd, " more below"] }))] }));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=ScrollableList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScrollableList.js","sourceRoot":"","sources":["../../../src/tui/components/ScrollableList.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAUpC,MAAM,UAAU,cAAc,CAAI,EAChC,KAAK,EACL,aAAa,EACb,MAAM,EACN,UAAU,EACV,YAAY,GACW;IACvB,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAC3B,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CACxE,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IAEtD,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACxB,YAAY,GAAG,CAAC,IAAI,CACnB,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,mBAAK,QAAQ,OAAG,YAAY,mBAAmB,CACxE,EACA,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;gBACvB,MAAM,SAAS,GAAG,YAAY,GAAG,CAAC,CAAC;gBACnC,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC7E,OAAO,CACL,KAAC,GAAG,cACD,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,KAAK,aAAa,CAAC,IADjD,GAAG,CAEP,CACP,CAAC;YACJ,CAAC,CAAC,EACD,UAAU,GAAG,KAAK,CAAC,MAAM,IAAI,CAC5B,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,aACrB,IAAI,EAAE,QAAQ,OAAG,KAAK,CAAC,MAAM,GAAG,UAAU,mBACtC,CACR,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface SectionProps {
|
|
3
|
+
title: string;
|
|
4
|
+
children: React.ReactNode;
|
|
5
|
+
titleColor?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function Section({ title, children, titleColor }: SectionProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=Section.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Section.d.ts","sourceRoot":"","sources":["../../../src/tui/components/Section.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAwB,EAAE,EAAE,YAAY,2CAOlF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import { THEME } from '../theme.js';
|
|
4
|
+
export function Section({ title, children, titleColor = THEME.brand }) {
|
|
5
|
+
return (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: titleColor, bold: true, children: title }), children] }));
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=Section.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Section.js","sourceRoot":"","sources":["../../../src/tui/components/Section.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAQpC,MAAM,UAAU,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,GAAG,KAAK,CAAC,KAAK,EAAgB;IACjF,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,aACtC,KAAC,IAAI,IAAC,KAAK,EAAE,UAAU,EAAE,IAAI,kBAAE,KAAK,GAAQ,EAC3C,QAAQ,IACL,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface SectionHeaderProps {
|
|
2
|
+
title: string;
|
|
3
|
+
color?: string;
|
|
4
|
+
rightLabel?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function SectionHeader({ title, color, rightLabel }: SectionHeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=SectionHeader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SectionHeader.d.ts","sourceRoot":"","sources":["../../../src/tui/components/SectionHeader.tsx"],"names":[],"mappings":"AAKA,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,KAAmB,EAAE,UAAU,EAAE,EAAE,kBAAkB,2CAuB3F"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import { THEME, ICONS } from '../theme.js';
|
|
4
|
+
import { useTermSize } from '../App.js';
|
|
5
|
+
export function SectionHeader({ title, color = THEME.brand, rightLabel }) {
|
|
6
|
+
const termSize = useTermSize();
|
|
7
|
+
const availableWidth = termSize.contentWidth;
|
|
8
|
+
const prefix = `${ICONS.section}${ICONS.section} `;
|
|
9
|
+
const titlePart = `${title} `;
|
|
10
|
+
const rightPart = rightLabel ? ` ${rightLabel} ` : '';
|
|
11
|
+
const usedChars = prefix.length + titlePart.length + rightPart.length;
|
|
12
|
+
const fillCount = Math.max(3, availableWidth - usedChars);
|
|
13
|
+
return (_jsxs(Box, { marginTop: 1, children: [_jsxs(Text, { color: color, bold: true, children: [prefix, titlePart] }), _jsx(Text, { color: THEME.border, children: ICONS.section.repeat(fillCount) }), rightLabel && (_jsxs(Text, { color: THEME.primaryDim, children: [" ", rightLabel] }))] }));
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=SectionHeader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SectionHeader.js","sourceRoot":"","sources":["../../../src/tui/components/SectionHeader.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAQxC,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,UAAU,EAAsB;IAC1F,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,cAAc,GAAG,QAAQ,CAAC,YAAY,CAAC;IAE7C,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,GAAG,CAAC;IACnD,MAAM,SAAS,GAAG,GAAG,KAAK,GAAG,CAAC;IAC9B,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;IACtE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC;IAE1D,OAAO,CACL,MAAC,GAAG,IAAC,SAAS,EAAE,CAAC,aACf,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,EAAE,IAAI,mBACrB,MAAM,EAAE,SAAS,IACb,EACP,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,YACtB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,GAC3B,EACN,UAAU,IAAI,CACb,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,UAAU,kBAAI,UAAU,IAAQ,CACpD,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SeverityBadge.d.ts","sourceRoot":"","sources":["../../../src/tui/components/SeverityBadge.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,2CAMjE"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Text } from 'ink';
|
|
3
|
+
import { SEVERITY_COLORS, SEVERITY_LABELS, ICONS } from '../theme.js';
|
|
4
|
+
export function SeverityBadge({ severity }) {
|
|
5
|
+
return (_jsxs(Text, { color: SEVERITY_COLORS[severity], bold: true, children: [ICONS.bar, " ", SEVERITY_LABELS[severity]] }));
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=SeverityBadge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SeverityBadge.js","sourceRoot":"","sources":["../../../src/tui/components/SeverityBadge.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAE3B,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEtE,MAAM,UAAU,aAAa,CAAC,EAAE,QAAQ,EAA0B;IAChE,OAAO,CACL,MAAC,IAAI,IAAC,KAAK,EAAE,eAAe,CAAC,QAAQ,CAAC,EAAE,IAAI,mBACzC,KAAK,CAAC,GAAG,OAAG,eAAe,CAAC,QAAQ,CAAC,IACjC,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Sidebar.d.ts","sourceRoot":"","sources":["../../../src/tui/components/Sidebar.tsx"],"names":[],"mappings":"AAaA,wBAAgB,OAAO,4CAwEtB"}
|