feat: Build Manager, Crucible ops deck, branding, and portable Cloudflare tunnel

Add Build Manager with pin-to-dropper, Crucible multi-node terminal with SSH probe/wake, Command Deck chart balance and pretty stats, AetherForge logo and sacred geometry UI, Field Guide refresh, and LAUNCH.bat Cloudflare MSI + token service install flow.
This commit is contained in:
AetherForge
2026-05-30 22:38:48 -07:00
parent e6b8d84edf
commit 9232f4c448
45 changed files with 4222 additions and 406 deletions

View File

@@ -4,6 +4,8 @@ import AmbientBackground from '../Ambient/AmbientBackground';
import SystemStatusBar from '../Visual/SystemStatusBar';
import { useWebSocket } from '../../hooks/useWebSocket';
import MatrixRain from './MatrixRain';
import afLogo from '../../assets/af-logo.png';
import CursorFire from '../Visual/CursorFire';
import './Layout.css';
interface LayoutProps {
@@ -13,7 +15,9 @@ interface LayoutProps {
const NAV = [
{ to: '/dashboard', label: 'Command Deck', icon: 'deck' },
{ to: '/agents', label: 'Fleet Roster', icon: 'fleet' },
{ to: '/crucible', label: 'Crucible', icon: 'crucible' },
{ to: '/forge', label: 'Forge', icon: 'forge' },
{ to: '/builds', label: 'Builds', icon: 'builds' },
{ to: '/guide', label: 'Field Guide', icon: 'guide' },
{ to: '/settings', label: 'Calibrate', icon: 'gear' },
] as const;
@@ -41,6 +45,15 @@ function NavIcon({ type }: { type: string }) {
<path d="M8 16l-2 4 4-2" />
</svg>
);
case 'builds':
return (
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5">
<rect x="3" y="14" width="18" height="5" rx="1" />
<rect x="3" y="8" width="18" height="5" rx="1" />
<rect x="3" y="2" width="18" height="5" rx="1" />
<path d="M7 4.5h10M7 10.5h10M7 16.5h10" strokeOpacity="0.35" />
</svg>
);
case 'guide':
return (
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5">
@@ -49,6 +62,15 @@ function NavIcon({ type }: { type: string }) {
<path d="M8 7h8M8 11h6" />
</svg>
);
case 'crucible':
return (
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5">
<path d="M8 3h8l1 5H7L8 3z" />
<path d="M7 8c0 5 2 8 5 10c3-2 5-5 5-10" />
<path d="M4 21h16" />
<path d="M10 12l1.5 2L14 11" />
</svg>
);
default:
return (
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5">
@@ -118,17 +140,18 @@ export default function Layout({ children }: LayoutProps) {
return (
<div className="layout">
<CursorFire />
<AmbientBackground />
<nav className="sidebar">
<div className="sidebar-header">
<div className="logo">
<div className="logo-emblem">
<span className="logo-gear" />
<span className="logo-core"></span>
<img src={afLogo} alt="AetherForge" className="logo-af-img" />
</div>
<div className="logo-text-block">
<span className="logo-text">AetherForge</span>
<span className="logo-tagline font-tech">LAN MINING COMMAND</span>
<span className="logo-tagline font-tech">COMMAND DECK</span>
</div>
</div>
</div>