Spaces:
Sleeping
Sleeping
Update src/App.tsx
Browse files- src/App.tsx +29 -20
src/App.tsx
CHANGED
|
@@ -630,7 +630,6 @@ function PayloadsTab() {
|
|
| 630 |
function BuilderTab() {
|
| 631 |
const [prompt, setPrompt] = useState('');
|
| 632 |
const [mode, setMode] = useState<'payload' | 'packets' | 'manual' | 'dragdrop'>('dragdrop');
|
| 633 |
-
const [aiModel, setAiModel] = useState<'2.5' | '3.0'>('2.5');
|
| 634 |
const [loading, setLoading] = useState(false);
|
| 635 |
const [result, setResult] = useState('');
|
| 636 |
const [errorMsg, setErrorMsg] = useState('');
|
|
@@ -687,7 +686,7 @@ function BuilderTab() {
|
|
| 687 |
setErrorMsg('');
|
| 688 |
try {
|
| 689 |
let endpoint = '/api/ai/generate-payload';
|
| 690 |
-
let body: any = { prompt
|
| 691 |
|
| 692 |
if (mode === 'packets') endpoint = '/api/ai/generate-packets';
|
| 693 |
|
|
@@ -712,7 +711,7 @@ function BuilderTab() {
|
|
| 712 |
const res = await fetch('/api/ai/analyze-reports', {
|
| 713 |
method: 'POST',
|
| 714 |
headers: { 'Content-Type': 'application/json' },
|
| 715 |
-
body: JSON.stringify({
|
| 716 |
});
|
| 717 |
const data = await res.json();
|
| 718 |
if (data.error) setErrorMsg(data.error);
|
|
@@ -791,20 +790,6 @@ function BuilderTab() {
|
|
| 791 |
<div className="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
| 792 |
<Card title="AI Input / Configuration" icon={<Cpu size={18} />}>
|
| 793 |
<div className="flex flex-col gap-4">
|
| 794 |
-
<div className="flex bg-black/20 rounded-lg p-1">
|
| 795 |
-
<button
|
| 796 |
-
onClick={() => setAiModel('2.5')}
|
| 797 |
-
className={cn("flex-1 py-1.5 text-sm rounded-md transition-all font-medium", aiModel === '2.5' ? "bg-slate-700 text-white" : "text-slate-400 hover:text-slate-200")}
|
| 798 |
-
>
|
| 799 |
-
Gemini 2.5
|
| 800 |
-
</button>
|
| 801 |
-
<button
|
| 802 |
-
onClick={() => setAiModel('3.0')}
|
| 803 |
-
className={cn("flex-1 py-1.5 text-sm rounded-md transition-all font-medium", aiModel === '3.0' ? "bg-slate-700 text-white" : "text-slate-400 hover:text-slate-200")}
|
| 804 |
-
>
|
| 805 |
-
Gemini 3.0
|
| 806 |
-
</button>
|
| 807 |
-
</div>
|
| 808 |
<div className="flex bg-black/20 rounded-lg p-1 mt-2">
|
| 809 |
<button
|
| 810 |
onClick={() => setMode('payload')}
|
|
@@ -1063,14 +1048,21 @@ function SettingsTab() {
|
|
| 1063 |
const [hfToken, setHfToken] = useState('');
|
| 1064 |
const [ghToken, setGhToken] = useState('');
|
| 1065 |
const [geminiToken, setGeminiToken] = useState('');
|
|
|
|
| 1066 |
const [status, setStatus] = useState('');
|
| 1067 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1068 |
const handleSave = async () => {
|
| 1069 |
try {
|
| 1070 |
const res = await fetch('/api/tokens', {
|
| 1071 |
method: 'POST',
|
| 1072 |
headers: { 'Content-Type': 'application/json' },
|
| 1073 |
-
body: JSON.stringify({ hf_token: hfToken, github_token: ghToken, gemini_token: geminiToken })
|
| 1074 |
});
|
| 1075 |
const data = await res.json();
|
| 1076 |
setStatus(data.message || 'Saved securely to in-memory state.');
|
|
@@ -1092,6 +1084,23 @@ function SettingsTab() {
|
|
| 1092 |
|
| 1093 |
<Card title="API Tokens" icon={<ShieldCheck size={18} />}>
|
| 1094 |
<div className="flex flex-col gap-4">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1095 |
<div>
|
| 1096 |
<label className="block text-sm font-medium text-slate-400 mb-1.5 px-1">Hugging Face Token</label>
|
| 1097 |
<input
|
|
@@ -1187,8 +1196,8 @@ function DeployTab() {
|
|
| 1187 |
onClick={() => setProvider('github')}
|
| 1188 |
className={cn("p-4 rounded-2xl border transition-all text-left", provider === 'github' ? "glass border-indigo-500/50" : "bg-black/20 border-white/5 hover:border-white/10")}
|
| 1189 |
>
|
| 1190 |
-
<h3 className="font-semibold text-white">GitHub
|
| 1191 |
-
<p className="text-xs text-slate-400 mt-1">Deploy
|
| 1192 |
</button>
|
| 1193 |
</div>
|
| 1194 |
|
|
|
|
| 630 |
function BuilderTab() {
|
| 631 |
const [prompt, setPrompt] = useState('');
|
| 632 |
const [mode, setMode] = useState<'payload' | 'packets' | 'manual' | 'dragdrop'>('dragdrop');
|
|
|
|
| 633 |
const [loading, setLoading] = useState(false);
|
| 634 |
const [result, setResult] = useState('');
|
| 635 |
const [errorMsg, setErrorMsg] = useState('');
|
|
|
|
| 686 |
setErrorMsg('');
|
| 687 |
try {
|
| 688 |
let endpoint = '/api/ai/generate-payload';
|
| 689 |
+
let body: any = { prompt };
|
| 690 |
|
| 691 |
if (mode === 'packets') endpoint = '/api/ai/generate-packets';
|
| 692 |
|
|
|
|
| 711 |
const res = await fetch('/api/ai/analyze-reports', {
|
| 712 |
method: 'POST',
|
| 713 |
headers: { 'Content-Type': 'application/json' },
|
| 714 |
+
body: JSON.stringify({})
|
| 715 |
});
|
| 716 |
const data = await res.json();
|
| 717 |
if (data.error) setErrorMsg(data.error);
|
|
|
|
| 790 |
<div className="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
| 791 |
<Card title="AI Input / Configuration" icon={<Cpu size={18} />}>
|
| 792 |
<div className="flex flex-col gap-4">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 793 |
<div className="flex bg-black/20 rounded-lg p-1 mt-2">
|
| 794 |
<button
|
| 795 |
onClick={() => setMode('payload')}
|
|
|
|
| 1048 |
const [hfToken, setHfToken] = useState('');
|
| 1049 |
const [ghToken, setGhToken] = useState('');
|
| 1050 |
const [geminiToken, setGeminiToken] = useState('');
|
| 1051 |
+
const [geminiModel, setGeminiModel] = useState<'2.5' | '3.0'>('2.5');
|
| 1052 |
const [status, setStatus] = useState('');
|
| 1053 |
|
| 1054 |
+
useEffect(() => {
|
| 1055 |
+
fetch('/api/tokens/status').then(res => res.json()).then(data => {
|
| 1056 |
+
if (data.gemini_model) setGeminiModel(data.gemini_model);
|
| 1057 |
+
}).catch(()=>{});
|
| 1058 |
+
}, []);
|
| 1059 |
+
|
| 1060 |
const handleSave = async () => {
|
| 1061 |
try {
|
| 1062 |
const res = await fetch('/api/tokens', {
|
| 1063 |
method: 'POST',
|
| 1064 |
headers: { 'Content-Type': 'application/json' },
|
| 1065 |
+
body: JSON.stringify({ hf_token: hfToken, github_token: ghToken, gemini_token: geminiToken, gemini_model: geminiModel })
|
| 1066 |
});
|
| 1067 |
const data = await res.json();
|
| 1068 |
setStatus(data.message || 'Saved securely to in-memory state.');
|
|
|
|
| 1084 |
|
| 1085 |
<Card title="API Tokens" icon={<ShieldCheck size={18} />}>
|
| 1086 |
<div className="flex flex-col gap-4">
|
| 1087 |
+
<div>
|
| 1088 |
+
<label className="block text-sm font-medium text-slate-400 mb-1.5 px-1">Gemini AI Model Generation Version</label>
|
| 1089 |
+
<div className="flex bg-black/20 border border-white/10 rounded-xl p-1 w-full gap-1">
|
| 1090 |
+
<button
|
| 1091 |
+
onClick={() => setGeminiModel('2.5')}
|
| 1092 |
+
className={cn("flex-1 py-2 text-sm rounded-lg transition-all font-medium", geminiModel === '2.5' ? "bg-indigo-500 text-white shadow-md shadow-indigo-500/20" : "text-slate-400 hover:text-slate-200")}
|
| 1093 |
+
>
|
| 1094 |
+
Gemini 2.5 Pro
|
| 1095 |
+
</button>
|
| 1096 |
+
<button
|
| 1097 |
+
onClick={() => setGeminiModel('3.0')}
|
| 1098 |
+
className={cn("flex-1 py-2 text-sm rounded-lg transition-all font-medium", geminiModel === '3.0' ? "bg-indigo-500 text-white shadow-md shadow-indigo-500/20" : "text-slate-400 hover:text-slate-200")}
|
| 1099 |
+
>
|
| 1100 |
+
Gemini 3.0 Pro
|
| 1101 |
+
</button>
|
| 1102 |
+
</div>
|
| 1103 |
+
</div>
|
| 1104 |
<div>
|
| 1105 |
<label className="block text-sm font-medium text-slate-400 mb-1.5 px-1">Hugging Face Token</label>
|
| 1106 |
<input
|
|
|
|
| 1196 |
onClick={() => setProvider('github')}
|
| 1197 |
className={cn("p-4 rounded-2xl border transition-all text-left", provider === 'github' ? "glass border-indigo-500/50" : "bg-black/20 border-white/5 hover:border-white/10")}
|
| 1198 |
>
|
| 1199 |
+
<h3 className="font-semibold text-white">GitHub Actions</h3>
|
| 1200 |
+
<p className="text-xs text-slate-400 mt-1">Deploy Python background clients to GH Repos.</p>
|
| 1201 |
</button>
|
| 1202 |
</div>
|
| 1203 |
|