"use client"; import { useRef } from "react"; import { TabBar } from "@/components/TabBar"; import type { DemoRepo, InputMode } from "@/lib/types"; const SAMPLE_VULN_CODE = `// SQL injection example const userId = req.query.id; const sql = "SELECT * FROM users WHERE id = " + userId; db.query(sql);`; export function InputPanel({ mode, onModeChange, email, onEmailChange, repoUrl, onRepoUrlChange, alertText, onAlertTextChange, codeText, onCodeTextChange, demoRepos, onSelectDemo, onLoadSample, onScanRepo, onExplain, onAuditCode, onPlanFix, onUploadFile, loading, scanSummary, simulateAttack, onSimulateAttackChange, useDelegation, onUseDelegationChange, onExportBrief, canExport, scanMode, setScanMode, scanEco, setScanEco, scanPkgText, setScanPkgText, ctrImage, setCtrImage, ctrSbom, setCtrSbom, scanLoading, scanResult, scanErr, onPkgScan, onCtrScan, }: { mode: InputMode; onModeChange: (m: InputMode) => void; email: string; onEmailChange: (v: string) => void; repoUrl: string; onRepoUrlChange: (v: string) => void; alertText: string; onAlertTextChange: (v: string) => void; codeText: string; onCodeTextChange: (v: string) => void; demoRepos: DemoRepo[]; onSelectDemo: (repo: DemoRepo) => void; onLoadSample: () => void; onScanRepo: () => void; onExplain: () => void; onAuditCode: () => void; onPlanFix: () => void; onUploadFile: (file: File) => void; loading: boolean; scanSummary?: string; simulateAttack: boolean; onSimulateAttackChange: (v: boolean) => void; useDelegation: boolean; onUseDelegationChange: (v: boolean) => void; onExportBrief: () => void; canExport: boolean; scanMode: "package" | "container"; setScanMode: (v: "package" | "container") => void; scanEco: string; setScanEco: (v: string) => void; scanPkgText: string; setScanPkgText: (v: string) => void; ctrImage: string; setCtrImage: (v: string) => void; ctrSbom: string; setCtrSbom: (v: string) => void; scanLoading: boolean; scanResult: any; scanErr: string; onPkgScan: () => void; onCtrScan: () => void; }) { const fileRef = useRef(null); const severityBadge = (sev: string) => { const s = (sev || "UNKNOWN").toUpperCase(); const base = "inline-flex items-center text-[10px] font-semibold px-2 py-0.5 rounded-md border"; if (s === "CRITICAL") return `${base} bg-red-950/40 border-red-800/50 text-red-200`; if (s === "HIGH") return `${base} bg-amber-950/30 border-amber-800/40 text-amber-200`; if (s === "MEDIUM") return `${base} bg-indigo-950/30 border-indigo-800/40 text-indigo-200`; if (s === "LOW") return `${base} bg-emerald-950/30 border-emerald-800/40 text-emerald-200`; if (s === "NONE") return `${base} bg-slate-900/60 border-slate-700 text-slate-400`; return `${base} bg-slate-900/60 border-slate-700 text-slate-400`; }; const chip = (text: string, cls: string) => ( {text} ); const armStatus = (s: string) => { if (s === "enforced") return { label: "βœ… ENFORCED", cls: "bg-emerald-950/30 border-emerald-800/40 text-emerald-200" }; if (s === "receipt_only") return { label: "πŸ“‹ RECEIPT", cls: "bg-amber-950/30 border-amber-800/40 text-amber-200" }; if (s === "unavailable") return { label: "⚠️ UNAVAILABLE", cls: "bg-amber-950/30 border-amber-800/40 text-amber-200" }; return { label: "Skipped", cls: "bg-slate-900/60 border-slate-700 text-slate-400" }; }; return (

Tied to ArmorIQ sessions and compliance logs

onEmailChange(e.target.value)} placeholder="you@company.com" />
{mode === "github" && ( <> onRepoUrlChange(e.target.value)} placeholder="https://github.com/owner/repo" />

Deep scan: manifests + security workflows + Dependabot + secret-pattern signals.

)} {mode === "code" && ( <>