2009 Commits

Author SHA1 Message Date
Eric
7b279aaffb fix: typing dots visibility, ChatGPT-style animations, provider back to header
Typing Indicator:
- Root cause: streaming placeholder counted as assistant message, making
  showTypingIndicator think a response already existed
- Now checks if last assistant message has actual content vs empty placeholder
- iMessage bouncing dots will show reliably after sending

ChatGPT-style Animations:
- New messages fade in with slide-up (message-fade-in 0.4s)
- Streaming messages get subtle orange shimmer glow (streaming-shimmer)
- Glow wraps the message bubble via ::before pseudo-element

Layout:
- Provider usage (Claude MAX pill) moved back to top-right of chat header
- Context bar is now single clean line (context only, no provider)
- Hover popover shows context details (%, tokens, model, warnings)
2026-02-11 00:32:50 -05:00
Eric
348c08620b fix: mode dialog input focus loss + dual-bar context/provider display
Mode Dialog:
- Root cause: chat composer useLayoutEffect stole focus on every disabled
  change via focusPrompt() — now only triggers on focusKey (session switch)
- Memoized SaveModeDialog with React.memo
- Stabilized onSave/onClose callbacks with useCallback
- Focus trap effect now has stable deps

Context Bar:
- Two stacked thin bars: top = context usage, bottom = provider usage
- Provider bar uses highest % across all limits (orange brand color)
- Both bars: green < amber (50%) < red (75%)
- Hover popover shows full details for both
- Click through to usage details modal
2026-02-11 00:28:16 -05:00
Eric
ae78a0df60 feat: full-width context bar with hover popover
- Context bar now spans entire chat width as thin 6px progress bar
- No text visible by default - clean, minimal appearance
- Hover reveals detailed popover with:
  - Context window % + token counts + model name
  - Provider usage (Claude MAX) with mini progress bars per limit
  - Critical warnings at 90%+
  - Click-through to full usage details modal
- Color transitions: emerald < amber (50%) < red (75%+)
- Fills left-to-right like a loading bar as context grows
2026-02-11 00:23:41 -05:00
Eric
dda81fbcff fix: typing indicator, mode selector errors, iMessage-style dots
Typing Indicator:
- Fixed "Thinking" bubble never appearing (hasText incorrectly included isStreaming)
- Show typing dots when waitingForResponse even during streaming with no visible text
- iMessage-style bouncing dots (3 circles with staggered animation)
- TypingIndicator now shows assistant avatar alongside dots
- Added typing-bounce keyframe animation in styles.css

Mode Selector:
- Fixed use-modes.ts accessing settings properties on wrong object level
- Fixed applyMode using non-existent setter methods (now uses updateSettings)
- Fixed TS null-check errors in dialog components
- Fixed outside-click handler closing menu when clicking into save dialog

Misc:
- Removed unused variables in message-item.tsx
2026-02-11 00:19:56 -05:00
Eric
937dfc3f39 branded avatars matching hero logo family - assistant orange claw brackets, user dark slate with orange person 2026-02-11 00:10:11 -05:00
Eric
be29dc969e feat: unified context bar, typing indicator fix, profile avatars, auto-rename fix
Context Bar:
- Merged provider usage pill (Claude MAX) into right side of context bar
- Model name shown in center to fill whitespace
- Removed standalone UsageMeter from ChatHeader
- Clicking provider pill opens full usage details modal

Typing Indicator:
- Fixed 'Thinking' indicator never showing (hasText included isStreaming)
- Keep streaming placeholder in 'streaming' status during history polling
- Users now see 'Thinking...' + cursor while waiting for response

Profile Avatars:
- AssistantAvatar: orange circle with terminal cursor icon
- UserAvatar: neutral circle with person silhouette
- Both shown next to every message bubble (24px)

