From 4f12ffc86af3f57af1daccd21c752b691ccb3fbf Mon Sep 17 00:00:00 2001 From: Mathitz Date: Sat, 18 Jul 2026 15:18:58 -0300 Subject: [PATCH 1/8] feat(tui): v2 visual overhaul + auto-synthesis toggle --- README.md | 79 ++++++++++++++-- ui/tui.py | 276 +++++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 289 insertions(+), 66 deletions(-) diff --git a/README.md b/README.md index df00ef6..ec97bba 100644 --- a/README.md +++ b/README.md @@ -80,15 +80,43 @@ A bidirectional compression layer that strips conversational fluff. When a complex task is solved, the harness doesn't just forget. It analyzes the trajectory and "crystallizes" the steps into a `.md` skill, allowing the agent to execute the same complex workflow in the future with a single reference. ### 🎨 Pro-Grade TUI -A high-performance terminal interface built with `Textual`. Featuring: -- **5-Tab Interface**: Chat, Tasks, Skills, Memory, Settings -- **Provider Dropdown**: Switch models at runtime without restarting -- **4 Native Themes**: One Dark, Solarized Light, Nord, Dracula β€” cascade through every widget -- **Live Task Monitoring**: Real-time status of parallel agent workers with β³βš™οΈβœ…βŒ indicators -- **Memory Search**: Hybrid semantic + keyword search directly in the TUI -- **Skill Browser**: Browse, search, and inspect crystallized skills -- **Dashboard Integration**: One-click open to the admin dashboard at `https://localhost:7860/` -- **Ctrl+C cancels requests** (doesn't kill the app), **Ctrl+Q quits** +A high-performance terminal interface built with `Textual`, designed for daily-driver clarity rather than an engineering dashboard. + +**6-Tab Workspace**: Chat, Tasks, Skills, Knowledge, Memory, Settings β€” tab headers are the canonical navigation (no duplicate button bars). + +**Chat workspace regions**: +- **Conversation canvas** β€” dominant ~70–75% width, markdown-first message cards with author/time headers and compact metadata. +- **Interaction trace side panel** β€” progressive disclosure: collapsed by default with a summary chip (`trace Β· N events Β· last stage`); expand with `F8` or by clicking the chip. +- **Composer / action bar** β€” grouped primary actions (Trace, Copy, Stats) and secondary actions (Save Skill) with a single-line session metrics strip. + +**Theme token model**: semantic tokens (`$background`, `$surface`, `$panel`, `$border`, `$primary`, `$accent`, `$text`, `$text-muted`, `$success`, `$warning`, `$error`) cascade through every widget via Textual's theme system. One emphasized border per visual region (chat canvas keeps `$primary`; trace, tasks, skills, KB, memory, settings use `$border`). + +**4 Native Themes**: One Dark, Solarized Light, Nord, Dracula β€” cycle with `Ctrl+T`. + +**Live task monitoring**: real-time status of parallel workers with β³βš™οΈβœ…βŒ indicators and a global activity rail (`Ctrl+B` to toggle). + +**Keyboard shortcuts**: +| Key | Action | +| :-- | :-- | +| `Ctrl+1..6` / `Alt+1..6` / `F1..F6` | Switch tab (Chat, Tasks, Skills, KB, Memory, Settings) | +| `Ctrl+]` / `Ctrl+[` / `Ctrl+←→` | Next / previous tab | +| `Ctrl+T` | Cycle theme | +| `Ctrl+B` | Toggle activity rail | +| `F8` / `Ctrl+Shift+T` | Toggle interaction trace panel | +| `F9` / `Ctrl+Shift+C` | Copy last assistant response | +| `?` | Show shortcuts overlay (generated from live bindings) | +| `Enter` (chat input) | Send message | +| `/skill save ` | Save last reply as a skill | +| `Ctrl+C` | Cancel current request (does not quit) | +| `Ctrl+Q` | Quit | + +**Dashboard integration**: one-click open to the admin dashboard at `https://localhost:7860/`. + +### ⚠️ Known Limitations (v2 TUI) +- Trace persistence is per-session (not yet written to disk). +- Theme contrast validation is manual; the bundled themes are tuned for readability but very-low-contrast combinations are not auto-corrected. +- Shortcut help overlay (`?`) reflects MainScreen + ChatPane bindings; pane-local bindings in Tasks/Skills/KB/Memory/Settings are not yet enumerated. +- Clipboard copy falls back to inserting the response into the input box when the terminal lacks clipboard support. --- @@ -118,4 +146,37 @@ Ensure all changes are validated against the integration suite: pytest tests/test_integration.py ``` +**Visual + TUI smoke checks** (headless, no terminal required): +```bash +# Parse/import sanity +python -c "from ui import tui; print('Import OK')" + +# Headless TUI smoke: compose MainScreen, tab nav, F8 trace toggle, ? overlay +python - <<'PY' +import asyncio, sys +from textual.app import App +from ui.tui import MainScreen, AppState +from ui.themes import ThemeRegistry + +class SmokeApp(App): pass +async def run(): + app = SmokeApp() + for tid in ThemeRegistry.theme_ids(): + app.register_theme(ThemeRegistry.get_textual_theme(tid)) + async with app.run_test() as pilot: + app.push_screen(MainScreen(AppState())) + await pilot.pause() + await pilot.press("ctrl+2"); await pilot.pause() + await pilot.press("ctrl+1"); await pilot.pause() + await pilot.press("f8"); await pilot.pause() + await pilot.press("f8"); await pilot.pause() + await pilot.press("question_sign"); await pilot.pause() + await pilot.press("escape"); await pilot.pause() + sys.stderr.write("SMOKE OK\n") +asyncio.run(run()) +PY +``` + +Checks cover: MainScreen compose, tab navigation (`Ctrl+1`/`Ctrl+2`), trace disclosure toggle (`F8`), and the shortcuts overlay (`?`/`Escape`). + For more details on our versioning and changelog, see [RELEASES.md](RELEASES.md). diff --git a/ui/tui.py b/ui/tui.py index f6b7c24..67c0673 100644 --- a/ui/tui.py +++ b/ui/tui.py @@ -88,9 +88,10 @@ def __init__(self) -> None: self.current_provider_id: str = "" self.current_theme: str = "one_dark" self.caveman_enabled: bool = True + self.auto_synthesis_enabled: bool = False self.ui_mode: str = "conservative" self.show_activity_rail: bool = True - self.show_trace_panel: bool = True + self.show_trace_panel: bool = False self.last_agent_response: str = "" self.last_turn_metrics: dict = {} self.session_metrics: dict = { @@ -118,6 +119,7 @@ def reconnect(self, provider_id: str) -> None: except Exception: pass self.agent = MotionAgent(model_config) + self.agent.auto_skill_synthesis = self.auto_synthesis_enabled self.task_manager = TaskManager(model_config, WORKSPACE) self.current_provider_id = provider_id @@ -187,14 +189,16 @@ def _extract_reasoning_and_answer(text: str) -> tuple[str, str]: # ─── Chat message widgets ───────────────────────────────────────────────────── class UserMessage(Static): - """A user message bubble β€” primary accent, left border.""" + """A user message card β€” primary accent header, markdown body.""" DEFAULT_CSS = """ UserMessage { background: $surface; border-left: heavy $primary; border-right: blank; + border-top: blank; + border-bottom: blank; padding: 1 2; - margin: 1 10 0 0; + margin: 1 8 0 0; color: $text; } """ @@ -207,28 +211,32 @@ class ReasoningMessage(Static): background: $panel; border-left: heavy $warning; border-right: blank; + border-top: blank; + border-bottom: blank; padding: 1 2; - margin: 1 0 0 10; + margin: 1 0 0 8; color: $text-muted; text-style: dim italic; } """ class AgentMessage(Static): - """An agent message bubble β€” success accent, left border.""" + """An agent message card β€” accent header, markdown body.""" DEFAULT_CSS = """ AgentMessage { background: $surface; border-left: heavy $accent; border-right: blank; + border-top: blank; + border-bottom: blank; padding: 1 2; - margin: 1 0 0 10; + margin: 1 0 0 8; color: $text; } """ class SystemMessage(Static): - """A system/info message β€” muted, italic.""" + """A system/info message β€” muted, single-line metadata.""" DEFAULT_CSS = """ SystemMessage { color: $text-muted; @@ -426,23 +434,124 @@ def refresh_activity(self) -> None: container.mount(Static(row, classes="activity_row")) +# ─── Shortcuts overlay ──────────────────────────────────────────────────────── + +class ShortcutsOverlay(Screen): + """Unified shortcuts help overlay generated from real bindings.""" + + CSS = """ + ShortcutsOverlay { + align: center middle; + } + #shortcuts_box { + width: 78; + max-height: 80%; + border: round $primary; + background: $surface; + padding: 1 2; + scrollbar-size: 1 1; + } + #shortcuts_title { + color: $primary; + text-style: bold; + text-align: center; + margin-bottom: 1; + } + #shortcuts_body { + height: auto; + max-height: 70%; + scrollbar-size: 1 1; + } + .shortcut_section { + color: $accent; + text-style: bold; + margin-top: 1; + margin-bottom: 0; + } + .shortcut_row { + color: $text; + padding: 0 1; + } + #shortcuts_hint { + color: $text-muted; + text-align: center; + margin-top: 1; + } + """ + + BINDINGS = [ + Binding("escape", "dismiss_overlay", "Close"), + Binding("question_sign", "dismiss_overlay", "Close"), + Binding("q", "dismiss_overlay", "Close"), + ] + + def __init__(self, main_screen: "MainScreen", **kwargs) -> None: + super().__init__(**kwargs) + self._main = main_screen + + def compose(self) -> ComposeResult: + with VerticalScroll(id="shortcuts_box"): + yield Label("⌨️ Keyboard Shortcuts", id="shortcuts_title") + yield VerticalScroll(id="shortcuts_body") + yield Label("Press ? / Esc / q to close", id="shortcuts_hint") + + def on_mount(self) -> None: + self.query_one("#shortcuts_box", VerticalScroll).border_title = " Shortcuts " + body = self.query_one("#shortcuts_body", VerticalScroll) + sections = self._collect_bindings() + for section_title, rows in sections.items(): + body.mount(Label(section_title, classes="shortcut_section")) + for key, label in rows: + body.mount(Static(f" [bold]{key}[/] [dim]Β·[/] {label}", classes="shortcut_row")) + + def _collect_bindings(self) -> dict: + groups: dict[str, list[tuple[str, str]]] = {} + seen_keys: set[str] = set() + global_bindings = getattr(self._main, "BINDINGS", []) or [] + groups["Global"] = [] + for b in global_bindings: + key = getattr(b, "key", "") + label = getattr(b, "description", "") or key + if not key or key in seen_keys: + continue + seen_keys.add(key) + groups["Global"].append(self._pretty_key(key, label)) + try: + chat = self._main.query_one(ChatPane) + chat_bindings = getattr(chat, "BINDINGS", []) or [] + groups["Chat"] = [] + for b in chat_bindings: + key = getattr(b, "key", "") + label = getattr(b, "description", "") or key + if not key or key in seen_keys: + continue + seen_keys.add(key) + groups["Chat"].append(self._pretty_key(key, label)) + except Exception: + pass + return {k: v for k, v in groups.items() if v} + + @staticmethod + def _pretty_key(key: str, label: str) -> tuple[str, str]: + pretty = ( + key.replace("ctrl+", "Ctrl+") + .replace("alt+", "Alt+") + .replace("shift+", "Shift+") + .replace("_", " ") + ) + pretty = pretty.replace("question sign", "?") + return pretty, label + + def action_dismiss_overlay(self) -> None: + self.app.pop_screen() + + class MainScreen(Screen): """The main hub with Chat, Tasks, Skills, Memory, Settings tabs.""" CSS = """ #main_shell { height: 1fr; background: $background; } #main_body { width: 1fr; padding: 0 1 0 0; } - #tab_quick_nav { - height: auto; - padding: 0 1 1 1; - background: $panel; - border: round $border; - } - .tab_nav_btn { - margin-right: 1; - min-width: 11; - height: 3; - } #main_tabs { height: 1fr; } #session_metrics_footer { height: auto; @@ -482,6 +591,7 @@ class MainScreen(Screen): Binding("ctrl+]", "next_tab", "Next Tab", priority=True), Binding("ctrl+[", "prev_tab", "Prev Tab", priority=True), Binding("ctrl+q", "quit", "Quit", priority=True), + Binding("question_sign", "show_shortcuts", "Shortcuts", priority=True), ] def __init__(self, state: AppState, **kwargs) -> None: @@ -492,13 +602,6 @@ def compose(self) -> ComposeResult: yield Header(show_clock=True) with Horizontal(id="main_shell"): with Vertical(id="main_body"): - with Horizontal(id="tab_quick_nav"): - yield Button("Chat", id="tab_btn_chat", classes="tab_nav_btn") - yield Button("Tasks", id="tab_btn_tasks", classes="tab_nav_btn") - yield Button("Skills", id="tab_btn_skills", classes="tab_nav_btn") - yield Button("Knowledge", id="tab_btn_kb", classes="tab_nav_btn") - yield Button("Memory", id="tab_btn_memory", classes="tab_nav_btn") - yield Button("Settings", id="tab_btn_settings", classes="tab_nav_btn") with TabbedContent(id="main_tabs"): with TabPane("πŸ’¬ Chat", id="chat_tab"): yield ChatPane(self.state) @@ -517,17 +620,9 @@ def compose(self) -> ComposeResult: yield Footer() async def on_button_pressed(self, event: Button.Pressed) -> None: - mapping = { - "tab_btn_chat": "chat_tab", - "tab_btn_tasks": "tasks_tab", - "tab_btn_skills": "skills_tab", - "tab_btn_kb": "kb_tab", - "tab_btn_memory": "memory_tab", - "tab_btn_settings": "settings_tab", - } - tab = mapping.get(event.button.id or "") - if tab: - self._activate_tab(tab) + # Chat-local buttons (trace/copy/stats/save) are handled in ChatPane. + # No global tab buttons remain; tab headers are the canonical nav. + pass def on_mount(self) -> None: if not self.state.show_activity_rail: @@ -603,6 +698,9 @@ def action_prev_tab(self) -> None: idx = 0 self._activate_tab(order[(idx - 1) % len(order)]) + def action_show_shortcuts(self) -> None: + self.app.push_screen(ShortcutsOverlay(self)) + # ─── Chat pane ──────────────────────────────────────────────────────────────── @@ -634,13 +732,13 @@ class ChatPane(Vertical): #trace_panel { width: 42; height: 1fr; - border: round $accent; + border: round $border; background: $panel; padding: 1 1; margin-left: 1; } #trace_header { - color: $accent; + color: $text-muted; text-style: bold; margin-bottom: 0; } @@ -650,11 +748,20 @@ class ChatPane(Vertical): border-top: solid $border; padding-top: 1; } + #trace_summary_chip { + height: auto; + width: auto; + padding: 0 2; + margin: 0 0 1 0; + background: $panel; + border: round $border; + color: $text-muted; + } #chat_input_row { height: auto; padding: 1 1 1 1; background: $panel; - border: round $border; + border: solid $border; } #chat_controls { height: auto; @@ -672,8 +779,7 @@ class ChatPane(Vertical): } #chat_metrics { color: $text-muted; - margin-top: 0; - margin-bottom: 1; + margin: 0 0 0 0; padding: 0 2; } #chat_input { @@ -691,6 +797,7 @@ class ChatPane(Vertical): def __init__(self, state: AppState, **kwargs) -> None: super().__init__(**kwargs) self.state = state + self._last_trace_stage: str = "" def compose(self) -> ComposeResult: with Horizontal(id="chat_body"): @@ -698,17 +805,22 @@ def compose(self) -> ComposeResult: with Vertical(id="trace_panel"): yield Label("Interaction Trace", id="trace_header") yield VerticalScroll(id="trace_log") + yield Label("", id="trace_summary_chip") yield Label("", id="chat_metrics") with Horizontal(id="chat_input_row"): yield Input(placeholder="Type a message… (Enter to send)", id="chat_input") with Horizontal(id="chat_controls"): with Horizontal(id="chat_primary_actions"): - yield Button("Trace On", id="chat_toggle_trace_btn", classes="chat_btn") + yield Button("Trace", id="chat_toggle_trace_btn", classes="chat_btn") yield Button("Copy", id="chat_copy_btn", classes="chat_btn") yield Button("Stats", id="chat_stats_btn", classes="chat_btn") with Horizontal(id="chat_secondary_actions"): yield Button("Save Skill", id="chat_save_skill_btn", classes="chat_btn") + def on_click(self, event) -> None: + if getattr(event.control, "id", None) == "trace_summary_chip": + self._set_trace_panel_visible(True) + def on_mount(self) -> None: name = self.state.agent.provider.config.name if self.state.agent else "?" log = self.query_one("#chat_log", VerticalScroll) @@ -724,9 +836,28 @@ def _set_trace_panel_visible(self, visible: bool) -> None: self.state.show_trace_panel = visible panel = self.query_one("#trace_panel", Vertical) panel.styles.display = "block" if visible else "none" + chip = self.query_one("#trace_summary_chip", Label) + chip.styles.display = "none" if visible else "block" button = self.query_one("#chat_toggle_trace_btn", Button) - button.label = "Trace On" if visible else "Trace Off" + button.label = "Trace On" if visible else "Trace" + self._refresh_trace_chip() self.notify("Trace panel shown" if visible else "Trace panel hidden") + # Preserve composer focus: expanding the trace panel must never steal focus + # from the input unless the user explicitly clicked into the panel. + try: + self.query_one("#chat_input", Input).focus() + except Exception: + pass + + def _refresh_trace_chip(self) -> None: + try: + trace_log = self.query_one("#trace_log", VerticalScroll) + chip = self.query_one("#trace_summary_chip", Label) + except Exception: + return + count = len(trace_log.children) + last_stage = self._last_trace_stage + chip.update(f" trace Β· {count} events Β· {last_stage} " if last_stage else f" trace Β· {count} events ") def action_toggle_trace_panel(self) -> None: self._set_trace_panel_visible(not self.state.show_trace_panel) @@ -757,6 +888,14 @@ def _copy_last_response(self) -> None: def action_copy_last_response(self) -> None: self._copy_last_response() + @staticmethod + def _render_user_markdown(timestamp: str, text: str): + safe = text.strip() or "_Empty message._" + return Group( + Text(f"{timestamp} β€’ You", style="bold"), + RichMarkdown(safe), + ) + @staticmethod def _render_agent_markdown(timestamp: str, answer: str): safe_answer = answer.strip() or "_No response content._" @@ -777,7 +916,9 @@ async def on_input_submitted(self, event: Input.Submitted) -> None: log.scroll_end(animate=False) return ts = datetime.now().strftime("%H:%M:%S") - log.mount(UserMessage(f"[dim]{ts} β€’ You[/]\n{text}")) + user_msg = UserMessage("") + user_msg.update(self._render_user_markdown(ts, text)) + log.mount(user_msg) thinking = SystemMessage("βš™οΈ Thinking…") live_response = AgentMessage(f"[dim]{ts} β€’ Motion[/]\n") log.mount(thinking) @@ -826,11 +967,13 @@ def _append_trace(self, event_type: str, detail: str = "") -> None: line = f"[dim]{ts}[/] {label}" if safe_detail: line += f" [dim]Β· {safe_detail[:220]}[/]" + self._last_trace_stage = f"{label}" trace_log.mount(SystemMessage(line)) trace_log.scroll_end(animate=False) self.query_one("#trace_header", Label).update( f"Interaction Trace ({len(trace_log.children)})" ) + self._refresh_trace_chip() @work(exclusive=True, name="agent_chat") async def _run_agent(self, prompt: str, thinking: SystemMessage, live_response: AgentMessage) -> None: @@ -1241,7 +1384,7 @@ class TasksPane(Vertical): } #tasks_header_row { height: auto; - margin-bottom: 0; + margin-bottom: 1; } #tasks_header { color: $primary; @@ -1367,13 +1510,14 @@ class SkillsPane(Container): CSS = """ #skills_container { height: 1fr; - border: round $primary; + border: round $border; padding: 1; background: $surface; } #skills_header { color: $primary; text-style: bold; + margin-bottom: 0; } #skills_list { height: 1fr; @@ -1384,7 +1528,7 @@ class SkillsPane(Container): padding: 0 0 1 0; } #skills_search_input { - border: round $primary; + border: round $border; } #skills_editor_row { height: auto; @@ -1394,7 +1538,7 @@ class SkillsPane(Container): margin-right: 1; } #skills_content_input { - border: round $primary; + border: round $border; margin-top: 1; } #skills_status { @@ -1566,13 +1710,14 @@ class KBPane(Container): CSS = """ #kb_container { height: 1fr; - border: round $primary; + border: round $border; padding: 1; background: $surface; } #kb_header { color: $primary; text-style: bold; + margin-bottom: 0; } #kb_list { height: 1fr; @@ -1583,7 +1728,7 @@ class KBPane(Container): padding: 0 0 1 0; } #kb_search_input { - border: round $primary; + border: round $border; } #kb_add_row { height: auto; @@ -1602,7 +1747,7 @@ class KBPane(Container): #kb_add_area { height: 5; margin-top: 1; - border: round $primary; + border: round $border; } #kb_mode_select { margin-top: 1; @@ -1617,8 +1762,8 @@ class KBPane(Container): #kb_memory_results { height: 8; scrollbar-size: 1 1; - border: round $border; - background: $background 25%; + border: solid $border; + background: $panel; padding: 0 1; margin-top: 1; } @@ -1819,7 +1964,7 @@ class MemoryPane(Container): CSS = """ #memory_container { height: 1fr; - border: round $primary; + border: round $border; padding: 1; background: $surface; } @@ -1832,15 +1977,17 @@ class MemoryPane(Container): padding: 0 0 1 0; } #memory_search_input { - border: round $primary; + border: round $border; } #memory_header { color: $primary; text-style: bold; + margin-bottom: 0; } .memory_entry { padding: 0 1; - margin: 0 0; + margin: 0 0 1 0; + border-top: solid $border; } """ @@ -1900,7 +2047,7 @@ class SettingsPane(Container): CSS = """ #settings_container { height: 1fr; - border: round $primary; + border: round $border; padding: 1 2; background: $surface; scrollbar-size: 1 1; @@ -1987,6 +2134,11 @@ def compose(self) -> ComposeResult: yield Label(f" Status: {cstatus}", id="settings_caveman") yield Button("Toggle Caveman", id="btn_toggle_caveman", classes="settings_btn") + yield Label("Auto Skill Synthesis", classes="settings_label") + syn_status = "ON" if self.state.auto_synthesis_enabled else "OFF" + yield Label(f" Status: {syn_status} (crystallize skills from each reply)", id="settings_synthesis") + yield Button("Toggle Auto-Synthesis", id="btn_toggle_synthesis", classes="settings_btn") + yield Label("Workspace", classes="settings_label") yield Label(f" {WORKSPACE}", classes="settings_row") @@ -2062,6 +2214,16 @@ async def on_button_pressed(self, event: Button.Pressed) -> None: self.query_one("#settings_caveman", Label).update(f" Status: {s}") self.notify(f"Caveman: {s}") + elif bid == "btn_toggle_synthesis": + self.state.auto_synthesis_enabled = not self.state.auto_synthesis_enabled + if self.state.agent: + self.state.agent.auto_skill_synthesis = self.state.auto_synthesis_enabled + s = "ON" if self.state.auto_synthesis_enabled else "OFF" + self.query_one("#settings_synthesis", Label).update( + f" Status: {s} (crystallize skills from each reply)" + ) + self.notify(f"Auto Skill Synthesis: {s}") + elif bid == "btn_dashboard": webbrowser.open(f"{DASHBOARD_URL}?key={DASHBOARD_ADMIN_KEY}") self.notify("Opening dashboard in browser…") From 73790f301b93f82a1bf94773922916b738ffe74b Mon Sep 17 00:00:00 2001 From: Mathitz Date: Sat, 18 Jul 2026 16:38:50 -0300 Subject: [PATCH 2/8] style(tui): bolder visual hierarchy for a cooler, less amateur UI --- ui/tui.py | 112 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 86 insertions(+), 26 deletions(-) diff --git a/ui/tui.py b/ui/tui.py index 67c0673..f4e20a7 100644 --- a/ui/tui.py +++ b/ui/tui.py @@ -192,8 +192,8 @@ class UserMessage(Static): """A user message card β€” primary accent header, markdown body.""" DEFAULT_CSS = """ UserMessage { - background: $surface; - border-left: heavy $primary; + background: $panel; + border-left: thick $primary; border-right: blank; border-top: blank; border-bottom: blank; @@ -208,8 +208,8 @@ class ReasoningMessage(Static): """Collapsible-style block used to surface model reasoning stream.""" DEFAULT_CSS = """ ReasoningMessage { - background: $panel; - border-left: heavy $warning; + background: $background; + border-left: thick $warning; border-right: blank; border-top: blank; border-bottom: blank; @@ -225,7 +225,7 @@ class AgentMessage(Static): DEFAULT_CSS = """ AgentMessage { background: $surface; - border-left: heavy $accent; + border-left: thick $accent; border-right: blank; border-top: blank; border-bottom: blank; @@ -367,14 +367,17 @@ class ActivityRail(Vertical): width: 36; min-width: 30; max-width: 42; - border-left: heavy $border; + border-left: heavy $primary; padding: 1 1; background: $panel; } #activity_header { - color: $accent; + color: $primary; text-style: bold; margin-bottom: 1; + padding: 0 1; + background: $surface; + border: solid $border; } #activity_list { height: 1fr; @@ -385,7 +388,7 @@ class ActivityRail(Vertical): margin: 0 0 1 0; color: $text; background: $surface; - border: round $border; + border: solid $border; } """ @@ -551,14 +554,15 @@ class MainScreen(Screen): CSS = """ #main_shell { height: 1fr; background: $background; } - #main_body { width: 1fr; padding: 0 1 0 0; } + #main_body { width: 1fr; padding: 0 1 0 1; } #main_tabs { height: 1fr; } #session_metrics_footer { height: auto; color: $text-muted; - background: $background; - border-top: solid $border; + background: $panel; + border-top: heavy $primary; padding: 0 2; + text-style: bold; } TabbedContent TabPane { padding: 0 0; @@ -716,31 +720,38 @@ class ChatPane(Vertical): DEFAULT_CSS = """ ChatPane { height: 1fr; + background: $background; + padding: 0 0 0 0; } #chat_body { height: 1fr; - padding: 0 0 1 0; + padding: 1 0 1 0; } #chat_log { height: 1fr; width: 3fr; - border: round $primary; + border: heavy $primary; + border-title-color: $primary; + border-title-style: bold; padding: 1 2; scrollbar-size: 1 1; background: $surface; } #trace_panel { - width: 42; + width: 40; height: 1fr; - border: round $border; + border: solid $border; background: $panel; padding: 1 1; margin-left: 1; } #trace_header { - color: $text-muted; + color: $accent; text-style: bold; - margin-bottom: 0; + margin-bottom: 1; + padding: 0 1; + background: $surface; + border: solid $border; } #trace_log { height: 1fr; @@ -754,14 +765,15 @@ class ChatPane(Vertical): padding: 0 2; margin: 0 0 1 0; background: $panel; - border: round $border; - color: $text-muted; + border: heavy $accent; + color: $accent; + text-style: bold; } #chat_input_row { height: auto; padding: 1 1 1 1; background: $panel; - border: solid $border; + border: heavy $primary; } #chat_controls { height: auto; @@ -781,16 +793,25 @@ class ChatPane(Vertical): color: $text-muted; margin: 0 0 0 0; padding: 0 2; + text-style: dim; } #chat_input { height: 3; - border: round $primary; - background: $surface; + border: heavy $primary; + background: $background; + color: $text; width: 1fr; + padding: 0 1; } .chat_btn { margin-left: 1; min-width: 10; + background: $surface; + border: solid $border; + } + .chat_btn:hover { + border: solid $primary; + color: $primary; } """ @@ -892,7 +913,8 @@ def action_copy_last_response(self) -> None: def _render_user_markdown(timestamp: str, text: str): safe = text.strip() or "_Empty message._" return Group( - Text(f"{timestamp} β€’ You", style="bold"), + Text(f"β–Έ {timestamp} YOU", style="bold"), + Text(""), RichMarkdown(safe), ) @@ -900,7 +922,8 @@ def _render_user_markdown(timestamp: str, text: str): def _render_agent_markdown(timestamp: str, answer: str): safe_answer = answer.strip() or "_No response content._" return Group( - Text(f"{timestamp} β€’ Motion", style="dim"), + Text(f"β—‚ {timestamp} MOTION", style="bold"), + Text(""), RichMarkdown(safe_answer), ) @@ -2249,9 +2272,46 @@ class MotionTUI(App): CSS = """ Screen { background: $background; color: $foreground; } - Header { background: $surface; } - Footer { background: $surface; } + Header { + background: $surface; + border-bottom: heavy $primary; + color: $text; + text-style: bold; + padding: 0 1; + } + Header.-header-tall { height: 3; } + Footer { + background: $panel; + border-top: heavy $primary; + color: $text-muted; + padding: 0 1; + } TabbedContent { height: 1fr; } + Tabs { + background: $panel; + height: 3; + border-bottom: solid $border; + } + Tabs > Tab { + padding: 0 2; + color: $text-muted; + text-style: bold; + background: $panel; + border: blank; + } + Tabs > Tab:hover { + color: $text; + background: $surface; + } + Tabs > Tab.-active { + color: $background; + background: $primary; + text-style: bold; + } + TabPane { + background: $background; + padding: 0 0; + } .experimental-ui TaskRow { padding: 1 2; margin: 0 0 1 0; From db66ca312120d9026f08ca7fb9addb331e6466be Mon Sep 17 00:00:00 2001 From: Mathitz Date: Sun, 19 Jul 2026 00:42:20 -0300 Subject: [PATCH 3/8] fix: chat input text visibility via ChatInputMirror --- ui/themes.py | 19 +- ui/tui.py | 614 ++++++++++++++++++++++++++++++++------------------- 2 files changed, 399 insertions(+), 234 deletions(-) diff --git a/ui/themes.py b/ui/themes.py index dd57cd7..206a0a8 100644 --- a/ui/themes.py +++ b/ui/themes.py @@ -18,6 +18,23 @@ # 2. A lightweight dataclass-style Theme (backward compat for ThemeRegistry) _RAW_THEMES: List[dict] = [ + dict( + id="omni_dark", + name="Omni Dark", + background="#191622", + surface="#23212B", + panel="#2A2734", + foreground="#E1E1E6", + primary="#78D1E1", + secondary="#483C67", + accent="#78D1E1", + border="#41414D", + highlight="#2E2A3A", + error="#E96379", + success="#67E480", + warning="#E89E64", + dark=True, + ), dict( id="one_dark", name="One Dark", @@ -119,7 +136,7 @@ def __init__(self, name: str, background: str, foreground: str, success=d["success"], warning=d["warning"], dark=d["dark"], - panel=d["border"], + panel=d.get("panel", d["border"]), boost=d["highlight"], ) diff --git a/ui/tui.py b/ui/tui.py index f4e20a7..d67b760 100644 --- a/ui/tui.py +++ b/ui/tui.py @@ -14,6 +14,15 @@ - Ctrl+C cancels the current request; Ctrl+Q quits - KB tab: knowledge base for reference docs that don't become skills +Visual guardrails (R3 β€” Ops Rounded): + - Maximum one permanent border per major region. + - No adjacent parallel separators within 1 row of each other. + - Spacing scale: 0, 1, 2 row gaps (2 reserved for section breaks). + - Persistent accent area target below ~8-10% of screen. + - Rounded corners on conversation bubbles and grouped setting blocks. + - Both User and Motion replies render as explicit rounded balloons. + - Accent is reserved for active tab, focused input, and high-signal state. + Launch: python main.py β†’ TUI (default) python main.py --chat β†’ old REPL python main.py --provider X β†’ TUI with pre-selected provider @@ -37,6 +46,8 @@ from textual.binding import Binding from textual.containers import Container, Horizontal, Vertical, VerticalScroll from textual.screen import Screen +from textual.strip import Strip +from textual.widget import Widget from textual.widgets import ( Button, Header, @@ -86,7 +97,7 @@ def __init__(self) -> None: self.task_manager: Optional[TaskManager] = None self.config_manager: ConfigManager = ConfigManager() self.current_provider_id: str = "" - self.current_theme: str = "one_dark" + self.current_theme: str = "omni_dark" self.caveman_enabled: bool = True self.auto_synthesis_enabled: bool = False self.ui_mode: str = "conservative" @@ -189,49 +200,39 @@ def _extract_reasoning_and_answer(text: str) -> tuple[str, str]: # ─── Chat message widgets ───────────────────────────────────────────────────── class UserMessage(Static): - """A user message card β€” primary accent header, markdown body.""" + """User reply balloon β€” rounded panel surface, aligned right.""" DEFAULT_CSS = """ UserMessage { background: $panel; - border-left: thick $primary; - border-right: blank; - border-top: blank; - border-bottom: blank; - padding: 1 2; - margin: 1 8 0 0; color: $text; + border: round $panel; + padding: 1 2; + margin: 1 6 0 0; } """ - class ReasoningMessage(Static): - """Collapsible-style block used to surface model reasoning stream.""" + """Inline reasoning hint β€” same structural balloon, no heavy rule.""" DEFAULT_CSS = """ ReasoningMessage { background: $background; - border-left: thick $warning; - border-right: blank; - border-top: blank; - border-bottom: blank; - padding: 1 2; - margin: 1 0 0 8; color: $text-muted; text-style: dim italic; + border: round $background; + padding: 1 2; + margin: 1 0 1 6; } """ class AgentMessage(Static): - """An agent message card β€” accent header, markdown body.""" + """Motion reply balloon β€” rounded surface, aligned left.""" DEFAULT_CSS = """ AgentMessage { background: $surface; - border-left: thick $accent; - border-right: blank; - border-top: blank; - border-bottom: blank; - padding: 1 2; - margin: 1 0 0 8; color: $text; + border: round $surface; + padding: 1 2; + margin: 1 0 1 4; } """ @@ -241,12 +242,75 @@ class SystemMessage(Static): SystemMessage { color: $text-muted; text-style: dim; - padding: 0 1; - margin: 0 0 0 0; + padding: 0 2; + margin: 0 0 1 0; } """ +class ChatInput(Input): + """Chat composer input with explicit visible text rendering.""" + + def render_line(self, y: int) -> Strip: + if y != 0: + return Strip.blank(self.size.width) + + width = max(1, self.scrollable_content_region.width) + if self.value: + text = Text(self.value, style="#E1E1E6", no_wrap=True, overflow="crop", end="") + else: + text = Text(self.placeholder, style="dim #A8A4B8", no_wrap=True, overflow="crop", end="") + + if self.has_focus and self._cursor_visible: + cursor = self.cursor_position if self.value else 0 + if cursor >= len(text): + text.append(" ") + text.stylize("bold #191622 on #78D1E1", cursor, cursor + 1) + + segments = list(self.app.console.render(text, self.app.console.options.update_width(width))) + strip = Strip(segments) + return strip.crop(0, width).extend_cell_length(width).apply_style(self.rich_style) +class ChatInputMirror(Widget): + """Visible composer text surface mirrored from the real input widget.""" + def __init__(self, **kwargs) -> None: + super().__init__(**kwargs) + self._value = "" + self._cursor = 0 + self._focused = False + + def set_input_state(self, value: str, cursor: int, focused: bool) -> None: + self._value = value + self._cursor = max(0, min(cursor, len(value))) + self._focused = focused + self.refresh() + + def render_line(self, y: int) -> Strip: + width = max(1, self.scrollable_content_region.width) + if y != 0: + return Strip.blank(width) + + if self._value: + text = Text(self._value, style="#E1E1E6", no_wrap=True, overflow="crop", end="") + if self._focused: + cursor = self._cursor + if cursor >= len(text): + text.append(" ") + text.stylize("bold #191622 on #78D1E1", cursor, cursor + 1) + else: + text = Text("Type a message… (Enter to send)", style="dim #A8A4B8", no_wrap=True, overflow="crop", end="") + if self._focused: + text.stylize("bold #191622 on #78D1E1", 0, 1) + + segments = list(self.app.console.render(text, self.app.console.options.update_width(width))) + strip = Strip(segments) + return strip.crop(0, width).extend_cell_length(width).apply_style(self.rich_style) + + def on_click(self) -> None: + try: + self.screen.query_one("#chat_input", Input).focus() + except Exception: + pass + class ProviderOption(ListItem): """A selectable provider row on the startup screen.""" @@ -275,7 +339,7 @@ class ProviderSelectScreen(Screen): width: 72; height: auto; max-height: 85%; - border: round $primary; + border: round $border; padding: 1 3; background: $surface; overflow-y: auto; @@ -283,7 +347,7 @@ class ProviderSelectScreen(Screen): #provider_title { text-align: center; text-style: bold; - color: $primary; + color: $text; margin-bottom: 0; } #provider_subtitle { @@ -367,17 +431,18 @@ class ActivityRail(Vertical): width: 36; min-width: 30; max-width: 42; - border-left: heavy $primary; + border-left: blank; + margin-left: 2; padding: 1 1; background: $panel; } #activity_header { - color: $primary; + color: $text-muted; text-style: bold; - margin-bottom: 1; + margin-bottom: 2; padding: 0 1; - background: $surface; - border: solid $border; + background: transparent; + border: blank; } #activity_list { height: 1fr; @@ -387,8 +452,11 @@ class ActivityRail(Vertical): padding: 0 1; margin: 0 0 1 0; color: $text; - background: $surface; - border: solid $border; + background: transparent; + border: blank; + } + .activity_row:first-child { + border-top: blank; } """ @@ -397,7 +465,7 @@ def __init__(self, state: AppState, **kwargs) -> None: self.state = state def compose(self) -> ComposeResult: - yield Label("⚑ Live Activity", id="activity_header") + yield Label("Live Activity", id="activity_header") yield VerticalScroll(id="activity_list") def on_mount(self) -> None: @@ -413,7 +481,7 @@ def refresh_activity(self) -> None: tasks = list(status["tasks"].values()) tasks.sort(key=lambda t: t.start_time or datetime.min, reverse=True) running = sum(1 for t in tasks if t.status == "RUNNING") - self.query_one("#activity_header", Label).update(f"⚑ Live Activity Β· {running} running") + self.query_one("#activity_header", Label).update(f"Live Activity Β· {running} running") container = self.query_one("#activity_list", VerticalScroll) for child in list(container.children): @@ -449,13 +517,13 @@ class ShortcutsOverlay(Screen): #shortcuts_box { width: 78; max-height: 80%; - border: round $primary; + border: round $border; background: $surface; padding: 1 2; scrollbar-size: 1 1; } #shortcuts_title { - color: $primary; + color: $text; text-style: bold; text-align: center; margin-bottom: 1; @@ -466,7 +534,7 @@ class ShortcutsOverlay(Screen): scrollbar-size: 1 1; } .shortcut_section { - color: $accent; + color: $text-muted; text-style: bold; margin-top: 1; margin-bottom: 0; @@ -559,11 +627,12 @@ class MainScreen(Screen): #session_metrics_footer { height: auto; color: $text-muted; - background: $panel; - border-top: heavy $primary; + background: $background; + border-top: blank; padding: 0 2; - text-style: bold; + text-style: dim; } + TabbedContent { height: 1fr; } TabbedContent TabPane { padding: 0 0; } @@ -607,17 +676,17 @@ def compose(self) -> ComposeResult: with Horizontal(id="main_shell"): with Vertical(id="main_body"): with TabbedContent(id="main_tabs"): - with TabPane("πŸ’¬ Chat", id="chat_tab"): + with TabPane("Chat", id="chat_tab"): yield ChatPane(self.state) - with TabPane("βš™οΈ Tasks", id="tasks_tab"): + with TabPane("Tasks", id="tasks_tab"): yield TasksPane(self.state) - with TabPane("πŸŽ“ Skills", id="skills_tab"): + with TabPane("Skills", id="skills_tab"): yield SkillsPane(self.state) - with TabPane("πŸ“š KB", id="kb_tab"): + with TabPane("KB", id="kb_tab"): yield KBPane(self.state) - with TabPane("🧠 Memory", id="memory_tab"): + with TabPane("Memory", id="memory_tab"): yield MemoryPane(self.state) - with TabPane("πŸ”§ Settings", id="settings_tab"): + with TabPane("Settings", id="settings_tab"): yield SettingsPane(self.state) yield ActivityRail(self.state, id="activity_rail") yield Label("", id="session_metrics_footer") @@ -730,9 +799,7 @@ class ChatPane(Vertical): #chat_log { height: 1fr; width: 3fr; - border: heavy $primary; - border-title-color: $primary; - border-title-style: bold; + border: blank; padding: 1 2; scrollbar-size: 1 1; background: $surface; @@ -740,54 +807,38 @@ class ChatPane(Vertical): #trace_panel { width: 40; height: 1fr; - border: solid $border; + border: blank; background: $panel; padding: 1 1; margin-left: 1; } #trace_header { - color: $accent; + color: $text-muted; text-style: bold; margin-bottom: 1; padding: 0 1; - background: $surface; - border: solid $border; + background: transparent; + border: blank; } #trace_log { height: 1fr; scrollbar-size: 1 1; - border-top: solid $border; padding-top: 1; } + #trace_log > * { + border-top: blank; + padding-top: 0; + margin-top: 0; + } #trace_summary_chip { height: auto; width: auto; padding: 0 2; margin: 0 0 1 0; - background: $panel; - border: heavy $accent; - color: $accent; - text-style: bold; - } - #chat_input_row { - height: auto; - padding: 1 1 1 1; - background: $panel; - border: heavy $primary; - } - #chat_controls { - height: auto; - width: auto; - padding: 0 0 0 1; - border-left: solid $border; - margin-left: 1; - } - #chat_primary_actions, #chat_secondary_actions { - height: auto; - width: auto; - } - #chat_secondary_actions { - margin-left: 1; + background: transparent; + border: blank; + color: $text-muted; + text-style: dim; } #chat_metrics { color: $text-muted; @@ -795,23 +846,52 @@ class ChatPane(Vertical): padding: 0 2; text-style: dim; } + #chat_composer { + height: 5; + min-height: 5; + max-height: 5; + padding: 1 1 1 1; + background: $panel; + border: round $panel; + margin: 1 1 0 1; + } #chat_input { height: 3; - border: heavy $primary; - background: $background; - color: $text; + width: 1; + min-width: 1; + max-width: 1; + border: tall #41414D; + background: #2A2734; + color: #2A2734; + padding: 0 0; + } + #chat_input_mirror { + height: 1fr; width: 1fr; - padding: 0 1; + background: #23212B; + color: #E1E1E6; + padding: 0 2; + } + #chat_input:focus { + border: tall #2A2734; + background: #2A2734; + color: #2A2734; } .chat_btn { + height: 3; margin-left: 1; min-width: 10; - background: $surface; - border: solid $border; + background: transparent; + border: blank; + color: $text-muted; } .chat_btn:hover { - border: solid $primary; - color: $primary; + background: $surface; + color: $text; + } + .chat_btn:focus { + border-bottom: solid $primary; + color: $text; } """ @@ -828,8 +908,9 @@ def compose(self) -> ComposeResult: yield VerticalScroll(id="trace_log") yield Label("", id="trace_summary_chip") yield Label("", id="chat_metrics") - with Horizontal(id="chat_input_row"): - yield Input(placeholder="Type a message… (Enter to send)", id="chat_input") + with Horizontal(id="chat_composer"): + yield ChatInputMirror(id="chat_input_mirror") + yield ChatInput(placeholder="Type a message… (Enter to send)", id="chat_input") with Horizontal(id="chat_controls"): with Horizontal(id="chat_primary_actions"): yield Button("Trace", id="chat_toggle_trace_btn", classes="chat_btn") @@ -845,13 +926,37 @@ def on_click(self, event) -> None: def on_mount(self) -> None: name = self.state.agent.provider.config.name if self.state.agent else "?" log = self.query_one("#chat_log", VerticalScroll) - log.border_title = " Chat " log.mount(SystemMessage(f"⚑ Motion Harness β€” connected to {name}")) log.mount(SystemMessage("Tip: Ctrl/Alt+1..6 or F1-F6 tabs Β· F8 Trace Β· F9 Copy Β· /skill save ")) self._append_trace("session_start", f"provider={name}") self._set_trace_panel_visible(self.state.show_trace_panel) self._refresh_metrics_bar() self.query_one("#chat_input", Input).focus() + self._refresh_input_mirror() + + def _refresh_input_mirror(self) -> None: + try: + input_box = self.query_one("#chat_input", Input) + mirror = self.query_one("#chat_input_mirror", ChatInputMirror) + except Exception: + return + mirror.set_input_state( + value=input_box.value, + cursor=input_box.cursor_position, + focused=input_box.has_focus, + ) + + def on_input_changed(self, event: Input.Changed) -> None: + if event.input.id == "chat_input": + self._refresh_input_mirror() + + def on_descendant_focus(self, event) -> None: + if getattr(getattr(event, "widget", None), "id", None) == "chat_input": + self._refresh_input_mirror() + + def on_descendant_blur(self, event) -> None: + if getattr(getattr(event, "widget", None), "id", None) == "chat_input": + self._refresh_input_mirror() def _set_trace_panel_visible(self, visible: bool) -> None: self.state.show_trace_panel = visible @@ -913,7 +1018,7 @@ def action_copy_last_response(self) -> None: def _render_user_markdown(timestamp: str, text: str): safe = text.strip() or "_Empty message._" return Group( - Text(f"β–Έ {timestamp} YOU", style="bold"), + Text(f"{timestamp} YOU", style="bold"), Text(""), RichMarkdown(safe), ) @@ -922,7 +1027,7 @@ def _render_user_markdown(timestamp: str, text: str): def _render_agent_markdown(timestamp: str, answer: str): safe_answer = answer.strip() or "_No response content._" return Group( - Text(f"β—‚ {timestamp} MOTION", style="bold"), + Text(f"{timestamp} MOTION", style="bold"), Text(""), RichMarkdown(safe_answer), ) @@ -932,6 +1037,7 @@ async def on_input_submitted(self, event: Input.Submitted) -> None: if not text: return event.input.value = "" + self._refresh_input_mirror() log = self.query_one("#chat_log", VerticalScroll) if text.startswith("/skill"): @@ -942,8 +1048,9 @@ async def on_input_submitted(self, event: Input.Submitted) -> None: user_msg = UserMessage("") user_msg.update(self._render_user_markdown(ts, text)) log.mount(user_msg) - thinking = SystemMessage("βš™οΈ Thinking…") - live_response = AgentMessage(f"[dim]{ts} β€’ Motion[/]\n") + thinking = SystemMessage("Thinking…") + live_response = AgentMessage("") + live_response.update(self._render_agent_markdown(ts, "_Waiting for response…_")) log.mount(thinking) log.mount(live_response) log.scroll_end(animate=False) @@ -1004,7 +1111,6 @@ async def _run_agent(self, prompt: str, thinking: SystemMessage, live_response: chunks: list[str] = [] first_chunk = True header_ts = datetime.now().strftime("%H:%M:%S") - header = f"[dim]{header_ts} β€’ Motion[/]\n" reasoning_widget: Optional[ReasoningMessage] = None current_raw = "" self._append_trace("interaction_start", prompt[:120]) @@ -1025,10 +1131,10 @@ async def on_stream_chunk(chunk: str) -> None: reasoning, answer = _extract_reasoning_and_answer(current_raw) if reasoning: if reasoning_widget is None: - reasoning_widget = ReasoningMessage("[dim]Reasoning stream[/]\n") + reasoning_widget = ReasoningMessage("") log.mount(reasoning_widget, before=live_response) - reasoning_widget.update(f"[dim]Reasoning[/]\n{reasoning[:2500]}") - live_response.update(header + (answer or "")) + reasoning_widget.update(self._render_agent_markdown(header_ts, f"[dim]Reasoning[/]\n{reasoning[:2500]}")) + live_response.update(self._render_agent_markdown(header_ts, answer or "")) async def on_trace_event(*args) -> None: event_type = "trace" payload: Dict[str, Any] = {} @@ -1194,7 +1300,7 @@ class TaskDetailScreen(Screen): #detail_box { width: 80; height: 85%; - border: round $primary; + border: round $border; background: $surface; padding: 1 2; overflow-y: auto; @@ -1202,14 +1308,14 @@ class TaskDetailScreen(Screen): } #detail_header { text-style: bold; - color: $primary; + color: $text; margin-bottom: 1; } #detail_back_btn { margin-right: 1; } .detail_section { - color: $primary; + color: $text-muted; text-style: bold; margin-top: 1; margin-bottom: 0; @@ -1351,14 +1457,14 @@ class TaskRow(Static): DEFAULT_CSS = """ TaskRow { - padding: 1 1; + padding: 1 1 1 2; margin: 0 0 1 0; - background: $background 30%; - border: round $border; + background: $surface; + border: blank; } TaskRow:hover { background: $primary 15%; - border: round $primary; + color: $text; } """ @@ -1398,19 +1504,21 @@ class TasksPane(Vertical): DEFAULT_CSS = """ TasksPane { height: 1fr; + padding: 1 1 0 1; } #tasks_container { height: 1fr; - border: round $border; + border: blank; padding: 1; background: $surface; } #tasks_header_row { height: auto; margin-bottom: 1; + padding: 0 1; } #tasks_header { - color: $primary; + color: $text-muted; text-style: bold; width: 1fr; } @@ -1421,13 +1529,19 @@ class TasksPane(Vertical): #task_list { height: 1fr; scrollbar-size: 1 1; + padding: 0 1; } #task_input_row { height: auto; - padding: 1 0 0 0; + padding: 1 1 1 1; + background: $panel; } #task_input { - border: round $border; + border: blank; + background: $background; + } + #task_input:focus { + border-bottom: solid $primary; } """ @@ -1438,7 +1552,7 @@ def __init__(self, state: AppState, **kwargs) -> None: def compose(self) -> ComposeResult: with Vertical(id="tasks_container"): with Horizontal(id="tasks_header_row"): - yield Label("βš™οΈ Tasks", id="tasks_header") + yield Label("Tasks", id="tasks_header") yield Label("", id="tasks_count") yield VerticalScroll(id="task_list") with Horizontal(id="task_input_row"): @@ -1503,7 +1617,7 @@ def _update_header(self) -> None: running = sum(1 for t in s["tasks"].values() if t.status == "RUNNING") done = sum(1 for t in s["tasks"].values() if t.status in ("COMPLETED", "FAILED")) try: - self.query_one("#tasks_header", Label).update("βš™οΈ Tasks") + self.query_one("#tasks_header", Label).update("Tasks") self.query_one("#tasks_count", Label).update( f"{running} running Β· {done}/{total} done" if total else "no tasks yet" ) @@ -1533,40 +1647,57 @@ class SkillsPane(Container): CSS = """ #skills_container { height: 1fr; - border: round $border; + border: blank; padding: 1; background: $surface; } #skills_header { - color: $primary; + color: $text-muted; text-style: bold; - margin-bottom: 0; + margin-bottom: 1; + padding: 0 1; } #skills_list { height: 1fr; scrollbar-size: 1 1; + padding: 0 1; } #skills_search { height: auto; - padding: 0 0 1 0; + padding: 0 1 1 1; } #skills_search_input { - border: round $border; + border: blank; + background: $background; + } + #skills_search_input:focus { + border-bottom: solid $primary; } #skills_editor_row { height: auto; - padding: 1 0 0 0; + padding: 1 1 0 1; + background: $panel; } #skills_title_input { margin-right: 1; + border: blank; + background: $background; + } + #skills_title_input:focus { + border-bottom: solid $primary; } #skills_content_input { - border: round $border; + border: blank; + background: $background; margin-top: 1; } + #skills_content_input:focus { + border-bottom: solid $primary; + } #skills_status { color: $text-muted; margin-top: 1; + padding: 0 1; } .skill_entry { padding: 0 1; @@ -1580,7 +1711,7 @@ def __init__(self, state: AppState, **kwargs) -> None: def compose(self) -> ComposeResult: with Vertical(id="skills_container"): - yield Label("πŸŽ“ Crystallized Skills", id="skills_header") + yield Label("Skills", id="skills_header") with Horizontal(id="skills_search"): yield Input(placeholder="Search skills…", id="skills_search_input") with Horizontal(id="skills_editor_row"): @@ -1595,7 +1726,6 @@ def compose(self) -> ComposeResult: yield VerticalScroll(id="skills_list") def on_mount(self) -> None: - self.query_one("#skills_container", Vertical).border_title = " Skills " self._load_skills() def _load_skills(self, query: str = "") -> None: @@ -1733,33 +1863,45 @@ class KBPane(Container): CSS = """ #kb_container { height: 1fr; - border: round $border; + border: blank; padding: 1; background: $surface; } #kb_header { - color: $primary; + color: $text-muted; text-style: bold; - margin-bottom: 0; + margin-bottom: 1; + padding: 0 1; } #kb_list { height: 1fr; scrollbar-size: 1 1; + padding: 0 1; } #kb_search { height: auto; - padding: 0 0 1 0; + padding: 0 1 1 1; } #kb_search_input { - border: round $border; + border: blank; + background: $background; + } + #kb_search_input:focus { + border-bottom: solid $primary; } #kb_add_row { height: auto; - padding: 0 0 0 0; + padding: 1 1 0 1; + background: $panel; } #kb_add_title { height: 3; margin-right: 1; + border: blank; + background: $background; + } + #kb_add_title:focus { + border-bottom: solid $primary; } #kb_add_btn { margin-right: 1; @@ -1770,22 +1912,32 @@ class KBPane(Container): #kb_add_area { height: 5; margin-top: 1; - border: round $border; + border: blank; + background: $background; + } + #kb_add_area:focus { + border-bottom: solid $primary; } #kb_mode_select { margin-top: 1; + padding: 0 1; } #kb_memory_search_row { height: auto; margin-top: 1; + padding: 0 1; } #kb_memory_search_input { - border: round $border; + border: blank; + background: $background; + } + #kb_memory_search_input:focus { + border-bottom: solid $primary; } #kb_memory_results { height: 8; scrollbar-size: 1 1; - border: solid $border; + border: blank; background: $panel; padding: 0 1; margin-top: 1; @@ -1793,6 +1945,7 @@ class KBPane(Container): #kb_status { color: $text-muted; margin-top: 1; + padding: 0 1; } .kb_entry { padding: 0 1; @@ -1806,7 +1959,7 @@ def __init__(self, state: AppState, **kwargs) -> None: def compose(self) -> ComposeResult: with Vertical(id="kb_container"): - yield Label("πŸ“š Knowledge Base", id="kb_header") + yield Label("Knowledge Base", id="kb_header") with Horizontal(id="kb_search"): yield Input(placeholder="Search knowledge base…", id="kb_search_input") yield VerticalScroll(id="kb_list") @@ -1828,7 +1981,6 @@ def compose(self) -> ComposeResult: yield Label("KB indexing mode controls whether entries are annexed into memory.", id="kb_status") def on_mount(self) -> None: - self.query_one("#kb_container", Vertical).border_title = " Knowledge Base " self._load_kb() def _load_kb(self, query: str = "") -> None: @@ -1987,30 +2139,36 @@ class MemoryPane(Container): CSS = """ #memory_container { height: 1fr; - border: round $border; + border: blank; padding: 1; background: $surface; } #memory_results { height: 1fr; scrollbar-size: 1 1; + padding: 0 1; } #memory_search_row { height: auto; - padding: 0 0 1 0; + padding: 0 1 1 1; } #memory_search_input { - border: round $border; + border: blank; + background: $background; + } + #memory_search_input:focus { + border-bottom: solid $primary; } #memory_header { - color: $primary; + color: $text-muted; text-style: bold; - margin-bottom: 0; + margin-bottom: 1; + padding: 0 1; } .memory_entry { padding: 0 1; margin: 0 0 1 0; - border-top: solid $border; + border-top: blank; } """ @@ -2020,13 +2178,13 @@ def __init__(self, state: AppState, **kwargs) -> None: def compose(self) -> ComposeResult: with Vertical(id="memory_container"): - yield Label("🧠 Memory Search", id="memory_header") + yield Label("Memory Search", id="memory_header") with Horizontal(id="memory_search_row"): yield Input(placeholder="Search memories… (Enter to search)", id="memory_search_input") yield VerticalScroll(id="memory_results") def on_mount(self) -> None: - self.query_one("#memory_container", Vertical).border_title = " Memory " + pass async def on_input_submitted(self, event: Input.Submitted) -> None: query = event.value.strip() @@ -2070,46 +2228,48 @@ class SettingsPane(Container): CSS = """ #settings_container { height: 1fr; - border: round $border; + border: blank; padding: 1 2; - background: $surface; + background: $background; scrollbar-size: 1 1; } + .settings_card { + height: auto; + padding: 1 2; + margin-top: 1; + background: $surface; + border: round $surface; + } .settings_label { text-style: bold; - color: $primary; - margin-top: 1; + color: $text; margin-bottom: 0; } - .settings_section { - margin-top: 0; - margin-bottom: 1; - padding: 0 0; - } .settings_row { margin-top: 0; height: auto; color: $text-muted; } - #provider_select { - margin-top: 0; - margin-bottom: 0; - } - #theme_select { - margin-top: 0; - margin-bottom: 0; - } .settings_btn { margin-top: 0; margin-right: 1; + background: transparent; + border: blank; + color: $text-muted; } - #settings_provider { - color: $foreground; + .settings_btn:hover { + background: $panel; + color: $text; } - #settings_caveman { - color: $foreground; + .settings_btn:focus { + border-bottom: solid $primary; + color: $text; } - #settings_workers { + #provider_select, #theme_select, #ui_mode_select { + margin-top: 0; + margin-bottom: 0; + } + #settings_provider, #settings_caveman, #settings_synthesis, #settings_activity_rail, #settings_workers { color: $text-muted; } """ @@ -2120,57 +2280,55 @@ def __init__(self, state: AppState, **kwargs) -> None: def compose(self) -> ComposeResult: with VerticalScroll(id="settings_container"): - yield Label("πŸ”§ Settings", classes="settings_label") - - yield Label("Provider / Model", classes="settings_label") - yield Label(" Switch the active model at runtime:", classes="settings_row") - options = AppState.build_provider_options() - valid_values = {v for _, v in options} - default_val = self.state.current_provider_id if self.state.current_provider_id in valid_values else (options[0][1] if options else Select.BLANK) - yield Select(options, value=default_val, id="provider_select") - active_label = default_val - for label, val in options: - if val == default_val: - active_label = label - break - yield Label(f" Active: {active_label}", id="settings_provider") - - yield Label("Theme", classes="settings_label") - theme_options = [(ThemeRegistry.get_theme(tid).name, tid) for tid in ThemeRegistry.theme_ids()] - yield Select(theme_options, value=self.state.current_theme, id="theme_select") - yield Button("Toggle Theme (Ctrl+T)", id="btn_toggle_theme", classes="settings_btn") - - yield Label("Interface Style", classes="settings_label") - yield Select( - [("Conservative", "conservative"), ("Experimental", "experimental")], - value=self.state.ui_mode, - id="ui_mode_select", - ) - - yield Label("Global Activity Rail", classes="settings_label") - rail_state = "ON" if self.state.show_activity_rail else "OFF" - yield Label(f" Status: {rail_state} (Ctrl+B)", id="settings_activity_rail") - yield Button("Toggle Activity Rail", id="btn_toggle_activity_rail", classes="settings_btn") - - yield Label("Caveman Compression", classes="settings_label") - cstatus = "ON" if self.state.caveman_enabled else "OFF" - yield Label(f" Status: {cstatus}", id="settings_caveman") - yield Button("Toggle Caveman", id="btn_toggle_caveman", classes="settings_btn") - - yield Label("Auto Skill Synthesis", classes="settings_label") - syn_status = "ON" if self.state.auto_synthesis_enabled else "OFF" - yield Label(f" Status: {syn_status} (crystallize skills from each reply)", id="settings_synthesis") - yield Button("Toggle Auto-Synthesis", id="btn_toggle_synthesis", classes="settings_btn") - - yield Label("Workspace", classes="settings_label") - yield Label(f" {WORKSPACE}", classes="settings_row") - - yield Label("Dashboard", classes="settings_label") - yield Button("Open Dashboard β†—", id="btn_dashboard", classes="settings_btn") + with Container(classes="settings_card"): + yield Label("Provider / Model", classes="settings_label") + yield Label("Switch the active model at runtime", classes="settings_row") + options = AppState.build_provider_options() + valid_values = {v for _, v in options} + default_val = self.state.current_provider_id if self.state.current_provider_id in valid_values else (options[0][1] if options else Select.BLANK) + yield Select(options, value=default_val, id="provider_select") + active_label = default_val + for label, val in options: + if val == default_val: + active_label = label + break + yield Label(f"Active: {active_label}", id="settings_provider") + + with Container(classes="settings_card"): + yield Label("Theme", classes="settings_label") + yield Label("Select the visual theme", classes="settings_row") + theme_options = [(ThemeRegistry.get_theme(tid).name, tid) for tid in ThemeRegistry.theme_ids()] + yield Select(theme_options, value=self.state.current_theme, id="theme_select") + yield Button("Cycle theme", id="btn_toggle_theme", classes="settings_btn") + + with Container(classes="settings_card"): + yield Label("Interface Style", classes="settings_label") + yield Label("Toggle experimental visual mode", classes="settings_row") + yield Select( + [("Conservative", "conservative"), ("Experimental", "experimental")], + value=self.state.ui_mode, + id="ui_mode_select", + ) - yield Label("Workers", classes="settings_label") - w = f" {os.cpu_count() * 2} max (CPU-aware)" if self.state.task_manager else " Not initialized" - yield Label(w, id="settings_workers") + with Container(classes="settings_card"): + yield Label("Options", classes="settings_label") + yield Label("Workspace toggles and status", classes="settings_row") + rail_state = "ON" if self.state.show_activity_rail else "OFF" + yield Label(f"Activity rail: {rail_state} (Ctrl+B)", id="settings_activity_rail") + yield Button("Toggle rail", id="btn_toggle_activity_rail", classes="settings_btn") + cstatus = "ON" if self.state.caveman_enabled else "OFF" + yield Label(f"Caveman: {cstatus}", id="settings_caveman") + yield Button("Toggle caveman", id="btn_toggle_caveman", classes="settings_btn") + syn_status = "ON" if self.state.auto_synthesis_enabled else "OFF" + yield Label(f"Auto skill synthesis: {syn_status}", id="settings_synthesis") + yield Button("Toggle synthesis", id="btn_toggle_synthesis", classes="settings_btn") + + with Container(classes="settings_card"): + yield Label("Workspace", classes="settings_label") + yield Label(f"{WORKSPACE}", classes="settings_row") + yield Button("Open dashboard β†—", id="btn_dashboard", classes="settings_btn") + w = f"Max workers: {os.cpu_count() * 2} (CPU-aware)" if self.state.task_manager else "Task manager not initialized" + yield Label(w, id="settings_workers") async def on_select_changed(self, event: Select.Changed) -> None: """Handle dropdown changes for provider and theme selectors.""" @@ -2273,30 +2431,29 @@ class MotionTUI(App): CSS = """ Screen { background: $background; color: $foreground; } Header { - background: $surface; - border-bottom: heavy $primary; - color: $text; + background: $background; + border-bottom: blank; + color: $text-muted; text-style: bold; padding: 0 1; } Header.-header-tall { height: 3; } Footer { - background: $panel; - border-top: heavy $primary; + background: $background; + border-top: blank; color: $text-muted; padding: 0 1; } TabbedContent { height: 1fr; } Tabs { - background: $panel; + background: $background; height: 3; - border-bottom: solid $border; + border-bottom: blank; } Tabs > Tab { padding: 0 2; color: $text-muted; - text-style: bold; - background: $panel; + background: $background; border: blank; } Tabs > Tab:hover { @@ -2304,24 +2461,15 @@ class MotionTUI(App): background: $surface; } Tabs > Tab.-active { - color: $background; - background: $primary; + color: $text; + background: $surface; + border-bottom: solid $primary; text-style: bold; } TabPane { background: $background; padding: 0 0; } - .experimental-ui TaskRow { - padding: 1 2; - margin: 0 0 1 0; - } - .experimental-ui #chat_log { - border: heavy $primary; - } - .experimental-ui #tasks_container { - border: heavy $primary; - } """ BINDINGS = [ From c1fbb0d6ea2675ffb1347c34fe7055846305379a Mon Sep 17 00:00:00 2001 From: Mathitz Date: Sat, 25 Jul 2026 11:58:39 -0300 Subject: [PATCH 4/8] =?UTF-8?q?style:=20opencode-inspired=20message=20disp?= =?UTF-8?q?lay=20=E2=80=94=20strip=20boxes,=20add=20left=20accent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ui/tui.py | 45 +++++++++++++++++++-------------------------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/ui/tui.py b/ui/tui.py index d67b760..b5c7cee 100644 --- a/ui/tui.py +++ b/ui/tui.py @@ -200,50 +200,48 @@ def _extract_reasoning_and_answer(text: str) -> tuple[str, str]: # ─── Chat message widgets ───────────────────────────────────────────────────── class UserMessage(Static): - """User reply balloon β€” rounded panel surface, aligned right.""" + """User message β€” thin primary left accent bar, no box.""" DEFAULT_CSS = """ UserMessage { - background: $panel; + background: transparent; color: $text; - border: round $panel; - padding: 1 2; - margin: 1 6 0 0; + border-left: thick $primary; + padding: 0 2; + margin: 1 0 0 1; } """ class ReasoningMessage(Static): - """Inline reasoning hint β€” same structural balloon, no heavy rule.""" + """Inline reasoning β€” dim italic, no box (opencode Thinking: style).""" DEFAULT_CSS = """ ReasoningMessage { - background: $background; + background: transparent; color: $text-muted; text-style: dim italic; - border: round $background; - padding: 1 2; - margin: 1 0 1 6; + padding: 0 2; + margin: 0 0 0 1; } """ class AgentMessage(Static): - """Motion reply balloon β€” rounded surface, aligned left.""" + """Agent reply β€” no box, clean text flow.""" DEFAULT_CSS = """ AgentMessage { - background: $surface; + background: transparent; color: $text; - border: round $surface; - padding: 1 2; - margin: 1 0 1 4; + padding: 0 2; + margin: 0 0 1 1; } """ class SystemMessage(Static): - """A system/info message β€” muted, single-line metadata.""" + """System/info message β€” muted, single-line.""" DEFAULT_CSS = """ SystemMessage { color: $text-muted; text-style: dim; padding: 0 2; - margin: 0 0 1 0; + margin: 0 0 0 0; } """ @@ -1018,19 +1016,14 @@ def action_copy_last_response(self) -> None: def _render_user_markdown(timestamp: str, text: str): safe = text.strip() or "_Empty message._" return Group( - Text(f"{timestamp} YOU", style="bold"), - Text(""), + Text(f"you {timestamp}", style="dim"), RichMarkdown(safe), ) @staticmethod def _render_agent_markdown(timestamp: str, answer: str): safe_answer = answer.strip() or "_No response content._" - return Group( - Text(f"{timestamp} MOTION", style="bold"), - Text(""), - RichMarkdown(safe_answer), - ) + return RichMarkdown(safe_answer) async def on_input_submitted(self, event: Input.Submitted) -> None: text = event.value.strip() @@ -1133,7 +1126,7 @@ async def on_stream_chunk(chunk: str) -> None: if reasoning_widget is None: reasoning_widget = ReasoningMessage("") log.mount(reasoning_widget, before=live_response) - reasoning_widget.update(self._render_agent_markdown(header_ts, f"[dim]Reasoning[/]\n{reasoning[:2500]}")) + reasoning_widget.update(Text(f"Thinking: {reasoning[:2500]}", style="dim italic")) live_response.update(self._render_agent_markdown(header_ts, answer or "")) async def on_trace_event(*args) -> None: event_type = "trace" @@ -1168,7 +1161,7 @@ async def on_trace_event(*args) -> None: raw = response or "" reasoning, answer = _extract_reasoning_and_answer(raw) if reasoning: - reasoning_widget = ReasoningMessage(f"[dim]Reasoning[/]\n{reasoning[:2500]}") + reasoning_widget = ReasoningMessage(f"Thinking: {reasoning[:2500]}") log.mount(reasoning_widget, before=live_response) live_response.update(self._render_agent_markdown(header_ts, answer or "")) self.state.last_agent_response = answer or "" From 5087be604e8c18e45afb87ec03cb613f31544301 Mon Sep 17 00:00:00 2001 From: Mathitz Date: Sat, 25 Jul 2026 12:05:32 -0300 Subject: [PATCH 5/8] =?UTF-8?q?style:=20flatten=20chat=20pane=20to=20$back?= =?UTF-8?q?ground=20=E2=80=94=20remove=20all=20surface/panel=20fills?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ui/tui.py | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/ui/tui.py b/ui/tui.py index b5c7cee..f25ea4c 100644 --- a/ui/tui.py +++ b/ui/tui.py @@ -263,7 +263,7 @@ def render_line(self, y: int) -> Strip: cursor = self.cursor_position if self.value else 0 if cursor >= len(text): text.append(" ") - text.stylize("bold #191622 on #78D1E1", cursor, cursor + 1) + text.stylize("on #78D1E1", cursor, cursor + 1) segments = list(self.app.console.render(text, self.app.console.options.update_width(width))) strip = Strip(segments) @@ -788,11 +788,11 @@ class ChatPane(Vertical): ChatPane { height: 1fr; background: $background; - padding: 0 0 0 0; + padding: 0; } #chat_body { height: 1fr; - padding: 1 0 1 0; + padding: 0; } #chat_log { height: 1fr; @@ -800,7 +800,7 @@ class ChatPane(Vertical): border: blank; padding: 1 2; scrollbar-size: 1 1; - background: $surface; + background: $background; } #trace_panel { width: 40; @@ -849,31 +849,34 @@ class ChatPane(Vertical): min-height: 5; max-height: 5; padding: 1 1 1 1; - background: $panel; - border: round $panel; - margin: 1 1 0 1; + background: $background; + border-top: solid $border; + border-left: blank; + border-right: blank; + border-bottom: blank; + margin: 0; } #chat_input { height: 3; width: 1; min-width: 1; max-width: 1; - border: tall #41414D; - background: #2A2734; - color: #2A2734; + border: blank; + background: $background; + color: $background; padding: 0 0; } #chat_input_mirror { height: 1fr; width: 1fr; - background: #23212B; + background: $background; color: #E1E1E6; padding: 0 2; } #chat_input:focus { - border: tall #2A2734; - background: #2A2734; - color: #2A2734; + border: blank; + background: $background; + color: $background; } .chat_btn { height: 3; From 23e6eee961ba9211f2aa79a7dafbe575af2b5ab0 Mon Sep 17 00:00:00 2001 From: Mathitz Date: Sat, 25 Jul 2026 12:43:43 -0300 Subject: [PATCH 6/8] =?UTF-8?q?style:=20fix=20composer=20separator=20color?= =?UTF-8?q?=20=E2=80=94=20$border=E2=86=92$surface=20(subtle=20gray)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ui/tui.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/tui.py b/ui/tui.py index f25ea4c..457f519 100644 --- a/ui/tui.py +++ b/ui/tui.py @@ -850,7 +850,7 @@ class ChatPane(Vertical): max-height: 5; padding: 1 1 1 1; background: $background; - border-top: solid $border; + border-top: solid $surface; border-left: blank; border-right: blank; border-bottom: blank; From 5005f9e87579a263507d4171aeeff99108c5830d Mon Sep 17 00:00:00 2001 From: Mathitz Date: Sun, 9 Aug 2026 01:59:02 -0300 Subject: [PATCH 7/8] Beta v2 theme and [99;5uga[99;5u[99;5u[99;5u[99;5u]]]]] --- .github/workflows/beta_release.yml | 4 +- README.md | 126 +- core/catalog.py | 202 +++ core/config.py | 10 +- core/orchestrator.py | 11 + core/providers.py | 72 +- docs/roadmap.md | 82 ++ docs/ui-variants/a1-soft-cards.svg | 26 + docs/ui-variants/a1-soft-cards.svg.png | Bin 0 -> 77185 bytes docs/ui-variants/a2-flat-transcript.svg | 29 + docs/ui-variants/a2-flat-transcript.svg.png | Bin 0 -> 81547 bytes docs/ui-variants/a3-quiet-ops.svg | 37 + docs/ui-variants/a3-quiet-ops.svg.png | Bin 0 -> 84916 bytes docs/ui-variants/r1-balanced-rounded.svg | 29 + docs/ui-variants/r1-balanced-rounded.svg.png | Bin 0 -> 77019 bytes docs/ui-variants/r2-soft-rounded.svg | 28 + docs/ui-variants/r2-soft-rounded.svg.png | Bin 0 -> 78656 bytes docs/ui-variants/r3-ops-rounded.svg | 33 + docs/ui-variants/r3-ops-rounded.svg.png | Bin 0 -> 79130 bytes main.py | 27 +- tests/test_catalog.py | 72 ++ tests/test_composer.py | 93 ++ tests/test_discovery.py | 130 ++ tests/test_session_context.py | 219 ++++ ui/themes.py | 18 + ui/tui.py | 1178 ++++++++++++------ 26 files changed, 1961 insertions(+), 465 deletions(-) create mode 100644 core/catalog.py create mode 100644 docs/roadmap.md create mode 100644 docs/ui-variants/a1-soft-cards.svg create mode 100644 docs/ui-variants/a1-soft-cards.svg.png create mode 100644 docs/ui-variants/a2-flat-transcript.svg create mode 100644 docs/ui-variants/a2-flat-transcript.svg.png create mode 100644 docs/ui-variants/a3-quiet-ops.svg create mode 100644 docs/ui-variants/a3-quiet-ops.svg.png create mode 100644 docs/ui-variants/r1-balanced-rounded.svg create mode 100644 docs/ui-variants/r1-balanced-rounded.svg.png create mode 100644 docs/ui-variants/r2-soft-rounded.svg create mode 100644 docs/ui-variants/r2-soft-rounded.svg.png create mode 100644 docs/ui-variants/r3-ops-rounded.svg create mode 100644 docs/ui-variants/r3-ops-rounded.svg.png create mode 100644 tests/test_catalog.py create mode 100644 tests/test_composer.py create mode 100644 tests/test_discovery.py create mode 100644 tests/test_session_context.py diff --git a/.github/workflows/beta_release.yml b/.github/workflows/beta_release.yml index 33af894..6d42e96 100644 --- a/.github/workflows/beta_release.yml +++ b/.github/workflows/beta_release.yml @@ -40,10 +40,10 @@ jobs: body: | ## πŸ§ͺ Beta Release v${{ env.VERSION }} Automated release from the beta branch. - + ### Changes ${{ github.event.head_commit.message }} draft: false prerelease: true env: - GITHUB_TOKEN: ${{ secrets.GH_RELEASE_TOKEN }} \ No newline at end of file + GITHUB_TOKEN: ${{ secrets.GH_RELEASE_TOKEN }} diff --git a/README.md b/README.md index ec97bba..011547d 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,8 @@ Quick Start Β· Setup Guide Β· Architecture Β· - Skills Engine + Skills Engine Β· + Roadmap

--- @@ -36,18 +37,36 @@ It treats every successful task trajectory as a learning event, crystallizing ex Get the harness running in under 60 seconds. +### For complete beginners + +**1. Install Python 3.10+** if you don't have it. On macOS: `brew install python@3.14`. On Linux: `sudo apt install python3 python3-venv`. + +**2. Clone and install the harness:** ```bash -# 1. Run the installer +git clone motion-harness +cd motion-harness chmod +x install.sh && ./install.sh +``` -# 2. Refresh your shell -source ~/.config/fish/config.fish # or .zshrc / .bashrc +**3. Refresh your shell** so the `motion` command is available: +```bash +source ~/.config/fish/config.fish # if you use fish +source ~/.zshrc # if you use zsh +source ~/.bashrc # if you use bash +``` -# 3. Configure your provider +**4. Configure your provider (API key):** +```bash cp config.example.yml config.yml -# Edit config.yml β€” set your API keys in .env or directly in config.yml +``` +Then open `config.yml` and set your API key. The easiest way is to create a `.env` file: +```bash +echo "OLLAMA_API_KEY=your-key-here" > .env +``` +> **No need to add models one by one.** The harness ships with a built-in catalog of Anthropic, OpenAI, and Ollama Cloud models. Just add the API key and they're all available. -# 4. Launch +**5. Launch:** +```bash motion ``` @@ -82,41 +101,91 @@ When a complex task is solved, the harness doesn't just forget. It analyzes the ### 🎨 Pro-Grade TUI A high-performance terminal interface built with `Textual`, designed for daily-driver clarity rather than an engineering dashboard. -**6-Tab Workspace**: Chat, Tasks, Skills, Knowledge, Memory, Settings β€” tab headers are the canonical navigation (no duplicate button bars). +**Focused single-chat view (opencode-style)**: no top tab bar. The screen is a top bar, the conversation canvas, a compact bottom composer, and a right-hand **Context panel**. Skills, settings, and model switching are all reachable via the command palette. + +**Workspace regions**: +- **Conversation canvas** β€” markdown-first message cards with author/time headers and compact metadata; response code blocks carry theme-aware syntax highlighting. +- **Right Context panel** β€” the rolling session context and most recent turns, so you always see what the model is grounded against (`Ctrl+B` to toggle). +- **Composer** β€” a compact, opencode-style prompt: auto-growing (soft-wraps instead of scrolling), a thin left accent border colored by agent mode, prompt history (↑/↓), and an inline `agent Β· model Β· provider` meta row. Enter sends, Shift+Enter adds a newline. -**Chat workspace regions**: -- **Conversation canvas** β€” dominant ~70–75% width, markdown-first message cards with author/time headers and compact metadata. -- **Interaction trace side panel** β€” progressive disclosure: collapsed by default with a summary chip (`trace Β· N events Β· last stage`); expand with `F8` or by clicking the chip. -- **Composer / action bar** β€” grouped primary actions (Trace, Copy, Stats) and secondary actions (Save Skill) with a single-line session metrics strip. +**Agent mode colors**: `build` is **blue**, `plan` is **orange** (matches opencode). -**Theme token model**: semantic tokens (`$background`, `$surface`, `$panel`, `$border`, `$primary`, `$accent`, `$text`, `$text-muted`, `$success`, `$warning`, `$error`) cascade through every widget via Textual's theme system. One emphasized border per visual region (chat canvas keeps `$primary`; trace, tasks, skills, KB, memory, settings use `$border`). +**Grounded responses**: on every turn the harness passes the prior conversation (user + assistant) as history and the rolling session context as a memory-recall query, so the model references what was actually said instead of hallucinating. -**4 Native Themes**: One Dark, Solarized Light, Nord, Dracula β€” cycle with `Ctrl+T`. +**Theme token model**: semantic tokens (`$background`, `$surface`, `$panel`, `$border`, `$primary`, `$secondary`, `$accent`, `$text`, `$text-muted`, `$success`, `$warning`, `$error`) cascade through every widget via Textual's theme system. -**Live task monitoring**: real-time status of parallel workers with β³βš™οΈβœ…βŒ indicators and a global activity rail (`Ctrl+B` to toggle). +**6 Native Themes**: OpenCode (default), One Dark, Solarized Light, Nord, Dracula, Omni Dark β€” cycle with `Ctrl+T`. **Keyboard shortcuts**: | Key | Action | | :-- | :-- | -| `Ctrl+1..6` / `Alt+1..6` / `F1..F6` | Switch tab (Chat, Tasks, Skills, KB, Memory, Settings) | -| `Ctrl+]` / `Ctrl+[` / `Ctrl+←→` | Next / previous tab | | `Ctrl+T` | Cycle theme | -| `Ctrl+B` | Toggle activity rail | +| `Ctrl+B` | Toggle context panel | +| `Ctrl+O` | Switch model (provider β†’ model) | +| `Ctrl+K` | Command palette (all commands) | +| `Ctrl+E` | Open external editor for the message | | `F8` / `Ctrl+Shift+T` | Toggle interaction trace panel | | `F9` / `Ctrl+Shift+C` | Copy last assistant response | +| `Tab` | Toggle agent (build / plan) | | `?` | Show shortcuts overlay (generated from live bindings) | | `Enter` (chat input) | Send message | +| `Shift+Enter` (chat input) | New line | +| `↑` / `↓` (chat input) | Prompt history | | `/skill save ` | Save last reply as a skill | -| `Ctrl+C` | Cancel current request (does not quit) | -| `Ctrl+Q` | Quit | +| `Ctrl+C` / `Ctrl+X` | Cancel current request (does not quit) | +| `Ctrl+Q` | Quit (kills the process) | **Dashboard integration**: one-click open to the admin dashboard at `https://localhost:7860/`. ### ⚠️ Known Limitations (v2 TUI) - Trace persistence is per-session (not yet written to disk). - Theme contrast validation is manual; the bundled themes are tuned for readability but very-low-contrast combinations are not auto-corrected. -- Shortcut help overlay (`?`) reflects MainScreen + ChatPane bindings; pane-local bindings in Tasks/Skills/KB/Memory/Settings are not yet enumerated. +- Shortcut help overlay (`?`) reflects MainScreen + ChatPane bindings; the Tasks/Skills/KB/Memory/Settings panes are defined but not mounted in the current focused-chat layout. - Clipboard copy falls back to inserting the response into the input box when the terminal lacks clipboard support. +- File/document ingestion (image / PDF / DOCX / XLSX) is on the roadmap β€” see [Roadmap](docs/roadmap.md). + +--- + +## πŸ—ΊοΈ Roadmap + +```mermaid +%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#fab283', 'primaryBorderColor': '#484848', 'primaryTextColor': '#eeeeee', 'lineColor': '#5c9cf5' }}}%% +flowchart LR + subgraph P1[Phase 1 β€” Core Chat UX] + direction TB + A[opencode-style prompt panel] --> B[Agent mode colors: build=blue, plan=orange] + B --> C[Ctrl+K palette Β· Ctrl+O model] + C --> D[Right-hand Context panel] + D --> E[Drop top tabs] + E --> F[Grounded responses via history + context_query] + end + + subgraph P2[Phase 2 β€” File Ingestion] + direction TB + G[Images β†’ base64 vision parts] --> H[Capability gating] + H --> I[PDF as own modality] + I --> J[DOC/DOCX β†’ text extraction β†’ memory] + J --> K[XLSX β†’ sheets β†’ memory] + K --> L[Unified /attach pipeline + graceful errors] + end + + subgraph P3[Phase 3 β€” Providers & Models] + direction TB + M[Multimodal payloads in providers] --> N[Per-model capability manifest] + N --> O[OCR fallback for scanned pages] + end + + subgraph P4[Phase 4 β€” Memory & Orchestration] + direction TB + P[Document-level memory namespaces] --> Q[Auto-compact context] + Q --> R[Persistent multi-session context] + R --> S[Attachment-aware parallel orchestration] + end + + P1 --> P2 --> P3 --> P4 +``` + +Detailed tracking lives in [docs/roadmap.md](docs/roadmap.md). --- @@ -151,11 +220,11 @@ pytest tests/test_integration.py # Parse/import sanity python -c "from ui import tui; print('Import OK')" -# Headless TUI smoke: compose MainScreen, tab nav, F8 trace toggle, ? overlay +# Headless TUI smoke: compose MainScreen, Ctrl+K palette, F8 trace toggle, ? overlay python - <<'PY' import asyncio, sys from textual.app import App -from ui.tui import MainScreen, AppState +from ui.tui import MainScreen, AppState, CommandPalette from ui.themes import ThemeRegistry class SmokeApp(App): pass @@ -166,17 +235,18 @@ async def run(): async with app.run_test() as pilot: app.push_screen(MainScreen(AppState())) await pilot.pause() - await pilot.press("ctrl+2"); await pilot.pause() - await pilot.press("ctrl+1"); await pilot.pause() - await pilot.press("f8"); await pilot.pause() + await pilot.press("ctrl+k"); await pilot.pause() # open command palette + assert isinstance(app.screen, CommandPalette) + await pilot.press("escape"); await pilot.pause() # close palette + await pilot.press("f8"); await pilot.pause() # toggle trace await pilot.press("f8"); await pilot.pause() - await pilot.press("question_sign"); await pilot.pause() + await pilot.press("question_sign"); await pilot.pause() # shortcuts overlay await pilot.press("escape"); await pilot.pause() sys.stderr.write("SMOKE OK\n") asyncio.run(run()) PY ``` -Checks cover: MainScreen compose, tab navigation (`Ctrl+1`/`Ctrl+2`), trace disclosure toggle (`F8`), and the shortcuts overlay (`?`/`Escape`). +Checks cover: MainScreen compose, the `Ctrl+K` command palette, trace disclosure toggle (`F8`), and the shortcuts overlay (`?`/`Escape`). For more details on our versioning and changelog, see [RELEASES.md](RELEASES.md). diff --git a/core/catalog.py b/core/catalog.py new file mode 100644 index 0000000..0da4417 --- /dev/null +++ b/core/catalog.py @@ -0,0 +1,202 @@ +"""Built-in provider/model catalog. + +Mirrors opencode's approach: ship a pre-configured catalog of providers and +models so users only need to add API keys (or point at a local endpoint), +instead of configuring every model by hand. + +The catalog is merged with the user's ``config.yml``: user-defined providers +override catalog entries with the same id, and catalog providers are always +available as a fallback. +""" + +from typing import Any, Dict, List, Optional + +import httpx +import re + +from core.providers import LocalProvider, ModelConfig + +# ── Built-in catalog ───────────────────────────────────────────────────────── +# Each provider: id -> {name, endpoint, provider_type, models: {model: opts}} +# ``api_key`` is intentionally omitted β€” it comes from config.yml or env vars. + +BUILTIN_CATALOG: Dict[str, Dict[str, Any]] = { + "ollama-cloud": { + "name": "Ollama Cloud", + "endpoint": "https://ollama.com/v1", + "provider_type": "cloud", + "default_model": "deepseek-v4-flash", + "models": { + "deepseek-v4-flash": {"temperature": 0.7, "max_tokens": 4096}, + "qwen3-coder:480b": {"temperature": 0.5, "max_tokens": 8192}, + "nematron-3-super": {"temperature": 0.7, "max_tokens": 4096}, + "glm-5.2": {"temperature": 0.7, "max_tokens": 4096}, + "gemma4:31b": {"temperature": 0.7, "max_tokens": 4096}, + "qwen3.5:397b": {"temperature": 0.7, "max_tokens": 4096}, + "glm-5.1": {"temperature": 0.7, "max_tokens": 4096}, + "minimax-m2.7": {"temperature": 0.7, "max_tokens": 4096}, + }, + }, + "claude": { + "name": "Claude (Anthropic)", + "endpoint": "https://api.anthropic.com", + "provider_type": "cloud", + "default_model": "claude-opus-5", + "models": { + "claude-opus-5": {"temperature": 0.7, "max_tokens": 128000}, + "claude-sonnet-5": {"temperature": 0.7, "max_tokens": 128000}, + "claude-haiku-4-5": {"temperature": 0.7, "max_tokens": 64000}, + "claude-fable-5": {"temperature": 0.7, "max_tokens": 128000}, + "claude-opus-4-8": {"temperature": 0.7, "max_tokens": 128000}, + "claude-opus-4-7": {"temperature": 0.7, "max_tokens": 128000}, + "claude-opus-4-6": {"temperature": 0.7, "max_tokens": 128000}, + "claude-sonnet-4-6": {"temperature": 0.7, "max_tokens": 128000}, + "claude-sonnet-4-5": {"temperature": 0.7, "max_tokens": 64000}, + "claude-opus-4-5": {"temperature": 0.7, "max_tokens": 64000}, + }, + }, + "openai": { + "name": "OpenAI", + "endpoint": "https://api.openai.com/v1", + "provider_type": "cloud", + "default_model": "gpt-5.6-sol", + "models": { + "gpt-5.6-sol": {"temperature": 0.8, "max_tokens": 128000}, + "gpt-5.6-terra": {"temperature": 0.8, "max_tokens": 128000}, + "gpt-5.6-luna": {"temperature": 0.8, "max_tokens": 128000}, + "gpt-5.5": {"temperature": 0.8, "max_tokens": 128000}, + "gpt-5.4": {"temperature": 0.8, "max_tokens": 128000}, + "gpt-5.4-mini": {"temperature": 0.8, "max_tokens": 128000}, + "gpt-5.4-nano": {"temperature": 0.8, "max_tokens": 128000}, + "gpt-5.3": {"temperature": 0.8, "max_tokens": 128000}, + "gpt-5.2": {"temperature": 0.8, "max_tokens": 128000}, + "gpt-5.1": {"temperature": 0.8, "max_tokens": 128000}, + "gpt-5": {"temperature": 0.8, "max_tokens": 128000}, + "gpt-5-mini": {"temperature": 0.8, "max_tokens": 128000}, + "gpt-5-nano": {"temperature": 0.8, "max_tokens": 128000}, + "gpt-4.1": {"temperature": 0.8, "max_tokens": 32000}, + "gpt-4.1-mini": {"temperature": 0.8, "max_tokens": 32000}, + "gpt-4.1-nano": {"temperature": 0.8, "max_tokens": 32000}, + "gpt-4o": {"temperature": 0.8, "max_tokens": 16000}, + "gpt-4o-mini": {"temperature": 0.8, "max_tokens": 16000}, + "o3": {"temperature": 0.8, "max_tokens": 100000}, + "o3-mini": {"temperature": 0.8, "max_tokens": 100000}, + "o4-mini": {"temperature": 0.8, "max_tokens": 100000}, + "o1": {"temperature": 0.8, "max_tokens": 100000}, + "o1-pro": {"temperature": 0.8, "max_tokens": 100000}, + }, + }, + "local-llama": { + "name": "Llama 3 (Local)", + "endpoint": "http://localhost:11434", + "provider_type": "local", + "options": { + "model": "llama3", + "temperature": 0.6, + "embed_model": "nomic-embed-text", + }, + }, +} + + +def merge_catalog(user_providers: Dict[str, Any]) -> Dict[str, Any]: + """Merge the built-in catalog with user-defined providers. + + User providers win on id collision; catalog providers fill in anything the + user hasn't defined. The ``default`` key (if present) is preserved. + """ + merged: Dict[str, Any] = {} + # Start with the catalog. + for pid, cfg in BUILTIN_CATALOG.items(): + merged[pid] = dict(cfg) + # Overlay user providers. + for pid, cfg in (user_providers or {}).items(): + if pid == "default": + continue + if pid in merged and isinstance(cfg, dict): + # Deep-merge: user options/models override catalog defaults. + base = merged[pid] + for key, value in cfg.items(): + if isinstance(value, dict) and isinstance(base.get(key), dict): + base[key] = {**base[key], **value} + else: + base[key] = value + else: + merged[pid] = cfg + return merged + + +async def discover_local_models(provider_id: str, cfg: Dict[str, Any]) -> List[str]: + """Query a local provider for installed models (Ollama /api/tags). + + Returns the list of model names, or an empty list if the provider is not + local or the endpoint is unreachable. + """ + if cfg.get("provider_type") != "local": + return [] + endpoint = cfg.get("endpoint", "") + if not endpoint: + return [] + model_config = ModelConfig( + name=provider_id, + endpoint=endpoint, + provider_type="local", + options=cfg.get("options", {}), + ) + provider = LocalProvider(model_config) + try: + return await provider.list_models() + finally: + await provider.close() + + +# ── Ollama Cloud model scraper ──────────────────────────────────────────────── + +OLLAMA_SEARCH_URL = "https://ollama.com/search" + + +async def scrape_ollama_cloud_models() -> List[str]: + """Fetch the list of models available on Ollama Cloud. + + Scrapes the ollama.com search page and extracts model names. Returns a + list of model ids (e.g. ``deepseek-v4-flash``, ``glm-5.2``). Returns an + empty list if the fetch or parse fails. + """ + try: + async with httpx.AsyncClient(timeout=20.0, follow_redirects=True) as client: + resp = await client.get(OLLAMA_SEARCH_URL) + resp.raise_for_status() + html = resp.text + except Exception: + return [] + + # Model names appear as links to /library/ or /search/. + # Match the model name tokens in the page. + names: List[str] = [] + seen = set() + # Pattern for model links: href="/library/" or "/search/" + for m in re.finditer(r'href="/(?:library|search)/([a-z0-9][a-z0-9._-]*)"', html): + name = m.group(1) + if name not in seen: + seen.add(name) + names.append(name) + return names + + +async def update_ollama_cloud_models() -> int: + """Scrape Ollama Cloud models and merge them into the built-in catalog. + + Returns the number of models added/updated. The catalog is updated in + memory (BUILTIN_CATALOG) so the model dialog reflects the latest list. + """ + names = await scrape_ollama_cloud_models() + if not names: + return 0 + provider = BUILTIN_CATALOG.get("ollama-cloud", {}) + models = provider.setdefault("models", {}) + added = 0 + for name in names: + if name not in models: + models[name] = {"temperature": 0.7, "max_tokens": 4096} + added += 1 + return added diff --git a/core/config.py b/core/config.py index af9b3cc..9607491 100644 --- a/core/config.py +++ b/core/config.py @@ -3,6 +3,8 @@ from typing import Any, Dict, Optional from dataclasses import dataclass +from core.catalog import merge_catalog + @dataclass class AppConfig: workspace_path: str @@ -26,7 +28,13 @@ def _load_config(self) -> Dict[str, Any]: if not os.path.exists(self.config_path): return {} with open(self.config_path, 'r') as f: - return yaml.safe_load(f) or {} + data = yaml.safe_load(f) or {} + # Merge the built-in catalog so pre-configured providers/models are + # always available, with user config taking precedence. + providers = data.get("providers", {}) + merged_providers = merge_catalog(providers) + data["providers"] = merged_providers + return data def _env(self, key: str, default: Any = None) -> Any: """Resolve a value from environment variables first, then config.""" diff --git a/core/orchestrator.py b/core/orchestrator.py index 50ebce9..7b25744 100644 --- a/core/orchestrator.py +++ b/core/orchestrator.py @@ -227,6 +227,17 @@ async def on_stream_chunk(chunk: str) -> None: finally: task.end_time = datetime.now() self.active_count -= 1 + # Clean up the per-task memory DB file (created above). + try: + agent.memory.close() + except Exception: + pass + try: + db_path = f"memory_{request.task_id}.db" + if os.path.exists(db_path): + os.remove(db_path) + except Exception: + pass # Save artifact try: task.artifact_path = self._save_artifact(task) diff --git a/core/providers.py b/core/providers.py index bbf6864..209b01c 100644 --- a/core/providers.py +++ b/core/providers.py @@ -26,13 +26,17 @@ def __init__(self, config: ModelConfig): self._client = httpx.AsyncClient(timeout=120.0) @abstractmethod - async def complete(self, prompt: str, system_prompt: str = "", **kwargs) -> str: - """Generate a completion from the model.""" + async def complete(self, prompt: str, system_prompt: str = "", history: Optional[List[Dict[str, str]]] = None, **kwargs) -> str: + """Generate a completion from the model. + + ``history`` is an optional list of prior turns as + ``[{"role": "user"|"assistant", "content": "..."}, ...]``. + """ pass - async def stream_complete(self, prompt: str, system_prompt: str = "", **kwargs) -> AsyncIterator[str]: + async def stream_complete(self, prompt: str, system_prompt: str = "", history: Optional[List[Dict[str, str]]] = None, **kwargs) -> AsyncIterator[str]: """Optional streaming completion. Defaults to one-shot completion.""" - result = await self.complete(prompt, system_prompt=system_prompt, **kwargs) + result = await self.complete(prompt, system_prompt=system_prompt, history=history, **kwargs) if result: yield result @@ -43,7 +47,7 @@ async def close(self): class LocalProvider(BaseProvider): """Provider for local LLMs via Ollama-compatible /api/chat endpoint.""" - async def complete(self, prompt: str, system_prompt: str = "", **kwargs) -> str: + async def complete(self, prompt: str, system_prompt: str = "", history: Optional[List[Dict[str, str]]] = None, **kwargs) -> str: url = f"{self.config.endpoint.rstrip('/')}/api/chat" model = self.config.options.get("model", self.config.name.lower()) payload = { @@ -54,6 +58,8 @@ async def complete(self, prompt: str, system_prompt: str = "", **kwargs) -> str: } if system_prompt: payload["messages"].append({"role": "system", "content": system_prompt}) + if history: + payload["messages"].extend(history) payload["messages"].append({"role": "user", "content": prompt}) if "temperature" in self.config.options: @@ -66,7 +72,7 @@ async def complete(self, prompt: str, system_prompt: str = "", **kwargs) -> str: data = resp.json() return data.get("message", {}).get("content", "") - async def stream_complete(self, prompt: str, system_prompt: str = "", **kwargs) -> AsyncIterator[str]: + async def stream_complete(self, prompt: str, system_prompt: str = "", history: Optional[List[Dict[str, str]]] = None, **kwargs) -> AsyncIterator[str]: url = f"{self.config.endpoint.rstrip('/')}/api/chat" model = self.config.options.get("model", self.config.name.lower()) payload = { @@ -77,6 +83,8 @@ async def stream_complete(self, prompt: str, system_prompt: str = "", **kwargs) } if system_prompt: payload["messages"].append({"role": "system", "content": system_prompt}) + if history: + payload["messages"].extend(history) payload["messages"].append({"role": "user", "content": prompt}) if "temperature" in self.config.options: @@ -105,27 +113,47 @@ async def embed(self, text: str) -> List[float]: resp.raise_for_status() return resp.json().get("embedding", []) + async def list_models(self) -> List[str]: + """Discover installed models via Ollama /api/tags. + + Returns a list of model names (e.g. ``llama3:latest``). Falls back to + the configured model if the endpoint is unreachable or not Ollama. + """ + url = f"{self.config.endpoint.rstrip('/')}/api/tags" + try: + resp = await self._client.get(url) + resp.raise_for_status() + data = resp.json() + models = [m.get("name", "") for m in data.get("models", [])] + models = [m for m in models if m] + if models: + return models + except Exception: + pass + configured = self.config.options.get("model") + return [configured] if configured else [] + class CloudProvider(BaseProvider): """Provider for cloud LLMs (Anthropic, OpenAI) using their native chat APIs.""" - async def complete(self, prompt: str, system_prompt: str = "", **kwargs) -> str: + async def complete(self, prompt: str, system_prompt: str = "", history: Optional[List[Dict[str, str]]] = None, **kwargs) -> str: endpoint = self.config.endpoint api_key = self.config.api_key or os.environ.get("OLLAMA_API_KEY") or os.environ.get("ANTHROPIC_API_KEY") or os.environ.get("OPENAI_API_KEY", "") if "anthropic" in endpoint: - return await self._anthropic_complete(prompt, system_prompt, api_key) + return await self._anthropic_complete(prompt, system_prompt, api_key, history) elif "openai" in endpoint: - return await self._openai_complete(prompt, system_prompt, api_key) + return await self._openai_complete(prompt, system_prompt, api_key, history) else: - return await self._openai_complete(prompt, system_prompt, api_key) + return await self._openai_complete(prompt, system_prompt, api_key, history) - async def stream_complete(self, prompt: str, system_prompt: str = "", **kwargs) -> AsyncIterator[str]: + async def stream_complete(self, prompt: str, system_prompt: str = "", history: Optional[List[Dict[str, str]]] = None, **kwargs) -> AsyncIterator[str]: endpoint = self.config.endpoint api_key = self.config.api_key or os.environ.get("OLLAMA_API_KEY") or os.environ.get("ANTHROPIC_API_KEY") or os.environ.get("OPENAI_API_KEY", "") if "anthropic" in endpoint: - async for chunk in super().stream_complete(prompt, system_prompt=system_prompt, **kwargs): + async for chunk in super().stream_complete(prompt, system_prompt=system_prompt, history=history, **kwargs): yield chunk return @@ -140,6 +168,8 @@ async def stream_complete(self, prompt: str, system_prompt: str = "", **kwargs) messages = [] if system_prompt: messages.append({"role": "system", "content": system_prompt}) + if history: + messages.extend(history) messages.append({"role": "user", "content": prompt}) payload = { "model": model, @@ -166,7 +196,7 @@ async def stream_complete(self, prompt: str, system_prompt: str = "", **kwargs) if chunk: yield chunk - async def _anthropic_complete(self, prompt: str, system_prompt: str, api_key: str) -> str: + async def _anthropic_complete(self, prompt: str, system_prompt: str, api_key: str, history: Optional[List[Dict[str, str]]] = None) -> str: url = "https://api.anthropic.com/v1/messages" model = self.config.options.get("model", "claude-3-5-sonnet-20241022") max_tokens = self.config.options.get("max_tokens", 4096) @@ -176,11 +206,13 @@ async def _anthropic_complete(self, prompt: str, system_prompt: str, api_key: st "anthropic-version": "2023-06-01", "content-type": "application/json", } + messages = list(history) if history else [] + messages.append({"role": "user", "content": prompt}) payload = { "model": model, "max_tokens": max_tokens, "temperature": temperature, - "messages": [{"role": "user", "content": prompt}], + "messages": messages, } if system_prompt: payload["system"] = system_prompt @@ -190,7 +222,7 @@ async def _anthropic_complete(self, prompt: str, system_prompt: str, api_key: st data = resp.json() return data.get("content", [{}])[0].get("text", "") - async def _openai_complete(self, prompt: str, system_prompt: str, api_key: str) -> str: + async def _openai_complete(self, prompt: str, system_prompt: str, api_key: str, history: Optional[List[Dict[str, str]]] = None) -> str: url = f"{self.config.endpoint.rstrip('/')}/chat/completions" model = self.config.options.get("model", "gpt-4o") max_tokens = self.config.options.get("max_tokens", 4096) @@ -202,6 +234,8 @@ async def _openai_complete(self, prompt: str, system_prompt: str, api_key: str) messages = [] if system_prompt: messages.append({"role": "system", "content": system_prompt}) + if history: + messages.extend(history) messages.append({"role": "user", "content": prompt}) payload = { "model": model, @@ -218,7 +252,7 @@ async def _openai_complete(self, prompt: str, system_prompt: str, api_key: str) class ProxyProvider(BaseProvider): """Provider for custom proxy/gateway endpoints (OpenAI-compatible).""" - async def complete(self, prompt: str, system_prompt: str = "", **kwargs) -> str: + async def complete(self, prompt: str, system_prompt: str = "", history: Optional[List[Dict[str, str]]] = None, **kwargs) -> str: url = f"{self.config.endpoint.rstrip('/')}/chat/completions" api_key = self.config.api_key or os.environ.get("PROXY_API_KEY", "") headers = { @@ -228,6 +262,8 @@ async def complete(self, prompt: str, system_prompt: str = "", **kwargs) -> str: messages = [] if system_prompt: messages.append({"role": "system", "content": system_prompt}) + if history: + messages.extend(history) messages.append({"role": "user", "content": prompt}) payload = { "model": self.config.options.get("model", "default"), @@ -239,7 +275,7 @@ async def complete(self, prompt: str, system_prompt: str = "", **kwargs) -> str: data = resp.json() return data.get("choices", [{}])[0].get("message", {}).get("content", "") - async def stream_complete(self, prompt: str, system_prompt: str = "", **kwargs) -> AsyncIterator[str]: + async def stream_complete(self, prompt: str, system_prompt: str = "", history: Optional[List[Dict[str, str]]] = None, **kwargs) -> AsyncIterator[str]: url = f"{self.config.endpoint.rstrip('/')}/chat/completions" api_key = self.config.api_key or os.environ.get("PROXY_API_KEY", "") headers = { @@ -249,6 +285,8 @@ async def stream_complete(self, prompt: str, system_prompt: str = "", **kwargs) messages = [] if system_prompt: messages.append({"role": "system", "content": system_prompt}) + if history: + messages.extend(history) messages.append({"role": "user", "content": prompt}) payload = { "model": self.config.options.get("model", "default"), diff --git a/docs/roadmap.md b/docs/roadmap.md new file mode 100644 index 0000000..c73d583 --- /dev/null +++ b/docs/roadmap.md @@ -0,0 +1,82 @@ +# Motion Harness Roadmap + +This is the living roadmap for Motion Harness. Items are ordered roughly by +priority within each phase, not strict release order. The guiding principle is +the **Cognitive Loop** (Input β†’ Hybrid Recall β†’ Model Execution β†’ Compression β†’ +Output): every feature must keep the agent grounded in real context and cheap to +operate. + +--- + +## Phase 1 β€” Core Chat UX (done) + +- [x] opencode-style compact prompt panel (input + agent Β· model Β· provider meta) +- [x] Agent mode coloring β€” build (blue), plan (orange) +- [x] Ctrl+K command palette, Ctrl+O model dialog +- [x] Right-hand Context panel (rolling session context) replacing the activity rail +- [x] Drop top tabs; single focused chat view +- [x] Soft-wrapping, auto-growing composer (no horizontal scroll on long input) +- [x] Grounded responses β€” pass prior conversation (history) + session context + (`context_query`) to the model on every turn to reduce hallucination +- [x] Remove "Thinking…" placeholder from the response area +- [x] Full theme-aware response rendering (code syntax colors follow theme) + +## Phase 2 β€” Document & File Ingestion (next) + +Adopts the opencode model of **base64 data-URL content parts** with **capability +gating**, rather than blind OCR/text extraction. The model either reads the file +natively or the harness says it can't and tells the user why. + +**Goal:** drop a file (image / PDF / DOCX / XLSX) and the agent understands it, +without hallucinating or faking content. + +- [ ] **Image support (vision)** + - [ ] Convert attached images to base64 `data:;base64,...` content parts + - [ ] Detect a vision-capable model (`capabilities.input.image`) + - [ ] If unsupported, degrade gracefully: replace with + `ERROR: Cannot read image (this model does not support image input)` + - [ ] Empty / corrupt image guard before sending +- [ ] **PDF support** + - [ ] Treat `application/pdf` as its own modality (`pdf`) + - [ ] Pass natively to models that accept PDFs; capability-gate otherwise +- [ ] **DOC / DOCX support** + - [ ] Text extraction via `python-docx` (paragraphs + tables) when the model + cannot ingest DOCX natively + - [ ] Chunk + embed extracted text into `MemoryDB` for Hybrid Recall +- [ ] **XLSX (Excel) support** + - [ ] Sheet β†’ CSV-like text via `openpyxl` + - [ ] Chunk + embed into `MemoryDB` for Hybrid Recall +- [ ] **Unified attachment pipeline** + - [ ] `/attach ` (or drag-in) in the composer + - [ ] Route by MIME: image β†’ vision part; pdf β†’ pdf part; doc/docx/xlsx β†’ text + extraction β†’ memory + - [ ] Capability gating mirrors opencode (`mimeToModality` + `input[modality]`) + - [ ] Graceful error messaging that informs the user (never silently drops) + +## Phase 3 β€” Provider & Model Enhancements + +- [ ] Multimodal payload support in `core/providers.py` (image/pdf content parts) +- [ ] Per-model capability manifest (`input.image`, `input.pdf`, …) +- [ ] Model switching preserves attachments (re-attach on provider change) +- [ ] Optional vision-model fallback path for non-vision models (OCR for scanned + pages via `pytesseract`) + +## Phase 4 β€” Memory & Orchestration + +- [ ] Document-level memory (per-file retrieval namespaces) +- [ ] Auto-compact conversation context under configurable token thresholds +- [ ] Persistent multi-session context across restarts +- [ ] Parallel orchestration with attachment-aware task scheduling + +--- + +## Notes + +- The **opencode reference** for this approach is `anomalyco/opencode`: + - `packages/opencode/src/provider/transform.ts` β€” `mimeToModality()`, + `unsupportedParts()` (capability gating + empty-image guard) + - `packages/opencode/src/acp/content.ts` β€” `filePartToContentChunks()` + + `decodeDataUrl()` (base64 data-URL decoding) + - `packages/opencode/src/tool/code-mode.ts` β€” `dataUrl()` helper +- Principle: **never pretend to read a file.** If the active model can't ingest a + modality, surface a clear message and inform the user. diff --git a/docs/ui-variants/a1-soft-cards.svg b/docs/ui-variants/a1-soft-cards.svg new file mode 100644 index 0000000..07712e5 --- /dev/null +++ b/docs/ui-variants/a1-soft-cards.svg @@ -0,0 +1,26 @@ + + + + A1 β€” Soft Cards + + + + + + + + + + + + + + + + + + + + + Soft contrast cards + thin role rule + muted framing + diff --git a/docs/ui-variants/a1-soft-cards.svg.png b/docs/ui-variants/a1-soft-cards.svg.png new file mode 100644 index 0000000000000000000000000000000000000000..a180245ed39e29b826ec99f1056d08d97824bfd1 GIT binary patch literal 77185 zcmeFa1z42Z-Y5kh1pC)g&JFa%tC(|_+VMNLaX2+y5D^?-~?bFeQ6Dyr7R$%4DaZ9smx0 z=-}YLVc>w`2dw_P8u`B|O>Vq<6147ReHdsOwz|Tj?fl&3sMZ36BSkbEGc?lZ1v6ve6})ioX-= zpHHni{yqZdOv(mjV$rFiaKRKkA>&8WXQ0#}QJWg^W$k&fAM2m6z>h;IZO>9CJZef$ ze%3ECnBKfD!3qI5Uu3=0%;z{rWlVAQG)|`^q-N+Jqbcbt~y?4B|MobCnp`@`fMSb?=LGr8XKZFaGY;4zbV^a z_(E|KzmdR+)OU?mfFLF~?A|HZCZu+Poxg?4f_Qg!%nb?!uoYkt+Z>-0LbAZSvoM^< zj}c2pAb1efMnZ&8MqgzN`UUx4U5|*5o;Zdd^&8otXr{~y!@1^8>x_Vc^3F#9<%cJi zAel+F$P?$xip~fwB$OYBiT)KLo_#<{lFQyXj6e3E@dz0i+1;tIWag0Cdc?DfDp&37 z?3@-u;!fP2E#W(-kZ14PbYbUNamR0`>N4DBa*_3&>r!`daVhKe>Gb}TvT46QNX|<>)saG% zF%z1ngI3ua2FIa9ClpwE;-;j2H%0u>y?C!Ur zt6gza3Stt=acCw5_{`P2)d36%irkY^!i&R0LORFw;}jALcNnb62pKcaYE>pmY(&n7 za3MuvCXGkBTXp9P=L7fFzfvU2gbVZOx1&C#!!gmW4o1O!#l~3|f5?Y@6Y{$Kw zHQwC5O5x8R@;JAb;3dWtM81BrDr#!sF=3Xk?dVysiBM@V;O*60R>Yk#%ehq5Vp|m< z3Peo1&B&+D=a3k7_{xzlG7>eyJ+?7^LfY$_lrjcs^KW_GE=4X*rWodb{*rco)T8Sg zVUu%XM%kAH>5-?oX*Im7$coss*A^CPx#JK0%Tsg;p15@m-A2yl@%C|TuP+3qkgDmq z%daop%VAFliz@#@$V4A|e=(%|8vC;y(VM;Os-k~Y0{>8}S!ZB4oR_TwX+0|@0*^|p z$J=0H9Oc)KFYt~o$wkjjhQYTlL_2r*FFJN^uP#(G(RPPieeY989lpm=xTQ14;1Rjw zIMtCnNRG^9b;I8lG?BZzyR$TMR{9&&g^gO-b@n-`xvf)nYWuYoj)w1T zR~zwJ zT(&tgD=66r86GH^-iu-2lZu>vAMC^Ek{e$)H8mwwQ}?;Mdlg?m)Nz({g{*erCTl;- zQs+dPH~BM()MAe&5xSKXdxH+DREAUZr&3;X>=h3zw@P}v9NKbwu>Kr5oSW;)Oj1}) zDQepgCfv}Oq>&-HT)YDtUQ&E%fYhvCGt`+E}az@NJW_4l*c!L378k6rXY;OW@>un^8Gq&D&C)?1+h^Z0 ztUw&MQ@?kViE#nO{rD%n z4bAm&Bc`Squ0ef#huX9Ok$PKzxA$GV?Zjzc{QNF?u}}r&X@k(WwGY&6m&+c= znea`*o*C`!sCfqjh&3*J+Ffc1G?cNv z;gE6Ys4&d&I{lHwj+~-P6FC{H#PFeO7t)@tS(|>pn9nu~pBzspdmFw}tve_q*3sKb z9~*Yg61h;Kdt6UJQ=h}3tD2`l_u{6+25ohgexva4^0rPkHbihJl@bNvy;>d3T)#TC zz)l}tu$)tS{I>06%oNg2YP}~sCcKA28wRc?u@PcV2pp0ME=uQ-Ko`{IZ`3?wvQoOvbddD<-|*GnG?x+ zB@#(m1s)Fs?pkzKv|gIA|8m^%oJP7~1$C#c%6g_g3lIJ9)#$I&gIVN0fG@sS!mEPJ z8lqT&3EH*NO{#GgisoF^gx8{%R!=2gkhbsAS=jt$WWcA-aah+@x{YN?^QdulZXhDL|_#w zNH$_w;=FJ>EJ>9%;Jm%@6-QQ3`UI}mt8VRRMwkH&GygLgwFuV!b-4@mJy3C~ zE16-4ewqt&Uf4qKNNk0a>~ZOB={vYT&7FHvhm5{axe~cu&e|1Vp*9lU@KOj<(wjJQ zVr<`7kf8Va$V#PUf!}u$rIemyq2@&u;LYn+@=ED zujW0tc9q`#eq)}APontD2Nt|g;ci3Wv?tW)MIWuQtF*fo8yM*boty@RZd&Un;f?? ztx{H^x41eVGv|JByOSLr84j&WZTMfZT`R5Rx8q2>q4-Op?f!=vGDACcH3 zJ>nsVBZ$>i#07Y4B(!INu}ZTYem5A-Qv5zJfsE0$_j8_s;Hu658f|;+gf;Oy;TWZD zxt;K$?ZWv=UL=pU(>J;*otMLDR~3KJ@i5~>oyIqhS=*`t?V1T zIDQH6Ayr$d&}X$}v*cp);k}$81e$qNd-)4}b8hfndyGzkBSx3phsm}&-AGO*373ji zuSw6^c>VPWU-5_=?E)GnPn}hOiSX3nKd4i7mm&O)i1D-OE0WwC-nZ)^+ z8`t9WhD@L9ZEuHf6e#B~B;s!RsO|PW6;so;8|)3A)gUyIJ}ZCLZ^~VJyGqDQI9Xl0 zW;1t~k#2Hot#M4Y&^cv#rj zV8g@Rok_J~&1UC?H{UFxD|Q)EwcS?)2A|Rv*%X#{?X0o0h%U-$ixs7&!nJKH1Irk4 z(9h|dgOLIEutWp+?|9NMJry7Hrk)(ZUz9;sv<{VFHdqyg?MxPF$ANiKa&Xi>C(aYa zSfZq8;fFM0DtQs>*V0nxN;wtz-Xck4D2i#pq%k_c@Y}S&ps#=rdx9k+o&NbyJ>a(P z4i=W|zz12FcAK{Q?oPD4&FciFzUE$F)^lXxtIy08_GcE?p4rO_%xINZjg(C-jWxWy zy)=Y}F^OGyZPQH>8@G&(emL3vIUy}eN8hNZsOWCrdz094wvD^$V!X(TrtvAkGb}1> zT%r!sHN`>(vb1vAZadCRaDgqVxS4FNJ$kExnWn+cl46nVi9qD3&os4$_M+HA_)-v7 z)G+#=>~rZIR-nI$-X>To4~gBbpxo;2*0f6%6%mot<`?G~Nv@AB1@^r>)njF9x=Dt2 z%Sk=&e#!h=Ek{_0LU$`XQDW`VAW~v0FU@|cqxTstcX!6FjCPvG>vW^K*r_4sg>Fq^ zL`Slg&_k2{ZFh3SP))Q@$>^RJh@(8N#Do+@Tpv$&n5n_UB+Z^M9SvuwJp~&MO-bvJ&M>Z)5rE4Z1XWmQ_OGWl2yy@S}7V=>U)V?_CYClS# zAH66pxHuqNYIz6t#?k8QU*hL{l5ZF!D-feg;^Yl{wrFIU&bLf!aF>yH7H zXZ5zaJ7wIy72hw}k$$W=6?_x#(^2ivte9z%op04Lfxa9XgrO7C2|cbu*VrHPA}6@E zmigJ^wuSPhfaguEyT(iVSZnWrg_YiJl`5?SQ?X#k$^Ns`=x?n?4KGE7#Fhu740Oe; zi3b(6O?SRB?VZ`8k||Eov_}YUMkJKivcp-EBp%qO?0S*VdSfKk+U7%fX^X9{&Fa%( zJCiyBNBMDMQ=Bg6?Y#o@u2pYAl5DY)Ub>;}suSSPl$#g&ANCC29x8o7kniXam}}fI z-Nm9?&0FMiD2SRXOfffY<7+6FUFYiZ@?+td+n27>*D43x-#bM9IQOuOtE<-PsznDq z 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 + + + A2 β€” Flat Transcript + + + + + + + + + + + + + + + + + + + + + + + + Transcript-first flow + minimal card treatment + ultra-quiet controls + diff --git a/docs/ui-variants/a2-flat-transcript.svg.png b/docs/ui-variants/a2-flat-transcript.svg.png new file mode 100644 index 0000000000000000000000000000000000000000..9bdd0e986fa50e81e62849368888b48f0be2c18b GIT binary patch literal 81547 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 literal 0 HcmV?d00001 diff --git a/docs/ui-variants/a3-quiet-ops.svg b/docs/ui-variants/a3-quiet-ops.svg new file mode 100644 index 0000000..8e996dd --- /dev/null +++ b/docs/ui-variants/a3-quiet-ops.svg @@ -0,0 +1,37 @@ + + + + A3 β€” Quiet Ops + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Calm base + stronger operational side-context (trace + activity) + diff --git a/docs/ui-variants/a3-quiet-ops.svg.png b/docs/ui-variants/a3-quiet-ops.svg.png new file mode 100644 index 0000000000000000000000000000000000000000..c54877b79de5fe77a3841b5ff0531067a46d6d26 GIT binary patch literal 84916 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 LuU4XB_4GdggAJGW literal 0 HcmV?d00001 diff --git a/docs/ui-variants/r1-balanced-rounded.svg b/docs/ui-variants/r1-balanced-rounded.svg new file mode 100644 index 0000000..9416e6b --- /dev/null +++ b/docs/ui-variants/r1-balanced-rounded.svg @@ -0,0 +1,29 @@ + + + + R1 β€” Balanced Rounded + + + + + + + + + + + + + + + + + + + + + + + + Medium radius, clean bubbles, minimal separators + diff --git a/docs/ui-variants/r1-balanced-rounded.svg.png b/docs/ui-variants/r1-balanced-rounded.svg.png new file mode 100644 index 0000000000000000000000000000000000000000..0c4c34711f8059b84f42fc2607deeafdc40b39ed GIT binary patch literal 77019 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

)po&lz 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 literal 0 HcmV?d00001 diff --git a/docs/ui-variants/r2-soft-rounded.svg b/docs/ui-variants/r2-soft-rounded.svg new file mode 100644 index 0000000..8e172db --- /dev/null +++ b/docs/ui-variants/r2-soft-rounded.svg @@ -0,0 +1,28 @@ + + + + R2 β€” Soft Rounded + + + + + + + + + + + + + + + + + + + + + + + Large radius, soft grouping, almost no hard lines + diff --git a/docs/ui-variants/r2-soft-rounded.svg.png b/docs/ui-variants/r2-soft-rounded.svg.png new file mode 100644 index 0000000000000000000000000000000000000000..b163b03791264944b617b7b033fc5668b7cae1e5 GIT binary patch literal 78656 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

