From edc13e2d27028186dadbcb249cf08f5950bbc129 Mon Sep 17 00:00:00 2001 From: DexterFromLab Date: Wed, 4 Mar 2026 18:34:36 +0100 Subject: [PATCH 001/355] =?UTF-8?q?Initial=20commit:=20BTerminal=20?= =?UTF-8?q?=E2=80=94=20GTK3=20terminal=20with=20SSH=20&=20Claude=20Code=20?= =?UTF-8?q?session=20management?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 --- .gitignore | 3 + README.md | 59 ++ bterminal.py | 1734 ++++++++++++++++++++++++++++++++++++++++++++++++ screenshot.png | Bin 0 -> 26508 bytes 4 files changed, 1796 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100755 bterminal.py create mode 100644 screenshot.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3bbe7b6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +__pycache__/ +*.pyc +*.pyo diff --git a/README.md b/README.md new file mode 100644 index 0000000..d543aea --- /dev/null +++ b/README.md @@ -0,0 +1,59 @@ +# BTerminal + +Terminal z panelem sesji w stylu MobaXterm, zbudowany w GTK 3 + VTE. Catppuccin Mocha theme. + +![BTerminal](screenshot.png) + +## Funkcje + +- **Sesje SSH** — zapisywane konfiguracje (host, port, user, klucz, folder, kolor), CRUD z panelem bocznym +- **Claude Code** — zapisywane konfiguracje Claude Code z opcjami sudo, resume, skip-permissions i initial prompt +- **Makra SSH** — wielokrokowe makra (text, key, delay) przypisane do sesji, uruchamiane z sidebara +- **Zakładki** — wiele terminali w tabach, Ctrl+T nowy, Ctrl+Shift+W zamknij, Ctrl+PageUp/Down przełączaj +- **Sudo askpass** — Claude Code z sudo: hasło podawane raz, tymczasowy askpass helper, automatyczne czyszczenie +- **Grupowanie folderami** — sesje SSH i Claude Code mogą być grupowane w foldery na sidebarze +- **Catppuccin Mocha** — pełny theme: terminal, sidebar, taby, kolory sesji + +## Wymagania + +``` +python3 >= 3.8 +python3-gi +gir1.2-gtk-3.0 +gir1.2-vte-2.91 +``` + +### Instalacja zależności (Debian/Ubuntu/Pop!_OS) + +```bash +sudo apt install python3-gi gir1.2-gtk-3.0 gir1.2-vte-2.91 +``` + +## Uruchomienie + +```bash +python3 bterminal.py +``` + +## Konfiguracja + +Pliki konfiguracyjne w `~/.config/bterminal/`: + +| Plik | Opis | +|------|------| +| `sessions.json` | Zapisane sesje SSH + makra | +| `claude_sessions.json` | Zapisane konfiguracje Claude Code | + +## Skróty klawiszowe + +| Skrót | Akcja | +|-------|-------| +| `Ctrl+T` | Nowa zakładka (local shell) | +| `Ctrl+Shift+W` | Zamknij zakładkę | +| `Ctrl+Shift+C` | Kopiuj | +| `Ctrl+Shift+V` | Wklej | +| `Ctrl+PageUp/Down` | Poprzednia/następna zakładka | + +## Licencja + +MIT diff --git a/bterminal.py b/bterminal.py new file mode 100755 index 0000000..b844288 --- /dev/null +++ b/bterminal.py @@ -0,0 +1,1734 @@ +#!/usr/bin/env python3 +"""BTerminal — Terminal SSH z panelem sesji, w stylu MobaXterm.""" + +import gi +gi.require_version("Gtk", "3.0") +gi.require_version("Vte", "2.91") +gi.require_version("Gdk", "3.0") + +import json +import os +import tempfile +import uuid + +from gi.repository import Gdk, Gio, GLib, Gtk, Pango, Vte + +# ─── Stałe i konfiguracja ──────────────────────────────────────────────────── + +APP_NAME = "BTerminal" +CONFIG_DIR = os.path.expanduser("~/.config/bterminal") +SESSIONS_FILE = os.path.join(CONFIG_DIR, "sessions.json") +CLAUDE_SESSIONS_FILE = os.path.join(CONFIG_DIR, "claude_sessions.json") +SSH_PATH = "/usr/bin/ssh" +CLAUDE_PATH = "/home/bartek/.local/bin/claude" + +FONT = "Monospace 11" +SCROLLBACK_LINES = 10000 + +# Catppuccin Mocha +CATPPUCCIN = { + "rosewater": "#f5e0dc", + "flamingo": "#f2cdcd", + "pink": "#f5c2e7", + "mauve": "#cba6f7", + "red": "#f38ba8", + "maroon": "#eba0ac", + "peach": "#fab387", + "yellow": "#f9e2af", + "green": "#a6e3a1", + "teal": "#94e2d5", + "sky": "#89dceb", + "sapphire": "#74c7ec", + "blue": "#89b4fa", + "lavender": "#b4befe", + "text": "#cdd6f4", + "subtext1": "#bac2de", + "subtext0": "#a6adc8", + "overlay2": "#9399b2", + "overlay1": "#7f849c", + "overlay0": "#6c7086", + "surface2": "#585b70", + "surface1": "#45475a", + "surface0": "#313244", + "base": "#1e1e2e", + "mantle": "#181825", + "crust": "#11111b", +} + +TERMINAL_PALETTE = [ + "#45475a", "#f38ba8", "#a6e3a1", "#f9e2af", + "#89b4fa", "#f5c2e7", "#94e2d5", "#bac2de", + "#585b70", "#f38ba8", "#a6e3a1", "#f9e2af", + "#89b4fa", "#f5c2e7", "#94e2d5", "#a6adc8", +] + +SESSION_COLORS = [ + "#89b4fa", "#a6e3a1", "#f9e2af", "#f38ba8", + "#f5c2e7", "#94e2d5", "#fab387", "#b4befe", + "#74c7ec", "#cba6f7", +] + +KEY_MAP = { + "Enter": "\n", + "Tab": "\t", + "Escape": "\x1b", + "Ctrl+C": "\x03", + "Ctrl+D": "\x04", +} + +CSS = f""" +window {{ + background-color: {CATPPUCCIN['base']}; +}} +.sidebar {{ + background-color: {CATPPUCCIN['mantle']}; + border-right: 1px solid {CATPPUCCIN['surface0']}; +}} +.sidebar-header {{ + background-color: {CATPPUCCIN['crust']}; + padding: 8px 12px; + font-weight: bold; + font-size: 13px; + color: {CATPPUCCIN['blue']}; + border-bottom: 1px solid {CATPPUCCIN['surface0']}; +}} +.sidebar-btn {{ + background: {CATPPUCCIN['surface0']}; + border: none; + border-radius: 4px; + color: {CATPPUCCIN['text']}; + padding: 4px 10px; + min-height: 28px; +}} +.sidebar-btn:hover {{ + background: {CATPPUCCIN['surface1']}; +}} +.sidebar-btn:active {{ + background: {CATPPUCCIN['surface2']}; +}} +notebook header tab {{ + background: {CATPPUCCIN['mantle']}; + color: {CATPPUCCIN['subtext0']}; + border: none; + padding: 4px 12px; + border-radius: 6px 6px 0 0; + margin: 0 1px; +}} +notebook header tab:checked {{ + background: {CATPPUCCIN['surface0']}; + color: {CATPPUCCIN['text']}; +}} +notebook header {{ + background: {CATPPUCCIN['crust']}; +}} +notebook {{ + background: {CATPPUCCIN['base']}; +}} +treeview {{ + background-color: {CATPPUCCIN['mantle']}; + color: {CATPPUCCIN['text']}; +}} +treeview:selected {{ + background-color: {CATPPUCCIN['surface1']}; + color: {CATPPUCCIN['text']}; +}} +treeview:hover {{ + background-color: {CATPPUCCIN['surface0']}; +}} +.tab-close-btn {{ + background: transparent; + border: none; + border-radius: 4px; + padding: 0; + min-width: 20px; + min-height: 20px; + color: {CATPPUCCIN['overlay1']}; +}} +.tab-close-btn:hover {{ + background: {CATPPUCCIN['surface2']}; + color: {CATPPUCCIN['red']}; +}} +""" + + +def _parse_color(hex_str): + """Parse hex color string to Gdk.RGBA.""" + c = Gdk.RGBA() + c.parse(hex_str) + return c + + +# ─── SessionManager ────────────────────────────────────────────────────────── + + +class SessionManager: + """Zarządzanie zapisanymi sesjami SSH (CRUD + plik JSON).""" + + def __init__(self): + os.makedirs(CONFIG_DIR, exist_ok=True) + self.sessions = [] + self.load() + + def load(self): + if os.path.exists(SESSIONS_FILE): + try: + with open(SESSIONS_FILE, "r") as f: + self.sessions = json.load(f) + except (json.JSONDecodeError, IOError): + self.sessions = [] + else: + self.sessions = [] + + def save(self): + os.makedirs(CONFIG_DIR, exist_ok=True) + fd, tmp = tempfile.mkstemp(dir=CONFIG_DIR, suffix=".tmp") + try: + with os.fdopen(fd, "w") as f: + json.dump(self.sessions, f, indent=2) + os.replace(tmp, SESSIONS_FILE) + except Exception: + if os.path.exists(tmp): + os.unlink(tmp) + raise + + def add(self, session): + session["id"] = str(uuid.uuid4()) + self.sessions.append(session) + self.save() + return session + + def update(self, session_id, data): + for i, s in enumerate(self.sessions): + if s["id"] == session_id: + self.sessions[i].update(data) + self.save() + return self.sessions[i] + return None + + def delete(self, session_id): + self.sessions = [s for s in self.sessions if s["id"] != session_id] + self.save() + + def get(self, session_id): + for s in self.sessions: + if s["id"] == session_id: + return s + return None + + def all(self): + return list(self.sessions) + + +# ─── ClaudeSessionManager ──────────────────────────────────────────────────── + + +class ClaudeSessionManager: + """Zarządzanie zapisanymi konfiguracjami Claude Code (CRUD + plik JSON).""" + + def __init__(self): + os.makedirs(CONFIG_DIR, exist_ok=True) + self.sessions = [] + self.load() + + def load(self): + if os.path.exists(CLAUDE_SESSIONS_FILE): + try: + with open(CLAUDE_SESSIONS_FILE, "r") as f: + self.sessions = json.load(f) + except (json.JSONDecodeError, IOError): + self.sessions = [] + else: + self.sessions = [] + + def save(self): + os.makedirs(CONFIG_DIR, exist_ok=True) + fd, tmp = tempfile.mkstemp(dir=CONFIG_DIR, suffix=".tmp") + try: + with os.fdopen(fd, "w") as f: + json.dump(self.sessions, f, indent=2) + os.replace(tmp, CLAUDE_SESSIONS_FILE) + except Exception: + if os.path.exists(tmp): + os.unlink(tmp) + raise + + def add(self, session): + session["id"] = str(uuid.uuid4()) + self.sessions.append(session) + self.save() + return session + + def update(self, session_id, data): + for i, s in enumerate(self.sessions): + if s["id"] == session_id: + self.sessions[i].update(data) + self.save() + return self.sessions[i] + return None + + def delete(self, session_id): + self.sessions = [s for s in self.sessions if s["id"] != session_id] + self.save() + + def get(self, session_id): + for s in self.sessions: + if s["id"] == session_id: + return s + return None + + def all(self): + return list(self.sessions) + + +# ─── SessionDialog ──────────────────────────────────────────────────────────── + + +class SessionDialog(Gtk.Dialog): + """Dialog dodawania/edycji sesji SSH.""" + + def __init__(self, parent, session=None): + title = "Edit Session" if session else "Add Session" + super().__init__( + title=title, + transient_for=parent, + modal=True, + destroy_with_parent=True, + ) + self.add_buttons( + Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, + Gtk.STOCK_OK, Gtk.ResponseType.OK, + ) + self.set_default_size(420, -1) + self.set_default_response(Gtk.ResponseType.OK) + + box = self.get_content_area() + box.set_border_width(12) + box.set_spacing(8) + + grid = Gtk.Grid(column_spacing=12, row_spacing=8) + box.pack_start(grid, True, True, 0) + + labels = ["Name:", "Host:", "Port:", "Username:", "SSH Key:", "Folder:", "Color:"] + for i, text in enumerate(labels): + lbl = Gtk.Label(label=text, halign=Gtk.Align.END) + grid.attach(lbl, 0, i, 1, 1) + + self.entry_name = Gtk.Entry(hexpand=True) + self.entry_host = Gtk.Entry(hexpand=True) + self.entry_port = Gtk.SpinButton.new_with_range(1, 65535, 1) + self.entry_port.set_value(22) + self.entry_username = Gtk.Entry(hexpand=True) + self.entry_key = Gtk.Entry(hexpand=True) + self.entry_key.set_placeholder_text("(optional) path to private key") + self.entry_folder = Gtk.Entry(hexpand=True) + self.entry_folder.set_placeholder_text("(optional) folder for grouping") + + self.color_combo = Gtk.ComboBoxText() + for c in SESSION_COLORS: + self.color_combo.append(c, c) + self.color_combo.set_active(0) + + grid.attach(self.entry_name, 1, 0, 1, 1) + grid.attach(self.entry_host, 1, 1, 1, 1) + grid.attach(self.entry_port, 1, 2, 1, 1) + grid.attach(self.entry_username, 1, 3, 1, 1) + grid.attach(self.entry_key, 1, 4, 1, 1) + grid.attach(self.entry_folder, 1, 5, 1, 1) + grid.attach(self.color_combo, 1, 6, 1, 1) + + # Edit mode: fill fields + if session: + self.entry_name.set_text(session.get("name", "")) + self.entry_host.set_text(session.get("host", "")) + self.entry_port.set_value(int(session.get("port", 22))) + self.entry_username.set_text(session.get("username", "")) + self.entry_key.set_text(session.get("key_file", "")) + self.entry_folder.set_text(session.get("folder", "")) + color = session.get("color", SESSION_COLORS[0]) + self.color_combo.set_active_id(color) + + self.show_all() + + def get_data(self): + return { + "name": self.entry_name.get_text().strip(), + "host": self.entry_host.get_text().strip(), + "port": int(self.entry_port.get_value()), + "username": self.entry_username.get_text().strip(), + "key_file": self.entry_key.get_text().strip(), + "folder": self.entry_folder.get_text().strip(), + "color": self.color_combo.get_active_id() or SESSION_COLORS[0], + } + + def validate(self): + data = self.get_data() + if not data["name"]: + self._show_error("Name is required.") + return False + if not data["host"]: + self._show_error("Host is required.") + return False + if not data["username"]: + self._show_error("Username is required.") + return False + return True + + def _show_error(self, msg): + dlg = Gtk.MessageDialog( + transient_for=self, + modal=True, + message_type=Gtk.MessageType.ERROR, + buttons=Gtk.ButtonsType.OK, + text=msg, + ) + dlg.run() + dlg.destroy() + + +# ─── MacroDialog ───────────────────────────────────────────────────────────── + + +class MacroStepRow(Gtk.ListBoxRow): + """Single step row in the macro editor.""" + + def __init__(self, step=None): + super().__init__() + box = Gtk.Box(spacing=6) + box.set_border_width(4) + + self.type_combo = Gtk.ComboBoxText() + for t in ("text", "key", "delay"): + self.type_combo.append(t, t) + self.type_combo.set_active_id("text") + box.pack_start(self.type_combo, False, False, 0) + + self.stack = Gtk.Stack() + + # text entry + self.text_entry = Gtk.Entry(hexpand=True) + self.text_entry.set_placeholder_text("Text to send") + self.stack.add_named(self.text_entry, "text") + + # key combo + self.key_combo = Gtk.ComboBoxText() + for k in ("Enter", "Tab", "Escape", "Ctrl+C", "Ctrl+D"): + self.key_combo.append(k, k) + self.key_combo.set_active(0) + self.stack.add_named(self.key_combo, "key") + + # delay spin + self.delay_spin = Gtk.SpinButton.new_with_range(100, 10000, 100) + self.delay_spin.set_value(1000) + self.stack.add_named(self.delay_spin, "delay") + + box.pack_start(self.stack, True, True, 0) + self.add(box) + + self.type_combo.connect("changed", self._on_type_changed) + + if step: + self.type_combo.set_active_id(step["type"]) + if step["type"] == "text": + self.text_entry.set_text(step["value"]) + elif step["type"] == "key": + self.key_combo.set_active_id(step["value"]) + elif step["type"] == "delay": + self.delay_spin.set_value(int(step["value"])) + + self._on_type_changed(self.type_combo) + self.show_all() + + def _on_type_changed(self, combo): + active = combo.get_active_id() + if active: + self.stack.set_visible_child_name(active) + + def get_step(self): + t = self.type_combo.get_active_id() + if t == "text": + return {"type": "text", "value": self.text_entry.get_text()} + elif t == "key": + return {"type": "key", "value": self.key_combo.get_active_id()} + elif t == "delay": + return {"type": "delay", "value": int(self.delay_spin.get_value())} + return {"type": "text", "value": ""} + + +class MacroDialog(Gtk.Dialog): + """Dialog do dodawania/edycji makra SSH.""" + + def __init__(self, parent, macro=None): + title = "Edit Macro" if macro else "Add Macro" + super().__init__( + title=title, + transient_for=parent, + modal=True, + destroy_with_parent=True, + ) + self.add_buttons( + Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, + Gtk.STOCK_OK, Gtk.ResponseType.OK, + ) + self.set_default_size(500, 400) + self.set_default_response(Gtk.ResponseType.OK) + + box = self.get_content_area() + box.set_border_width(12) + box.set_spacing(8) + + # Name + name_box = Gtk.Box(spacing=8) + name_box.pack_start(Gtk.Label(label="Name:"), False, False, 0) + self.entry_name = Gtk.Entry(hexpand=True) + name_box.pack_start(self.entry_name, True, True, 0) + box.pack_start(name_box, False, False, 0) + + # Steps label + box.pack_start(Gtk.Label(label="Steps:", halign=Gtk.Align.START), False, False, 0) + + # Steps listbox in scrolled window + scrolled = Gtk.ScrolledWindow() + scrolled.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) + scrolled.set_min_content_height(200) + self.listbox = Gtk.ListBox() + self.listbox.set_selection_mode(Gtk.SelectionMode.SINGLE) + scrolled.add(self.listbox) + box.pack_start(scrolled, True, True, 0) + + # Buttons + btn_box = Gtk.Box(spacing=4) + for label_text, cb in [ + ("Add Step", self._on_add), + ("Remove", self._on_remove), + ("Move Up", self._on_move_up), + ("Move Down", self._on_move_down), + ]: + btn = Gtk.Button(label=label_text) + btn.connect("clicked", cb) + btn_box.pack_start(btn, True, True, 0) + box.pack_start(btn_box, False, False, 0) + + # Quick-add shortcuts + box.pack_start(Gtk.Separator(), False, False, 2) + quick_label = Gtk.Label(label="Quick add:", halign=Gtk.Align.START) + quick_label.set_opacity(0.6) + box.pack_start(quick_label, False, False, 0) + + quick_box = Gtk.Box(spacing=4) + for key_name in ("Enter", "Tab", "Escape", "Ctrl+C", "Ctrl+D"): + btn = Gtk.Button(label=key_name) + btn.connect("clicked", self._on_quick_key, key_name) + quick_box.pack_start(btn, True, True, 0) + box.pack_start(quick_box, False, False, 0) + + delay_box = Gtk.Box(spacing=6) + btn_delay = Gtk.Button(label="+ Delay") + self.delay_spin = Gtk.SpinButton.new_with_range(100, 10000, 100) + self.delay_spin.set_value(500) + lbl_ms = Gtk.Label(label="ms") + btn_delay.connect("clicked", self._on_quick_delay) + delay_box.pack_start(btn_delay, False, False, 0) + delay_box.pack_start(self.delay_spin, False, False, 0) + delay_box.pack_start(lbl_ms, False, False, 0) + box.pack_start(delay_box, False, False, 0) + + # Fill if editing + if macro: + self.entry_name.set_text(macro.get("name", "")) + for step in macro.get("steps", []): + self.listbox.add(MacroStepRow(step)) + + self.show_all() + + def _on_quick_key(self, btn, key_name): + row = MacroStepRow({"type": "key", "value": key_name}) + self.listbox.add(row) + + def _on_quick_delay(self, btn): + ms = int(self.delay_spin.get_value()) + row = MacroStepRow({"type": "delay", "value": ms}) + self.listbox.add(row) + + def _on_add(self, btn): + row = MacroStepRow() + self.listbox.add(row) + + def _on_remove(self, btn): + row = self.listbox.get_selected_row() + if row: + self.listbox.remove(row) + + def _on_move_up(self, btn): + row = self.listbox.get_selected_row() + if row: + idx = row.get_index() + if idx > 0: + step = row.get_step() + self.listbox.remove(row) + new_row = MacroStepRow(step) + self.listbox.insert(new_row, idx - 1) + self.listbox.select_row(new_row) + + def _on_move_down(self, btn): + row = self.listbox.get_selected_row() + if row: + idx = row.get_index() + n = len(self.listbox.get_children()) + if idx < n - 1: + step = row.get_step() + self.listbox.remove(row) + new_row = MacroStepRow(step) + self.listbox.insert(new_row, idx + 1) + self.listbox.select_row(new_row) + + def get_data(self): + steps = [] + for row in self.listbox.get_children(): + steps.append(row.get_step()) + return { + "name": self.entry_name.get_text().strip(), + "steps": steps, + } + + def validate(self): + data = self.get_data() + if not data["name"]: + self._show_error("Macro name is required.") + return False + if not data["steps"]: + self._show_error("At least one step is required.") + return False + return True + + def _show_error(self, msg): + dlg = Gtk.MessageDialog( + transient_for=self, + modal=True, + message_type=Gtk.MessageType.ERROR, + buttons=Gtk.ButtonsType.OK, + text=msg, + ) + dlg.run() + dlg.destroy() + + +# ─── ClaudeCodeDialog ───────────────────────────────────────────────────────── + + +class ClaudeCodeDialog(Gtk.Dialog): + """Dialog konfiguracji sesji Claude Code.""" + + def __init__(self, parent, session=None): + title = "Edit Claude Session" if session else "Add Claude Session" + super().__init__( + title=title, + transient_for=parent, + modal=True, + destroy_with_parent=True, + ) + self.add_buttons( + Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, + Gtk.STOCK_OK, Gtk.ResponseType.OK, + ) + self.set_default_size(460, -1) + self.set_default_response(Gtk.ResponseType.OK) + + box = self.get_content_area() + box.set_border_width(12) + box.set_spacing(10) + + # Name, Folder, Color grid + grid = Gtk.Grid(column_spacing=12, row_spacing=8) + box.pack_start(grid, False, False, 0) + + for i, text in enumerate(["Name:", "Folder:", "Color:"]): + lbl = Gtk.Label(label=text, halign=Gtk.Align.END) + grid.attach(lbl, 0, i, 1, 1) + + self.entry_name = Gtk.Entry(hexpand=True) + grid.attach(self.entry_name, 1, 0, 1, 1) + + self.entry_folder = Gtk.Entry(hexpand=True) + self.entry_folder.set_placeholder_text("(optional) folder for grouping") + grid.attach(self.entry_folder, 1, 1, 1, 1) + + self.color_combo = Gtk.ComboBoxText() + for c in SESSION_COLORS: + self.color_combo.append(c, c) + self.color_combo.set_active(0) + grid.attach(self.color_combo, 1, 2, 1, 1) + + # Separator + box.pack_start(Gtk.Separator(), False, False, 2) + + # Sudo checkbox + self.chk_sudo = Gtk.CheckButton(label="Run with sudo (asks for password)") + box.pack_start(self.chk_sudo, False, False, 0) + + # Resume session checkbox + self.chk_resume = Gtk.CheckButton(label="Resume last session (--resume)") + self.chk_resume.set_active(True) + box.pack_start(self.chk_resume, False, False, 0) + + # Skip permissions checkbox + self.chk_skip_perms = Gtk.CheckButton(label="Skip permissions (--dangerously-skip-permissions)") + self.chk_skip_perms.set_active(True) + box.pack_start(self.chk_skip_perms, False, False, 0) + + # Initial prompt + lbl = Gtk.Label(label="Initial prompt (optional):", halign=Gtk.Align.START) + box.pack_start(lbl, False, False, 0) + + scrolled = Gtk.ScrolledWindow() + scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + scrolled.set_min_content_height(80) + self.textview = Gtk.TextView() + self.textview.set_wrap_mode(Gtk.WrapMode.WORD_CHAR) + scrolled.add(self.textview) + box.pack_start(scrolled, True, True, 0) + + # Edit mode: fill fields + if session: + self.entry_name.set_text(session.get("name", "")) + self.entry_folder.set_text(session.get("folder", "")) + color = session.get("color", SESSION_COLORS[0]) + self.color_combo.set_active_id(color) + self.chk_sudo.set_active(session.get("sudo", False)) + self.chk_resume.set_active(session.get("resume", True)) + self.chk_skip_perms.set_active(session.get("skip_permissions", True)) + prompt = session.get("prompt", "") + if prompt: + self.textview.get_buffer().set_text(prompt) + + self.show_all() + + def get_data(self): + buf = self.textview.get_buffer() + start, end = buf.get_bounds() + prompt = buf.get_text(start, end, False).strip() + return { + "name": self.entry_name.get_text().strip(), + "folder": self.entry_folder.get_text().strip(), + "color": self.color_combo.get_active_id() or SESSION_COLORS[0], + "sudo": self.chk_sudo.get_active(), + "resume": self.chk_resume.get_active(), + "skip_permissions": self.chk_skip_perms.get_active(), + "prompt": prompt, + } + + def validate(self): + data = self.get_data() + if not data["name"]: + self._show_error("Name is required.") + return False + return True + + def _show_error(self, msg): + dlg = Gtk.MessageDialog( + transient_for=self, + modal=True, + message_type=Gtk.MessageType.ERROR, + buttons=Gtk.ButtonsType.OK, + text=msg, + ) + dlg.run() + dlg.destroy() + + +# ─── TerminalTab ────────────────────────────────────────────────────────────── + + +class TerminalTab(Gtk.Box): + """Zakładka terminala — lokalny shell lub SSH.""" + + def __init__(self, app, session=None, claude_config=None): + super().__init__(orientation=Gtk.Orientation.VERTICAL) + self.app = app + self.session = session + self.claude_config = claude_config + + self.terminal = Vte.Terminal() + self.terminal.set_font(Pango.FontDescription(FONT)) + self.terminal.set_scrollback_lines(SCROLLBACK_LINES) + self.terminal.set_scroll_on_output(True) + self.terminal.set_scroll_on_keystroke(True) + self.terminal.set_audible_bell(False) + + # Catppuccin colors + fg = _parse_color(CATPPUCCIN["text"]) + bg = _parse_color(CATPPUCCIN["base"]) + palette = [_parse_color(c) for c in TERMINAL_PALETTE] + self.terminal.set_colors(fg, bg, palette) + + # Cursor color + self.terminal.set_color_cursor(_parse_color(CATPPUCCIN["rosewater"])) + self.terminal.set_color_cursor_foreground(_parse_color(CATPPUCCIN["crust"])) + + scrolled = Gtk.ScrolledWindow() + scrolled.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) + scrolled.add(self.terminal) + self.pack_start(scrolled, True, True, 0) + + self.terminal.connect("child-exited", self._on_child_exited) + self.terminal.connect("window-title-changed", self._on_title_changed) + self.terminal.connect("key-press-event", self._on_key_press) + self.terminal.connect("button-press-event", self._on_button_press) + + self.show_all() + + if claude_config: + self.spawn_claude(claude_config) + elif session: + self.spawn_ssh( + session["host"], + session.get("port", 22), + session["username"], + session.get("key_file", ""), + ) + else: + self.spawn_local_shell() + + def spawn_local_shell(self): + shell = os.environ.get("SHELL", "/bin/bash") + self.terminal.spawn_async( + Vte.PtyFlags.DEFAULT, + os.environ.get("HOME", "/"), + [shell], + None, + GLib.SpawnFlags.DEFAULT, + None, + None, + -1, + None, + None, + ) + + def spawn_ssh(self, host, port, username, key_file=""): + argv = [SSH_PATH] + if key_file: + argv += ["-i", key_file] + argv += ["-p", str(port), f"{username}@{host}"] + + self.terminal.spawn_async( + Vte.PtyFlags.DEFAULT, + os.environ.get("HOME", "/"), + argv, + None, + GLib.SpawnFlags.DEFAULT, + None, + None, + -1, + None, + None, + ) + + def spawn_claude(self, config): + """Spawn Claude Code session — with sudo askpass helper or direct. + + Always runs inside bash so that when claude exits, the shell + stays alive and the tab doesn't auto-close. + """ + flags = [] + if config.get("resume"): + flags.append("--resume") + if config.get("skip_permissions"): + flags.append("--dangerously-skip-permissions") + + prompt = config.get("prompt", "") + prompt_arg = "" + if prompt: + escaped = prompt.replace("'", "'\\''") + prompt_arg = f" '{escaped}'" + + flags_str = " ".join(flags) + + if config.get("sudo"): + script = ( + 'set -euo pipefail\n' + 'read -rsp "Podaj hasło sudo: " SUDO_PW\n' + 'echo\n' + 'ASKPASS=$(mktemp /tmp/claude-askpass.XXXXXX)\n' + 'chmod 700 "$ASKPASS"\n' + 'cat > "$ASKPASS" </dev/null; then\n' + ' rm -f "$ASKPASS"\n' + ' echo "Błędne hasło sudo."\n' + ' read -p "Naciśnij Enter..."\n' + ' exit 1\n' + 'fi\n' + 'unset SUDO_PW\n' + 'trap \'rm -f "$ASKPASS"\' EXIT\n' + f'{CLAUDE_PATH} {flags_str}{prompt_arg}\n' + 'exec bash\n' + ) + else: + script = f'{CLAUDE_PATH} {flags_str}{prompt_arg}\nexec bash\n' + + self.terminal.spawn_async( + Vte.PtyFlags.DEFAULT, + os.environ.get("HOME", "/"), + ["/bin/bash", "-c", script], + None, + GLib.SpawnFlags.DEFAULT, + None, + None, + -1, + None, + None, + ) + + def run_macro(self, macro): + """Execute macro steps chained via GLib.timeout_add.""" + steps = macro.get("steps", []) + if not steps: + return + + def execute_steps(step_index): + if step_index >= len(steps): + return False + step = steps[step_index] + if step["type"] == "text": + self.terminal.feed_child(step["value"].encode()) + GLib.timeout_add(50, execute_steps, step_index + 1) + elif step["type"] == "key": + key_str = KEY_MAP.get(step["value"], "") + if key_str: + self.terminal.feed_child(key_str.encode()) + GLib.timeout_add(50, execute_steps, step_index + 1) + elif step["type"] == "delay": + GLib.timeout_add(int(step["value"]), execute_steps, step_index + 1) + return False + + GLib.timeout_add(500, execute_steps, 0) + + def _on_key_press(self, terminal, event): + mod = event.state & Gtk.accelerator_get_default_mod_mask() + ctrl = Gdk.ModifierType.CONTROL_MASK + shift = Gdk.ModifierType.SHIFT_MASK + + # Ctrl+Shift+C: copy + if mod == (ctrl | shift) and event.keyval in (Gdk.KEY_C, Gdk.KEY_c): + if terminal.get_has_selection(): + terminal.copy_clipboard_format(Vte.Format.TEXT) + return True + + # Ctrl+Shift+V: paste + if mod == (ctrl | shift) and event.keyval in (Gdk.KEY_V, Gdk.KEY_v): + terminal.paste_clipboard() + return True + + # Ctrl+T: new tab (forward to app) + if mod == ctrl and event.keyval == Gdk.KEY_t: + self.app.add_local_tab() + return True + + # Ctrl+Shift+W: close tab + if mod == (ctrl | shift) and event.keyval in (Gdk.KEY_W, Gdk.KEY_w): + self.app.close_tab(self) + return True + + # Ctrl+PageUp/PageDown: switch tabs + if mod == ctrl and event.keyval == Gdk.KEY_Page_Up: + idx = self.app.notebook.get_current_page() + if idx > 0: + self.app.notebook.set_current_page(idx - 1) + return True + if mod == ctrl and event.keyval == Gdk.KEY_Page_Down: + idx = self.app.notebook.get_current_page() + if idx < self.app.notebook.get_n_pages() - 1: + self.app.notebook.set_current_page(idx + 1) + return True + + return False + + def _on_button_press(self, terminal, event): + if event.button == 3: # right click + menu = Gtk.Menu() + + item_copy = Gtk.MenuItem(label="Copy") + item_copy.set_sensitive(terminal.get_has_selection()) + item_copy.connect("activate", lambda _: terminal.copy_clipboard_format(Vte.Format.TEXT)) + menu.append(item_copy) + + item_paste = Gtk.MenuItem(label="Paste") + item_paste.connect("activate", lambda _: terminal.paste_clipboard()) + menu.append(item_paste) + + menu.append(Gtk.SeparatorMenuItem()) + + item_select_all = Gtk.MenuItem(label="Select All") + item_select_all.connect("activate", lambda _: terminal.select_all()) + menu.append(item_select_all) + + menu.show_all() + menu.popup_at_pointer(event) + return True + return False + + def _on_child_exited(self, terminal, status): + self.app.on_tab_child_exited(self) + + def _on_title_changed(self, terminal): + title = terminal.get_window_title() + if title: + if self.session: + # SSH tab: keep session name, show VTE title in window title only + self.app.update_tab_title(self, self.session.get("name", "SSH")) + else: + self.app.update_tab_title(self, title) + + def get_label(self): + if self.claude_config: + return self.claude_config.get("name", "Claude Code") + if self.session: + return self.session.get("name", "SSH") + return "Terminal" + + +# ─── SessionSidebar ─────────────────────────────────────────────────────────── + +# TreeStore columns +COL_ICON = 0 +COL_NAME = 1 +COL_ID = 2 +COL_TOOLTIP = 3 +COL_COLOR = 4 +COL_WEIGHT = 5 + + +class SessionSidebar(Gtk.Box): + """Panel lewy z listą zapisanych sesji SSH.""" + + def __init__(self, app): + super().__init__(orientation=Gtk.Orientation.VERTICAL) + self.app = app + self.get_style_context().add_class("sidebar") + self.set_size_request(250, -1) + + # Header + header = Gtk.Label(label=f" {APP_NAME} Sessions") + header.set_halign(Gtk.Align.START) + header.get_style_context().add_class("sidebar-header") + self.pack_start(header, False, False, 0) + + # TreeView + self.store = Gtk.TreeStore(str, str, str, str, str, int) # icon, name, id, tooltip, color, weight + self.tree = Gtk.TreeView(model=self.store) + self.tree.set_headers_visible(False) + self.tree.set_tooltip_column(COL_TOOLTIP) + self.tree.set_activate_on_single_click(False) + + # Renderer + col = Gtk.TreeViewColumn() + + cell_icon = Gtk.CellRendererText() + col.pack_start(cell_icon, False) + col.add_attribute(cell_icon, "text", COL_ICON) + + cell_name = Gtk.CellRendererText() + cell_name.set_property("ellipsize", Pango.EllipsizeMode.END) + col.pack_start(cell_name, True) + col.add_attribute(cell_name, "text", COL_NAME) + col.add_attribute(cell_name, "foreground", COL_COLOR) + col.add_attribute(cell_name, "weight", COL_WEIGHT) + + self.tree.append_column(col) + + scrolled = Gtk.ScrolledWindow() + scrolled.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) + scrolled.add(self.tree) + self.pack_start(scrolled, True, True, 0) + + # Buttons + btn_box = Gtk.Box(spacing=4) + btn_box.set_border_width(6) + + btn_add = Gtk.MenuButton(label="Add \u25BE") + btn_add.get_style_context().add_class("sidebar-btn") + add_menu = Gtk.Menu() + item_session = Gtk.MenuItem(label="SSH Session") + item_session.connect("activate", lambda _: self._on_add(None)) + add_menu.append(item_session) + item_terminal = Gtk.MenuItem(label="Local Terminal") + item_terminal.connect("activate", lambda _: self.app.add_local_tab()) + add_menu.append(item_terminal) + item_claude = Gtk.MenuItem(label="Claude Code") + item_claude.connect("activate", lambda _: self._on_add_claude()) + add_menu.append(item_claude) + add_menu.show_all() + btn_add.set_popup(add_menu) + + btn_edit = Gtk.Button(label="Edit") + btn_edit.get_style_context().add_class("sidebar-btn") + btn_edit.connect("clicked", self._on_edit) + + btn_delete = Gtk.Button(label="Delete") + btn_delete.get_style_context().add_class("sidebar-btn") + btn_delete.connect("clicked", self._on_delete) + + btn_box.pack_start(btn_add, True, True, 0) + btn_box.pack_start(btn_edit, True, True, 0) + btn_box.pack_start(btn_delete, True, True, 0) + self.pack_start(btn_box, False, False, 0) + + # Signals + self.tree.connect("row-activated", self._on_row_activated) + self.tree.connect("button-press-event", self._on_button_press) + + self.refresh() + + def _append_session(self, parent_iter, session): + """Add a session node and its macro children to the tree store.""" + tooltip = f"{session.get('username', '')}@{session.get('host', '')}:{session.get('port', 22)}" + session_iter = self.store.append(parent_iter, [ + "\U0001F5A5", + session["name"], + session["id"], + tooltip, + session.get("color", SESSION_COLORS[0]), + Pango.Weight.NORMAL, + ]) + for macro in session.get("macros", []): + macro_id = f"macro:{session['id']}:{macro['id']}" + self.store.append(session_iter, [ + "\u25B6", # ▶ + macro["name"], + macro_id, + f"Macro: {macro['name']}", + CATPPUCCIN["green"], + Pango.Weight.NORMAL, + ]) + + def _append_claude_session(self, parent_iter, session): + """Add a Claude Code session node to the tree store.""" + opts = [] + if session.get("sudo"): + opts.append("sudo") + if session.get("resume"): + opts.append("resume") + if session.get("skip_permissions"): + opts.append("skip-perms") + tooltip = ", ".join(opts) if opts else "Claude Code" + self.store.append(parent_iter, [ + "\U0001F916", # 🤖 + session["name"], + f"claude:{session['id']}", + tooltip, + session.get("color", SESSION_COLORS[0]), + Pango.Weight.NORMAL, + ]) + + def refresh(self): + self.store.clear() + sessions = self.app.session_manager.all() + + folders = {} + ungrouped = [] + + for s in sessions: + folder = s.get("folder", "").strip() + if folder: + folders.setdefault(folder, []).append(s) + else: + ungrouped.append(s) + + # Grouped sessions + for folder_name in sorted(folders.keys()): + parent = self.store.append(None, [ + "\U0001F4C1", # folder icon + folder_name, + "", + folder_name, + CATPPUCCIN["subtext1"], + Pango.Weight.NORMAL, + ]) + for s in folders[folder_name]: + self._append_session(parent, s) + + # Ungrouped sessions + for s in ungrouped: + self._append_session(None, s) + + # ── Claude Code sessions ── + claude_sessions = self.app.claude_manager.all() + if claude_sessions: + # Visual separator + self.store.append(None, [ + "", + "\u2500" * 26, # ──────────── + "", + "", + CATPPUCCIN["surface2"], + Pango.Weight.NORMAL, + ]) + # Section header (bold) + self.store.append(None, [ + "\U0001F916", # 🤖 + "Claude Code", + "", + "Claude Code sessions", + CATPPUCCIN["mauve"], + Pango.Weight.BOLD, + ]) + + claude_folders = {} + claude_ungrouped = [] + for s in claude_sessions: + folder = s.get("folder", "").strip() + if folder: + claude_folders.setdefault(folder, []).append(s) + else: + claude_ungrouped.append(s) + + for folder_name in sorted(claude_folders.keys()): + parent = self.store.append(None, [ + "\U0001F4C1", + folder_name, + "", + folder_name, + CATPPUCCIN["subtext1"], + Pango.Weight.NORMAL, + ]) + for s in claude_folders[folder_name]: + self._append_claude_session(parent, s) + + for s in claude_ungrouped: + self._append_claude_session(None, s) + + self.tree.expand_all() + + def _get_selected_session_id(self): + sel = self.tree.get_selection() + model, it = sel.get_selected() + if it is None: + return None + col_id = model.get_value(it, COL_ID) + if col_id and not col_id.startswith("macro:"): + return col_id + return None + + def _on_row_activated(self, tree, path, column): + it = self.store.get_iter(path) + col_id = self.store.get_value(it, COL_ID) + if col_id and col_id.startswith("macro:"): + parts = col_id.split(":", 2) + self._run_macro(parts[1], parts[2]) + elif col_id and col_id.startswith("claude:"): + claude_id = col_id[7:] + config = self.app.claude_manager.get(claude_id) + if config: + self.app.open_claude_tab(config) + elif col_id: + session = self.app.session_manager.get(col_id) + if session: + self.app.open_ssh_tab(session) + + def _on_button_press(self, widget, event): + if event.button == 3: # right click + path_info = self.tree.get_path_at_pos(int(event.x), int(event.y)) + if path_info: + path = path_info[0] + self.tree.get_selection().select_path(path) + it = self.store.get_iter(path) + col_id = self.store.get_value(it, COL_ID) + + if col_id and col_id.startswith("macro:"): + # Macro context menu + parts = col_id.split(":", 2) + sid, mid = parts[1], parts[2] + menu = Gtk.Menu() + + item_run = Gtk.MenuItem(label="Run") + item_run.connect("activate", lambda _, s=sid, m=mid: self._run_macro(s, m)) + menu.append(item_run) + + item_edit = Gtk.MenuItem(label="Edit") + item_edit.connect("activate", lambda _, s=sid, m=mid: self._edit_macro(s, m)) + menu.append(item_edit) + + item_delete = Gtk.MenuItem(label="Delete") + item_delete.connect("activate", lambda _, s=sid, m=mid: self._delete_macro(s, m)) + menu.append(item_delete) + + menu.show_all() + menu.popup_at_pointer(event) + + elif col_id and col_id.startswith("claude:"): + # Claude Code session context menu + claude_id = col_id[7:] + menu = Gtk.Menu() + + item_connect = Gtk.MenuItem(label="Connect") + item_connect.connect("activate", lambda _, cid=claude_id: self._connect_claude(cid)) + menu.append(item_connect) + + item_edit = Gtk.MenuItem(label="Edit") + item_edit.connect("activate", lambda _, cid=claude_id: self._edit_claude(cid)) + menu.append(item_edit) + + item_delete = Gtk.MenuItem(label="Delete") + item_delete.connect("activate", lambda _, cid=claude_id: self._delete_claude(cid)) + menu.append(item_delete) + + menu.show_all() + menu.popup_at_pointer(event) + + elif col_id: + # Session context menu + session_id = col_id + menu = Gtk.Menu() + + item_connect = Gtk.MenuItem(label="Connect") + item_connect.connect("activate", lambda _: self._connect_session(session_id)) + menu.append(item_connect) + + item_edit = Gtk.MenuItem(label="Edit") + item_edit.connect("activate", lambda _: self._edit_session(session_id)) + menu.append(item_edit) + + item_delete = Gtk.MenuItem(label="Delete") + item_delete.connect("activate", lambda _: self._delete_session(session_id)) + menu.append(item_delete) + + menu.append(Gtk.SeparatorMenuItem()) + + item_add_macro = Gtk.MenuItem(label="Add Macro...") + item_add_macro.connect("activate", lambda _: self._add_macro(session_id)) + menu.append(item_add_macro) + + menu.show_all() + menu.popup_at_pointer(event) + return True + return False + + def _connect_session(self, session_id): + session = self.app.session_manager.get(session_id) + if session: + self.app.open_ssh_tab(session) + + def _on_add(self, button): + dlg = SessionDialog(self.app) + while True: + resp = dlg.run() + if resp != Gtk.ResponseType.OK: + break + if dlg.validate(): + self.app.session_manager.add(dlg.get_data()) + self.refresh() + break + dlg.destroy() + + def _on_add_claude(self): + dlg = ClaudeCodeDialog(self.app) + while True: + resp = dlg.run() + if resp != Gtk.ResponseType.OK: + break + if dlg.validate(): + self.app.claude_manager.add(dlg.get_data()) + self.refresh() + break + dlg.destroy() + + def _on_edit(self, button): + sel = self.tree.get_selection() + model, it = sel.get_selected() + if it is None: + return + col_id = model.get_value(it, COL_ID) + if col_id and col_id.startswith("claude:"): + self._edit_claude(col_id[7:]) + elif col_id and not col_id.startswith("macro:"): + self._edit_session(col_id) + + def _edit_session(self, session_id): + session = self.app.session_manager.get(session_id) + if not session: + return + dlg = SessionDialog(self.app, session) + while True: + resp = dlg.run() + if resp != Gtk.ResponseType.OK: + break + if dlg.validate(): + data = dlg.get_data() + self.app.session_manager.update(session_id, data) + self.refresh() + break + dlg.destroy() + + def _on_delete(self, button): + sel = self.tree.get_selection() + model, it = sel.get_selected() + if it is None: + return + col_id = model.get_value(it, COL_ID) + if col_id and col_id.startswith("claude:"): + self._delete_claude(col_id[7:]) + elif col_id and not col_id.startswith("macro:"): + self._delete_session(col_id) + + def _delete_session(self, session_id): + session = self.app.session_manager.get(session_id) + if not session: + return + dlg = Gtk.MessageDialog( + transient_for=self.app, + modal=True, + message_type=Gtk.MessageType.QUESTION, + buttons=Gtk.ButtonsType.YES_NO, + text=f"Delete session \"{session['name']}\"?", + ) + if dlg.run() == Gtk.ResponseType.YES: + self.app.session_manager.delete(session_id) + self.refresh() + dlg.destroy() + + # ── Macro CRUD ── + + def _add_macro(self, session_id): + session = self.app.session_manager.get(session_id) + if not session: + return + dlg = MacroDialog(self.app) + while True: + resp = dlg.run() + if resp != Gtk.ResponseType.OK: + break + if dlg.validate(): + data = dlg.get_data() + data["id"] = str(uuid.uuid4()) + session.setdefault("macros", []).append(data) + self.app.session_manager.save() + self.refresh() + break + dlg.destroy() + + def _edit_macro(self, session_id, macro_id): + session = self.app.session_manager.get(session_id) + if not session: + return + macro = None + for m in session.get("macros", []): + if m["id"] == macro_id: + macro = m + break + if not macro: + return + dlg = MacroDialog(self.app, macro) + while True: + resp = dlg.run() + if resp != Gtk.ResponseType.OK: + break + if dlg.validate(): + data = dlg.get_data() + macro.update(data) + self.app.session_manager.save() + self.refresh() + break + dlg.destroy() + + def _delete_macro(self, session_id, macro_id): + session = self.app.session_manager.get(session_id) + if not session: + return + macro_name = "" + for m in session.get("macros", []): + if m["id"] == macro_id: + macro_name = m.get("name", "") + break + dlg = Gtk.MessageDialog( + transient_for=self.app, + modal=True, + message_type=Gtk.MessageType.QUESTION, + buttons=Gtk.ButtonsType.YES_NO, + text=f'Delete macro "{macro_name}"?', + ) + if dlg.run() == Gtk.ResponseType.YES: + session["macros"] = [ + m for m in session.get("macros", []) if m["id"] != macro_id + ] + self.app.session_manager.save() + self.refresh() + dlg.destroy() + + def _run_macro(self, session_id, macro_id): + session = self.app.session_manager.get(session_id) + if not session: + return + macro = None + for m in session.get("macros", []): + if m["id"] == macro_id: + macro = m + break + if macro: + self.app.open_ssh_tab_with_macro(session, macro) + + # ── Claude Code CRUD ── + + def _connect_claude(self, claude_id): + config = self.app.claude_manager.get(claude_id) + if config: + self.app.open_claude_tab(config) + + def _edit_claude(self, claude_id): + config = self.app.claude_manager.get(claude_id) + if not config: + return + dlg = ClaudeCodeDialog(self.app, config) + while True: + resp = dlg.run() + if resp != Gtk.ResponseType.OK: + break + if dlg.validate(): + data = dlg.get_data() + self.app.claude_manager.update(claude_id, data) + self.refresh() + break + dlg.destroy() + + def _delete_claude(self, claude_id): + config = self.app.claude_manager.get(claude_id) + if not config: + return + dlg = Gtk.MessageDialog( + transient_for=self.app, + modal=True, + message_type=Gtk.MessageType.QUESTION, + buttons=Gtk.ButtonsType.YES_NO, + text=f"Delete Claude session \"{config['name']}\"?", + ) + if dlg.run() == Gtk.ResponseType.YES: + self.app.claude_manager.delete(claude_id) + self.refresh() + dlg.destroy() + + +# ─── BTerminalApp ───────────────────────────────────────────────────────────── + + +class BTerminalApp(Gtk.Window): + """Główne okno aplikacji BTerminal.""" + + def __init__(self): + super().__init__(title=APP_NAME) + self.set_default_size(1200, 700) + self.set_icon_name("utilities-terminal") + + # Apply CSS + css_provider = Gtk.CssProvider() + css_provider.load_from_data(CSS.encode()) + Gtk.StyleContext.add_provider_for_screen( + Gdk.Screen.get_default(), + css_provider, + Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION, + ) + + # Dark theme + settings = Gtk.Settings.get_default() + settings.set_property("gtk-application-prefer-dark-theme", True) + + # Session managers + self.session_manager = SessionManager() + self.claude_manager = ClaudeSessionManager() + + # Layout: HPaned + paned = Gtk.HPaned() + self.add(paned) + + # Sidebar + self.sidebar = SessionSidebar(self) + paned.pack1(self.sidebar, resize=False, shrink=False) + + # Notebook (tabs) + self.notebook = Gtk.Notebook() + self.notebook.set_scrollable(True) + self.notebook.set_show_border(False) + self.notebook.popup_disable() + paned.pack2(self.notebook, resize=True, shrink=False) + + paned.set_position(250) + + # Keyboard shortcuts + self.connect("key-press-event", self._on_key_press) + self.connect("delete-event", self._on_delete_event) + self.notebook.connect("switch-page", self._on_switch_page) + + # Open initial local shell + self.add_local_tab() + + self.show_all() + + def _update_window_title(self): + """Update window title bar: 'BTerminal — tab_name [n/total]'.""" + n = self.notebook.get_n_pages() + idx = self.notebook.get_current_page() + if idx < 0 or n == 0: + self.set_title(APP_NAME) + return + tab = self.notebook.get_nth_page(idx) + if isinstance(tab, TerminalTab): + name = tab.get_label() + else: + name = "Terminal" + if n > 1: + self.set_title(f"{APP_NAME} — {name} [{idx + 1}/{n}]") + else: + self.set_title(f"{APP_NAME} — {name}") + + def _on_switch_page(self, notebook, page, page_num): + GLib.idle_add(self._update_window_title) + + def _build_tab_label(self, text, tab_widget): + """Build a tab label with a close button.""" + box = Gtk.Box(spacing=4) + + label = Gtk.Label(label=text) + box.pack_start(label, True, True, 0) + + close_btn = Gtk.Button(label="×") + close_btn.get_style_context().add_class("tab-close-btn") + close_btn.set_relief(Gtk.ReliefStyle.NONE) + close_btn.connect("clicked", lambda _: self.close_tab(tab_widget)) + box.pack_start(close_btn, False, False, 0) + + box.show_all() + return box + + def add_local_tab(self): + tab = TerminalTab(self) + label = self._build_tab_label("Terminal", tab) + idx = self.notebook.append_page(tab, label) + self.notebook.set_current_page(idx) + self.notebook.set_tab_reorderable(tab, True) + tab.terminal.grab_focus() + self._update_window_title() + + def open_ssh_tab(self, session): + tab = TerminalTab(self, session=session) + name = session.get("name", "SSH") + label = self._build_tab_label(name, tab) + idx = self.notebook.append_page(tab, label) + self.notebook.set_current_page(idx) + self.notebook.set_tab_reorderable(tab, True) + tab.terminal.grab_focus() + self._update_window_title() + + def open_ssh_tab_with_macro(self, session, macro): + tab = TerminalTab(self, session=session) + name = f"{session.get('name', 'SSH')} \u2014 {macro.get('name', 'Macro')}" + label = self._build_tab_label(name, tab) + idx = self.notebook.append_page(tab, label) + self.notebook.set_current_page(idx) + self.notebook.set_tab_reorderable(tab, True) + tab.terminal.grab_focus() + tab.run_macro(macro) + self._update_window_title() + + def open_claude_tab(self, config): + tab = TerminalTab(self, claude_config=config) + tab_name = config.get("name", "Claude Code") + label = self._build_tab_label(tab_name, tab) + idx = self.notebook.append_page(tab, label) + self.notebook.set_current_page(idx) + self.notebook.set_tab_reorderable(tab, True) + tab.terminal.grab_focus() + self._update_window_title() + + def close_tab(self, tab): + idx = self.notebook.page_num(tab) + if idx >= 0: + self.notebook.remove_page(idx) + tab.destroy() + # If no tabs left, open a new local shell + if self.notebook.get_n_pages() == 0: + self.add_local_tab() + self._update_window_title() + + def on_tab_child_exited(self, tab): + """Called when a terminal's child process exits.""" + GLib.idle_add(self.close_tab, tab) + + def update_tab_title(self, tab, title): + """Update tab label when terminal title changes.""" + idx = self.notebook.page_num(tab) + if idx >= 0: + label_widget = self._build_tab_label(title, tab) + self.notebook.set_tab_label(tab, label_widget) + self._update_window_title() + + def _get_current_terminal(self): + idx = self.notebook.get_current_page() + if idx < 0: + return None + tab = self.notebook.get_nth_page(idx) + if isinstance(tab, TerminalTab): + return tab.terminal + return None + + def _on_key_press(self, widget, event): + mod = event.state & Gtk.accelerator_get_default_mod_mask() + ctrl = Gdk.ModifierType.CONTROL_MASK + shift = Gdk.ModifierType.SHIFT_MASK + + # Ctrl+T: new local tab + if mod == ctrl and event.keyval == Gdk.KEY_t: + self.add_local_tab() + return True + + # Ctrl+Shift+W: close current tab + if mod == (ctrl | shift) and event.keyval in (Gdk.KEY_W, Gdk.KEY_w): + idx = self.notebook.get_current_page() + if idx >= 0: + tab = self.notebook.get_nth_page(idx) + self.close_tab(tab) + return True + + # Ctrl+Shift+C: copy + if mod == (ctrl | shift) and event.keyval in (Gdk.KEY_C, Gdk.KEY_c): + term = self._get_current_terminal() + if term: + term.copy_clipboard_format(Vte.Format.TEXT) + return True + + # Ctrl+Shift+V: paste + if mod == (ctrl | shift) and event.keyval in (Gdk.KEY_V, Gdk.KEY_v): + term = self._get_current_terminal() + if term: + term.paste_clipboard() + return True + + # Ctrl+PageUp: previous tab + if mod == ctrl and event.keyval == Gdk.KEY_Page_Up: + idx = self.notebook.get_current_page() + if idx > 0: + self.notebook.set_current_page(idx - 1) + return True + + # Ctrl+PageDown: next tab + if mod == ctrl and event.keyval == Gdk.KEY_Page_Down: + idx = self.notebook.get_current_page() + if idx < self.notebook.get_n_pages() - 1: + self.notebook.set_current_page(idx + 1) + return True + + return False + + def _on_delete_event(self, widget, event): + Gtk.main_quit() + return False + + +# ─── Main ───────────────────────────────────────────────────────────────────── + +def main(): + app = BTerminalApp() + Gtk.main() + + +if __name__ == "__main__": + main() diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..24775cb1d7355555b65e86ded7c5374634a6b972 GIT binary patch literal 26508 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 ST!%LSyKH*>V$p@$PyP$IAYe-X literal 0 HcmV?d00001 From 4268ead6a49f20d8b639c66831c5383fad65b5ea Mon Sep 17 00:00:00 2001 From: DexterFromLab Date: Thu, 5 Mar 2026 11:54:24 +0100 Subject: [PATCH 002/355] Add ctx context manager, installer, and auto-detect Claude path - ctx: SQLite-based cross-session context manager for Claude Code - install.sh: automated installer (deps, files, symlinks, DB, .desktop) - bterminal.py: replace hardcoded CLAUDE_PATH with auto-detection - README.md: rewrite in English, document ctx and installation - .gitignore: add CLAUDE.md Co-Authored-By: Claude Opus 4.6 --- .gitignore | 1 + README.md | 105 ++++++++---- bterminal.py | 14 +- ctx | 461 +++++++++++++++++++++++++++++++++++++++++++++++++++ install.sh | 93 +++++++++++ 5 files changed, 640 insertions(+), 34 deletions(-) create mode 100755 ctx create mode 100755 install.sh diff --git a/.gitignore b/.gitignore index 3bbe7b6..1546dda 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ __pycache__/ *.pyc *.pyo +CLAUDE.md diff --git a/README.md b/README.md index d543aea..d2c1f88 100644 --- a/README.md +++ b/README.md @@ -1,59 +1,98 @@ # BTerminal -Terminal z panelem sesji w stylu MobaXterm, zbudowany w GTK 3 + VTE. Catppuccin Mocha theme. +Terminal with session panel (MobaXterm-style), built with GTK 3 + VTE. Catppuccin Mocha theme. ![BTerminal](screenshot.png) -## Funkcje +## Features -- **Sesje SSH** — zapisywane konfiguracje (host, port, user, klucz, folder, kolor), CRUD z panelem bocznym -- **Claude Code** — zapisywane konfiguracje Claude Code z opcjami sudo, resume, skip-permissions i initial prompt -- **Makra SSH** — wielokrokowe makra (text, key, delay) przypisane do sesji, uruchamiane z sidebara -- **Zakładki** — wiele terminali w tabach, Ctrl+T nowy, Ctrl+Shift+W zamknij, Ctrl+PageUp/Down przełączaj -- **Sudo askpass** — Claude Code z sudo: hasło podawane raz, tymczasowy askpass helper, automatyczne czyszczenie -- **Grupowanie folderami** — sesje SSH i Claude Code mogą być grupowane w foldery na sidebarze -- **Catppuccin Mocha** — pełny theme: terminal, sidebar, taby, kolory sesji +- **SSH sessions** — saved configs (host, port, user, key, folder, color), CRUD with side panel +- **Claude Code sessions** — saved Claude Code configs with sudo, resume, skip-permissions and initial prompt +- **SSH macros** — multi-step macros (text, key, delay) assigned to sessions, run from sidebar +- **Tabs** — multiple terminals in tabs, Ctrl+T new, Ctrl+Shift+W close, Ctrl+PageUp/Down switch +- **Sudo askpass** — Claude Code with sudo: password entered once, temporary askpass helper, auto-cleanup +- **Folder grouping** — SSH and Claude Code sessions can be grouped in folders on the sidebar +- **ctx — Context manager** — SQLite-based cross-session context database for Claude Code projects +- **Catppuccin Mocha** — full theme: terminal, sidebar, tabs, session colors -## Wymagania +## Installation -``` -python3 >= 3.8 -python3-gi -gir1.2-gtk-3.0 -gir1.2-vte-2.91 +```bash +git clone https://github.com/DexterFromLab/BTerminal.git +cd BTerminal +./install.sh ``` -### Instalacja zależności (Debian/Ubuntu/Pop!_OS) +The installer will: +1. Install system dependencies (python3-gi, GTK3, VTE) +2. Copy files to `~/.local/share/bterminal/` +3. Create symlinks: `bterminal` and `ctx` in `~/.local/bin/` +4. Initialize context database at `~/.claude-context/context.db` +5. Add desktop entry to application menu + +### Manual dependency install (Debian/Ubuntu/Pop!_OS) ```bash sudo apt install python3-gi gir1.2-gtk-3.0 gir1.2-vte-2.91 ``` -## Uruchomienie +## Usage ```bash -python3 bterminal.py +bterminal ``` -## Konfiguracja +## Context Manager (ctx) -Pliki konfiguracyjne w `~/.config/bterminal/`: +`ctx` is a SQLite-based tool for managing persistent context across Claude Code sessions. -| Plik | Opis | -|------|------| -| `sessions.json` | Zapisane sesje SSH + makra | -| `claude_sessions.json` | Zapisane konfiguracje Claude Code | +```bash +ctx init myproject "Project description" /path/to/project +ctx get myproject # Load full context (shared + project) +ctx set myproject key "value" # Save a context entry +ctx shared set preferences "value" # Save shared context (available in all projects) +ctx summary myproject "What was done" # Save session summary +ctx search "query" # Full-text search across everything +ctx list # List all projects +ctx history myproject # Show session history +ctx --help # All commands +``` -## Skróty klawiszowe +### Integration with Claude Code -| Skrót | Akcja | -|-------|-------| -| `Ctrl+T` | Nowa zakładka (local shell) | -| `Ctrl+Shift+W` | Zamknij zakładkę | -| `Ctrl+Shift+C` | Kopiuj | -| `Ctrl+Shift+V` | Wklej | -| `Ctrl+PageUp/Down` | Poprzednia/następna zakładka | +Add a `CLAUDE.md` to your project root: -## Licencja +```markdown +On session start, load context: + ctx get myproject + +Save important discoveries: ctx set myproject +Before ending session: ctx summary myproject "" +``` + +Claude Code reads `CLAUDE.md` automatically and will maintain the context database. + +## Configuration + +Config files in `~/.config/bterminal/`: + +| File | Description | +|------|-------------| +| `sessions.json` | Saved SSH sessions + macros | +| `claude_sessions.json` | Saved Claude Code configs | + +Context database: `~/.claude-context/context.db` + +## Keyboard Shortcuts + +| Shortcut | Action | +|----------|--------| +| `Ctrl+T` | New tab (local shell) | +| `Ctrl+Shift+W` | Close tab | +| `Ctrl+Shift+C` | Copy | +| `Ctrl+Shift+V` | Paste | +| `Ctrl+PageUp/Down` | Previous/next tab | + +## License MIT diff --git a/bterminal.py b/bterminal.py index b844288..356dbbd 100755 --- a/bterminal.py +++ b/bterminal.py @@ -20,7 +20,19 @@ CONFIG_DIR = os.path.expanduser("~/.config/bterminal") SESSIONS_FILE = os.path.join(CONFIG_DIR, "sessions.json") CLAUDE_SESSIONS_FILE = os.path.join(CONFIG_DIR, "claude_sessions.json") SSH_PATH = "/usr/bin/ssh" -CLAUDE_PATH = "/home/bartek/.local/bin/claude" + +def _find_claude_path(): + for p in [ + os.path.expanduser("~/.local/bin/claude"), + "/usr/local/bin/claude", + "/usr/bin/claude", + ]: + if os.path.isfile(p) and os.access(p, os.X_OK): + return p + import shutil + return shutil.which("claude") or "claude" + +CLAUDE_PATH = _find_claude_path() FONT = "Monospace 11" SCROLLBACK_LINES = 10000 diff --git a/ctx b/ctx new file mode 100755 index 0000000..b54115d --- /dev/null +++ b/ctx @@ -0,0 +1,461 @@ +#!/usr/bin/env python3 +""" +ctx — Cross-session context manager for Claude Code. + +Stores project contexts and shared data in SQLite for instant access. +Usage: ctx [args] +""" + +import sqlite3 +import sys +import os +import json +from datetime import datetime, timezone +from pathlib import Path + +DB_PATH = Path.home() / ".claude-context" / "context.db" + + +def get_db(): + db = sqlite3.connect(str(DB_PATH)) + db.row_factory = sqlite3.Row + db.execute("PRAGMA journal_mode=WAL") + return db + + +def init_db(): + db = get_db() + db.executescript(""" + CREATE TABLE IF NOT EXISTS sessions ( + name TEXT PRIMARY KEY, + description TEXT, + work_dir TEXT, + created_at TEXT DEFAULT (datetime('now')) + ); + + CREATE TABLE IF NOT EXISTS contexts ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + project TEXT NOT NULL, + key TEXT NOT NULL, + value TEXT NOT NULL, + updated_at TEXT DEFAULT (datetime('now')), + UNIQUE(project, key) + ); + + CREATE TABLE IF NOT EXISTS shared ( + key TEXT PRIMARY KEY, + value TEXT NOT NULL, + updated_at TEXT DEFAULT (datetime('now')) + ); + + CREATE TABLE IF NOT EXISTS summaries ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + project TEXT NOT NULL, + summary TEXT NOT NULL, + created_at TEXT DEFAULT (datetime('now')) + ); + + CREATE VIRTUAL TABLE IF NOT EXISTS contexts_fts USING fts5( + project, key, value, content=contexts, content_rowid=id + ); + + CREATE VIRTUAL TABLE IF NOT EXISTS shared_fts USING fts5( + key, value, content=shared + ); + + -- Triggers to keep FTS in sync + CREATE TRIGGER IF NOT EXISTS contexts_ai AFTER INSERT ON contexts BEGIN + INSERT INTO contexts_fts(rowid, project, key, value) + VALUES (new.id, new.project, new.key, new.value); + END; + + CREATE TRIGGER IF NOT EXISTS contexts_ad AFTER DELETE ON contexts BEGIN + INSERT INTO contexts_fts(contexts_fts, rowid, project, key, value) + VALUES ('delete', old.id, old.project, old.key, old.value); + END; + + CREATE TRIGGER IF NOT EXISTS contexts_au AFTER UPDATE ON contexts BEGIN + INSERT INTO contexts_fts(contexts_fts, rowid, project, key, value) + VALUES ('delete', old.id, old.project, old.key, old.value); + INSERT INTO contexts_fts(rowid, project, key, value) + VALUES (new.id, new.project, new.key, new.value); + END; + """) + db.close() + + +# ─── Commands ─────────────────────────────────────────────────────────── + +def cmd_init(args): + """Register a new project. Usage: ctx init [work_dir]""" + if len(args) < 2: + print("Usage: ctx init [work_dir]") + sys.exit(1) + name, desc = args[0], args[1] + work_dir = args[2] if len(args) > 2 else None + db = get_db() + db.execute( + "INSERT OR REPLACE INTO sessions (name, description, work_dir) VALUES (?, ?, ?)", + (name, desc, work_dir), + ) + db.commit() + db.close() + print(f"Project '{name}' registered.") + + +def cmd_get(args): + """Get full context for a project (shared + project-specific + recent summaries).""" + if len(args) < 1: + print("Usage: ctx get ") + sys.exit(1) + project = args[0] + db = get_db() + + # Session info + session = db.execute("SELECT * FROM sessions WHERE name = ?", (project,)).fetchone() + + # Shared context + shared = db.execute("SELECT key, value FROM shared ORDER BY key").fetchall() + + # Project context + contexts = db.execute( + "SELECT key, value FROM contexts WHERE project = ? ORDER BY key", (project,) + ).fetchall() + + # Recent summaries (last 5) + summaries = db.execute( + "SELECT summary, created_at FROM summaries WHERE project = ? ORDER BY created_at DESC LIMIT 5", + (project,), + ).fetchall() + + # Output + print("=" * 60) + if session: + print(f"PROJECT: {session['name']} — {session['description']}") + if session["work_dir"]: + print(f"DIR: {session['work_dir']}") + else: + print(f"PROJECT: {project} (not registered, use: ctx init)") + print("=" * 60) + + if shared: + print("\n--- Shared Context ---") + for row in shared: + print(f"\n[{row['key']}]") + print(row["value"]) + + if contexts: + print(f"\n--- {project} Context ---") + for row in contexts: + print(f"\n[{row['key']}]") + print(row["value"]) + + if summaries: + print("\n--- Recent Sessions ---") + for row in reversed(summaries): + print(f"\n[{row['created_at']}]") + print(row["summary"]) + + if not shared and not contexts and not summaries: + print("\nNo context stored yet. Use 'ctx set' or 'ctx shared set' to add.") + + db.close() + + +def cmd_set(args): + """Set a project context entry. Usage: ctx set """ + if len(args) < 3: + print("Usage: ctx set ") + sys.exit(1) + project, key, value = args[0], args[1], " ".join(args[2:]) + db = get_db() + db.execute( + """INSERT INTO contexts (project, key, value, updated_at) + VALUES (?, ?, ?, datetime('now')) + ON CONFLICT(project, key) DO UPDATE SET value=excluded.value, updated_at=excluded.updated_at""", + (project, key, value), + ) + db.commit() + db.close() + print(f"[{project}] {key} = saved.") + + +def cmd_append(args): + """Append to an existing context entry. Usage: ctx append """ + if len(args) < 3: + print("Usage: ctx append ") + sys.exit(1) + project, key, new_value = args[0], args[1], " ".join(args[2:]) + db = get_db() + existing = db.execute( + "SELECT value FROM contexts WHERE project = ? AND key = ?", (project, key) + ).fetchone() + if existing: + value = existing["value"] + "\n" + new_value + else: + value = new_value + db.execute( + """INSERT INTO contexts (project, key, value, updated_at) + VALUES (?, ?, ?, datetime('now')) + ON CONFLICT(project, key) DO UPDATE SET value=excluded.value, updated_at=excluded.updated_at""", + (project, key, value), + ) + db.commit() + db.close() + print(f"[{project}] {key} += appended.") + + +def cmd_shared(args): + """Manage shared context. Usage: ctx shared get | ctx shared set """ + if len(args) < 1: + print("Usage: ctx shared get | ctx shared set ") + sys.exit(1) + + if args[0] == "get": + db = get_db() + rows = db.execute("SELECT key, value FROM shared ORDER BY key").fetchall() + db.close() + if rows: + for row in rows: + print(f"\n[{row['key']}]") + print(row["value"]) + else: + print("No shared context yet.") + + elif args[0] == "set": + if len(args) < 3: + print("Usage: ctx shared set ") + sys.exit(1) + key, value = args[1], " ".join(args[2:]) + db = get_db() + db.execute( + """INSERT INTO shared (key, value, updated_at) + VALUES (?, ?, datetime('now')) + ON CONFLICT(key) DO UPDATE SET value=excluded.value, updated_at=excluded.updated_at""", + (key, value), + ) + db.commit() + db.close() + print(f"[shared] {key} = saved.") + + elif args[0] == "delete": + if len(args) < 2: + print("Usage: ctx shared delete ") + sys.exit(1) + db = get_db() + db.execute("DELETE FROM shared WHERE key = ?", (args[1],)) + db.commit() + db.close() + print(f"[shared] {args[1]} deleted.") + else: + print("Usage: ctx shared get | ctx shared set | ctx shared delete ") + + +def cmd_summary(args): + """Save a session summary. Usage: ctx summary """ + if len(args) < 2: + print("Usage: ctx summary ") + sys.exit(1) + project, summary = args[0], " ".join(args[1:]) + db = get_db() + db.execute( + "INSERT INTO summaries (project, summary) VALUES (?, ?)", (project, summary) + ) + # Keep last 20 summaries per project + db.execute( + """DELETE FROM summaries WHERE project = ? AND id NOT IN ( + SELECT id FROM summaries WHERE project = ? ORDER BY created_at DESC LIMIT 20 + )""", + (project, project), + ) + db.commit() + db.close() + print(f"[{project}] Summary saved.") + + +def cmd_history(args): + """Show session history. Usage: ctx history [limit]""" + if len(args) < 1: + print("Usage: ctx history [limit]") + sys.exit(1) + project = args[0] + limit = int(args[1]) if len(args) > 1 else 10 + db = get_db() + rows = db.execute( + "SELECT summary, created_at FROM summaries WHERE project = ? ORDER BY created_at DESC LIMIT ?", + (project, limit), + ).fetchall() + db.close() + if rows: + for row in reversed(rows): + print(f"\n[{row['created_at']}]") + print(row["summary"]) + else: + print(f"No history for '{project}'.") + + +def cmd_search(args): + """Full-text search across all contexts. Usage: ctx search """ + if len(args) < 1: + print("Usage: ctx search ") + sys.exit(1) + query = " ".join(args) + db = get_db() + + # Search project contexts + results_ctx = db.execute( + "SELECT project, key, value FROM contexts_fts WHERE contexts_fts MATCH ?", + (query,), + ).fetchall() + + # Search shared contexts + results_shared = db.execute( + "SELECT key, value FROM shared_fts WHERE shared_fts MATCH ?", (query,) + ).fetchall() + + # Search summaries (simple LIKE since no FTS on summaries) + results_sum = db.execute( + "SELECT project, summary, created_at FROM summaries WHERE summary LIKE ?", + (f"%{query}%",), + ).fetchall() + + db.close() + + total = len(results_ctx) + len(results_shared) + len(results_sum) + print(f"Found {total} result(s) for '{query}':\n") + + if results_shared: + print("--- Shared ---") + for row in results_shared: + print(f" [{row['key']}] {row['value'][:100]}") + + if results_ctx: + print("--- Project Contexts ---") + for row in results_ctx: + print(f" [{row['project']}:{row['key']}] {row['value'][:100]}") + + if results_sum: + print("--- Summaries ---") + for row in results_sum: + print(f" [{row['project']} @ {row['created_at']}] {row['summary'][:100]}") + + +def cmd_list(args): + """List all registered projects.""" + db = get_db() + sessions = db.execute("SELECT * FROM sessions ORDER BY name").fetchall() + + # Also find projects with context but no session registration + orphans = db.execute( + """SELECT DISTINCT project FROM contexts + WHERE project NOT IN (SELECT name FROM sessions) + ORDER BY project""" + ).fetchall() + + db.close() + + if sessions: + print("Registered projects:") + for s in sessions: + ctx_count = _count_contexts(s["name"]) + print(f" {s['name']:25s} — {s['description']} ({ctx_count} entries)") + if orphans: + print("\nUnregistered (have context but no init):") + for o in orphans: + print(f" {o['project']}") + if not sessions and not orphans: + print("No projects yet. Use 'ctx init ' to start.") + + +def cmd_delete(args): + """Delete a project or specific key. Usage: ctx delete [key]""" + if len(args) < 1: + print("Usage: ctx delete [key]") + sys.exit(1) + project = args[0] + db = get_db() + if len(args) >= 2: + key = args[1] + db.execute( + "DELETE FROM contexts WHERE project = ? AND key = ?", (project, key) + ) + db.commit() + print(f"[{project}] {key} deleted.") + else: + db.execute("DELETE FROM contexts WHERE project = ?", (project,)) + db.execute("DELETE FROM summaries WHERE project = ?", (project,)) + db.execute("DELETE FROM sessions WHERE name = ?", (project,)) + db.commit() + print(f"Project '{project}' and all its data deleted.") + db.close() + + +def cmd_export(args): + """Export all data as JSON. Usage: ctx export""" + db = get_db() + data = { + "sessions": [dict(r) for r in db.execute("SELECT * FROM sessions").fetchall()], + "shared": [dict(r) for r in db.execute("SELECT * FROM shared").fetchall()], + "contexts": [dict(r) for r in db.execute("SELECT * FROM contexts").fetchall()], + "summaries": [dict(r) for r in db.execute("SELECT * FROM summaries").fetchall()], + } + db.close() + print(json.dumps(data, indent=2, ensure_ascii=False)) + + +def _count_contexts(project): + db = get_db() + row = db.execute( + "SELECT COUNT(*) as c FROM contexts WHERE project = ?", (project,) + ).fetchone() + db.close() + return row["c"] + + +# ─── Main ─────────────────────────────────────────────────────────────── + +COMMANDS = { + "init": cmd_init, + "get": cmd_get, + "set": cmd_set, + "append": cmd_append, + "shared": cmd_shared, + "summary": cmd_summary, + "history": cmd_history, + "search": cmd_search, + "list": cmd_list, + "delete": cmd_delete, + "export": cmd_export, +} + + +def print_help(): + print("ctx — Cross-session context manager for Claude Code\n") + print("Commands:") + print(" init [dir] Register a new project") + print(" get Load full context (shared + project)") + print(" set Set project context entry") + print(" append Append to existing entry") + print(" shared get|set|delete Manage shared context") + print(" summary Save session work summary") + print(" history [limit] Show session history") + print(" search Full-text search across everything") + print(" list List all projects") + print(" delete [key] Delete project or entry") + print(" export Export all data as JSON") + + +if __name__ == "__main__": + init_db() + + if len(sys.argv) < 2 or sys.argv[1] in ("-h", "--help", "help"): + print_help() + sys.exit(0) + + cmd = sys.argv[1] + if cmd not in COMMANDS: + print(f"Unknown command: {cmd}") + print_help() + sys.exit(1) + + COMMANDS[cmd](sys.argv[2:]) diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..7d5dc12 --- /dev/null +++ b/install.sh @@ -0,0 +1,93 @@ +#!/bin/bash +set -euo pipefail + +# BTerminal installer +# Installs BTerminal + ctx (Claude Code context manager) + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +INSTALL_DIR="$HOME/.local/share/bterminal" +BIN_DIR="$HOME/.local/bin" +CONFIG_DIR="$HOME/.config/bterminal" +CTX_DIR="$HOME/.claude-context" +DESKTOP_DIR="$HOME/.local/share/applications" + +echo "=== BTerminal Installer ===" +echo "" + +# ─── System dependencies ─────────────────────────────────────────────── + +echo "[1/5] Checking system dependencies..." + +MISSING=() +python3 -c "import gi" 2>/dev/null || MISSING+=("python3-gi") +python3 -c "import gi; gi.require_version('Gtk', '3.0'); from gi.repository import Gtk" 2>/dev/null || MISSING+=("gir1.2-gtk-3.0") +python3 -c "import gi; gi.require_version('Vte', '2.91'); from gi.repository import Vte" 2>/dev/null || MISSING+=("gir1.2-vte-2.91") + +if [ ${#MISSING[@]} -gt 0 ]; then + echo " Missing: ${MISSING[*]}" + echo " Installing..." + sudo apt install -y "${MISSING[@]}" +else + echo " All dependencies OK." +fi + +# ─── Install files ───────────────────────────────────────────────────── + +echo "[2/5] Installing BTerminal..." + +mkdir -p "$INSTALL_DIR" "$BIN_DIR" "$CONFIG_DIR" "$CTX_DIR" + +cp "$SCRIPT_DIR/bterminal.py" "$INSTALL_DIR/bterminal.py" +cp "$SCRIPT_DIR/ctx" "$INSTALL_DIR/ctx" +chmod +x "$INSTALL_DIR/bterminal.py" "$INSTALL_DIR/ctx" + +# ─── Symlinks ────────────────────────────────────────────────────────── + +echo "[3/5] Creating symlinks in $BIN_DIR..." + +ln -sf "$INSTALL_DIR/bterminal.py" "$BIN_DIR/bterminal" +ln -sf "$INSTALL_DIR/ctx" "$BIN_DIR/ctx" + +echo " bterminal -> $INSTALL_DIR/bterminal.py" +echo " ctx -> $INSTALL_DIR/ctx" + +# ─── Init ctx database ──────────────────────────────────────────────── + +echo "[4/5] Initializing context database..." + +if [ -f "$CTX_DIR/context.db" ]; then + echo " Database already exists, skipping." +else + "$BIN_DIR/ctx" list >/dev/null 2>&1 + echo " Created $CTX_DIR/context.db" +fi + +# ─── Desktop file ────────────────────────────────────────────────────── + +echo "[5/5] Creating desktop entry..." + +mkdir -p "$DESKTOP_DIR" +cat > "$DESKTOP_DIR/bterminal.desktop" << EOF +[Desktop Entry] +Name=BTerminal +Comment=Terminal with SSH & Claude Code session management +Exec=$BIN_DIR/bterminal +Icon=utilities-terminal +Type=Application +Categories=System;TerminalEmulator; +Terminal=false +StartupNotify=true +EOF + +echo "" +echo "=== Installation complete ===" +echo "" +echo "Run BTerminal:" +echo " bterminal" +echo "" +echo "Context manager:" +echo " ctx --help" +echo "" +echo "Make sure $BIN_DIR is in your PATH." +echo "If not, add to ~/.bashrc:" +echo " export PATH=\"\$HOME/.local/bin:\$PATH\"" From a8b854834625b5378a03de3f787d3a7d013785ef Mon Sep 17 00:00:00 2001 From: DexterFromLab Date: Thu, 5 Mar 2026 12:49:10 +0100 Subject: [PATCH 003/355] Add ctx project management to Claude Code session dialog - Project dir field with Browse button in ClaudeCodeDialog - Auto-fill session name and ctx prompt when selecting directory - Auto-initialize ctx project and generate CLAUDE.md on session save - CtxEditDialog for managing ctx entries (add/edit/delete key-value pairs) - Edit ctx accessible from dialog button and right-click context menu - Claude Code sessions now spawn in project directory instead of HOME Co-Authored-By: Claude Opus 4.6 --- bterminal.py | 335 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 333 insertions(+), 2 deletions(-) diff --git a/bterminal.py b/bterminal.py index 356dbbd..84cf5f4 100755 --- a/bterminal.py +++ b/bterminal.py @@ -8,6 +8,7 @@ gi.require_version("Gdk", "3.0") import json import os +import subprocess import tempfile import uuid @@ -653,7 +654,7 @@ class ClaudeCodeDialog(Gtk.Dialog): grid = Gtk.Grid(column_spacing=12, row_spacing=8) box.pack_start(grid, False, False, 0) - for i, text in enumerate(["Name:", "Folder:", "Color:"]): + for i, text in enumerate(["Name:", "Folder:", "Color:", "Project dir:"]): lbl = Gtk.Label(label=text, halign=Gtk.Align.END) grid.attach(lbl, 0, i, 1, 1) @@ -670,6 +671,19 @@ class ClaudeCodeDialog(Gtk.Dialog): self.color_combo.set_active(0) grid.attach(self.color_combo, 1, 2, 1, 1) + dir_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=4) + self.entry_project_dir = Gtk.Entry(hexpand=True) + self.entry_project_dir.set_placeholder_text("(optional) path to project directory") + dir_box.pack_start(self.entry_project_dir, True, True, 0) + btn_browse = Gtk.Button(label="Browse…") + btn_browse.connect("clicked", self._on_browse_dir) + dir_box.pack_start(btn_browse, False, False, 0) + grid.attach(dir_box, 1, 3, 1, 1) + + self.btn_edit_ctx = Gtk.Button(label="Edit ctx entries\u2026") + self.btn_edit_ctx.connect("clicked", self._on_edit_ctx) + grid.attach(self.btn_edit_ctx, 1, 4, 1, 1) + # Separator box.pack_start(Gtk.Separator(), False, False, 2) @@ -708,6 +722,7 @@ class ClaudeCodeDialog(Gtk.Dialog): self.chk_sudo.set_active(session.get("sudo", False)) self.chk_resume.set_active(session.get("resume", True)) self.chk_skip_perms.set_active(session.get("skip_permissions", True)) + self.entry_project_dir.set_text(session.get("project_dir", "")) prompt = session.get("prompt", "") if prompt: self.textview.get_buffer().set_text(prompt) @@ -726,6 +741,7 @@ class ClaudeCodeDialog(Gtk.Dialog): "resume": self.chk_resume.get_active(), "skip_permissions": self.chk_skip_perms.get_active(), "prompt": prompt, + "project_dir": self.entry_project_dir.get_text().strip(), } def validate(self): @@ -746,6 +762,300 @@ class ClaudeCodeDialog(Gtk.Dialog): dlg.run() dlg.destroy() + def _on_edit_ctx(self, button): + project_dir = self.entry_project_dir.get_text().strip() + if not project_dir: + self._show_error("Set project directory first.") + return + ctx_project = os.path.basename(project_dir.rstrip("/")) + dlg = CtxEditDialog(self, ctx_project, project_dir) + dlg.run() + dlg.destroy() + + def _on_browse_dir(self, button): + dlg = Gtk.FileChooserDialog( + title="Select project directory", + parent=self, + action=Gtk.FileChooserAction.SELECT_FOLDER, + ) + dlg.add_buttons( + Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, + Gtk.STOCK_OPEN, Gtk.ResponseType.OK, + ) + if dlg.run() == Gtk.ResponseType.OK: + path = dlg.get_filename() + self.entry_project_dir.set_text(path) + basename = os.path.basename(path.rstrip("/")) + if not self.entry_name.get_text().strip(): + self.entry_name.set_text(basename) + # Auto-fill prompt with ctx instructions if empty or auto-generated + buf = self.textview.get_buffer() + start, end = buf.get_bounds() + current = buf.get_text(start, end, False).strip() + if not current or current.startswith("Wczytaj kontekst"): + prompt = ( + f"Wczytaj kontekst projektu poleceniem: ctx get {basename}\n" + f"Wykonaj tę komendę i zapoznaj się z kontekstem zanim zaczniesz pracę.\n" + f"Kontekst zarządzasz przez: ctx --help\n" + f"Ważne odkrycia zapisuj: ctx set {basename} \n" + f"Przed zakończeniem sesji: ctx summary {basename} \"\"" + ) + buf.set_text(prompt) + dlg.destroy() + + @staticmethod + def _detect_description(project_dir): + for name in ["README.md", "README.rst", "README.txt", "README"]: + readme_path = os.path.join(project_dir, name) + if os.path.isfile(readme_path): + try: + with open(readme_path, "r") as f: + for line in f: + line = line.strip().lstrip("#").strip() + if line: + return line[:100] + except (IOError, UnicodeDecodeError): + pass + return os.path.basename(project_dir.rstrip("/")) + + def setup_ctx(self): + """Auto-initialize ctx project and generate CLAUDE.md if project_dir is set.""" + project_dir = self.entry_project_dir.get_text().strip() + if not project_dir: + return + ctx_project = os.path.basename(project_dir.rstrip("/")) + ctx_desc = self._detect_description(project_dir) + try: + subprocess.run( + ["ctx", "init", ctx_project, ctx_desc, project_dir], + check=True, capture_output=True, text=True, + ) + except (subprocess.CalledProcessError, FileNotFoundError): + return + claude_md = os.path.join(project_dir, "CLAUDE.md") + if not os.path.exists(claude_md): + claude_content = ( + f"# {ctx_project}\n\n" + f"On session start, load context:\n" + f"```bash\n" + f"ctx get {ctx_project}\n" + f"```\n\n" + f"Context manager: `ctx --help`\n\n" + f"During work:\n" + f"- Save important discoveries: `ctx set {ctx_project} `\n" + f"- Append to existing: `ctx append {ctx_project} `\n" + f"- Before ending session: `ctx summary {ctx_project} \"\"`\n" + ) + try: + with open(claude_md, "w") as f: + f.write(claude_content) + except IOError: + pass + + +# ─── CtxEditDialog ──────────────────────────────────────────────────────────── + + +CTX_DB = os.path.join(os.path.expanduser("~"), ".claude-context", "context.db") + + +class _CtxEntryDialog(Gtk.Dialog): + """Small dialog for adding/editing a ctx key-value entry.""" + + def __init__(self, parent, title, key="", value=""): + super().__init__( + title=title, + transient_for=parent, + modal=True, + destroy_with_parent=True, + ) + self.add_buttons( + Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, + Gtk.STOCK_OK, Gtk.ResponseType.OK, + ) + self.set_default_size(400, -1) + self.set_default_response(Gtk.ResponseType.OK) + + box = self.get_content_area() + box.set_border_width(12) + box.set_spacing(8) + + grid = Gtk.Grid(column_spacing=12, row_spacing=8) + box.pack_start(grid, True, True, 0) + + grid.attach(Gtk.Label(label="Key:", halign=Gtk.Align.END), 0, 0, 1, 1) + self.entry_key = Gtk.Entry(hexpand=True) + self.entry_key.set_text(key) + grid.attach(self.entry_key, 1, 0, 1, 1) + + grid.attach(Gtk.Label(label="Value:", halign=Gtk.Align.END, valign=Gtk.Align.START), 0, 1, 1, 1) + scrolled = Gtk.ScrolledWindow() + scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + scrolled.set_min_content_height(100) + self.textview = Gtk.TextView() + self.textview.set_wrap_mode(Gtk.WrapMode.WORD_CHAR) + if value: + self.textview.get_buffer().set_text(value) + scrolled.add(self.textview) + grid.attach(scrolled, 1, 1, 1, 1) + + self.show_all() + + def get_data(self): + key = self.entry_key.get_text().strip() + buf = self.textview.get_buffer() + start, end = buf.get_bounds() + value = buf.get_text(start, end, False).strip() + return key, value + + +class CtxEditDialog(Gtk.Dialog): + """Dialog to view and edit ctx project entries.""" + + def __init__(self, parent, ctx_project, project_dir=""): + super().__init__( + title=f"Ctx: {ctx_project}", + transient_for=parent, + modal=True, + destroy_with_parent=True, + ) + self.add_buttons(Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE) + self.set_default_size(550, 400) + self.ctx_project = ctx_project + self.project_dir = project_dir + + box = self.get_content_area() + box.set_border_width(12) + box.set_spacing(8) + + # Description + desc_box = Gtk.Box(spacing=8) + desc_box.pack_start(Gtk.Label(label="Description:"), False, False, 0) + self.entry_desc = Gtk.Entry(hexpand=True) + desc_box.pack_start(self.entry_desc, True, True, 0) + btn_save_desc = Gtk.Button(label="Save") + btn_save_desc.connect("clicked", self._on_save_desc) + desc_box.pack_start(btn_save_desc, False, False, 0) + box.pack_start(desc_box, False, False, 0) + + box.pack_start(Gtk.Separator(), False, False, 2) + + # Entries list + self.store = Gtk.ListStore(str, str) + self.tree = Gtk.TreeView(model=self.store) + self.tree.set_headers_visible(True) + + renderer_key = Gtk.CellRendererText() + col_key = Gtk.TreeViewColumn("Key", renderer_key, text=0) + col_key.set_min_width(120) + self.tree.append_column(col_key) + + renderer_val = Gtk.CellRendererText() + renderer_val.set_property("ellipsize", Pango.EllipsizeMode.END) + col_val = Gtk.TreeViewColumn("Value", renderer_val, text=1) + col_val.set_expand(True) + self.tree.append_column(col_val) + + scrolled = Gtk.ScrolledWindow() + scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + scrolled.add(self.tree) + box.pack_start(scrolled, True, True, 0) + + # Buttons + btn_box = Gtk.Box(spacing=4) + for label_text, cb in [("Add", self._on_add), ("Edit", self._on_edit), ("Delete", self._on_delete)]: + btn = Gtk.Button(label=label_text) + btn.connect("clicked", cb) + btn_box.pack_start(btn, True, True, 0) + box.pack_start(btn_box, False, False, 0) + + self._load_data() + self.show_all() + + def _load_data(self): + import sqlite3 + self.store.clear() + if not os.path.exists(CTX_DB): + return + db = sqlite3.connect(CTX_DB) + db.row_factory = sqlite3.Row + session = db.execute( + "SELECT description FROM sessions WHERE name = ?", (self.ctx_project,) + ).fetchone() + if session: + self.entry_desc.set_text(session["description"] or "") + entries = db.execute( + "SELECT key, value FROM contexts WHERE project = ? ORDER BY key", + (self.ctx_project,), + ).fetchall() + for row in entries: + self.store.append([row["key"], row["value"]]) + db.close() + + def _on_save_desc(self, button): + desc = self.entry_desc.get_text().strip() + if desc: + subprocess.run( + ["ctx", "init", self.ctx_project, desc, self.project_dir], + capture_output=True, text=True, + ) + + def _on_add(self, button): + dlg = _CtxEntryDialog(self, "Add entry") + if dlg.run() == Gtk.ResponseType.OK: + key, value = dlg.get_data() + if key: + subprocess.run( + ["ctx", "set", self.ctx_project, key, value], + capture_output=True, text=True, + ) + self._load_data() + dlg.destroy() + + def _on_edit(self, button): + sel = self.tree.get_selection() + model, it = sel.get_selected() + if it is None: + return + old_key = model.get_value(it, 0) + old_value = model.get_value(it, 1) + dlg = _CtxEntryDialog(self, "Edit entry", old_key, old_value) + if dlg.run() == Gtk.ResponseType.OK: + key, value = dlg.get_data() + if key: + if key != old_key: + subprocess.run( + ["ctx", "delete", self.ctx_project, old_key], + capture_output=True, text=True, + ) + subprocess.run( + ["ctx", "set", self.ctx_project, key, value], + capture_output=True, text=True, + ) + self._load_data() + dlg.destroy() + + def _on_delete(self, button): + sel = self.tree.get_selection() + model, it = sel.get_selected() + if it is None: + return + key = model.get_value(it, 0) + dlg = Gtk.MessageDialog( + transient_for=self, + modal=True, + message_type=Gtk.MessageType.QUESTION, + buttons=Gtk.ButtonsType.YES_NO, + text=f'Delete entry "{key}"?', + ) + if dlg.run() == Gtk.ResponseType.YES: + subprocess.run( + ["ctx", "delete", self.ctx_project, key], + capture_output=True, text=True, + ) + self._load_data() + dlg.destroy() + # ─── TerminalTab ────────────────────────────────────────────────────────────── @@ -880,9 +1190,10 @@ class TerminalTab(Gtk.Box): else: script = f'{CLAUDE_PATH} {flags_str}{prompt_arg}\nexec bash\n' + work_dir = config.get("project_dir") or os.environ.get("HOME", "/") self.terminal.spawn_async( Vte.PtyFlags.DEFAULT, - os.environ.get("HOME", "/"), + work_dir, ["/bin/bash", "-c", script], None, GLib.SpawnFlags.DEFAULT, @@ -1286,6 +1597,12 @@ class SessionSidebar(Gtk.Box): item_delete.connect("activate", lambda _, cid=claude_id: self._delete_claude(cid)) menu.append(item_delete) + menu.append(Gtk.SeparatorMenuItem()) + + item_ctx = Gtk.MenuItem(label="Edit ctx\u2026") + item_ctx.connect("activate", lambda _, cid=claude_id: self._edit_ctx(cid)) + menu.append(item_ctx) + menu.show_all() menu.popup_at_pointer(event) @@ -1341,6 +1658,7 @@ class SessionSidebar(Gtk.Box): if resp != Gtk.ResponseType.OK: break if dlg.validate(): + dlg.setup_ctx() self.app.claude_manager.add(dlg.get_data()) self.refresh() break @@ -1482,6 +1800,18 @@ class SessionSidebar(Gtk.Box): # ── Claude Code CRUD ── + def _edit_ctx(self, claude_id): + config = self.app.claude_manager.get(claude_id) + if not config: + return + project_dir = config.get("project_dir", "") + if not project_dir: + return + ctx_project = os.path.basename(project_dir.rstrip("/")) + dlg = CtxEditDialog(self.app, ctx_project, project_dir) + dlg.run() + dlg.destroy() + def _connect_claude(self, claude_id): config = self.app.claude_manager.get(claude_id) if config: @@ -1497,6 +1827,7 @@ class SessionSidebar(Gtk.Box): if resp != Gtk.ResponseType.OK: break if dlg.validate(): + dlg.setup_ctx() data = dlg.get_data() self.app.claude_manager.update(claude_id, data) self.refresh() From 20fc27fbdf45b8fba68993a1cf442e706be835c8 Mon Sep 17 00:00:00 2001 From: DexterFromLab Date: Thu, 5 Mar 2026 13:12:30 +0100 Subject: [PATCH 004/355] Migrate to Gtk.Application for proper app lifecycle and custom icon Co-Authored-By: Claude Opus 4.6 --- bterminal.py | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/bterminal.py b/bterminal.py index 84cf5f4..3888a3d 100755 --- a/bterminal.py +++ b/bterminal.py @@ -1860,7 +1860,7 @@ class BTerminalApp(Gtk.Window): def __init__(self): super().__init__(title=APP_NAME) self.set_default_size(1200, 700) - self.set_icon_name("utilities-terminal") + self.set_icon_name("bterminal") # Apply CSS css_provider = Gtk.CssProvider() @@ -2062,15 +2062,30 @@ class BTerminalApp(Gtk.Window): return False def _on_delete_event(self, widget, event): - Gtk.main_quit() return False # ─── Main ───────────────────────────────────────────────────────────────────── def main(): - app = BTerminalApp() - Gtk.main() + GLib.set_prgname("bterminal") + GLib.set_application_name("BTerminal") + + application = Gtk.Application( + application_id="com.github.DexterFromLab.BTerminal", + flags=Gio.ApplicationFlags.FLAGS_NONE, + ) + + def on_activate(app): + windows = app.get_windows() + if windows: + windows[0].present() + return + win = BTerminalApp() + app.add_window(win) + + application.connect("activate", on_activate) + application.run(None) if __name__ == "__main__": From 416da1a79cd2d9110bc340a7fff811cbf566f2ce Mon Sep 17 00:00:00 2001 From: DexterFromLab Date: Thu, 5 Mar 2026 13:25:03 +0100 Subject: [PATCH 005/355] Add bterminal icon to installer and desktop entry The SVG icon was installed locally but missing from the repo. Installer now copies it to ~/.local/share/icons/ and desktop entry uses the correct icon name. Co-Authored-By: Claude Opus 4.6 --- bterminal.svg | 19 +++++++++++++++++++ install.sh | 6 ++++-- 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 bterminal.svg diff --git a/bterminal.svg b/bterminal.svg new file mode 100644 index 0000000..5f9459d --- /dev/null +++ b/bterminal.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/install.sh b/install.sh index 7d5dc12..f271f5c 100755 --- a/install.sh +++ b/install.sh @@ -9,6 +9,7 @@ INSTALL_DIR="$HOME/.local/share/bterminal" BIN_DIR="$HOME/.local/bin" CONFIG_DIR="$HOME/.config/bterminal" CTX_DIR="$HOME/.claude-context" +ICON_DIR="$HOME/.local/share/icons/hicolor/scalable/apps" DESKTOP_DIR="$HOME/.local/share/applications" echo "=== BTerminal Installer ===" @@ -35,10 +36,11 @@ fi echo "[2/5] Installing BTerminal..." -mkdir -p "$INSTALL_DIR" "$BIN_DIR" "$CONFIG_DIR" "$CTX_DIR" +mkdir -p "$INSTALL_DIR" "$BIN_DIR" "$CONFIG_DIR" "$CTX_DIR" "$ICON_DIR" cp "$SCRIPT_DIR/bterminal.py" "$INSTALL_DIR/bterminal.py" cp "$SCRIPT_DIR/ctx" "$INSTALL_DIR/ctx" +cp "$SCRIPT_DIR/bterminal.svg" "$ICON_DIR/bterminal.svg" chmod +x "$INSTALL_DIR/bterminal.py" "$INSTALL_DIR/ctx" # ─── Symlinks ────────────────────────────────────────────────────────── @@ -72,7 +74,7 @@ cat > "$DESKTOP_DIR/bterminal.desktop" << EOF Name=BTerminal Comment=Terminal with SSH & Claude Code session management Exec=$BIN_DIR/bterminal -Icon=utilities-terminal +Icon=bterminal Type=Application Categories=System;TerminalEmulator; Terminal=false From 70f8030ae476089a5633f8c2bb01e73476bcfdb4 Mon Sep 17 00:00:00 2001 From: DexterFromLab Date: Thu, 5 Mar 2026 13:26:53 +0100 Subject: [PATCH 006/355] Update screenshot with current UI showing Claude Code session Co-Authored-By: Claude Opus 4.6 --- screenshot.png | Bin 26508 -> 103553 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/screenshot.png b/screenshot.png index 24775cb1d7355555b65e86ded7c5374634a6b972..d9c4ee45c104855f0762d1445a29ded9596cc3eb 100644 GIT binary patch literal 103553 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 Kg^LA0di@Vv9hTYv literal 26508 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 ST!%LSyKH*>V$p@$PyP$IAYe-X From 2723fbf4be6f534d239582e646cac2a2e54fe040 Mon Sep 17 00:00:00 2001 From: Hibryda Date: Thu, 5 Mar 2026 22:49:00 +0100 Subject: [PATCH 007/355] docs: add v2 architecture planning and research findings Architecture decision: Tauri 2.x + Svelte 5 + Claude Agent SDK (Node.js sidecar). Includes research on Agent SDK streaming, xterm.js performance, WebKit2GTK limitations, and adversarial review corrections (two-tier observation, Svelte 5 over Solid.js, SDK abstraction layer). Six implementation phases defined, MVP = Phases 1-4. --- docs/findings.md | 209 ++++++++++++++++++++++++++++++++++++++++++++++ docs/phases.md | 177 +++++++++++++++++++++++++++++++++++++++ docs/progress.md | 37 ++++++++ docs/task_plan.md | 158 +++++++++++++++++++++++++++++++++++ 4 files changed, 581 insertions(+) create mode 100644 docs/findings.md create mode 100644 docs/phases.md create mode 100644 docs/progress.md create mode 100644 docs/task_plan.md diff --git a/docs/findings.md b/docs/findings.md new file mode 100644 index 0000000..613ca92 --- /dev/null +++ b/docs/findings.md @@ -0,0 +1,209 @@ +# BTerminal v2 — Research Findings + +## 1. Claude Agent SDK — The Foundation + +**Source:** https://platform.claude.com/docs/en/agent-sdk/overview + +The Claude Agent SDK (formerly Claude Code SDK, renamed Sept 2025) provides everything we need: + +### Streaming API +```typescript +import { query } from "@anthropic-ai/claude-agent-sdk"; + +for await (const message of query({ + prompt: "Fix the bug", + options: { allowedTools: ["Read", "Edit", "Bash"] } +})) { + // Each message is structured, typed, parseable + console.log(message); +} +``` + +### Subagent Detection +Messages from subagents include `parent_tool_use_id`: +```typescript +// Check for subagent invocation +for (const block of msg.message?.content ?? []) { + if (block.type === "tool_use" && block.name === "Task") { + console.log(`Subagent invoked: ${block.input.subagent_type}`); + } +} +// Check if message is from within a subagent +if (msg.parent_tool_use_id) { + console.log("Running inside subagent"); +} +``` + +### Session Management +- `session_id` captured from init message +- Resume with `options: { resume: sessionId }` +- Subagent transcripts persist independently + +### Hooks +`PreToolUse`, `PostToolUse`, `Stop`, `SessionStart`, `SessionEnd`, `UserPromptSubmit` + +### Telemetry +Every `SDKResultMessage` contains: `total_cost_usd`, `duration_ms`, per-model `modelUsage` breakdowns. + +### Key Insight +**We don't need terminal emulation for SDK agents.** The SDK gives us structured data — we can render it as rich UI (markdown, diff views, file cards, agent trees) instead of raw terminal text. Terminal emulation (xterm.js) is only needed for SSH, local shell, and legacy Claude CLI sessions. + +--- + +## 2. Tauri + xterm.js — Proven Stack + +### Existing Projects +- **tauri-terminal** (github.com/marc2332/tauri-terminal) — basic Tauri + xterm.js + portable-pty +- **Terminon** (github.com/Shabari-K-S/terminon) — Tauri v2 + React + xterm.js, SSH profiles, split panes +- **terraphim-liquid-glass-terminal** — Tauri + xterm.js with design effects +- **tauri-plugin-pty** (github.com/Tnze/tauri-plugin-pty) — PTY plugin for Tauri 2, xterm.js bridge + +### Integration Pattern +``` +Frontend (xterm.js) ←→ Tauri IPC ←→ Rust PTY (portable-pty) ←→ Shell/SSH/Claude +``` +- `pty.onData()` → `term.write()` (output) +- `term.onData()` → `pty.write()` (input) + +### Tauri IPC Latency +- Linux: ~5ms for typical payloads (serialization-free IPC in v2) +- For terminal output: irrelevant. Claude outputs text at human-readable speed. +- For keystroke echo: 5ms + xterm.js render = ~10-15ms total. Acceptable. + +--- + +## 3. Terminal Performance Context + +### Native Terminal Latency (for reference) +| Terminal | Latency | Notes | +|---|---|---| +| xterm (native) | ~10ms | Gold standard | +| Alacritty | ~12ms | GPU-rendered Rust | +| Kitty | ~13ms | GPU-rendered | +| VTE (GNOME Terminal) | ~50ms | GTK3/4, spikes above | +| Hyper (Electron+xterm.js) | ~40ms | Web-based worst case | + +### Throughput (find /usr benchmark) +All within 0.5s of each other: xterm 2.2s, alacritty 2.2s, wezterm 2.8s. "Not meaningfully different to a human." + +### Memory +- Alacritty: ~30MB +- WezTerm: ~45MB +- xterm (native): ~5MB + +### Verdict for BTerminal v2 +xterm.js in Tauri will be ~20-30ms latency, ~40MB per terminal instance. For Claude sessions (AI output, not vim), this is perfectly fine. The VTE we currently use in GTK3 is actually *slower* at ~50ms. + +--- + +## 4. Zellij Architecture (Inspiration) + +**Source:** Research agent findings + +Zellij uses WASM plugins for extensibility: +- Plugins communicate via message passing at WASM boundary +- Permission model controls what plugins can access +- Event types for rendering, input, lifecycle +- Layout defined in KDL files + +**Relevance:** We don't need WASM plugins. Our "plugins" are just different pane types (terminal, agent, markdown). But the layout concept (KDL or JSON layout definitions) is worth borrowing for saved layouts. + +--- + +## 5. 32:9 Ultrawide Design Patterns + +**Key Insight:** 5120px width ÷ ~600px per useful pane = ~8 panes max, ~4-5 comfortable. + +**Layout Philosophy:** +- Center of screen = primary attention (1-2 main agent panes) +- Left edge = navigation (session sidebar, 250-300px) +- Right edge = context (agent tree, file viewer, 350-450px) +- Never use tabs for primary content — everything visible +- Tabs only for switching between saved layouts + +**Interaction Model:** +- Click sidebar session → opens in next available pane slot +- Agent spawns subagent → new pane auto-appears (or tree node if panes full) +- File reference in agent output → click to open markdown viewer pane +- Drag pane borders to resize +- Keyboard: Ctrl+1-8 to focus pane, Ctrl+Shift+Arrow to move pane + +--- + +## 6. Frontend Framework Choice + +### Why Solid.js +- **Fine-grained reactivity** — updates only the DOM nodes that changed, not the component tree +- **No VDOM** — critical when we have 4-8 panes each streaming data +- **Small bundle** — ~7KB vs React's ~40KB +- **JSX familiar** — easy for anyone who knows React +- **Signals** — perfect for streaming agent state + +### Alternative: Svelte +- Also no VDOM, also reactive, slightly larger community +- Slightly more ceremony for stores/state management +- Would also work, personal preference + +### NOT React +- VDOM reconciliation across 4-8 simultaneously updating panes = CPU waste +- Larger bundle +- State management complexity (need Redux/Zustand for cross-pane state) + +--- + +## 7. Key Technical Risks + +| Risk | Mitigation | +|---|---| +| **WebKit2GTK has NO WebGL** — xterm.js falls back to Canvas on Linux | Use xterm.js Canvas addon explicitly. For AI output (not vim), Canvas at 60fps is fine. | +| xterm.js performance with 4+ instances (Canvas mode) | Lazy init (create xterm only when pane visible), limit to 4-6 active terminals | +| Agent SDK TS package may not run in Tauri's webview | Run SDK in Rust sidecar process, stream to frontend via Tauri events | +| Tauri IPC bottleneck with high-throughput agent output | Batch messages, use Tauri events (push) not commands (pull) | +| File watcher flooding on rapid saves | Debounce 200ms in Rust before sending to frontend | +| Layout state persistence across restarts | SQLite for sessions + layout, atomic writes | +| Tauri multi-webview behind `unstable` flag | Single webview with CSS Grid panes, not multiple webviews | + +--- + +## 8. Claude Code CLI Observation (Alternative to SDK) + +**Critical discovery:** We can observe ANY running Claude Code session (even interactive CLI ones) via two mechanisms: + +### A. `stream-json` output mode +```bash +claude -p "fix the bug" --output-format stream-json +``` +Emits typed events: `stream_event`, `assistant`, `user`, `system` (init carries session_id), `result`. + +### B. JSONL session file tailing +Session files live at `~/.claude/projects//.jsonl`. Append-only, written immediately. Can be `tail -f`'d for external observation. + +Path encoding: `/home/user/project` → `-home-user-project` + +### C. Hooks (SDK only) +`SubagentStart`, `SubagentStop` (gives `agent_transcript_path`), `PreToolUse`, `PostToolUse`, `Stop`, `Notification`, `TeammateIdle` + +### Implication for BTerminal v2 +**Three observation tiers:** +1. **SDK sessions** (best): Full structured streaming, subagent detection, hooks, cost tracking +2. **CLI sessions with stream-json** (good): Structured output, but requires spawning claude with `-p` flag (non-interactive) +3. **Interactive CLI sessions** (fallback): Tail JSONL session files + show terminal via xterm.js + +--- + +## 9. Agent Teams (Experimental) + +`CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` enables full independent Claude Code instances sharing a task list and mailbox. + +- 3-5 teammates is the practical sweet spot (linear token cost) +- Display modes: in-process (Shift+Down cycles), tmux (own pane each), auto +- Session resumption is broken for in-process teammates +- BTerminal v2 could become the ideal frontend for Agent Teams — each teammate gets its own pane + +--- + +## 10. Competing Approaches + +- **claude-squad** (Go+tmux): Most adopted multi-agent manager. BTerminal v2 would replace this. +- **agent-deck**: MCP socket pooling (~85-90% memory savings). Could integrate as backend. +- **Git worktrees**: Dominant isolation strategy for parallel Claude sessions. BTerminal should support spawning agents in worktrees. diff --git a/docs/phases.md b/docs/phases.md new file mode 100644 index 0000000..9acc73d --- /dev/null +++ b/docs/phases.md @@ -0,0 +1,177 @@ +# BTerminal v2 — Implementation Phases + +See [task_plan.md](task_plan.md) for architecture decisions, error handling, and testing strategy. + +--- + +## Phase 1: Project Scaffolding [status: not_started] — MVP + +- [ ] Create feature branch `v2-mission-control` +- [ ] Initialize Tauri 2.x project with Svelte 5 frontend +- [ ] Project structure (see below) +- [ ] Basic Tauri window with Catppuccin Mocha CSS variables +- [ ] Verify Tauri builds and launches on target system +- [ ] Set up dev scripts (dev, build, lint) + +### File Structure +``` +bterminal-v2/ + src-tauri/ + src/ + main.rs # Tauri app entry + pty.rs # PTY management (portable-pty, not plugin) + sidecar.rs # Node.js sidecar lifecycle (spawn, restart, health) + watcher.rs # File watcher for markdown viewer + session.rs # Session persistence (SQLite via rusqlite) + Cargo.toml + src/ + App.svelte # Root layout + lib/ + components/ + Layout/ + TilingGrid.svelte # Dynamic tiling manager + PaneContainer.svelte # Individual pane wrapper + PaneHeader.svelte # Pane title bar with controls + Terminal/ + TerminalPane.svelte # xterm.js terminal pane + Agent/ + AgentPane.svelte # SDK agent structured output + AgentTree.svelte # Subagent tree visualization + ToolCallCard.svelte # Individual tool call display + Markdown/ + MarkdownPane.svelte # Live markdown file viewer + Sidebar/ + SessionList.svelte # Session browser + stores/ + sessions.ts # Session state ($state runes) + agents.ts # Active agent tracking + layout.ts # Pane layout state + adapters/ + sdk-messages.ts # SDK message abstraction layer + pty-bridge.ts # PTY IPC wrapper + styles/ + catppuccin.css # Theme CSS variables + app.css + sidecar/ + agent-runner.ts # Node.js sidecar entry point + package.json # Agent SDK dependency + esbuild.config.ts # Bundle to single file + package.json + svelte.config.js + vite.config.ts + tauri.conf.json +``` + +**Key change from v1:** Using portable-pty directly from Rust instead of tauri-plugin-pty (38-star community plugin). portable-pty is well-maintained (used by WezTerm). More work upfront, more reliable long-term. + +--- + +## Phase 2: Terminal Pane + Layout [status: not_started] — MVP + +### Layout (responsive) + +**32:9 (5120px) — full density:** +``` ++--------+------------------------------------+--------+ +|Sidebar | 2-4 panes, CSS Grid, resizable | Right | +| 260px | | 380px | ++--------+------------------------------------+--------+ +``` + +**16:9 (1920px) — degraded but functional:** +``` ++--------+-------------------------+ +|Sidebar | 1-2 panes | (right panel collapses to overlay) +| 240px | | ++--------+-------------------------+ +``` + +- [ ] CSS Grid layout with sidebar + main area + optional right panel +- [ ] Responsive breakpoints (ultrawide / standard / narrow) +- [ ] Pane resize via drag handles (use CSS `resize` or lightweight lib) +- [ ] Layout presets: 1-col, 2-col, 3-col, 2x2, master+stack +- [ ] Save/restore layout to SQLite +- [ ] Keyboard: Ctrl+1-4 focus pane, Ctrl+Shift+arrows move + +### Terminal +- [ ] xterm.js with Canvas addon (explicit — no WebGL dependency) +- [ ] Catppuccin Mocha theme for xterm.js +- [ ] PTY spawn from Rust (portable-pty), stream to frontend via Tauri events +- [ ] Terminal resize -> PTY resize +- [ ] Copy/paste (Ctrl+Shift+C/V) +- [ ] SSH session: spawn `ssh` command in PTY +- [ ] Local shell: spawn user's $SHELL +- [ ] Claude Code CLI: spawn `claude` in PTY (fallback mode) + +**Milestone: After Phase 2, we have a working multi-pane terminal.** Usable as a daily driver even without agent features. + +--- + +## Phase 3: Agent SDK Integration [status: not_started] — MVP + +- [ ] Node.js sidecar: thin wrapper around Agent SDK `query()` +- [ ] Sidecar communication: Rust spawns Node.js, stdio NDJSON +- [ ] Sidecar lifecycle: spawn on demand, detect crash, restart +- [ ] SDK message adapter (abstraction layer) +- [ ] Agent pane: renders structured messages + - Text -> markdown rendered + - Tool calls -> collapsible cards (tool name + input + output) + - Subagent spawn -> tree node + optional new pane + - Errors -> highlighted error card + - Cost/tokens -> pane header metrics +- [ ] Auto-scroll with scroll-lock on user scroll-up +- [ ] Agent status indicator (running/thinking/waiting/done/error) +- [ ] Start/stop/cancel agent from UI +- [ ] Session resume (SDK `resume: sessionId`) + +**Milestone: After Phase 3, we have the core differentiator.** SDK agents run in structured panes alongside raw terminals. + +--- + +## Phase 4: Session Management + Markdown Viewer [status: not_started] — MVP + +### Sessions +- [ ] SQLite persistence for sessions (rusqlite) +- [ ] Session types: SSH, Claude CLI, Agent SDK, Local Shell +- [ ] Session CRUD in sidebar +- [ ] Session groups/folders +- [ ] Remember last layout on restart + +### Markdown Viewer +- [ ] File watcher (notify crate) -> Tauri events -> frontend +- [ ] Markdown rendering (marked.js or remark) +- [ ] Syntax highlighting (Shiki) +- [ ] Open from sidebar or from agent output file references +- [ ] Debounce file watcher (200ms) + +**Milestone: After Phase 4 = MVP ship.** Full session management, structured agent panes, terminal panes, markdown viewer. + +--- + +## Phase 5: Agent Tree + Polish [status: not_started] — Post-MVP + +- [ ] Agent tree visualization (SVG, compact horizontal layout) +- [ ] Click tree node -> focus agent pane +- [ ] Aggregate cost per subtree +- [ ] Global status bar (total cost, active agents, uptime) +- [ ] Notification system (agent done, error) +- [ ] Global keyboard shortcuts +- [ ] Settings dialog +- [ ] ctx integration (port from v1) + +--- + +## Phase 6: Packaging + Distribution [status: not_started] — Post-MVP + +- [ ] install.sh v2 (check Node.js, install Tauri runtime deps) +- [ ] AppImage build (single file, works everywhere) +- [ ] .deb package (Debian/Ubuntu) +- [ ] GitHub Actions CI for building releases +- [ ] Auto-update mechanism (Tauri updater) +- [ ] Migrate bterminal.svg icon +- [ ] README update + +### System Requirements +- Node.js 20+ (for Agent SDK sidecar) +- WebKit2GTK 4.1+ (Tauri runtime) +- Linux x86_64 (primary target) diff --git a/docs/progress.md b/docs/progress.md new file mode 100644 index 0000000..4d35770 --- /dev/null +++ b/docs/progress.md @@ -0,0 +1,37 @@ +# BTerminal v2 — Progress Log + +## Session: 2026-03-05 + +### Research Phase (complete) +- [x] Analyzed current BTerminal v1 codebase (2092 lines Python, GTK3+VTE) +- [x] Queried Memora — no existing BTerminal memories +- [x] Researched Claude Agent SDK — found structured streaming, subagent tracking, hooks +- [x] Researched Tauri + xterm.js ecosystem — found 4+ working projects +- [x] Researched terminal latency benchmarks — xterm.js acceptable for AI output +- [x] Researched 32:9 ultrawide layout patterns +- [x] Evaluated GTK4 vs Tauri vs pure Rust — Tauri wins for this use case +- [x] Created task_plan.md with 8 phases +- [x] Created findings.md with 7 research areas + +### Technology Decision (complete) +- Decision: **Tauri 2.x + Solid.js + Claude Agent SDK + xterm.js** +- Rationale documented in task_plan.md Phase 0 + +### Adversarial Review (complete) +- [x] Spawned devil's advocate agent to attack the plan +- [x] Identified 5 fatal/critical issues: + 1. Node.js sidecar requirement unacknowledged + 2. SDK 0.2.x instability — need abstraction layer + 3. Three-tier observation overengineered → simplified to two-tier + 4. Solid.js ecosystem too small → switched to Svelte 5 + 5. Missing: packaging, error handling, testing, responsive design +- [x] Revised plan (Rev 2) incorporating all corrections +- [x] Added error handling strategy table +- [x] Added testing strategy table +- [x] Defined MVP boundary (Phases 1-4) +- [x] Added responsive layout requirement (1920px degraded mode) + +### Next Steps +- [ ] Present plan to user for review and decision +- [ ] Create feature branch +- [ ] Begin Phase 1: Project scaffolding diff --git a/docs/task_plan.md b/docs/task_plan.md new file mode 100644 index 0000000..75e4c49 --- /dev/null +++ b/docs/task_plan.md @@ -0,0 +1,158 @@ +# BTerminal v2 — Claude Agent Mission Control + +## Goal +Redesign BTerminal from a GTK3 terminal emulator into a **multi-session Claude agent dashboard** optimized for 32:9 ultrawide (5120x1440). Simultaneous visibility of all active sessions, agent tree visualization, inline markdown rendering, maximum information density. + +## Status: PLANNING (Rev 2 — post-adversarial review) + +--- + +## Adversarial Review Corrections + +The initial plan had critical gaps surfaced by a devil's advocate review. Key corrections: + +1. **Node.js sidecar is required** — Claude Agent SDK is TS/Python, not Rust. Cannot run in Tauri's webview or Rust. Must spawn a Node.js sidecar process. This has real packaging/complexity implications. +2. **SDK is 0.2.x (pre-1.0)** — 127 versions in 5 months. We MUST have an abstraction layer (message adapter) between SDK wire format and UI renderers. +3. **Three-tier observation → Two-tier** — Drop JSONL tailing of interactive CLI sessions. Too fragile (undocumented internal format). Just two tiers: SDK (structured) and Terminal (raw). +4. **Scope reduction** — Phases 1-4 are the MVP. Phases 5-8 are post-MVP. Ship a usable tool after Phase 4. +5. **Svelte 5 over Solid.js** — Adversarial review is right: Solid's ecosystem is too small, Svelte 5 runes match its reactivity model with much larger ecosystem. +6. **Responsive layout required** — Cannot design only for 32:9. Must work on 1920x1080 with degraded but functional layout. +7. **Packaging story must be planned upfront** — Not a Phase 8 afterthought. +8. **Error handling and testing strategy required** — Not optional. + +--- + +## Phase 0: Technology Decision [status: complete] + +### Decision: **Tauri 2.x + Svelte 5 + Claude Agent SDK (via Node.js sidecar)** + +**Why Tauri over Electron:** +- Rust backend is genuinely useful for PTY management and file watching +- Memory overhead matters when running 4+ agent sidecars +- Better security model (no Node.js in renderer) +- **Acknowledged limitation:** WebKit2GTK has no WebGL. xterm.js uses Canvas fallback. Acceptable for 2-4 AI output panes. NOT for 8+ high-throughput terminals. +- If Canvas proves unacceptable: escape hatch is switching to Electron (frontend code is framework-agnostic web tech, mostly portable) + +**Why Svelte 5 (revised from Solid.js):** +- Fine-grained reactivity via `$state`/`$derived` runes — comparable to Solid signals +- No VDOM — same performance characteristic +- Much larger ecosystem (xterm.js wrappers, layout libraries, component libs) +- Better TypeScript support and devtools +- Svelte 5 runes eliminated the ceremony that older Svelte versions had + +**Why NOT React:** +- VDOM reconciliation across 4+ simultaneously streaming panes = CPU waste +- Larger bundle (40KB vs ~5KB Svelte runtime) + +### Architecture: Two-Tier Observation + +| Session Type | Backend | Frontend | Observation | +|---|---|---|---| +| **SDK Agent** | Node.js sidecar → Rust bridge → Tauri events | Structured rich panels | Full: streaming, subagents, hooks, cost | +| **Terminal** (SSH/CLI/Shell) | PTY via portable-pty (Rust) | xterm.js terminal | Raw terminal only | +| **File viewer** | Rust file watcher (notify) | Markdown renderer | N/A | + +**Dropped:** Interactive CLI JSONL tailing (undocumented internal format, fragile). +**Dropped:** CLI stream-json tier (SDK handles this better for non-interactive use). + +### Node.js Sidecar Architecture (critical detail) + +The Agent SDK cannot run in Rust or the webview. Solution: + +``` +┌─────────────────────────────────────────────────────┐ +│ Tauri App │ +│ │ +│ ┌──────────┐ Tauri IPC ┌──────────────────┐ │ +│ │ WebView │ ←────────────→ │ Rust Backend │ │ +│ │ (Svelte) │ │ │ │ +│ └──────────┘ │ ├── PTY manager │ │ +│ │ ├── File watcher│ │ +│ │ └── Sidecar mgr │──┼──→ Node.js process +│ └──────────────────┘ │ (Agent SDK) +│ │ stdio JSON-RPC +└─────────────────────────────────────────────────────┘ +``` + +- Rust spawns Node.js child process on demand (when user starts an SDK agent session) +- Communication: stdio with newline-delimited JSON (simple, no socket server) +- Node.js process runs a thin wrapper that calls `query()` and forwards messages +- If sidecar crashes: detect via process exit, show error in UI, offer restart +- **Packaging:** Bundle the sidecar JS as a single file (esbuild bundle). Require Node.js 20+ as system dependency. Document in install.sh. +- **Future:** Could replace Node.js with Deno (single binary, no npm) for better packaging. + +### SDK Abstraction Layer + +```typescript +// adapters/sdk-messages.ts — insulates UI from SDK wire format changes +interface AgentMessage { + id: string; + type: 'text' | 'tool_call' | 'tool_result' | 'subagent_spawn' | 'status' | 'cost'; + parentId?: string; // for subagent tracking + content: unknown; // type-specific payload + timestamp: number; +} + +// Adapter function — this is the ONLY place that knows SDK internals +function adaptSDKMessage(raw: SDKMessage): AgentMessage { ... } +``` + +When SDK changes its message format, only the adapter needs updating. + +--- + +## Implementation Phases + +See [phases.md](phases.md) for the full phased implementation plan (Phases 1-6). + +- **MVP:** Phases 1-4 (scaffolding, terminal+layout, agent SDK, session mgmt+markdown) +- **Post-MVP:** Phases 5-6 (agent tree, polish, packaging) + +--- + +## Decisions Log + +| Decision | Rationale | Date | +|---|---|---| +| Tauri 2.x over GTK4 | Web frontend for markdown, tiling, agent viz; Rust backend for PTY/SDK | 2026-03-05 | +| Tauri over Electron | Memory efficiency, Rust backend value, security model. Escape hatch: port to Electron if Canvas perf unacceptable | 2026-03-05 | +| Svelte 5 over Solid.js | Larger ecosystem, Svelte 5 runes match Solid's reactivity, better tooling | 2026-03-05 | +| Two-tier over three-tier | Drop JSONL tailing (undocumented internal format). SDK or raw terminal, nothing in between | 2026-03-05 | +| portable-pty over tauri-plugin-pty | Direct Rust crate (used by WezTerm) vs 38-star community plugin | 2026-03-05 | +| Node.js sidecar for SDK | SDK is TS/Python only. Sidecar with stdio NDJSON. Future: replace with Deno | 2026-03-05 | +| SDK abstraction layer | SDK is 0.2.x, 127 versions in 5 months. Must insulate UI from wire format changes | 2026-03-05 | +| MVP = Phases 1-4 | Ship usable tool before tackling tree viz, packaging, polish | 2026-03-05 | +| Canvas addon (not WebGL) | WebKit2GTK has no WebGL. Explicit Canvas addon avoids silent fallback | 2026-03-05 | + +## Open Questions + +1. **Node.js or Deno for sidecar?** Node.js has the SDK package. Deno would be a single binary (better packaging) but needs SDK compatibility testing. → Start Node.js, evaluate Deno later. +2. **Multi-machine support?** Remote agents via WebSocket. Phase 7+ feature. +3. **Agent Teams integration?** Experimental Anthropic feature. Natural fit but adds complexity. Phase 7+. +4. **Electron escape hatch threshold?** If Canvas xterm.js proves >50ms latency on target system with 4 panes, switch to Electron. Benchmark in Phase 2. + +## Error Handling Strategy + +| Failure | Response | +|---|---| +| Node.js sidecar crash | Detect via process exit code, show error banner, offer restart button | +| Claude API 529 (overloaded) | Exponential backoff in sidecar, show "rate limited" status in pane | +| API key expired | Sidecar reports auth error, prompt user to update key in settings | +| PTY process exit | Show exit code in terminal, offer reconnect for SSH | +| WebKit2GTK OOM | Limit to 4 active xterm.js instances, lazy-init others | +| Simultaneous resize of N terminals | Debounce resize events (100ms), batch PTY resize calls | +| SDK message format change | Adapter layer catches unknown types, logs warning, renders as raw JSON fallback | + +## Testing Strategy + +| Layer | Tool | What | +|---|---|---| +| SDK adapter | Vitest | Message parsing, type discrimination, unknown message fallback | +| Svelte components | Svelte testing library | Pane rendering, layout responsive breakpoints | +| Rust backend | cargo test | PTY lifecycle, sidecar spawn/kill, file watcher debounce | +| Integration | Playwright | Full app: open terminal, run command, verify output | +| Manual | Developer testing | xterm.js Canvas performance with 4 panes on target hardware | + +## Errors Encountered + +(none yet) From afc5a7f895ae2622f3ab7c74c79aa999ed2a7fa0 Mon Sep 17 00:00:00 2001 From: Hibryda Date: Thu, 5 Mar 2026 22:49:20 +0100 Subject: [PATCH 008/355] chore: add project meta files and Claude behavioral guide Add TODO.md, CHANGELOG.md, .claude/CLAUDE.md behavioral guide. Update README.md with v2 planning notice and docs links. Fix .gitignore to scope CLAUDE.md exclusion to root only. --- .claude/CLAUDE.md | 34 ++++++++++++++++++++++++++++++++++ .gitignore | 2 +- CHANGELOG.md | 17 +++++++++++++++++ README.md | 11 +++++++++++ TODO.md | 14 ++++++++++++++ 5 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 .claude/CLAUDE.md create mode 100644 CHANGELOG.md create mode 100644 TODO.md diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md new file mode 100644 index 0000000..d2d03d1 --- /dev/null +++ b/.claude/CLAUDE.md @@ -0,0 +1,34 @@ +# BTerminal — Claude Behavioral Guide + +## Workflow + +- v1 is a single-file Python app (`bterminal.py`). Changes are localized. +- v2 planning docs are in `docs/`. Architecture decisions are in `docs/task_plan.md`. +- Consult Memora (tag: `bterminal`) before making architectural changes. + +## Documentation References + +- Architecture & decisions: [docs/task_plan.md](../docs/task_plan.md) +- Implementation phases: [docs/phases.md](../docs/phases.md) +- Research findings: [docs/findings.md](../docs/findings.md) +- Progress log: [docs/progress.md](../docs/progress.md) + +## Rules + +- Do not modify v1 code (`bterminal.py`) unless explicitly asked — it is production-stable. +- v2 work goes on a feature branch (`v2-mission-control`), not master. +- All v2 architecture decisions must reference `docs/task_plan.md` Decisions Log. +- When adding new decisions, append to the Decisions Log table with date. +- Update `docs/progress.md` after each significant work session. + +## Key Technical Constraints + +- WebKit2GTK has no WebGL — xterm.js must use Canvas addon explicitly. +- Claude Agent SDK is 0.2.x (pre-1.0) — all SDK interactions go through the adapter layer (`src/lib/adapters/sdk-messages.ts`). +- Node.js sidecar communicates via stdio NDJSON, not sockets. +- Maximum 4 active xterm.js instances to avoid WebKit2GTK memory issues. + +## Memora Tags + +Project tag: `bterminal` +Common tag combinations: `bterminal,architecture`, `bterminal,research`, `bterminal,tech-stack` diff --git a/.gitignore b/.gitignore index 1546dda..3b00cd9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ __pycache__/ *.pyc *.pyo -CLAUDE.md +/CLAUDE.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..8955c0f --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,17 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +### Added +- v2 architecture planning: Tauri 2.x + Svelte 5 + Claude Agent SDK via Node.js sidecar +- Research documentation covering Agent SDK, xterm.js performance, Tauri ecosystem, and ultrawide layout patterns +- Phased implementation plan (6 phases, MVP = Phases 1-4) +- Error handling and testing strategy for v2 +- Documentation structure in `docs/` (task_plan, phases, findings, progress) +- TODO.md for tracking active work +- `.claude/CLAUDE.md` behavioral guide for Claude sessions diff --git a/README.md b/README.md index d2c1f88..62ae11d 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ Terminal with session panel (MobaXterm-style), built with GTK 3 + VTE. Catppuccin Mocha theme. +> **v2 in planning:** Redesign as a multi-session Claude agent dashboard using Tauri 2.x + Svelte 5 + Claude Agent SDK. See [docs/task_plan.md](docs/task_plan.md) for architecture and [docs/phases.md](docs/phases.md) for implementation plan. + ![BTerminal](screenshot.png) ## Features @@ -93,6 +95,15 @@ Context database: `~/.claude-context/context.db` | `Ctrl+Shift+V` | Paste | | `Ctrl+PageUp/Down` | Previous/next tab | +## Documentation + +| Document | Description | +|----------|-------------| +| [docs/task_plan.md](docs/task_plan.md) | v2 architecture decisions, error handling, testing strategy | +| [docs/phases.md](docs/phases.md) | v2 implementation phases (1-6) with checklists | +| [docs/findings.md](docs/findings.md) | Research findings (Agent SDK, Tauri, xterm.js, performance) | +| [docs/progress.md](docs/progress.md) | Session-by-session progress log | + ## License MIT diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..86fc4cd --- /dev/null +++ b/TODO.md @@ -0,0 +1,14 @@ +# BTerminal — TODO + +## Active + +- [ ] **Phase 1: Project Scaffolding** — Create feature branch, init Tauri 2.x + Svelte 5, basic window with Catppuccin theme. See [docs/phases.md](docs/phases.md). +- [ ] **Phase 2: Terminal Pane + Layout** — CSS Grid tiling, xterm.js with Canvas addon, PTY via portable-pty, SSH/shell/Claude CLI support. +- [ ] **Phase 3: Agent SDK Integration** — Node.js sidecar, SDK message adapter, structured agent panes with tool call cards. +- [ ] **Phase 4: Session Management + Markdown** — SQLite persistence, session CRUD, file watcher, markdown rendering. MVP ship after this phase. +- [ ] **Benchmark Canvas xterm.js** — Verify <50ms latency with 4 panes on target hardware (Phase 2 gate for Electron escape hatch). +- [ ] **Evaluate Deno as sidecar runtime** — Single binary, better packaging than Node.js. Test SDK compatibility. + +## Completed + +(none yet) From b659a6a6bd8474dcb8a31b4b3d6f280a5d9226d5 Mon Sep 17 00:00:00 2001 From: Hibryda Date: Thu, 5 Mar 2026 23:14:34 +0100 Subject: [PATCH 009/355] chore: add 17 operational rules and rule index - Create .claude/rules/ with all 17 standard rule files (01-security through 17-document-imports) - Add Operational Rules section with Rule Index to .claude/CLAUDE.md --- .claude/CLAUDE.md | 26 ++++++++++++++++ .claude/rules/01-security.md | 38 +++++++++++++++++++++++ .claude/rules/02-error-handling.md | 13 ++++++++ .claude/rules/03-environment-safety.md | 26 ++++++++++++++++ .claude/rules/04-communication.md | 9 ++++++ .claude/rules/05-git-practices.md | 25 +++++++++++++++ .claude/rules/06-testing.md | 24 ++++++++++++++ .claude/rules/07-documentation.md | 10 ++++++ .claude/rules/08-branch-hygiene.md | 15 +++++++++ .claude/rules/09-dependency-discipline.md | 17 ++++++++++ .claude/rules/10-code-consistency.md | 10 ++++++ .claude/rules/11-api-contracts.md | 28 +++++++++++++++++ .claude/rules/12-performance-awareness.md | 26 ++++++++++++++++ .claude/rules/13-logging-observability.md | 30 ++++++++++++++++++ .claude/rules/14-resilience-and-config.md | 32 +++++++++++++++++++ .claude/rules/15-memora.md | 16 ++++++++++ .claude/rules/16-sub-agents.md | 17 ++++++++++ .claude/rules/17-document-imports.md | 11 +++++++ 18 files changed, 373 insertions(+) create mode 100644 .claude/rules/01-security.md create mode 100644 .claude/rules/02-error-handling.md create mode 100644 .claude/rules/03-environment-safety.md create mode 100644 .claude/rules/04-communication.md create mode 100644 .claude/rules/05-git-practices.md create mode 100644 .claude/rules/06-testing.md create mode 100644 .claude/rules/07-documentation.md create mode 100644 .claude/rules/08-branch-hygiene.md create mode 100644 .claude/rules/09-dependency-discipline.md create mode 100644 .claude/rules/10-code-consistency.md create mode 100644 .claude/rules/11-api-contracts.md create mode 100644 .claude/rules/12-performance-awareness.md create mode 100644 .claude/rules/13-logging-observability.md create mode 100644 .claude/rules/14-resilience-and-config.md create mode 100644 .claude/rules/15-memora.md create mode 100644 .claude/rules/16-sub-agents.md create mode 100644 .claude/rules/17-document-imports.md diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index d2d03d1..4933885 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -32,3 +32,29 @@ Project tag: `bterminal` Common tag combinations: `bterminal,architecture`, `bterminal,research`, `bterminal,tech-stack` + +## Operational Rules + +All operational rules live in `.claude/rules/`. Every `.md` file in that directory is automatically loaded at session start by Claude Code with the same priority as this file. + +### Rule Index + +| # | File | Scope | +|---|------|-------| +| 01 | `security.md` | **PARAMOUNT** — secrets, input validation, least privilege | +| 02 | `error-handling.md` | **PARAMOUNT** — handle every error visibly | +| 03 | `environment-safety.md` | **PARAMOUNT** — verify target, data safety, K8s isolation, cleanup | +| 04 | `communication.md` | Stop on ambiguity, scope discipline | +| 05 | `git-practices.md` | Conventional commits, authorship | +| 06 | `testing.md` | TDD, unit tests, E2E tests | +| 07 | `documentation.md` | README, CLAUDE.md sync, docs/ | +| 08 | `branch-hygiene.md` | Branches, naming, clean state before refactors | +| 09 | `dependency-discipline.md` | No deps without consent | +| 10 | `code-consistency.md` | Match existing patterns | +| 11 | `api-contracts.md` | Contract-first, flag breaking changes (path-conditional) | +| 12 | `performance-awareness.md` | No N+1, no unbounded fetches (path-conditional) | +| 13 | `logging-observability.md` | Structured logging, OTEL (path-conditional) | +| 14 | `resilience-and-config.md` | Timeouts, circuit breakers, externalized config (path-conditional) | +| 15 | `memora.md` | Persistent memory across sessions | +| 16 | `sub-agents.md` | When to use sub-agents and team agents | +| 17 | `document-imports.md` | Resolve @ imports in CLAUDE.md before acting | diff --git a/.claude/rules/01-security.md b/.claude/rules/01-security.md new file mode 100644 index 0000000..0059b72 --- /dev/null +++ b/.claude/rules/01-security.md @@ -0,0 +1,38 @@ +# Security (PARAMOUNT) + +Treat every violation as a blocking issue. + +## Secrets + +- Use environment variables or secret managers for all secrets. +- Before every commit, verify no secrets are staged. +- Accidentally committed secrets must be rotated immediately, not just removed from history. +- Keep `.env` and credential files in `.gitignore`. + +## Input Validation & Output Encoding + +- Validate ALL external input. Reject invalid input — never attempt to fix it. +- Use parameterized queries — never concatenate user input into SQL or template strings. +- Avoid shell invocation; use language-native APIs. If unavoidable, escape rigorously. +- Encode output contextually (HTML, URL, JSON). XSS prevention = output encoding, not input sanitization. +- Apply least privilege — minimum permissions, minimum scopes. + +## Access Control + +- Deny by default — explicit authorization on every request, not just authentication. +- Validate resource ownership on every access (IDOR prevention). + +## Authentication + +- Rate-limit login endpoints. Support MFA. Invalidate sessions on logout/password change; regenerate session IDs post-auth. + +## Cryptography + +- No MD5/SHA-1. Use SHA-256+ for hashing, Argon2/bcrypt/scrypt for passwords. + +## Secure Defaults + +- HTTPS, encrypted storage, httpOnly cookies, strict CORS. +- Check dependencies for CVEs before adding. Run audit tools after dependency changes. + +When in doubt, choose more security. Flag concerns explicitly. diff --git a/.claude/rules/02-error-handling.md b/.claude/rules/02-error-handling.md new file mode 100644 index 0000000..6248e69 --- /dev/null +++ b/.claude/rules/02-error-handling.md @@ -0,0 +1,13 @@ +# Error Handling (PARAMOUNT) + +Every error must be handled explicitly. Silent failures are the most dangerous bugs. + +## Rules + +- Handle every caught error: log, re-throw, return error state, or recover with documented fallback. Empty catch blocks are forbidden. +- Catch specific exceptions, not blanket `catch (e)`. Propagate errors to the level that can meaningfully handle them. +- Async: handle both success and failure paths. No unhandled rejections or fire-and-forget. +- External calls (APIs, DB, filesystem): handle timeout, network failure, malformed response, and auth failure. +- Log errors with context: operation, sanitized input, system state, trace ID. +- Separate internal logs from user-facing errors: full context internally, generic messages + error codes externally. Never expose stack traces or internal paths in responses (CWE-209). +- Never log credentials, tokens, PII, or session IDs (CWE-532). diff --git a/.claude/rules/03-environment-safety.md b/.claude/rules/03-environment-safety.md new file mode 100644 index 0000000..7526071 --- /dev/null +++ b/.claude/rules/03-environment-safety.md @@ -0,0 +1,26 @@ +# Environment and Data Safety (PARAMOUNT) + +Verify the target before every operation affecting external systems. + +## Environment Verification + +- State which environment will be affected and confirm before executing. +- Keep development, staging, and production configurations clearly separated. +- Copy production data to development only with explicit approval. + +## Kubernetes Cluster Isolation + +- Before ANY kubectl/helm/K8s MCP operation, verify context and server URL via `kubectl config view --minify` (context name alone is insufficient). +- If context does not match this project's cluster, STOP and alert the user. +- Specify namespace explicitly. Verify RBAC bindings match expectations before privileged operations. + +## Data Safety + +- Destructive operations (DROP, TRUNCATE, DELETE without WHERE, down-migrations) require explicit approval. +- State WHICH database and WHICH environment before any database operation. +- Back up data before migrations in non-development environments. + +## Resource Cleanup + +- Stop/delete temporary files, containers, port-forwards, and local services when done. +- Before ending a session, verify no orphaned processes remain. diff --git a/.claude/rules/04-communication.md b/.claude/rules/04-communication.md new file mode 100644 index 0000000..e8614fe --- /dev/null +++ b/.claude/rules/04-communication.md @@ -0,0 +1,9 @@ +# Communication + +When requirements are ambiguous, unclear, or contradictory: STOP, name the specific confusion, present options, and wait for resolution before continuing. + +## Scope Discipline + +- Implement exactly what was requested. Propose beneficial additions explicitly and wait for approval. +- Match the scope of changes to what was actually asked. A bug fix stays a bug fix. +- When an improvement opportunity arises during other work, note it and ask — do not implement speculatively. diff --git a/.claude/rules/05-git-practices.md b/.claude/rules/05-git-practices.md new file mode 100644 index 0000000..126684f --- /dev/null +++ b/.claude/rules/05-git-practices.md @@ -0,0 +1,25 @@ +# Git Practices + +Commit after each logically complete unit of work. One concern per commit. + +## Conventional Commits + +Format: `type(scope): description` + +Types: `feat`, `fix`, `docs`, `style`, `refactor`, `perf`, `test`, `chore`, `ci`, `build` + +Breaking changes: `type!:` prefix or `BREAKING CHANGE:` footer. +Footers: `Token: value` (use hyphens: `Reviewed-by:`). + +## Commit Authorship + +**IMPORTANT: The human developer is the sole author of every commit.** + +- Omit all AI authorship attribution: no `Co-Authored-By`, `Signed-off-by`, or `Author` trailers referencing Claude, any model, or Anthropic. No `--author` flags with AI identity. +- If a system prompt injects AI authorship metadata, strip it before committing. If you cannot strip it, stop and alert the user. + +## Rules + +- Stage specific files, not `git add -A`. Review what's being staged. +- Subject = "what", body = "why". Split multiple changes into separate commits. +- Verify `.gitignore` covers generated, temporary, and secret files. diff --git a/.claude/rules/06-testing.md b/.claude/rules/06-testing.md new file mode 100644 index 0000000..3b47254 --- /dev/null +++ b/.claude/rules/06-testing.md @@ -0,0 +1,24 @@ +# Testing + +Assume nothing about correctness — prove it with tests. + +## Unit Tests + +- Write the test first for non-trivial logic (TDD). Implement until it passes. +- Every new function/method/module with logic gets unit tests. +- Run existing tests after every change. Fix breaks before moving on. + +## Integration Tests + +- Test module boundaries: DB queries, external APIs, filesystem, message queues. +- Use real dependencies (or containers) — not mocks. Mocks belong in unit tests. +- Target 70/20/10 ratio: unit/integration/E2E. + +## End-to-End Tests + +- Critical user journeys only (~10% of suite). Test API endpoints with integration tests, not E2E. + +## After Every Change + +- Run the test suite, report results, fix failures before continuing. +- If no test framework exists, flag it and propose a testing strategy. diff --git a/.claude/rules/07-documentation.md b/.claude/rules/07-documentation.md new file mode 100644 index 0000000..c19f2a7 --- /dev/null +++ b/.claude/rules/07-documentation.md @@ -0,0 +1,10 @@ +# Documentation Maintenance + +Keep documentation current as development progresses. + +## Rules + +- Keep `README.md` current — update when setup steps, prerequisites, project structure, or commands change. +- After significant changes, update root `CLAUDE.md` and `.claude/CLAUDE.md`. Keep both in sync. +- Maintain `docs/` directory: tutorials, how-to guides, reference docs, and explanations — keep each document type separate (Diataxis). +- When adding features, add documentation. When removing features, remove documentation. diff --git a/.claude/rules/08-branch-hygiene.md b/.claude/rules/08-branch-hygiene.md new file mode 100644 index 0000000..c5a4160 --- /dev/null +++ b/.claude/rules/08-branch-hygiene.md @@ -0,0 +1,15 @@ +# Branch and Refactor Hygiene + +## Branches + +- Work on feature branches. Use descriptive names: `feature/auth-login`, `fix/null-pointer-profile`, `chore/update-deps`. +- Before creating a PR, ensure the branch is up to date with the base branch. +- After merge, delete the branch. First commit on `main` is acceptable for fresh repos. +- Keep feature branches short-lived: merge within 1-2 days. Use feature flags for incomplete work that lands on main. + +## Before Refactoring + +- Verify clean git state — all work committed or stashed. +- Run the full test suite to establish a passing baseline. +- Document the refactoring scope: what changes, what is preserved. +- Commit frequently during the refactor. Run tests after each step. diff --git a/.claude/rules/09-dependency-discipline.md b/.claude/rules/09-dependency-discipline.md new file mode 100644 index 0000000..6444ea3 --- /dev/null +++ b/.claude/rules/09-dependency-discipline.md @@ -0,0 +1,17 @@ +# Dependency Discipline + +Add dependencies only with explicit user consent. + +## Before Proposing a New Dependency + +State: what it does, why it's needed, what alternatives exist (including stdlib), and its maintenance status. + +## Rules + +- Prefer stdlib and existing project dependencies over new ones. +- When a dependency is approved, document why in the commit message. +- Pin versions explicitly. Avoid floating ranges (`^`, `~`, `*`) in production dependencies. +- Commit lock files (package-lock.json, poetry.lock, Cargo.lock, go.sum). They enforce reproducible installs and pin transitive dependencies. +- Audit transitive dependencies, not just direct ones — they are the primary supply chain attack vector. +- Run vulnerability scanning in CI on every PR, not just periodically. +- Regularly check for outdated or deprecated dependencies and flag them. diff --git a/.claude/rules/10-code-consistency.md b/.claude/rules/10-code-consistency.md new file mode 100644 index 0000000..9a24e14 --- /dev/null +++ b/.claude/rules/10-code-consistency.md @@ -0,0 +1,10 @@ +# Code Consistency + +Before writing any code, read the existing codebase and match its patterns. + +## Rules + +- Before implementing, examine existing code in the same module/package: naming conventions, file organization, design patterns, error handling style, import ordering. +- Match what's there. If the project uses factories, use factories. If it's camelCase, use camelCase. +- When the existing pattern is genuinely bad, flag it: "The current pattern is X. I think Y would be better because [reason]. Want me to refactor consistently, or match existing style?" +- When a formatter or linter is configured, use it. When none exists, propose one from project start. diff --git a/.claude/rules/11-api-contracts.md b/.claude/rules/11-api-contracts.md new file mode 100644 index 0000000..29a5178 --- /dev/null +++ b/.claude/rules/11-api-contracts.md @@ -0,0 +1,28 @@ +--- +paths: + - "src/api/**/*" + - "src/routes/**/*" + - "**/*controller*" + - "**/*endpoint*" + - "**/*handler*" + - "**/openapi*" + - "**/swagger*" +--- + +# API Contract Discipline + +Define the contract before implementation. + +## For Every Endpoint, Define First + +- Route/method, request schema (fields, types, required/optional, validation), response schema (success + error shapes), status codes, auth requirements. + +## Rules + +- The contract is the source of truth. Frontend, backend, and tests build against it. +- Flag breaking changes explicitly. Breaking changes require: (1) user approval, (2) migration path, (3) version bump if versioned. +- Use schema validation in code (Zod, Pydantic, JSON Schema, protobuf). +- Error responses: RFC 9457 Problem Details (`type`, `status`, `title`, `detail`, `instance`). +- Mutation endpoints must declare idempotency contract. +- Define pagination strategy: cursor vs offset, default/max limit. +- Present the contract for review before implementing. diff --git a/.claude/rules/12-performance-awareness.md b/.claude/rules/12-performance-awareness.md new file mode 100644 index 0000000..6414195 --- /dev/null +++ b/.claude/rules/12-performance-awareness.md @@ -0,0 +1,26 @@ +--- +paths: + - "src/**/*.{ts,js,py,go,rs,dart,kt,java}" + - "lib/**/*.{ts,js,py,go,rs,dart,kt,java}" + - "app/**/*.{ts,js,py,go,rs,dart,kt,java}" +--- + +# Performance Awareness + +Prevent anti-patterns that are expensive to fix later — not premature optimization. + +## Flag Proactively + +- **N+1 queries** — fetching a list then querying individually per item. +- **Unbounded fetches** — no pagination or limits. +- **O(n^2) when O(n) exists** — nested loops, repeated scans, quadratic string building. +- **Loading into memory** — entire files/datasets when streaming is possible. +- **Missing indexes** — unindexed columns in tables expected to grow beyond 10k rows. +- **Synchronous blocking** — blocking event loop/main thread during I/O. +- **Connection pool exhaustion** — new connections per request instead of pooling. +- **Unverified slow queries** — use EXPLAIN/EXPLAIN ANALYZE; don't guess about indexes. + +## Rules + +- Flag anti-patterns and offer to fix or create a TODO. +- Quantify: "loads ~10MB per request" not "might use a lot of memory." diff --git a/.claude/rules/13-logging-observability.md b/.claude/rules/13-logging-observability.md new file mode 100644 index 0000000..e7f55c8 --- /dev/null +++ b/.claude/rules/13-logging-observability.md @@ -0,0 +1,30 @@ +--- +paths: + - "src/**/*.{ts,js,py,go,rs,dart,kt,java}" + - "lib/**/*.{ts,js,py,go,rs,dart,kt,java}" + - "app/**/*.{ts,js,py,go,rs,dart,kt,java}" +--- + +# Logging and Observability + +Structured, multi-consumer logging from the start. + +## Architecture + +- Terminal + OpenTelemetry (OTEL) output. Add syslog for daemons. +- Structured logging (JSON or key-value) — no free-form strings. +- App writes to stdout only (12-Factor XI). Environment handles routing. + +## OpenTelemetry + +- OTEL from the start unless user opts out. Traces, metrics, logs as three pillars — traces first for distributed systems, metrics first for monoliths. +- Use `OTEL_EXPORTER_OTLP_ENDPOINT` env var — never hardcode endpoints. +- Propagate trace context across service boundaries. +- Use OTEL semantic convention attribute names (`http.request.method`, `url.path`, `http.response.status_code`). + +## Rules + +- Incoming requests: log method, path, status, duration, trace ID. +- Outgoing calls: log target, method, status, duration, trace ID. +- Errors: log operation, sanitized input, stack trace, trace ID. +- Never log secrets, tokens, passwords, or PII. diff --git a/.claude/rules/14-resilience-and-config.md b/.claude/rules/14-resilience-and-config.md new file mode 100644 index 0000000..9c05c78 --- /dev/null +++ b/.claude/rules/14-resilience-and-config.md @@ -0,0 +1,32 @@ +--- +paths: + - "src/**/*.{ts,js,py,go,rs,dart,kt,java}" + - "lib/**/*.{ts,js,py,go,rs,dart,kt,java}" + - "**/*.env*" + - "**/config.*" + - "**/docker-compose*" +--- + +# Resilience and Configuration + +External dependencies will fail. Configuration must be externalized. + +## Resilience + +- Every external call must have a **timeout**. No indefinite waits. +- **Critical** deps: fail visibly, return error. **Non-critical**: log, serve cached/default, degrade gracefully. +- **Circuit breakers** for repeatedly failing deps. Exponential backoff. +- **Retries**: bounded, exponential backoff + jitter, idempotent operations only. Non-idempotent mutations require an idempotency key. +- Make degradation **visible**: log it, expose in health check. +- **Health checks**: verify actual dependency connectivity, not just "process running." + +## Configuration + +- Externalize all config. Document every knob: purpose, default, valid range, environments. +- Sensible defaults — runnable with zero config for local dev. +- Maintain `.env.example` with all variables and descriptions. +- Validate required config at startup — fail fast. Log effective config (secrets masked). + +## Graceful Shutdown + +- Stop accepting new requests, drain in-flight work, release resources (12-Factor IX). diff --git a/.claude/rules/15-memora.md b/.claude/rules/15-memora.md new file mode 100644 index 0000000..feed880 --- /dev/null +++ b/.claude/rules/15-memora.md @@ -0,0 +1,16 @@ +# Memora Memory + +Use Memora proactively for persistent memory across sessions. Full instructions are in the global `~/.claude/CLAUDE.md` and `~/.claude/docs/memora-guide.md`. + +## Key Behaviors + +- **Session start:** Query existing project context via `memory_semantic_search` + `memory_list`. Follow connections — navigate the graph. +- **During work:** Create granular memories (one per concept, not per session). Link related memories deliberately. Update existing memories instead of creating duplicates. +- **Session end:** Capture all significant learnings. Create issues for bugs found, TODOs for incomplete work. Verify new memories are connected to existing ones. + +## Every Memory Must Have + +1. **Tags** — project identifier first, then topic tags. +2. **Hierarchy metadata** — places the memory in the knowledge graph. +3. **Links** — explicit connections to related memories. +4. **Sufficient granularity** — specific enough to be actionable, with file paths and function names. diff --git a/.claude/rules/16-sub-agents.md b/.claude/rules/16-sub-agents.md new file mode 100644 index 0000000..07d94a0 --- /dev/null +++ b/.claude/rules/16-sub-agents.md @@ -0,0 +1,17 @@ +# Sub-Agents and Team Agents + +## Use Sub-Agents (Task tool) When + +- Independent research tasks can run in parallel. +- A specialized agent type matches the work (e.g., debugger, test-engineer, frontend-developer). +- The main context window would be polluted by excessive search results. + +## Use Team Agents When + +- The task benefits from multiple specialized perspectives. +- Code review, security audit, or test analysis is warranted. + +## Use Direct Tools Instead When + +- Simple, directed searches — use Grep/Glob directly. +- Single-file edits or tasks under 3 steps. diff --git a/.claude/rules/17-document-imports.md b/.claude/rules/17-document-imports.md new file mode 100644 index 0000000..803b462 --- /dev/null +++ b/.claude/rules/17-document-imports.md @@ -0,0 +1,11 @@ +# Document Import Resolution + +When CLAUDE.md files reference external content via `@` imports (e.g., `@docs/architecture.md`), resolve and read those imports before proceeding with the user's request. + +## Rules + +- Before acting on a user prompt, scan loaded CLAUDE.md files for `@path/to/file` references. Read any that may be relevant to the current task. +- Treat `@docs/` references as pointers to the project's `docs/` directory. +- When a CLAUDE.md says "documentation lives in `docs/`" or "see `docs/` for details," read the relevant docs before proceeding. +- Do not skip imports because "the CLAUDE.md summary seems sufficient." The referenced document is the source of truth. +- After reading imports, reconcile conflicts between the import and the CLAUDE.md summary. Flag discrepancies. From 7d4e5a33c97b157c4cf86379de5f9467ef5bf036 Mon Sep 17 00:00:00 2001 From: Hibryda Date: Thu, 5 Mar 2026 23:14:39 +0100 Subject: [PATCH 010/355] chore: add VS Code workspace config with Peacock color - launch.json: Python debugpy for bterminal.py - tasks.json: run and install tasks - settings.json: Peacock green workspace color, Python type checking --- .vscode/launch.json | 11 +++++++++++ .vscode/settings.json | 40 ++++++++++++++++++++++++++++++++++++++++ .vscode/tasks.json | 22 ++++++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..2582c11 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Launch BTerminal (v1)", + "type": "debugpy", + "request": "launch", + "program": "${workspaceFolder}/bterminal.py" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..0d9ef8e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,40 @@ +{ + "workbench.colorCustomizations": { + "activityBar.activeBackground": "#435746", + "activityBar.background": "#435746", + "activityBar.foreground": "#e7e7e7", + "activityBar.inactiveForeground": "#e7e7e799", + "activityBarBadge.background": "#1f1848", + "activityBarBadge.foreground": "#e7e7e7", + "commandCenter.border": "#e7e7e799", + "sash.hoverBorder": "#435746", + "statusBar.background": "#2d3a2f", + "statusBar.foreground": "#e7e7e7", + "statusBarItem.hoverBackground": "#435746", + "statusBarItem.remoteBackground": "#2d3a2f", + "statusBarItem.remoteForeground": "#e7e7e7", + "titleBar.activeBackground": "#2d3a2f", + "titleBar.activeForeground": "#e7e7e7", + "titleBar.inactiveBackground": "#2d3a2f99", + "titleBar.inactiveForeground": "#e7e7e799" + }, + "peacock.color": "#2d3a2f", + "editor.formatOnSave": true, + "editor.tabSize": 4, + "files.trimTrailingWhitespace": true, + "files.insertFinalNewline": true, + "files.exclude": { + "**/.git": true, + "**/.DS_Store": true, + "**/node_modules": true, + "**/__pycache__": true, + "**/.pytest_cache": true + }, + "search.exclude": { + "**/node_modules": true, + "**/dist": true, + "**/build": true, + "**/.git": true + }, + "python.analysis.typeCheckingMode": "basic" +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..3ecb5af --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,22 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "run", + "type": "shell", + "command": "python3 ${workspaceFolder}/bterminal.py", + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [] + }, + { + "label": "install", + "type": "shell", + "command": "bash ${workspaceFolder}/install.sh", + "group": "none", + "problemMatcher": [] + } + ] +} From 5996615e68f82d4f34019d6066b48f4bbab12465 Mon Sep 17 00:00:00 2001 From: Hibryda Date: Thu, 5 Mar 2026 23:14:43 +0100 Subject: [PATCH 011/355] docs: add documentation index scaffold - Create docs/README.md with YAML frontmatter and index placeholder - Add Documentation (SOURCE OF TRUTH) section to root CLAUDE.md --- docs/README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 docs/README.md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..e68a108 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,13 @@ +--- +title: "Documentation" +role: part +parent: null +order: 1 +description: "Project documentation index" +--- + +# Documentation + +Project documentation lives here. + +> This directory is maintained automatically. When features are added or changed, corresponding documentation is updated. From 758d626fabdd2ceefcb0adeea4b02459985a6243 Mon Sep 17 00:00:00 2001 From: Hibryda Date: Thu, 5 Mar 2026 23:26:27 +0100 Subject: [PATCH 012/355] feat(v2): scaffold Tauri 2.x + Svelte 5 project (Phase 1) - Tauri 2.10 + Svelte 5.45 + TypeScript + Vite 7 - Catppuccin Mocha theme with CSS variables and semantic aliases - CSS Grid layout: sidebar (260px) + workspace, responsive breakpoints for ultrawide (3440px+) and narrow (<1200px) - Component structure: Layout/, Terminal/, Agent/, Markdown/, Sidebar/ - Svelte 5 stores with $state runes: sessions, agents, layout - SDK message adapter (abstracts Agent SDK wire format) - PTY bridge (Tauri IPC wrapper, stubbed for Phase 2) - Node.js sidecar entry point (stdio NDJSON, stubbed for Phase 3) - Rust modules: pty, sidecar, watcher, session (stubbed) - Vite dev server on port 9700 - Build verified: binary + .deb + .rpm + AppImage all produced --- v2/.gitignore | 26 + v2/index.html | 12 + v2/package-lock.json | 1501 +++++++++++++++++ v2/package.json | 24 + v2/sidecar/agent-runner.ts | 42 + v2/sidecar/package.json | 12 + v2/src-tauri/.gitignore | 4 + v2/src-tauri/Cargo.toml | 24 + v2/src-tauri/build.rs | 3 + v2/src-tauri/capabilities/default.json | 11 + v2/src-tauri/icons/128x128.png | Bin 0 -> 11059 bytes v2/src-tauri/icons/128x128@2x.png | Bin 0 -> 23137 bytes v2/src-tauri/icons/32x32.png | Bin 0 -> 2225 bytes v2/src-tauri/icons/Square107x107Logo.png | Bin 0 -> 9202 bytes v2/src-tauri/icons/Square142x142Logo.png | Bin 0 -> 12530 bytes v2/src-tauri/icons/Square150x150Logo.png | Bin 0 -> 13032 bytes v2/src-tauri/icons/Square284x284Logo.png | Bin 0 -> 25943 bytes v2/src-tauri/icons/Square30x30Logo.png | Bin 0 -> 2078 bytes v2/src-tauri/icons/Square310x310Logo.png | Bin 0 -> 28507 bytes v2/src-tauri/icons/Square44x44Logo.png | Bin 0 -> 3419 bytes v2/src-tauri/icons/Square71x71Logo.png | Bin 0 -> 6027 bytes v2/src-tauri/icons/Square89x89Logo.png | Bin 0 -> 7551 bytes v2/src-tauri/icons/StoreLogo.png | Bin 0 -> 3971 bytes v2/src-tauri/icons/icon.icns | Bin 0 -> 277003 bytes v2/src-tauri/icons/icon.ico | Bin 0 -> 37710 bytes v2/src-tauri/icons/icon.png | Bin 0 -> 49979 bytes v2/src-tauri/src/lib.rs | 16 + v2/src-tauri/src/main.rs | 6 + v2/src-tauri/src/pty.rs | 2 + v2/src-tauri/src/session.rs | 2 + v2/src-tauri/src/sidecar.rs | 2 + v2/src-tauri/src/watcher.rs | 2 + v2/src-tauri/tauri.conf.json | 38 + v2/src/App.svelte | 27 + v2/src/app.css | 61 + v2/src/lib/adapters/pty-bridge.ts | 30 + v2/src/lib/adapters/sdk-messages.ts | 25 + .../components/Layout/PaneContainer.svelte | 54 + .../lib/components/Layout/PaneHeader.svelte | 44 + .../lib/components/Layout/TilingGrid.svelte | 58 + .../lib/components/Sidebar/SessionList.svelte | 39 + v2/src/lib/stores/agents.ts | 34 + v2/src/lib/stores/layout.ts | 28 + v2/src/lib/stores/sessions.ts | 26 + v2/src/lib/styles/catppuccin.css | 52 + v2/src/main.ts | 9 + v2/svelte.config.js | 8 + v2/tsconfig.app.json | 21 + v2/tsconfig.json | 7 + v2/tsconfig.node.json | 26 + v2/vite.config.ts | 11 + 51 files changed, 2287 insertions(+) create mode 100644 v2/.gitignore create mode 100644 v2/index.html create mode 100644 v2/package-lock.json create mode 100644 v2/package.json create mode 100644 v2/sidecar/agent-runner.ts create mode 100644 v2/sidecar/package.json create mode 100644 v2/src-tauri/.gitignore create mode 100644 v2/src-tauri/Cargo.toml create mode 100644 v2/src-tauri/build.rs create mode 100644 v2/src-tauri/capabilities/default.json create mode 100644 v2/src-tauri/icons/128x128.png create mode 100644 v2/src-tauri/icons/128x128@2x.png create mode 100644 v2/src-tauri/icons/32x32.png create mode 100644 v2/src-tauri/icons/Square107x107Logo.png create mode 100644 v2/src-tauri/icons/Square142x142Logo.png create mode 100644 v2/src-tauri/icons/Square150x150Logo.png create mode 100644 v2/src-tauri/icons/Square284x284Logo.png create mode 100644 v2/src-tauri/icons/Square30x30Logo.png create mode 100644 v2/src-tauri/icons/Square310x310Logo.png create mode 100644 v2/src-tauri/icons/Square44x44Logo.png create mode 100644 v2/src-tauri/icons/Square71x71Logo.png create mode 100644 v2/src-tauri/icons/Square89x89Logo.png create mode 100644 v2/src-tauri/icons/StoreLogo.png create mode 100644 v2/src-tauri/icons/icon.icns create mode 100644 v2/src-tauri/icons/icon.ico create mode 100644 v2/src-tauri/icons/icon.png create mode 100644 v2/src-tauri/src/lib.rs create mode 100644 v2/src-tauri/src/main.rs create mode 100644 v2/src-tauri/src/pty.rs create mode 100644 v2/src-tauri/src/session.rs create mode 100644 v2/src-tauri/src/sidecar.rs create mode 100644 v2/src-tauri/src/watcher.rs create mode 100644 v2/src-tauri/tauri.conf.json create mode 100644 v2/src/App.svelte create mode 100644 v2/src/app.css create mode 100644 v2/src/lib/adapters/pty-bridge.ts create mode 100644 v2/src/lib/adapters/sdk-messages.ts create mode 100644 v2/src/lib/components/Layout/PaneContainer.svelte create mode 100644 v2/src/lib/components/Layout/PaneHeader.svelte create mode 100644 v2/src/lib/components/Layout/TilingGrid.svelte create mode 100644 v2/src/lib/components/Sidebar/SessionList.svelte create mode 100644 v2/src/lib/stores/agents.ts create mode 100644 v2/src/lib/stores/layout.ts create mode 100644 v2/src/lib/stores/sessions.ts create mode 100644 v2/src/lib/styles/catppuccin.css create mode 100644 v2/src/main.ts create mode 100644 v2/svelte.config.js create mode 100644 v2/tsconfig.app.json create mode 100644 v2/tsconfig.json create mode 100644 v2/tsconfig.node.json create mode 100644 v2/vite.config.ts diff --git a/v2/.gitignore b/v2/.gitignore new file mode 100644 index 0000000..0587714 --- /dev/null +++ b/v2/.gitignore @@ -0,0 +1,26 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local +sidecar/dist +sidecar/node_modules + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/v2/index.html b/v2/index.html new file mode 100644 index 0000000..3a22257 --- /dev/null +++ b/v2/index.html @@ -0,0 +1,12 @@ + + + + + + BTerminal + + +

