// FORGE — main app // Wires the inventory, graph, recipe card, ticker, tooltip, and resolve state. const { useState, useEffect, useMemo, useCallback, useRef } = React; const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "showTicker": true, "showSparks": true, "sound": true, "edgeIntensity": "balanced", "demoMode": false, "preset": "blank" }/*EDITMODE-END*/; function App() { const nodes = window.FORGE_NODES; const edges = window.FORGE_EDGES; const [t, setTweak] = window.useTweaks(TWEAK_DEFAULTS); const [selected, setSelected] = useState([]); const [hover, setHover] = useState(null); // { node, edge, status, reasons, pos } // Recompute resolved status whenever selection changes. const resolved = useMemo(() => window.forgeResolve(selected), [selected]); const recipe = useMemo(() => window.forgeRecipe(selected), [selected]); const toggleSelect = useCallback((canon) => { setSelected(prev => { // Don't allow selecting blocked nodes — give feedback by briefly shaking const r = window.forgeResolve(prev); const cur = r[canon]; if (cur && cur.status === "blocked" && !prev.includes(canon)) { flashBlocked(canon); window.forgeSound && window.forgeSound.sizzle(); return prev; } if (prev.includes(canon)) { window.forgeSound && window.forgeSound.thud(); return prev.filter(x => x !== canon); } window.forgeSound && window.forgeSound.clang(); return [...prev, canon]; }); }, []); const addOnly = useCallback((canon) => { setSelected(prev => { if (prev.includes(canon)) return prev; window.forgeSound && window.forgeSound.chime(); return [...prev, canon]; }); }, []); const removeOnly = useCallback((canon) => { setSelected(prev => { if (!prev.includes(canon)) return prev; window.forgeSound && window.forgeSound.thud(); return prev.filter(x => x !== canon); }); }, []); // ── Hover handlers ────────────────────────────────────────────────────── const onHoverNode = useCallback((node, ev) => { if (!node) { setHover(null); return; } const r = resolved[node.canonical] || { status: "available", reasons: [] }; setHover({ node, status: selected.includes(node.canonical) ? "selected" : r.status, reasons: r.reasons || [], pos: { x: ev?.clientX ?? 100, y: ev?.clientY ?? 100 }, }); }, [resolved, selected]); const onHoverEdge = useCallback((edge, ev) => { if (!edge) { setHover(null); return; } setHover({ edge, pos: { x: ev?.clientX ?? 100, y: ev?.clientY ?? 100 } }); }, []); // Track cursor for tooltip following useEffect(() => { const move = (ev) => { setHover(h => h ? { ...h, pos: { x: ev.clientX, y: ev.clientY } } : h); }; window.addEventListener("mousemove", move); return () => window.removeEventListener("mousemove", move); }, []); // ── Demo path: scripted Muon → QLoRA → bnb_4bit → DLRS ─────────────────── const demoTimer = useRef(null); useEffect(() => { if (!t.demoMode) { if (demoTimer.current) { clearTimeout(demoTimer.current); demoTimer.current = null; } return; } const steps = [ { at: 800, action: () => setSelected(["muon"]) }, { at: 3200, action: () => setSelected(["muon", "qlora"]) }, { at: 5800, action: () => setSelected(["muon", "qlora", "bnb_4bit"]) }, { at: 8400, action: () => setSelected(["muon", "qlora", "bnb_4bit", "lora", "llama3", "dlrs"]) }, { at: 14000, action: () => setSelected([]) }, ]; setSelected([]); let cancelled = false; let i = 0; const tick = () => { if (cancelled || i >= steps.length) return; steps[i].action(); i++; if (i < steps.length) { demoTimer.current = setTimeout(tick, steps[i].at - (steps[i-1]?.at || 0)); } else { // loop demoTimer.current = setTimeout(() => { i = 0; tick(); }, 2000); } }; demoTimer.current = setTimeout(tick, steps[0].at); return () => { cancelled = true; if (demoTimer.current) clearTimeout(demoTimer.current); }; }, [t.demoMode]); // Sync sound mute state with the tweak useEffect(() => { if (window.forgeSound) window.forgeSound.setMuted(!t.sound); }, [t.sound]); // Apply presets from Tweaks useEffect(() => { if (t.preset === "blank") return; const presets = { "qlora-llama": ["qlora", "lora", "bnb_4bit", "llama3", "dlrs"], "muon-collide": ["muon", "adamw_8bit"], "rick-tier1": ["per_layer_lr_rotation", "adamw_8bit"], "vllm-ckpt": ["grad_ckpt", "vllm", "qlora"], "chaos": ["chaos_inject", "jacobian_reg"], }; if (presets[t.preset]) setSelected(presets[t.preset]); // Reset the tweak so user can re-trigger setTimeout(() => setTweak("preset", "blank"), 100); }, [t.preset]); return (