Auto-Rename:
- Raised message limit from 5 to 50 (tries harder for older sessions)
- Min messages reduced from 3 to 2 (titles sooner)
- Detects generic titles ('A new session...', 'New Session', hash-based) and re-generates
- isGenericTitle() helper with pattern matching
2026-02-11 00:07:42 -05:00
Eric
16b859f4ef feat: context usage bar in chat view
- New /api/context-usage endpoint computes context % from gateway data
- ContextBar component shows thin progress bar below chat header
- Color-coded thresholds: green (<50%), amber (50-75%), red (75%+)
- Shows warning text at 50%/75%/90% with dismiss button
- Token count display (e.g. 134K/200K) on non-compact views
- Polls every 15s, works in both full and compact (panel) mode
- Estimates context from static overhead + cache-per-turn heuristic
2026-02-10 23:51:14 -05:00
Eric
f47075f1a3 fix: disable fake streaming animation — eliminates ghost orange loading icons on old messages 2026-02-10 23:40:12 -05:00
Eric
81ff891df6 fix: ignore stale __streamingStatus from history — prevents ghost streaming indicators on old messages 2026-02-10 23:38:43 -05:00
Eric
44a18b8ab3 fix: disable virtualization (scroll glitches), clean system messages, compact tool-only messages 2026-02-10 23:37:40 -05:00
Eric
4f004ae5f1 fix: strip [[reply_to:]] tags from assistant messages, rename Lobster branding to neutral 2026-02-10 23:29:58 -05:00
Eric
93d0e2766a feat: clean user messages — strip system metadata, improve bubble styling (ChatGPT-like) 2026-02-10 23:28:01 -05:00
Eric
363ec47f87 fix: increase scroll padding for composer — use 140px fallback + 24px buffer to prevent content cutoff 2026-02-10 23:23:05 -05:00
Eric
d6b0e01e34 fix: scroll-to-bottom button uses absolute (container-relative) instead of fixed (viewport-center); force 420px max-width on all chat panel content layers 2026-02-10 23:16:45 -05:00
Eric
9b72e14144 feat: backdrop overlay + click-outside-to-close for chat panel on narrow screens 2026-02-10 23:12:44 -05:00
Eric
7913007867 fix: chat panel overlays on narrow screens (<1200px), inline on wide — prevents content squeeze 2026-02-10 23:11:49 -05:00
Eric
f58b851f3c fix: use min(768px, 100%) for chat content max-width — prevents overflow in narrow panels 2026-02-10 23:04:03 -05:00
Eric
10f1509328 fix: chat panel width containment — override sm:max-w-768, add overflow-x-hidden, CSS containment 2026-02-10 23:01:38 -05:00
Eric
fbc598c90d fix: chat panel overflow — remove min-w-[400px], reduce padding for narrow panels, add word-break to markdown 2026-02-10 22:56:47 -05:00
Eric
8061f896c5 feat: chat panel session switcher — title click opens session list, new chat button, key-based remount 2026-02-10 22:53:30 -05:00
Eric
90a9730deb feat: compact mode for ChatScreen in panel — hide header, file explorer, terminal, agent view 2026-02-10 22:51:54 -05:00
Eric
c51b89c487 feat: split-pane chat panel — chat accessible from any page
- ChatPanel component: collapsible right panel with full ChatScreen
- ChatPanelToggle: floating orange button on non-chat routes
- Cmd/Ctrl+J keyboard shortcut to toggle
- Workspace store: chatPanelOpen + chatPanelSessionKey (persisted)
- WorkspaceShell: 3-column grid on non-chat routes
- Expand button to jump to full chat view
2026-02-10 22:51:01 -05:00
Eric
a73aadc605 feat: proper gateway page UIs — tables, cards, stats replacing raw JSON
- Channels: table with status dots, running/stopped, mode, errors
- Sessions: table with kind badges, model, origin, relative timestamps
- Agents: config summary + card grid, default agent highlighted
- Usage: stat cards (total cost, tokens) + cost breakdown table
- Nodes: table with status, platform, version, last seen
- All pages: loading spinner, error/retry, polling, status indicator
2026-02-10 22:09:45 -05:00
Eric
54dadbe8b3 fix: remove invalid includeContextWeight param from sessions.list RPC 2026-02-10 21:56:10 -05:00
Eric
095b70c878 fix: file explorer crash on broken symlinks + filter heavy dirs
- Wrap fs.stat in try/catch to skip broken symlinks (was crashing on
  browser-profile/RunningChromeVersion)
