feat: Graphiti health probe + search-manager test fix#18
Closed
feat: Graphiti health probe + search-manager test fix#18
Conversation
* Review landing UX plan * Review landing UX documentation
* Web: redesign nodes/permissions UI with sleek collapsible sections, agent permissions sheet, and inherited value indicators * Web: add approvals target selector and per-agent node binding rows to nodes view * Web: replace stacked sections with tab layout + master-detail split for nodes page * Web: polish nodes UI (fix hooks ordering, unused imports, add 60 unit tests) --------- Co-authored-by: Claude <noreply@anthropic.com>
* docs: add landing page implementation plan synthesizing all UI/UX design docs * feat(web): implement /landing public product tour page - Add /landing route with full guard bypass (Gateway, Onboarding, Unlock) - Create scoped .landing-theme CSS with decorative tokens (aurora, glass, glow) - Build 10 section components: Hero, HowItWorks, Personalization, AlwaysOn, Control, Capabilities, Examples, FAQ, SocialProof, FinalCTA - Build reusable primitives: LandingSection, SectionHeader, Card, Button, StatusChip, DeliverablePreviewCard - Implement motion hooks: useRevealOnScroll (IntersectionObserver), useParallaxLite (desktop-only rAF), useReducedMotion - Add landing-specific animations with full prefers-reduced-motion support - Include sticky header with mobile menu, skip-to-content, and anchor navigation - Add LandingFooter with anchor links - Performance: content-visibility auto, transform/opacity-only animations, glass fallback via @supports --------- Co-authored-by: Claude <noreply@anthropic.com>
…filters - New /decisions/ route with full-featured Overseer Decision Audit Log - DecisionCard: timeline entry with outcome badges, type icons, metadata - DecisionDetailPanel: expanded view with options, response, reasoning, dispatched actions - DecisionTimeline: grouped-by-date timeline with staggered animations - DecisionStats: summary cards (total, approved, rejected, expired, pending, avg response time) - Filtering: outcome, type, date range, and text search with debounce - API client and hooks wired to gateway decision.list / decision.get RPC - Transforms DecisionRecord to UI-friendly DecisionAuditEntry format Part of BACKLOG P2: Decision Audit Log for Overseer
Restructure the command palette with drill-down sub-menus: - Navigate to... — Full list of all pages (Home, Conversations, Agents, Goals, Memories, Rituals, Automations, Workstreams, Settings, Dashboard) - Agents — Chat with or view any agent (shows all, not just top 5) - Appearance — Theme toggle, dark/light selection, power user mode, sidebar toggle - Settings & Config — Profile, Gateway config, Nodes, Keyboard shortcuts, Power user mode Navigation UX: - Breadcrumb header shows current sub-menu with back button - Backspace on empty search returns to root menu - Escape from sub-menu returns to root (doesn't close dialog) - ChevronRight indicator on category items signals drill-down - Root page still shows quick-access items (top 5 nav, top 3 agents) for power users who know what they want Also marks goal templates as complete in BACKLOG.md (PR #184).
- Add GoalTemplatePicker component with category tabs (Development, Operations, Research, Maintenance) and 13 preset templates - Enhance CreateGoalModal with a two-step flow: pick a template first, then customize the pre-filled form - Templates pre-fill title and milestones for faster goal creation - 'Start from scratch' option skips templates for custom goals - Back button in form step to return to template picker - Animated transitions between template and form steps - Template badge shown in form when using a template - All types and components exported from goals/index.ts
* docs: add implementation plan for console/login entry UX redesign * feat(web): implement console/login entry UX redesign - Add /landing public marketing route (fullscreen, no guards, no gateway) - Update guards (OnboardingGuard, UnlockGuard) to skip /landing - Disable gateway auto-connect and streaming hooks on /landing - Restructure __root.tsx to bypass all guards for public routes - Redesign /unlock as 2-column Console Access page with stepper flow - Add ConnectionStep with gateway URL, status, troubleshooting help - Add StepIndicator visual stepper (Connect -> Unlock -> Enter) - Create ModeToggle (Simple/Advanced) component using existing powerUserMode - Add SuggestedStarters with 9 outcome-oriented template tiles - Add RecentWork component merging workstreams + conversations - Add ApprovalsInbox prominent card for pending agent approvals - Add StatusIndicator showing gateway/unlock/approvals status - Redesign home page with mode-aware layout (Simple vs Advanced) - Restructure sidebar: primary nav (Home/Chat/Approvals/Activity), Explore section (collapsed in Simple mode), Power User section https://claude.ai/code/session_01Cg4qpNaXVuG4GCHKQuaom2 --------- Co-authored-by: Claude <noreply@anthropic.com>
…ers, and detail panel (#192) - New /decisions/ route with full-featured Overseer Decision Audit Log - DecisionCard: timeline entry with outcome badges, type icons, metadata - DecisionDetailPanel: expanded view with options, response, reasoning, dispatched actions - DecisionTimeline: grouped-by-date timeline with staggered animations - DecisionStats: summary cards (total, approved, rejected, expired, pending, avg response time) - Filtering: outcome, type, date range, and text search with debounce - API client and hooks wired to gateway decision.list / decision.get RPC - Transforms DecisionRecord to UI-friendly DecisionAuditEntry format Part of BACKLOG P2: Decision Audit Log for Overseer
…ion (#193) Restructure the command palette with drill-down sub-menus: - Navigate to... — Full list of all pages (Home, Conversations, Agents, Goals, Memories, Rituals, Automations, Workstreams, Settings, Dashboard) - Agents — Chat with or view any agent (shows all, not just top 5) - Appearance — Theme toggle, dark/light selection, power user mode, sidebar toggle - Settings & Config — Profile, Gateway config, Nodes, Keyboard shortcuts, Power user mode Navigation UX: - Breadcrumb header shows current sub-menu with back button - Backspace on empty search returns to root menu - Escape from sub-menu returns to root (doesn't close dialog) - ChevronRight indicator on category items signals drill-down - Root page still shows quick-access items (top 5 nav, top 3 agents) for power users who know what they want Also marks goal templates as complete in BACKLOG.md (PR #184).
* feat: work queue overhaul * Web: add agents dashboard * Web: add core files editor * UI: add agent skills, channels, and cron tabs * Build: prepare vercel ai agent * feat: work queue CLI commands, graph view * Web: add full web dev script * Update a2ui bundle * Work Queue: implement schema migration system with Umzug Adds proper database schema migration support to work queue backend using Umzug migration library. This fixes the "no such column: workstream" error that occurred when the gateway started with an existing database. Changes: - Add umzug dependency for schema migrations - Create migrations directory with two migrations: - 001_baseline.ts: Initial schema (work_queues + work_items) - 002_workstream_and_tracking.ts: Workstream and execution tracking - Update SqliteWorkQueueBackend to run migrations on initialization - Remove old ensureSchema() and migrateSchema() methods - Add comprehensive migration tests for all scenarios The migration system: - Tracks migration history in umzug_migrations table - Runs pending migrations automatically on initialization - Is idempotent (safe to run multiple times) - Provides a foundation for future schema changes All tests passing (7/7). Fixes startup errors with existing databases. Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>
* Slack: add reaction escalation support * Slack: handle thread reactions for escalation * fix: minor bug fix from PR review * bug fix * fix: resolve linting errors across codebase - Fixed 696 linting errors down to 0 errors (257 warnings remain) - Changed no-explicit-any from error to warn (222 instances) - Fixed no-unused-vars errors by removing unused imports/variables - Fixed no-base-to-string errors with proper type checking - Fixed restrict-template-expressions by using String() - Fixed require-array-sort-compare with compare functions - Fixed await-thenable by removing unnecessary await - Fixed no-unnecessary-template-expression - Added eslint-disable for intentional control character regex - Changed no-unused-vars to warn for test files Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
* Web: wire OAuth connections flow * Gateway: drop unused oauth import
…ls, gateway wiring) (openclaw#366) * Obsidian: add vault integration scaffolding * Obsidian: update link index before filtering self-authored
* feat: add Notion inbound webhook handler * feat(notion): Phase 1 — inbound webhook handler with event routing - Full Notion webhook event type support (2025-09-03 API version) - Webhook verification flow (verification_token handshake) - HMAC-SHA256 signature validation (X-Notion-Signature) - Self-authored event filtering (loop prevention via botId) - Event categorization: memory / wake / system / ignore - Event router with memory ingest, session wake, and system logging - Plugin HTTP route registration support - Comprehensive test suite (24 tests) * feat: add Notion MCP tools (API client, search, CRUD pages, query databases, append blocks) * fix(notion): critical fixes for data_source routing, block pagination, and content extraction - Route notion_query_database to /data_sources/ or /databases/ based on which ID the caller provides (was always using /databases/ even for data_source_ids, causing 404s on the v2025-09-03 API) - Paginate fetchPageContentAsText through all blocks instead of only fetching the first 100, so webhook memory ingest captures full page content with a safety cap of 10 pages (1000 blocks) - Fix extractBlockText dropping divider, image, bookmark, child_page, child_database, embed, and equation blocks (early return on missing rich_text prevented the switch cases from executing) - Add data_source_id parent type support to notion_create_page - Add data_source and comment to NotionWebhookEntity type union - Add 1 MB body size limit to webhook readRequestBody - Fix 3 pre-existing test failures (readStringParam throws, not returns) https://claude.ai/code/session_01JuQmX43Q8tdHbW2tj8vEd4 * feat(notion): add config types, event dedup, gateway HTTP, recursive blocks, markdown-to-blocks Implement 5 feature-completeness items for the Notion integration: 1. Config types (types.notion.ts) + Zod validation schemas for NotionConfig 2. Gateway HTTP route registration (notion-http.ts) following Slack pattern 3. Event deduplication (notion-dedup.ts) with configurable time window 4. Recursive child block fetching in fetchPageContentAsText with depth limits 5. Markdown-to-Notion-blocks converter with inline formatting support Also updates create-page and append-blocks tools to accept markdown 'content' parameter, and fixes dedup state leaking across tests. All 83 Notion tests pass. https://claude.ai/code/session_01JuQmX43Q8tdHbW2tj8vEd4 --------- Co-authored-by: Claude <noreply@anthropic.com>
* Web: unify channel config settings * Web: restore channel settings loading states
* Add baidu qianfan model provider * Add baidu qianfan model provider * Fix format * Optimize doc * optimize doc * Fix import error * Add auth choice * Optimize format * Optimize doc * Fix key resolve * Optimize import * Support ERNIE-5.0-Thinking-Preview * Resolve conflicts * Fix conflicts * Docs: add PR sign-off template (openclaw#10561) * fix: guard resolveUserPath against undefined input (openclaw#10176) * fix: guard resolveUserPath against undefined input When subagent spawner omits workspaceDir, resolveUserPath receives undefined and crashes on .trim(). Add a falsy guard that falls back to process.cwd(), matching the behavior callers already expect. Closes openclaw#10089 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: harden runner workspace fallback (openclaw#10176) (thanks @Yida-Dev) * fix: harden workspace fallback scoping (openclaw#10176) (thanks @Yida-Dev) * refactor: centralize workspace fallback classification and redaction (openclaw#10176) (thanks @Yida-Dev) * test: remove explicit any from utils mock (openclaw#10176) (thanks @Yida-Dev) * security: reject malformed agent session keys for workspace resolution (openclaw#10176) (thanks @Yida-Dev) --------- Co-authored-by: Yida-Dev <reyifeijun@gmail.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> * Docs: revise PR and issue submission guides (openclaw#10617) * Docs: revise PR submission guide * Docs: revise issue submission guide * feat(memory): native Voyage AI support (openclaw#7078) * feat(memory): add native Voyage AI embedding support with batching Cherry-picked from PR openclaw#2519, resolved conflict in memory-search.ts (hasRemote -> hasRemoteConfig rename + added voyage provider) * fix(memory): optimize voyage batch memory usage with streaming and deduplicate code Cherry-picked from PR openclaw#2519. Fixed lint error: changed this.runWithConcurrency to use imported runWithConcurrency function after extraction to internal.ts * feat(memory): document Voyage embeddings + VOYAGE_API_KEY (openclaw#7078) (thanks @mcinteerj) (openclaw#10699) * feat(antigravity): update default model to Claude Opus 4.6 (openclaw#10720) * feat(antigravity): update default model to Claude Opus 4.6 Claude Opus 4.5 has been replaced by Claude Opus 4.6 on the Antigravity (Google Cloud Code Assist) platform. - Update DEFAULT_MODEL in google-antigravity-auth extension - Update testing docs to reference the new model * fix: update remaining antigravity opus 4.5 refs in zh-CN docs and tests Address review comments from Greptile: - Update zh-CN/testing.md antigravity model references - Update pi-tools-agent-config.test.ts model IDs * Antigravity: default OAuth model to Opus 4.6 (openclaw#10720) (thanks @calvin-hpnet) --------- Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com> * fix(hooks): replace debug console.log with proper subsystem logging in session-memory (openclaw#10730) * fix: replace debug console.log with proper subsystem logging in session-memory * fix(hooks): normalize session-memory subsystem logging --------- Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com> * docs(changelog): prepare 2026.2.6 * docs(changelog): include merged PRs since v2026.2.3 * chore(release): bump version to 2026.2.6 * fix(telegram): cast fetch for grammY ApiClientOptions * docs: fix markdownlint fragments + headings * docs(changelog): refresh 2026.2.6 since v2026.2.3 * docs(imessage): add macOS TCC troubleshooting * docs(imessage): improve macOS TCC troubleshooting guidance (openclaw#10781) * chore(deps): update deps * fix(agents): add Opus 4.6 forward-compat fallback * chore(deps): bump carbon beta * docs(changelog): curate 2026.2.6 * docs(changelog): highlight Opus 4.6 + Codex 5.3 first * Fix QMD CLI installation link in memory.md (openclaw#8647) Correct the installation link for the QMD CLI in the documentation. * chore(lockfile): fix pnpm-lock * fix: cron scheduler reliability, store hardening, and UX improvements (openclaw#10776) * refactor: update cron job wake mode and run mode handling - Changed default wake mode from 'next-heartbeat' to 'now' in CronJobEditor and related CLI commands. - Updated cron-tool tests to reflect changes in run mode, introducing 'due' and 'force' options. - Enhanced cron-tool logic to handle new run modes and ensure compatibility with existing job structures. - Added new tests for delivery plan consistency and job execution behavior under various conditions. - Improved normalization functions to handle wake mode and session target casing. This refactor aims to streamline cron job configurations and enhance the overall user experience with clearer defaults and improved functionality. * test: enhance cron job functionality and UI - Added tests to ensure the isolated agent correctly announces the final payload text when delivering messages via Telegram. - Implemented a new function to pick the last deliverable payload from a list of delivery payloads. - Enhanced the cron service to maintain legacy "every" jobs while minute cron jobs recompute schedules. - Updated the cron store migration tests to verify the addition of anchorMs to legacy every schedules. - Improved the UI for displaying cron job details, including job state and delivery information, with new styles and layout adjustments. These changes aim to improve the reliability and user experience of the cron job system. * test: enhance sessions thinking level handling - Added tests to verify that the correct thinking levels are applied during session spawning. - Updated the sessions-spawn-tool to include a new parameter for overriding thinking levels. - Enhanced the UI to support additional thinking levels, including "xhigh" and "full", and improved the handling of current options in dropdowns. These changes aim to improve the flexibility and accuracy of thinking level configurations in session management. * feat: enhance session management and cron job functionality - Introduced passthrough arguments in the test-parallel script to allow for flexible command-line options. - Updated session handling to hide cron run alias session keys from the sessions list, improving clarity. - Enhanced the cron service to accurately record job start times and durations, ensuring better tracking of job execution. - Added tests to verify the correct behavior of the cron service under various conditions, including zero-delay timers. These changes aim to improve the usability and reliability of session and cron job management. * feat: implement job running state checks in cron service - Added functionality to prevent manual job runs if a job is already in progress, enhancing job management. - Updated the `isJobDue` function to include checks for running jobs, ensuring accurate scheduling. - Enhanced the `run` function to return a specific reason when a job is already running. - Introduced a new test case to verify the behavior of forced manual runs during active job execution. These changes aim to improve the reliability and clarity of cron job execution and management. * feat: add session ID and key to CronRunLogEntry model - Introduced `sessionid` and `sessionkey` properties to the `CronRunLogEntry` struct for enhanced tracking of session-related information. - Updated the initializer and Codable conformance to accommodate the new properties, ensuring proper serialization and deserialization. These changes aim to improve the granularity of logging and session management within the cron job system. * fix: improve session display name resolution - Updated the `resolveSessionDisplayName` function to ensure that both label and displayName are trimmed and default to an empty string if not present. - Enhanced the logic to prevent returning the key if it matches the label or displayName, improving clarity in session naming. These changes aim to enhance the accuracy and usability of session display names in the UI. * perf: skip cron store persist when idle timer tick produces no changes recomputeNextRuns now returns a boolean indicating whether any job state was mutated. The idle path in onTimer only persists when the return value is true, eliminating unnecessary file writes every 60s for far-future or idle schedules. * fix: prep for merge - explicit delivery mode migration, docs + changelog (openclaw#10776) (thanks @tyler6204) * Docs: fix broken /plugins links (openclaw#9308) * Docs: fix broken /plugins links to /plugin The documentation linked to /plugins which doesn't exist. The correct path is /plugin (singular) which contains the plugins overview documentation. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: drop manual zh-CN doc edits from plugins link fix --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: Sebastian <19554889+sebslight@users.noreply.github.com> * fix(build): unblock pnpm build dts * Fix repository links in formal-verification.md (openclaw#10200) Updated repository links for formal verification models. * Revert previous change from 'Clawdbot' to 'OpenClaw' in lore (openclaw#9119) * fix(memory): add input_type to Voyage AI embeddings for improved retrieval (openclaw#10818) * fix(memory): add input_type to Voyage AI embeddings for improved retrieval Voyage AI recommends passing input_type='document' when indexing and input_type='query' when searching. This improves retrieval quality by optimising the embedding space for each direction. Changes: - embedQuery now passes input_type: 'query' - embedBatch now passes input_type: 'document' - Batch API request_params includes input_type: 'document' - Tests updated to verify input_type is passed correctly * Changelog: note Voyage embeddings input_type fix (openclaw#10818) (thanks @mcinteerj) --------- Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com> * fix(dashboard): restore tokenized control ui links * chore(skills): remove bird skill * chore(onboard): move xAI up in auth list * chore(release): 2026.2.6-1 * chore(onboard): move xAI below Google * ci: add concurrency controls, consolidate macOS jobs, optimize Windows CI * ci: re-enable parallel vitest on Windows CI * docs(changelog): note CI pipeline optimization (openclaw#10784) (thanks @mcaxtr) * fix(build): support daemon-cli .mjs bundles in compat shim * fix(docker): support .mjs entrypoints in images and e2e * test(hooks): stabilize session-memory hook tests * chore(release): 2026.2.6-2 * chore(onboard): reorder xAI + Qianfan providers * chore(release): 2026.2.6-3 * fix: comprehensive BlueBubbles and channel cleanup (openclaw#11093) * feat(bluebubbles): auto-strip markdown from outbound messages (openclaw#7402) * fix(security): add timeout to webhook body reading (openclaw#6762) Adds 30-second timeout to readBody() in voice-call, bluebubbles, and nostr webhook handlers. Prevents Slow-Loris DoS (CWE-400, CVSS 7.5). Merged with existing maxBytes protection in voice-call. * fix(security): unify Error objects and lint fixes in webhook timeouts (openclaw#6762) * fix: prevent plugins from auto-enabling without user consent (openclaw#3961) Changes default plugin enabled state from true to false in enablePluginEntry(). Preserves existing enabled:true values. Fixes openclaw#3932. * fix: apply hierarchical mediaMaxMb config to all channels (openclaw#8749) Generalizes resolveAttachmentMaxBytes() to use account → channel → global config resolution for all channels, not just BlueBubbles. Fixes openclaw#7847. * fix(bluebubbles): sanitize attachment filenames against header injection (openclaw#10333) Strip ", \r, \n, and \\ from filenames after path.basename() to prevent multipart Content-Disposition header injection (CWE-93, CVSS 5.4). Also adds sanitization to setGroupIconBlueBubbles which had zero filename sanitization. * fix(lint): exclude extensions/ from Oxlint preflight check (openclaw#9313) Extensions use PluginRuntime|null patterns that trigger no-redundant-type-constituents because PluginRuntime resolves to any. Excluding extensions/ from Oxlint unblocks user upgrades. Re-applies the approach from closed PR openclaw#10087. * fix(bluebubbles): add tempGuid to createNewChatWithMessage payload (openclaw#7745) Non-Private-API mode (AppleScript) requires tempGuid in send payloads. The main sendMessageBlueBubbles already had it, but createNewChatWithMessage was missing it, causing 400 errors for new chat creation without Private API. * fix: send stop-typing signal when run ends with NO_REPLY (openclaw#8785) Adds onCleanup callback to the typing controller that fires when the controller is cleaned up while typing was active (e.g., after NO_REPLY). Channels using createTypingCallbacks automatically get stop-typing on cleanup. This prevents the typing indicator from lingering in group chats when the agent decides not to reply. * fix(telegram): deduplicate skill commands in multi-agent setup (openclaw#5717) Two fixes: 1. Skip duplicate workspace dirs when listing skill commands across agents. Multiple agents sharing the same workspace would produce duplicate commands with _2, _3 suffixes. 2. Clear stale commands via deleteMyCommands before registering new ones. Commands from deleted skills now get cleaned up on restart. * fix: add size limits to unbounded in-memory caches (openclaw#4948) Adds max-size caps with oldest-entry eviction to prevent OOM in long-running deployments: - BlueBubbles serverInfoCache: 64 entries (already has TTL) - Google Chat authCache: 32 entries - Matrix directRoomCache: 1024 entries - Discord presenceCache: 5000 entries per account * fix: address review concerns (openclaw#11093) - Chain deleteMyCommands → setMyCommands to prevent race condition (openclaw#5717) - Rename enablePluginEntry to registerPluginEntry (now sets enabled: false) - Add Slow-Loris timeout test for readJsonBody (openclaw#6023) * docs: add symptom-first troubleshooting hub and deep runbooks (openclaw#11196) * docs(troubleshooting): add symptom-first troubleshooting runbooks * docs(troubleshooting): fix approvals command examples * docs(troubleshooting): wrap symptom cases in accordions * docs(automation): clarify userTimezone missing-key behavior * docs(troubleshooting): fix first-60-seconds ladder order * docs: add missing HEARTBEAT.md and MEMORY.md to bootstrap files list (openclaw#8105) * docs: add missing HEARTBEAT.md and MEMORY.md to bootstrap files list Fixes openclaw#7928 The documentation for skipBootstrap and workspace setup was missing HEARTBEAT.md and MEMORY.md from the bootstrap files list. Changes: - docs/gateway/configuration.md: Add HEARTBEAT.md and MEMORY.md - docs/zh-CN/gateway/configuration.md: Same for Chinese version - docs/start/openclaw.md: Add HEARTBEAT.md, clarify MEMORY.md is optional - docs/zh-CN/start/openclaw.md: Same for Chinese version * fix: reference PR number instead of issue in CHANGELOG * docs(workspace): align bootstrap file docs with runtime (openclaw#8105) --------- Co-authored-by: damaozi <1811866786@qq.com> Co-authored-by: Sebastian <19554889+sebslight@users.noreply.github.com> * Agents: include runtime shell (openclaw#1835) * Agents: include runtime shell * Agents: fix compact runtime build * chore: fix CLAUDE.md formatting, security regex for secret --------- Co-authored-by: Tak hoffman <takayukihoffman@gmail.com> Co-authored-by: quotentiroler <max.nussbaumer@maxhealth.tech> * Web UI: show Compaction divider in chat history (openclaw#11341) * adding PR review workflow * added more explicit instructions * docs: canonicalize docs paths and align zh navigation (openclaw#11428) * docs(navigation): canonicalize paths and align zh nav * chore(docs): remove stray .DS_Store * docs(scripts): add non-mint docs link audit * docs(nav): fix zh source paths and preserve legacy redirects (openclaw#11428) (thanks @sebslight) * chore(docs): satisfy lint for docs link audit script (openclaw#11428) (thanks @sebslight) * chore: bump pi to 0.52.8 * Fix typo in FAQ regarding model configuration command (openclaw#6048) * CI: skip heavy jobs on docs-only changes (openclaw#11328) * fix: add .caf to AUDIO_FILE_EXTENSIONS (openclaw#10982) * fix: add .caf to AUDIO_FILE_EXTENSIONS for iMessage voice messages * fix: add caf audio extension regression coverage (openclaw#10982) (thanks @succ985) --------- Co-authored-by: succ985 <succ985@users.noreply.github.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> * Gateway: fix multi-agent sessions.usage discovery (openclaw#11523) * Gateway: fix multi-agent sessions.usage discovery * Gateway: resolve sessions.usage keys via sessionId * feat(gateway): add agents.create/update/delete methods (openclaw#11045) * feat(gateway): add agents.create/update/delete methods * fix(lint): preserve memory-lancedb load error cause * feat(gateway): trash agent files on agents.delete * chore(protocol): regenerate Swift gateway models * fix(gateway): stabilize agents.create dirs and agentDir * feat(gateway): support avatar in agents.create * fix: prep agents.create/update/delete handlers (openclaw#11045) (thanks @advaitpaliwal) - Reuse movePathToTrash from browser/trash.ts (has ~/.Trash fallback on non-macOS) - Fix partial-failure: workspace setup now runs before config write - Always write Name to IDENTITY.md regardless of emoji/avatar - Add unit tests for agents.create, agents.update, agents.delete - Add CHANGELOG entry --------- Co-authored-by: Tyler Yust <TYTYYUST@YAHOO.COM> * feat(sanitize): enhance context overflow error handling in user-facing text - Added tests to ensure proper sanitization of context overflow errors. - Introduced a new function to determine when to rewrite context overflow messages. - Updated the sanitization logic to improve user experience by providing clearer error messages while preserving conversational context. * fix(gateway): use LAN IP for WebSocket/probe URLs when bind=lan (openclaw#11448) * fix(gateway): use LAN IP for WebSocket/probe URLs when bind=lan (openclaw#11329) When gateway.bind=lan, the HTTP server correctly binds to 0.0.0.0 (all interfaces), but WebSocket connection URLs, probe targets, and Control UI links were hardcoded to 127.0.0.1. This caused CLI commands and status probes to show localhost-only URLs even in LAN mode, and made onboarding display misleading connection info. - Add pickPrimaryLanIPv4() to gateway/net.ts to detect the machine's primary LAN IPv4 address (prefers en0/eth0, falls back to any external interface) - Update pickProbeHostForBind() to use LAN IP when bind=lan - Update buildGatewayConnectionDetails() to use LAN IP and report "local lan <ip>" as the URL source - Update resolveControlUiLinks() to return LAN-accessible URLs - Update probe note in status.gather.ts to reflect new behavior - Add tests for pickPrimaryLanIPv4 and bind=lan URL resolution Closes openclaw#11329 Co-authored-by: Cursor <cursoragent@cursor.com> * test: move vi.restoreAllMocks to afterEach in pickPrimaryLanIPv4 Per review feedback: avoid calling vi.restoreAllMocks() inside individual tests as it restores all spies globally and can cause ordering issues. Use afterEach in the describe block instead. Co-authored-by: Cursor <cursoragent@cursor.com> * Changelog: note LAN bind URLs fix (openclaw#11448) (thanks @AnonO6) --------- Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com> * fix: recover from context overflow caused by oversized tool results (openclaw#11579) * fix: gracefully handle oversized tool results causing context overflow When a subagent reads a very large file or gets a huge tool result (e.g., gh pr diff on a massive PR), it can exceed the model's context window in a single prompt. Auto-compaction can't help because there's no older history to compact — just one giant tool result. This adds two layers of defense: 1. Pre-emptive: Hard cap on tool result size (400K chars ≈ 100K tokens) applied in the session tool result guard before persistence. This prevents extremely large tool results from being stored in full, regardless of model context window size. 2. Recovery: When context overflow is detected and compaction fails, scan session messages for oversized tool results relative to the model's actual context window (30% max share). If found, truncate them in the session via branching (creating a new branch with truncated content) and retry the prompt. The truncation preserves the beginning of the content (most useful for understanding what was read) and appends a notice explaining the truncation and suggesting offset/limit parameters for targeted reads. Includes comprehensive tests for: - Text truncation with newline-boundary awareness - Context-window-proportional size calculation - In-memory message truncation - Oversized detection heuristics - Guard-level size capping during persistence * fix: prep fixes for tool result truncation PR (openclaw#11579) (thanks @tyler6204) * Memory: harden QMD startup, timeouts, and fallback recovery * Memory: queue forced QMD sync and handle sqlite busy reads * Memory: chain forced QMD queue and fail over on busy index * Memory: make QMD cache eviction callback idempotent * Memory: add SQLITE_BUSY fallback regression test * Update CHANGELOG.md for version 2026.2.6-4: Added RPC methods for agent management, fixed context overflow recovery, improved LAN IP handling, enhanced memory retrieval, and updated media understanding for audio transcription. * Tests: harden flake hotspots and consolidate provider-auth suites (openclaw#11598) * Tests: harden flake hotspots and consolidate provider-auth suites * Tests: restore env vars by deleting missing snapshot values * Tests: use real newline in memory summary filter case * Tests(memory): use fake timers for qmd timeout coverage * Changelog: add tests hardening entry for openclaw#11598 * docs: clarify onboarding instructions for beginners (openclaw#10956) * chore: updated PR review skills and workflow info on tests + fake timers * Fix Nix repository link in README (openclaw#7910) Updated Nix repository link in README. Co-authored-by: Josh <141778+bolapara@users.noreply.github.com> Co-authored-by: Seb Slight <19554889+sebslight@users.noreply.github.com> * Docs: fix cron.update param name id → jobId (openclaw#11365) (openclaw#11467) * Docs: fix cron.update param name id → jobId (openclaw#11365) * Docs: sync zh-CN cron.update param name id → jobId * docs: revert manual zh-CN generated docs edit (openclaw#11467) (thanks @lailoo) --------- Co-authored-by: damaozi <1811866786@qq.com> Co-authored-by: Sebastian <19554889+sebslight@users.noreply.github.com> * fix: use STATE_DIR instead of hardcoded ~/.openclaw for identity and canvas (openclaw#4824) * fix: use STATE_DIR instead of hardcoded ~/.openclaw for identity and canvas device-identity.ts and canvas-host/server.ts used hardcoded path.join(os.homedir(), '.openclaw', ...) ignoring OPENCLAW_STATE_DIR env var and the resolveStateDir() logic from config/paths.ts. This caused ~/.openclaw/identity and ~/.openclaw/canvas directories to be created even when state dir was overridden or resided elsewhere. * fix: format and remove duplicate imports * fix: scope state-dir patch + add regression tests (openclaw#4824) (thanks @kossoy) * fix: align state-dir fallbacks in hooks and agent paths (openclaw#4824) (thanks @kossoy) --------- Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> * fix(cron): share isolated announce flow + harden cron scheduling/delivery (openclaw#11641) * fix(cron): comprehensive cron scheduling and delivery fixes - Fix delivery target resolution for isolated agent cron jobs - Improve schedule parsing and validation - Add job retry logic and error handling - Enhance cron ops with better state management - Add timer improvements for more reliable cron execution - Add cron event type to protocol schema - Support cron events in heartbeat runner (skip empty-heartbeat check, use dedicated CRON_EVENT_PROMPT for relay) * fix: remove cron debug test and add changelog/docs notes (openclaw#11641) (thanks @tyler6204) * fix: context overflow compaction and subagent announce improvements (openclaw#11664) (thanks @tyler6204) * initial commit * feat: implement deriveSessionTotalTokens function and update usage tests * Added deriveSessionTotalTokens function to calculate total tokens based on usage and context tokens. * Updated usage tests to include cases for derived session total tokens. * Refactored session usage calculations in multiple files to utilize the new function for improved accuracy. * fix: restore overflow truncation fallback + changelog/test hardening (openclaw#11551) (thanks @tyler6204) * fix(ui): smooth chat refresh scroll and suppress new-messages badge flash * fix(discord): support forum channel thread-create (openclaw#10062) * fix(discord): support forum channel thread-create * fix: harden discord forum thread-create (openclaw#10062) (thanks @jarvis89757) --------- Co-authored-by: Shakker <shakkerdroid@gmail.com> * feat(telegram): add spoiler tag support (openclaw#11543) * feat(telegram): add spoiler tag support Render markdown ||spoiler|| syntax as <tg-spoiler> tags in Telegram HTML output. The markdown IR already parses spoiler syntax, but the Telegram renderer was missing the style marker. This adds the spoiler marker to renderTelegramHtml(). Fixes spoiler text appearing as raw ||text|| instead of hidden text. * fix: enable Telegram spoiler rendering (openclaw#11543) (thanks @ezhikkk) --------- Co-authored-by: Параша <parasha@openclaw.local> Co-authored-by: Muhammed Mukhthar CM <mukhtharcm@gmail.com> * fix(doctor): suppress repeated legacy state migration warnings (openclaw#11709) * fix(doctor): suppress repeated state migration warning * fix: harden state-dir mirror detection + warnings (openclaw#11709) (thanks @gumadeiras) * test: cover mirror hardening edge cases (openclaw#11709) (thanks @gumadeiras) * CI: scope heavy jobs, build once, and remove duplicate validation work (openclaw#11570) * CI: scope jobs and reuse build artifacts * CI: fix scope fallback and remove unused artifact job * CI: remove setup-node pnpm cache inputs * CI: add pnpm store cache and dist artifact smoke * CI: extract pnpm cache action and consume dist artifact * chore: centralizing warning filters * chore: suppress warnings for node default output path * chore: project hygiene — fix workspace:*, sandbox USER, dead config (openclaw#11289) * chore: project hygiene fixes (workspace:*, sandbox USER, dead config) * chore: also fix workspace:* in zalouser dependencies * docs: add security & trust documentation Add threat model (MITRE ATLAS), contribution guide, and security directory README. Update SECURITY.md with trust page reporting instructions and Jamieson O'Reilly as Security & Trust. Co-Authored-By: theonejvo <theonejvo@users.noreply.github.com> * Centralize date/time formatting utilities (openclaw#11831) * chore: fix vitest standalone configs and update package description (openclaw#11865) * chore: fix vitest standalone configs and update package description - vitest.live.config.ts and vitest.e2e.config.ts now extend root config - Inherits testTimeout (120s), resolve.alias, pool, setupFiles, excludes - ui/vitest.node.config.ts gets explicit 120s timeout - package.json description updated for multi-channel AI gateway - Removed unused src/utils/time-format.ts * chore: filter inherited excludes in live/e2e vitest configs * refactor: dedupe GroupPolicy/DmPolicy in extensions Import from openclaw/plugin-sdk instead of re-declaring identical types. * Add GitHub Copilot models to xhigh list (openclaw#11646) * Add GitHub Copilot models to xhigh list * fix(thinking): add xhigh copilot tests and changelog (openclaw#11646) (thanks @seans-openclawbot) --------- Co-authored-by: Sean Dai <sdai@gatech.edu> Co-authored-by: Sebastian <19554889+sebslight@users.noreply.github.com> * Exec approvals: render forwarded commands in monospace (openclaw#11937) * fix(exec-approvals): format forwarded commands as code * fix(exec-approvals): place fenced command blocks on new line (openclaw#11937) (thanks @sebslight) * docs: fix changelog PR reference Fix Exec approvals command text formatting issue for safer approval scanning. * Gateway/Plugins: device pairing + phone control plugins (openclaw#11755) * iOS: alpha node app + setup-code onboarding (openclaw#11756) * Memory/QMD: warn when scope denies search * Docs i18n: make translation prompt language-pluggable * Docs: seed ja-JP translations * Docs: use ja-jp Mintlify language code * Docs: note ja-JP docs POC in changelog (openclaw#11988) (thanks @joshp123) * Docs: fix language switcher order + Japanese locale * Docs: note language switcher ordering + JP flag fix (openclaw#12023) (thanks @joshp123) * fix(paths): respect OPENCLAW_HOME for all internal path resolution (openclaw#12091) * fix(paths): respect OPENCLAW_HOME for all internal path resolution (openclaw#11995) Add home-dir module (src/infra/home-dir.ts) that centralizes home directory resolution with precedence: OPENCLAW_HOME > HOME > USERPROFILE > os.homedir(). Migrate all path-sensitive callsites: config IO, agent dirs, session transcripts, pairing store, cron store, doctor, CLI profiles. Add envHomedir() helper in config/paths.ts to reduce lambda noise. Document OPENCLAW_HOME in docs/help/environment.md. * fix(paths): handle OPENCLAW_HOME '~' fallback (openclaw#12091) (thanks @sebslight) * docs: mention OPENCLAW_HOME in install and getting started (openclaw#12091) (thanks @sebslight) * fix(status): show OPENCLAW_HOME in shortened paths (openclaw#12091) (thanks @sebslight) * docs(changelog): clarify OPENCLAW_HOME and HOME precedence (openclaw#12091) (thanks @sebslight) * changelog: split openclaw#12091 entry into Added + Fixes * fix(config): clamp maxTokens to contextWindow to prevent invalid configurations Closes openclaw#5308 When users configure maxTokens larger than contextWindow (e.g., maxTokens: 40960 with contextWindow: 32768), the model may fail silently. This fix clamps maxTokens to be at most contextWindow, preventing such invalid configurations. * test(config): cover maxTokens clamping * chore(changelog): note maxTokens clamp (openclaw#5516) (thanks @lailoo) (openclaw#12139) * fix: more merge fixes * fix: fix gauranteed rejection when declaredCommands undefined * fix: resolve build errors and eslint warnings - Add missing parseDatedFilename function to memory/internal.ts - Remove reference to undefined thinkingWarning variable - Fix node.invoke guard to maintain backward compatibility - Rename unused runtimeConfig variable to _runtimeConfig Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * chore: lancedb embedding/llm-extraction refactoring * Docs: revise PR and issue submission guides (openclaw#10617) * Docs: revise PR submission guide * Docs: revise issue submission guide * docs: fix markdownlint fragments + headings * fix: cron scheduler reliability, store hardening, and UX improvements (openclaw#10776) * refactor: update cron job wake mode and run mode handling - Changed default wake mode from 'next-heartbeat' to 'now' in CronJobEditor and related CLI commands. - Updated cron-tool tests to reflect changes in run mode, introducing 'due' and 'force' options. - Enhanced cron-tool logic to handle new run modes and ensure compatibility with existing job structures. - Added new tests for delivery plan consistency and job execution behavior under various conditions. - Improved normalization functions to handle wake mode and session target casing. This refactor aims to streamline cron job configurations and enhance the overall user experience with clearer defaults and improved functionality. * test: enhance cron job functionality and UI - Added tests to ensure the isolated agent correctly announces the final payload text when delivering messages via Telegram. - Implemented a new function to pick the last deliverable payload from a list of delivery payloads. - Enhanced the cron service to maintain legacy "every" jobs while minute cron jobs recompute schedules. - Updated the cron store migration tests to verify the addition of anchorMs to legacy every schedules. - Improved the UI for displaying cron job details, including job state and delivery information, with new styles and layout adjustments. These changes aim to improve the reliability and user experience of the cron job system. * test: enhance sessions thinking level handling - Added tests to verify that the correct thinking levels are applied during session spawning. - Updated the sessions-spawn-tool to include a new parameter for overriding thinking levels. - Enhanced the UI to support additional thinking levels, including "xhigh" and "full", and improved the handling of current options in dropdowns. These changes aim to improve the flexibility and accuracy of thinking level configurations in session management. * feat: enhance session management and cron job functionality - Introduced passthrough arguments in the test-parallel script to allow for flexible command-line options. - Updated session handling to hide cron run alias session keys from the sessions list, improving clarity. - Enhanced the cron service to accurately record job start times and durations, ensuring better tracking of job execution. - Added tests to verify the correct behavior of the cron service under various conditions, including zero-delay timers. These changes aim to improve the usability and reliability of session and cron job management. * feat: implement job running state checks in cron service - Added functionality to prevent manual job runs if a job is already in progress, enhancing job management. - Updated the `isJobDue` function to include checks for running jobs, ensuring accurate scheduling. - Enhanced the `run` function to return a specific reason when a job is already running. - Introduced a new test case to verify the behavior of forced manual runs during active job execution. These changes aim to improve the reliability and clarity of cron job execution and management. * feat: add session ID and key to CronRunLogEntry model - Introduced `sessionid` and `sessionkey` properties to the `CronRunLogEntry` struct for enhanced tracking of session-related information. - Updated the initializer and Codable conformance to accommodate the new properties, ensuring proper serialization and deserialization. These changes aim to improve the granularity of logging and session management within the cron job system. * fix: improve session display name resolution - Updated the `resolveSessionDisplayName` function to ensure that both label and displayName are trimmed and default to an empty string if not present. - Enhanced the logic to prevent returning the key if it matches the label or displayName, improving clarity in session naming. These changes aim to enhance the accuracy and usability of session display names in the UI. * perf: skip cron store persist when idle timer tick produces no changes recomputeNextRuns now returns a boolean indicating whether any job state was mutated. The idle path in onTimer only persists when the return value is true, eliminating unnecessary file writes every 60s for far-future or idle schedules. * fix: prep for merge - explicit delivery mode migration, docs + changelog (openclaw#10776) (thanks @tyler6204) * fix(memory): add input_type to Voyage AI embeddings for improved retrieval (openclaw#10818) * fix(memory): add input_type to Voyage AI embeddings for improved retrieval Voyage AI recommends passing input_type='document' when indexing and input_type='query' when searching. This improves retrieval quality by optimising the embedding space for each direction. Changes: - embedQuery now passes input_type: 'query' - embedBatch now passes input_type: 'document' - Batch API request_params includes input_type: 'document' - Tests updated to verify input_type is passed correctly * Changelog: note Voyage embeddings input_type fix (openclaw#10818) (thanks @mcinteerj) --------- Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com> * chore(onboard): move xAI up in auth list * fix: add .caf to AUDIO_FILE_EXTENSIONS (openclaw#10982) * fix: add .caf to AUDIO_FILE_EXTENSIONS for iMessage voice messages * fix: add caf audio extension regression coverage (openclaw#10982) (thanks @succ985) --------- Co-authored-by: succ985 <succ985@users.noreply.github.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> * feat(gateway): add agents.create/update/delete methods (openclaw#11045) * feat(gateway): add agents.create/update/delete methods * fix(lint): preserve memory-lancedb load error cause * feat(gateway): trash agent files on agents.delete * chore(protocol): regenerate Swift gateway models * fix(gateway): stabilize agents.create dirs and agentDir * feat(gateway): support avatar in agents.create * fix: prep agents.create/update/delete handlers (openclaw#11045) (thanks @advaitpaliwal) - Reuse movePathToTrash from browser/trash.ts (has ~/.Trash fallback on non-macOS) - Fix partial-failure: workspace setup now runs before config write - Always write Name to IDENTITY.md regardless of emoji/avatar - Add unit tests for agents.create, agents.update, agents.delete - Add CHANGELOG entry --------- Co-authored-by: Tyler Yust <TYTYYUST@YAHOO.COM> * fix(gateway): use LAN IP for WebSocket/probe URLs when bind=lan (openclaw#11448) * fix(gateway): use LAN IP for WebSocket/probe URLs when bind=lan (openclaw#11329) When gateway.bind=lan, the HTTP server correctly binds to 0.0.0.0 (all interfaces), but WebSocket connection URLs, probe targets, and Control UI links were hardcoded to 127.0.0.1. This caused CLI commands and status probes to show localhost-only URLs even in LAN mode, and made onboarding display misleading connection info. - Add pickPrimaryLanIPv4() to gateway/net.ts to detect the machine's primary LAN IPv4 address (prefers en0/eth0, falls back to any external interface) - Update pickProbeHostForBind() to use LAN IP when bind=lan - Update buildGatewayConnectionDetails() to use LAN IP and report "local lan <ip>" as the URL source - Update resolveControlUiLinks() to return LAN-accessible URLs - Update probe note in status.gather.ts to reflect new behavior - Add tests for pickPrimaryLanIPv4 and bind=lan URL resolution Closes openclaw#11329 Co-authored-by: Cursor <cursoragent@cursor.com> * test: move vi.restoreAllMocks to afterEach in pickPrimaryLanIPv4 Per review feedback: avoid calling vi.restoreAllMocks() inside individual tests as it restores all spies globally and can cause ordering issues. Use afterEach in the describe block instead. Co-authored-by: Cursor <cursoragent@cursor.com> * Changelog: note LAN bind URLs fix (openclaw#11448) (thanks @AnonO6) --------- Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com> * fix: recover from context overflow caused by oversized tool results (openclaw#11579) * fix: gracefully handle oversized tool results causing context overflow When a subagent reads a very large file or gets a huge tool result (e.g., gh pr diff on a massive PR), it can exceed the model's context window in a single prompt. Auto-compaction can't help because there's no older history to compact — just one giant tool result. This adds two layers of defense: 1. Pre-emptive: Hard cap on tool result size (400K chars ≈ 100K tokens) applied in the session tool result guard before persistence. This prevents extremely large tool results from being stored in full, regardless of model context window size. 2. Recovery: When context overflow is detected and compaction fails, scan session messages for oversized tool results relative to the model's actual context window (30% max share). If found, truncate them in the session via branching (creating a new branch with truncated content) and retry the prompt. The truncation preserves the beginning of the content (most useful for understanding what was read) and appends a notice explaining the truncation and suggesting offset/limit parameters for targeted reads. Includes comprehensive tests for: - Text truncation with newline-boundary awareness - Context-window-proportional size calculation - In-memory message truncation - Oversized detection heuristics - Guard-level size capping during persistence * fix: prep fixes for tool result truncation PR (openclaw#11579) (thanks @tyler6204) * Memory: harden QMD startup, timeouts, and fallback recovery * fix: context overflow compaction and subagent announce improvements (openclaw#11664) (thanks @tyler6204) * initial commit * feat: implement deriveSessionTotalTokens function and update usage tests * Added deriveSessionTotalTokens function to calculate total tokens based on usage and context tokens. * Updated usage tests to include cases for derived session total tokens. * Refactored session usage calculations in multiple files to utilize the new function for improved accuracy. * fix: restore overflow truncation fallback + changelog/test hardening (openclaw#11551) (thanks @tyler6204) * chore: centralizing warning filters * Docs: seed ja-JP translations * Docs: use ja-jp Mintlify language code * Docs: fix language switcher order + Japanese locale * chore: lancedb embedding/llm-extraction refactoring * fix: minor bug in lancedb refactoring * additional test fixes * crap loads of lint fixes * fix: restore nullish fallback for context.outputs spread in worker.ts When context is undefined or lacks an outputs object, spreading ...context?.outputs can throw TypeError in some transpilation targets. Restores the previous ...(context?.outputs ?? {}) guard. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: guard against undefined context.outputs spread in worker.ts Extract context?.outputs into a temp variable with ?? {} fallback before spreading, avoiding potential TypeError when context or its outputs property is undefined. Uses a temp variable instead of inline ?? {} to prevent oxfmt from stripping the guard. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: ideoutrea <ideoutrea@163.com> Co-authored-by: ide-rea <30512600+ide-rea@users.noreply.github.com> Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com> Co-authored-by: Yida-Dev <92713555+Yida-Dev@users.noreply.github.com> Co-authored-by: Yida-Dev <reyifeijun@gmail.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> Co-authored-by: Jake <mcinteerj@gmail.com> Co-authored-by: calvin-hpnet <calvin@hpnet.co.uk> Co-authored-by: Shadril Hassan Shifat <63901551+shadril238@users.noreply.github.com> Co-authored-by: Peter Steinberger <steipete@gmail.com> Co-authored-by: gitpds <pds@pds.dev> Co-authored-by: Seb Slight <19554889+sebslight@users.noreply.github.com> Co-authored-by: Raymond Berger <RayBB@users.noreply.github.com> Co-authored-by: Tyler Yust <64381258+tyler6204@users.noreply.github.com> Co-authored-by: DEOKLYONG MOON <dfjk71@khu.ac.kr> Co-authored-by: Val Alexander <68980965+BunsDev@users.noreply.github.com> Co-authored-by: Markus Buhatem Koch <markusbkoch@gmail.com> Co-authored-by: Marcus Castro <mcaxtr@gmail.com> Co-authored-by: 大猫子 <ll1042668699@gmail.com> Co-authored-by: damaozi <1811866786@qq.com> Co-authored-by: Tak hoffman <takayukihoffman@gmail.com> Co-authored-by: quotentiroler <max.nussbaumer@maxhealth.tech> Co-authored-by: Abdullah <syedabdullah535@gmail.com> Co-authored-by: max <40643627+quotentiroler@users.noreply.github.com> Co-authored-by: succ985 <3186520056@qq.com> Co-authored-by: succ985 <succ985@users.noreply.github.com> Co-authored-by: Advait Paliwal <advaitspaliwal@gmail.com> Co-authored-by: Tyler Yust <TYTYYUST@YAHOO.COM> Co-authored-by: Aviral <124311066+AnonO6@users.noreply.github.com> Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Vignesh Natarajan <vigneshnatarajan92@gmail.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@users.noreply.github.com> Co-authored-by: Rohan Patil <rohanspatil801@gmail.com> Co-authored-by: danielcadenhead <danielcadenhead88@gmail.com> Co-authored-by: Josh <141778+bolapara@users.noreply.github.com> Co-authored-by: Oleg Kossoy <oleg.kossoy@gmail.com> Co-authored-by: jarvis89757 <jarvis@techflow.studio> Co-authored-by: Shakker <shakkerdroid@gmail.com> Co-authored-by: ezhikkk <105670095+ezhikkk@users.noreply.github.com> Co-authored-by: Параша <parasha@openclaw.local> Co-authored-by: Muhammed Mukhthar CM <mukhtharcm@gmail.com> Co-authored-by: theonejvo <theonejvo@users.noreply.github.com> Co-authored-by: seans-openclawbot <seandai.apps@gmail.com> Co-authored-by: Sean Dai <sdai@gatech.edu> Co-authored-by: Mariano Belinky <mbelinky@gmail.com> Co-authored-by: Josh Palmer <joshp123@users.noreply.github.com> Co-authored-by: George Pickett <gpickett00@gmail.com>
* Web: wire OAuth connections flow * fix: pr feedback
* refactor(ui): design token audit — replace hardcoded colors with CSS custom properties - Add chart, log-level, and syntax-highlighting token families to design-system.css (dark + light variants) - Migrate agent-dashboard.css from hardcoded surface/border/text colors to design tokens (--surface-1, --border, --text, --muted, --ok, --danger, etc.) - Migrate logs.css level-chip colors to --log-* tokens using color-mix() for alpha variants - Migrate usage.ts inline styles from #ff4d4d / rgba(...) to --danger / --danger-muted tokens - Migrate chat layout.css and text.css to use design-system border/surface/muted tokens - Migrate layout.css to use --surface-1, --border, --text, --radius-lg tokens - Update command-palette.ts and CTA modals to use design-system tokens - Update app-render.ts and helpers to use semantic color tokens 13 files changed, ~316 insertions, ~204 deletions — zero functional changes * UI: fix skip-nav focus outline color (openclaw#323) * WIP: design token audit - CSS + component updates + landing demos * Fix ReferenceError: import `nothing` from lit in renderTab (openclaw#359) The `aria-current` attribute used `nothing` to remove itself on inactive tabs, but `nothing` was never imported from lit. This caused a ReferenceError on every inactive tab render, breaking navigation. https://claude.ai/code/session_01GVGyw7dEgvPFFqwnfSNZr2 Co-authored-by: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
…aw#376) * fix: resolve TS2322 type errors in reactions.ts and config.ts - Narrow item.channel to channelId with explicit guard, eliminating string|undefined assignment to string type - Fix ResolvedReactionEscalationConfig outcome type to keep digestChannel optional (it genuinely may not be configured) - Both fixes address plugin-sdk DTS build failures * fix: lint issues
- Fix AgentTool generic constraint (TSchema, not unknown) - Add vault diagnostic event types (vault.watcher.event, vault.tool.call) - Fix chokidar FSWatcher import (named export, not namespace) - Add explicit type annotation for field parameter in query-tools - Introduce QueueRow/ItemRow type aliases in sqlite-backend for cleaner casts
openclaw#377) * Web: replace mock domain data * Web: honor overseer goal status
* Slack: add reaction escalation support * Slack: handle thread reactions for escalation * fix: minor bug fix from PR review * bug fix * fix: resolve linting errors across codebase - Fixed 696 linting errors down to 0 errors (257 warnings remain) - Changed no-explicit-any from error to warn (222 instances) - Fixed no-unused-vars errors by removing unused imports/variables - Fixed no-base-to-string errors with proper type checking - Fixed restrict-template-expressions by using String() - Fixed require-array-sort-compare with compare functions - Fixed await-thenable by removing unnecessary await - Fixed no-unnecessary-template-expression - Added eslint-disable for intentional control character regex - Changed no-unused-vars to warn for test files Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
…penclaw#380) * Web: honor live sessions and agent status gating * Web: disable status toggles when gateway connected
* fix: improve debug logging for Graphiti client and startup service URLs - Add URL to Graphiti client error logs for ingest and search operations - Log configured external service endpoints (Graphiti, Obsidian, QMD) at startup - Helps debug connectivity issues by showing which URLs are being targeted * feat: add Goal Progress Panel to Overseer view New component that provides detailed per-phase progress tracking for goals: - Overall goal completion percentage with animated progress bar - Status distribution visualization (done/in-progress/blocked/pending) - Per-phase collapsible progress bars with stacked status segments - Individual task listing with dependency indicators - Velocity metrics (tasks/day) and estimated time remaining Files added: - ui/src/ui/views/overseer-progress.ts — Goal progress panel component - ui/src/styles/overseer.css — Extracted overseer styles + new progress panel CSS Integration: - Added expandedPhaseIds state + toggleProgressPhase to overseer controller - Wired renderGoalProgress into main overseer view (shows when goal has plan) - Added CSS import to main styles.css
- Add periodic Graphiti health probe (configurable interval, 3-failure threshold) - Gate entity-extract and graph writes behind health probe check - Wire probe start/stop into gateway lifecycle - Add healthProbeIntervalMinutes config option to MemoryGraphitiConfig - Fix pre-existing test failure in search-manager.test.ts (ComposableMemoryManager creates new instances each call, so toBe reference check was incorrect) - Add 10 comprehensive tests for health-probe.ts
Owner
Author
|
Closing: all changes in this PR are already merged to main. The health probe and search-manager test fix landed via earlier commits. |
dgarson
added a commit
that referenced
this pull request
Feb 21, 2026
Changes landed in c6a1309 (co-committed with #19). Summary of changes: - apps/web/src/hooks/useShortcutsSeen.ts (new) localStorage-gated hook (key: oc_shortcuts_seen) tracking first-visit state - apps/web/src/hooks/index.ts Export useShortcutsSeen from hooks barrel - apps/web/src/providers/ShortcutsProvider.tsx Add ShortcutsContext exposing openShortcutsModal / shortcutsSeen / markShortcutsSeen; mark as seen whenever modal opens via keyboard, button, or command palette - apps/web/src/providers/index.ts Export ShortcutsContext and useShortcutsContext - apps/web/src/components/layout/Sidebar.tsx Add KeyboardShortcutsButton with Framer Motion pulsing dot + 'NEW' badge; button calls openShortcutsModal from context; dot/badge auto-dismiss on first open - apps/web/src/components/composed/CommandPalette.tsx Add footer hint: 'Press ? to see all keyboard shortcuts'
dgarson
added a commit
that referenced
this pull request
Feb 22, 2026
- Master pane/detail layout: left list + right detail panel - 12 seed notifications spanning agent, system, cron, model, session, file categories - Severity filter chips: All / Critical / Warning / Success / Info - Read/Unread/All filter + category dropdown - Search with Cmd+F focus (real-time filter across title+body+agentName) - Stats bar: per-severity counts at a glance - Mark read / Mark all read / Clear read / Pin / Dismiss actions - Detail panel: agent info card, meta identifier, event timeline, primary action button - Live simulation: new notification injected every 45s (aria-live polite) - Pinned notifications sort to top - Full keyboard accessibility: focus-visible rings, aria-selected, aria-label, aria-pressed - Clean build: ✓ 0 TS errors, 1.58s, 16.65 kB / gzip 4.82 kB - 18 total views in Horizon UI
dgarson
added a commit
that referenced
this pull request
Feb 22, 2026
* feat(ui): Agent configuration experience — gateway hooks, file editors, LLM assist, auto-review Major additions to the OpenClaw web UI: Gateway Integration Layer: - gateway-hooks.ts: React Query integration for all gateway RPC methods - Typed query/mutation hooks for agents, config, models, sessions, skills, etc. - Gateway event subscription hook for real-time updates Agent Configuration Experience: - AgentConfigPage: Tabbed config with progressive disclosure - SoulEditor: SOUL.md editor with split view and markdown preview - AgentFileEditor: Generic file editor for workspace files - AgentOverviewConfig: Identity card, file health, suggestions - Route: /agents/:agentId/configure LLM Assist Panel: - Conversational AI sidebar for configuration help - Context-aware suggestions per config section - Apply changes directly from suggestions Auto-Review Panel: - One-click config analysis with score/grade - Actionable fix suggestions Updated hooks and navigation to connect config flow. * fix(ui): lint cleanup — remove unused imports, prefix unused params - AutoReviewPanel: remove unused AnimatePresence, CardDescription; prefix unused params - SkillConfigurator: remove unused AnimatePresence, Button; prefix agentId - AgentConfigPage: remove unused AlertTriangle, RefreshCw, AGENT_FILES; wire SkillConfigurator into skills tab - LLMAssistPanel: remove unused RefreshCw, ScrollArea, Separator; prefix agentId - ModelBehaviorConfig: prefix unused isLoading param - ModelSelector: remove unused Badge; prefix placeholder param - useAgents: prefix unused isDefault param, fetchAgentsFromConfig fn * perf(ui): split @xyflow into separate vendor chunk @xyflow (React Flow for DAG visualization) was bundled into the vendor-react chunk despite only being used on workstream/workflow pages. Moving it to vendor-xyflow isolates 122 kB that's only loaded when needed. Before: vendor-react 557 kB (everything) After: vendor-react 433 kB + vendor-xyflow 122 kB (lazy) * feat(ui): content-shaped page skeletons for improved perceived performance Add page-specific skeleton loading states that match actual content layout: - HomeSkeleton: greeting, quick chat, agent grid, panel layout - AgentListSkeleton: header + search + 3x3 card grid - AgentDetailSkeleton: back nav, agent header, tabs, stats, content area - ConversationListSkeleton: sidebar + empty state - ChatThreadSkeleton: header, message bubbles pattern, input bar - SettingsSkeleton: sidebar nav + settings content - WorkstreamsSkeleton: header, filter tabs, workstream cards Wire AgentDetailSkeleton into /agents/[agentId] route. * fix(ui): UX polish — branding, cleanup, Skills route, container consistency - Fix sidebar branding: 'Second Brain' → 'OpenClaw', logo initial 'S' → 'O' - Remove 211 'use client' directives (Next.js artifact, meaningless in Vite) - Fix homepage greeting: remove hardcoded 'User!' placeholder - Normalize container patterns in Nodes and Jobs pages (remove redundant min-h-screen/max-w-7xl wrappers — AppShell already provides these) - Add new /skills route with full CRUD: list, search, filter, enable/disable, install from URL/ClawhHub, uninstall, detail panel with config view - Add Skills nav item to sidebar under Team section - All changes use existing gateway hooks and API layer (no new APIs needed) - Build passes cleanly (6.71s) * feat(ui): mobile bottom navigation for responsive layout - Add MobileBottomNav component with Home, Chat, Agents, Settings tabs - 'More' tab opens full sidebar as a slide-out sheet - Visible only on screens < md (768px), hidden on tablet/desktop - Auto-hides on fullscreen pages (onboarding, unlock) - Add bottom padding to content area on mobile to prevent nav overlap - Respects safe-area-inset for notched devices - Export from layout index * feat(ui): add Logs route and mobile navigation improvements - Add /logs route with log stream viewer (Power User mode) - Level filtering (trace/debug/info/warn/error/fatal) with counts - Search/filter by message or subsystem - Auto-scroll toggle, pause/resume stream - Export filtered logs as text file - Color-coded log levels with appropriate icons - Monospace font, compact density for log readability - Add Logs nav item to sidebar Power User section - Uses sample data for UI development; ready for gateway integration * fix(ui): rebrand Second Brain → OpenClaw, use profile name on home page - Sidebar: Updated logo text from 'Second Brain' to 'OpenClaw' - Home page: Reads user display name from profile settings instead of hardcoded 'User!' - Filesystem: Updated API endpoint and config references to openclaw.ai - App.tsx: Updated sandbox page branding Files changed: - /Users/openclaw/openclaw-ui-redesign/apps/web/src/components/layout/Sidebar.tsx - /Users/openclaw/openclaw-ui-redesign/apps/web/src/routes/index.tsx - /Users/openclaw/openclaw-ui-redesign/apps/web/src/routes/filesystem/index.tsx - /Users/openclaw/openclaw-ui-redesign/apps/web/src/App.tsx * feat(ui): add /logs route — real-time gateway log streaming - New route: /logs with polling-based log tail via gateway 'logs.tail' RPC - Features: level filtering (trace/debug/info/warn/error/fatal), text search, auto-follow, pause/resume, export to JSONL, entry counts per level - Dark terminal-style UI with color-coded log levels - Added to sidebar Power User section with ScrollText icon - Handles disconnected state gracefully Files changed: - /Users/openclaw/openclaw-ui-redesign/apps/web/src/routes/logs/index.tsx (new) - /Users/openclaw/openclaw-ui-redesign/apps/web/src/components/layout/Sidebar.tsx - /Users/openclaw/openclaw-ui-redesign/apps/web/src/routeTree.gen.ts (auto-generated) * feat(ui): add /analytics route — usage dashboard with token/cost/model/agent breakdowns - New route: /analytics with gateway 'sessions.usage' + 'usage.cost' RPC - Features: date range picker, stat cards (tokens/cost/messages/tools), daily bar charts (tokens + cost), model/agent/tool breakdowns with progress bars, full session table with sort-by-cost, expand/collapse - Token and cost breakdown cards showing input/output/cache splits - Responsive grid layout, loading skeletons, disconnected state - Added to sidebar Power User section with BarChart3 icon Files changed: - /Users/openclaw/openclaw-ui-redesign/apps/web/src/routes/analytics/index.tsx (new) - /Users/openclaw/openclaw-ui-redesign/apps/web/src/components/layout/Sidebar.tsx - /Users/openclaw/openclaw-ui-redesign/apps/web/src/routeTree.gen.ts (auto-generated) * fix(ui): add TanStack Router errorComponent on root route - RouteErrorComponent wraps ErrorFallback with router-aware recovery - 'Try Again' invalidates the current route (re-fetches data) - 'Go Home' navigates to / via router (no full page reload) - Complements existing React ErrorBoundary for render-crash recovery File changed: - /Users/openclaw/openclaw-ui-redesign/apps/web/src/routes/__root.tsx * a11y: skip nav, reduced motion, keyboard support, ARIA landmarks, live region announcer - Add SkipNavLink + SkipNavContent for keyboard users to bypass sidebar (WCAG 2.4.1) - Add ReducedMotionProvider wrapping app root — respects prefers-reduced-motion (WCAG 2.3.3) - Add role/tabIndex/onKeyDown to 6 interactive non-button elements: ToolCategorySection, ConversationItem, MemoryCard (2 variants), agent-plan task toggle, GatewaySetupStep radio cards - Add focus-visible ring styles to all fixed elements - Add aria-label/role='navigation' to Sidebar landmark - Add aria-expanded/aria-controls to expandable sections - Add useAnnounce hook + useRouteAnnouncer for screen reader live regions - Build verified: 7.03s, no errors * a11y: route change announcer + dynamic document.title - Announce navigation to screen readers via useAnnounce live region - Update document.title on route changes (e.g. 'Settings — OpenClaw') - Derives human-readable page name from URL path segment - WCAG 4.1.3: Status Messages compliance * feat(ui): agent activity feed widget on home dashboard - New AgentActivityFeed component with real-time agent activity stream - Shows agent avatar, activity type (7 types), description, relative timestamp - Color-coded activity icons: session started, message sent, tool called, task completed, task failed, agent spawned, file edited - Auto-refresh every 30s with live indicator pulse - Proper empty state with guidance text - ARIA: role=feed, role=article, aria-labels, semantic time elements - Mock data hook (useAgentActivity) ready for real API swap - Replaces placeholder widget on home page grid - Build: 6.96s, no errors * feat(ux): agent status indicators on avatars (#19) Add reusable AgentStatusDot component with Framer Motion pulse animations and useAgentStatus hook for deriving display status from agent store data. Status types: - Online (green, slow pulse): active within last 5 minutes - Busy (amber, fast pulse): currently processing or awaiting approval - Offline (gray, static): inactive - Error (red, static): error state Integrated into: - AgentAvatar (composed) — shared avatar used across the app - AgentCard (compact + expanded variants) — home grid and agent list - AgentSessionsIndicator — sidebar waiting-agents popover Includes auto-expiry timer in useAgentStatus that transitions online → offline when lastActive exceeds the 5-minute threshold. * feat(ux): keyboard shortcuts discoverability badge (#18) Changes landed in c6a1309 (co-committed with #19). Summary of changes: - apps/web/src/hooks/useShortcutsSeen.ts (new) localStorage-gated hook (key: oc_shortcuts_seen) tracking first-visit state - apps/web/src/hooks/index.ts Export useShortcutsSeen from hooks barrel - apps/web/src/providers/ShortcutsProvider.tsx Add ShortcutsContext exposing openShortcutsModal / shortcutsSeen / markShortcutsSeen; mark as seen whenever modal opens via keyboard, button, or command palette - apps/web/src/providers/index.ts Export ShortcutsContext and useShortcutsContext - apps/web/src/components/layout/Sidebar.tsx Add KeyboardShortcutsButton with Framer Motion pulsing dot + 'NEW' badge; button calls openShortcutsModal from context; dot/badge auto-dismiss on first open - apps/web/src/components/composed/CommandPalette.tsx Add footer hint: 'Press ? to see all keyboard shortcuts' * fix(a11y): dark mode color contrast improvements (#20) - Remove all text-muted-foreground opacity modifiers (/40, /50, /60, /70, /80) that caused WCAG AA failures in dark mode. Replaced with full-opacity text-muted-foreground which passes at 6.16:1 on background and 5.81:1 on card. - Add dark: overrides for hardcoded Tailwind gray/slate text colors: - text-gray-500 → dark:text-gray-400 (4.13:1→7.86:1) - text-gray-600 → dark:text-gray-400 (2.64:1→7.86:1) - text-slate-500 → dark:text-slate-400 (4.19:1→7.78:1) Affected components: 25 files across composed, domain, and route layers. Key contrast ratios (before → after on --background): muted-foreground/40: 1.88:1 → 6.16:1 muted-foreground/50: 2.32:1 → 6.16:1 muted-foreground/60: 2.85:1 → 6.16:1 muted-foreground/70: 3.52:1 → 6.16:1 muted-foreground/80: 4.27:1 → 6.16:1 gray-500: 4.13:1 → 7.86:1 (via gray-400) gray-600: 2.64:1 → 7.86:1 (via gray-400) slate-500: 4.19:1 → 7.78:1 (via slate-400) * feat(i18n): internationalization infrastructure with en/pt-BR/zh-CN/zh-TW (#11) - Add react-i18next, i18next, i18next-browser-languagedetector dependencies - Create i18n setup with language detection, localStorage persistence, en fallback - Add 4 locale files (en, pt-BR, zh-CN, zh-TW) with ~75 key strings each: - common actions (Save, Cancel, Delete, Create, etc.) - navigation labels (Home, Conversations, Goals, Memories, etc.) - home dashboard greetings and section titles - settings section headings and appearance labels - error messages - agent status labels - Import i18n initialization in main.tsx (before component tree) - Integrate useTranslation in 5 key components: - Sidebar: all nav labels and section titles - AppearanceSection: all labels + language selector with 4 language options - HomePage: time-of-day greeting - SettingsPage: page title and subtitle - YouPage: page title and subtitle - Language selector in You > Appearance with live switching * feat(ui): Monaco editor component with lazy loading, fallback textarea, Cmd+S save binding * fix(build): clear postcss.config.mjs — Tailwind v4 handled by @tailwindcss/vite plugin, not PostCSS * chore: update pnpm-lock.yaml for @monaco-editor/react dependency * feat(ui): activity heat map on agent-status route (#14) * feat(ui): agent relationship graph visualization (#13) - New route /agents/graph with live agent data from gateway - Parses session key patterns to infer spawn/delegation edges - ReagraphView integration with custom health-based node coloring - CSS fallback tree view when reagraph unavailable - Slide-in detail panel on node click: task, model, tokens, cost, links - Stats bar: total agents, active count, tokens, cost - Legend: health colors + spawn edge indicator - Back link to /agents, 15s auto-refresh - Added Network icon + Agent Graph link to sidebar Team section - Removed duplicate Logs entry from Power User section * feat(ui): chat-driven agent builder at /agents/new (#15) - New /agents/new route: conversational interface for agent creation - Split-panel: chat on left, live config preview on right - NLP parser: extracts name, role, tags, model, personality from freetext - Keyword inference for 8 roles (Monitor, Researcher, Developer, etc.) - Domain tag extraction for 15 platforms (github, slack, discord, email, etc.) - Model preference detection (opus, haiku, gpt-4, gemini, grok) - Personality trait extraction (concise, thorough, friendly, etc.) - Config preview: flash-highlights fields as they update (framer-motion) - Tags: editable inline with + input and × remove button - All fields manually editable in preview panel - Readiness checklist: name + description = ready to create - 5 suggested starter prompts (GitHub monitor, research, code review, etc.) - Animated typing indicator while processing - useCreateAgent() integration → navigates to agent config after creation - 'Chat Builder' secondary button added to agents list page header - Simple markdown renderer for **bold** and `code` in assistant messages * fix(ui): correct createAgent status field + add Graph View link to agent-status header - Chat builder: pass required status: 'offline' to createAgent.mutateAsync (Agent interface requires status, new agents start offline) - Agent Status dashboard: add 'Graph View' ghost button linking to /agents/graph (natural navigation path from status dashboard → relationship graph) * chore(ui): remove Next.js 'use client' directives from Vite project 8 files had 'use client' at the top — a Next.js App Router directive that is meaningless in Vite/React. Strips as dead noise. No behavior change. * docs: add approvals + milestone feed design doc Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: add approvals + milestone feed implementation plan Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: update plan with tsc-per-task, tests-only-at-end strategy Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(approvals): add ApprovalItem component * feat(approvals): add ApprovalsQueue with compact/full modes and agent grouping * feat(approvals): add MilestoneItem and MilestoneDetailPanel * feat(ui): redesign layout, session view, and nav components Redesigns the app shell, sidebar, nav items, session workspace, and agent status pages with updated visual styling. Adds TerminalOverlay component and updates NewSessionDialog, SessionHeader, and related routes. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(approvals): add MilestoneFeed with date grouping * feat(approvals): add InboxPanel slide-out with compact approvals + milestones * feat(approvals): add inbox icon + badge to sidebar * feat(approvals): add /approvals page with full queue and milestone feed * docs: add Configure tab redesign design doc Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(ui): fix calendar icon color, reassign button, pill heights, and arrow styling - Fix black native calendar picker icon on dark theme with CSS invert filter - Add prominent Reassign button with UserCog icon to agent assignment card in RitualDetailPanel - Align date/time content text with label text in schedule info cards (pl-6 indent) - Normalize execution pill font size to text-xs so Status, Tool Calls, and Token/Cost share the same height - Reduce TokenCostIndicator padding by 50% (px-3 py-1 → px-1.5 py-0.5) - Improve arrow button visibility in Recent Executions with muted-foreground color Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: add Configure tab redesign implementation plan Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor(approvals): reuse GoalDetailPanel in MilestoneFeed with highlightMilestoneId prop * fix(inbox): widen panel to 520px and add Open Inbox link in header * feat(agents): add embedded prop to AgentConfigPage * feat(agents): add AgentConfigureTab with nested builder/rituals/tools sub-tabs * chore(agents): export AgentConfigureTab from barrel * feat(agents): replace Rituals/Tools/Soul tabs with Configure nested tab panel Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(goals): add Edit button to Goal Details panel with working edit modal - Add headerActions slot to DetailPanel so callsites can inject title-bar buttons - Add Edit icon button in GoalDetailPanel title bar (visible without scrolling) - Remove goal.status !== 'completed' guard so any goal can be edited - Extend CreateGoalModal with edit mode: initialGoal prop pre-populates all fields, milestones preserve original IDs and completion state, title/CTA reflect edit context - Wire GoalsPage: handleEdit opens the shared modal in edit mode via useUpdateGoal Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore(ids): consolidate all UUID generation to uuidv7 Replace crypto.randomUUID() in new.lazy.tsx and the custom generateUUID() utility in gateway-client.ts with the project-standard uuidv7() from @/lib/ids. Also convert WebSocket on* property handlers to addEventListener calls and remove unused Card/CardContent imports surfaced during linting. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(assist): add rituals section prompts to LLMAssistPanel Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(sidebar): increase collapsed icon hit area and nav item spacing Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(agents): lift assist/review state and fix embedded padding in AgentConfigPage Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(agents): lift AI Assist and Auto Review to AgentConfigureTab level Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(agents): edit button navigates to configure tab, persist configureTab in URL Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore(agents): remove AgentSoulTab, consolidated into SoulEditor guided mode Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(ui): follow-ups + ph1 tab config Follow-ups: - GoalDetailPanel: add pl-6 indent to Due Date + Created content text - RitualScheduler: fix dark time input picker icon with CSS invert filter - RitualDetailPanel: add Trigger quick-action to DetailPanel headerActions slot - RitualsPage: wire onReassign → RitualAssignDialog (full agent reassignment flow) - Export RitualAssignDialog + RitualAssignPayload from rituals barrel Phase 1: - Add src/config/agent-tabs.ts with AGENT_TABS config, isValidTab(), resolveTab(), and TAB_REDIRECTS backwards-compat map for old tab URL params Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(ui): ph5 inheritance system - useInheritanceStore, InheritanceBadge, InheritableField Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(ui): ph2 new tab components - AgentWorkTab, AgentChatTab, WorkSubNav Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(ui): ph4 persona tier system - FeatureGate, usePersonaStore, PersonaTierSection Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(ui): ph3 - wire 5-tab structure into $agentId route Replaces local AgentDetailTab type with imported type + resolveTab() from config/agent-tabs.ts. Swaps workstreams tab for work (AgentWorkTab with WorkSubNav) and adds chat tab (AgentChatTab). Old URL params like ?tab=workstreams and ?tab=rituals are resolved to 'work' via TAB_REDIRECTS. Section param threaded through for WorkSubNav sub-navigation. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(ui): ph6 - responsive tab triggers and MobileTabNav Tab triggers now show icon+label stacked on mobile (grid-cols-5) and side-by-side on sm+. MobileTabNav provides a fixed bottom nav bar on mobile (hidden sm+) with the same 5-tab structure from AGENT_TABS. Bottom padding added to page content to prevent overlap with the bar. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * test(agents): update AgentConfigureTab tests for rewritten component * chore(agents): remove unused filesLoading destructure in AgentConfigureTab Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(agents): sync AgentConfigureTab sub-tab with URL on back/forward navigation Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore(routes): remove orphaned /agents/$agentId/configure full-page route Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(ui): expand command palette - full action vocab + NL intent (task 2) * feat(ui): live RPC-connected onboarding wizard (task 1) * test(ui): ph8 unit tests for tab config, stores, and feature gate components Add vitest setup fixes (in-memory localStorage mock + jsdom URL) to make zustand persist middleware work in tests, and update usePersonaStore tests to avoid replace=true state reset that strips action functions. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(ui): visual agent config editor - identity/model/memory/thinking (task 3) * Add isSlackId function to validate Slack IDs * Refactor Slack ID validation to use normalizeSlackId --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
dgarson
added a commit
that referenced
this pull request
Feb 23, 2026
* test: trim background hold duration in abort coverage
* test: reuse trigger harness defaults in custom configs
* test: align remaining trigger configs with fast harness defaults
* test: close bootstrap ws in approval bypass suite
* test: trim smoke duplicates and reuse telegram bot setup
* test: remove redundant channels smoke parse case
* test: speed up non-interactive gateway onboarding suite
* test: speed up thread-bindings shared-state loader test
* test: merge signal sender-prefix coverage into typing suite
* test: merge signal typing-read-receipt coverage into inbound contract suite
* test: speed up onboarding provider auth and temp-path guard scans
* test: drop duplicate timeout-fallback e2e and trim onboarding auth overlap
* docs: make subagents thread guidance channel-first
* docs: list thread supporting channels in subagents guide
* docs: clarify thread-bound subagents are Discord-only
* docs: keep channel names only in thread-support list
* docs: make subagents thread guidance channel-first (#23589) (thanks @osolmaz)
* style(ui): refine layout styles with adjustments to spacing, padding, and typography
* style(ui): update component styles with spacing, padding, and typography adjustments for improved layout
* refactor(ui): implement agent avatar resolution and logo fallback in agent rendering
* fix: harden session lock contention and cleanup
* test: dedupe doctor routing allowFrom migration coverage
* perf: lazy-load non-interactive onboarding heavy paths
* fix: align agent panel UI props after merge
* UI: polish dashboard — agents overview, chat toolbar, debug & login UX (#23553)
* UI: polish dashboard — agents overview, chat toolbar, debug simplification, login UX
* fix(ui): restore chat draft ordering, remove extra toolbar buttons
* UI: replace agent avatar fallback with lobster emoji
* style(ui): update layout styles for sidebar and shell, adjusting navigation widths for improved responsiveness
* feat(ui): implement sidebar resizing functionality and enhance navigation with new search and sorting features for sessions
* fix(ui): update references from ClawDash to OpenClaw in checklist and dashboard header
* style(ui): adjust sidebar minimum width and add responsive behavior for narrow states
* UI: minimal chat agent bar — remove sessions panel, strip chrome
* style(ui): update light theme colors and add ambient gradient for Luxe Cream & Coral
* UI: replace sparkle with OpenClaw lobster logo in chat
* style(ui): rename theme toggle to theme select and update related styles; adjust layout and spacing for agents and chat components
* style(ui): enhance agents panel layout with grid system, update toolbar styles, and refine usage chart presentation
* style(ui): adjust sessions table column width and refine agent model fields layout for better responsiveness
* style(ui): refine component styles for improved layout and responsiveness; adjust gradients, spacing, and element alignment across chat and agent interfaces
* ui: align chat-controls session container
* ui: enlarge agent controls for better touch targets
* ui: pass basePath to avatar renderer in grouped chat
* ui: formatting fixups from pre-commit hooks
* style(ui): update layout and spacing for chat controls; enhance select component styles and improve responsiveness
* UI: tighten chat header spacing and icon sizes
* UI: widen chat attachment gap
* style(ui): refine chat header layout and adjust icon sizes for improved visual consistency
* style(ui): enhance component styles and layout; introduce new inline field styles, update overview card design, and improve session filters for better usability
* style(ui): improve CSS formatting and consistency across components; adjust gradients, spacing, and layout for better readability and visual appeal
* fix(ui): correct rendering of empty state in overview cards by replacing 'nothing' with an empty string
* chore(skills): remove bundled food-order skill
* refactor(channels): dedupe plugin routing and channel helpers
* refactor(tui): dedupe handlers and formatter test setup
* refactor(runtime): consolidate followup, gateway, and provider dedupe paths
* test(core): increase coverage for sessions, auth choice, and model listing
* test: fix flaky auth tests when OPENCLAW_GATEWAY_TOKEN is present
* test: isolate doctor allowFrom migration assertions from unrelated checks
* test: speed up slow media and synology suites
* test: share fast-path mocks for targeted doctor suites
* test: stabilize acp cwd prefix assertions across env leakage
* fix: downgrade telegram autoSelectFamily log to debug
* docs(workq): expand Pi/ARM runtime portability guidance in README
- Replace minimal Pi note with comprehensive portability table (node:sqlite,
Node version, architecture, WAL/filesystem considerations)
- Add recommended database path section for Pi (/data/openclaw/workq/workq.db)
with config example and directory setup commands
- Add 5-step probe/verification command sequence for new host deployments
- Fix hardcoded local path in Installation section to use relative repo path
* fix(signal): guard JSON.parse of Signal RPC response with try-catch
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: add signal rpc malformed-json regression test (#22995) (thanks @adhitShet)
* fix: gate tool error details behind verbose
* docs: document verbose-gated tool error details
* fix(workq): remove rootDir from tsconfig to allow plugin-sdk imports
* style(workq): fix formatting issues in extension files
* docs(workq): expand CLAUDE.md with comprehensive tool guidance
Enhances workq extension documentation for Claude Code agents with:
- Detailed breakdown of all 8 queue tools with parameters and examples
- Expected call order workflow (claim -> status/files -> in-review -> done)
- Status state machine diagram and valid transitions
- Practical examples covering happy path, conflicts, blocked tasks, queries
- Common pitfalls and integration notes for platform squad agents
- File conflict detection guidance
Provides agents with actionable reference for coordinating work across
the multi-agent fleet.
* refactor(signal): extract rpc parse helper and validate response envelope
* refactor: centralize tool-error visibility policy
* test: skip CLI auto-detect e2e tests on Windows (#23626)
* fix(agents): skip auth profile cooldown for timeout failures
A timeout is model/network-specific, not an auth issue. Marking the
auth profile as failed on timeout poisons fallback models on the same
provider (e.g. gpt-5.3 timeout would block gpt-5.2 via shared profile
cooldown). The prompt-phase path already guards against this; this
aligns the post-response timeout path to match.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: align timeout cooldown behavior docs/tests (#22622) (thanks @vageeshkumar)
* fix(config-reload): skip reload when config file is not found
When a config file is written atomically (tmp → rename), chokidar can
fire an 'unlink' event for the temporary removal of the destination file
before the rename completes. runReload() would then call readSnapshot(),
which returns { exists: false, valid: true, config: {} } — an empty
config that looks valid — causing diffConfigPaths() to find many changes
and triggering an unnecessary SIGUSR1 restart.
The restarted gateway process then fails to find the config file (still
in the middle of the write) and enters a crash loop with:
'Missing config. Run openclaw setup...'
Fix: guard against exists=false before the existing valid=false check,
so mid-write snapshots are silently skipped rather than treated as a
config wipe.
Fixes #23321
* fix: retry missing config snapshots before skip (#23343) (thanks @lbo728)
* fix(telegram): add dnsResultOrder=ipv4first default on Node 22+ to fix fetch failures (#5405)
Merged via /review-pr -> /prepare-pr -> /merge-pr.
Prepared head SHA: 71366e9532b6c67f0413b65a9ac8623eae000e9b
Co-authored-by: Glucksberg <80581902+Glucksberg@users.noreply.github.com>
Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com>
Reviewed-by: @obviyus
* refactor: split config reload flow and test harness
* fix(workq): correct test mock for WorkqDatabase class constructor
The previous test used vi.fn() to mock the WorkqDatabase class, but this
doesn't work properly when the actual code uses 'new WorkqDatabase()'.
Changed to use a proper class mock with vi.hoisted() to ensure the mock
functions are available when the vi.mock() factory runs.
All 41 tests now pass.
* fix(ssrf): centralize host/ip block checks
* refactor: dedupe auth-profile failure marking and rotation test setup
* test: dedupe expensive web auto-reply compression coverage
* test: speed up agent command suite with lightweight runtime mocks
* refactor: extract gateway transcript append helper
* test: speed up signal reconnect and temp path guard scans
* docs(changelog): credit SSRF report in unreleased notes
* fix(security): harden shell env fallback startup env handling
* fix(telegram): skip failed photo downloads in media group instead of dropping entire group (#20598)
Merged via /review-pr -> /prepare-pr -> /merge-pr.
Prepared head SHA: 4a9c5f7af7c136952bf5dd396acee7f9f4e3c5d1
Co-authored-by: mcaxtr <7562095+mcaxtr@users.noreply.github.com>
Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com>
Reviewed-by: @obviyus
* fix(agents): stop param shadowing in auth failure marker
* docs: add concise gh search playbook to AGENTS
* feat(horizon-ui): Horizon UI — 19-view operator dashboard (Vite + React + Tailwind) (#61)
* feat(horizon-ui): add Horizon UI — 19-view operator dashboard (Vite + React + Tailwind)
19 fully functional views: AgentDashboard, AgentBuilderWizard, AgentSoulEditor,
AgentIdentityCard, AgentConfigReview, AgentPulseMonitor, SessionExplorer,
CronScheduleBuilder, NodeManager, ModelSelector, SkillsMarketplace,
UsageDashboard, SettingsDashboard, ApiKeysManager, NotificationCenter,
WorkspaceFileBrowser, OnboardingFlow, ChatInterface, ProviderAuthManager.
App shell: Cmd+K palette, Alt+1-9 shortcuts, history nav, mobile responsive,
skip-nav a11y, ViewErrorBoundary, ARIA landmarks. Adaptive proficiency system
(ProficiencyStore, ComplexityGate, ProficiencyBadge). Toast + Skeleton loaders.
WCAG 2.1 AA throughout. 0 TS errors, 1.4s build.
* feat(horizon-ui): expand to 260 views — full-stack operator platform UI
Overnight sprint expansion: from 19 → 260 views. All views build cleanly
(3.89s, 0 TypeScript errors, lazy-loaded chunks).
New view categories added:
- Observability: ObservabilityDashboard, MetricsDrilldown, ErrorTrackingDashboard,
LogViewer, TelemetryViewer, IncidentTimeline, SLAManager, AlertCenter
- Security: SecurityDashboard, AccessControlMatrix, VaultSecretsManager,
SecurityAuditTrail, ComplianceDashboard, ThreatIntelligenceFeed, PolicyManager
- Cost & Billing: BillingSubscription, CostOptimizer, BudgetTracker,
CloudCostOptimizer, InfrastructureCostManager, PricingCalculator
- AI/ML: LLMPlayground, MLModelRegistry, EmbeddingExplorer, ModelBenchmark,
MultiModelComparator, PromptOptimizer, AgentTracer, ContextWindowViewer
- DevOps: ReleasePipeline, DeploymentTracker, ContainerRegistry, PipelineMonitor,
GitHubIntegration, CDNManager, BackupManager, DisasterRecoveryPlanner
- Data: DataCatalog, DataLineageViewer, DatabaseSchemaExplorer, DataPipelineViewer,
EventStreamViewer, ChangeDataCapture, DataQualityDashboard
- Collaboration: SprintBoard, TeamManagement, GanttChartView, GoalTracker,
FeatureRequestBoard, ContentCalendar, OnCallRotationManager
- Agent-specific: AgentRelationshipTopology, AgentCollaborationGraph, AgentMemoryViewer,
AgentWorkload, AgentInbox, AgentDiffViewer, AgentInsights, ContextBrowser
- Platform admin: PermissionsMatrix, MultiTenantManager, SSOConfigManager,
ScimUserProvisioner, ServiceAccountManager, ResourceQuotaManager
- Developer tools: ApiPlayground, GraphQLExplorer, OpenAPIExplorer, SandboxRunner,
LLMPlayground, MCPInspector, StreamingDebugger, WebhookDebugger
* feat(horizon-ui): integrate worker PRs #63-67 — net-new components and views
Extracted net-new files from worker branches. All additive — no conflicts with
the 260-view main branch. Existing shared infrastructure (commandRegistry,
tourStore, OnboardingTour) already present from overnight sprint.
New views:
- AgentTopologyView (wes/bs-ux-2) — force-directed graph agent topology
- DatabaseQueryAnalyzer (wes bonus)
- FeatureFlagManager (piper bonus)
New components:
- ui/skill-builder/ — SkillBuilder IDE (piper/bs-ux-5)
- ui/empty-state/ — EmptyState contextual variants (piper/bs-ux-10)
- ui/schema-form/ — Schema-driven form system with validation + live preview (piper/bs-ux-8)
Worker PRs #63-67 closed in favor of this integration commit.
Reviewed by: Luis (Principal UX Engineer)
* fix(horizon-ui): remove AgentTopologyView — d3-force dep not available
AgentTopologyView used d3-force which is not in package.json (intentional).
AgentRelationshipTopology.tsx already covers this surface with pure CSS/SVG.
Removing broken file to restore clean build.
* fix(horizon-ui): remove orphaned Zustand-dependent worker files
OnboardingTour, tourStore, commandRegistry were added by worker branches
but (a) import Zustand which is not in package.json, and (b) are not
imported or used anywhere in the app. Removing to restore clean build.
* fix(horizon-ui): replace d3-force AgentTopologyView with pure-React physics; add 3 missing views
- AgentTopologyView: rewrote using rAF-based spring physics (no external deps)
forces: n-body repulsion + spring edges + center gravity + damping
features: live simulation, filter controls, detail panel, status rings, edge legend
- ChangeManagementBoard: ported from luis local workspace
- CostAllocationDashboard: ported (fixed unused fn lint error)
- MultiRegionFailoverManager: ported from luis local workspace
Build: ✓ 0 TS errors — 4.65s
Note: tsconfig baseUrl lint error is pre-existing, unrelated to these changes
* feat(horizon-ui): fix build — 3 missing views + worker component library
Views (fixed missing refs in App.tsx):
- ChangeManagementBoard — CAB workflow, approval chains, risk assessment
- MultiRegionFailoverManager — region health, latency, one-click failover
- CostAllocationDashboard — spend by model/team, daily chart, budget tracking
Component library (from worker PRs):
- ui/empty-state/ — EmptyState with contextual variants (piper/bs-ux-10)
- ui/skill-builder/ — SkillBuilder IDE component (piper/bs-ux-5)
- ui/schema-form/ — Schema-driven form system + live preview (piper/bs-ux-8)
Build: ✓ 1854 modules, 4.27s, 0 errors
* fix(schema-form): remove phantom Zod dependency — pure TS validation, 0 TSC errors
- Rewrote validation.ts with native TypeScript validation (no Zod)
- Replaced z.ZodType<unknown> in types.ts with FieldValidator fn type
- Removed formSchemaToZod from exports (no longer needed)
- All 3 schema-form files now clean: 0 TSC errors codebase-wide
- Build fully clean: 0 errors, 267 views
* feat(horizon-ui): add MorningPacket — daily operator briefing (Alt+1)
* fix(telegram): link forwarded messages with comments (#9720)
Merged via /review-pr -> /prepare-pr -> /merge-pr.
Prepared head SHA: 5f81061b5f613903422a624d95aab8b0fc04027a
Co-authored-by: mcaxtr <7562095+mcaxtr@users.noreply.github.com>
Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com>
Reviewed-by: @obviyus
* refactor(net): consolidate IP checks with ipaddr.js
* Telegram: coalesce forwarded text+media bursts into one inbound turn (#19476)
Merged via /review-pr -> /prepare-pr -> /merge-pr.
Prepared head SHA: 09e0b4e9bd1a799c30249f21b87782429a8f8e32
Co-authored-by: napetrov <18015221+napetrov@users.noreply.github.com>
Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com>
Reviewed-by: @obviyus
* feat(update): add core auto-updater and dry-run preview
* feat(memory): add Japanese query expansion support for FTS (#23156)
* Memory: add Japanese query expansion support
* Docs/Changelog: credit Japanese FTS update
* refactor(security): unify local-host and tailnet CIDR checks
* Memory: add Spanish and Portuguese query expansion stop words (#23710)
* fix(update): run auto-update via runtime argv and keep it independent of checkOnStart
* fix(infra): treat undici fetch failed as transient unhandled rejection
* fix(telegram): restart stalled polling after unhandled network errors
* fix(net): enable family fallback for pinned SSRF dispatcher
* docs(telegram): align Node22 network defaults and setup guidance
* fix(telegram): keep webhook monitor alive until abort
Co-authored-by: Evgeny Zislis <7056+kesor@users.noreply.github.com>
* fix(telegram): harden polling retry setup and teardown order
Co-authored-by: Cklee <99405438+liebertar@users.noreply.github.com>
Co-authored-by: Ho Lim <166576253+HOYALIM@users.noreply.github.com>
* fix(telegram): clear webhook state before polling startup
Co-authored-by: Peter Machona <7957943+chilu18@users.noreply.github.com>
* fix(telegram): wire webhookPort through config and startup
Co-authored-by: xrf9268-hue <244283935+xrf9268-hue@users.noreply.github.com>
* fix(telegram): notify users on media download failures
Co-authored-by: Artale <117890364+arosstale@users.noreply.github.com>
* fix(logging): cap file logs with configurable maxFileBytes
Co-authored-by: Xinhua Gu <562450+xinhuagu@users.noreply.github.com>
* test: trim gateway fixture sizes and preload message command
* test: preload onboarding command modules in hot suites
* test: preload safe-bins tool module in suite
* test: preload bash exec path tool module in suite
* test: preload sandbox explain command module in suite
* test: preload doctor command in migration suites
* test: speed up weak random guardrail scan
* test: merge download archive safety suites
* style: format skills install download test
* test: cache plugin install archive fixtures
* test: trim gateway sigterm bootstrap imports
* test: isolate skills suite env and trim scan overhead
* test: trim cli program test bootstrap overhead
* test: isolate skills-install temp home env
* test: dedupe pi embedded runner setup and orphan case
* test: reduce bash tool suite sleep durations
* test: precompute skills download tar fixture and dedupe setup
* test: reduce web auto-reply watchdog timer churn
* test: narrow weak-random rg scan globs
* test: optimize temp path guard scan prefilter
* test: reduce bash background abort wait constants
* test: speed up qmd boot retry lock test
* test: trim bash tool timing constants
* test: tighten bash timeout poll upper bound
* test: tighten process timeout fixtures
* test: replace slow gateway SIGTERM integration coverage
* test: trim duplicate smoke and embedded runner cases
* test: speed up skills download tar traversal fixture
* test: trim duplicate program smoke onboarding coverage
* test: remove redundant runner ordering checks
* test: trim duplicate async-search status reopen check
* perf(test): speed temp-path AST scan
* fix: preserve stored provider in resolveSessionModelRef for vendor-prefixed models (#22753)
* fix: preserve stored provider in resolveSessionModelRef for vendor-prefixed models
When an OpenRouter model with a vendor prefix (e.g. "anthropic/claude-haiku-4.5")
was successfully used and persisted to the session entry, the next call to
resolveSessionModelRef would re-parse the model string through parseModelRef,
which splits on the first slash and incorrectly extracts "anthropic" as the
provider — discarding the stored "openrouter" provider entirely. This caused
subsequent requests to attempt direct Anthropic API calls with an OpenRouter
API key, producing "credit balance too low" billing errors.
The fix trusts the explicitly stored modelProvider on the session entry and
skips parseModelRef re-parsing when a provider is already recorded. parseModelRef
is still used as a fallback when no provider is stored on the entry.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Changelog: add OpenRouter note for #22753
---------
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
* fix(providers): preserve openrouter/ prefix for native models (#12942)
* fix(providers): preserve openrouter/ prefix for native models (#12924)
OpenRouter-native models like 'openrouter/aurora-alpha' need the full
'openrouter/<name>' as the model ID in API requests. The existing
parseModelRef() stripped the prefix, sending just 'aurora-alpha'
which OpenRouter rejects with 400.
Fix: normalizeProviderModelId() now re-adds the 'openrouter/' prefix
for models without a slash (native models), while passing through
external provider models (e.g. 'anthropic/claude-sonnet-4-5') as-is.
Closes #12924
* Changelog: add OpenRouter note for #12942
---------
Co-authored-by: Luna AI <luna@coredirection.ai>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
* Update CHANGELOG.md
* feat: pass through OpenRouter provider routing params (#17148)
extraParams.provider was silently dropped by createStreamFnWithExtraParams().
This change injects it into model.compat.openRouterRouting so pi-ai's
buildParams includes params.provider in the API request body.
Enables OpenRouter provider routing options (only, order, allow_fallbacks,
data_collection, ignore, sort, quantizations) via model config:
```jsonc
"openrouter/model-name": {
"params": {
"provider": {
"only": ["deepinfra", "fireworks"],
"allow_fallbacks": false
}
}
}
```
Closes #10869
✍️ Author: Claude Code with @carrotRakko (AI-written, human-approved)
* test: dedupe agent tests and session helpers
* test: dedupe auto-reply web and signal flows
* refactor: dedupe core config and runtime helpers
* test: dedupe gateway browser discord and channel coverage
* Update CHANGELOG.md
* fix(openrouter): pass reasoning.effort based on thinking level (#14664) (#17236)
* fix(openrouter): pass reasoning.effort to OpenRouter API (#14664)
* Agents: pass thinkLevel to extra-params wrapper
* Changelog: note fix/openrouter-reasoning-effort-14664 OpenRouter fix
* Changelog: fix OpenRouter entry text
---------
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
* refactor(memory): add guarded remote HTTP helper
* fix(memory): enforce guarded remote policy for embeddings
* fix(memory): route batch APIs through guarded remote HTTP
* docs(changelog): add memory remote-guard hardening notes
* Memory: add Arabic query expansion stop words (#23717)
* Default reasoning to on when model has reasoning: true (fix #22456) (#22513)
* Default reasoning to on when model has reasoning: true (fix #22456)
What: When a model is configured with reasoning: true in openclaw.json (e.g. OpenRouter x-ai/grok-4.1-fast), the session now defaults reasoningLevel to on if the user has not set it via /reasoning or session store.
Why: Users expected setting reasoning: true on the model to enable reasoning; previously only session/directive reasoningLevel was used and it always defaulted to off, so Think stayed off despite the model config.
* Chore: sync formatted files from main for CI
* Changelog: note zwffff/main OpenRouter fix
* Changelog: fix OpenRouter entry text
* Update msteams.md
* Update msteams.md
* Update msteams.md
---------
Co-authored-by: 曾文锋0668000834 <zeng.wenfeng@xydigit.com>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
* OpenRouter: allow any model ID instead of restricting to static catalog (#14312)
* OpenRouter: allow any model ID instead of restricting to static catalog
OpenRouter models were restricted to a hardcoded prefix list in the internal model catalog, preventing use of newly added or less common models. This change makes OpenRouter work as the pass-through proxy it is -- any valid OpenRouter model ID now resolves dynamically.
Fixes https://github.com/openclaw/openclaw/issues/5241
Changes:
- Add OpenRouter as an implicit provider in resolveImplicitProviders so models.json is populated when an API key is detected (models-config.providers.ts)
- Add a pass-through fallback in resolveModel that creates OpenRouter models on-the-fly when they aren't pre-registered in the local catalog (
model.ts
)
- Remove the static prefix filter for OpenRouter/opencode in isModernModelRef (live-model-filter.ts)
* Apply requested change for maxTokens
* Agents: remove dead helper in live model filter
* Changelog: note Joly0/main OpenRouter fix
* Changelog: fix OpenRouter entry text
---------
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
* refactor(gateway): unify auth credential resolution
* fix(cache): inject cache_control into system prompt for OpenRouter Anthropic (#15151) (#17473)
* fix(cache): inject cache_control into system prompt for OpenRouter Anthropic
Add onPayload wrapper that injects cache_control: { type: "ephemeral" }
into the system/developer message content for OpenRouter requests routed
to Anthropic models. The system prompt is typically ~18k tokens and was
being re-processed on every request without caching.
Fixes #15151
* Changelog: add OpenRouter note for #17473
---------
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
* fix: remove trailing newline from CLAUDE.md symlink target (#21160)
* fix: remove trailing newline from CLAUDE.md symlink target
* Dev tooling: prevent CLAUDE symlink newline regressions
---------
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
* test(installer): drop legacy gum env from docker smoke
* fix(cron): propagate auth-profile resolution to isolated sessions (#20624) (#20689)
* fix(auto-reply): preserve OpenRouter @preset model directives (#23769)
* Auto-reply: preserve OpenRouter @preset model directives
* Changelog: move OpenRouter preset fix into 2026.2.22 unreleased
* fix(discord): make opus optional and log fallback
* fix(hooks): suppress main session events for silent/delivered hook turns (#20678)
* fix(hooks): suppress main session events for silent/delivered hook turns
When a hook agent turn returns NO_REPLY (SILENT_REPLY_TOKEN), mark the
result as delivered so the hooks handler skips enqueueSystemEvent and
requestHeartbeatNow. Without this, every Gmail notification classified
as NO_REPLY still injects a system event into the main agent session,
causing context window growth proportional to email volume.
Two-part fix:
- cron/isolated-agent/run.ts: set delivered:true when synthesizedText
matches SILENT_REPLY_TOKEN so callers know no notification is needed
- gateway/server/hooks.ts: guard enqueueSystemEvent + requestHeartbeatNow
with !result.delivered (addresses duplicate delivery, refs #20196)
Refs: https://github.com/openclaw/openclaw/issues/20196
* Changelog: document hook silent-delivery suppression fix
---------
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
* docs(changelog): note installer gum auto-path smoke coverage
* test: drop duplicate nodes media parser coverage
* test: trim duplicate plain nodes list smoke
* perf(test): tighten temp-path dynamic prefilter
* perf(test): prebuild download archives and cache apply module
* test: collapse duplicate sandbox skill mirroring cases
* perf(test): run nodes program tests on focused nodes-cli harness
* perf(test): speed async memory sync close coverage
* test: merge duplicate targetDir escape cases
* test: combine duplicate process log tail-window coverage
* perf(test): reuse tar.bz2 workspace in download safety tests
* test: trim duplicate embedded runner setup cases
* perf(test): share workspace fixture in skills download safety suite
* perf(test): shorten bash tool timing fixtures
* test: merge duplicate bash background session-name coverage
* perf(test): replace temp-path guard AST parse with fast scanner
* perf(test): lazy-load weak-random fallback scanner
* test: consolidate sudo fallback edge-case scenarios
* test: merge no-op notifyOnExit scenario coverage
* perf(test): consolidate archive safety cases and cache session manager
* test: consolidate embedded prompt error scenarios
* refactor(browser): dedupe control-server test harness
* refactor(queue): share drain helpers across announce and reply
* refactor(outbound): reuse signal uuid detection and payload types
* refactor(discord): dedupe directory and media send paths
* refactor(agents): dedupe config and truncation guards
* fix(feishu): enforce id-only allowlist matching
* fix(network): normalize SSRF IP parsing and monitor typing
* refactor(gateway): unify credential precedence across entrypoints
* perf(test): trim embedded/bash runtime fixture overhead
* fix(slack): resolve user IDs to DM channels before files.uploadV2 (#23773)
When a bare Slack user ID (U-prefix) is passed as the send target
without an explicit `user:` prefix, `parseSlackTarget` classifies it as
kind="channel". `resolveChannelId` then passes it through to callers
without calling `conversations.open`.
This works for `chat.postMessage` (which tolerates user IDs), but
`files.uploadV2` delegates to `completeUploadExternal` which validates
`channel_id` against `^[CGDZ][A-Z0-9]{8,}$` — rejecting U-prefixed
IDs with `invalid_arguments`.
Fix: detect U-prefixed IDs in `resolveChannelId` regardless of the
parsed `kind`, and always resolve them via `conversations.open` to
obtain the DM channel ID (D-prefix).
Includes test coverage for bare, prefixed, and mention-style user ID
targets with file uploads, plus a channel-target negative case.
* fix: stabilize CI type and test harness coverage
* fix(browser): harden extension relay reconnect race
Co-authored-by: Ho Lim <166576253+HOYALIM@users.noreply.github.com>
* fix(browser): harden extension relay worker recovery
Co-authored-by: codexGW <9350182+codexGW@users.noreply.github.com>
* fix(browser): recover stale remote target ids
Co-authored-by: Ilya Strelov <10761735+strelov1@users.noreply.github.com>
* test(flaky): harden slow vmFork unit suites
Co-authored-by: Ho Lim <166576253+HOYALIM@users.noreply.github.com>
* fix(ci): annotate shared skill-install test mocks
* fix(feishu): restore group command fallback and plugin deps
* Dev tooling: prevent CLAUDE symlink newline regressions
* Changelog: fix unreleased thanks attribution placement
* fix(telegram): set provider on native command context
Co-authored-by: Serhii Panchyshyn <panchyshyn.serhii@gmail.com>
* fix(feishu): prefer video file_key for inbound media
* test(ci): harden background abort timing on windows
* fix(plugins): sanitize workspace deps before plugin install
Co-authored-by: guanyu-zhang <guanyu-zhang@users.noreply.github.com>
* fix(config): persist built-in channel enable state in channels
Co-authored-by: HirokiKobayashi-R <HirokiKobayashi-R@users.noreply.github.com>
* fix(plugins): ignore archived extension dirs during discovery
Co-authored-by: chenzhuoms <chenzhuoms@users.noreply.github.com>
* fix(gateway): skip operator pairing on valid shared auth
* fix(slack): preserve string thread context in queue + DM route (#23804)
* fix(slack): preserve thread_ts in queue drain and deliveryContext
Two related fixes for Slack thread reply routing:
1. Queue drain drops string thread_ts (#11195)
- `typeof threadId === "number"` in drain.ts only matches Telegram numeric
topic IDs. Slack thread_ts is a string like "1770474140.187459" which
fails the check, causing threadKey to become empty.
- Changed to `threadId != null && threadId !== ""` to accept both number
and string thread IDs.
- Applies to all 3 occurrences in drain.ts: cross-channel detection,
thread key building, and collected originatingThreadId extraction.
2. DM deliveryContext missing thread_ts (#10837)
- updateLastRoute calls for Slack DMs in both prepare.ts and dispatch.ts
built deliveryContext without threadId, so the session's delivery context
never included thread_ts for DM threads.
- Added threadId from threadContext.messageThreadId / ctxPayload.MessageThreadId
to both updateLastRoute call sites.
Tests: 3 new cases in queue.collect-routing.test.ts
- Collects messages with matching string thread_ts (same Slack thread)
- Separates messages with different string thread_ts (different threads)
- Treats empty string threadId same as absent
Closes #10837, closes #11195
* fix(slack): preserve string thread context in queue + DM route updates
---------
Co-authored-by: RobClawd <clawd@RobClawds-Mac-mini.local>
* fix(slack): finalize replyToMode off threading behavior (#23799)
* fix: make replyToMode 'off' actually prevent threading in Slack
Three independent bugs caused Slack replies to always create threads
even when replyToMode was set to 'off':
1. Typing indicator created threads via statusThreadTs fallback (#16868)
- resolveSlackThreadTargets fell back to messageTs for statusThreadTs
- 'is typing...' was posted as thread reply, creating a thread
- Fix: remove messageTs fallback, let statusThreadTs be undefined
2. [[reply_to_current]] tags bypassed replyToMode entirely (#16080)
- Slack dock had allowExplicitReplyTagsWhenOff: true
- Reply tags from system prompt always threaded regardless of config
- Fix: set allowExplicitReplyTagsWhenOff to false for Slack
3. Contradictory replyToMode defaults in codebase (#20827)
- monitor/provider.ts defaulted to 'all'
- accounts.ts defaulted to 'off' (matching docs)
- Fix: align provider.ts default to 'off' per documentation
Fixes: openclaw/openclaw#16868, openclaw/openclaw#16080, openclaw/openclaw#20827
* fix(slack): respect replyToMode in DMs even with typing indicator thread
When replyToMode is 'off' in DMs, replies should stay in the main
conversation even when the typing indicator creates a thread context.
Previously, when incomingThreadTs was set (from the typing indicator's
thread), replyToMode was forced to 'all', causing all replies to go
into the thread.
Now, for direct messages, the user's configured replyToMode is always
respected. For channels/groups, the existing behavior is preserved
(stay in thread if already in one).
This fix:
- Keeps the typing indicator working (statusThreadTs fallback preserved)
- Prevents DM replies from being forced into threads
- Maintains channel thread continuity
Fixes #16868
* refactor(slack): eliminate redundant resolveSlackThreadContext call
- Add isThreadReply to resolveSlackThreadTargets return value
- Remove duplicate call in dispatch.ts
- Addresses greptile review feedback with cleaner DRY approach
* docs(slack): add JSDoc to resolveSlackThreadTargets
Document return values including isThreadReply distinction between
genuine user thread replies vs bot status message thread context.
* docs(changelog): record Slack replyToMode off threading fixes
---------
Co-authored-by: James <jamesrp13@gmail.com>
Co-authored-by: theoseo <suhong.seo@gmail.com>
* test: load chrome extension background utils across module modes
* fix(config): allowlist auto-enabled built-in channels when restricted
Co-authored-by: 4rev <4rev@users.noreply.github.com>
* fix(replies): keep finals for cross-target messaging sends
Co-authored-by: Ion Mudreac <mudreac@gmail.com>
* fix(replies): normalize media path variants for dedupe
Co-authored-by: Ho Lim <subhoya@gmail.com>
* fix: add mistral to MemorySearchSchema provider/fallback unions (#14934)
* fix: add mistral to MemorySearchSchema provider/fallback unions
The Mistral embedding provider was added to the runtime code but the
Zod config schema was not updated, causing config validation to reject
`provider: "mistral"` and `fallback: "mistral"` as invalid input.
* Changelog: add unreleased note for Mistral memory schema fix
---------
Co-authored-by: Drake (Moltbot Dev) <drake@clawd.bot>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
* fix: sanitize tool call IDs in agent loop for Mistral strict9 format (#23595) (#23698)
* fix: sanitize tool call IDs in agent loop for Mistral strict9 format (#23595)
Mistral requires tool call IDs to be exactly 9 alphanumeric characters
([a-zA-Z0-9]{9}). The existing sanitizeToolCallIdsForCloudCodeAssist
mechanism only ran on historical messages at attempt start via
sanitizeSessionHistory, but the pi-agent-core agent loop's internal
tool call → tool result cycles bypassed that path entirely.
Changes:
- Wrap streamFn (like dropThinkingBlocks) so every outbound request
sees sanitized tool call IDs when the transcript policy requires it
- Replace call_${Date.now()} in pendingToolCalls with a 9-char hex ID
generated from crypto.randomBytes
- Add Mistral tool call ID error pattern to ERROR_PATTERNS.format so
the error is correctly classified for retry/rotation
* Changelog: document Mistral strict9 tool-call ID fix
---------
Co-authored-by: echoVic <AkiraVic@outlook.com>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
* test(gateway): align auto-enable channel assertion
* refactor: share install flows across hooks and plugins
* test: cover shared installer flow helpers
* refactor: dedupe shared config type definitions
* refactor: dedupe media and request-body test scaffolding
* test: dedupe repeated test fixtures and assertions
* fix(gateway): clarify pairing and node auth guidance
* fix(agents): validate tool-result MEDIA directives with shared parser
Co-authored-by: Ho Lim <166576253+HOYALIM@users.noreply.github.com>
* test(agents): add malformed MEDIA prose integration coverage
Co-authored-by: Ho Lim <166576253+HOYALIM@users.noreply.github.com>
* revert(ui): remove recent UI dashboard/theme commits from main
Co-authored-by: Cursor <cursoragent@cursor.com>
* revert(ui): remove UI portions of mixed commits from main
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(ui): ensure nonce is always a string in gateway connect
* docs: align CLI docs and help surface
* feat(workq): integrate workq extension into repo (#54)
* feat: register workq gateway rpc handlers
* feat(workq): integrate extension scaffolding and gateway bindings
* docs(workq): expand Pi/ARM runtime portability guidance in README
- Replace minimal Pi note with comprehensive portability table (node:sqlite,
Node version, architecture, WAL/filesystem considerations)
- Add recommended database path section for Pi (/data/openclaw/workq/workq.db)
with config example and directory setup commands
- Add 5-step probe/verification command sequence for new host deployments
- Fix hardcoded local path in Installation section to use relative repo path
* fix(workq): remove rootDir from tsconfig to allow plugin-sdk imports
* style(workq): fix formatting issues in extension files
* docs(workq): expand CLAUDE.md with comprehensive tool guidance
Enhances workq extension documentation for Claude Code agents with:
- Detailed breakdown of all 8 queue tools with parameters and examples
- Expected call order workflow (claim -> status/files -> in-review -> done)
- Status state machine diagram and valid transitions
- Practical examples covering happy path, conflicts, blocked tasks, queries
- Common pitfalls and integration notes for platform squad agents
- File conflict detection guidance
Provides agents with actionable reference for coordinating work across
the multi-agent fleet.
* fix(workq): correct test mock for WorkqDatabase class constructor
The previous test used vi.fn() to mock the WorkqDatabase class, but this
doesn't work properly when the actual code uses 'new WorkqDatabase()'.
Changed to use a proper class mock with vi.hoisted() to ensure the mock
functions are available when the vi.mock() factory runs.
All 41 tests now pass.
* workq enforcement: session-end auto-release + stale sweep + commit footer parsing (#71)
* feat: register workq gateway rpc handlers
* feat(workq): integrate extension scaffolding and gateway bindings
* docs(workq): expand Pi/ARM runtime portability guidance in README
- Replace minimal Pi note with comprehensive portability table (node:sqlite,
Node version, architecture, WAL/filesystem considerations)
- Add recommended database path section for Pi (/data/openclaw/workq/workq.db)
with config example and directory setup commands
- Add 5-step probe/verification command sequence for new host deployments
- Fix hardcoded local path in Installation section to use relative repo path
* fix(workq): remove rootDir from tsconfig to allow plugin-sdk imports
* style(workq): fix formatting issues in extension files
* docs(workq): expand CLAUDE.md with comprehensive tool guidance
Enhances workq extension documentation for Claude Code agents with:
- Detailed breakdown of all 8 queue tools with parameters and examples
- Expected call order workflow (claim -> status/files -> in-review -> done)
- Status state machine diagram and valid transitions
- Practical examples covering happy path, conflicts, blocked tasks, queries
- Common pitfalls and integration notes for platform squad agents
- File conflict detection guidance
Provides agents with actionable reference for coordinating work across
the multi-agent fleet.
* fix(workq): correct test mock for WorkqDatabase class constructor
The previous test used vi.fn() to mock the WorkqDatabase class, but this
doesn't work properly when the actual code uses 'new WorkqDatabase()'.
Changed to use a proper class mock with vi.hoisted() to ensure the mock
functions are available when the vi.mock() factory runs.
All 41 tests now pass.
* workq: enforce session-end auto-release and stale sweep
* docs(tools): clarify sessions spawn vs send (#52)
* fix(issue-tracking): dedupe merge update references and relationships (#51)
* chore: add issue-tracking runtime deps (#53)
* test(issue-tracking): add comprehensive DAG tests (#62)
* docs: replace legacy chat examples in Venice provider guide
* fix(cron): force fresh isolated session IDs
* fix(cron): keep manual runs non-blocking
* fix(cron): keep watchdog timer armed during ticks
* fix(cron): enforce timeout for manual cron runs
* fix(cron): split run and delivery status tracking
* fix(cron): restore interval cadence after restart
* fix(cron): narrow manual run execution state
* fix: harden connect auth flow and exec policy diagnostics
* docs: fix Together provider env path
* Luis/UI redesign feb 21 10pm (#49)
* feat(ui): Agent configuration experience — gateway hooks, file editors, LLM assist, auto-review
Major additions to the OpenClaw web UI:
Gateway Integration Layer:
- gateway-hooks.ts: React Query integration for all gateway RPC methods
- Typed query/mutation hooks for agents, config, models, sessions, skills, etc.
- Gateway event subscription hook for real-time updates
Agent Configuration Experience:
- AgentConfigPage: Tabbed config with progressive disclosure
- SoulEditor: SOUL.md editor with split view and markdown preview
- AgentFileEditor: Generic file editor for workspace files
- AgentOverviewConfig: Identity card, file health, suggestions
- Route: /agents/:agentId/configure
LLM Assist Panel:
- Conversational AI sidebar for configuration help
- Context-aware suggestions per config section
- Apply changes directly from suggestions
Auto-Review Panel:
- One-click config analysis with score/grade
- Actionable fix suggestions
Updated hooks and navigation to connect config flow.
* fix(ui): lint cleanup — remove unused imports, prefix unused params
- AutoReviewPanel: remove unused AnimatePresence, CardDescription; prefix unused params
- SkillConfigurator: remove unused AnimatePresence, Button; prefix agentId
- AgentConfigPage: remove unused AlertTriangle, RefreshCw, AGENT_FILES; wire SkillConfigurator into skills tab
- LLMAssistPanel: remove unused RefreshCw, ScrollArea, Separator; prefix agentId
- ModelBehaviorConfig: prefix unused isLoading param
- ModelSelector: remove unused Badge; prefix placeholder param
- useAgents: prefix unused isDefault param, fetchAgentsFromConfig fn
* perf(ui): split @xyflow into separate vendor chunk
@xyflow (React Flow for DAG visualization) was bundled into the vendor-react
chunk despite only being used on workstream/workflow pages. Moving it to
vendor-xyflow isolates 122 kB that's only loaded when needed.
Before: vendor-react 557 kB (everything)
After: vendor-react 433 kB + vendor-xyflow 122 kB (lazy)
* feat(ui): content-shaped page skeletons for improved perceived performance
Add page-specific skeleton loading states that match actual content layout:
- HomeSkeleton: greeting, quick chat, agent grid, panel layout
- AgentListSkeleton: header + search + 3x3 card grid
- AgentDetailSkeleton: back nav, agent header, tabs, stats, content area
- ConversationListSkeleton: sidebar + empty state
- ChatThreadSkeleton: header, message bubbles pattern, input bar
- SettingsSkeleton: sidebar nav + settings content
- WorkstreamsSkeleton: header, filter tabs, workstream cards
Wire AgentDetailSkeleton into /agents/[agentId] route.
* fix(ui): UX polish — branding, cleanup, Skills route, container consistency
- Fix sidebar branding: 'Second Brain' → 'OpenClaw', logo initial 'S' → 'O'
- Remove 211 'use client' directives (Next.js artifact, meaningless in Vite)
- Fix homepage greeting: remove hardcoded 'User!' placeholder
- Normalize container patterns in Nodes and Jobs pages (remove redundant
min-h-screen/max-w-7xl wrappers — AppShell already provides these)
- Add new /skills route with full CRUD: list, search, filter, enable/disable,
install from URL/ClawhHub, uninstall, detail panel with config view
- Add Skills nav item to sidebar under Team section
- All changes use existing gateway hooks and API layer (no new APIs needed)
- Build passes cleanly (6.71s)
* feat(ui): mobile bottom navigation for responsive layout
- Add MobileBottomNav component with Home, Chat, Agents, Settings tabs
- 'More' tab opens full sidebar as a slide-out sheet
- Visible only on screens < md (768px), hidden on tablet/desktop
- Auto-hides on fullscreen pages (onboarding, unlock)
- Add bottom padding to content area on mobile to prevent nav overlap
- Respects safe-area-inset for notched devices
- Export from layout index
* feat(ui): add Logs route and mobile navigation improvements
- Add /logs route with log stream viewer (Power User mode)
- Level filtering (trace/debug/info/warn/error/fatal) with counts
- Search/filter by message or subsystem
- Auto-scroll toggle, pause/resume stream
- Export filtered logs as text file
- Color-coded log levels with appropriate icons
- Monospace font, compact density for log readability
- Add Logs nav item to sidebar Power User section
- Uses sample data for UI development; ready for gateway integration
* fix(ui): rebrand Second Brain → OpenClaw, use profile name on home page
- Sidebar: Updated logo text from 'Second Brain' to 'OpenClaw'
- Home page: Reads user display name from profile settings instead of hardcoded 'User!'
- Filesystem: Updated API endpoint and config references to openclaw.ai
- App.tsx: Updated sandbox page branding
Files changed:
- /Users/openclaw/openclaw-ui-redesign/apps/web/src/components/layout/Sidebar.tsx
- /Users/openclaw/openclaw-ui-redesign/apps/web/src/routes/index.tsx
- /Users/openclaw/openclaw-ui-redesign/apps/web/src/routes/filesystem/index.tsx
- /Users/openclaw/openclaw-ui-redesign/apps/web/src/App.tsx
* feat(ui): add /logs route — real-time gateway log streaming
- New route: /logs with polling-based log tail via gateway 'logs.tail' RPC
- Features: level filtering (trace/debug/info/warn/error/fatal), text search,
auto-follow, pause/resume, export to JSONL, entry counts per level
- Dark terminal-style UI with color-coded log levels
- Added to sidebar Power User section with ScrollText icon
- Handles disconnected state gracefully
Files changed:
- /Users/openclaw/openclaw-ui-redesign/apps/web/src/routes/logs/index.tsx (new)
- /Users/openclaw/openclaw-ui-redesign/apps/web/src/components/layout/Sidebar.tsx
- /Users/openclaw/openclaw-ui-redesign/apps/web/src/routeTree.gen.ts (auto-generated)
* feat(ui): add /analytics route — usage dashboard with token/cost/model/agent breakdowns
- New route: /analytics with gateway 'sessions.usage' + 'usage.cost' RPC
- Features: date range picker, stat cards (tokens/cost/messages/tools),
daily bar charts (tokens + cost), model/agent/tool breakdowns with progress bars,
full session table with sort-by-cost, expand/collapse
- Token and cost breakdown cards showing input/output/cache splits
- Responsive grid layout, loading skeletons, disconnected state
- Added to sidebar Power User section with BarChart3 icon
Files changed:
- /Users/openclaw/openclaw-ui-redesign/apps/web/src/routes/analytics/index.tsx (new)
- /Users/openclaw/openclaw-ui-redesign/apps/web/src/components/layout/Sidebar.tsx
- /Users/openclaw/openclaw-ui-redesign/apps/web/src/routeTree.gen.ts (auto-generated)
* fix(ui): add TanStack Router errorComponent on root route
- RouteErrorComponent wraps ErrorFallback with router-aware recovery
- 'Try Again' invalidates the current route (re-fetches data)
- 'Go Home' navigates to / via router (no full page reload)
- Complements existing React ErrorBoundary for render-crash recovery
File changed:
- /Users/openclaw/openclaw-ui-redesign/apps/web/src/routes/__root.tsx
* a11y: skip nav, reduced motion, keyboard support, ARIA landmarks, live region announcer
- Add SkipNavLink + SkipNavContent for keyboard users to bypass sidebar (WCAG 2.4.1)
- Add ReducedMotionProvider wrapping app root — respects prefers-reduced-motion (WCAG 2.3.3)
- Add role/tabIndex/onKeyDown to 6 interactive non-button elements:
ToolCategorySection, ConversationItem, MemoryCard (2 variants),
agent-plan task toggle, GatewaySetupStep radio cards
- Add focus-visible ring styles to all fixed elements
- Add aria-label/role='navigation' to Sidebar landmark
- Add aria-expanded/aria-controls to expandable sections
- Add useAnnounce hook + useRouteAnnouncer for screen reader live regions
- Build verified: 7.03s, no errors
* a11y: route change announcer + dynamic document.title
- Announce navigation to screen readers via useAnnounce live region
- Update document.title on route changes (e.g. 'Settings — OpenClaw')
- Derives human-readable page name from URL path segment
- WCAG 4.1.3: Status Messages compliance
* feat(ui): agent activity feed widget on home dashboard
- New AgentActivityFeed component with real-time agent activity stream
- Shows agent avatar, activity type (7 types), description, relative timestamp
- Color-coded activity icons: session started, message sent, tool called,
task completed, task failed, agent spawned, file edited
- Auto-refresh every 30s with live indicator pulse
- Proper empty state with guidance text
- ARIA: role=feed, role=article, aria-labels, semantic time elements
- Mock data hook (useAgentActivity) ready for real API swap
- Replaces placeholder widget on home page grid
- Build: 6.96s, no errors
* feat(ux): agent status indicators on avatars (#19)
Add reusable AgentStatusDot component with Framer Motion pulse
animations and useAgentStatus hook for deriving display status from
agent store data.
Status types:
- Online (green, slow pulse): active within last 5 minutes
- Busy (amber, fast pulse): currently processing or awaiting approval
- Offline (gray, static): inactive
- Error (red, static): error state
Integrated into:
- AgentAvatar (composed) — shared avatar used across the app
- AgentCard (compact + expanded variants) — home grid and agent list
- AgentSessionsIndicator — sidebar waiting-agents popover
Includes auto-expiry timer in useAgentStatus that transitions
online → offline when lastActive exceeds the 5-minute threshold.
* feat(ux): keyboard shortcuts discoverability badge (#18)
Changes landed in c6a1309e3 (co-committed with #19).
Summary of changes:
- apps/web/src/hooks/useShortcutsSeen.ts (new)
localStorage-gated hook (key: oc_shortcuts_seen) tracking first-visit state
- apps/web/src/hooks/index.ts
Export useShortcutsSeen from hooks barrel
- apps/web/src/providers/ShortcutsProvider.tsx
Add ShortcutsContext exposing openShortcutsModal / shortcutsSeen / markShortcutsSeen;
mark as seen whenever modal opens via keyboard, button, or command palette
- apps/web/src/providers/index.ts
Export ShortcutsContext and useShortcutsContext
- apps/web/src/components/layout/Sidebar.tsx
Add KeyboardShortcutsButton with Framer Motion pulsing dot + 'NEW' badge;
button calls openShortcutsModal from context; dot/badge auto-dismiss on first open
- apps/web/src/components/composed/CommandPalette.tsx
Add footer hint: 'Press ? to see all keyboard shortcuts'
* fix(a11y): dark mode color contrast improvements (#20)
- Remove all text-muted-foreground opacity modifiers (/40, /50, /60, /70, /80)
that caused WCAG AA failures in dark mode. Replaced with full-opacity
text-muted-foreground which passes at 6.16:1 on background and 5.81:1 on card.
- Add dark: overrides for hardcoded Tailwind gray/slate text colors:
- text-gray-500 → dark:text-gray-400 (4.13:1→7.86:1)
- text-gray-600 → dark:text-gray-400 (2.64:1→7.86:1)
- text-slate-500 → dark:text-slate-400 (4.19:1→7.78:1)
Affected components: 25 files across composed, domain, and route layers.
Key contrast ratios (before → after on --background):
muted-foreground/40: 1.88:1 → 6.16:1
muted-foreground/50: 2.32:1 → 6.16:1
muted-foreground/60: 2.85:1 → 6.16:1
muted-foreground/70: 3.52:1 → 6.16:1
muted-foreground/80: 4.27:1 → 6.16:1
gray-500: 4.13:1 → 7.86:1 (via gray-400)
gray-600: 2.64:1 → 7.86:1 (via gray-400)
slate-500: 4.19:1 → 7.78:1 (via slate-400)
* feat(i18n): internationalization infrastructure with en/pt-BR/zh-CN/zh-TW (#11)
- Add react-i18next, i18next, i18next-browser-languagedetector dependencies
- Create i18n setup with language detection, localStorage persistence, en fallback
- Add 4 locale files (en, pt-BR, zh-CN, zh-TW) with ~75 key strings each:
- common actions (Save, Cancel, Delete, Create, etc.)
- navigation labels (Home, Conversations, Goals, Memories, etc.)
- home dashboard greetings and section titles
- settings section headings and appearance labels
- error messages
- agent status labels
- Import i18n initialization in main.tsx (before component tree)
- Integrate useTranslation in 5 key components:
- Sidebar: all nav labels and section titles
- AppearanceSection: all labels + language selector with 4 language options
- HomePage: time-of-day greeting
- SettingsPage: page title and subtitle
- YouPage: page title and subtitle
- Language selector in You > Appearance with live switching
* feat(ui): Monaco editor component with lazy loading, fallback textarea, Cmd+S save binding
* fix(build): clear postcss.config.mjs — Tailwind v4 handled by @tailwindcss/vite plugin, not PostCSS
* chore: update pnpm-lock.yaml for @monaco-editor/react dependency
* feat(ui): activity heat map on agent-status route (#14)
* feat(ui): agent relationship graph visualization (#13)
- New route /agents/graph with live agent data from gateway
- Parses session key patterns to infer spawn/delegation edges
- ReagraphView integration with custom health-based node coloring
- CSS fallback tree view when reagraph unavailable
- Slide-in detail panel on node click: task, model, tokens, cost, links
- Stats bar: total agents, active count, tokens, cost
- Legend: health colors + spawn edge indicator
- Back link to /agents, 15s auto-refresh
- Added Network icon + Agent Graph link to sidebar Team section
- Removed duplicate Logs entry from Power User section
* feat(ui): chat-driven agent builder at /agents/new (#15)
- New /agents/new route: conversational interface for agent creation
- Split-panel: chat on left, live config preview on right
- NLP parser: extracts name, role, tags, model, personality from freetext
- Keyword inference for 8 roles (Monitor, Researcher, Developer, etc.)
- Domain tag extraction for 15 platforms (github, slack, discord, email, etc.)
- Model preference detection (opus, haiku, gpt-4, gemini, grok)
- Personality trait extraction (concise, thorough, friendly, etc.)
- Config preview: flash-highlights fields as they update (framer-motion)
- Tags: editable inline with + input and × remove button
- All fields manually editable in preview panel
- Readiness checklist: name + description = ready to create
- 5 suggested starter prompts (GitHub monitor, research, code review, etc.)
- Animated typing indicator while processing
- useCreateAgent() integration → navigates to agent config after creation
- 'Chat Builder' secondary button added to agents list page header
- Simple markdown renderer for **bold** and `code` in assistant messages
* fix(ui): correct createAgent status field + add Graph View link to agent-status header
- Chat builder: pass required status: 'offline' to createAgent.mutateAsync
(Agent interface requires status, new agents start offline)
- Agent Status dashboard: add 'Graph View' ghost button linking to /agents/graph
(natural navigation path from status dashboard → relationship graph)
* chore(ui): remove Next.js 'use client' directives from Vite project
8 files had 'use client' at the top — a Next.js App Router directive that is
meaningless in Vite/React. Strips as dead noise. No behavior change.
* docs: add approvals + milestone feed design doc
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: add approvals + milestone feed implementation plan
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: update plan with tsc-per-task, tests-only-at-end strategy
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(approvals): add ApprovalItem component
* feat(approvals): add ApprovalsQueue with compact/full modes and agent grouping
* feat(approvals): add MilestoneItem and MilestoneDetailPanel
* feat(ui): redesign layout, session view, and nav components
Redesigns the app shell, sidebar, nav items, session workspace, and agent
status pages with updated visual styling. Adds TerminalOverlay component
and updates NewSessionDialog, SessionHeader, and related routes.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(approvals): add MilestoneFeed with date grouping
* feat(approvals): add InboxPanel slide-out with compact approvals + milestones
* feat(approvals): add inbox icon + badge to sidebar
* feat(approvals): add /approvals page with full queue and milestone feed
* docs: add Configure tab redesign design doc
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(ui): fix calendar icon color, reassign button, pill heights, and arrow styling
- Fix black native calendar picker icon on dark theme with CSS invert filter
- Add prominent Reassign button with UserCog icon to agent assignment card in RitualDetailPanel
- Align date/time content text with label text in schedule info cards (pl-6 indent)
- Normalize execution pill font size to text-xs so Status, Tool Calls, and Token/Cost share the same height
- Reduce TokenCostIndicator padding by 50% (px-3 py-1 → px-1.5 py-0.5)
- Improve arrow button visibility in Recent Executions with muted-foreground color
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: add Configure tab redesign implementation plan
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* refactor(approvals): reuse GoalDetailPanel in MilestoneFeed with highlightMilestoneId prop
* fix(inbox): widen panel to 520px and add Open Inbox link in header
* feat(agents): add embedded prop to AgentConfigPage
* feat(agents): add AgentConfigureTab with nested builder/rituals/tools sub-tabs
* chore(agents): export AgentConfigureTab from barrel
* feat(agents): replace Rituals/Tools/Soul tabs with Configure nested tab panel
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(goals): add Edit button to Goal Details panel with working edit modal
- Add headerActions slot to DetailPanel so callsites can inject title-bar buttons
- Add Edit icon button in GoalDetailPanel title bar (visible without scrolling)
- Remove goal.status !== 'completed' guard so any goal can be edited
- Extend CreateGoalModal with edit mode: initialGoal prop pre-populates all fields,
milestones preserve original IDs and completion state, title/CTA reflect edit context
- Wire GoalsPage: handleEdit opens the shared modal in edit mode via useUpdateGoal
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore(ids): consolidate all UUID generation to uuidv7
Replace crypto.randomUUID() in new.lazy.tsx and the custom generateUUID()
utility in gateway-client.ts with the project-standard uuidv7() from @/lib/ids.
Also convert WebSocket on* property handlers to addEventListener calls and
remove unused Card/CardContent imports surfaced during linting.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(assist): add rituals section prompts to LLMAssistPanel
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(sidebar): increase collapsed icon hit area and nav item spacing
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(agents): lift assist/review state and fix embedded padding in AgentConfigPage
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(agents): lift AI Assist and Auto Review to AgentConfigureTab level
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(agents): edit button navigates to configure tab, persist configureTab in URL
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore(agents): remove AgentSoulTab, consolidated into SoulEditor guided mode
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(ui): follow-ups + ph1 tab config
Follow-ups:
- GoalDetailPanel: add pl-6 indent to Due Date + Created content text
- RitualScheduler: fix dark time input picker icon with CSS invert filter
- RitualDetailPanel: add Trigger quick-action to DetailPanel headerActions slot
- RitualsPage: wire onReassign → RitualAssignDialog (full agent reassignment flow)
- Export RitualAssignDialog + RitualAssignPayload from rituals barrel
Phase 1:
- Add src/config/agent-tabs.ts with AGENT_TABS config, isValidTab(), resolveTab(),
and TAB_REDIRECTS backwards-compat map for old tab URL params
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(ui): ph5 inheritance system - useInheritanceStore, InheritanceBadge, InheritableField
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(ui): ph2 new tab components - AgentWorkTab, AgentChatTab, WorkSubNav
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(ui): ph4 persona tier system - FeatureGate, usePersonaStore, PersonaTierSection
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(ui): ph3 - wire 5-tab structure into $agentId route
Replaces local AgentDetailTab type with imported type + resolveTab() from
config/agent-tabs.ts. Swaps workstreams tab for work (AgentWorkTab with
WorkSubNav) and adds chat tab (AgentChatTab). Old URL params like
?tab=workstreams and ?tab=rituals are resolved to 'work' via TAB_REDIRECTS.
Section param threaded through for WorkSubNav sub-navigation.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(ui): ph6 - responsive tab triggers and MobileTabNav
Tab triggers now show icon+label stacked on mobile (grid-cols-5) and
side-by-side on sm+. MobileTabNav provides a fixed bottom nav bar on
mobile (hidden sm+) with the same 5-tab structure from AGENT_TABS.
Bottom padding added to page content to prevent overlap with the bar.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* test(agents): update AgentConfigureTab tests for rewritten component
* chore(agents): remove unused filesLoading destructure in AgentConfigureTab
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(agents): sync AgentConfigureTab sub-tab with URL on back/forward navigation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore(routes): remove orphaned /agents/$agentId/configure full-page route
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(ui): expand command palette - full action vocab + NL intent (task 2)
* feat(ui): live RPC-connected onboarding wizard (task 1)
* test(ui): ph8 unit tests for tab config, stores, and feature gate components
Add vitest setup fixes (in-memory localStorage mock + jsdom URL) to make
zustand persist middleware work in tests, and update usePersonaStore tests
to avoid replace=true state reset that strips action functions.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(ui): visual agent config editor - identity/model/memory/thinking (task 3)
* Add isSlackId function to validate Slack IDs
* Refactor Slack ID validation to use normalizeSlackId
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(ui): DiscoveryRunMonitor — pre-flight dashboard for Feb 23 discovery run (#72)
* feat(horizon-ui): add DiscoveryRunMonitor view — pre-flight checklist, wave countdowns, 15 agents, Brave key alert
* feat(horizon): add 4 discovery-run views (BraveAPIKeySetupWizard, DiscoveryWaveResults, DiscoveryAgentCostTracker, ToolReliabilityDashboard)
* UX: add 4 discovery-run views (preflight, wave scheduler, model comparison, findings search)
…
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Graphiti Health Probe
memory.graphiti.healthProbeIntervalMinutes(default: 5 min)writeEntitiesToGraphandwriteEpisodesToGraphbehind the probe checkSearch Manager Test Fix
search-manager.test.tsTests