Refactor tests for sessionsHistory to handle missing and unreadable session files.
中文用户可在这里切换:打开中文 README
OpenClaw Control Center
Safety-first local control center for OpenClaw.
Language: English | 中文
Why this exists
- One local place to see whether OpenClaw is healthy, busy, blocked, or drifting.
- Built for non-technical operators who need observability and certainty, not raw backend payloads.
- Safe first-run defaults:
- read-only by default
- local token auth by default
- mutation routes disabled by default
What you get
Overview: health, current state, decisions waiting, and operator-facing summariesUsage: usage, spend, subscription windows, and connector statusStaff: who is really working now versus only queuedCollaboration: parent-child relays and cross-session messages between existing agent sessionsTasks: current work, approvals, execution chains, and runtime evidenceDocumentsandMemory: source-backed workbenches scoped to active OpenClaw agents
What this release adds
Collaboration: a new standalone collaboration page so you can see both parent-child handoffs and verified cross-session agent communication such asMain ⇄ Pandas, instead of inferring everything from execution chains.Settings: a newConnection healthcard that tells you what is already wired, what is still partial, and where to finish setup.Settings: a newSecurity risk summarythat translates current risk, impact, and next-step guidance into plain operator-facing language.Settings: a newUpdate statuscard for current version, latest version, update channel, and install method.Usage: a newContext pressurecard so you can see which sessions are closer to context limits and where things may get slower or more expensive.Memory: a newMemory statuscard so you can see whether each visible agent's memory is usable, searchable, or worth checking.
Who it is for
- OpenClaw users who want one local control center for observability, usage, tasks, approvals, replay, documents, and memory
- teams running OpenClaw on one machine or a reachable local environment
- maintainers who want a public-ready, safety-first OpenClaw dashboard instead of a generic agent platform
Screenshots
Example UI from a local OpenClaw environment:
|
|
| Token attribution See which timed jobs are actually consuming tokens and how the share splits across them. |
Staff page See who is working now, who is on standby, recent output, and schedule state. |
5-minute start
npm install
cp .env.example .env
npm run build
npm test
npm run smoke:ui
npm run dev:ui
Then open:
http://127.0.0.1:4310/?section=overview&lang=enhttp://127.0.0.1:4310/?section=overview&lang=zh
Notes:
- Prefer
npm run dev:ui; it is the more reliable cross-platform entry, especially on Windows shells. npm run devonly performs one monitor pass and does not start the HTTP UI.
Section-by-section tour
Overview
- The main operating screen for non-technical users.
- Shows the current control posture, key action items, runtime issues, stalled runs, budget risk, who is active, and what needs attention first.
- Best when you want one fast answer to: “Is OpenClaw okay right now?”
Usage
- Shows today, 7-day, and 30-day usage and spend trends.
- Includes subscription windows, quota consumption, usage mix, context pressure, and connector status.
- Best when you want to know whether spend or quota is becoming risky.
Staff
- Shows who is truly active now versus who only has queued work.
- Separates live work from “next up” so backlog is not confused with active execution.
- Best when you want to know who is busy, idle, blocked, or waiting.
Collaboration
- Shows how work moves between agents: who accepted it first, who handed it off, and which session is holding the next move.
- Covers both parent-child session relays and verified cross-session communication such as
sessions_send/inter-session message. - Best when you want to understand “who passed this to whom, and where is the collaboration waiting now?”
Memory
- A source-backed workbench for daily and long-term memory files.
- Scoped to active OpenClaw agents from
openclaw.json, so deleted agents do not keep showing up. - Now also shows whether each visible agent's memory is healthy, searchable, or needs attention.
- Best when you want to inspect or edit memory that the current OpenClaw team is actually using.
Documents
- A source-backed workbench for shared and agent-specific core markdown docs.
- Reads the real source files and writes back to the same files.
- Best when you want to maintain the actual working documents behind the system.
Tasks
- Combines task board, schedule, approvals, execution chains, and runtime evidence.
- Helps distinguish mapped work from real execution evidence, and shows what is blocked or needs review.
- Best when you want to understand what is being carried, what is only planned, and what needs intervention.
Settings
- Shows safety mode, connector status, and data-link expectations.
- Makes it clear what is connected, what is still partial, and which high-risk actions are intentionally disabled.
- Now includes
Connection health,Security risk summary, andUpdate statusas dedicated operator cards. - Best when you want to verify environment setup or explain why a signal is missing.
For:
- Existing OpenClaw users who want a local control center for observability, usage, staff activity, tasks, approvals, replay, and documents.
- Teams running OpenClaw on the same machine or a reachable local environment.
- Not a generic dashboard for non-OpenClaw agent stacks.
Core constraints
- Only touches files in
control-center/. READONLY_MODE=trueby default.LOCAL_TOKEN_AUTH_REQUIRED=trueby default.IMPORT_MUTATION_ENABLED=falseby default.IMPORT_MUTATION_DRY_RUN=falseby default.- Import/export and all state-changing endpoints require a local token when auth is enabled.
- Approval actions are hard-gated (
APPROVAL_ACTIONS_ENABLED=falsedefault). - Approval actions are dry-run by default (
APPROVAL_ACTIONS_DRY_RUN=true). - No mutation of
~/.openclaw/openclaw.json.
Quick start
npm installcp .env.example .env- Keep safe defaults for the first run; only change
GATEWAY_URLor path overrides if your OpenClaw setup is non-standard. npm run buildnpm testnpm run smoke:uinpm run dev:ui
Installation and onboarding
1. Before you start
You should already have:
- a working OpenClaw installation
- a reachable OpenClaw Gateway
- shell access with
nodeandnpm - read access to your OpenClaw home directory
For the richest dashboard data, it also helps if this machine has:
~/.openclaw~/.codex- a readable OpenClaw subscription snapshot, if your setup stores one outside the default locations
2. Install the project
git clone https://github.com/TianyiDataScience/openclaw-control-center.git
cd control-center
npm install
cp .env.example .env
If OpenClaw claims the repo is missing src/runtime or other core source files, do not start patching code. The canonical repo layout already includes:
package.jsonsrc/runtimesrc/ui.env.example
That error usually means:
- the current directory is not the
openclaw-control-centerrepo root - the wrong repo was cloned
- the checkout/download is incomplete
- the agent is running in the wrong workspace
3. Recommended default: let your own OpenClaw do the install and setup
The best first-run path is not manual setup. The best path is to give your own OpenClaw one install instruction block and let it do the safe wiring for you.
If you want a copy-ready standalone file, use:
It should handle:
- environment checks
- dependency install
.envcreation or correction- safe first-run defaults
build / test / smoke- a final summary of what to run and what to open
This install instruction already accounts for common real-world differences such as:
- no GPT / Codex subscription, or no readable subscription snapshot
- OpenClaw running on API keys or non-Codex providers (for example OpenAI API, Anthropic, OpenRouter, or another provider backend)
- non-default
~/.openclaw,~/.codex, Gateway URL, or UI port - more than one plausible OpenClaw home, more than one Gateway candidate, or a non-default workspace on the same machine
- a completely different active agent roster from the examples in this repo
- a machine that can build locally but is not yet connected to a live Gateway
- missing
node/npm, no npm-registry connectivity, or insufficient write permissions in the repo - missing optional data sources where the control center should still come up safely in read-only mode
Copy the full block below into OpenClaw:
You are installing and connecting OpenClaw Control Center to this machine's OpenClaw environment.
Your goal is not to explain theory. Your goal is to complete a safe first-run setup end to end.
Hard rules:
1. Work only inside the control-center repository.
2. Do not modify application source code unless I explicitly ask.
3. Do not modify OpenClaw's own config files.
4. Do not enable live import or approval mutations.
5. Keep all high-risk write paths disabled.
6. Do not assume default agent names, default paths, or a default subscription model. Use real inspection results from this machine.
7. Do not treat missing subscription data, missing Codex data, or a missing billing snapshot as an install failure. If the UI can run safely, continue and clearly mark which panels will be degraded.
8. Do not fabricate, generate, or overwrite any provider API key, token, cookie, or external credential. If OpenClaw itself is missing those prerequisites, report the gap instead of guessing.
Follow this order:
Phase 1: inspect the environment
1. Check whether the OpenClaw Gateway is reachable and confirm the correct `GATEWAY_URL`.
2. Confirm the correct `OPENCLAW_HOME` and `CODEX_HOME` on this machine.
3. If the subscription or billing snapshot is stored outside the default path, find the correct `OPENCLAW_SUBSCRIPTION_SNAPSHOT_PATH`.
4. Confirm which prerequisites are truly present and which are missing-but-degradable. At minimum, evaluate:
- `node`
- `npm`
- write access to the repo directory
- npm-registry reachability if dependencies are not installed yet
- the OpenClaw Gateway
- `openclaw.json`
- OpenClaw session/runtime data
- `CODEX_HOME`
- the subscription/billing snapshot
- whether the provider/backend prerequisites used by OpenClaw are already present (check presence only; never print secrets)
5. If more than one plausible `OPENCLAW_HOME`, Gateway, or workspace exists, do not guess. Prefer the combination backed by a live Gateway, a readable `openclaw.json`, and the strongest evidence that it belongs to the current project. If it is still ambiguous, stop and list the candidates.
6. If a path, process, or file is missing in a way that makes the control center impossible to start at all, such as missing `node` / `npm`, no ability to download dependencies, a non-writable repo, or an unreadable OpenClaw root, stop and tell me exactly what is missing instead of guessing.
7. If the missing item only affects richer dashboards, such as subscription snapshots, Codex telemetry, part of the runtime data, or Codex-specific telemetry on a machine that actually uses API-key/provider mode, continue the install and mark those areas as "install can continue, but this surface will be partial".
8. Do not assume any fixed agent names. If `openclaw.json` is readable, treat it as the source of truth. If not, fall back to runtime-visible agents and explicitly say that roster confidence is lower.
Phase 2: install the project
9. Confirm that the current directory is the control-center repo root.
10. First verify the repo is complete. At minimum, confirm these paths exist:
- `package.json`
- `src/runtime`
- `src/ui`
- `.env.example`
11. If `src/runtime`, `src/ui`, or `package.json` is missing, do not continue and do not guess where the code should come from. Classify it as "wrong repo / incomplete checkout / wrong working directory", then:
- leave the incorrect directory
- re-clone `https://github.com/TianyiDataScience/openclaw-control-center.git`
- continue only after entering the new repo root
12. Install dependencies.
13. If `.env` does not exist, create it from `.env.example`. If it already exists, update it while preserving safe first-run defaults. Do not delete unrelated user settings; only change the keys required for this connection.
Phase 3: apply safe first-run settings
14. Keep these values:
- READONLY_MODE=true
- LOCAL_TOKEN_AUTH_REQUIRED=true
- APPROVAL_ACTIONS_ENABLED=false
- APPROVAL_ACTIONS_DRY_RUN=true
- IMPORT_MUTATION_ENABLED=false
- IMPORT_MUTATION_DRY_RUN=false
- UI_MODE=false
15. Only change these when the machine actually requires it:
- GATEWAY_URL
- OPENCLAW_HOME
- CODEX_HOME
- OPENCLAW_SUBSCRIPTION_SNAPSHOT_PATH
- UI_PORT
16. If this machine runs OpenClaw on provider API keys or a non-Codex backend instead of a Codex / GPT subscription, do not treat that as an error. Continue the install as long as OpenClaw itself can run, and say clearly that subscription/quota surfaces may be partially visible or unavailable.
17. If `CODEX_HOME` does not exist, or this machine simply does not have Codex / GPT subscription data, do not invent a path. Leave it unset and say clearly that Usage / Subscription will be partially visible or unavailable.
18. If no subscription snapshot exists, do not fabricate `OPENCLAW_SUBSCRIPTION_SNAPSHOT_PATH`. Continue the install and say that quota/subscription cards will show disconnected or estimated states.
19. If `4310` is already in use, choose a free local port, write it to `UI_PORT`, and report the new address clearly.
20. Do not change application logic just because my agent roster differs from the examples in this repo. The control center should reflect the agents configured or visible on my own machine.
Phase 4: verify the install
21. Run:
- npm run build
- npm test
- npm run smoke:ui
22. If any step fails, stop and tell me:
- which step failed
- why it failed
- what I should do next
23. If build / test / smoke pass but the live Gateway is still unreachable, do not classify the install as failed. Classify it as "local UI ready, live observability not connected yet".
24. If OpenClaw itself cannot produce live data because external provider credentials are missing, do not call that a control-center install failure. Classify it separately as "control center installed, upstream OpenClaw prerequisite missing".
Phase 5: hand off a ready-to-run result
25. If verification passes, print:
- which env values you changed
- which env values stayed on the defaults
- the exact command I should run next to launch the UI
- the first 3 dashboard pages I should open
- which missing signals are normal for a partially connected environment
- which capabilities are working now
- which capabilities are degraded because this machine lacks those data sources
- which env values or prerequisites I would need later if I want to connect subscription / Codex / live Gateway data
- which missing provider credentials, external auth, or upstream OpenClaw services are outside the control-center repo and still need operator action
Format your final answer as:
- Environment check
- Differences and degradation assessment
- Actual changes
- Verification result
- Next command
- First pages to open
4. If you want to configure .env manually
Only use this path if you do not want OpenClaw to handle setup for you.
For a safe first run, keep the mutation guards in place.
Use this baseline:
GATEWAY_URL=ws://127.0.0.1:18789
READONLY_MODE=true
APPROVAL_ACTIONS_ENABLED=false
APPROVAL_ACTIONS_DRY_RUN=true
IMPORT_MUTATION_ENABLED=false
IMPORT_MUTATION_DRY_RUN=false
LOCAL_TOKEN_AUTH_REQUIRED=true
UI_MODE=false
UI_PORT=4310
# Optional only when a reverse proxy, container, or another machine must reach the UI:
# UI_BIND_ADDRESS=0.0.0.0
# Optional only when your paths differ from the defaults:
# OPENCLAW_HOME=/path/to/.openclaw
# OPENCLAW_CONFIG_PATH=/path/to/openclaw.json
# OPENCLAW_WORKSPACE_ROOT=/path/to/workspace
# OPENCLAW_AGENT_ROOT=/path/to/one/agent/workspace
# CODEX_HOME=/path/to/.codex
# OPENCLAW_SUBSCRIPTION_SNAPSHOT_PATH=/path/to/subscription.json
Change only these values if your environment needs it:
GATEWAY_URL: when your OpenClaw Gateway is not on the default local socketOPENCLAW_HOME: when OpenClaw is not stored in~/.openclawOPENCLAW_CONFIG_PATH: whenopenclaw.jsonlives somewhere customOPENCLAW_WORKSPACE_ROOT: when control-center is installed outside the OpenClaw workspace tree and you want to pin the true workspace rootOPENCLAW_AGENT_ROOT: when control-center is not inside an agent workspace but you still want legacy agent-local memory/mission reads to point at one specific agent workspaceCODEX_HOME: when Codex data is not stored in~/.codexOPENCLAW_SUBSCRIPTION_SNAPSHOT_PATH: when your billing/subscription snapshot lives somewhere customUI_PORT: when4310is already in useUI_BIND_ADDRESS: when your reverse proxy, container, or browser is not on the same loopback network and cannot reach the default127.0.0.1bind
5. Verify the install
Run:
npm run build
npm test
npm run smoke:ui
Expected result:
- build passes
- tests pass
- UI smoke reports a local URL such as
http://127.0.0.1:<port>
6. Start the UI
npm run dev:ui
Then open:
- English UI:
http://127.0.0.1:4310/?section=overview&lang=en - Chinese UI:
http://127.0.0.1:4310/?section=overview&lang=zh
If you changed UI_PORT, replace 4310 with your chosen port.
If a reverse proxy, container, or another machine must reach the UI, also set UI_BIND_ADDRESS=0.0.0.0.
7. First-use checklist
On your first launch, check these pages in order:
Overview: the app opens and shows current system state.Usage: usage and subscription panels either show real numbers or a clear missing-connector state.Staff: live work status matches real active sessions.Tasks: current work, approvals, and execution-chain cards load without raw payload noise.DocumentsandMemory: the visible agent tabs match your active agents fromopenclaw.json.
8. If something looks wrong
- Empty live activity usually means
GATEWAY_URLis wrong or the OpenClaw Gateway is not running. - Missing
Documents / Memoryagents usually meansOPENCLAW_HOME,OPENCLAW_CONFIG_PATH, orOPENCLAW_WORKSPACE_ROOTpoints to the wrong place, oropenclaw.jsonis missing. - Missing usage/subscription data usually means
CODEX_HOMEorOPENCLAW_SUBSCRIPTION_SNAPSHOT_PATHneeds to be set. - If the address does not open or a reverse proxy cannot reach the app, first confirm you started
npm run dev:ui; if the proxy is outside the same machine/container, setUI_BIND_ADDRESS=0.0.0.0. - If you only want a safe read-only dashboard, do not change the mutation defaults.
Local commands
npm run buildnpm run devnpm run dev:continuousnpm run dev:uinpm run smoke:uinpm run command:backup-exportnpm run command:import-validate -- runtime/exports/<file>.jsonnpm run command:acks-prunenpm testnpm run validate
For protected command modes (command:backup-export, command:import-validate, command:acks-prune), set LOCAL_API_TOKEN=<token> unless LOCAL_TOKEN_AUTH_REQUIRED=false.
Also:
npm run dev: runs one monitor pass without starting the UInpm run dev:ui: starts the local UI server
Maintainer publishing notes
If you are publishing the repository itself, not just installing it, use this section. Normal operators can skip it.
- Run
npm run release:auditbefore public pushes - See
docs/PUBLISHING.mdfor the standalone repo release flow
Local HTTP endpoints
GET /snapshot: raw snapshot JSONGET /projects: list projects with optional query filtersstatus,ownerGET /api/projects: same as/projectsfor compatibilityPOST /api/projects: create project (projectId,title, optionalstatus,owner)PATCH /api/projects/:projectId: update project title/status/ownerGET /tasks: flattened task list with optional query filtersstatus,owner,projectGET /api/tasks: same as/tasksfor compatibilityPOST /api/tasks: create task with schema validationPATCH /api/tasks/:taskId/status: update task status with schema validationGET /sessions: paginated session visibility list with optional filtersstate,agentId,q, and pagination paramspage,pageSize,historyLimitGET /sessions/:id: per-session JSON detail with latest history entries (historyLimitquery supported)GET /api/sessions/:id: explicit API alias for per-session JSON detailGET /session/:id: localized session drill-down UI page (lang=en|zh) with latest messages, execution-chain evidence, and safe truncationGET /api/sessions: compatibility endpoint for/sessionsGET /api/commander/exceptions: exceptions-only summary (blocked/errors/pending approvals/over-budget/tasks-due)GET /exceptions: routed exceptions feed with levels (info,warn,action-required), sorted by severity then newest eventGET /done-checklist: final integration checklist + readiness scoring (observability/governance/collaboration/security)GET /api/done-checklist: API alias for done checklistGET /api/action-queue: notification center queue derived from exceptions feed + ack state + relevant session/task/project linksGET /api/action-queue/acks/prune-preview: token-gated dry-run preview of stale ack prune counts (before/removed/after, no state mutation)POST /api/action-queue/:itemId/ack: acknowledge an action-required queue item (persisted), optionalttlMinutesorsnoozeUntilto auto-expire ack stateGET /graph: project-task-session linkage graph JSON (for future Gameboy view)GET /view/pixel-state.json: pixel-ready adapter state (rooms,entities,links) for future Gameboy canvasGET /usage-cost: product route alias that redirects to/?section=usage-costGET /api/usage-cost: usage/billing observability snapshot (period totals, context windows, breakdowns, burn-rate, subscription consumed/remaining/cycle, connector TODOs)GET /export/state.json: bundled export with sessions/tasks/projects/budgets/exceptions + persisted debug snapshot + backup bundle inruntime/exports/(requires local token auth)POST /api/import/dry-run: dry-run validator for export bundles (fileNameor inlinebundle) with zero state mutation (requires local token auth)POST /api/import/live: optional live import mutation endpoint (high-risk, local-only); requires local token +IMPORT_MUTATION_ENABLED=true, blocked in readonly unlessdryRun=true, and now returns validation errors instead of500for badfileNamepathsGET /notifications/preview: notification policy preview with quiet-hours + severity routingGET /cron: cron overview with next run and health summaryGET /healthz: system health payload (build info + snapshot freshness + monitor lag)GET /digest/latest: rendered HTML page from latest markdown digest fileGET /api/ui/preferences: persisted dashboard UI preferences (runtime/ui-preferences.json)PATCH /api/ui/preferences: update dashboard UI preferences (compactStatusStrip,quickFilter,taskFilters)GET /api/search/tasks: safe substring search over tasks (q,limit), withcount= total matches andreturned= current response sizeGET /api/search/projects: safe substring search over projects (q,limit), withcount= total matches andreturned= current response sizeGET /api/search/sessions: safe substring search over sessions (q,limit), withcount= total matches,returned= current response size, and live-session merge parity with/sessionsGET /api/search/exceptions: safe substring search over exception feed (q,limit), withcount= total matches andreturned= current response sizeGET /api/replay/index: replay/debug index from timeline + digests + export snapshots + export bundles, optionalfrom/toISO time window filters, plus per-sourcestats(total,returned,filteredOut, window-vs-limit breakdown,latencyMs,latencyBucketsMswithp50/p95,totalSizeBytes,returnedSizeBytes)GET /api/docs: route + schema summary endpointGET /docs: localized docs index page (read-only) with direct return path to theDocumentssectionGET /docs/readme|runbook|architecture|progress: local markdown docs views (read-only,langaccepted for index/back-link flow)POST /api/approvals/:approvalId/approve: approval action service (gate + dry-run + audit)POST /api/approvals/:approvalId/reject: rejection action service (gate + dry-run + audit)GET /audit: local audit timeline page (newest-first, severity filter)GET /api/audit: audit timeline JSON (severity=all|info|warn|action-required|error)
Dashboard highlights (Phase 14)
- Home page includes inline scoped search UI wired to
/api/search/*. - Home page replay/export visibility card now shows returned/filtered counts and latency/size indicators from
/api/replay/index. - Guard table shows explicit disabled/enabled badges and linked local docs references.
Dashboard highlights (Phase 107, Approvals/replay/tool-activity correctness sweep)
- Approval counts now use the full live approval set:
- sidebar and task-hub decision counts no longer under-report when approval previews are truncated
- approval preview lists stay short but now make it explicit when only the latest subset is shown
- Replay visibility chips now show total available history:
- timeline events
- daily digests
- export snapshots
- backup bundles
- Overview tool activity detail now loads actual session evidence:
- it no longer claims there are no tool-call sessions while the same page shows active tool-call counts
- User-facing parity routes no longer advertise deprecated dashboard sections:
- approvals route points to the task hub decision lane
- replay route points to
/audit
Dashboard highlights (Phase 110, Docs/memory active-agent scope alignment)
DocumentsandMemorynow follow active OpenClaw agent config instead of stale workspace folders:- facets are resolved from
~/.openclaw/openclaw.jsonfirst - removed agents no longer appear just because an old folder still exists under
workspace/agents/ - root OpenClaw files are now shown as
Maininstead of共享
- facets are resolved from
- Editable file content remains source-of-truth current:
- file lists still read live filesystem metadata (
updatedAt, size, path) - opening a file reads the current source file
- saving a file writes directly back to that same source file
- file lists still read live filesystem metadata (
Dashboard highlights (Phase 111, Execution-chain readability cleanup)
Execution chaincards no longer surface raw JSON payloads as the visible headline or summary.- Unmapped isolated-run cards now use stable labels such as
Main · Cron 隔离执行. - JSON-like payloads are summarized into short readable lines:
成功 · 查询 30 · 成功 30失败 · 错误 locked成功 · 扫描 120 · 入选 2 · 发送 2
- Long titles and session keys now wrap/clamp inside the card instead of pushing badges out of place.
Dashboard highlights (Phase 112, Staff status freshness semantics)
- Staff
Working / 工作中now means live execution, not just “still owns unfinished tasks”. - Agents with backlog but no live session now stay in standby semantics instead of looking falsely active.
- Staff work labels now separate:
- live work:
Working on / 正在处理什么 - queued next task:
Next up / 下一项
- live work:
- Staff/recent-activity cache remains short-lived at about
3s; live-session polling baseline remains5s.
Dashboard highlights (Phase 114, Execution-chain card hardening)
- Execution-chain cards no longer allow raw JSON-like payloads to become visible titles.
- Structured payload-shaped titles are converted into short human summaries or stable fallback labels instead.
- Long titles, meta rows, and badge rails are now overflow-safe inside the card grid.
Dashboard highlights (Phase 115, Apple-native card elevation tune)
- Page canvas is slightly cooler and quieter so foreground cards stand out more cleanly.
- Core cards now use brighter layered fills, crisper borders, and deeper but still restrained elevation.
- The hierarchy is unchanged; this is a visual polish pass, not a layout rewrite.
Dashboard highlights (Phase 116, Config-truthful document and memory scopes)
Documents / Memoryno longer revive deleted agents just because stale folders still remain on disk.- Valid active-agent config remains the only truth source for those facet buttons.
- If config becomes unreadable, the workbench now falls back conservatively to
Mainonly instead of showing stale agent folders.
Dashboard highlights (Phase 106, Cold-path cache coalescing)
- Correctness stays unified across Overview / Settings / Usage:
- no return to split summary/full quota logic
- repeat navigations keep the same usage/quota truth when the underlying execution state is unchanged
- Heavy evidence scans are now reused instead of recomputed per page:
- runtime usage logs
- Codex subscription/quota telemetry
- digest history
- OpenClaw cron name catalog
- UI startup now primes dashboard caches, and concurrent page opens share the same heavy build work.
- In local smoke:
- back-to-back
Overviewrenders dropped to about0.41s - back-to-back
Usagerenders dropped to about0.41s - after one priming hit, concurrent
Overview / Settings / Usagecompleted in about1.13s
- back-to-back
Dashboard highlights (Phase 105, Observability correctness alignment)
- Overview / Tasks / Settings / Usage now share one usage/quota truth source:
- the same today-usage number
- the same Codex quota windows
- the same subscription-status judgement
- Active-session counts are aligned across:
- overview KPI
- certainty card
- sidebar / summary strips
- Task certainty no longer depends on only the first recent-session page:
- linked session evidence is loaded for the visible task set
- task detail pages no longer stop at the first 6 linked sessions
- Detail links now keep the current UI language when opening task / cron drill-down pages.
Dashboard highlights (Phase 15, UX v2)
- Home dashboard is now organized into six operator tabs with persistent left navigation:
OverviewOffice SpaceProjects/TasksAlertsReplay/AuditSettings
- UI moved to a colorful pixel-arcade visual style with dual sidebars (navigation + context rail).
- New
Office Spaceview shows who is busy on what, grouped by office zones. - Agent cards now include automatic animal identities derived from agent name semantics, with deterministic fallback mapping.
- Empty/zero-heavy blocks are softened:
- non-actionable zero states are minimized
- user-facing empty states now say
Not activated yet.
- Home copy was rewritten from debug-heavy wording to operator-focused language while preserving all existing routes and backend behavior.
Dashboard highlights (Phase 22, Usage/Cost parity surfaces)
- Added
Usage & Costsection in the primary sidebar IA. - Added Overview card-level usage/cost pulse:
- period totals (
today,7d,30d) - request-count source state
- burn-rate headline
- period totals (
- Added dedicated Usage & Cost dashboard section:
- context window visibility per active session/agent (absolute tokens + % when context catalog is available)
- pace/trend labels + warning thresholds
- usage/cost breakdown by agent, project, model, provider
- budget burn-rate status and alert messaging
- Added graceful unavailable-state behavior:
- explicit
Data source not connectedlabels for disconnected metrics (instead of fake zeros) - connector TODO list surfaced in Settings
- explicit
- Added usage adapter endpoint:
GET /api/usage-cost
Dashboard highlights (Phase 25, Mission Control v3)
- UI visual reset to polished pixel-office style:
- design-token based palette/spacing/radius/shadow system
- layered office background grid + glow depth
- responsive desktop/mobile hierarchy with subtle card/status motion
- Navigation and copy reset for operator clarity:
Command Deck,Usage & Billing,Pixel Office,Work Board,Decisions,Timeline,Control Room- reduced technical wording on primary surfaces
- advanced links preserved under explicit disclosure
- Mac parity surfaces panel added with status + route entry for:
- conversations, approvals/decision queue, cron, projects/tasks, usage/cost, replay/audit, health/digest, export/import dry-run safety, pixel adapter
- Full roster office model:
- best-effort OpenClaw roster read from
~/.openclaw/openclaw.jsonviasrc/runtime/agent-roster.ts - office floor now renders desk/zone occupancy and includes known agents beyond active sessions
- best-effort OpenClaw roster read from
- Subscription usage/remaining best-effort integration:
- adapter support in
src/runtime/usage-cost.tsfor connected/partial/not_connected states - UI now shows consumed/remaining/limit/cycle/source and explicit connection targets when unavailable
- adapter support in
Dashboard highlights (Phase 68, Plain-language certainty)
- Added
Information certaintycard to Overview and Settings:- tells non-technical operators which parts of the picture are trustworthy now
- calls out remaining blind spots in plain language
- Added
Execution certaintyboard to Tasks:- scores whether each in-flight task is backed by real execution evidence
- separates
evidence is strongfromneeds follow-upandevidence is weak
- Task detail pages now act as evidence pages:
- certainty judgement
- linked session evidence and recent activity summaries
API validation/error envelope
- API mutating routes require
Content-Type: application/json. - Import/export and mutating routes require local token auth by default:
- header:
x-local-token: <LOCAL_API_TOKEN> - or
Authorization: Bearer <LOCAL_API_TOKEN>
- header:
- Strict API query validation rejects unknown query keys.
- JSON errors use a consistent envelope:
{"ok":false,"requestId":"...","error":{"code":"...","status":<http>,"message":"...","issues":[],"requestId":"..."}}
- JSON responses include
requestIdand all responses includex-request-idheader for correlation.
Live import warning
POST /api/import/liveis intentionally disabled by default.- Do not enable it unless you are doing a controlled local restore test.
- Live mode mutates local runtime stores (
runtime/projects.json,runtime/tasks.json,runtime/budgets.json). - Keep
READONLY_MODE=trueandIMPORT_MUTATION_ENABLED=falsein normal operation.
Runtime files
runtime/last-snapshot.jsonruntime/timeline.logruntime/projects.jsonruntime/tasks.jsonruntime/budgets.jsonruntime/notification-policy.jsonruntime/model-context-catalog.jsonruntime/ui-preferences.jsonruntime/acks.jsonruntime/approval-actions.logruntime/operation-audit.logruntime/digests/YYYY-MM-DD.jsonruntime/digests/YYYY-MM-DD.mdruntime/export-snapshots/*.jsonruntime/exports/*.json
Docs
docs/ARCHITECTURE.mddocs/RUNBOOK.mddocs/PROGRESS.md