- Filter node_modules, .git, .next, .cache, dist, etc from tree
- Cap recursion depth at 8 levels
- Workspace root already defaults to ~/.openclaw/workspace (gateway workspace)
2026-02-10 21:51:42 -05:00
Eric
475ddc3c22 fix: lazy-load terminal workspace to prevent xterm SSR crash
xterm requires 'self' (browser global) which doesn't exist during SSR.
Wrap TerminalWorkspace in lazy() + Suspense to defer loading to client.
2026-02-10 21:48:01 -05:00
Eric
62bf0628cd feat: port upstream webclaw features — ⌘K command palette, conversation export, pinned sessions, context meter
Ported from ibelick/webclaw PRs #24, #10, #14, #13:
- Command palette (⌘K): search and switch sessions instantly
- Conversation export: download as Markdown, JSON, or Plain Text
- Pinned sessions: pin/unpin from context menu, shown at top of sidebar
- Context meter: token usage ring in chat header with hover details
- Keyboard shortcuts: ⌘K search, ⌘⇧O new session

New UI primitives: autocomplete, command, input, preview-card
Attachment button/preview components (composer already has built-in support)
2026-02-10 21:38:33 -05:00
Eric
d31b45a5f1 fix(sidebar): center-align icons when collapsed
Nav items: justify-center + px-0 when collapsed (was justify-start + px-3)
Header: justify-center when collapsed (was justify-between)
Footer settings button: same center alignment treatment
All icons now align on the same vertical axis in collapsed mode.
2026-02-10 21:21:28 -05:00
Eric
24111d8c09 cleanup: remove all Back to Chat/Dashboard buttons from sub-pages
Removed from: skills (Back to Chat), tasks (Back to Dashboard),
memory (BackToDashboard). Cleaned up unused imports (Link, ArrowLeft,
HugeiconsIcon, useNavigate) from affected files.

Sidebar handles all navigation now — zero redundant back buttons remain.
2026-02-10 21:19:16 -05:00
Eric
6502b7c2d0 cleanup: remove ModeSelector and BackToDashboard from all sub-pages
Sidebar is now persistent — no need for:
- Dashboard/Studio mode selector dropdown (removed from dashboard header)
- 'Back to Dashboard' buttons (removed from browser, cron, settings, providers, files)

ModeSelector component deleted from dashboard-screen.tsx.
BackToDashboard imports removed from 5 files.
2026-02-10 21:16:45 -05:00
Eric
bc97b4781e fix: convert all screens from min-h-screen to h-full overflow-y-auto
Sub-pages now fit inside WorkspaceShell's content area instead of
fighting for viewport height. Affected: dashboard, tasks, skills,
cron, debug, settings/providers, files.
2026-02-10 21:12:03 -05:00
Eric
2520d42419 feat: WorkspaceShell — persistent sidebar across all routes
Architecture change: sidebar is now owned by WorkspaceShell (root layout),
not by ChatScreen. All routes render inside the shell with sidebar always visible.

New files:
- src/components/workspace-shell.tsx — persistent layout with sidebar + Outlet
- src/stores/workspace-store.ts — Zustand store for sidebar/file-explorer state

Changes:
- __root.tsx: RootLayout renders WorkspaceShell instead of bare Outlet
- ChatScreen: removed sidebar ownership, uses workspace store for collapse state
  Now renders as just the chat content (header + messages + composer)
- Sub-pages (Dashboard, Skills+, Channels, etc.) all get sidebar for free

Layout: grid grid-cols-[auto_1fr] — sidebar on left, content fills rest.
Sidebar state persisted via Zustand persist (openclaw-workspace-v1).

Also: added Instances to Gateway sidebar section.
2026-02-10 21:11:07 -05:00
Eric
bd5777eebe feat(gateway): add Instances to sidebar, wire 5 gateway pages to live RPC data
Sidebar: added Instances (placeholder — no gateway RPC exists yet)

Gateway API proxy routes (all fetch live from gateway via WebSocket RPC):
- /api/gateway/channels → channels.status
- /api/gateway/sessions → sessions.list (limit 100, with context weight)
- /api/gateway/usage → sessions.usage + usage.cost
- /api/gateway/agents → agents.list
- /api/gateway/nodes → node.list

GatewayDataScreen component: reusable live data viewer with:
- Auto-polling (configurable interval)
- Connection status indicator (green/amber/red dot)
- Last updated timestamp
- Loading spinner → error state with retry button
- Recursive JSON tree renderer for raw gateway data