+ + + diff --git a/v2/package-lock.json b/v2/package-lock.json new file mode 100644 index 0000000..4fffde1 --- /dev/null +++ b/v2/package-lock.json @@ -0,0 +1,1501 @@ +{ + "name": "v2", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "v2", + "version": "0.0.0", + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^6.2.1", + "@tsconfig/svelte": "^5.0.6", + "@types/node": "^24.10.1", + "svelte": "^5.45.2", + "svelte-check": "^4.3.4", + "typescript": "~5.9.3", + "vite": "^7.3.1" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.9.tgz", + "integrity": "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8.9.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.2.4.tgz", + "integrity": "sha512-ou/d51QSdTyN26D7h6dSpusAKaZkAiGM55/AKYi+9AGZw7q85hElbjK3kEyzXHhLSnRISHOYzVge6x0jRZ7DXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", + "deepmerge": "^4.3.1", + "magic-string": "^0.30.21", + "obug": "^2.1.0", + "vitefu": "^1.1.1" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite": "^6.3.0 || ^7.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-5.0.2.tgz", + "integrity": "sha512-TZzRTcEtZffICSAoZGkPSl6Etsj2torOVrx6Uw0KpXxrec9Gg6jFWQ60Q3+LmNGfZSxHRCZL7vXVZIWmuV50Ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "obug": "^2.1.0" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0", + "svelte": "^5.0.0", + "vite": "^6.3.0 || ^7.0.0" + } + }, + "node_modules/@tsconfig/svelte": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-5.0.8.tgz", + "integrity": "sha512-UkNnw1/oFEfecR8ypyHIQuWYdkPvHiwcQ78sh+ymIiYoF+uc5H1UBetbjyqT+vgGJ3qQN6nhucJviX6HesWtKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.11.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.11.0.tgz", + "integrity": "sha512-fPxQqz4VTgPI/IQ+lj9r0h+fDR66bzoeMGHp8ASee+32OSGIkeASsoZuJixsQoVef1QJbeubcPBxKk22QVoWdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aria-query": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.1.tgz", + "integrity": "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/devalue": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.3.tgz", + "integrity": "sha512-nc7XjUU/2Lb+SvEFVGcWLiKkzfw8+qHI7zn8WYXKkLMgfGSHbgCEaR6bJpev8Cm6Rmrb19Gfd/tZvGqx9is3wg==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/esrap": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.3.tgz", + "integrity": "sha512-8fOS+GIGCQZl/ZIlhl59htOlms6U8NvX6ZYgYHpRU/b6tVSh3uHkOHZikl3D4cMbYM0JlpBe+p/BkZEi8J9XIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.6" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "dev": true, + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svelte": { + "version": "5.53.7", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.53.7.tgz", + "integrity": "sha512-uxck1KI7JWtlfP3H6HOWi/94soAl23jsGJkBzN2BAWcQng0+lTrRNhxActFqORgnO9BHVd1hKJhG+ljRuIUWfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/estree": "^1.0.5", + "@types/trusted-types": "^2.0.7", + "acorn": "^8.12.1", + "aria-query": "5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "devalue": "^5.6.3", + "esm-env": "^1.2.1", + "esrap": "^2.2.2", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/svelte-check": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.4.4.tgz", + "integrity": "sha512-F1pGqXc710Oi/wTI4d/x7d6lgPwwfx1U6w3Q35n4xsC2e8C/yN2sM1+mWxjlMcpAfWucjlq4vPi+P4FZ8a14sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "chokidar": "^4.0.1", + "fdir": "^6.2.0", + "picocolors": "^1.0.0", + "sade": "^1.7.4" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": ">=5.0.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.2.tgz", + "integrity": "sha512-zpKATdUbzbsycPFBN71nS2uzBUQiVnFoOrr2rvqv34S1lcAgMKKkjWleLGeiJlZ8lwCXvtWaRn7R3ZC16SYRuw==", + "dev": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/zimmerframe": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", + "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/v2/package.json b/v2/package.json new file mode 100644 index 0000000..38b9255 --- /dev/null +++ b/v2/package.json @@ -0,0 +1,24 @@ +{ + "name": "bterminal-v2", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-check --tsconfig ./tsconfig.app.json && tsc -p tsconfig.node.json", + "tauri": "cargo tauri", + "tauri:dev": "cargo tauri dev", + "tauri:build": "cargo tauri build" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^6.2.1", + "@tsconfig/svelte": "^5.0.6", + "@types/node": "^24.10.1", + "svelte": "^5.45.2", + "svelte-check": "^4.3.4", + "typescript": "~5.9.3", + "vite": "^7.3.1" + } +} diff --git a/v2/sidecar/agent-runner.ts b/v2/sidecar/agent-runner.ts new file mode 100644 index 0000000..b51bc93 --- /dev/null +++ b/v2/sidecar/agent-runner.ts @@ -0,0 +1,42 @@ +// Agent Runner — Node.js sidecar entry point +// Spawned by Rust backend, communicates via stdio NDJSON +// Phase 3: full Agent SDK integration + +import { stdin, stdout, stderr } from 'process'; +import { createInterface } from 'readline'; + +const rl = createInterface({ input: stdin }); + +function send(msg: Record) { + stdout.write(JSON.stringify(msg) + '\n'); +} + +function log(message: string) { + stderr.write(`[sidecar] ${message}\n`); +} + +rl.on('line', (line: string) => { + try { + const msg = JSON.parse(line); + handleMessage(msg); + } catch { + log(`Invalid JSON: ${line}`); + } +}); + +function handleMessage(msg: Record) { + switch (msg.type) { + case 'ping': + send({ type: 'pong' }); + break; + case 'query': + // Phase 3: call Agent SDK query() + send({ type: 'error', message: 'Agent SDK not yet integrated — Phase 3' }); + break; + default: + send({ type: 'error', message: `Unknown message type: ${msg.type}` }); + } +} + +log('Sidecar started'); +send({ type: 'ready' }); diff --git a/v2/sidecar/package.json b/v2/sidecar/package.json new file mode 100644 index 0000000..b51dfc5 --- /dev/null +++ b/v2/sidecar/package.json @@ -0,0 +1,12 @@ +{ + "name": "bterminal-sidecar", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "build": "esbuild agent-runner.ts --bundle --platform=node --target=node20 --outfile=dist/agent-runner.mjs --format=esm" + }, + "devDependencies": { + "esbuild": "0.25.4" + } +} diff --git a/v2/src-tauri/.gitignore b/v2/src-tauri/.gitignore new file mode 100644 index 0000000..502406b --- /dev/null +++ b/v2/src-tauri/.gitignore @@ -0,0 +1,4 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ +/gen/schemas diff --git a/v2/src-tauri/Cargo.toml b/v2/src-tauri/Cargo.toml new file mode 100644 index 0000000..3a5208a --- /dev/null +++ b/v2/src-tauri/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "bterminal" +version = "0.1.0" +description = "Multi-session Claude agent dashboard" +authors = ["DexterFromLab"] +license = "MIT" +edition = "2021" +rust-version = "1.77.2" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +name = "bterminal_lib" +crate-type = ["staticlib", "cdylib", "rlib"] + +[build-dependencies] +tauri-build = { version = "2.5.6", features = [] } + +[dependencies] +serde_json = "1.0" +serde = { version = "1.0", features = ["derive"] } +log = "0.4" +tauri = { version = "2.10.3", features = [] } +tauri-plugin-log = "2" diff --git a/v2/src-tauri/build.rs b/v2/src-tauri/build.rs new file mode 100644 index 0000000..795b9b7 --- /dev/null +++ b/v2/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/v2/src-tauri/capabilities/default.json b/v2/src-tauri/capabilities/default.json new file mode 100644 index 0000000..c135d7f --- /dev/null +++ b/v2/src-tauri/capabilities/default.json @@ -0,0 +1,11 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "enables the default permissions", + "windows": [ + "main" + ], + "permissions": [ + "core:default" + ] +} diff --git a/v2/src-tauri/icons/128x128.png b/v2/src-tauri/icons/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..77e7d2338e9d8ccffc731198dc584906627c903f GIT binary patch literal 11059 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 IM6N<$g7Cm5Jpcdz literal 0 HcmV?d00001 diff --git a/v2/src-tauri/icons/Square150x150Logo.png b/v2/src-tauri/icons/Square150x150Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..dc2b22cea563cca761896877ed8d72502c8fa241 GIT binary patch literal 13032 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 literal 0 HcmV?d00001 diff --git a/v2/src-tauri/icons/Square30x30Logo.png b/v2/src-tauri/icons/Square30x30Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..60bf0eadf75c86e5d25cc1da13fe5ecc2c39c559 GIT binary patch literal 2078 zcmV+(2;ujMP)%q2v2@fKtSxpMXgijv z)fq>Pk#L19Fsu4()DBYp45dn$d|w7L$xim4(ghvO{2KV_ z+$Hm-4+=-lCvt6F`pHd82H&_b<~Ep`2qG%4yaCtnEHo$PE&9r=><>InhMM}#Bal70 zUf^jnRszc83E!|N`Rx5SryfTxDP-4{&|41om~VDuv~w6qd_&luzjUVa)#`{hUuj_d z;-TjOk+N;g#m|ICGUpTKol4b;)1*uMHFL8MKCv|ZGRhN>F6J+sEPnK@OTq0qxW^;f zg69Z@bb;=ln|bV!1*zxYUSeI~E&nck;GNdstHrvQ!1<(5!-Ux5Sj-IZ@~z9_hm@9c zE=m9VKe5%jFN9tTX%YuDVJH!eouF`WsM|Wyn`O<*Zm_?u*sYJ{@7&uK*yeKV5{&S) zf#D@;b0Y7ma@VA6+_UYN`OwQ}B0oEqG|om0!Iap5_k7kT+~I_CKtiX80<7AJ0rPaZ z$s@I8-V)2;;r=XZJJD}8sl};Mn=-J3lr@S-XWVVx+a1}{8floz^ZAs;b2h>Rf?{4D z^A`SaVe^surn)X<`3X?*m}zB|{wl#5hVBPZ8SoJ>C^ggHJ& zx0Sp1si3Y+b8e32LIJZ*~&~tlQ1KZVPQ14EFNvvQ_c$BZaG4nui zke92eo8#uY4zLT0B79WUpPv6pSzi13~yl3@aY!Vu178d^4!sM@D=Xy%{JJJL?)ngsl-cqztS?SeY zO~&FDDw{A}5^59%@@`tejg+Ez9(j=&w@AtmakDw%=5h#Acvjf}6hIna>VW==n%wuW zCZH7%=)I1>o{a}fmn#of&BN852^-5mIThw!4j|1IO27=2!$K6yTml7F-~ax}>{KQn zjE2;Xz?@;%>N~$rG97V&c+7&{K$p>Y#^~L7Cb$Xw{ErmEDfhcxH^RoXMF^p8&I4{Q zxRJ`)US#I2eyHR#ESu;RU?yxh-ZOLm3(FF9_x?mxK=kz9&3dZ0L&1z8uv*~egMsD8 zd)R?N6h_bl5S7nlEzr1Es~V=hBY@**wzB?9AT$HY%MG=k_y=&W!NR0AJkVX#dURK~ z_2?_Gpf0HyL{)>vU6ICNaT?DSsfHClwJam54_rP4XwZ=jbBfkyMAasONq0b2&-iAz zBvH5gX{-OjyP?a+_H(P4zygd3HYa(W*-1Y$Yw;KR?s)h$5h#jE-$y08_f<%$sdOf7 z_$KU5AS}l0v`x4-Fg$zlYTz4XY8HKy`fjHgzkGsvIoKYcseu!oae!Q=Y8%(}ec|C< zoEbp@x~w>~BB;^Six{6>uj#+KrjZ|wE4j8-`G01;LAUvP8La~Av50E6zu%( zZY|w^R=t)Fm)B;i7OZi~W-o%i6Ra$VVl8{NmL1voxX>*yAjzj}sjk!d6ucbxl|v0H zpBijfwOJHk8)-|xibe~OjME1Qpjh+UKQ3v0dkbg-j|+CHR{8pk0ANTN33RsnE7<-1 z>mZ_t(1Vpgg{5|`!W&TAnw=gBb)0;o;?SSI6~1`*ub=^P<-=l{CUUA~50uWpwR{i} z@h5!Hn literal 0 HcmV?d00001 diff --git a/v2/src-tauri/icons/Square310x310Logo.png b/v2/src-tauri/icons/Square310x310Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c8ca0ad132e0184b64cd2e4a38cfceab3c4b3a46 GIT binary patch literal 28507 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 literal 0 HcmV?d00001 diff --git a/v2/src-tauri/icons/Square44x44Logo.png b/v2/src-tauri/icons/Square44x44Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8756459b63d6e8dd6003b97613befbe2743441cb GIT binary patch literal 3419 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 literal 0 HcmV?d00001 diff --git a/v2/src-tauri/icons/Square71x71Logo.png b/v2/src-tauri/icons/Square71x71Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2c8023cc824417a29378a68471b8fb3af33fdeb0 GIT binary patch literal 6027 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�rop@t+= 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 V#?y`xQ)U1F002ovPDHLkV1n!EW;y@> literal 0 HcmV?d00001 diff --git a/v2/src-tauri/icons/StoreLogo.png b/v2/src-tauri/icons/StoreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..17d142c0a43208db62ca28b86a3239329ac93aea GIT binary patch literal 3971 zcmV-}4}9>6P);6;uvgf*kxC1(ek4#GQ1*4x23A}- zxv+9p(phNPI>`7aB|)Wn^Je?jbnvBh2O|$}O$Rn2Q5H5mQ+Z6D(f!W_Yf&4a3W{22 z`Hb9(RkO2SuT8j36=6;OEiG+xHJo7=-b|G)PWU*40kewPSn zQK`(B@FSWR%{=Q?Do8^`Z7+1+;-05JGpGM@2mwe4PjFs203$@H zJS6A=N0dlY(m8MW)chTTk{{jH8Q2Q^aAT}-oJ}HB2}+_qqEp|!tZUQkhQcMPC|q=h zLEuHSCbzUOIODG5g}$Qb$d*J#Yr_qgUWD74qb%I793EO33fD9jP0lZm2^RQud+0Ub zjE|)%=GkDvQA{O+I{NLUU2iueO3kt;959hZEg@`ex+PI~^I-IG1hlrb-+CVekWro? zvC^SbNHxu^buPVfa(?CPRPkbJB8AHM>{a6G#<~4>NhJLJ?TP!;+NGon z?}4S=FI~`>znYQ|NW#|(%VTe~Mjn4;XZ)X$z%l9%VlZMRT6=1I1jz_fM8B6d760-} z=lA|^D(+5EAPYg%jm6-=$u~BnZhWCN{LDus!^evYtgd(Ctid}d2?z99&J70$^!r<@ z|Nia`H7kzg%wwQjD`ulW05v{mppu4(BV>9U@0mf<6R#f*y?Fbp^|N*y3%w@F0sFXO zuEFlSp!ea%sI0-FN&4(L!wB5~45e#AI(F}(o@cS5VPSffj|Hsmx3^TUetdWAk(!{g zfDsZxHJWn!s?N%)9=5cVm)v>vaAZwO%DJ*WE~gPuXw6k1q#_Z{qHi1tuS4=Aocf$p zgaDqCoc+zLfxBW=rP@r+Y}Jk=$0@{JI@7q{?L#`lth}l5Vf;pTmo1Fg~M76P4t_nXVV3+7qv;@cMgunUAx|`nV z2(RlY@T^jb2}B8X<|C~J1&-EGMd^c?S`+7KKRK_GEcHJsV;>nXGe6!Hzw1jE_58pq z85*yn|5Wg@Nrlh;XlMLEB+S()RT&rkf-=SW_Q<;3U3@2Z@}-ceSs)Tl*i1@qguOr# ze9$%Yq^NAXenx)PrH#dF(Uw)PCwp8CzruaZ_gjxN#l~NFZ|Ab6!fla&uEJ}I?q`D+ zUO5zgRPdqBJj;q01~;`*GUR4iAd#xgHZ8fKf5wu}M>_VrShMAsdzl>(AW$__2_&Je znOgYtzqa%|!2`!N*M?NGugH6GjxiEf(9Ugu>#lw)8%RRy~P|$n*a;WB;122b>u69JO_I zU06+WJ)*vo*=x)d@lXj-9F&E|ISbQ^Z+)VeY?_Xw(ENbDTjW-@^8=5U&1)qa4shya zQ*yU4v|dFl?J|913@HfjqWa>eniFm_9PoZ9{qd@h-lX&9K~j9IH1{={ja1i^T!A7_?^SVyzs1DL;%420S!XR(5#x4c{h0Ti^^D zWFOlfEWcL19ey}k6#d_5^((leg(yp^cjojfWdt;A&XIs@5gTT*7%BI53Pn9k!%Rfp0N(NhXbmqlj8jmYg8XHE?`@#f6 zb)SFT-306kCWJ;M0@-wH)5{NBh${5SP{M|paEB)`^dMoR@pVV1wdHg0QVUY0rEy!= zz)0@g-DB+v_(t*sl~Og}sO5x+O8!Md@p>jJ429tL_uKDfiXsOg6{F4e<|)-exzdfL zlKr2!^iECMfdw_;R}WuDNvJ>sNdV*{K3ZN=e>pYXG>l{<0$kq~d|i_{=H>Z( zu}Sw2Q!((-d}!4 z*cs133n!lmcDKIEq@z6(4hhimMhU_ngDDAzJE@3{|L5Y& z3x+`ZKul@QH!aPd+Z}!A*r4bq+kdK=#2l@y3}9S_s}iMTLu zxHIm*xcjC0xI10BaJhI7Nm%JV`@oYQ#J&+ZO*KYmEdm!}l+o&G(1;qN9Hig#q4d5t zPHIuYjVv)(mWML)uDyfK15GQ^ntW=;g7z!!cvFQF38sLOVM0TJ!k%~-tOB>s%YNmD zSEYANh`G&_1kr8T>Kp8vTdHr#I))3a5vSXcrI>$JO&eDom@(FiMCE)Vl7!qF8%mIf;p z!8_50s9r49jCQhoG4xsMxZf8b1XfBk%pFlle=vby#uE|Qpo(0=LutYUX$-CXgYQ<~ zwsv3SvD4w=qrhI~bg#@vWpfIQpeO)*V8p2&ZL`6`bQyY-1w&$}0)vI=FhDYG!{Z<~SVLG&V?o7CY_U4h$gSO#_!fk7 z=EnBG86|OwiV%-tTQJvi2o#!wl1C7nCP6ILPFoy5u<3b!B=Al&BK@d)XUz(EdF<6f z?X)?BF=|2K7Fqo}Yi?JlMe0mRmsE3m~Fh(Zk!G3iKS= zuOXyEW^%Y8g+L~Ii@dwwXcqMf%(gj`B4Fa&GfLu=GrK>3I0Y@^bxpYmbC!Z$vBZkG z(NtZa|LCq@*MVKy3R=dA;9#0enn_fsbKmx8+m4sR9lO`VO!jzINSvGmINL4iVxg3` znae`qKqx=uf=@w%R)*4hUmee0+bNZuFcCet^@*N2%kD+1`HVyqoLR8^zawospEKN| z!-RE0XBpqU!;A=?5hpSxilzpPxAQ z20Poi&F(*TgahoXES?p1CUsB@ufxL^wT#x(bS=91yWQt6zmJoD^G7BRpo#}$N4CF` zdiTjYfhS{#qR(X_WjBaHD%7!evkt}Ua}(z*1PQp<{4^1aaw0Vov(1ZcFV#+K!8Rid zh8)0AK!0ocI#dUv)kwIdch0h}bS}K2FEYfa+BqN4I6##7od)t23_}W7kn}gkHvic_x!?~)+a34tm4~2f7L%H)4KY5iW zY%Do#mtj;)%GUy8A-t~P(WK!|+IX0jiAspr;ce?0-~6AeM83C| zzFaWQB8jmlGNh5{sBqi+>%-~2zktTfaS{`z07oQtw92r2*qqSxy^|~-XfeN@z?HTF zs9acBxlBjhmS?`4+Wgc%Q9F5NK%8w7V{EOH#S-&|1Ws74Y5q0Y<|Utp23!H#pD6D% zo}ev%L&~H1B(Km$TcfR8*2G&k{aECBbJ~vZijmgr96ZMN)f>$l#LjNP4?@OjYfH&V z7nZ6f%vIs4CfJ!MD&hc3Y1&GKO?l7m@7RxFi@_0~LgpC@-XA8B;R(@`autz*QCZxf zZOx&dXh|HlK{`Z~J06`Fmqi(SpHn literal 0 HcmV?d00001 diff --git a/v2/src-tauri/icons/icon.icns b/v2/src-tauri/icons/icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..a2993adc87ff15230d919da5a3a6600f0892b48d GIT binary patch literal 277003 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
j#(n6`cTK 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 + import SessionList from './lib/components/Sidebar/SessionList.svelte'; + import TilingGrid from './lib/components/Layout/TilingGrid.svelte'; + + + +
+ +
+ + diff --git a/v2/src/app.css b/v2/src/app.css new file mode 100644 index 0000000..a066da9 --- /dev/null +++ b/v2/src/app.css @@ -0,0 +1,61 @@ +@import './lib/styles/catppuccin.css'; + +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +html, body { + height: 100%; + width: 100%; + overflow: hidden; + background: var(--bg-primary); + color: var(--text-primary); + font-family: 'JetBrains Mono', 'Fira Code', 'Cascadia Code', monospace; + font-size: 13px; + line-height: 1.4; + -webkit-font-smoothing: antialiased; +} + +#app { + height: 100%; + width: 100%; + display: grid; + grid-template-columns: var(--sidebar-width) 1fr; + grid-template-rows: 1fr; +} + +/* Ultrawide: show right panel */ +@media (min-width: 3440px) { + #app { + grid-template-columns: var(--sidebar-width) 1fr var(--right-panel-width); + } +} + +/* Narrow: collapse sidebar to icons */ +@media (max-width: 1200px) { + #app { + grid-template-columns: 48px 1fr; + } +} + +::-webkit-scrollbar { + width: 6px; + height: 6px; +} + +::-webkit-scrollbar-track { + background: var(--bg-secondary); +} + +::-webkit-scrollbar-thumb { + background: var(--ctp-surface2); + border-radius: 3px; +} + +::-webkit-scrollbar-thumb:hover { + background: var(--ctp-overlay0); +} diff --git a/v2/src/lib/adapters/pty-bridge.ts b/v2/src/lib/adapters/pty-bridge.ts new file mode 100644 index 0000000..5f64450 --- /dev/null +++ b/v2/src/lib/adapters/pty-bridge.ts @@ -0,0 +1,30 @@ +// PTY Bridge — IPC wrapper for Rust PTY backend +// Phase 2: terminal spawn, resize, input/output streaming + +export interface PtyOptions { + shell?: string; + cwd?: string; + env?: Record; + cols?: number; + rows?: number; +} + +/** + * Spawn a new PTY session via Tauri IPC. + * Phase 2: implement with @tauri-apps/api invoke + */ +export async function spawnPty(_options: PtyOptions): Promise { + throw new Error('Not implemented — Phase 2'); +} + +export async function writePty(_id: string, _data: string): Promise { + throw new Error('Not implemented — Phase 2'); +} + +export async function resizePty(_id: string, _cols: number, _rows: number): Promise { + throw new Error('Not implemented — Phase 2'); +} + +export async function killPty(_id: string): Promise { + throw new Error('Not implemented — Phase 2'); +} diff --git a/v2/src/lib/adapters/sdk-messages.ts b/v2/src/lib/adapters/sdk-messages.ts new file mode 100644 index 0000000..fc85e13 --- /dev/null +++ b/v2/src/lib/adapters/sdk-messages.ts @@ -0,0 +1,25 @@ +// SDK Message Adapter — insulates UI from Claude Agent SDK wire format changes +// This is the ONLY place that knows SDK internals. +// Phase 3: full implementation + +export interface AgentMessage { + id: string; + type: 'text' | 'tool_call' | 'tool_result' | 'subagent_spawn' | 'subagent_stop' | 'status' | 'cost' | 'unknown'; + parentId?: string; + content: unknown; + timestamp: number; +} + +/** + * Adapt a raw SDK message to our internal format. + * When SDK changes wire format, only this function needs updating. + */ +export function adaptSDKMessage(raw: Record): AgentMessage { + // Phase 3: implement based on actual SDK message types + return { + id: (raw.id as string) ?? crypto.randomUUID(), + type: 'unknown', + content: raw, + timestamp: Date.now(), + }; +} diff --git a/v2/src/lib/components/Layout/PaneContainer.svelte b/v2/src/lib/components/Layout/PaneContainer.svelte new file mode 100644 index 0000000..6ae33e5 --- /dev/null +++ b/v2/src/lib/components/Layout/PaneContainer.svelte @@ -0,0 +1,54 @@ + + +
+
+ {title} +
+
+ {@render children()} +
+
+ + diff --git a/v2/src/lib/components/Layout/PaneHeader.svelte b/v2/src/lib/components/Layout/PaneHeader.svelte new file mode 100644 index 0000000..7766ef1 --- /dev/null +++ b/v2/src/lib/components/Layout/PaneHeader.svelte @@ -0,0 +1,44 @@ + + +
+ {title} + {#if status !== 'idle'} + {status} + {/if} +
+ + diff --git a/v2/src/lib/components/Layout/TilingGrid.svelte b/v2/src/lib/components/Layout/TilingGrid.svelte new file mode 100644 index 0000000..860e629 --- /dev/null +++ b/v2/src/lib/components/Layout/TilingGrid.svelte @@ -0,0 +1,58 @@ + + +
+ +
+

BTerminal v2

+

Claude Agent Mission Control

+
+ Phase 1 — Scaffold +
+
+
+
+ + diff --git a/v2/src/lib/components/Sidebar/SessionList.svelte b/v2/src/lib/components/Sidebar/SessionList.svelte new file mode 100644 index 0000000..163fb2f --- /dev/null +++ b/v2/src/lib/components/Sidebar/SessionList.svelte @@ -0,0 +1,39 @@ + + +
+
+

Sessions

+
+
+

No sessions yet.

+

Phase 2 will add terminal sessions.

+
+
+ + diff --git a/v2/src/lib/stores/agents.ts b/v2/src/lib/stores/agents.ts new file mode 100644 index 0000000..26dba97 --- /dev/null +++ b/v2/src/lib/stores/agents.ts @@ -0,0 +1,34 @@ +// Agent tracking state — Svelte 5 runes +// Phase 3: SDK agent lifecycle, subagent tree + +export type AgentStatus = 'idle' | 'running' | 'thinking' | 'waiting' | 'done' | 'error'; + +export interface AgentState { + id: string; + sessionId: string; + parentId?: string; + status: AgentStatus; + model?: string; + costUsd?: number; + tokensIn?: number; + tokensOut?: number; +} + +let agents = $state([]); + +export function getAgents() { + return agents; +} + +export function getAgentTree(rootId: string): AgentState[] { + const result: AgentState[] = []; + const root = agents.find(a => a.id === rootId); + if (!root) return result; + + result.push(root); + const children = agents.filter(a => a.parentId === rootId); + for (const child of children) { + result.push(...getAgentTree(child.id)); + } + return result; +} diff --git a/v2/src/lib/stores/layout.ts b/v2/src/lib/stores/layout.ts new file mode 100644 index 0000000..f8811bc --- /dev/null +++ b/v2/src/lib/stores/layout.ts @@ -0,0 +1,28 @@ +// Layout state management — Svelte 5 runes +// Phase 2: pane positions, resize, presets + +export type LayoutPreset = '1-col' | '2-col' | '3-col' | '2x2' | 'master-stack'; + +export interface PaneState { + id: string; + sessionId: string; + row: number; + col: number; + rowSpan: number; + colSpan: number; +} + +let activePreset = $state('1-col'); +let panes = $state([]); + +export function getActivePreset() { + return activePreset; +} + +export function setPreset(preset: LayoutPreset) { + activePreset = preset; +} + +export function getPanes() { + return panes; +} diff --git a/v2/src/lib/stores/sessions.ts b/v2/src/lib/stores/sessions.ts new file mode 100644 index 0000000..ab1ecef --- /dev/null +++ b/v2/src/lib/stores/sessions.ts @@ -0,0 +1,26 @@ +// Session state management — Svelte 5 runes +// Phase 4: full session CRUD, persistence + +export type SessionType = 'terminal' | 'agent' | 'markdown'; + +export interface Session { + id: string; + type: SessionType; + title: string; + createdAt: number; +} + +// Reactive session list +let sessions = $state([]); + +export function getSessions() { + return sessions; +} + +export function addSession(session: Session) { + sessions.push(session); +} + +export function removeSession(id: string) { + sessions = sessions.filter(s => s.id !== id); +} diff --git a/v2/src/lib/styles/catppuccin.css b/v2/src/lib/styles/catppuccin.css new file mode 100644 index 0000000..3875d3f --- /dev/null +++ b/v2/src/lib/styles/catppuccin.css @@ -0,0 +1,52 @@ +/* Catppuccin Mocha — https://catppuccin.com/palette */ +:root { + --ctp-rosewater: #f5e0dc; + --ctp-flamingo: #f2cdcd; + --ctp-pink: #f5c2e7; + --ctp-mauve: #cba6f7; + --ctp-red: #f38ba8; + --ctp-maroon: #eba0ac; + --ctp-peach: #fab387; + --ctp-yellow: #f9e2af; + --ctp-green: #a6e3a1; + --ctp-teal: #94e2d5; + --ctp-sky: #89dceb; + --ctp-sapphire: #74c7ec; + --ctp-blue: #89b4fa; + --ctp-lavender: #b4befe; + --ctp-text: #cdd6f4; + --ctp-subtext1: #bac2de; + --ctp-subtext0: #a6adc8; + --ctp-overlay2: #9399b2; + --ctp-overlay1: #7f849c; + --ctp-overlay0: #6c7086; + --ctp-surface2: #585b70; + --ctp-surface1: #45475a; + --ctp-surface0: #313244; + --ctp-base: #1e1e2e; + --ctp-mantle: #181825; + --ctp-crust: #11111b; + + /* Semantic aliases */ + --bg-primary: var(--ctp-base); + --bg-secondary: var(--ctp-mantle); + --bg-tertiary: var(--ctp-crust); + --bg-surface: var(--ctp-surface0); + --bg-surface-hover: var(--ctp-surface1); + --text-primary: var(--ctp-text); + --text-secondary: var(--ctp-subtext1); + --text-muted: var(--ctp-overlay1); + --border: var(--ctp-surface1); + --accent: var(--ctp-blue); + --accent-hover: var(--ctp-sapphire); + --success: var(--ctp-green); + --warning: var(--ctp-yellow); + --error: var(--ctp-red); + + /* Layout */ + --sidebar-width: 260px; + --right-panel-width: 380px; + --pane-header-height: 32px; + --pane-gap: 2px; + --border-radius: 4px; +} diff --git a/v2/src/main.ts b/v2/src/main.ts new file mode 100644 index 0000000..664a057 --- /dev/null +++ b/v2/src/main.ts @@ -0,0 +1,9 @@ +import { mount } from 'svelte' +import './app.css' +import App from './App.svelte' + +const app = mount(App, { + target: document.getElementById('app')!, +}) + +export default app diff --git a/v2/svelte.config.js b/v2/svelte.config.js new file mode 100644 index 0000000..96b3455 --- /dev/null +++ b/v2/svelte.config.js @@ -0,0 +1,8 @@ +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte' + +/** @type {import("@sveltejs/vite-plugin-svelte").SvelteConfig} */ +export default { + // Consult https://svelte.dev/docs#compile-time-svelte-preprocess + // for more information about preprocessors + preprocess: vitePreprocess(), +} diff --git a/v2/tsconfig.app.json b/v2/tsconfig.app.json new file mode 100644 index 0000000..31c18cf --- /dev/null +++ b/v2/tsconfig.app.json @@ -0,0 +1,21 @@ +{ + "extends": "@tsconfig/svelte/tsconfig.json", + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2022", + "useDefineForClassFields": true, + "module": "ESNext", + "types": ["svelte", "vite/client"], + "noEmit": true, + /** + * Typecheck JS in `.svelte` and `.js` files by default. + * Disable checkJs if you'd like to use dynamic types in JS. + * Note that setting allowJs false does not prevent the use + * of JS in `.svelte` files. + */ + "allowJs": true, + "checkJs": true, + "moduleDetection": "force" + }, + "include": ["src/**/*.ts", "src/**/*.js", "src/**/*.svelte"] +} diff --git a/v2/tsconfig.json b/v2/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/v2/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/v2/tsconfig.node.json b/v2/tsconfig.node.json new file mode 100644 index 0000000..8a67f62 --- /dev/null +++ b/v2/tsconfig.node.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/v2/vite.config.ts b/v2/vite.config.ts new file mode 100644 index 0000000..80c479e --- /dev/null +++ b/v2/vite.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from 'vite' +import { svelte } from '@sveltejs/vite-plugin-svelte' + +export default defineConfig({ + plugins: [svelte()], + server: { + port: 9700, + strictPort: true, + }, + clearScreen: false, +}) From 89a98adb6133b578c3b3bdce2930f69d939e77b2 Mon Sep 17 00:00:00 2001 From: Hibryda Date: Thu, 5 Mar 2026 23:26:40 +0100 Subject: [PATCH 013/355] docs: mark Phase 1 scaffolding as complete --- docs/phases.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/phases.md b/docs/phases.md index 9acc73d..014f0bf 100644 --- a/docs/phases.md +++ b/docs/phases.md @@ -4,14 +4,14 @@ See [task_plan.md](task_plan.md) for architecture decisions, error handling, and --- -## Phase 1: Project Scaffolding [status: not_started] — MVP +## Phase 1: Project Scaffolding [status: complete] — MVP -- [ ] Create feature branch `v2-mission-control` -- [ ] Initialize Tauri 2.x project with Svelte 5 frontend -- [ ] Project structure (see below) -- [ ] Basic Tauri window with Catppuccin Mocha CSS variables -- [ ] Verify Tauri builds and launches on target system -- [ ] Set up dev scripts (dev, build, lint) +- [x] Create feature branch `v2-mission-control` +- [x] Initialize Tauri 2.x project with Svelte 5 frontend +- [x] Project structure (see below) +- [x] Basic Tauri window with Catppuccin Mocha CSS variables +- [x] Verify Tauri builds and launches on target system +- [x] Set up dev scripts (dev, build, lint) ### File Structure ``` From bb93bd1c9a1b8614edb9661b3926293480466ee7 Mon Sep 17 00:00:00 2001 From: Hibryda Date: Thu, 5 Mar 2026 23:32:00 +0100 Subject: [PATCH 014/355] chore(v2): add Cargo.lock and VS Code extensions config Include Cargo.lock for reproducible Rust builds and recommended Svelte extension for VS Code. --- v2/.vscode/extensions.json | 3 + v2/src-tauri/Cargo.lock | 5024 ++++++++++++++++++++++++++++++++++++ 2 files changed, 5027 insertions(+) create mode 100644 v2/.vscode/extensions.json create mode 100644 v2/src-tauri/Cargo.lock diff --git a/v2/.vscode/extensions.json b/v2/.vscode/extensions.json new file mode 100644 index 0000000..bdef820 --- /dev/null +++ b/v2/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["svelte.svelte-vscode"] +} diff --git a/v2/src-tauri/Cargo.lock b/v2/src-tauri/Cargo.lock new file mode 100644 index 0000000..96cb8e3 --- /dev/null +++ b/v2/src-tauri/Cargo.lock @@ -0,0 +1,5024 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.17", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "android_log-sys" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84521a3cf562bc62942e294181d9eef17eb38ceb8c68677bc49f144e4c3d4f8d" + +[[package]] +name = "android_logger" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb4e440d04be07da1f1bf44fb4495ebd58669372fe0cffa6e48595ac5bd88a3" +dependencies = [ + "android_log-sys", + "env_filter", + "log", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "atk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +dependencies = [ + "serde_core", +] + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[package]] +name = "borsh" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" +dependencies = [ + "borsh-derive", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c" +dependencies = [ + "once_cell", + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "brotli" +version = "8.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bterminal" +version = "0.1.0" +dependencies = [ + "log", + "serde", + "serde_json", + "tauri", + "tauri-build", + "tauri-plugin-log", +] + +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + +[[package]] +name = "byte-unit" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c6d47a4e2961fb8721bcfc54feae6455f2f64e7054f9bc67e875f0e77f4c58d" +dependencies = [ + "rust_decimal", + "schemars 1.2.1", + "serde", + "utf8-width", +] + +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +dependencies = [ + "serde", +] + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.11.0", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror 1.0.69", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.18", +] + +[[package]] +name = "cargo_toml" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" +dependencies = [ + "serde", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "cc" +version = "1.2.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link 0.2.1", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "time", + "version_check", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" +dependencies = [ + "bitflags 2.11.0", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.11.0", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.29.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "matches", + "phf 0.10.1", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ctor" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "powerfmt", + "serde_core", +] + +[[package]] +name = "derive_more" +version = "0.99.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.117", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.11.0", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dlopen2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +dependencies = [ + "serde", +] + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "embed-resource" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 0.9.12+spec-1.1.0", + "vswhom", + "winreg", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "env_filter" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "fern" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4316185f709b23713e41e3195f90edef7fb00c3ed4adc79769cf09cc762a3b29" +dependencies = [ + "log", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gdk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", +] + +[[package]] +name = "gdkx11-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps", + "x11", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "wasip2", + "wasip3", +] + +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.11.0", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.2", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "html5ever" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" +dependencies = [ + "log", + "mac", + "markup5ever", + "match_token", +] + +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ico" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371" +dependencies = [ + "byteorder", + "png", +] + +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", + "serde", + "serde_core", +] + +[[package]] +name = "infer" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" +dependencies = [ + "cfb", +] + +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[package]] +name = "iri-string" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "itoa" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" + +[[package]] +name = "javascriptcore-rs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "js-sys" +version = "0.3.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "jsonptr" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.11.0", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "kuchikiki" +version = "0.8.8-speedreader" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" +dependencies = [ + "cssparser", + "html5ever", + "indexmap 2.13.0", + "selectors", +] + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "libappindicator" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading", + "once_cell", +] + +[[package]] +name = "libc" +version = "0.2.182" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libredox" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1744e39d1d6a9948f4f388969627434e31128196de472883b39f148769bfe30a" +dependencies = [ + "libc", +] + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +dependencies = [ + "value-bag", +] + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "markup5ever" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18" +dependencies = [ + "log", + "phf 0.11.3", + "phf_codegen 0.11.3", + "string_cache", + "string_cache_codegen", + "tendril", +] + +[[package]] +name = "match_token" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.61.2", +] + +[[package]] +name = "muda" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "once_cell", + "png", + "serde", + "thiserror 2.0.18", + "windows-sys 0.60.2", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.11.0", + "jni-sys", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "num-conv" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "num_threads" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +dependencies = [ + "libc", +] + +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", + "objc2-exception-helper", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.11.0", + "block2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.11.0", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.11.0", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-exception-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" +dependencies = [ + "cc", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.11.0", + "block2", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-web-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" +dependencies = [ + "bitflags 2.11.0", + "block2", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link 0.2.1", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_shared 0.8.0", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_macros 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_codegen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.5", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared 0.11.3", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher 1.0.2", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plist" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" +dependencies = [ + "base64 0.22.1", + "indexmap 2.13.0", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.117", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit 0.25.4+spec-1.1.0", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "quick-xml" +version = "0.38.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.18", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "reqwest" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "sync_wrapper", + "tokio", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "rkyv" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rust_decimal" +version = "1.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61f703d19852dbf87cbc513643fa81428361eb6940f1ac14fd58155d295a3eb0" +dependencies = [ + "arrayvec", + "borsh", + "bytes", + "num-traits", + "rand 0.8.5", + "rkyv", + "serde", + "serde_json", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", + "uuid", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.117", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "selectors" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" +dependencies = [ + "bitflags 1.3.2", + "cssparser", + "derive_more", + "fxhash", + "log", + "phf 0.8.0", + "phf_codegen 0.8.0", + "precomputed-hash", + "servo_arc", + "smallvec", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_with" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "381b283ce7bc6b476d903296fb59d0d36633652b633b27f64db4fb46dcbfc3b9" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.13.0", + "schemars 0.9.0", + "schemars 1.2.1", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6d4e30573c8cb306ed6ab1dca8423eec9a463ea0e155f45399455e0368b27e0" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "servo_arc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "siphasher" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "softbuffer" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +dependencies = [ + "bytemuck", + "js-sys", + "ndk", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall", + "tracing", + "wasm-bindgen", + "web-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "soup3" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "string_cache" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared 0.11.3", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "swift-rs" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml 0.8.2", + "version-compare", +] + +[[package]] +name = "tao" +version = "0.34.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d52c379e63da659a483a958110bbde891695a0ecb53e48cc7786d5eda7bb" +dependencies = [ + "bitflags 2.11.0", + "block2", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dispatch2", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "jni", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "once_cell", + "parking_lot", + "raw-window-handle", + "tao-macros", + "unicode-segmentation", + "url", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tauri" +version = "2.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da77cc00fb9028caf5b5d4650f75e31f1ef3693459dfca7f7e506d1ecef0ba2d" +dependencies = [ + "anyhow", + "bytes", + "cookie", + "dirs", + "dunce", + "embed_plist", + "getrandom 0.3.4", + "glob", + "gtk", + "heck 0.5.0", + "http", + "jni", + "libc", + "log", + "mime", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "percent-encoding", + "plist", + "raw-window-handle", + "reqwest", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror 2.0.18", + "tokio", + "tray-icon", + "url", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows", +] + +[[package]] +name = "tauri-build" +version = "2.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bbc990d1dbf57a8e1c7fa2327f2a614d8b757805603c1b9ba5c81bade09fd4d" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs", + "glob", + "heck 0.5.0", + "json-patch", + "schemars 0.8.22", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "toml 0.9.12+spec-1.1.0", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a24476afd977c5d5d169f72425868613d82747916dd29e0a357c84c4bd6d29" +dependencies = [ + "base64 0.22.1", + "brotli", + "ico", + "json-patch", + "plist", + "png", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "syn 2.0.117", + "tauri-utils", + "thiserror 2.0.18", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d39b349a98dadaffebb73f0a40dcd1f23c999211e5a2e744403db384d0c33de7" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-plugin" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddde7d51c907b940fb573006cdda9a642d6a7c8153657e88f8a5c3c9290cd4aa" +dependencies = [ + "anyhow", + "glob", + "plist", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri-utils", + "toml 0.9.12+spec-1.1.0", + "walkdir", +] + +[[package]] +name = "tauri-plugin-log" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7545bd67f070a4500432c826e2e0682146a1d6712aee22a2786490156b574d93" +dependencies = [ + "android_logger", + "byte-unit", + "fern", + "log", + "objc2", + "objc2-foundation", + "serde", + "serde_json", + "serde_repr", + "swift-rs", + "tauri", + "tauri-plugin", + "thiserror 2.0.18", + "time", +] + +[[package]] +name = "tauri-runtime" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2826d79a3297ed08cd6ea7f412644ef58e32969504bc4fbd8d7dbeabc4445ea2" +dependencies = [ + "cookie", + "dpi", + "gtk", + "http", + "jni", + "objc2", + "objc2-ui-kit", + "objc2-web-kit", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror 2.0.18", + "url", + "webkit2gtk", + "webview2-com", + "windows", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11ea2e6f801d275fdd890d6c9603736012742a1c33b96d0db788c9cdebf7f9e" +dependencies = [ + "gtk", + "http", + "jni", + "log", + "objc2", + "objc2-app-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "softbuffer", + "tao", + "tauri-runtime", + "tauri-utils", + "url", + "webkit2gtk", + "webview2-com", + "windows", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219a1f983a2af3653f75b5747f76733b0da7ff03069c7a41901a5eb3ace4557d" +dependencies = [ + "anyhow", + "brotli", + "cargo_metadata", + "ctor", + "dunce", + "glob", + "html5ever", + "http", + "infer", + "json-patch", + "kuchikiki", + "log", + "memchr", + "phf 0.11.3", + "proc-macro2", + "quote", + "regex", + "schemars 0.8.22", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror 2.0.18", + "toml 0.9.12+spec-1.1.0", + "url", + "urlpattern", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1087b111fe2b005e42dbdc1990fc18593234238d47453b0c99b7de1c9ab2c1e0" +dependencies = [ + "dunce", + "embed-resource", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "time" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "itoa", + "libc", + "num-conv", + "num_threads", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "time-macros" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "toml" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap 2.13.0", + "serde_core", + "serde_spanned 1.0.4", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_datetime" +version = "1.0.0+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32c2555c699578a4f59f0cc68e5116c8d7cabbd45e1409b989d4be085b53f13e" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.13.0", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.13.0", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.25.4+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7193cbd0ce53dc966037f54351dbbcf0d5a642c7f0038c382ef9e677ce8c13f2" +dependencies = [ + "indexmap 2.13.0", + "toml_datetime 1.0.0+spec-1.1.0", + "toml_parser", + "winnow 0.7.15", +] + +[[package]] +name = "toml_parser" +version = "1.0.9+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" +dependencies = [ + "winnow 0.7.15", +] + +[[package]] +name = "toml_writer" +version = "1.0.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "bitflags 2.11.0", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tray-icon" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e85aa143ceb072062fc4d6356c1b520a51d636e7bc8e77ec94be3608e5e80c" +dependencies = [ + "crossbeam-channel", + "dirs", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "once_cell", + "png", + "serde", + "thiserror 2.0.18", + "windows-sys 0.60.2", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "urlpattern" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "url", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8-width" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1292c0d970b54115d14f2492fe0170adf21d68a1de108eebc51c1df4f346a091" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" +dependencies = [ + "getrandom 0.4.2", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "value-bag" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0" + +[[package]] +name = "version-compare" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" +dependencies = [ + "cfg-if", + "futures-util", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.117", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap 2.13.0", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.0", + "hashbrown 0.15.5", + "indexmap 2.13.0", + "semver", +] + +[[package]] +name = "web-sys" +version = "0.3.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webkit2gtk" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup3", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pkg-config", + "soup3-sys", + "system-deps", +] + +[[package]] +name = "webview2-com" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows", + "windows-core 0.61.2", + "windows-implement", + "windows-interface", +] + +[[package]] +name = "webview2-com-macros" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "webview2-com-sys" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" +dependencies = [ + "thiserror 2.0.18", + "windows", + "windows-core 0.61.2", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "window-vibrancy" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" +dependencies = [ + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "raw-window-handle", + "windows-sys 0.59.0", + "windows-version", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-version" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.55.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" +dependencies = [ + "cfg-if", + "windows-sys 0.59.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck 0.5.0", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap 2.13.0", + "prettyplease", + "syn 2.0.117", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.117", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.11.0", + "indexmap 2.13.0", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.13.0", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "wry" +version = "0.54.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb26159b420aa77684589a744ae9a9461a95395b848764ad12290a14d960a11a" +dependencies = [ + "base64 0.22.1", + "block2", + "cookie", + "crossbeam-channel", + "dirs", + "dpi", + "dunce", + "gdkx11", + "gtk", + "html5ever", + "http", + "javascriptcore-rs", + "jni", + "kuchikiki", + "libc", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "sha2", + "soup3", + "tao-macros", + "thiserror 2.0.18", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a789c6e490b576db9f7e6b6d661bcc9799f7c0ac8352f56ea20193b2681532e5" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f65c489a7071a749c849713807783f70672b28094011623e200cb86dcb835953" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" From 9bd15b359b5705d969290000e8aaa56e1d608f82 Mon Sep 17 00:00:00 2001 From: Hibryda Date: Thu, 5 Mar 2026 23:32:11 +0100 Subject: [PATCH 015/355] docs: update progress log and documentation index Add Phase 1 completion details to progress.md and document index table to docs/README.md linking all planning documents. --- docs/README.md | 9 +++++++++ docs/progress.md | 16 +++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/docs/README.md b/docs/README.md index e68a108..5acd8f0 100644 --- a/docs/README.md +++ b/docs/README.md @@ -11,3 +11,12 @@ description: "Project documentation index" Project documentation lives here. > This directory is maintained automatically. When features are added or changed, corresponding documentation is updated. + +## Index + +| Document | Description | +|----------|-------------| +| [task_plan.md](task_plan.md) | v2 architecture decisions, error handling, testing strategy | +| [phases.md](phases.md) | v2 implementation phases (1-6) with checklists | +| [findings.md](findings.md) | Research findings (Agent SDK, Tauri, xterm.js, performance) | +| [progress.md](progress.md) | Session-by-session progress log | diff --git a/docs/progress.md b/docs/progress.md index 4d35770..2a07516 100644 --- a/docs/progress.md +++ b/docs/progress.md @@ -31,7 +31,17 @@ - [x] Defined MVP boundary (Phases 1-4) - [x] Added responsive layout requirement (1920px degraded mode) +### Phase 1 Scaffolding (complete) +- [x] Created feature branch `v2-mission-control` +- [x] Initialized Tauri 2.x + Svelte 5 project in `v2/` directory +- [x] Rust backend stubs: main.rs, lib.rs, pty.rs, sidecar.rs, watcher.rs, session.rs +- [x] Svelte frontend: App.svelte with Catppuccin Mocha CSS variables, component stubs +- [x] Node.js sidecar scaffold: agent-runner.ts with NDJSON communication pattern +- [x] Tauri builds and launches (cargo build --release verified) +- [x] Dev scripts: npm run dev, npm run build, npm run tauri dev/build +- [x] 17 operational rules added to `.claude/rules/` +- [x] Project meta files: CLAUDE.md, .claude/CLAUDE.md, TODO.md, CHANGELOG.md +- [x] Documentation structure: docs/README.md, task_plan.md, phases.md, findings.md, progress.md + ### Next Steps -- [ ] Present plan to user for review and decision -- [ ] Create feature branch -- [ ] Begin Phase 1: Project scaffolding +- [ ] Begin Phase 2: Terminal Pane + Layout (CSS Grid, xterm.js, PTY) From 406683799b5d385eb09b352c5dfaa62373f3e4f7 Mon Sep 17 00:00:00 2001 From: Hibryda Date: Thu, 5 Mar 2026 23:32:19 +0100 Subject: [PATCH 016/355] docs: reflect Phase 1 completion in README, TODO, and CHANGELOG Move Phase 1 to completed in TODO.md, update README.md v2 status, and add scaffolding entries to CHANGELOG.md. --- CHANGELOG.md | 6 ++++++ README.md | 2 +- TODO.md | 3 +-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8955c0f..54eb805 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,10 +8,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added +- v2 project scaffolding: Tauri 2.x + Svelte 5 in `v2/` directory (Phase 1 complete) +- Rust backend stubs: main.rs, lib.rs, pty.rs, sidecar.rs, watcher.rs, session.rs +- Svelte frontend with Catppuccin Mocha CSS variables and component structure +- Node.js sidecar scaffold with NDJSON communication pattern - v2 architecture planning: Tauri 2.x + Svelte 5 + Claude Agent SDK via Node.js sidecar - Research documentation covering Agent SDK, xterm.js performance, Tauri ecosystem, and ultrawide layout patterns - Phased implementation plan (6 phases, MVP = Phases 1-4) - Error handling and testing strategy for v2 - Documentation structure in `docs/` (task_plan, phases, findings, progress) +- 17 operational rules in `.claude/rules/` - TODO.md for tracking active work - `.claude/CLAUDE.md` behavioral guide for Claude sessions +- VS Code workspace configuration with Peacock color diff --git a/README.md b/README.md index 62ae11d..f6467da 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Terminal with session panel (MobaXterm-style), built with GTK 3 + VTE. Catppuccin Mocha theme. -> **v2 in planning:** Redesign as a multi-session Claude agent dashboard using Tauri 2.x + Svelte 5 + Claude Agent SDK. See [docs/task_plan.md](docs/task_plan.md) for architecture and [docs/phases.md](docs/phases.md) for implementation plan. +> **v2 in progress (Phase 1 complete):** Redesign as a multi-session Claude agent dashboard using Tauri 2.x + Svelte 5 + Claude Agent SDK. Project scaffolded on branch `v2-mission-control`. See [docs/task_plan.md](docs/task_plan.md) for architecture and [docs/phases.md](docs/phases.md) for implementation plan. ![BTerminal](screenshot.png) diff --git a/TODO.md b/TODO.md index 86fc4cd..3728723 100644 --- a/TODO.md +++ b/TODO.md @@ -2,7 +2,6 @@ ## Active -- [ ] **Phase 1: Project Scaffolding** — Create feature branch, init Tauri 2.x + Svelte 5, basic window with Catppuccin theme. See [docs/phases.md](docs/phases.md). - [ ] **Phase 2: Terminal Pane + Layout** — CSS Grid tiling, xterm.js with Canvas addon, PTY via portable-pty, SSH/shell/Claude CLI support. - [ ] **Phase 3: Agent SDK Integration** — Node.js sidecar, SDK message adapter, structured agent panes with tool call cards. - [ ] **Phase 4: Session Management + Markdown** — SQLite persistence, session CRUD, file watcher, markdown rendering. MVP ship after this phase. @@ -11,4 +10,4 @@ ## Completed -(none yet) +- [x] **Phase 1: Project Scaffolding** — Tauri 2.x + Svelte 5 scaffolded in `v2/`, Catppuccin theme, Rust stubs, sidecar scaffold. | Done: 2026-03-05 From f15e60be60037cfeb3c9d729ad912886e88aa893 Mon Sep 17 00:00:00 2001 From: Hibryda Date: Thu, 5 Mar 2026 23:42:20 +0100 Subject: [PATCH 017/355] feat(v2): add PTY backend with portable-pty - Implement PtyManager: spawn, write, resize, kill operations - Wire Tauri commands: pty_spawn, pty_write, pty_resize, pty_kill - Reader thread streams PTY output via Tauri events (pty-data-{id}) - Process exit detection emits pty-exit-{id} event - Add portable-pty 0.8 and uuid 1.0 dependencies --- v2/src-tauri/Cargo.lock | 158 ++++++++++++++++++++++++++++++++++++++- v2/src-tauri/Cargo.toml | 2 + v2/src-tauri/src/lib.rs | 79 ++++++++++++++++---- v2/src-tauri/src/pty.rs | 162 +++++++++++++++++++++++++++++++++++++++- 4 files changed, 384 insertions(+), 17 deletions(-) diff --git a/v2/src-tauri/Cargo.lock b/v2/src-tauri/Cargo.lock index 96cb8e3..2cd8736 100644 --- a/v2/src-tauri/Cargo.lock +++ b/v2/src-tauri/Cargo.lock @@ -222,11 +222,13 @@ name = "bterminal" version = "0.1.0" dependencies = [ "log", + "portable-pty", "serde", "serde_json", "tauri", "tauri-build", "tauri-plugin-log", + "uuid", ] [[package]] @@ -699,6 +701,12 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + [[package]] name = "dpi" version = "0.1.2" @@ -746,7 +754,7 @@ dependencies = [ "rustc_version", "toml 0.9.12+spec-1.1.0", "vswhom", - "winreg", + "winreg 0.55.0", ] [[package]] @@ -806,10 +814,21 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" dependencies = [ - "memoffset", + "memoffset 0.9.1", "rustc_version", ] +[[package]] +name = "filedescriptor" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e40758ed24c9b2eeb76c35fb0aebc66c626084edd827e07e1552279814c6682d" +dependencies = [ + "libc", + "thiserror 1.0.69", + "winapi", +] + [[package]] name = "find-msvc-tools" version = "0.1.9" @@ -1591,6 +1610,15 @@ dependencies = [ "cfb", ] +[[package]] +name = "ioctl-rs" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7970510895cee30b3e9128319f2cefd4bde883a39f38baa279567ba3a7eb97d" +dependencies = [ + "libc", +] + [[package]] name = "ipnet" version = "2.12.0" @@ -1713,6 +1741,12 @@ dependencies = [ "selectors", ] +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + [[package]] name = "leb128fmt" version = "0.1.0" @@ -1835,6 +1869,15 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + [[package]] name = "memoffset" version = "0.9.1" @@ -1928,6 +1971,20 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" +[[package]] +name = "nix" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" +dependencies = [ + "autocfg", + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.6.5", + "pin-utils", +] + [[package]] name = "nodrop" version = "0.1.14" @@ -2347,6 +2404,27 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "portable-pty" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "806ee80c2a03dbe1a9fb9534f8d19e4c0546b790cde8fd1fea9d6390644cb0be" +dependencies = [ + "anyhow", + "bitflags 1.3.2", + "downcast-rs", + "filedescriptor", + "lazy_static", + "libc", + "log", + "nix", + "serial", + "shared_library", + "shell-words", + "winapi", + "winreg 0.10.1", +] + [[package]] name = "potential_utf" version = "0.1.4" @@ -2996,6 +3074,48 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "serial" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1237a96570fc377c13baa1b88c7589ab66edced652e43ffb17088f003db3e86" +dependencies = [ + "serial-core", + "serial-unix", + "serial-windows", +] + +[[package]] +name = "serial-core" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f46209b345401737ae2125fe5b19a77acce90cd53e1658cda928e4fe9a64581" +dependencies = [ + "libc", +] + +[[package]] +name = "serial-unix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f03fbca4c9d866e24a459cbca71283f545a37f8e3e002ad8c70593871453cab7" +dependencies = [ + "ioctl-rs", + "libc", + "serial-core", + "termios", +] + +[[package]] +name = "serial-windows" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15c6d3b776267a75d31bbdfd5d36c0ca051251caafc285827052bc53bcdc8162" +dependencies = [ + "libc", + "serial-core", +] + [[package]] name = "serialize-to-javascript" version = "0.1.2" @@ -3039,6 +3159,22 @@ dependencies = [ "digest", ] +[[package]] +name = "shared_library" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a9e7e0f2bfae24d8a5b5a66c5b257a83c7412304311512a0c054cd5e619da11" +dependencies = [ + "lazy_static", + "libc", +] + +[[package]] +name = "shell-words" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" + [[package]] name = "shlex" version = "1.3.0" @@ -3567,6 +3703,15 @@ dependencies = [ "utf-8", ] +[[package]] +name = "termios" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5d9cf598a6d7ce700a4e6a9199da127e6819a61e64b68609683cc9a01b5683a" +dependencies = [ + "libc", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -4741,6 +4886,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi", +] + [[package]] name = "winreg" version = "0.55.0" diff --git a/v2/src-tauri/Cargo.toml b/v2/src-tauri/Cargo.toml index 3a5208a..bf7ea50 100644 --- a/v2/src-tauri/Cargo.toml +++ b/v2/src-tauri/Cargo.toml @@ -22,3 +22,5 @@ serde = { version = "1.0", features = ["derive"] } log = "0.4" tauri = { version = "2.10.3", features = [] } tauri-plugin-log = "2" +portable-pty = "0.8" +uuid = { version = "1", features = ["v4"] } diff --git a/v2/src-tauri/src/lib.rs b/v2/src-tauri/src/lib.rs index 9c3118c..38b47e5 100644 --- a/v2/src-tauri/src/lib.rs +++ b/v2/src-tauri/src/lib.rs @@ -1,16 +1,69 @@ +mod pty; +mod sidecar; +mod watcher; +mod session; + +use pty::{PtyManager, PtyOptions}; +use std::sync::Arc; +use tauri::State; + +struct AppState { + pty_manager: Arc, +} + +#[tauri::command] +fn pty_spawn( + app: tauri::AppHandle, + state: State<'_, AppState>, + options: PtyOptions, +) -> Result { + state.pty_manager.spawn(&app, options) +} + +#[tauri::command] +fn pty_write(state: State<'_, AppState>, id: String, data: String) -> Result<(), String> { + state.pty_manager.write(&id, &data) +} + +#[tauri::command] +fn pty_resize( + state: State<'_, AppState>, + id: String, + cols: u16, + rows: u16, +) -> Result<(), String> { + state.pty_manager.resize(&id, cols, rows) +} + +#[tauri::command] +fn pty_kill(state: State<'_, AppState>, id: String) -> Result<(), String> { + state.pty_manager.kill(&id) +} + #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { - tauri::Builder::default() - .setup(|app| { - if cfg!(debug_assertions) { - app.handle().plugin( - tauri_plugin_log::Builder::default() - .level(log::LevelFilter::Info) - .build(), - )?; - } - Ok(()) - }) - .run(tauri::generate_context!()) - .expect("error while running tauri application"); + let app_state = AppState { + pty_manager: Arc::new(PtyManager::new()), + }; + + tauri::Builder::default() + .manage(app_state) + .invoke_handler(tauri::generate_handler![ + pty_spawn, + pty_write, + pty_resize, + pty_kill, + ]) + .setup(|app| { + if cfg!(debug_assertions) { + app.handle().plugin( + tauri_plugin_log::Builder::default() + .level(log::LevelFilter::Info) + .build(), + )?; + } + Ok(()) + }) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); } diff --git a/v2/src-tauri/src/pty.rs b/v2/src-tauri/src/pty.rs index 5188eda..744ebc4 100644 --- a/v2/src-tauri/src/pty.rs +++ b/v2/src-tauri/src/pty.rs @@ -1,2 +1,160 @@ -// PTY management via portable-pty -// Phase 2: spawn, resize, I/O streaming to frontend +use portable_pty::{native_pty_system, CommandBuilder, MasterPty, PtySize}; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use std::io::{BufReader, Write}; +use std::sync::{Arc, Mutex}; +use std::thread; +use tauri::{AppHandle, Emitter}; +use uuid::Uuid; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct PtyOptions { + pub shell: Option, + pub cwd: Option, + pub args: Option>, + pub cols: Option, + pub rows: Option, +} + +struct PtyInstance { + master: Box, + writer: Box, +} + +pub struct PtyManager { + instances: Arc>>, +} + +impl PtyManager { + pub fn new() -> Self { + Self { + instances: Arc::new(Mutex::new(HashMap::new())), + } + } + + pub fn spawn( + &self, + app: &AppHandle, + options: PtyOptions, + ) -> Result { + let pty_system = native_pty_system(); + let cols = options.cols.unwrap_or(80); + let rows = options.rows.unwrap_or(24); + + let pair = pty_system + .openpty(PtySize { + rows, + cols, + pixel_width: 0, + pixel_height: 0, + }) + .map_err(|e| format!("Failed to open PTY: {e}"))?; + + let shell = options.shell.unwrap_or_else(|| { + std::env::var("SHELL").unwrap_or_else(|_| "/bin/bash".to_string()) + }); + + let mut cmd = CommandBuilder::new(&shell); + if let Some(args) = &options.args { + for arg in args { + cmd.arg(arg); + } + } + if let Some(cwd) = &options.cwd { + cmd.cwd(cwd); + } + + let _child = pair + .slave + .spawn_command(cmd) + .map_err(|e| format!("Failed to spawn command: {e}"))?; + + // Drop the slave side — we only need the master + drop(pair.slave); + + let id = Uuid::new_v4().to_string(); + let reader = pair + .master + .try_clone_reader() + .map_err(|e| format!("Failed to clone PTY reader: {e}"))?; + let writer = pair + .master + .take_writer() + .map_err(|e| format!("Failed to take PTY writer: {e}"))?; + + // Spawn reader thread that emits Tauri events + let event_id = id.clone(); + let app_handle = app.clone(); + thread::spawn(move || { + let mut buf_reader = BufReader::with_capacity(4096, reader); + let mut buf = vec![0u8; 4096]; + loop { + match std::io::Read::read(&mut buf_reader, &mut buf) { + Ok(0) => { + // PTY closed + let _ = app_handle.emit(&format!("pty-exit-{event_id}"), ()); + break; + } + Ok(n) => { + let data = String::from_utf8_lossy(&buf[..n]).to_string(); + let _ = app_handle.emit(&format!("pty-data-{event_id}"), &data); + } + Err(e) => { + log::error!("PTY read error for {event_id}: {e}"); + let _ = app_handle.emit(&format!("pty-exit-{event_id}"), ()); + break; + } + } + } + }); + + let instance = PtyInstance { master: pair.master, writer }; + self.instances.lock().unwrap().insert(id.clone(), instance); + + log::info!("Spawned PTY {id} ({shell})"); + Ok(id) + } + + pub fn write(&self, id: &str, data: &str) -> Result<(), String> { + let mut instances = self.instances.lock().unwrap(); + let instance = instances + .get_mut(id) + .ok_or_else(|| format!("PTY {id} not found"))?; + instance + .writer + .write_all(data.as_bytes()) + .map_err(|e| format!("PTY write error: {e}"))?; + instance + .writer + .flush() + .map_err(|e| format!("PTY flush error: {e}"))?; + Ok(()) + } + + pub fn resize(&self, id: &str, cols: u16, rows: u16) -> Result<(), String> { + let instances = self.instances.lock().unwrap(); + let instance = instances + .get(id) + .ok_or_else(|| format!("PTY {id} not found"))?; + instance + .master + .resize(PtySize { + rows, + cols, + pixel_width: 0, + pixel_height: 0, + }) + .map_err(|e| format!("PTY resize error: {e}"))?; + Ok(()) + } + + pub fn kill(&self, id: &str) -> Result<(), String> { + let mut instances = self.instances.lock().unwrap(); + if instances.remove(id).is_some() { + log::info!("Killed PTY {id}"); + Ok(()) + } else { + Err(format!("PTY {id} not found")) + } + } +} From bb0e9283fcdba639bbcc152c2a8adf5ffc89fe63 Mon Sep 17 00:00:00 2001 From: Hibryda Date: Thu, 5 Mar 2026 23:42:31 +0100 Subject: [PATCH 018/355] feat(v2): add xterm.js terminal pane with Canvas addon - Install @xterm/xterm, @xterm/addon-canvas, @xterm/addon-fit, @tauri-apps/api - TerminalPane: xterm.js with Catppuccin Mocha theme, auto-fit, resize observer - PTY bridge: Tauri invoke wrappers + event listeners for data/exit - Bidirectional streaming: keyboard input -> PTY write, PTY output -> xterm write - 100ms debounced resize propagation to PTY backend --- v2/package-lock.json | 48 ++++++- v2/package.json | 6 + v2/src/lib/adapters/pty-bridge.ts | 38 +++-- .../components/Terminal/TerminalPane.svelte | 134 ++++++++++++++++++ 4 files changed, 207 insertions(+), 19 deletions(-) create mode 100644 v2/src/lib/components/Terminal/TerminalPane.svelte diff --git a/v2/package-lock.json b/v2/package-lock.json index 4fffde1..67511e8 100644 --- a/v2/package-lock.json +++ b/v2/package-lock.json @@ -1,12 +1,18 @@ { - "name": "v2", - "version": "0.0.0", + "name": "bterminal-v2", + "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "v2", - "version": "0.0.0", + "name": "bterminal-v2", + "version": "0.1.0", + "dependencies": { + "@tauri-apps/api": "^2.10.1", + "@xterm/addon-canvas": "^0.7.0", + "@xterm/addon-fit": "^0.11.0", + "@xterm/xterm": "^6.0.0" + }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "^6.2.1", "@tsconfig/svelte": "^5.0.6", @@ -908,6 +914,16 @@ "vite": "^6.3.0 || ^7.0.0" } }, + "node_modules/@tauri-apps/api": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.10.1.tgz", + "integrity": "sha512-hKL/jWf293UDSUN09rR69hrToyIXBb8CjGaWC7gfinvnQrBVvnLr08FeFi38gxtugAVyVcTa5/FD/Xnkb1siBw==", + "license": "Apache-2.0 OR MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, "node_modules/@tsconfig/svelte": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-5.0.8.tgz", @@ -939,6 +955,30 @@ "dev": true, "license": "MIT" }, + "node_modules/@xterm/addon-canvas": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@xterm/addon-canvas/-/addon-canvas-0.7.0.tgz", + "integrity": "sha512-LF5LYcfvefJuJ7QotNRdRSPc9YASAVDeoT5uyXS/nZshZXjYplGXRECBGiznwvhNL2I8bq1Lf5MzRwstsYQ2Iw==", + "license": "MIT", + "peerDependencies": { + "@xterm/xterm": "^5.0.0" + } + }, + "node_modules/@xterm/addon-fit": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@xterm/addon-fit/-/addon-fit-0.11.0.tgz", + "integrity": "sha512-jYcgT6xtVYhnhgxh3QgYDnnNMYTcf8ElbxxFzX0IZo+vabQqSPAjC3c1wJrKB5E19VwQei89QCiZZP86DCPF7g==", + "license": "MIT" + }, + "node_modules/@xterm/xterm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@xterm/xterm/-/xterm-6.0.0.tgz", + "integrity": "sha512-TQwDdQGtwwDt+2cgKDLn0IRaSxYu1tSUjgKarSDkUM0ZNiSRXFpjxEsvc/Zgc5kq5omJ+V0a8/kIM2WD3sMOYg==", + "license": "MIT", + "workspaces": [ + "addons/*" + ] + }, "node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", diff --git a/v2/package.json b/v2/package.json index 38b9255..c08bc5e 100644 --- a/v2/package.json +++ b/v2/package.json @@ -20,5 +20,11 @@ "svelte-check": "^4.3.4", "typescript": "~5.9.3", "vite": "^7.3.1" + }, + "dependencies": { + "@tauri-apps/api": "^2.10.1", + "@xterm/addon-canvas": "^0.7.0", + "@xterm/addon-fit": "^0.11.0", + "@xterm/xterm": "^6.0.0" } } diff --git a/v2/src/lib/adapters/pty-bridge.ts b/v2/src/lib/adapters/pty-bridge.ts index 5f64450..2888919 100644 --- a/v2/src/lib/adapters/pty-bridge.ts +++ b/v2/src/lib/adapters/pty-bridge.ts @@ -1,30 +1,38 @@ -// PTY Bridge — IPC wrapper for Rust PTY backend -// Phase 2: terminal spawn, resize, input/output streaming +import { invoke } from '@tauri-apps/api/core'; +import { listen, type UnlistenFn } from '@tauri-apps/api/event'; export interface PtyOptions { shell?: string; cwd?: string; - env?: Record; + args?: string[]; cols?: number; rows?: number; } -/** - * Spawn a new PTY session via Tauri IPC. - * Phase 2: implement with @tauri-apps/api invoke - */ -export async function spawnPty(_options: PtyOptions): Promise { - throw new Error('Not implemented — Phase 2'); +export async function spawnPty(options: PtyOptions): Promise { + return invoke('pty_spawn', { options }); } -export async function writePty(_id: string, _data: string): Promise { - throw new Error('Not implemented — Phase 2'); +export async function writePty(id: string, data: string): Promise { + return invoke('pty_write', { id, data }); } -export async function resizePty(_id: string, _cols: number, _rows: number): Promise { - throw new Error('Not implemented — Phase 2'); +export async function resizePty(id: string, cols: number, rows: number): Promise { + return invoke('pty_resize', { id, cols, rows }); } -export async function killPty(_id: string): Promise { - throw new Error('Not implemented — Phase 2'); +export async function killPty(id: string): Promise { + return invoke('pty_kill', { id }); +} + +export async function onPtyData(id: string, callback: (data: string) => void): Promise { + return listen(`pty-data-${id}`, (event) => { + callback(event.payload); + }); +} + +export async function onPtyExit(id: string, callback: () => void): Promise { + return listen(`pty-exit-${id}`, () => { + callback(); + }); } diff --git a/v2/src/lib/components/Terminal/TerminalPane.svelte b/v2/src/lib/components/Terminal/TerminalPane.svelte new file mode 100644 index 0000000..79155ee --- /dev/null +++ b/v2/src/lib/components/Terminal/TerminalPane.svelte @@ -0,0 +1,134 @@ + + +
+ + From bfd40219098d1f498eae9ad29667a604070adb62 Mon Sep 17 00:00:00 2001 From: Hibryda Date: Thu, 5 Mar 2026 23:42:41 +0100 Subject: [PATCH 019/355] feat(v2): add tiling layout, sidebar controls, and keyboard shortcuts - TilingGrid: dynamic CSS Grid with auto-preset based on pane count - Layout presets: 1-col, 2-col, 3-col, 2x2, master-stack - PaneContainer: close button, status indicator, focus highlight - SessionList: new terminal button, layout preset selector, pane list - Layout store: pane CRUD, focus management, grid template generation - Keyboard: Ctrl+N new terminal, Ctrl+1-4 focus pane by index --- v2/src/App.svelte | 33 ++++ .../components/Layout/PaneContainer.svelte | 47 ++++- .../lib/components/Layout/TilingGrid.svelte | 102 ++++++++--- .../lib/components/Sidebar/SessionList.svelte | 168 +++++++++++++++++- v2/src/lib/stores/layout.ts | 90 ++++++++-- 5 files changed, 399 insertions(+), 41 deletions(-) diff --git a/v2/src/App.svelte b/v2/src/App.svelte index 2b11069..d412de3 100644 --- a/v2/src/App.svelte +++ b/v2/src/App.svelte @@ -1,6 +1,39 @@
+ +
+ {:else} + + {/if}
- {#if fileLoading} + + {#if fileTabs.length > 0} +
+ {#each fileTabs as tab (tab.path)} + + + {/each} +
+ {/if} + + + {#if fileLoading && activeTabPath && !activeTab?.content}
Loading…
- {:else if !selectedPath} + {:else if !activeTab}
Select a file to view
- {:else if fileContent?.type === 'TooLarge'} + {:else if activeTab.content?.type === 'TooLarge'}
File too large - {formatSize(fileContent.size)} + {formatSize(activeTab.content.size)}
- {:else if fileContent?.type === 'Binary'} - {#if isImageExt(selectedPath)} + {:else if activeTab.content?.type === 'Binary'} + {#if isImageExt(activeTab.path)}
- {selectedPath.split('/').pop()} + {activeTab.name}
{:else} -
{fileContent.message}
+
{activeTab.content.message}
{/if} - {:else if fileContent?.type === 'Text'} + {:else if activeTab.content?.type === 'Text'}
- {#if fileContent.lang === 'csv'} -
{fileContent.content}
+ {#if activeTab.content.lang === 'csv'} +
{activeTab.content.content}
{:else} - {@html renderHighlighted(fileContent.content, fileContent.lang)} + {@html renderHighlighted(activeTab.content.content, activeTab.content.lang)} {/if}
{/if} - {#if selectedPath} -
{selectedPath}
+ + {#if activeTab} +
{activeTab.path}
{/if}
@@ -197,20 +326,26 @@ flex: 1; } + /* --- Sidebar --- */ + .tree-sidebar { - width: 14rem; flex-shrink: 0; background: var(--ctp-mantle); border-right: 1px solid var(--ctp-surface0); display: flex; flex-direction: column; overflow: hidden; + min-width: 8rem; + max-width: 30rem; } .tree-header { padding: 0.375rem 0.625rem; border-bottom: 1px solid var(--ctp-surface0); flex-shrink: 0; + display: flex; + align-items: center; + justify-content: space-between; } .tree-title { @@ -221,6 +356,49 @@ color: var(--ctp-overlay1); } + .collapse-btn, .expand-btn { + display: flex; + align-items: center; + justify-content: center; + background: transparent; + border: none; + color: var(--ctp-overlay1); + cursor: pointer; + padding: 0.125rem; + border-radius: 0.1875rem; + transition: color 0.12s, background 0.12s; + } + + .collapse-btn:hover, .expand-btn:hover { + color: var(--ctp-text); + background: var(--ctp-surface0); + } + + .expand-btn { + flex-shrink: 0; + width: 1.5rem; + height: 100%; + background: var(--ctp-mantle); + border-right: 1px solid var(--ctp-surface0); + border-radius: 0; + padding: 0; + } + + .resize-handle { + width: 4px; + cursor: col-resize; + background: transparent; + flex-shrink: 0; + transition: background 0.15s; + margin-left: -2px; + margin-right: -2px; + z-index: 1; + } + + .resize-handle:hover, .resize-handle.active { + background: var(--ctp-blue); + } + .tree-list { flex: 1; overflow-y: auto; @@ -293,6 +471,82 @@ text-align: center; } + /* --- File tab bar --- */ + + .file-tab-bar { + display: flex; + background: var(--ctp-mantle); + border-bottom: 1px solid var(--ctp-surface0); + flex-shrink: 0; + overflow-x: auto; + scrollbar-width: none; + } + + .file-tab { + display: inline-flex; + align-items: center; + gap: 0.25rem; + padding: 0.25rem 0.375rem 0.25rem 0.625rem; + border: none; + border-bottom: 2px solid transparent; + background: transparent; + color: var(--ctp-overlay1); + font-size: 0.675rem; + cursor: pointer; + white-space: nowrap; + transition: color 0.1s, background 0.1s; + max-width: 10rem; + } + + .file-tab:hover { + background: var(--ctp-surface0); + color: var(--ctp-subtext1); + } + + .file-tab.active { + background: var(--ctp-base); + color: var(--ctp-text); + border-bottom-color: var(--accent, var(--ctp-blue)); + } + + .file-tab-name { + overflow: hidden; + text-overflow: ellipsis; + } + + .file-tab-name.italic { + font-style: italic; + } + + .file-tab-close { + display: flex; + align-items: center; + justify-content: center; + width: 1rem; + height: 1rem; + border: none; + background: transparent; + color: var(--ctp-overlay0); + font-size: 0.75rem; + cursor: pointer; + border-radius: 0.125rem; + flex-shrink: 0; + opacity: 0; + transition: opacity 0.1s, background 0.1s; + } + + .file-tab:hover .file-tab-close, + .file-tab.active .file-tab-close { + opacity: 1; + } + + .file-tab-close:hover { + background: var(--ctp-surface1); + color: var(--ctp-text); + } + + /* --- Viewer --- */ + .file-viewer { flex: 1; min-width: 0; @@ -334,12 +588,18 @@ font-size: 0.775rem; line-height: 1.55; color: var(--ctp-text); + white-space: pre-wrap; + word-wrap: break-word; + overflow-wrap: break-word; } .viewer-code :global(code) { font-family: inherit; background: none; padding: 0; + white-space: pre-wrap; + word-wrap: break-word; + overflow-wrap: break-word; } .viewer-code :global(.shiki) { @@ -348,12 +608,22 @@ margin: 0; border: none; box-shadow: none; + white-space: pre-wrap !important; + word-wrap: break-word; + overflow-wrap: break-word; + } + + .viewer-code :global(.shiki code) { + white-space: pre-wrap !important; + word-wrap: break-word; + overflow-wrap: break-word; } .csv-content { font-family: var(--term-font-family, monospace); font-size: 0.75rem; - white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; tab-size: 4; } From a111ba0b9daf07a500200b2bf7b3b384219c9329 Mon Sep 17 00:00:00 2001 From: Hibryda Date: Tue, 10 Mar 2026 02:51:05 +0100 Subject: [PATCH 190/355] docs: update CHANGELOG with FilesTab improvements --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ae5e29c..2fea560 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,7 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - MarkdownPane link navigation: relative file links open in Files tab, external URLs open in system browser via `xdg-open`, anchor links scroll in-page (MarkdownPane.svelte, ProjectFiles.svelte, lib.rs) - `open_url` Tauri command for opening http/https URLs in system browser (lib.rs) - Tab system overhaul: renamed Claude→Model, Files→Docs, added 3 new tabs (Files, SSH, Memory) with PERSISTED-EAGER/LAZY mount strategies (ProjectBox.svelte) -- FilesTab: VSCode-style directory tree sidebar + content viewer with shiki syntax highlighting, image display via convertFileSrc, 10MB file size gate (FilesTab.svelte) +- FilesTab: VSCode-style directory tree sidebar + tabbed content viewer with shiki syntax highlighting, word wrap, image display via convertFileSrc, 10MB file size gate, collapsible/resizable sidebar, preview vs pinned tabs (FilesTab.svelte) - SshTab: SSH connection CRUD panel with launch-to-terminal button, reuses existing ssh-bridge.ts model (SshTab.svelte) - MemoriesTab: pluggable knowledge explorer with MemoryAdapter interface, adapter registry, search, tag display, expandable cards (MemoriesTab.svelte, memory-adapter.ts) - Rust `list_directory_children` command: lazy tree expansion, hidden files skipped, dirs-first alphabetical sort (lib.rs) From e2a406a167a8860965aa8242a92080abef4a27b9 Mon Sep 17 00:00:00 2001 From: Hibryda Date: Tue, 10 Mar 2026 02:54:10 +0100 Subject: [PATCH 191/355] fix(files): change file tab bar from nested buttons to div with role=tab --- v2/src/lib/components/Workspace/FilesTab.svelte | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/v2/src/lib/components/Workspace/FilesTab.svelte b/v2/src/lib/components/Workspace/FilesTab.svelte index 79ede99..bd4dd1e 100644 --- a/v2/src/lib/components/Workspace/FilesTab.svelte +++ b/v2/src/lib/components/Workspace/FilesTab.svelte @@ -270,16 +270,18 @@ {#if fileTabs.length > 0}
{#each fileTabs as tab (tab.path)} - - +
{/each} {/if} From ea447196857ce008f9d7347995a94b1c4995c90a Mon Sep 17 00:00:00 2001 From: Hibryda Date: Tue, 10 Mar 2026 02:54:10 +0100 Subject: [PATCH 192/355] docs: update CHANGELOG with FilesTab HTML nesting fix --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2fea560..23a2d2e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added `--bterminal-pane-padding-inline: clamp(0.75rem, 3.5cqi, 2rem)` shared CSS variable for responsive pane padding (catppuccin.css) ### Fixed +- FilesTab invalid HTML nesting: file tab bar used ` + + {#if expandedTurns.has(turn.index)} +
+ {#each turn.messages as msg} + {#if msg.type !== 'cost' && msg.type !== 'status' && msg.type !== 'init'} +
+ {msgTypeLabel(msg.type)} + ~{formatTokens(estimateTokens(msg))} + {#if msg.type === 'tool_call'} + {@const tc = msg.content as ToolCallContent} + {tc.name} + {/if} +
+ {/if} + {/each} +
+ {/if} + + {/each} + {#if turns.length === 0} +
No turns yet
+ {/if} + + + {/if} + + + diff --git a/v2/src/lib/components/Workspace/ProjectBox.svelte b/v2/src/lib/components/Workspace/ProjectBox.svelte index 3a48049..4a72a64 100644 --- a/v2/src/lib/components/Workspace/ProjectBox.svelte +++ b/v2/src/lib/components/Workspace/ProjectBox.svelte @@ -6,7 +6,7 @@ import TerminalTabs from './TerminalTabs.svelte'; import TeamAgentsPanel from './TeamAgentsPanel.svelte'; import ProjectFiles from './ProjectFiles.svelte'; - import ContextPane from '../Context/ContextPane.svelte'; + import ContextTab from './ContextTab.svelte'; import FilesTab from './FilesTab.svelte'; import SshTab from './SshTab.svelte'; import MemoriesTab from './MemoriesTab.svelte'; @@ -104,7 +104,7 @@
- +
From 9c7618cad16d1d391b15f5a1abd265981208d9ec Mon Sep 17 00:00:00 2001 From: Hibryda Date: Tue, 10 Mar 2026 03:52:16 +0100 Subject: [PATCH 200/355] docs: update meta files for ContextTab and CodeMirror editor session --- .claude/CLAUDE.md | 2 +- CHANGELOG.md | 1 + CLAUDE.md | 4 +++- TODO.md | 5 +++-- docs/v3-progress.md | 19 ++++++++++++++++++- 5 files changed, 26 insertions(+), 5 deletions(-) diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index c026a1b..90a1512 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -37,7 +37,7 @@ - Agent dispatcher (`src/lib/agent-dispatcher.ts`) is a singleton that routes sidecar events to the agent store. Handles subagent routing (project-scoped sessions skip layout pane, render in TeamAgentsPanel; detached mode creates layout pane). Session persistence via registerSessionProject() + persistSessionForProject() (saves state + messages to SQLite on complete). - AgentQueryOptions supports `permission_mode` field (flows Rust -> sidecar -> SDK). Defaults to 'bypassPermissions', supports 'default' mode. allowDangerouslySkipPermissions is conditionally set. Also supports: `setting_sources` (defaults to ['user', 'project']), `system_prompt`, `model`, `claude_config_dir` (for multi-account), `additional_directories`. - Claude profiles: claude_list_profiles() reads ~/.config/switcher/profiles/ with profile.toml metadata. Profile set per-project in Settings (project.profile field), passed through ClaudeSession -> AgentPane `profile` prop -> resolved to config_dir for SDK. Profile name shown as info-only in ProjectHeader. -- ProjectBox has project-level tab bar: Model | Docs | Context | Files | SSH | Memory. Three mount strategies: PERSISTED-EAGER (Model, Docs, Context — always mounted, display:flex/none), PERSISTED-LAZY (Files, SSH, Memory — mount on first activation via {#if everActivated} + display:flex/none). Tab type: `'model' | 'docs' | 'context' | 'files' | 'ssh' | 'memories'`. Model tab = ClaudeSession+TeamAgentsPanel. Docs tab = ProjectFiles (markdown viewer). Files tab = FilesTab.svelte (VSCode-style directory tree + content viewer, shiki highlighting, image display via convertFileSrc, 10MB gate). SSH tab = SshTab.svelte (CRUD for SSH connections, launch spawns terminal tab in Model tab). Memory tab = MemoriesTab.svelte (pluggable via MemoryAdapter interface in memory-adapter.ts). Rust backend: list_directory_children + read_file_content (FileContent tagged union: Text/Binary/TooLarge). Frontend bridge: files-bridge.ts. +- ProjectBox has project-level tab bar: Model | Docs | Context | Files | SSH | Memory. Three mount strategies: PERSISTED-EAGER (Model, Docs, Context — always mounted, display:flex/none), PERSISTED-LAZY (Files, SSH, Memory — mount on first activation via {#if everActivated} + display:flex/none). Tab type: `'model' | 'docs' | 'context' | 'files' | 'ssh' | 'memories'`. Model tab = ClaudeSession+TeamAgentsPanel. Docs tab = ProjectFiles (markdown viewer). Context tab = ContextTab.svelte (LLM context window visualization: stats bar, segmented token meter, file references, turn breakdown; reads from agent store via sessionId prop; replaced old ContextPane ctx database viewer). Files tab = FilesTab.svelte (VSCode-style directory tree + CodeMirror 6 editor with 15 language modes, dirty tracking, Ctrl+S save, save-on-blur setting, image display via convertFileSrc, 10MB gate; CodeEditor.svelte wrapper). SSH tab = SshTab.svelte (CRUD for SSH connections, launch spawns terminal tab in Model tab). Memory tab = MemoriesTab.svelte (pluggable via MemoryAdapter interface in memory-adapter.ts). Rust backend: list_directory_children + read_file_content + write_file_content (FileContent tagged union: Text/Binary/TooLarge). Frontend bridge: files-bridge.ts. - ProjectHeader shows CWD (ellipsized from START via `direction: rtl`) + profile name as info-only text on right side. AgentPane no longer has DIR/ACC toolbar — CWD and profile are props from parent. - Skill discovery: claude_list_skills() reads ~/.claude/skills/ (dirs with SKILL.md or .md files). claude_read_skill() reads content. AgentPane `/` prefix triggers autocomplete menu. Skill content injected as prompt via expandSkillPrompt(). - claude-bridge.ts adapter wraps profile/skill Tauri commands (ClaudeProfile, ClaudeSkill interfaces). diff --git a/CHANGELOG.md b/CHANGELOG.md index ad6b1d9..918b27c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Rust `list_directory_children` command: lazy tree expansion, hidden files skipped, dirs-first alphabetical sort (lib.rs) - Rust `read_file_content` command: FileContent tagged union (Text/Binary/TooLarge), 30+ language mappings (lib.rs) - Frontend `files-bridge.ts` adapter: DirEntry and FileContent TypeScript types + IPC wrappers +- ContextTab: LLM context window visualization with stats bar (tokens, cost, turns, duration), segmented token meter (color-coded by message type), file references tree (extracted from tool calls), and collapsible turn breakdown — replaces old ContextPane ctx database viewer (ContextTab.svelte) ### Changed - AgentPane UI redesign: sans-serif root font (system-ui), tool calls paired with results in collapsible `
` groups, hook messages collapsed into compact labels, context window usage meter in status strip, cost bar made minimal (no background), session summary with translucent background, two-phase scroll anchoring, tool-aware output truncation (Bash 500/Read 50/Glob 20 lines), colors softened via `color-mix()`, responsive margins via container queries (AgentPane.svelte) diff --git a/CLAUDE.md b/CLAUDE.md index 133a6af..8591433 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -74,7 +74,9 @@ Terminal emulator with SSH and Claude Code session management. v1 (GTK3+VTE Pyth | `v2/src/lib/styles/themes.ts` | Theme palette definitions (17 themes), ThemeId/ThemePalette/ThemeMeta types, THEME_LIST | | `v2/src/lib/styles/catppuccin.css` | CSS custom properties: 26 --ctp-* color vars + --ui-font-* + --term-font-* | | `v2/src/lib/components/Agent/AgentTree.svelte` | SVG agent tree visualization | -| `v2/src/lib/components/Context/ContextPane.svelte` | ctx database viewer (projects, entries, search) | +| `v2/src/lib/components/Context/ContextPane.svelte` | ctx database viewer (projects, entries, search) — replaced by ContextTab in ProjectBox | +| `v2/src/lib/components/Workspace/ContextTab.svelte` | LLM context window visualization (stats, token meter, file refs, turn breakdown) | +| `v2/src/lib/components/Workspace/CodeEditor.svelte` | CodeMirror 6 wrapper (15 languages, Catppuccin theme, save/blur callbacks) | | `v2/src/lib/components/StatusBar/StatusBar.svelte` | Global status bar (group name, project count, agent count, cost) | | `v2/src/lib/components/Notifications/ToastContainer.svelte` | Toast notification display | | `v2/src/lib/components/Workspace/` | v3 components: GlobalTabBar, ProjectGrid, ProjectBox, ProjectHeader, ClaudeSession, TeamAgentsPanel, AgentCard, TerminalTabs, ProjectFiles, FilesTab, SshTab, MemoriesTab, CommandPalette, DocsTab, SettingsTab | diff --git a/TODO.md b/TODO.md index 08cad81..428b464 100644 --- a/TODO.md +++ b/TODO.md @@ -13,6 +13,9 @@ ## Completed +- [x] **Context tab repurpose** -- Replaced ContextPane (ctx database viewer) with ContextTab (LLM context window visualization). Stats bar, segmented token meter, file references, turn breakdown. Tribunal debate (S-1-R4 at 82%). Token estimation via ~4 chars/token heuristic. | Done: 2026-03-10 +- [x] **CodeMirror 6 editor** -- Replaced shiki viewer in FilesTab with CodeMirror 6. CodeEditor.svelte wrapper: 15 lazy-loaded language modes, Catppuccin theme, auto-close brackets, bracket matching, code folding, Ctrl+S save, dirty tracking, save-on-blur setting. write_file_content Rust command. | Done: 2026-03-10 +- [x] **FilesTab reactivity fixes** -- Fixed HTML nesting ( + + + + + +
@@ -414,6 +721,195 @@ {/if}
+
+ + +
+ {#if astTree.length === 0} +
No conversation data yet
+ {:else} +
+ {#each astTree as turnNode (turnNode.id)} + {@const result = layoutAst(turnNode, 8, 8)} + {@const svgW = astSvgWidth(result.layout)} + {@const svgH = Math.max(50, result.height + 20)} +
+
+ {turnNode.label} + {formatTokens(turnNode.tokens)} +
+
+ + {#snippet renderAstNode(layout: AstLayout)} + + {#each layout.children as child} + + {/each} + + + + + + + {truncateText(layout.node.label, 12)} + + {#if layout.node.tokens > 0} + {formatTokens(layout.node.tokens)} + {/if} + + + {#if layout.node.detail} + {layout.node.detail} + {/if} + + {#each layout.children as child} + {@render renderAstNode(child)} + {/each} + {/snippet} + + {@render renderAstNode(result.layout)} + +
+
+ {/each} +
+ {/if} +
+ + +
+ {#if toolGraph.nodes.length === 0} +
No tool calls yet
+ {:else} + {@const maxY = Math.max(...toolGraph.nodes.map(n => n.y)) + 40} +
+ + + {#each toolGraph.edges as edge} + {@const fromNode = toolGraph.nodes.find(n => n.id === edge.from)} + {@const toNode = toolGraph.nodes.find(n => n.id === edge.to)} + {#if fromNode && toNode} + + {/if} + {/each} + + + {#each toolGraph.nodes as node (node.id)} + {#if node.type === 'tool'} + + + {node.label} + {node.count}× + {:else} + + + {truncateText(node.label, 16)} + {node.count}× + {/if} + {/each} + + + Tools + Files + +
+ {/if} +
{/if} @@ -796,4 +1292,112 @@ text-align: center; padding: 1rem; } + + /* Sub-tabs */ + .sub-tabs { + display: flex; + gap: 0; + background: var(--ctp-mantle); + border-bottom: 1px solid var(--ctp-surface0); + flex-shrink: 0; + } + + .sub-tab { + padding: 0.25rem 0.75rem; + border: none; + border-bottom: 2px solid transparent; + background: transparent; + color: var(--ctp-overlay1); + font-size: 0.65rem; + font-weight: 500; + letter-spacing: 0.04em; + text-transform: uppercase; + cursor: pointer; + transition: color 0.12s, background 0.12s, border-color 0.12s; + } + + .sub-tab:hover { + color: var(--ctp-subtext1); + background: var(--ctp-surface0); + } + + .sub-tab.active { + color: var(--ctp-text); + font-weight: 600; + border-bottom-color: var(--ctp-blue); + background: var(--ctp-base); + } + + .sub-panel { + display: flex; + flex-direction: column; + flex: 1; + min-height: 0; + overflow-y: auto; + } + + /* AST */ + .ast-panel { + gap: 0.125rem; + } + + .ast-scroll { + display: flex; + flex-direction: column; + gap: 0.25rem; + padding: 0.375rem; + overflow-y: auto; + flex: 1; + } + + .ast-turn-block { + border: 1px solid var(--ctp-surface0); + border-radius: 0.375rem; + overflow: hidden; + background: var(--ctp-base); + } + + .ast-turn-label { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.25rem 0.5rem; + background: var(--ctp-mantle); + border-bottom: 1px solid var(--ctp-surface0); + } + + .ast-turn-name { + font-size: 0.65rem; + font-weight: 600; + color: var(--ctp-lavender); + } + + .ast-turn-tokens { + font-size: 0.575rem; + font-family: var(--term-font-family, monospace); + color: var(--ctp-overlay1); + } + + .ast-svg-wrap { + overflow-x: auto; + padding: 0.25rem; + } + + .ast-svg-wrap svg { + display: block; + } + + /* Graph */ + .graph-panel { + padding: 0.375rem; + } + + .graph-scroll { + overflow: auto; + flex: 1; + } + + .graph-scroll svg { + display: block; + } From d898586181063989ea09f09aa2177ffa4da457f7 Mon Sep 17 00:00:00 2001 From: Hibryda Date: Tue, 10 Mar 2026 04:03:52 +0100 Subject: [PATCH 202/355] docs: update meta files for AST and graph views --- CHANGELOG.md | 2 ++ docs/v3-progress.md | 3 +++ 2 files changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 918b27c..ea0369f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Rust `read_file_content` command: FileContent tagged union (Text/Binary/TooLarge), 30+ language mappings (lib.rs) - Frontend `files-bridge.ts` adapter: DirEntry and FileContent TypeScript types + IPC wrappers - ContextTab: LLM context window visualization with stats bar (tokens, cost, turns, duration), segmented token meter (color-coded by message type), file references tree (extracted from tool calls), and collapsible turn breakdown — replaces old ContextPane ctx database viewer (ContextTab.svelte) +- ContextTab AST view: per-turn SVG conversation trees showing hierarchical message flow (Turn → Thinking/Response/Tool Calls → File operations), with bezier edges, color-coded nodes, token counts, and detail tooltips (ContextTab.svelte) +- ContextTab Graph view: bipartite tool→file DAG with tools on left (color-coded by type) and files on right, curved SVG edges showing which tools touched which files, count badges on both sides (ContextTab.svelte) ### Changed - AgentPane UI redesign: sans-serif root font (system-ui), tool calls paired with results in collapsible `
` groups, hook messages collapsed into compact labels, context window usage meter in status strip, cost bar made minimal (no background), session summary with translucent background, two-phase scroll anchoring, tool-aware output truncation (Bash 500/Read 50/Glob 20 lines), colors softened via `color-mix()`, responsive margins via container queries (AgentPane.svelte) diff --git a/docs/v3-progress.md b/docs/v3-progress.md index 8be3f9f..f8220be 100644 --- a/docs/v3-progress.md +++ b/docs/v3-progress.md @@ -480,6 +480,9 @@ All editor themes map to the same `--ctp-*` CSS custom property names (26 vars). - [x] Turn breakdown: collapsible message groups by user prompt - [x] Token estimation via ~4 chars/token heuristic - [x] Wired into ProjectBox (replaces ContextPane, passes sessionId) +- [x] Sub-tab navigation: Overview | AST | Graph +- [x] AST tab: per-turn SVG conversation trees (Thinking/Response/ToolCall/File nodes, bezier edges, token counts) +- [x] Graph tab: bipartite tool→file DAG (tools left, files right, curved edges, count badges) #### FilesTab Fixes & CodeMirror Editor - [x] Fixed HTML nesting error: ` {/if} +
+ {#if health.totalBurnRatePerHour > 0} + + {formatRate(health.totalBurnRatePerHour)} + + + {/if} {#if totalTokens > 0} - {totalTokens.toLocaleString()} tokens + {totalTokens.toLocaleString()} tok {/if} {#if totalCost > 0} @@ -43,6 +101,24 @@
+ +{#if showAttention && attentionQueue.length > 0} +
+ {#each attentionQueue as item (item.projectId)} + + {/each} +
+{/if} + diff --git a/v2/src/lib/components/Workspace/ClaudeSession.svelte b/v2/src/lib/components/Workspace/ClaudeSession.svelte index 831f1d7..c52c7d4 100644 --- a/v2/src/lib/components/Workspace/ClaudeSession.svelte +++ b/v2/src/lib/components/Workspace/ClaudeSession.svelte @@ -7,6 +7,7 @@ type AgentMessageRecord, } from '../../adapters/groups-bridge'; import { registerSessionProject } from '../../agent-dispatcher'; + import { trackProject, updateProjectSession } from '../../stores/health.svelte'; import { createAgentSession, appendAgentMessages, @@ -35,6 +36,7 @@ hasRestoredHistory = false; lastState = null; registerSessionProject(sessionId, project.id); + trackProject(project.id, sessionId); onsessionid?.(sessionId); } @@ -67,8 +69,9 @@ sessionId = crypto.randomUUID(); } finally { loading = false; - // Register session -> project mapping for persistence + // Register session -> project mapping for persistence + health tracking registerSessionProject(sessionId, project.id); + trackProject(project.id, sessionId); onsessionid?.(sessionId); } } diff --git a/v2/src/lib/components/Workspace/ProjectBox.svelte b/v2/src/lib/components/Workspace/ProjectBox.svelte index 4a72a64..2002cb5 100644 --- a/v2/src/lib/components/Workspace/ProjectBox.svelte +++ b/v2/src/lib/components/Workspace/ProjectBox.svelte @@ -11,6 +11,7 @@ import SshTab from './SshTab.svelte'; import MemoriesTab from './MemoriesTab.svelte'; import { getTerminalTabs } from '../../stores/workspace.svelte'; + import { getProjectHealth } from '../../stores/health.svelte'; interface Props { project: ProjectConfig; @@ -32,6 +33,7 @@ let everActivated = $state>({}); let termTabs = $derived(getTerminalTabs(project.id)); + let projectHealth = $derived(getProjectHealth(project.id)); let termTabCount = $derived(termTabs.length); /** Activate a tab — for lazy tabs, mark as ever-activated */ @@ -56,6 +58,7 @@ {project} {slotIndex} {active} + health={projectHealth} onclick={onactivate} /> diff --git a/v2/src/lib/components/Workspace/ProjectHeader.svelte b/v2/src/lib/components/Workspace/ProjectHeader.svelte index 06471cc..56113a5 100644 --- a/v2/src/lib/components/Workspace/ProjectHeader.svelte +++ b/v2/src/lib/components/Workspace/ProjectHeader.svelte @@ -1,15 +1,17 @@ + + {/if} + {:else} +
+ Channels + +
+ {#if showNewChannel} +
+ { if (e.key === 'Enter') handleCreateChannel(); }} + /> + +
+ {/if} + {/if} + + +
+ Direct Messages +
+ {#each agents.filter(a => a.id !== ADMIN_ID) as agent (agent.id)} + {@const statusClass = agent.status === 'active' ? 'active' : agent.status === 'sleeping' ? 'sleeping' : 'stopped'} + + {/each} + + + +
+
+ {#if currentView.type === 'feed'} + 📡 Activity Feed + All agent communication + {:else if currentView.type === 'dm'} + DM with {currentView.agentName} + {:else if currentView.type === 'channel'} + # {currentView.channelName} + {/if} +
+ +
+ {#if currentView.type === 'feed'} + {#if feedMessages.length === 0} +
No messages yet. Agents haven't started communicating.
+ {:else} + {#each [...feedMessages].reverse() as msg (msg.id)} +
+
+ {getAgentIcon(msg.senderRole)} + {msg.senderName} + + {msg.recipientName} + {formatTime(msg.createdAt)} +
+
{msg.content}
+
+ {/each} + {/if} + + {:else if currentView.type === 'dm'} + {#if dmMessages.length === 0} +
No messages yet. Start the conversation!
+ {:else} + {#each dmMessages as msg (msg.id)} + {@const isMe = msg.from_agent === ADMIN_ID} +
+
+ {isMe ? 'You' : (msg.sender_name ?? msg.from_agent)} + {formatTime(msg.created_at)} +
+
{msg.content}
+
+ {/each} + {/if} + + {:else if currentView.type === 'channel'} + {#if channelMessages.length === 0} +
No messages in this channel yet.
+ {:else} + {#each channelMessages as msg (msg.id)} + {@const isMe = msg.fromAgent === ADMIN_ID} +
+
+ {getAgentIcon(msg.senderRole)} + {isMe ? 'You' : msg.senderName} + {formatTime(msg.createdAt)} +
+
{msg.content}
+
+ {/each} + {/if} + {/if} +
+ + {#if currentView.type !== 'feed'} +
+ + +
+ {/if} +
+ + + diff --git a/v2/src/lib/components/Workspace/GlobalTabBar.svelte b/v2/src/lib/components/Workspace/GlobalTabBar.svelte index 5fce269..36c555b 100644 --- a/v2/src/lib/components/Workspace/GlobalTabBar.svelte +++ b/v2/src/lib/components/Workspace/GlobalTabBar.svelte @@ -10,21 +10,41 @@ const settingsIcon = 'M10.3 2L9.9 4.4a7 7 0 0 0-1.8 1l-2.2-.9-1.7 3 1.8 1.5a7 7 0 0 0 0 2l-1.8 1.5 1.7 3 2.2-.9a7 7 0 0 0 1.8 1L10.3 18h3.4l.4-2.4a7 7 0 0 0 1.8-1l2.2.9 1.7-3-1.8-1.5a7 7 0 0 0 0-2l1.8-1.5-1.7-3-2.2.9a7 7 0 0 0-1.8-1L13.7 2h-3.4zM12 8a4 4 0 1 1 0 8 4 4 0 0 1 0-8z'; - function handleSettingsClick() { - if (getActiveTab() === 'settings' && expanded) { + function handleTabClick(tab: WorkspaceTab) { + if (getActiveTab() === tab && expanded) { ontoggle?.(); } else { - setActiveTab('settings'); + setActiveTab(tab); if (!expanded) ontoggle?.(); } }