When OpenClaw CLI prints debug log lines (e.g. "[plugins] [debug] ...")
to stdout before JSON, extractJson() failed because bracketed log lines
look like JSON array starts. Now tries each candidate position until one
actually parses. Also fixes the onboarding wizard to show a specific
"CLI log output" error instead of the misleading "Could not reach
gateway" message when /api/crons fails due to JSON parsing. Bumps to
v0.8.6.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add 5s in-memory TTL cache to loadRegistry() and getCrons() to eliminate
duplicate execSync CLI calls on page load. Memoize dagre layout in OrgMap
so agent selection changes only restyle nodes instead of recomputing
positions. Includes agents-provider, useAgents hook, fingerprint API,
and GlobalSearch refactors. Bumps to v0.8.4.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The wizard checked localStorage before verifying the server-side onboarded
flag, so users who moved their workspace (or upgraded OpenClaw) were stuck
with no wizard and had to use incognito to re-configure. Now the wizard
always validates with the server and clears the stale localStorage flag
when the workspace has changed.
Also adds GitHub PR/issue templates, English-first and scope boundary
policies in CONTRIBUTING.md, OpenClaw integration docs, and updates test
counts across all docs.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add click-and-drag repositioning to the LiveStreamWidget with position
persistence via localStorage settings. Add dashboard screenshots to
README from the marketing site.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add model: string | null to Agent type, enriched from openclaw agents
list --json. Chat routes use agent.model with claude-sonnet-4-6 fallback.
Model badge shown on agent detail, chat header, and org map nodes when
CLI data is available.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
JSONL-based conversation storage (mirrors kanban chat-store pattern) with
background merge on load and fire-and-forget writes. Conversations now sync
across devices automatically. Includes cross-device onboarding flag, "Synced"
indicator in chat header, and "Clear Server Data" button in settings.
Based on #8 by @raphfeuer with review fixes applied: agent ID validation in
lib layer, Promise.all for parallel fetches, unlinkSync for cleanup,
lightweight listAgentIds, MAX_MESSAGES cap, and 26 new tests.
Co-Authored-By: raphfeuer <raphfeuer@users.noreply.github.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add OPENCLAW_GATEWAY_PORT env var support (default 18789) — auto-detected
from openclaw.json during setup, all API routes use gatewayBaseUrl() helper
- Redesign AI Cost Analysis as "Agent Optimizer" with action chips, structured
prompts for Max plan users, and follow-up suggestions
- Fix renderMarkdown to handle fenced code blocks (extract before escape,
reinsert after rules)
- Rewrite buildCostAnalysisPrompt: throughput-focused, structured response
format, 350 word cap
- Fix efficiency score using effective input (input + cache tokens)
- Unified OptimizationCard with UUID resolution and responsive layout
- Update all docs and in-app help to mention configurable port
- Remove auto-scroll from cost analysis chat
- Change insight button from "Fix" to "How to fix"
Closes#9
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Break CostsPage (1500 lines) into 8 sub-components under components/costs/
- Add sidebar usage widget showing Claude Code 5-hour and weekly utilization
- Fix usage API: never cache zeros, retry on 429 with backoff, hide when unavailable
- Remove system theme option (dark/glass/color/light only)
- Compact sidebar nav (36px items, scrollable nav area, pinned footer)
- LiveStreamWidget: always visible as collapsed pill, play/pause on pill
- Live logs: add search bar and level filter pills (INF/WRN/ERR/DBG)
- Rename "Live Stream" to "Live Logs" throughout
- Weekly cap shows reset day instead of countdown
- Add PipelineDetailPanel and pipelines API route
- Add cron-utils with parseCronExpression and tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add real-time subscription utilization (5-hour window + weekly cap)
via SSE stream from Anthropic OAuth API. Collapse insights to top 2
with expand toggle, and apply Apple HIG polish (hover lift, chart
depth, tabular-nums, mobile responsive usage cards).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds optimization scoring (cache, tiering, anomaly, efficiency), actionable
insights with projected savings, inline AI cost analysis with streaming chat,
and "Fix" buttons that send targeted prompts to the root agent. 12 new tests.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Render health check response using renderMarkdown() instead of raw
pre-wrap text — headings, bold, lists, and inline code now styled
- Derive quick-action buttons from actual cron/pipeline data:
- "Fix N errored jobs" (red) — when jobs are in error state
- "Assign N unowned jobs" (orange) — when jobs lack an agent owner
- "Fix N missing delivery targets" (orange) — when delivery has no 'to'
- "Investigate N overdue jobs" (orange) — when jobs are past next run
- "How can I improve reliability?" (accent) — fallback when all is healthy
- Each button sends a targeted prompt to the inline chat with specific
job names and context, triggering the agent to diagnose and suggest fixes
- Increased maxHeight from 300 to 400 for the formatted content
- Refactored sendHealthChatMessage to accept optional override text
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Step 0 (setup):
- Visual card showing cron count + agent emoji with numbered steps
explaining what the agent will do (read jobs, infer deps, generate config)
- Time expectation banner that scales with cron count: "15-30s" for small,
"30-60s" for medium, "a minute or more" for 20+ jobs
- Agent selector demoted to secondary, AI icon added to analyze button
Step 1 (analysis):
- Progress banner with spinner, phase text that evolves:
"Connecting to agent..." -> "Mapping job dependencies..." -> "Finalizing..."
- Live elapsed timer so user knows it's still working
- Shimmer skeleton before first chunk arrives (replaces bare "Waiting...")
- Blinking cursor on streamed text
- Green "Analysis complete" banner when done with contextual next-step hint
- Header subtitle updates dynamically during streaming vs review
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add inline chat below health check results so users can discuss findings
with the root agent without leaving the panel (same SSE pattern as
PipelineDetailPanel)
- Thread agent ownership into health check prompt -- each job shows its
owning agent name or "UNOWNED", and the AI flags unowned jobs
- Add "Clear Pipelines" button to reset to the empty/setup state
- Improve streaming UX: spinner + skeleton before first chunk, pulsing dot
in header, green "Complete" badge when done
- Add pipeline-utils with tests (56 tests covering layout, prompt builder,
context builder, ownership)
- Update CLAUDE.md with pipeline architecture docs, new component table,
API routes, and updated test counts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- shouldShowAvatar/shouldShowTimestamp now skip system messages and
look through to the previous non-system message for comparison,
preventing avatar re-display and spurious timestamp dividers
- Role-switch spacing skips system messages so they don't create
visual gaps between consecutive assistant messages
- Skip media parsing and text stripping for system messages since
they only contain slash command output
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Introduce client-side slash commands (/clear, /help, /info, /soul,
/tools, /crons) with an autocomplete dropdown in the chat input.
- New lib/slash-commands.ts with command registry, parser, matcher,
and executor
- Autocomplete dropdown appears when typing "/" with keyboard
navigation (arrow keys, Enter/Tab to select, Escape to dismiss)
- System messages render as accent-bordered cards, filtered from
API calls so they never reach the gateway
- 35 new tests covering all parser and executor paths
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace all crypto.randomUUID() calls with generateId() helper that
falls back to a Math.random-based UUID in non-secure contexts (HTTP,
older browsers). Fixes#1. Also sets the ClawPort logo as the default
sidebar icon in place of the lobster emoji.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace the Activity page's Feed tab with a global floating widget
that persists across page navigation. Clean top-level view with
level pills (INF/WRN/ERR/DBG) and truncated messages; click any
row to expand the raw JSON payload. Widget states: hidden, collapsed
pill, and expanded panel with play/pause, copy, and auto-scroll.
- Create components/LiveStreamWidget.tsx (global floating widget)
- Mount in app/layout.tsx alongside OnboardingWizard
- Simplify Activity page: remove tabs, render LogBrowser directly,
add "Open Live Stream" button dispatching custom DOM event
- Delete components/activity/ActivityFeed.tsx (replaced by widget)
- Add raw field to LiveLogLine type for expandable detail view
- Add lib/sse.ts (SSE buffer parser, client-safe)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Two-tab Activity Console for real-time gateway monitoring and historical
log browsing. Live Feed streams via SSE from `openclaw logs --follow --json`.
Log Browser parses cron run + config audit JSONL files with filter pills,
text search, and expandable detail rows. Includes 21 unit tests.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace flat BFS org map with dagre-based auto-layout. Two modes:
Hierarchy (full tree) and Teams (grouped columns with labels).
Richer agent cards show description, tool count, reports, cron health.
Extract shared buildTeams() into lib/teams.ts for GridView + OrgMap reuse.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The /api/crons route now returns { crons, pipelines } instead of a plain
array. The crons page already handled both formats, but the home page,
agent detail page, NavLinks, and GlobalSearch assumed a plain array.
All consumers now normalize the response with backward compat for both
formats.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Agent registry now auto-discovers agents from $WORKSPACE_PATH/agents/
instead of requiring a manual agents.json or falling back to bundled
defaults. Resolution: user override -> auto-discover -> bundled fallback.
Cron-to-agent matching is now dynamic (by agent ID prefix) instead of
using a hardcoded PREFIX_MAP tied to the developer's specific agents.
Also includes: kanban robustness (timeouts, concurrent limits, input
validation, dedup, stale work recovery), onboarding name input moved
to step 1, operator name on settings page, agent profile image upload,
TTS speaker icon removed, npm install troubleshooting docs.
298 tests passing (up from 288).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Change default accent from gold (#F5C518) to red (#EF4444) across
all five themes with proper white contrast text
- Move Red to top of accent color presets in onboarding and settings
- Add callouts in README, SETUP, CLAUDE.md, and in-app docs clarifying
that the npm package is clawport-ui but the CLI command is clawport
(the separate clawport npm package is unrelated)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Users can now run ClawPort after `npm install -g clawport-ui` via the
`clawport` command (dev, start, setup, status, help). The CLI resolves
its own package root so commands work from any directory.
- Add bin/clawport.mjs with subcommands
- Add bin field to package.json
- Add --cwd flag to scripts/setup.mjs for CLI usage
- Update README, SETUP, CLAUDE.md, and in-app docs
- Add BestPracticesSection and npm troubleshooting to docs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add MIT LICENSE file
- Rename ManorMap.tsx → OrgMap.tsx and update all imports
- Fix package.json repository/bugs URLs to JohnRiceML/clawport-ui
- Fix README clone URL to match actual repo
- Null out all ElevenLabs voice IDs in bundled agents.json (move to
workspace override for custom voices)
- Update BRANDING.md references
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add missing icons to every actionable button across the app for a more
polished feel. Also introduce dynamic text contrast on accent-colored
backgrounds so dark accents (red, purple, indigo) get white text
automatically via WCAG luminance calculation.
- ErrorState: RotateCcw icon on Try Again, add focus-ring + btn-scale
- Memory: RefreshCw, Copy/Check, Download icons on toolbar buttons
- Crons: RefreshCw refresh, BarChart3/Calendar/GitBranch tab icons,
Copy/Check on error copy buttons
- Home: Map/LayoutGrid/List view switcher icons, X close icon,
MessageSquare + btn-scale on Message, User + btn-scale on Profile
- Kanban: Plus icon on New Ticket, add btn-scale
- Settings: RotateCcw on Reset to Default + Re-run Setup, Trash2 on
Reset All Settings, btn-scale on CTAs
- Onboarding: ArrowLeft/ArrowRight/Rocket/RotateCcw on nav buttons
- New hexToContrastText() in lib/settings.ts (WCAG 2.0 luminance)
- --accent-contrast CSS var set in all 5 theme blocks + settings provider
- All hardcoded #000 on accent backgrounds replaced with var(--accent-contrast)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
7-step onboarding wizard (welcome, system check, naming, theme, accent,
voice input, overview) with live previews and OpenClaw health checks.
Add operatorName to settings — replaces all hardcoded "John Rice" references
in sidebar, chat prompts, and system messages with dynamic operator name.
Rebrand user-facing strings from "Manor" to "Agent Claw" with BRANDING.md
documenting every reference for future rebranding.
Open-source readiness: configurable agent registry (workspace override),
requireEnv() for safe env access, npm run setup auto-detection script,
SETUP.md guide, and comprehensive developer documentation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The mic/voice message feature wasn't working reliably so removing it
entirely: recording UI, transcribing state, VoiceMessage waveform
rendering, plain audio player, and mic button. Chat now always shows
the send button. File and image attachments remain.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add Map/Grid/Feed view switcher to the Manor Map page with a floating
segmented control. GridView shows agents grouped by team in card columns
with colored accents and hierarchy. FeedView shows a reverse-chronological
cron activity timeline with stat cards and filter pills.
Add emoji-only avatar toggle and logo background toggle to Settings >
Branding. Add DynamicFavicon component that syncs the manor logo to the
browser tab icon. Fix light theme text readability by bumping tertiary
and quaternary text opacity. Fix SSR hydration mismatch by deferring
localStorage reads to useEffect. Fix detail panel positioning with
explicit inline styles.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace localStorage-based chat storage with per-ticket JSONL files at
~/.openclaw/kanban/chats/{ticketId}.jsonl, eliminating the 5MB cap and
surviving browser data clears.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a full settings page (/settings) with four sections:
- Accent Color: 12 preset swatches + custom color picker, overrides CSS vars
- Branding: custom name, subtitle, emoji, and icon image for the sidebar
- Agent Customization: per-agent emoji and profile image overrides
- Reset All: destructive reset to defaults
New files: SettingsProvider context, AgentAvatar component, settings
types/helpers with tests. Replaces hardcoded gold accent rgba values
in globals.css and button.tsx with CSS var references. All settings
persist in localStorage (manor-settings key).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Map nodes get color accent border, inline emoji+name, description snippet,
and inline cron health row. Detail panel redesigned with centered hero header,
grouped inset sections (iOS Settings pattern), navigation rows with chevrons,
and capability list rows.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Detail panels (agent map + kanban) were flex children that shrank main
content on desktop. Now they overlay from the right edge with a slide
animation, leaving content at full width.
- Add panelSlideIn keyframe + .panel-slide-in / .backdrop-fade classes
- Switch both panels from md:relative to md:absolute overlay positioning
- Remove permanent 360px empty-state panel that stole map space
- Remove legend right-offset hack (panel no longer pushes content)
- Add left-edge shadow for depth on overlay panels
- Improve formatContent: code blocks, headings, numbered lists,
inline bold/code rendering for agent work results
- Pass workResult context to agent chat for follow-up awareness
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Full kanban board (backlog/todo/in-progress/review/done) with drag-and-drop,
agent chat, and automated agent work. Assigning an agent and moving a ticket
to "To Do" triggers the agent to auto-pick it up, stream role-based work
(Lead Dev/UX-UI/QA), save the result to the ticket, and move to "Review".
Work result displays prominently in the detail panel's top section.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Resize images to 1200px max before base64 encoding (fits 1MB ARG_MAX)
- Revert sendViaOpenClaw from broken WebSocket to execFile CLI approach
(WebSocket requires device keypair auth for operator.write scope)
- Only check latest user message for images, not full history
(prevents text messages from routing through image path after an image was sent)
- Add clear chat button, TDD tests for sendViaOpenClaw (6 new tests)
- Minor Tailwind class consolidation in layout components
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Images sent in chat now go through the gateway's WebSocket agent pipeline
(chat.send + chat.history) instead of the /v1/chat/completions endpoint
which strips multimodal content. This is the same path Discord/Telegram
use, requires only the gateway token -- no separate Anthropic API key.
Also adds transcription module (lib/transcribe.ts) with clear fallback
messaging when Whisper fails, and integration tests for the full image
pipeline.
146 tests passing, 0 type errors.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Extract buildApiContent to lib/multimodal.ts for testability. Add 43 new
tests covering: multimodal message building (images, files, audio, mixed
media, text file inlining), validation of content parts and legacy wrapper,
and audio-recorder utilities (formatDuration, estimateStorageSize).
111 tests total, all passing.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Images attached by users are now sent to the agent as OpenAI vision
content parts so the model can actually see them. Text files are inlined,
binary files described. Validation updated to accept multimodal content arrays.
Added /api/tts endpoint (OpenAI TTS via gateway) and a speaker button on
assistant messages for on-demand text-to-speech playback.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Voice recording with waveform playback (tap-to-record, cancel/send buttons),
file attachment bubbles with type icons and download, image paste/drag-and-drop,
pre-send attachment preview strip, and base64 persistence for all media types.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- /chat unified two-panel layout: agent list left, conversation right
- 20 agents in sidebar, sorted by recency, unread badges, last msg preview
- Conversations persist in localStorage across refreshes
- Streaming chat with full markdown rendering (code, bullets, bold, etc)
- Image attachments: render inline with click-to-open
- Audio attachments: native <audio> player inline in messages
- File upload via 📎 button (image/audio)
- /chat/[id] redirects to /chat?agent=[id] for backward compat
- URL syncs to ?agent=id as you switch threads