From 29b4c54370d2f690909d2c8df39e94e633b2225d Mon Sep 17 00:00:00 2001 From: Tetardtek Date: Thu, 26 Mar 2026 15:54:49 +0100 Subject: [PATCH] =?UTF-8?q?feat(ags-v3):=20brain=20HUD=20terminal=20?= =?UTF-8?q?=E2=80=94=20kitty=20toggle=20+=20single=20instance=20+=20COSMIC?= =?UTF-8?q?=20window=20rule?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - BrainPower panel: dashboard only (VTE embed pas compatible AGS JSX) - toggle-brain.sh: ouvre/ferme panel AGS + terminal Kitty (single instance via pgrep) - Kitty class brain-hud-terminal pour COSMIC window rule (floating) - app.ts: cleanup focusBrainTerm removed - style.scss: brain-terminal class + brain-commits-list --- ags-v3/style.scss | 7 +++ ags-v3/toggle-brain.sh | 33 +++++++++- ags-v3/widget/panels/BrainPower.tsx | 98 ++++++----------------------- 3 files changed, 57 insertions(+), 81 deletions(-) diff --git a/ags-v3/style.scss b/ags-v3/style.scss index e103ab7..02a4366 100644 --- a/ags-v3/style.scss +++ b/ags-v3/style.scss @@ -124,4 +124,11 @@ window.BrainPower { font-family: "Maple Mono NF", monospace; padding: 4px 0 4px 16px; } + + .brain-terminal { + background: #1a0e27; + border-radius: 0 0 $radius 0; + padding: 4px; + min-height: 400px; + } } diff --git a/ags-v3/toggle-brain.sh b/ags-v3/toggle-brain.sh index 17bcd6e..56e3ff2 100755 --- a/ags-v3/toggle-brain.sh +++ b/ags-v3/toggle-brain.sh @@ -1,3 +1,32 @@ #!/bin/bash -# Toggle Brain Power panel via AGS IPC -ags request "toggle-brain" 2>/dev/null +# Toggle Brain Power — dashboard AGS + terminal Kitty (single instance) +BRAIN_ROOT="${BRAIN_ROOT:-$HOME/Dev/Brain}" +KITTY_CLASS="brain-hud-terminal" + +# Check if brain kitty is already running (by window class) +kitty_pid=$(pgrep -f "class $KITTY_CLASS" | head -1) + +if [ -n "$kitty_pid" ]; then + # Close everything + ags request "toggle-brain" 2>/dev/null + kill "$kitty_pid" 2>/dev/null +else + # Open everything + ags request "toggle-brain" 2>/dev/null + kitty \ + --class "$KITTY_CLASS" \ + --title "🧠 Brain HUD" \ + --override remember_window_size=no \ + --override initial_window_width=60c \ + --override initial_window_height=30c \ + --override background_opacity=0.94 \ + --override background=#1a0e27 \ + --override foreground=#f0eaf8 \ + --override cursor=#ff4da6 \ + --override font_size=13 \ + --override confirm_os_window_close=0 \ + --directory "$BRAIN_ROOT" \ + -e zsh -c "echo '🧠 Brain HUD — navigate mode'; echo ''; exec zsh" \ + & + disown +fi diff --git a/ags-v3/widget/panels/BrainPower.tsx b/ags-v3/widget/panels/BrainPower.tsx index 197db17..f052709 100644 --- a/ags-v3/widget/panels/BrainPower.tsx +++ b/ags-v3/widget/panels/BrainPower.tsx @@ -2,6 +2,7 @@ import app from "ags/gtk3/app" import { Astal, Gtk, Gdk } from "ags/gtk3" import { createPoll } from "ags/time" import { getBrainState } from "../../lib/brain" +import GLib from "gi://GLib" function BrainContent() { const state = createPoll("", 10000, () => JSON.stringify(getBrainState())) @@ -9,109 +10,55 @@ function BrainContent() { const version = state((s: string) => { try { return `kernel v${JSON.parse(s).kernelVersion}` } catch { return "" } }) - const focus = state((s: string) => { try { return JSON.parse(s).focus } catch { return "..." } }) - const session = state((s: string) => { - try { - const sess = JSON.parse(s).session - return sess || "aucune session active" - } catch { return "..." } + try { return JSON.parse(s).session || "aucune session active" } catch { return "..." } }) - const intentionsTitle = state((s: string) => { try { const i = JSON.parse(s).intentions return ` INTENTIONS (${i.active} active${i.active > 1 ? "s" : ""})` } catch { return " INTENTIONS" } }) - const intentionsList = state((s: string) => { try { - const names = JSON.parse(s).intentions.names - return names.map((n: string) => ` • ${n}`).join("\n") || " aucune" + return JSON.parse(s).intentions.names.map((n: string) => ` • ${n}`).join("\n") || " aucune" } catch { return "..." } }) - const todosTitle = state((s: string) => { - try { - const t = JSON.parse(s).todos - return `${t.open} ouverts / ${t.done} faits` - } catch { return "" } + try { const t = JSON.parse(s).todos; return `${t.open} ouverts / ${t.done} faits` } catch { return "" } }) - const todosList = state((s: string) => { try { - const t = JSON.parse(s).todos.top3 - return t.map((item: string) => ` ⬜ ${item}`).join("\n") || " rien" - } catch { return "..." } - }) - - const reposStatus = state((s: string) => { - try { - const repos = JSON.parse(s).repos - return repos.map((r: any) => ` ${r.name.padEnd(14)} ${r.status}`).join("\n") - } catch { return "..." } - }) - - const commitsList = state((s: string) => { - try { - const commits = JSON.parse(s).commits - return commits.map((c: string) => ` ${c}`).join("\n") || " aucun" + return JSON.parse(s).todos.top3.map((item: string) => ` ⬜ ${item}`).join("\n") || " rien" } catch { return "..." } }) return ( - {/* FOCUS */}