feat(ui): DiscoveryRunMonitor β pre-flight dashboard for Feb 23 discovery run#72
Merged
dgarson merged 3 commits intodgarson/forkfrom Feb 22, 2026
Merged
Conversation
β¦, wave countdowns, 15 agents, Brave key alert
β¦coveryWaveResults, DiscoveryAgentCostTracker, ToolReliabilityDashboard)
β¦rison, findings search)
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.
Discovery Run Monitor
New view for monitoring the first OpenClaw discovery run (Monday Feb 23, 2026).
What it includes
Why now
First discovery run fires in ~24 hours. Brave API key is P0-CRITICAL (not configured). This view gives David and operators a single place to confirm readiness and monitor live run state.
Build
β built in 4.25s β 0 TypeScript errors β 268 lazy-loaded chunksNotes