UL_D8b!1(~Z3$ijsVbe@Tc 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

-`r9@!HC)LI(B>lNm}iXCLC&fWXFh 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 + + + R3 β€” Ops Rounded + + + + + + + + + + + + + + + + + + + + + + + + + + + + Rounded bubbles + stronger ops context without line overload + diff --git a/docs/ui-variants/r3-ops-rounded.svg.png b/docs/ui-variants/r3-ops-rounded.svg.png new file mode 100644 index 0000000000000000000000000000000000000000..d46ff94d84db7d6a2815c437b67130e434b01370 GIT binary patch literal 79130 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 E0Sk$A+yDRo literal 0 HcmV?d00001 diff --git a/main.py b/main.py index 6a8ed88..ecd5727 100644 --- a/main.py +++ b/main.py @@ -9,6 +9,7 @@ import hashlib import logging import os +from typing import Optional logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(name)s: %(message)s") logger = logging.getLogger(__name__) @@ -41,7 +42,7 @@ async def get_embedding(self, text: str): norm = sum(v * v for v in vec) ** 0.5 or 1.0 return [v / norm for v in vec] - async def run(self, prompt: str, target: str = "user", on_stream_chunk=None, on_trace_event=None): + async def run(self, prompt: str, target: str = "user", on_stream_chunk=None, on_trace_event=None, history: Optional[list] = None, context_query: Optional[str] = None): async def emit_trace(stage: str, message: str, **extra): if not on_trace_event: return @@ -58,6 +59,18 @@ async def emit_trace(stage: str, message: str, **extra): # 1. Memory Recall await emit_trace("memory_recall_start", "Running retriever.retrieve") context_chunks = await self.retriever.retrieve(prompt) + # Augment recall with the session context query so we don't repeat ourselves. + if context_query: + context_chunks += await self.retriever.retrieve(context_query) + # De-duplicate by content, keep order. + seen = set() + deduped = [] + for c in context_chunks: + key = c["content"] + if key not in seen: + seen.add(key) + deduped.append(c) + context_chunks = deduped[:5] await emit_trace("memory_recall_done", "Memory recall complete", chunks=len(context_chunks)) context_text = "\n".join([c["content"] for c in context_chunks]) @@ -75,7 +88,7 @@ async def emit_trace(stage: str, message: str, **extra): ) if on_stream_chunk: raw_chunks = [] - async for chunk in self.provider.stream_complete(prompt, system_prompt=system_prompt): + async for chunk in self.provider.stream_complete(prompt, system_prompt=system_prompt, history=history): stream_chunk_count += 1 raw_chunks.append(chunk) await emit_trace("stream_chunk", "Received stream chunk", chunk_index=stream_chunk_count, chars=len(chunk or "")) @@ -88,7 +101,7 @@ async def emit_trace(stage: str, message: str, **extra): raw_response = "".join(raw_chunks) await emit_trace("model_done", "Streaming completion finished", stream_chunks=stream_chunk_count, chars=len(raw_response)) else: - raw_response = await self.provider.complete(prompt, system_prompt=system_prompt) + raw_response = await self.provider.complete(prompt, system_prompt=system_prompt, history=history) await emit_trace("model_done", "One-shot completion finished", chars=len(raw_response or "")) # 4. Caveman Compression @@ -115,9 +128,6 @@ async def emit_trace(stage: str, message: str, **extra): except Exception as e: logger.debug(f"Skill synthesis skipped: {e}") await emit_trace("skill_synthesis_error", f"Skill synthesis error: {e}") - else: - await emit_trace("skill_synthesis_done", "Skill synthesis disabled (manual mode)") - return final_response def load_agent_from_config(config_path: str = "", provider_id: str | None = None) -> MotionAgent: @@ -250,6 +260,11 @@ async def interactive_chat(provider_id: str | None = None): config = ConfigManager() provider_id = args.provider or config.get_default_provider() provider_cfg = config.get_provider_config(provider_id) + # Normalize to full provider/model id so the TUI dropdown matches. + if "/" not in provider_id: + model = provider_cfg.get("options", {}).get("model") + if model: + provider_id = f"{provider_id}/{model}" model_config = ModelConfig( name=provider_cfg.get("name", provider_id), endpoint=provider_cfg["endpoint"], diff --git a/tests/test_catalog.py b/tests/test_catalog.py new file mode 100644 index 0000000..4731a92 --- /dev/null +++ b/tests/test_catalog.py @@ -0,0 +1,72 @@ +"""Tests for the built-in provider/model catalog.""" +from core.catalog import BUILTIN_CATALOG, merge_catalog + + +def test_catalog_has_expected_providers(): + assert "ollama-cloud" in BUILTIN_CATALOG + assert "claude" in BUILTIN_CATALOG + assert "openai" in BUILTIN_CATALOG + assert "local-llama" in BUILTIN_CATALOG + + +def test_catalog_ollama_has_models(): + models = BUILTIN_CATALOG["ollama-cloud"]["models"] + assert "deepseek-v4-flash" in models + assert "qwen3-coder:480b" in models + + +def test_catalog_claude_has_many_models(): + models = BUILTIN_CATALOG["claude"]["models"] + assert "claude-opus-5" in models + assert "claude-sonnet-5" in models + assert "claude-haiku-4-5" in models + assert len(models) >= 8 + + +def test_catalog_openai_has_many_models(): + models = BUILTIN_CATALOG["openai"]["models"] + assert "gpt-5.6-sol" in models + assert "gpt-4o" in models + assert "o3" in models + assert len(models) >= 15 + + +def test_merge_catalog_fills_missing_providers(): + merged = merge_catalog({}) + # Catalog providers are present even with an empty user config. + assert "openai" in merged + assert "claude" in merged + + +def test_merge_catalog_user_overrides_catalog(): + user = { + "gpt-4o": { + "name": "My GPT", + "options": {"model": "gpt-4o-mini", "temperature": 0.1}, + } + } + merged = merge_catalog(user) + # User name wins. + assert merged["gpt-4o"]["name"] == "My GPT" + # User options override catalog defaults. + assert merged["gpt-4o"]["options"]["model"] == "gpt-4o-mini" + assert merged["gpt-4o"]["options"]["temperature"] == 0.1 + + +def test_merge_catalog_preserves_default_key(): + user = {"default": "gpt-4o"} + merged = merge_catalog(user) + # The default key is not treated as a provider. + assert "default" not in merged + + +def test_merge_catalog_deep_merges_models(): + user = { + "ollama-cloud": { + "models": {"custom-model": {"temperature": 0.3}}, + } + } + merged = merge_catalog(user) + # Catalog models preserved, user model added. + assert "deepseek-v4-flash" in merged["ollama-cloud"]["models"] + assert "custom-model" in merged["ollama-cloud"]["models"] diff --git a/tests/test_composer.py b/tests/test_composer.py new file mode 100644 index 0000000..9cd3546 --- /dev/null +++ b/tests/test_composer.py @@ -0,0 +1,93 @@ +"""Tests for the ChatComposer widget behavior. + +Covers: + - Enter posts a ComposerSubmitted message (submit) + - Ctrl+S also submits + - Up/down navigates prompt history +""" +import pytest +from rich.style import Style + +from textual.app import App, ComposeResult +from textual.message import Message + +from ui.tui import AppState, ChatComposer, ComposerSubmitted + + +class _ComposerHarness(App): + """Minimal app that hosts a ChatComposer and records submitted messages.""" + + def __init__(self): + super().__init__() + self.submitted = [] + self.state = AppState() + + def compose(self) -> ComposeResult: + yield ChatComposer(self.state, id="composer") + + def on_composer_submitted(self, event: ComposerSubmitted) -> None: + self.submitted.append(event.text) + self.state.record_prompt(event.text) + + +@pytest.mark.asyncio +async def test_enter_submits_message(): + app = _ComposerHarness() + async with app.run_test() as pilot: + composer = app.query_one("#composer", ChatComposer) + composer.focus() + composer.value = "hello world" + composer.cursor_position = len(composer.value) + await pilot.press("enter") + # The message should have been posted with the composer text. + assert app.submitted == ["hello world"] + + +@pytest.mark.asyncio +async def test_ctrl_s_submits_message(): + app = _ComposerHarness() + async with app.run_test() as pilot: + composer = app.query_one("#composer", ChatComposer) + composer.focus() + composer.value = "send via ctrl+s" + composer.cursor_position = len(composer.value) + await pilot.press("ctrl+s") + assert app.submitted == ["send via ctrl+s"] + + +@pytest.mark.asyncio +async def test_up_down_navigates_history(): + app = _ComposerHarness() + async with app.run_test() as pilot: + composer = app.query_one("#composer", ChatComposer) + composer.focus() + composer.value = "draft" + composer.cursor_position = len(composer.value) + await pilot.press("enter") + composer.value = "" + composer.cursor_position = 0 + await pilot.press("up") + assert composer.value == "draft" + await pilot.press("down") + assert composer.value == "" + await pilot.press("down") + assert composer.value == "" + + +def test_prompt_history_records_and_navigates(): + state = AppState() + state.record_prompt("first") + state.record_prompt("second") + # Previous goes back through history. + assert state.history_previous("") == "second" + assert state.history_previous("") == "first" + # Next returns to the current draft. + assert state.history_next("") == "second" + assert state.history_next("") == "" + + +def test_prompt_history_dedupes_consecutive(): + state = AppState() + state.record_prompt("same") + state.record_prompt("same") + assert state.prompt_history == ["same"] diff --git a/tests/test_discovery.py b/tests/test_discovery.py new file mode 100644 index 0000000..4ffba25 --- /dev/null +++ b/tests/test_discovery.py @@ -0,0 +1,130 @@ +"""Tests for local model auto-discovery (Ollama /api/tags) and the +Ollama Cloud model scraper.""" +import pytest +from unittest.mock import AsyncMock, MagicMock, patch + +from core.catalog import ( + BUILTIN_CATALOG, + discover_local_models, + scrape_ollama_cloud_models, + update_ollama_cloud_models, +) +from core.providers import LocalProvider, ModelConfig + + +def _fake_tags_response(models): + resp = MagicMock() + resp.json.return_value = {"models": [{"name": m} for m in models]} + return resp + + +async def test_discover_local_models_returns_installed(): + cfg = { + "provider_type": "local", + "endpoint": "http://localhost:11434", + "options": {"model": "llama3"}, + } + fake_resp = _fake_tags_response(["llama3:latest", "qwen3:8b", "nomic-embed-text:latest"]) + + with patch("core.providers.httpx.AsyncClient") as MockClient: + client = MockClient.return_value + client.get = AsyncMock(return_value=fake_resp) + client.aclose = AsyncMock() + models = await discover_local_models("local-llama", cfg) + + assert "llama3:latest" in models + assert "qwen3:8b" in models + assert "nomic-embed-text:latest" in models + + +async def test_discover_local_models_skips_non_local(): + cfg = {"provider_type": "cloud", "endpoint": "https://api.openai.com/v1"} + models = await discover_local_models("gpt-4o", cfg) + assert models == [] + + +async def test_discover_local_models_falls_back_on_error(): + cfg = { + "provider_type": "local", + "endpoint": "http://localhost:11434", + "options": {"model": "llama3"}, + } + with patch("core.providers.httpx.AsyncClient") as MockClient: + client = MockClient.return_value + client.get.side_effect = Exception("connection refused") + client.aclose = AsyncMock() + models = await discover_local_models("local-llama", cfg) + + # Falls back to the configured model. + assert models == ["llama3"] + + +async def test_local_provider_list_models_uses_tags_endpoint(): + provider = LocalProvider(ModelConfig( + name="local-llama", + endpoint="http://localhost:11434", + provider_type="local", + options={"model": "llama3"}, + )) + fake_resp = _fake_tags_response(["llama3:latest"]) + + with patch.object(provider._client, "get", return_value=fake_resp) as mock_get: + models = await provider.list_models() + + assert models == ["llama3:latest"] + mock_get.assert_called_once_with("http://localhost:11434/api/tags") + + +# ─── Ollama Cloud scraper ──────────────────────────────────────────────────── + +_HTML = """ + +GLM-5.2 +DeepSeek V4 Flash +Qwen 3.5 +duplicate + +""" + + +async def test_scrape_ollama_cloud_models_extracts_names(): + fake_resp = MagicMock() + fake_resp.text = _HTML + + with patch("core.catalog.httpx.AsyncClient") as MockClient: + client = MockClient.return_value + client.get = AsyncMock(return_value=fake_resp) + client.__aenter__ = AsyncMock(return_value=client) + client.__aexit__ = AsyncMock(return_value=False) + models = await scrape_ollama_cloud_models() + + assert "glm-5.2" in models + assert "deepseek-v4-flash" in models + assert "qwen3.5" in models + # Duplicates are removed. + assert models.count("glm-5.2") == 1 + + +async def test_scrape_ollama_cloud_models_returns_empty_on_error(): + with patch("core.catalog.httpx.AsyncClient") as MockClient: + client = MockClient.return_value + client.get.side_effect = Exception("network error") + client.__aenter__ = AsyncMock(return_value=client) + client.__aexit__ = AsyncMock(return_value=False) + models = await scrape_ollama_cloud_models() + assert models == [] + + +async def test_update_ollama_cloud_models_merges_into_catalog(): + fake_resp = MagicMock() + fake_resp.text = 'New' + + with patch("core.catalog.httpx.AsyncClient") as MockClient: + client = MockClient.return_value + client.get = AsyncMock(return_value=fake_resp) + client.__aenter__ = AsyncMock(return_value=client) + client.__aexit__ = AsyncMock(return_value=False) + added = await update_ollama_cloud_models() + + assert added >= 1 + assert "brand-new-model" in BUILTIN_CATALOG["ollama-cloud"]["models"] diff --git a/tests/test_session_context.py b/tests/test_session_context.py new file mode 100644 index 0000000..b543de4 --- /dev/null +++ b/tests/test_session_context.py @@ -0,0 +1,219 @@ +"""Tests for the rolling session-context feature. + +Covers: + - AppState.update_session_context / build_context_prompt / context_summary + - MotionAgent.run() augmenting memory recall with a context_query + - De-duplication of recalled chunks +""" +import asyncio +from unittest.mock import AsyncMock, MagicMock + +from core.providers import ModelConfig +from main import MotionAgent +from ui.tui import AppState + + +# ─── AppState session context ──────────────────────────────────────────────── + +def test_context_empty_initial(): + state = AppState() + assert state.build_context_prompt() == "" + assert state.context_summary() == "No context yet" + + +def test_context_keeps_recent_turns_verbatim(): + state = AppState() + for i in range(3): + state.update_session_context(f"prompt {i}", f"response {i}") + + block = state.build_context_prompt() + # Recent turns are kept verbatim (not folded). + assert "Q: prompt 0" in block + assert "A: response 0" in block + assert "Q: prompt 2" in block + # No prior-context folding yet (only 3 turns). + assert "[Prior context]" not in block + + +def test_context_folds_older_turns(): + state = AppState() + # Add more than KEEP (4) turns so older ones get folded into a summary. + for i in range(7): + state.update_session_context(f"prompt {i}", f"response {i}") + + block = state.build_context_prompt() + # Older turns are folded into a [Prior context] summary. + assert "[Prior context]" in block + # The most recent 4 turns remain verbatim. + assert "Q: prompt 3" in block + assert "Q: prompt 6" in block + # The very first turn is no longer verbatim (it was folded). + assert "Q: prompt 0" not in block + + +def test_context_summary_reports_turn_count_and_last_prompt(): + state = AppState() + state.update_session_context("hello", "hi there") + state.update_session_context("how are you", "fine") + summary = state.context_summary() + assert "2 turns" in summary + assert "how are you" in summary + + +def test_context_summary_singular(): + state = AppState() + state.update_session_context("only one", "ok") + assert "1 turn" in state.context_summary() + + +# ─── MotionAgent context_query recall ──────────────────────────────────────── + +class _MockProvider: + class _Config: + provider_type = "local" + + def __init__(self): + self.config = self._Config() + + async def complete(self, prompt, system_prompt="", **kwargs): + return "answer" + + async def close(self): + pass + + +class _MockRetriever: + """Records queries and returns canned results.""" + + def __init__(self): + self.queries = [] + self.results = { + "user prompt": [{"content": "memory A", "score": 1.0}], + "context query": [{"content": "memory B", "score": 1.0}], + } + + async def retrieve(self, query, top_k=5): + self.queries.append(query) + return self.results.get(query, []) + + +async def test_agent_uses_context_query_for_recall(): + agent = MotionAgent(ModelConfig(name="t", endpoint="http://localhost", provider_type="local")) + agent.provider = _MockProvider() + retriever = _MockRetriever() + agent.retriever = retriever + + await agent.run("user prompt", context_query="context query") + + # Both the prompt and the context query were used for recall. + assert "user prompt" in retriever.queries + assert "context query" in retriever.queries + + +async def test_agent_dedupes_recalled_chunks(): + agent = MotionAgent(ModelConfig(name="t", endpoint="http://localhost", provider_type="local")) + agent.provider = _MockProvider() + + class _DupRetriever: + async def retrieve(self, query, top_k=5): + # Both the prompt and context query return the SAME content. + return [{"content": "same memory", "score": 1.0}] + + agent.retriever = _DupRetriever() + + # Patch the provider to capture the system prompt (which contains the + # de-duplicated memory context). + captured = {} + + async def fake_complete(prompt, system_prompt="", **kwargs): + captured["system"] = system_prompt + return "answer" + + agent.provider.complete = fake_complete + + await agent.run("user prompt", context_query="context query") + + # The same memory should appear only once in the system prompt. + assert captured["system"].count("same memory") == 1 + + +async def test_agent_without_context_query_uses_only_prompt(): + agent = MotionAgent(ModelConfig(name="t", endpoint="http://localhost", provider_type="local")) + agent.provider = _MockProvider() + retriever = _MockRetriever() + agent.retriever = retriever + + await agent.run("user prompt") + + # Only the prompt was used; no context query. + assert retriever.queries == ["user prompt"] + + +# ─── Auto-compact ──────────────────────────────────────────────────────────── + +def test_should_compact_below_threshold(): + state = AppState() + state.session_metrics["total_tokens_est"] = 1000 + # 1000 < 8192 * 0.95 β†’ no compaction. + assert state.should_compact(8192) is False + + +def test_should_compact_at_threshold(): + state = AppState() + state.session_metrics["total_tokens_est"] = 8000 + # 8000 >= 8192 * 0.95 β†’ compact. + assert state.should_compact(8192) is True + + +def test_should_compact_ignores_invalid_window(): + state = AppState() + state.session_metrics["total_tokens_est"] = 100000 + assert state.should_compact(0) is False + assert state.should_compact(-1) is False + + +def test_compact_folds_turns_and_resets_metrics(): + state = AppState() + for i in range(5): + state.update_session_context(f"prompt {i}", f"response {i}") + state.session_metrics["total_tokens_est"] = 9000 + state.session_metrics["prompt_tokens_est"] = 5000 + state.session_metrics["output_tokens_est"] = 4000 + + state.compact() + + # All remaining recent turns folded into a compacted summary. + assert "[Compacted context]" in state.session_context + assert "Q: prompt 1" in state.session_context + assert "Q: prompt 4" in state.session_context + # Recent turns cleared. + assert state._context_turns == [] + assert state.conversation_turns == [] + # Token metrics reset. + assert state.session_metrics["total_tokens_est"] == 0 + assert state.session_metrics["prompt_tokens_est"] == 0 + assert state.session_metrics["output_tokens_est"] == 0 + + +def test_compact_preserves_context_in_build_prompt(): + state = AppState() + state.update_session_context("hello", "hi") + state.compact() + # The compacted summary is still available as a context query. + assert "[Compacted context]" in state.build_context_prompt() + + +# ─── Agent mode (build/plan) ────────────────────────────────────────────────── + +def test_agent_mode_defaults_to_build(): + state = AppState() + assert state.agent_mode == "build" + + +def test_agent_mode_toggle_cycles(): + state = AppState() + assert state.agent_mode == "build" + state.agent_mode = "plan" if state.agent_mode == "build" else "build" + assert state.agent_mode == "plan" + state.agent_mode = "plan" if state.agent_mode == "build" else "build" + assert state.agent_mode == "build" diff --git a/ui/themes.py b/ui/themes.py index 206a0a8..b8bbf96 100644 --- a/ui/themes.py +++ b/ui/themes.py @@ -99,6 +99,24 @@ warning="#ebcb8b", dark=True, ), + # opencode native theme β€” matches the terminal UI from github.com/anomalyco/opencode + dict( + id="opencode", + name="OpenCode", + background="#0a0a0a", + surface="#1e1e1e", + panel="#141414", + foreground="#eeeeee", + primary="#fab283", + secondary="#5c9cf5", + accent="#9d7cd8", + border="#484848", + highlight="#282828", + error="#e06c75", + success="#7fd88f", + warning="#f5a742", + dark=True, + ), ] diff --git a/ui/tui.py b/ui/tui.py index 457f519..766c75a 100644 --- a/ui/tui.py +++ b/ui/tui.py @@ -39,27 +39,28 @@ from typing import Any, Dict, Optional from rich.console import Group from rich.markdown import Markdown as RichMarkdown +from rich.style import Style from rich.text import Text from textual import work from textual.app import App, ComposeResult from textual.binding import Binding from textual.containers import Container, Horizontal, Vertical, VerticalScroll +from textual.message import Message from textual.screen import Screen from textual.strip import Strip from textual.widget import Widget from textual.widgets import ( Button, - Header, Footer, + Header, Input, Label, ListItem, ListView, + LoadingIndicator, Select, Static, - TabbedContent, - TabPane, ) from core.config import ConfigManager @@ -97,13 +98,20 @@ def __init__(self) -> None: self.task_manager: Optional[TaskManager] = None self.config_manager: ConfigManager = ConfigManager() self.current_provider_id: str = "" - self.current_theme: str = "omni_dark" + self.current_theme: str = "opencode" self.caveman_enabled: bool = True self.auto_synthesis_enabled: bool = False self.ui_mode: str = "conservative" self.show_activity_rail: bool = True self.show_trace_panel: bool = False + self.agent_mode: str = "build" # "build" (full access) or "plan" (read-only) + self.busy: bool = False # True while an agent response is streaming self.last_agent_response: str = "" + self.prompt_history: list[str] = [] # submitted prompts for up/down recall + self._history_index: int = -1 + self.session_context: str = "" # rolling, bounded summary of the session + self._context_turns: list[tuple[str, str]] = [] # recent turns used to build context + self.conversation_turns: list[tuple[str, str]] = [] # (prompt, response) self.last_turn_metrics: dict = {} self.session_metrics: dict = { "turns": 0, @@ -163,6 +171,87 @@ def _provider_priority(pid: str) -> tuple[int, str]: options.append((name, pid)) return options + def record_prompt(self, prompt: str) -> None: + """Record a submitted prompt for up/down history recall.""" + if not prompt: + return + if not self.prompt_history or self.prompt_history[-1] != prompt: + self.prompt_history.append(prompt) + self._history_index = len(self.prompt_history) + + def history_previous(self, current: str) -> str: + """Return the previous prompt in history, or the current draft.""" + if not self.prompt_history: + return current + if self._history_index < 0: + self._history_index = len(self.prompt_history) + # Save the draft the first time we move up from the empty "new prompt" slot. + if self._history_index == len(self.prompt_history): + self._history_draft = current + self._history_index = max(0, self._history_index - 1) + return self.prompt_history[self._history_index] + + def history_next(self, current: str) -> str: + """Return the next prompt in history, or the current draft.""" + if not self.prompt_history: + return current + if self._history_index >= len(self.prompt_history) - 1: + self._history_index = len(self.prompt_history) + return getattr(self, "_history_draft", current) + self._history_index += 1 + return self.prompt_history[self._history_index] + + def update_session_context(self, prompt: str, response: str) -> None: + """Maintain a rolling, bounded summary of the session. + + Keeps the most recent turns verbatim and folds older turns into a + compact summary so the model always has aligned, up-to-date context + without unbounded history growth. + """ + self._context_turns.append((prompt, response)) + # Keep the last N turns verbatim; fold everything older into a summary. + KEEP = 4 + if len(self._context_turns) > KEEP: + older = self._context_turns[:-KEEP] + self._context_turns = self._context_turns[-KEEP:] + folded = "\n".join(f"Q: {p}\nA: {r[:200]}" for p, r in older) + self.session_context = f"[Prior context]\n{folded}\n\n[Recent turns]\n" + else: + self.session_context = "[Recent turns]\n" + + def should_compact(self, context_window: int = 8192, threshold: float = 0.95) -> bool: + """Return True when the session has consumed most of the context window.""" + if context_window <= 0: + return False + used = self.session_metrics.get("total_tokens_est", 0) + return used >= context_window * threshold + + def compact(self) -> None: + """Fold all current turns into a single prior-context summary.""" + if not self._context_turns: + return + folded = "\n".join(f"Q: {p}\nA: {r[:200]}" for p, r in self._context_turns) + self.session_context = f"[Compacted context]\n{folded}\n" + self._context_turns = [] + self.session_metrics["total_tokens_est"] = 0 + self.session_metrics["prompt_tokens_est"] = 0 + self.session_metrics["output_tokens_est"] = 0 + + def build_context_prompt(self) -> str: + """Return the session context block, used as a *query* to the vector DB.""" + if not self._context_turns and not self.session_context: + return "" + recent = "\n".join(f"Q: {p}\nA: {r[:300]}" for p, r in self._context_turns) + return f"{self.session_context}{recent}" + + def context_summary(self) -> str: + """Short one-line summary for the UI context row.""" + if not self._context_turns: + return "No context yet" + n = len(self._context_turns) + last = self._context_turns[-1][0] + return f"{n} turn{'s' if n != 1 else ''} Β· last: {last[:60]}" + @staticmethod def build_all_provider_info() -> list[tuple[str, str, list, bool, bool]]: """Return all providers: (pid, name, models, is_default, has_key).""" @@ -212,25 +301,28 @@ class UserMessage(Static): """ class ReasoningMessage(Static): - """Inline reasoning β€” dim italic, no box (opencode Thinking: style).""" + """opencode-style Thinking block β€” muted header + dim italic body.""" DEFAULT_CSS = """ ReasoningMessage { - background: transparent; + background: $panel; color: $text-muted; - text-style: dim italic; + border-left: solid $warning; padding: 0 2; - margin: 0 0 0 1; + margin: 0 0 1 1; } """ class AgentMessage(Static): - """Agent reply β€” no box, clean text flow.""" + """Agent reply β€” no box, clean text flow, spaced below the user prompt. + + The color is intentionally unset so the Rich Markdown visual keeps its + own theme-aware token colors (syntax highlighting) like opencode. + """ DEFAULT_CSS = """ AgentMessage { background: transparent; - color: $text; padding: 0 2; - margin: 0 0 1 1; + margin: 1 0 1 1; } """ @@ -246,68 +338,185 @@ class SystemMessage(Static): """ -class ChatInput(Input): - """Chat composer input with explicit visible text rendering.""" +class ComposerSubmitted(Message): + """Posted by ChatComposer when the user presses Enter.""" - def render_line(self, y: int) -> Strip: - if y != 0: - return Strip.blank(self.size.width) + def __init__(self, text: str) -> None: + self.text = text + super().__init__() - width = max(1, self.scrollable_content_region.width) - if self.value: - text = Text(self.value, style="#E1E1E6", no_wrap=True, overflow="crop", end="") - else: - text = Text(self.placeholder, style="dim #A8A4B8", no_wrap=True, overflow="crop", end="") - - if self.has_focus and self._cursor_visible: - cursor = self.cursor_position if self.value else 0 - if cursor >= len(text): - text.append(" ") - text.stylize("on #78D1E1", cursor, cursor + 1) - - segments = list(self.app.console.render(text, self.app.console.options.update_width(width))) - strip = Strip(segments) - return strip.crop(0, width).extend_cell_length(width).apply_style(self.rich_style) -class ChatInputMirror(Widget): - """Visible composer text surface mirrored from the real input widget.""" - def __init__(self, **kwargs) -> None: - super().__init__(**kwargs) - self._value = "" - self._cursor = 0 - self._focused = False - - def set_input_state(self, value: str, cursor: int, focused: bool) -> None: - self._value = value - self._cursor = max(0, min(cursor, len(value))) - self._focused = focused - self.refresh() - def render_line(self, y: int) -> Strip: - width = max(1, self.scrollable_content_region.width) - if y != 0: - return Strip.blank(width) - - if self._value: - text = Text(self._value, style="#E1E1E6", no_wrap=True, overflow="crop", end="") - if self._focused: - cursor = self._cursor - if cursor >= len(text): - text.append(" ") - text.stylize("bold #191622 on #78D1E1", cursor, cursor + 1) - else: - text = Text("Type a message… (Enter to send)", style="dim #A8A4B8", no_wrap=True, overflow="crop", end="") - if self._focused: - text.stylize("bold #191622 on #78D1E1", 0, 1) +class ChatComposer(Static, can_focus=True): + """Compact two-row prompt panel mirroring opencode's Prompt component. - segments = list(self.app.console.render(text, self.app.console.options.update_width(width))) - strip = Strip(segments) - return strip.crop(0, width).extend_cell_length(width).apply_style(self.rich_style) + Row 0: single-line editable input with a themed cursor. + Row 1: meta line (agent Β· model Β· provider) rendered as markup. + The whole panel has a thick left border in the agent-mode color. + """ - def on_click(self) -> None: + DEFAULT_CSS = """ + ChatComposer { + height: auto; + min-height: 4; + max-height: 12; + width: 1fr; + background: $surface; + color: $text; + padding: 1 2 1 2; + border: blank; + border-left: solid $secondary; + margin: 0; + } + ChatComposer:focus { + border: blank; + border-left: solid $secondary; + background: $surface; + } + """ + + def __init__(self, state: AppState, placeholder: str = "Ask anything…", **kwargs) -> None: + super().__init__(**kwargs) + self._state = state + self._placeholder = placeholder + self.value: str = "" + self.cursor_position: int = 0 + self.meta_markup: str = "" + + def set_meta(self, markup: str) -> None: + """Update the second (meta) row.""" + self.meta_markup = markup + self.refresh() + + def _wrap_value(self) -> list[str]: + """Soft-wrap the input value to the available content width.""" + width = max(10, self.size.width - self.styles.padding.left - self.styles.padding.right) + if not self.value: + return [self._placeholder] + lines: list[str] = [] + for paragraph in self.value.split("\n"): + if not paragraph: + lines.append("") + continue + while len(paragraph) > width: + lines.append(paragraph[:width]) + paragraph = paragraph[width:] + lines.append(paragraph) + return lines + + def _cursor_to_wrapped(self, width: int) -> tuple[int, int]: + """Map a flat cursor offset to (wrapped_line_index, column).""" + pos = min(self.cursor_position, len(self.value)) + paragraphs = self.value.split("\n") + seen = 0 + for p, para in enumerate(paragraphs): + para_len = len(para) + if pos <= seen + para_len: + col_in_para = pos - seen + # How many wrapped lines preceded this paragraph? + wline = sum(max(1, -(-len(q) // width)) for q in paragraphs[:p]) + wrapped_row = wline + (col_in_para // width) + wrapped_col = col_in_para % width + return wrapped_row, wrapped_col + seen += para_len + 1 + # Cursor at very end. + wline = sum(max(1, -(-len(q) // width)) for q in paragraphs) + last = paragraphs[-1] if paragraphs else "" + return max(0, wline - 1), len(last) % width + + def render(self) -> Text: + width = max(10, self.size.width - self.styles.padding.left - self.styles.padding.right) + wrapped = self._wrap_value() + lines = [Text(line, style=self.rich_style) for line in wrapped] + + if self.has_focus: + wline, wcol = self._cursor_to_wrapped(width) + if wline >= len(lines): + wline = len(lines) - 1 + if not lines[wline].plain: + lines[wline] = Text(" ", style=self.rich_style) + if wcol >= len(lines[wline].plain): + lines[wline].append(" ") + wcol = len(lines[wline].plain) - 1 + theme = self.app.get_theme(self.app.theme) + from textual.color import Color + primary = Color.parse(theme.primary).rich_color + surface_color = theme.surface or theme.background or "#1e1e1e" + surface = Color.parse(surface_color).rich_color + lines[wline].stylize(Style(bgcolor=primary, color=surface), wcol, wcol + 1) + + line1 = Text.from_markup(self.meta_markup) if self.meta_markup else Text("") + result = lines[0] + for extra in lines[1:]: + result = Text.assemble(result, "\n", extra) + return Text.assemble(result, "\n\n", line1) + + def _invalidate_layout(self) -> None: + # Invalidate the cached content height so the panel re-sizes with the + # number of (soft-wrapped) input lines. try: - self.screen.query_one("#chat_input", Input).focus() + self._content_height_cache = None except Exception: pass + self.refresh(repaint=True, layout=True) + + def _insert(self, char: str) -> None: + pos = self.cursor_position + self.value = self.value[:pos] + char + self.value[pos:] + self.cursor_position = min(len(self.value), pos + 1) + self._invalidate_layout() + + def _delete(self) -> None: + pos = self.cursor_position + if pos < len(self.value): + self.value = self.value[:pos] + self.value[pos + 1:] + self._invalidate_layout() + + def _backspace(self) -> None: + pos = self.cursor_position + if pos > 0: + self.value = self.value[: pos - 1] + self.value[pos:] + self.cursor_position = pos - 1 + self._invalidate_layout() + + def on_key(self, event) -> None: + if event.key == "enter" or event.key == "ctrl+s": + event.prevent_default() + self.post_message(ComposerSubmitted(self.value)) + elif event.key == "up": + event.prevent_default() + self.value = self._state.history_previous(self.value) + self.cursor_position = len(self.value) + self.refresh() + elif event.key == "down": + event.prevent_default() + self.value = self._state.history_next(self.value) + self.cursor_position = len(self.value) + self.refresh() + elif event.key == "left": + event.prevent_default() + self.cursor_position = max(0, self.cursor_position - 1) + self.refresh() + elif event.key == "right": + event.prevent_default() + self.cursor_position = min(len(self.value), self.cursor_position + 1) + self.refresh() + elif event.key == "home": + event.prevent_default() + self.cursor_position = 0 + self.refresh() + elif event.key == "end": + event.prevent_default() + self.cursor_position = len(self.value) + self.refresh() + elif event.key == "backspace": + event.prevent_default() + self._backspace() + elif event.key == "delete": + event.prevent_default() + self._delete() + elif event.character is not None and event.is_printable: + event.prevent_default() + self._insert(event.character) class ProviderOption(ListItem): """A selectable provider row on the startup screen.""" @@ -421,39 +630,51 @@ def action_select(self) -> None: # ─── Global activity rail + main hub ───────────────────────────────────────── -class ActivityRail(Vertical): - """Right-side global activity rail for live task visibility.""" +class ContextPanel(Vertical): + """Right-side context panel showing session context and recent turns. + + Mirrors opencode's context/side panel: it reflects the rolling session + summary and the most recent user/assistant turns so the operator can see + what the model is working against. + """ DEFAULT_CSS = """ - ActivityRail { - width: 36; + ContextPanel { + width: 38; min-width: 30; - max-width: 42; + max-width: 44; border-left: blank; margin-left: 2; padding: 1 1; background: $panel; } - #activity_header { + #context_header { color: $text-muted; text-style: bold; - margin-bottom: 2; + margin-bottom: 1; padding: 0 1; background: transparent; border: blank; } - #activity_list { + #context_body { height: 1fr; scrollbar-size: 1 1; } - .activity_row { + .context_section { + color: $text-muted; + text-style: bold; + margin-top: 1; + margin-bottom: 0; + padding: 0 1; + } + .context_turn { padding: 0 1; margin: 0 0 1 0; color: $text; background: transparent; border: blank; } - .activity_row:first-child { + .context_turn:first-child { border-top: blank; } """ @@ -463,44 +684,37 @@ def __init__(self, state: AppState, **kwargs) -> None: self.state = state def compose(self) -> ComposeResult: - yield Label("Live Activity", id="activity_header") - yield VerticalScroll(id="activity_list") + yield Label("Context", id="context_header") + yield VerticalScroll(id="context_body") - def on_mount(self) -> None: - self.set_interval(0.5, self.refresh_activity) - self.refresh_activity() - - def refresh_activity(self) -> None: - task_manager = self.state.task_manager - if not task_manager: - return - - status = task_manager.get_status() - tasks = list(status["tasks"].values()) - tasks.sort(key=lambda t: t.start_time or datetime.min, reverse=True) - running = sum(1 for t in tasks if t.status == "RUNNING") - self.query_one("#activity_header", Label).update(f"Live Activity Β· {running} running") - - container = self.query_one("#activity_list", VerticalScroll) + def refresh_context(self) -> None: + container = self.query_one("#context_body", VerticalScroll) for child in list(container.children): child.remove() - if not tasks: - container.mount(Static("[dim]No tasks yet[/]", classes="activity_row")) - return + summary = self.state.context_summary() + container.mount(Static(f"[dim]session Β· {summary}[/]", classes="context_turn")) - for task in tasks[:20]: - icon = TaskRow.ICON.get(task.status, "β€’") - color = TaskRow.COLOR.get(task.status, "white") - snippet = task.prompt.replace("[", "\\[").replace("]", "\\]") - snippet = snippet[:46] + "…" if len(snippet) > 46 else snippet - latest = task.logs[-1] if task.logs else "" - latest = latest.replace("[", "\\[").replace("]", "\\]") - latest = latest[:58] + "…" if len(latest) > 58 else latest - row = f"{icon} [{color}]{task.status}[/] [dim]{task.task_id}[/]\n{snippet}" - if latest: - row += f"\n[dim]{latest}[/]" - container.mount(Static(row, classes="activity_row")) + # Resolve the theme primary to a hex for Rich markup. + try: + theme = self.app.get_theme(self.app.theme) + primary = theme.primary or "#fab283" + except Exception: + primary = "#fab283" + + turns = getattr(self.state, "conversation_turns", None) or [] + if turns: + container.mount(Label("Recent turns", classes="context_section")) + for prompt, response in turns[-6:]: + p = prompt.replace("[", "\\[").replace("]", "\\]") + p = p[:44] + "…" if len(p) > 44 else p + r = (response or "").replace("[", "\\[").replace("]", "\\]") + r = r[:44] + "…" if len(r) > 44 else r + container.mount( + Static(f"[{primary} bold]Q[/] {p}\n[dim]A[/] {r or '…'}", classes="context_turn") + ) + else: + container.mount(Static("[dim]No turns yet β€” start a conversation.[/]", classes="context_turn")) # ─── Shortcuts overlay ──────────────────────────────────────────────────────── @@ -615,13 +829,217 @@ def action_dismiss_overlay(self) -> None: self.app.pop_screen() +# ─── Command palette + model dialog ───────────────────────────────────────── + +class CommandPalette(Screen): + """opencode-style command palette (Ctrl+K).""" + + CSS = """ + CommandPalette { + align: center middle; + } + #palette_box { + width: 72; + max-height: 80%; + border: round $border; + background: $surface; + padding: 1 2; + scrollbar-size: 1 1; + } + #palette_input { + margin-bottom: 1; + border: solid $border; + } + #palette_list { + height: auto; + max-height: 60%; + scrollbar-size: 1 1; + padding: 0 1; + border: blank; + } + #palette_hint { + color: $text-muted; + text-align: center; + margin-top: 1; + } + """ + + BINDINGS = [ + Binding("escape", "dismiss_palette", "Close", priority=True), + ] + + def __init__(self, main_screen: "MainScreen", **kwargs) -> None: + super().__init__(**kwargs) + self._main = main_screen + self._commands: list[tuple[str, str]] = [] + + def compose(self) -> ComposeResult: + with VerticalScroll(id="palette_box"): + yield Input(placeholder="Type a command…", id="palette_input") + yield ListView(id="palette_list") + yield Label("Esc to close", id="palette_hint") + + def on_mount(self) -> None: + self.query_one("#palette_box", VerticalScroll).border_title = " Commands " + self._commands = [ + ("Switch model…", "model"), + ("Toggle agent (build/plan)", "agent"), + ("Toggle theme", "theme"), + ("Show shortcuts", "shortcuts"), + ("Toggle trace panel", "trace"), + ("Copy last response", "copy"), + ("Toggle context panel", "context"), + ] + lv = self.query_one("#palette_list", ListView) + for label, _ in self._commands: + lv.append(ListItem(Label(label))) + self.query_one("#palette_input", Input).focus() + + def on_input_changed(self, event: Input.Changed) -> None: + query = event.value.strip().lower() + lv = self.query_one("#palette_list", ListView) + lv.clear() + for label, action in self._commands: + if query in label.lower(): + lv.append(ListItem(Label(label))) + + def on_list_view_selected(self, event: ListView.Selected) -> None: + if event.item is None: + return + self._activate_label(event.item) + + def on_input_submitted(self, event: Input.Submitted) -> None: + # Enter in the input box: pick the highlighted / first filtered command. + lv = self.query_one("#palette_list", ListView) + item = lv.highlighted_child or (lv.children[0] if lv.children else None) + if item is not None: + event.stop() + self._activate_label(item) + + def _activate_label(self, item) -> None: + try: + label = str(item.query_one(Label).renderable) + except Exception: + return + for lab, action in self._commands: + if lab == label: + self.app.pop_screen() + self._run(action) + return + + def _run(self, action: str) -> None: + if action == "model": + self._main.action_open_model_dialog() + elif action == "agent": + try: + self._main.query_one(ChatPane)._toggle_agent_mode() + except Exception: + pass + elif action == "theme": + self._main.action_toggle_theme() + elif action == "shortcuts": + self._main.action_show_shortcuts() + elif action == "trace": + try: + self._main.query_one(ChatPane).action_toggle_trace_panel() + except Exception: + pass + elif action == "copy": + try: + self._main.query_one(ChatPane).action_copy_last_response() + except Exception: + pass + elif action == "context": + self._main.action_toggle_context_panel() + + def action_dismiss_palette(self) -> None: + self.app.pop_screen() + + +class ModelDialog(Screen): + """opencode-style model/provider switcher (Ctrl+O).""" + + CSS = """ + ModelDialog { + align: center middle; + } + #model_box { + width: 72; + max-height: 80%; + border: round $border; + background: $surface; + padding: 1 2; + scrollbar-size: 1 1; + } + #model_title { + color: $text; + text-style: bold; + text-align: center; + margin-bottom: 1; + } + #model_list { + height: auto; + max-height: 60%; + scrollbar-size: 1 1; + padding: 0 1; + border: blank; + } + #model_hint { + color: $text-muted; + text-align: center; + margin-top: 1; + } + """ + + BINDINGS = [ + Binding("escape", "dismiss_model", "Close", priority=True), + ] + + def __init__(self, state: AppState, **kwargs) -> None: + super().__init__(**kwargs) + self.state = state + + def compose(self) -> ComposeResult: + with VerticalScroll(id="model_box"): + yield Label("Select Provider / Model", id="model_title") + yield ListView(id="model_list") + yield Label("Esc to close", id="model_hint") + + def on_mount(self) -> None: + lv = self.query_one("#model_list", ListView) + for pid, name, models, is_default, has_key in AppState.build_all_provider_info(): + if not has_key: + continue + marker = " ← default" if is_default else "" + default_model = (models[0] if models else "") + label = f"⚑ {name}{marker} [dim]{default_model}[/]" + lv.append(ProviderOption(pid, name, models, is_default, has_key)) + self.query_one("#model_list", ListView).focus() + + def on_list_view_selected(self, event: ListView.Selected) -> None: + option = event.item + if not isinstance(option, ProviderOption): + return + provider_id = option.provider_id + models = option.models + default_model = models[0] if models else None + full_id = f"{provider_id}/{default_model}" if default_model else provider_id + try: + self.state.reconnect(full_id) + self.notify(f"Switched to {full_id}") + except Exception as e: + self.notify(f"Connection failed: {e}", severity="error") + self.app.pop_screen() + + def action_dismiss_model(self) -> None: + self.app.pop_screen() + + class MainScreen(Screen): - """The main hub with Chat, Tasks, Skills, Memory, Settings tabs.""" + """The main chat screen with a right-hand context panel.""" CSS = """ #main_shell { height: 1fr; background: $background; } - #main_body { width: 1fr; padding: 0 1 0 1; } - #main_tabs { height: 1fr; } #session_metrics_footer { height: auto; color: $text-muted; @@ -630,37 +1048,13 @@ class MainScreen(Screen): padding: 0 2; text-style: dim; } - TabbedContent { height: 1fr; } - TabbedContent TabPane { - padding: 0 0; - } """ BINDINGS = [ Binding("ctrl+t", "toggle_theme", "Theme", priority=True), - Binding("ctrl+b", "toggle_activity_rail", "Rail", priority=True), - Binding("ctrl+right", "next_tab", "Next Tab", priority=True), - Binding("ctrl+left", "prev_tab", "Prev Tab", priority=True), - Binding("ctrl+1", "goto_tab('chat_tab')", "Chat", priority=True), - Binding("ctrl+2", "goto_tab('tasks_tab')", "Tasks", priority=True), - Binding("ctrl+3", "goto_tab('skills_tab')", "Skills", priority=True), - Binding("ctrl+4", "goto_tab('kb_tab')", "KB", priority=True), - Binding("ctrl+5", "goto_tab('memory_tab')", "Memory", priority=True), - Binding("ctrl+6", "goto_tab('settings_tab')", "Settings", priority=True), - Binding("alt+1", "goto_tab('chat_tab')", "Chat", priority=True), - Binding("alt+2", "goto_tab('tasks_tab')", "Tasks", priority=True), - Binding("alt+3", "goto_tab('skills_tab')", "Skills", priority=True), - Binding("alt+4", "goto_tab('kb_tab')", "KB", priority=True), - Binding("alt+5", "goto_tab('memory_tab')", "Memory", priority=True), - Binding("alt+6", "goto_tab('settings_tab')", "Settings", priority=True), - Binding("f1", "goto_tab('chat_tab')", "Chat", priority=True), - Binding("f2", "goto_tab('tasks_tab')", "Tasks", priority=True), - Binding("f3", "goto_tab('skills_tab')", "Skills", priority=True), - Binding("f4", "goto_tab('kb_tab')", "KB", priority=True), - Binding("f5", "goto_tab('memory_tab')", "Memory", priority=True), - Binding("f6", "goto_tab('settings_tab')", "Settings", priority=True), - Binding("ctrl+]", "next_tab", "Next Tab", priority=True), - Binding("ctrl+[", "prev_tab", "Prev Tab", priority=True), + Binding("ctrl+b", "toggle_context_panel", "Context", priority=True), + Binding("ctrl+k", "open_command_palette", "Commands", priority=True), + Binding("ctrl+o", "open_model_dialog", "Model", priority=True), Binding("ctrl+q", "quit", "Quit", priority=True), Binding("question_sign", "show_shortcuts", "Shortcuts", priority=True), ] @@ -672,33 +1066,29 @@ def __init__(self, state: AppState, **kwargs) -> None: def compose(self) -> ComposeResult: yield Header(show_clock=True) with Horizontal(id="main_shell"): - with Vertical(id="main_body"): - with TabbedContent(id="main_tabs"): - with TabPane("Chat", id="chat_tab"): - yield ChatPane(self.state) - with TabPane("Tasks", id="tasks_tab"): - yield TasksPane(self.state) - with TabPane("Skills", id="skills_tab"): - yield SkillsPane(self.state) - with TabPane("KB", id="kb_tab"): - yield KBPane(self.state) - with TabPane("Memory", id="memory_tab"): - yield MemoryPane(self.state) - with TabPane("Settings", id="settings_tab"): - yield SettingsPane(self.state) - yield ActivityRail(self.state, id="activity_rail") + yield ChatPane(self.state) + yield ContextPanel(self.state, id="context_panel") yield Label("", id="session_metrics_footer") yield Footer() - async def on_button_pressed(self, event: Button.Pressed) -> None: - # Chat-local buttons (trace/copy/stats/save) are handled in ChatPane. - # No global tab buttons remain; tab headers are the canonical nav. - pass - def on_mount(self) -> None: if not self.state.show_activity_rail: - self.query_one("#activity_rail", ActivityRail).styles.display = "none" + self.query_one("#context_panel", ContextPanel).styles.display = "none" self.refresh_session_footer() + self.refresh_context_panel() + + def refresh_context_panel(self) -> None: + try: + panel = self.query_one("#context_panel", ContextPanel) + panel.refresh_context() + except Exception: + pass + + def action_open_command_palette(self) -> None: + self.app.push_screen(CommandPalette(self)) + + def action_open_model_dialog(self) -> None: + self.app.push_screen(ModelDialog(self.state)) def refresh_session_footer(self) -> None: s = self.state.session_metrics or {} @@ -723,51 +1113,10 @@ def action_toggle_theme(self) -> None: self.app.theme = self.state.current_theme self.notify(f"Theme β†’ {self.state.current_theme}") - def action_toggle_activity_rail(self) -> None: - rail = self.query_one("#activity_rail", ActivityRail) + def action_toggle_context_panel(self) -> None: + panel = self.query_one("#context_panel", ContextPanel) self.state.show_activity_rail = not self.state.show_activity_rail - rail.styles.display = "block" if self.state.show_activity_rail else "none" - - def _activate_tab(self, tab_id: str) -> None: - tabs = self.query_one("#main_tabs", TabbedContent) - tabs.active = tab_id - focus_targets = { - "chat_tab": "#chat_input", - "tasks_tab": "#task_input", - "skills_tab": "#skills_search_input", - "kb_tab": "#kb_search_input", - "memory_tab": "#memory_search_input", - } - selector = focus_targets.get(tab_id) - if not selector: - return - try: - self.query_one(selector, Input).focus() - except Exception: - pass - - def action_goto_tab(self, tab_id: str) -> None: - self._activate_tab(tab_id) - - def action_next_tab(self) -> None: - tabs = self.query_one("#main_tabs", TabbedContent) - order = ["chat_tab", "tasks_tab", "skills_tab", "kb_tab", "memory_tab", "settings_tab"] - current = tabs.active or order[0] - try: - idx = order.index(current) - except ValueError: - idx = 0 - self._activate_tab(order[(idx + 1) % len(order)]) - - def action_prev_tab(self) -> None: - tabs = self.query_one("#main_tabs", TabbedContent) - order = ["chat_tab", "tasks_tab", "skills_tab", "kb_tab", "memory_tab", "settings_tab"] - current = tabs.active or order[0] - try: - idx = order.index(current) - except ValueError: - idx = 0 - self._activate_tab(order[(idx - 1) % len(order)]) + panel.styles.display = "block" if self.state.show_activity_rail else "none" def action_show_shortcuts(self) -> None: self.app.push_screen(ShortcutsOverlay(self)) @@ -782,6 +1131,8 @@ class ChatPane(Vertical): Binding("ctrl+shift+c", "copy_last_response", "Copy", priority=True), Binding("f8", "toggle_trace_panel", "Trace", priority=True), Binding("f9", "copy_last_response", "Copy", priority=True), + Binding("tab", "toggle_agent_mode", "Agent", priority=True), + Binding("ctrl+e", "open_external_editor", "Editor", priority=True), ] DEFAULT_CSS = """ @@ -838,61 +1189,30 @@ class ChatPane(Vertical): color: $text-muted; text-style: dim; } - #chat_metrics { - color: $text-muted; - margin: 0 0 0 0; - padding: 0 2; - text-style: dim; - } - #chat_composer { - height: 5; - min-height: 5; - max-height: 5; - padding: 1 1 1 1; - background: $background; - border-top: solid $surface; - border-left: blank; - border-right: blank; - border-bottom: blank; - margin: 0; - } - #chat_input { - height: 3; - width: 1; - min-width: 1; - max-width: 1; - border: blank; - background: $background; - color: $background; - padding: 0 0; - } - #chat_input_mirror { - height: 1fr; + /* + Prompt layout modeled on opencode's Prompt component: + - Surface panel holds the single-line input + meta row. + - Thick left border in the agent/model color. + - Status row below shows spinner + token/cost + shortcuts. + */ + #chat_status { + height: 1; width: 1fr; + padding: 0 0 0 2; background: $background; - color: #E1E1E6; - padding: 0 2; - } - #chat_input:focus { - border: blank; - background: $background; - color: $background; - } - .chat_btn { - height: 3; - margin-left: 1; - min-width: 10; - background: transparent; - border: blank; color: $text-muted; + text-style: dim; + content-align: left middle; } - .chat_btn:hover { - background: $surface; - color: $text; + #chat_status_spinner { + width: 3; + height: 1; + color: $primary; + margin-right: 1; + display: none; } - .chat_btn:focus { - border-bottom: solid $primary; - color: $text; + #chat_status_spinner.busy { + display: block; } """ @@ -908,17 +1228,14 @@ def compose(self) -> ComposeResult: yield Label("Interaction Trace", id="trace_header") yield VerticalScroll(id="trace_log") yield Label("", id="trace_summary_chip") - yield Label("", id="chat_metrics") - with Horizontal(id="chat_composer"): - yield ChatInputMirror(id="chat_input_mirror") - yield ChatInput(placeholder="Type a message… (Enter to send)", id="chat_input") - with Horizontal(id="chat_controls"): - with Horizontal(id="chat_primary_actions"): - yield Button("Trace", id="chat_toggle_trace_btn", classes="chat_btn") - yield Button("Copy", id="chat_copy_btn", classes="chat_btn") - yield Button("Stats", id="chat_stats_btn", classes="chat_btn") - with Horizontal(id="chat_secondary_actions"): - yield Button("Save Skill", id="chat_save_skill_btn", classes="chat_btn") + yield ChatComposer( + self.state, + placeholder="Ask anything…", + id="chat_input", + ) + with Horizontal(id="chat_status"): + yield LoadingIndicator(id="chat_status_spinner") + yield Label("", id="chat_status_text") def on_click(self, event) -> None: if getattr(event.control, "id", None) == "trace_summary_chip": @@ -928,36 +1245,11 @@ def on_mount(self) -> None: name = self.state.agent.provider.config.name if self.state.agent else "?" log = self.query_one("#chat_log", VerticalScroll) log.mount(SystemMessage(f"⚑ Motion Harness β€” connected to {name}")) - log.mount(SystemMessage("Tip: Ctrl/Alt+1..6 or F1-F6 tabs Β· F8 Trace Β· F9 Copy Β· /skill save ")) + log.mount(SystemMessage("Tip: Ctrl+K commands Β· Ctrl+O model Β· Tab agent Β· F8 trace Β· F9 copy Β· /skill save ")) self._append_trace("session_start", f"provider={name}") self._set_trace_panel_visible(self.state.show_trace_panel) - self._refresh_metrics_bar() - self.query_one("#chat_input", Input).focus() - self._refresh_input_mirror() - - def _refresh_input_mirror(self) -> None: - try: - input_box = self.query_one("#chat_input", Input) - mirror = self.query_one("#chat_input_mirror", ChatInputMirror) - except Exception: - return - mirror.set_input_state( - value=input_box.value, - cursor=input_box.cursor_position, - focused=input_box.has_focus, - ) - - def on_input_changed(self, event: Input.Changed) -> None: - if event.input.id == "chat_input": - self._refresh_input_mirror() - - def on_descendant_focus(self, event) -> None: - if getattr(getattr(event, "widget", None), "id", None) == "chat_input": - self._refresh_input_mirror() - - def on_descendant_blur(self, event) -> None: - if getattr(getattr(event, "widget", None), "id", None) == "chat_input": - self._refresh_input_mirror() + self._refresh_meta() + self.query_one("#chat_input", ChatComposer).focus() def _set_trace_panel_visible(self, visible: bool) -> None: self.state.show_trace_panel = visible @@ -965,14 +1257,12 @@ def _set_trace_panel_visible(self, visible: bool) -> None: panel.styles.display = "block" if visible else "none" chip = self.query_one("#trace_summary_chip", Label) chip.styles.display = "none" if visible else "block" - button = self.query_one("#chat_toggle_trace_btn", Button) - button.label = "Trace On" if visible else "Trace" self._refresh_trace_chip() self.notify("Trace panel shown" if visible else "Trace panel hidden") # Preserve composer focus: expanding the trace panel must never steal focus # from the input unless the user explicitly clicked into the panel. try: - self.query_one("#chat_input", Input).focus() + self.query_one("#chat_input", ChatComposer).focus() except Exception: pass @@ -989,6 +1279,43 @@ def _refresh_trace_chip(self) -> None: def action_toggle_trace_panel(self) -> None: self._set_trace_panel_visible(not self.state.show_trace_panel) + def _toggle_agent_mode(self) -> None: + """Switch between build (full access) and plan (read-only) agents.""" + self.state.agent_mode = "plan" if self.state.agent_mode == "build" else "build" + self._refresh_meta() + self.notify(f"Agent β†’ {self.state.agent_mode}") + + def action_toggle_agent_mode(self) -> None: + self._toggle_agent_mode() + + def action_open_external_editor(self) -> None: + """Open the composer draft in $EDITOR and read it back (opencode Ctrl+E).""" + import subprocess + import tempfile + editor = os.environ.get("EDITOR") or os.environ.get("VISUAL") or "vi" + try: + input_box = self.query_one("#chat_input", ChatComposer) + except Exception: + return + draft = input_box.value + with tempfile.NamedTemporaryFile(mode="w", suffix=".md", delete=False, encoding="utf-8") as f: + f.write(draft) + path = f.name + try: + subprocess.call([editor, path]) + with open(path, encoding="utf-8") as f: + content = f.read() + input_box.value = content + input_box.focus() + self.notify("Editor content loaded into composer.") + except Exception as e: + self.notify(f"Could not open editor: {e}", severity="error") + finally: + try: + os.remove(path) + except Exception: + pass + def _copy_last_response(self) -> None: text = (self.state.last_agent_response or "").strip() if not text: @@ -1003,7 +1330,7 @@ def _copy_last_response(self) -> None: except Exception: pass try: - input_box = self.query_one("#chat_input", Input) + input_box = self.query_one("#chat_input", ChatComposer) input_box.value = text[:10000] input_box.focus() self.notify("Clipboard unavailable; response inserted into input for manual copy.", severity="warning") @@ -1016,27 +1343,136 @@ def action_copy_last_response(self) -> None: self._copy_last_response() @staticmethod - def _render_user_markdown(timestamp: str, text: str): + def _theme_code_style(theme_name: str) -> str: + """Map a TUI theme to a Pygments code style for Rich Markdown.""" + mapping = { + "opencode": "github-dark", + "dracula": "dracula", + "nord": "nord", + "one_dark": "one-dark", + "omni_dark": "dracula", + "solarized_light": "solarized-light", + } + return mapping.get(theme_name, "default") + + def _render_user_markdown(self, timestamp: str, text: str): safe = text.strip() or "_Empty message._" return Group( Text(f"you {timestamp}", style="dim"), - RichMarkdown(safe), + RichMarkdown(safe, code_theme=self._theme_code_style(self.app.theme)), ) - @staticmethod - def _render_agent_markdown(timestamp: str, answer: str): + def _render_agent_markdown(self, timestamp: str, answer: str): safe_answer = answer.strip() or "_No response content._" - return RichMarkdown(safe_answer) + return RichMarkdown(safe_answer, code_theme=self._theme_code_style(self.app.theme)) - async def on_input_submitted(self, event: Input.Submitted) -> None: - text = event.value.strip() + def _agent_color(self) -> str: + """Return the agent-mode accent color as a CSS variable string. + + opencode uses blue for the build agent and orange for the plan agent. + """ + return "$secondary" if self.state.agent_mode == "build" else "$warning" + + def _refresh_meta(self) -> None: + """Update the composer meta row: agent Β· model Β· provider. + + Mirrors opencode's prompt footer which shows: + AgentName Β· modelName providerName + and uses the agent color as the left border highlight. + """ + try: + composer = self.query_one("#chat_input", ChatComposer) + except Exception: + return + agent = self.state.agent_mode + agent_label = agent.capitalize() + provider_id = self.state.current_provider_id or "" + model = self.state.agent.provider.config.name if self.state.agent else "?" + agent_color = self._agent_color() + # Resolve CSS variable name to a concrete hex color for Rich markup. + theme = self.app.get_theme(self.app.theme) + agent_hex = self._agent_hex(theme, agent_color) + # opencode-style meta: "Build Β· deepseek-v4-flash ollama-cloud" + meta_markup = ( + f"[{agent_hex} bold]{agent_label}[/] [dim]Β·[/] {model} [dim]{provider_id}[/]" + ) + composer.set_meta(meta_markup) + # Tint the left border of the composer with the agent color. + self._refresh_agent_color_accent() + self._refresh_status() + + @staticmethod + def _agent_hex(theme, agent_color: str) -> str: + """Resolve an agent-mode CSS variable name to a concrete hex color.""" + if agent_color == "$warning": + return theme.warning or theme.primary or "#f5a742" + if agent_color == "$secondary": + return theme.secondary or theme.primary or "#5c9cf5" + return theme.primary or "#fab283" + + def _refresh_agent_color_accent(self) -> None: + """Apply the current agent-mode accent color to the prompt border.""" + theme = self.app.get_theme(self.app.theme) + agent_color = self._agent_color() + hex_color = self._agent_hex(theme, agent_color) + composer = self.query_one("#chat_input", ChatComposer) + composer.styles.border_left = ("solid", hex_color) + + def _refresh_status(self) -> None: + """Update the status row below the composer (spinner + token/cost).""" + try: + status_text = self.query_one("#chat_status_text", Label) + spinner = self.query_one("#chat_status_spinner", LoadingIndicator) + except Exception: + return + m = self.state.last_turn_metrics or {} + s = self.state.session_metrics or {} + last_total = m.get("total_tokens_est", 0) + session_total = s.get("total_tokens_est", 0) + turns = s.get("turns", 0) + cost = s.get("estimated_cost_usd", 0.0) + if isinstance(cost, (int, float)) and cost > 0: + cost_color = "$warning" + cost_part = f" [dim]Β·[/] [{cost_color}]${cost:.4f}[/]" + else: + cost_part = "" + if self.state.busy: + spinner.set_class(True, "busy") + status_text.update( + f"[dim]Working…[/] " + f"[dim]turns[/] {turns} [dim]Β·[/] " + f"[dim]last[/] {last_total} tok [dim]Β·[/] " + f"[dim]session[/] {session_total} tok{cost_part}" + ) + else: + spinner.set_class(False, "busy") + status_text.update( + f"[dim]turns[/] {turns} [dim]Β·[/] " + f"[dim]last[/] {last_total} tok [dim]Β·[/] " + f"[dim]session[/] {session_total} tok{cost_part}" + ) + + async def on_composer_submitted(self, event: ComposerSubmitted) -> None: + await self._submit_composer(event.text) + + async def _submit_composer(self, text: str = "") -> None: + input_box = self.query_one("#chat_input", ChatComposer) + text = (text or input_box.value).strip() if not text: return - event.input.value = "" - self._refresh_input_mirror() + input_box.value = "" + input_box.cursor_position = 0 + input_box.refresh() + input_box.focus() + self.state.record_prompt(text) log = self.query_one("#chat_log", VerticalScroll) if text.startswith("/skill"): + # Plan agent is read-only: no skill writes. + if self.state.agent_mode == "plan" and ("save" in text or "delete" in text): + log.mount(SystemMessage("β›” Plan agent is read-only β€” skill writes disabled.")) + log.scroll_end(animate=False) + return await self._handle_skill_command(text, log) log.scroll_end(animate=False) return @@ -1044,32 +1480,11 @@ async def on_input_submitted(self, event: Input.Submitted) -> None: user_msg = UserMessage("") user_msg.update(self._render_user_markdown(ts, text)) log.mount(user_msg) - thinking = SystemMessage("Thinking…") live_response = AgentMessage("") - live_response.update(self._render_agent_markdown(ts, "_Waiting for response…_")) - log.mount(thinking) log.mount(live_response) log.scroll_end(animate=False) - self._run_agent(text, thinking, live_response) + self._run_agent(text, live_response) - def _refresh_metrics_bar(self) -> None: - m = self.state.last_turn_metrics or {} - s = self.state.session_metrics or {} - provider = m.get("provider_type") or ( - getattr(self.state.agent.provider.config, "provider_type", "") if self.state.agent else "" - ) - last_total = m.get("total_tokens_est", 0) - session_total = s.get("total_tokens_est", 0) - cost = s.get("estimated_cost_usd", 0.0) - cost_text = "$0.00 local" if provider == "local" else f"${cost:.4f} est" - text = ( - f"Lastβ‰ˆ{last_total} tok Β· Sessionβ‰ˆ{session_total} tok Β· " - f"Turns={s.get('turns', 0)} Β· Spend={cost_text}" - ) - try: - self.query_one("#chat_metrics", Label).update(text) - except Exception: - pass def _append_trace(self, event_type: str, detail: str = "") -> None: trace_log = self.query_one("#trace_log", VerticalScroll) ts = datetime.now().strftime("%H:%M:%S") @@ -1102,34 +1517,28 @@ def _append_trace(self, event_type: str, detail: str = "") -> None: self._refresh_trace_chip() @work(exclusive=True, name="agent_chat") - async def _run_agent(self, prompt: str, thinking: SystemMessage, live_response: AgentMessage) -> None: + async def _run_agent(self, prompt: str, live_response: AgentMessage) -> None: log = self.query_one("#chat_log", VerticalScroll) + self.state.busy = True + self._refresh_status() chunks: list[str] = [] - first_chunk = True header_ts = datetime.now().strftime("%H:%M:%S") reasoning_widget: Optional[ReasoningMessage] = None current_raw = "" self._append_trace("interaction_start", prompt[:120]) async def on_stream_chunk(chunk: str) -> None: - nonlocal first_chunk if not chunk: return nonlocal reasoning_widget, current_raw chunks.append(chunk) current_raw = "".join(chunks) - if first_chunk: - first_chunk = False - try: - thinking.remove() - except Exception: - pass reasoning, answer = _extract_reasoning_and_answer(current_raw) if reasoning: if reasoning_widget is None: reasoning_widget = ReasoningMessage("") log.mount(reasoning_widget, before=live_response) - reasoning_widget.update(Text(f"Thinking: {reasoning[:2500]}", style="dim italic")) + reasoning_widget.update(Text(reasoning[:2500], style="dim italic")) live_response.update(self._render_agent_markdown(header_ts, answer or "")) async def on_trace_event(*args) -> None: event_type = "trace" @@ -1150,21 +1559,29 @@ async def on_trace_event(*args) -> None: break self._append_trace(event_type, ", ".join(detail_parts)) try: + # Reference prior conversation so the model isn't left to guess: + # the context query pulls related memory AND the last turns keep + # the model grounded in what was already said. + history = [] + for p, r in (getattr(self.state, "conversation_turns", None) or []): + history.append({"role": "user", "content": p}) + if r: + history.append({"role": "assistant", "content": r}) + context_query = self.state.build_context_prompt() response = await self.state.agent.run( prompt, target="user", on_stream_chunk=on_stream_chunk, on_trace_event=on_trace_event, + history=history or None, + context_query=context_query or None, ) if not chunks: - try: - thinking.remove() - except Exception: - pass raw = response or "" reasoning, answer = _extract_reasoning_and_answer(raw) if reasoning: - reasoning_widget = ReasoningMessage(f"Thinking: {reasoning[:2500]}") + reasoning_widget = ReasoningMessage("") + reasoning_widget.update(Text(reasoning[:2500], style="dim italic")) log.mount(reasoning_widget, before=live_response) live_response.update(self._render_agent_markdown(header_ts, answer or "")) self.state.last_agent_response = answer or "" @@ -1190,60 +1607,25 @@ async def on_trace_event(*args) -> None: session["total_tokens_est"] += est_prompt_tokens + est_output_tokens if isinstance(est_cost_usd, (int, float)): session["estimated_cost_usd"] += float(est_cost_usd) - self._refresh_metrics_bar() + self._refresh_status() + # Record the turn for the context panel + rolling session context. + self.state.conversation_turns.append((prompt, self.state.last_agent_response)) + self.state.update_session_context(prompt, self.state.last_agent_response) main_screen = self.screen if isinstance(main_screen, MainScreen): main_screen.refresh_session_footer() + main_screen.refresh_context_panel() except asyncio.CancelledError: - try: - thinking.remove() - except Exception: - pass live_response.remove() log.mount(SystemMessage("⏹ Cancelled.")) self._append_trace("interaction_cancelled") except Exception as e: - try: - thinking.remove() - except Exception: - pass live_response.remove() log.mount(SystemMessage(f"❌ {e}")) self._append_trace("interaction_error", str(e)) finally: - log.scroll_end(animate=False) - - async def on_button_pressed(self, event: Button.Pressed) -> None: - bid = event.button.id - log = self.query_one("#chat_log", VerticalScroll) - if bid == "chat_save_skill_btn": - await self._handle_skill_command("/skill save skill_from_chat", log) - log.scroll_end(animate=False) - return - if bid == "chat_toggle_trace_btn": - self.action_toggle_trace_panel() - return - if bid == "chat_copy_btn": - self._copy_last_response() - return - if bid == "chat_stats_btn": - m = self.state.last_turn_metrics or {} - if not m: - self.notify("No interaction stats yet. Send a message first.", severity="warning") - return - cost = m.get("estimated_cost_usd") - cost_text = "$0.00 (local model)" if cost == 0.0 else "N/A" - msg = ( - f"πŸ“Š Last turn β€” promptβ‰ˆ{m.get('prompt_tokens_est', 0)} tok, " - f"outputβ‰ˆ{m.get('output_tokens_est', 0)} tok, " - f"totalβ‰ˆ{m.get('total_tokens_est', 0)} tok, costβ‰ˆ{cost_text}" - ) - log.mount(SystemMessage(msg)) - s = self.state.session_metrics - log.mount(SystemMessage( - f"πŸ“¦ Session β€” turns={s.get('turns', 0)}, totalβ‰ˆ{s.get('total_tokens_est', 0)} tok, " - f"costβ‰ˆ${s.get('estimated_cost_usd', 0.0):.4f}" - )) + self.state.busy = False + self._refresh_status() log.scroll_end(animate=False) async def _handle_skill_command(self, text: str, log: VerticalScroll) -> None: @@ -2407,7 +2789,7 @@ async def on_button_pressed(self, event: Button.Pressed) -> None: elif bid == "btn_toggle_activity_rail": try: if isinstance(self.app.screen, MainScreen): - self.app.screen.action_toggle_activity_rail() + self.app.screen.action_toggle_context_panel() rail_state = "ON" if self.state.show_activity_rail else "OFF" self.query_one("#settings_activity_rail", Label).update(f" Status: {rail_state} (Ctrl+B)") except Exception: @@ -2440,32 +2822,6 @@ class MotionTUI(App): color: $text-muted; padding: 0 1; } - TabbedContent { height: 1fr; } - Tabs { - background: $background; - height: 3; - border-bottom: blank; - } - Tabs > Tab { - padding: 0 2; - color: $text-muted; - background: $background; - border: blank; - } - Tabs > Tab:hover { - color: $text; - background: $surface; - } - Tabs > Tab.-active { - color: $text; - background: $surface; - border-bottom: solid $primary; - text-style: bold; - } - TabPane { - background: $background; - padding: 0 0; - } """ BINDINGS = [ From 178c1aed182118550d01645889a74ca50d743cdc Mon Sep 17 00:00:00 2001 From: Mathitz Date: Sun, 9 Aug 2026 02:00:01 -0300 Subject: [PATCH 8/8] Remove variants --- docs/ui-variants/a1-soft-cards.svg | 26 ------------- docs/ui-variants/a1-soft-cards.svg.png | Bin 77185 -> 0 bytes docs/ui-variants/a2-flat-transcript.svg | 29 --------------- docs/ui-variants/a2-flat-transcript.svg.png | Bin 81547 -> 0 bytes docs/ui-variants/a3-quiet-ops.svg | 37 ------------------- docs/ui-variants/a3-quiet-ops.svg.png | Bin 84916 -> 0 bytes docs/ui-variants/r1-balanced-rounded.svg | 29 --------------- docs/ui-variants/r1-balanced-rounded.svg.png | Bin 77019 -> 0 bytes docs/ui-variants/r2-soft-rounded.svg | 28 -------------- docs/ui-variants/r2-soft-rounded.svg.png | Bin 78656 -> 0 bytes docs/ui-variants/r3-ops-rounded.svg | 33 ----------------- docs/ui-variants/r3-ops-rounded.svg.png | Bin 79130 -> 0 bytes 12 files changed, 182 deletions(-) delete mode 100644 docs/ui-variants/a1-soft-cards.svg delete mode 100644 docs/ui-variants/a1-soft-cards.svg.png delete mode 100644 docs/ui-variants/a2-flat-transcript.svg delete mode 100644 docs/ui-variants/a2-flat-transcript.svg.png delete mode 100644 docs/ui-variants/a3-quiet-ops.svg delete mode 100644 docs/ui-variants/a3-quiet-ops.svg.png delete mode 100644 docs/ui-variants/r1-balanced-rounded.svg delete mode 100644 docs/ui-variants/r1-balanced-rounded.svg.png delete mode 100644 docs/ui-variants/r2-soft-rounded.svg delete mode 100644 docs/ui-variants/r2-soft-rounded.svg.png delete mode 100644 docs/ui-variants/r3-ops-rounded.svg delete mode 100644 docs/ui-variants/r3-ops-rounded.svg.png diff --git a/docs/ui-variants/a1-soft-cards.svg b/docs/ui-variants/a1-soft-cards.svg deleted file mode 100644 index 07712e5..0000000 --- a/docs/ui-variants/a1-soft-cards.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - A1 β€” Soft Cards - - - - - - - - - - - - - - - - - - - - - Soft contrast cards + thin role rule + muted framing - diff --git a/docs/ui-variants/a1-soft-cards.svg.png b/docs/ui-variants/a1-soft-cards.svg.png deleted file mode 100644 index a180245ed39e29b826ec99f1056d08d97824bfd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77185 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 z 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 - - - A2 β€” Flat Transcript - - - - - - - - - - - - - - - - - - - - - - - - Transcript-first flow + minimal card treatment + ultra-quiet controls - diff --git a/docs/ui-variants/a2-flat-transcript.svg.png b/docs/ui-variants/a2-flat-transcript.svg.png deleted file mode 100644 index 9bdd0e986fa50e81e62849368888b48f0be2c18b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81547 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 diff --git a/docs/ui-variants/a3-quiet-ops.svg b/docs/ui-variants/a3-quiet-ops.svg deleted file mode 100644 index 8e996dd..0000000 --- a/docs/ui-variants/a3-quiet-ops.svg +++ /dev/null @@ -1,37 +0,0 @@ - - - - A3 β€” Quiet Ops - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Calm base + stronger operational side-context (trace + activity) - diff --git a/docs/ui-variants/a3-quiet-ops.svg.png b/docs/ui-variants/a3-quiet-ops.svg.png deleted file mode 100644 index c54877b79de5fe77a3841b5ff0531067a46d6d26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84916 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 LuU4XB_4GdggAJGW diff --git a/docs/ui-variants/r1-balanced-rounded.svg b/docs/ui-variants/r1-balanced-rounded.svg deleted file mode 100644 index 9416e6b..0000000 --- a/docs/ui-variants/r1-balanced-rounded.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - - R1 β€” Balanced Rounded - - - - - - - - - - - - - - - - - - - - - - - - Medium radius, clean bubbles, minimal separators - diff --git a/docs/ui-variants/r1-balanced-rounded.svg.png b/docs/ui-variants/r1-balanced-rounded.svg.png deleted file mode 100644 index 0c4c34711f8059b84f42fc2607deeafdc40b39ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77019 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

)po&lz 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 diff --git a/docs/ui-variants/r2-soft-rounded.svg b/docs/ui-variants/r2-soft-rounded.svg deleted file mode 100644 index 8e172db..0000000 --- a/docs/ui-variants/r2-soft-rounded.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - R2 β€” Soft Rounded - - - - - - - - - - - - - - - - - - - - - - - Large radius, soft grouping, almost no hard lines - diff --git a/docs/ui-variants/r2-soft-rounded.svg.png b/docs/ui-variants/r2-soft-rounded.svg.png deleted file mode 100644 index b163b03791264944b617b7b033fc5668b7cae1e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78656 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

UL_D8b!1(~Z3$ijsVbe@Tc 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

-`r9@!HC)LI(B>lNm}iXCLC&fWXFh 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 - - - R3 β€” Ops Rounded - - - - - - - - - - - - - - - - - - - - - - - - - - - - Rounded bubbles + stronger ops context without line overload - diff --git a/docs/ui-variants/r3-ops-rounded.svg.png b/docs/ui-variants/r3-ops-rounded.svg.png deleted file mode 100644 index d46ff94d84db7d6a2815c437b67130e434b01370..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79130 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 E0Sk$A+yDRo