Routes updated: /channels, /sessions, /usage, /agents, /nodes
all now show live gateway data instead of placeholder.
/instances remains placeholder (no gateway endpoint).
2026-02-10 21:03:22 -05:00
Eric
eb6668399b refactor(sidebar): rebrand Studio-enhanced pages with + suffix, flatten to 3 sections
STUDIO section now contains all pages we built rich UI for:
- Dashboard, New Session, Search, Browser, Terminal, Tasks (core)
- Skills+, Cron+, Logs+, Debug+, Files+, Memory+ (Studio-enhanced)

GATEWAY section = raw control plane stubs (pending UI):
- Channels, Sessions, Usage, Agents, Nodes

SETTINGS section = Config + Providers only

Removed AGENT section (merged: enhanced items→Studio, raw items→Gateway)
The + suffix marks pages where we've built beyond default gateway views.
2026-02-10 20:50:25 -05:00
Eric
e2758c9ea8 feat(sidebar): add all Gateway Console IA items with placeholder routes
Gateway section now shows: Channels, Sessions, Usage, Cron Jobs
Agent section now shows: Agents, Skills, Nodes, Files, Memory

New placeholder routes: /channels, /sessions, /usage, /agents, /nodes
- All show 'coming soon' placeholder (gateway endpoints exist, UI pending)
- Placeholder component at src/screens/gateway/gateway-placeholder.tsx

Icons: Chat01 (Channels), UserMultiple (Sessions), ChartLineData01 (Usage),
UserGroup (Agents), SmartPhone01 (Nodes)
2026-02-10 20:38:00 -05:00
Eric
c5deb5ae81 fix(mode-selector): default label is Dashboard, Studio redirects to chat 2026-02-10 20:29:10 -05:00
Eric
92a90ed386 feat(sidebar): section headers navigate to last-visited route, rename Dashboard→Studio
- Mode selector renamed: Dashboard→Studio, Workspace→Dashboard
- Section headers (Studio, Gateway, Agent, Settings) are now clickable links
- Each header navigates to the last-visited route in that section
- Falls back to defaults: Studio→/dashboard, Gateway→/cron, Agent→/skills, Settings→/settings
- Last-visited routes persisted in localStorage (openclaw-sidebar-last-route)
- Chevron separated from label — chevron toggles collapse, label navigates
- Updated fallback preview text (Workspace→Studio)
2026-02-10 20:27:58 -05:00
Eric
5c64a5d26f refactor(sidebar): group nav into Studio/Gateway/Agent/Settings sections with parity audit
- Sidebar nav grouped into 4 collapsible sections matching Gateway Console IA
- STUDIO: Dashboard, New Session, Search, Browser, Terminal, Tasks
- GATEWAY (collapsed by default): Cron Jobs
- AGENT (expanded by default): Skills, Files, Memory
- SETTINGS (collapsed by default): Config, Debug, Logs + Providers sub-item
- All sections auto-expand when child route is active
- Collapse state persisted in localStorage
- Extracted NavItem, SectionLabel, CollapsibleSection components
- Labels renamed to match reference IA (Activity→Logs, Settings→Config)
- docs/GATEWAY_CONSOLE_PARITY.md: full audit of 15 reference items
  - 6 fully wired, 3 partially wired, 5 missing routes, 1 missing endpoint
  - Gateway endpoints exist for: Channels, Sessions, Usage, Agents, Nodes
  - Only Instances lacks a gateway RPC (cannot implement)
2026-02-10 20:23:35 -05:00
Eric
e51704c198 polish: visual hierarchy tiers + tasks de-emphasis + empty states
- DashboardGlassCard: added tier prop (primary/secondary/tertiary)
  with subtle padding, background, and border differences
- Active Agents + Cost Tracker → primary tier (more prominent)
- Usage Meter + Recent Sessions → secondary (default)
- Activity Log + Tasks → tertiary (compact, receded)
- Tasks widget: smaller typography (10px), tighter card spacing,
  muted backgrounds — doesn't compete with Active Agents
- Active Agents empty state: 'Sessions will appear here when running'
- Locked typography: 11px labels, 13px body, 15px emphasis
2026-02-10 19:27:09 -05:00
Eric
52011cb1f1 feat: notifications bell popover + move widget controls inline
- Notifications: bell icon in header with dropdown popup (replaces widget)
  Shows session lifecycle events, red dot on errors
