World: explosive file sparks + 3 real views (Flat 2D / Live Gource / Brain)
ci / gates (push) Has been cancelled
ci / rust (push) Has been cancelled
ci / sandbox-k8s (push) Has been cancelled
ci / frontend (push) Has been cancelled
ci / e2e (push) Has been cancelled

- Explosive sparks on file/project I/O: /api/world/live tags file-ish tools
  (read/write/drive/vault/obsidian/edit/save) with touch weight 1; the engine
  carries it as a node "burst" and the renderer fires a big fast particle blast.
- The formation tabs are now genuinely different views:
  - Flat — the previous 2D React-Flow forest (WorldFlow), overlaid.
  - Live — the WebGL Gource clone (glow sprites + sparks + trails + beams).
  - Hierarchy — a NEW neural-brain view: agents are neurons in a dormant
    two-hemisphere mesh; active agents fire signal particles along pathway edges
    to their nearest neighbours (chaining), so the brain lights up as agents work.
- Render groups (gource/brain) + 3D particle system so signals travel in depth;
  shared particle update; OrbitControls (rotate + pinch-zoom) across all WebGL views.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
This commit is contained in:
Omar Sobh
2026-06-23 22:49:23 -07:00
co-authored by Claude Opus 4.8
parent da20417fda
commit 3b012b12bf
4 changed files with 234 additions and 37 deletions
+8 -2
View File
@@ -86,10 +86,16 @@ fn normalize_run_event(agent_id: &str, event_type: &str, payload: &Value) -> Vec
let tool = payload.get("tool").and_then(|v| v.as_str()).unwrap_or("tool");
let node_id = format!("tool:{tool}");
let target = payload.get("input").map(summarize_input).unwrap_or_default();
// File/project I/O gets an explosive burst (high touch weight).
let lower = tool.to_lowercase();
let file_op = ["file", "read", "write", "drive", "vault", "obsidian", "edit", "fs", "save"]
.iter()
.any(|k| lower.contains(k));
let weight = if file_op { 1.0 } else { 0.4 };
out.push(("agent.tool.call", json!({ "agentId": agent_id, "tool": tool, "target": target })));
out.push(("node.activity", json!({ "nodeId": node_id, "label": tool, "kind": "service", "heat": 0.9 })));
out.push(("node.activity", json!({ "nodeId": node_id, "label": tool, "kind": "service", "heat": if file_op { 1.0 } else { 0.9 } })));
// the agent converges on the tool it's using (the Gource beam)
out.push(("world.touch", json!({ "agentId": agent_id, "nodeId": node_id, "kind": "service" })));
out.push(("world.touch", json!({ "agentId": agent_id, "nodeId": node_id, "kind": "service", "weight": weight })));
}
"approval_required" => {
let action = payload.get("action_type").and_then(|v| v.as_str()).unwrap_or("action");