- Moved '+ Widgets' and 'Reset' out of header → inline above grid
  Makes it clear these controls belong to the widget area
- Header now: logo + mode selector | time/weather | bell + theme + settings
- Widget controls show as text buttons: '+ Widgets' '↻ Reset'
2026-02-10 19:20:54 -05:00
Eric
830d93e6f3 fix: bust stale grid layout cache — bump storage keys to v3
Old localStorage cache was cramming new tasks widget into tiny cell.
Bumped layout key to v3 and widget visibility to v2 so existing users
get fresh defaults. Tasks widget upgraded to 'L' tier (full width).
2026-02-10 19:16:59 -05:00
Eric
b61d298f7e feat: Tasks in workspace sidebar + full mini-kanban widget
- Added Tasks nav item to workspace sidebar (between Cron and Files)
- Dashboard widget: mini-kanban showing all 4 columns with top 3
  tasks per status, priority badges, counts, '+N more' overflow
- Widget title shows 'X active · Y done' summary
- /tasks route accessible from both sidebar and widget 'View all'
2026-02-10 19:15:59 -05:00
Eric
3fb7438d3d feat: Task System Lite — Mission Control-inspired task management
Integrated task system built into Studio, zero backend dependencies:

- Zustand store (localStorage-backed) with real project data seeded
  from Mission Control: Studio tasks, MyAgencyLab, OpenClaw
- Dashboard widget: compact list view with status summary bar,
  priority badges, top 5 active tasks, 'View all →' link
- Full /tasks route: 4-column kanban board (Backlog → In Progress →
  Review → Done), add/edit/move/delete tasks, detail panel
- Task model: id, title, description, status, priority, project, tags

No new endpoints. No external dependencies. No demo badge.
2026-02-10 19:12:29 -05:00
Eric
eb6c7b39c3 polish: enterprise alignment pass — P0 + P1 changes
P0:
- Active Agents: strip system prompt text, remove hash IDs, remove progress
  bars, simplify to name + model pill + status dot + relative age
- Usage Meter: 5s timeout → 'No usage data available' [Retry] instead of
  perpetual spinner
- Tasks: hidden from default view (available via Widgets menu)

P1:
- Recent Sessions: cron → 'Scheduled task', empty → 'New session', clean
  titles (strip system prompt leaks, bracketed timestamps, message_ids)
- Notifications: hidden by default (duplicates Activity Log)
- Strip widget descriptions (subtractive — titles are self-evident)
- Usage meter + provider bars: neutral colors instead of amber (reserve
  orange for brand only)
- Active Agents status dots: emerald for running (not amber)
2026-02-10 18:51:56 -05:00
Eric
8b6a9006fc feat: dashboard UX lock-in — mode selector, header cleanup, widget rename, hover affordances
1. Replace 'Workspace →' button with Dashboard/Workspace mode dropdown
2. Clean up duplicate header controls, spacing-based visual grouping
3. Rename 'Add Widget' → 'Widgets', disable when all visible
4. Add hover arrow affordance to Recent Sessions rows
2026-02-10 18:14:39 -05:00
Eric
23acfb3527 Merge branch 'pr/widget-add-remove-mvp' 2026-02-10 18:12:33 -05:00
Eric
58fc261acd Merge PR #15: Final header cleanup — subtractive pass 2026-02-10 17:56:44 -05:00
Eric
de120af5b3 dashboard: final header cleanup — subtractive pass
- Status strip reduced to '● Connected · Opus 4.6' (removed session count + uptime — hero row owns those)
- Status text quieted to primary-400, model to primary-500
- Ambient time/weather: removed pill border + background, reduced to text-[11px] primary-400
- Workspace → CTA remains visually dominant (bordered, far right)
- No new features, data sources, or layout changes
2026-02-10 17:56:40 -05:00
Eric
157efa6f2e Merge PR #14: Header placement refinement — stacked status strip 2026-02-10 17:51:17 -05:00
Eric
6c0a58820c dashboard: stack status strip under brand name (two-line header)
- Left: Logo + flex-col title block (h1 line 1, status p line 2)
- Status strip always visible (not hidden on mobile), uses flex-col
- Right: time/weather text, icon group (theme/reset/settings), Workspace→ CTA
- No new features, data sources, or controls — layout + typography only
2026-02-10 17:51:11 -05:00