Claude Agent Skill · by Aradotso

Openclaw Control Center

Install Openclaw Control Center skill for Claude Code from aradotso/trending-skills.

Install
Terminal · npx
$npx skills add https://github.com/aradotso/trending-skills --skill openclaw-control-center
Works with Paperclip

How Openclaw Control Center fits into a Paperclip company.

Openclaw Control Center drops into any Paperclip agent that handles this kind of work. Assign it to a specialist inside a pre-configured PaperclipOrg company and the skill becomes available on every heartbeat — no prompt engineering, no tool wiring.

S
SaaS FactoryPaired

Pre-configured AI company — 18 agents, 18 skills, one-time purchase.

$27$59
Explore pack
Source file
SKILL.md443 lines
Expand
---name: openclaw-control-centerdescription: Local-first, security-first control center for OpenClaw agents — visibility dashboard with readonly defaults, token attribution, collaboration tracing, and safe write operations.triggers:  - openclaw control center  - openclaw dashboard  - openclaw agent monitoring  - openclaw token usage  - openclaw collaboration tracing  - openclaw task approval  - openclaw memory management  - openclaw local control panel--- # openclaw-control-center > Skill by [ara.so](https://ara.so) — Daily 2026 Skills collection OpenClaw Control Center transforms OpenClaw from a black box into a local, auditable control center. It provides visibility into agent activity, token spend, task execution chains, cross-session collaboration, memory state, and document sources — with security-first defaults that keep all mutations off by default. ## What It Does - **Overview**: System health, pending items, risk signals, and operational summary- **Usage**: Daily/7d/30d token spend, quota, context pressure, subscription window- **Staff**: Who is actively executing vs. queued — not just "has tasks"- **Collaboration**: Parent-child session handoffs and verified cross-session messages (e.g. `Main ⇄ Pandas`)- **Tasks**: Task board, approvals, execution chains, run evidence- **Memory**: Per-agent memory health, searchability, and source file editing- **Documents**: Shared and agent-core documents opened from actual source files- **Settings**: Connector wiring status, security risk summary, update status ## Installation ```bashgit clone https://github.com/TianyiDataScience/openclaw-control-center.gitcd openclaw-control-centernpm installcp .env.example .envnpm run buildnpm testnpm run smoke:uinpm run dev:ui``` Open:- `http://127.0.0.1:4310/?section=overview&lang=zh`- `http://127.0.0.1:4310/?section=overview&lang=en` > Use `npm run dev:ui` over `UI_MODE=true npm run dev` — more stable, especially on Windows shells. ## Project Structure ```openclaw-control-center/├── control-center/          # All modifications must stay within this directory│   ├── src/│   │   ├── runtime/         # Core runtime, connectors, monitors│   │   └── ui/              # Frontend UI components│   ├── .env.example│   └── package.json├── docs/│   └── assets/              # Screenshots and documentation images├── README.md└── README.en.md``` > **Critical constraint**: Only modify files inside `control-center/`. Never modify `~/.openclaw/openclaw.json`. ## Environment Configuration Copy `.env.example` to `.env` and configure: ```env# Security defaults — do NOT change without understanding implicationsREADONLY_MODE=trueLOCAL_TOKEN_AUTH_REQUIRED=trueIMPORT_MUTATION_ENABLED=falseIMPORT_MUTATION_DRY_RUN=falseAPPROVAL_ACTIONS_ENABLED=falseAPPROVAL_ACTIONS_DRY_RUN=true # ConnectionOPENCLAW_GATEWAY_URL=http://127.0.0.1:PORTOPENCLAW_HOME=~/.openclaw # UIPORT=4310DEFAULT_LANG=zh``` ### Security Flag Meanings | Flag | Default | Effect ||------|---------|--------|| `READONLY_MODE` | `true` | All state-changing endpoints disabled || `LOCAL_TOKEN_AUTH_REQUIRED` | `true` | Import/export and write APIs require local token || `IMPORT_MUTATION_ENABLED` | `false` | Import mutations blocked entirely || `IMPORT_MUTATION_DRY_RUN` | `false` | Dry-run mode for imports when enabled || `APPROVAL_ACTIONS_ENABLED` | `false` | Approval actions hard-disabled || `APPROVAL_ACTIONS_DRY_RUN` | `true` | Approval actions run as dry-run when enabled | ## Key Commands ```bash# Developmentnpm run dev:ui          # Start UI server (recommended)npm run dev             # One-shot monitor run, no HTTP UI # Build & Testnpm run build           # TypeScript compilenpm test                # Run test suitenpm run smoke:ui        # Smoke test the UI endpoints # Lintnpm run lint            # ESLint checknpm run lint:fix        # Auto-fix lint issues``` ## TypeScript Code Examples ### Connecting to the Runtime Monitor ```typescriptimport { createMonitor } from './src/runtime/monitor'; const monitor = createMonitor({  gatewayUrl: process.env.OPENCLAW_GATEWAY_URL ?? 'http://127.0.0.1:4310',  readonlyMode: process.env.READONLY_MODE !== 'false',  localTokenAuthRequired: process.env.LOCAL_TOKEN_AUTH_REQUIRED !== 'false',}); // Fetch current system overviewconst overview = await monitor.getOverview();console.log(overview.systemStatus);      // 'healthy' | 'degraded' | 'critical'console.log(overview.pendingItems);      // numberconsole.log(overview.activeAgents);      // Agent[]``` ### Reading Agent Staff Status ```typescriptimport { StaffConnector } from './src/runtime/connectors/staff'; const staff = new StaffConnector({ gatewayUrl: process.env.OPENCLAW_GATEWAY_URL }); // Get agents actively executing (not just queued)const activeAgents = await staff.getActiveAgents();activeAgents.forEach(agent => {  console.log(`${agent.name}: ${agent.status}`);  // 'executing' | 'queued' | 'idle' | 'blocked'  console.log(`Current task: ${agent.currentTask?.title ?? 'none'}`);  console.log(`Last output: ${agent.lastOutput}`);}); // Get the full staff roster including queue depthconst roster = await staff.getRoster();``` ### Tracing Cross-Session Collaboration ```typescriptimport { CollaborationTracer } from './src/runtime/connectors/collaboration'; const tracer = new CollaborationTracer({ gatewayUrl: process.env.OPENCLAW_GATEWAY_URL }); // Get parent-child session handoffsconst handoffs = await tracer.getSessionHandoffs();handoffs.forEach(handoff => {  console.log(`${handoff.parentSession} → ${handoff.childSession}`);  console.log(`Delegated task: ${handoff.taskTitle}`);  console.log(`Status: ${handoff.status}`);}); // Get verified cross-session messages (e.g. Main ⇄ Pandas)const crossSessionMessages = await tracer.getCrossSessionMessages();crossSessionMessages.forEach(msg => {  console.log(`${msg.fromAgent} ⇄ ${msg.toAgent}: ${msg.messageType}`);  // messageType: 'sessions_send' | 'inter-session message'});``` ### Fetching Token Usage and Spend ```typescriptimport { UsageConnector } from './src/runtime/connectors/usage'; const usage = new UsageConnector({ gatewayUrl: process.env.OPENCLAW_GATEWAY_URL }); // Today's usageconst today = await usage.getUsageSummary('today');console.log(`Tokens used: ${today.tokensUsed}`);console.log(`Cost: $${today.costUsd.toFixed(4)}`);console.log(`Context pressure: ${today.contextPressure}`);// contextPressure: 'low' | 'medium' | 'high' | 'critical' // Usage trend over 7 daysconst trend = await usage.getUsageTrend(7);trend.forEach(day => {  console.log(`${day.date}: ${day.tokensUsed} tokens, $${day.costUsd.toFixed(4)}`);}); // Token attribution by task (who ate the scheduled task tokens)const attribution = await usage.getTokenAttribution();attribution.tasks.forEach(task => {  console.log(`${task.title}: ${task.tokensUsed} (${task.percentOfTotal}%)`);});``` ### Reading Memory State ```typescriptimport { MemoryConnector } from './src/runtime/connectors/memory'; const memory = new MemoryConnector({  openclawHome: process.env.OPENCLAW_HOME ?? '~/.openclaw',}); // Get memory health per active agent (scoped to openclaw.json)const memoryState = await memory.getMemoryState();memoryState.agents.forEach(agent => {  console.log(`${agent.name}:`);  console.log(`  Available: ${agent.memoryAvailable}`);  console.log(`  Searchable: ${agent.memorySearchable}`);  console.log(`  Needs review: ${agent.needsReview}`);}); // Read daily memory for an agentconst dailyMemory = await memory.readDailyMemory('main-agent');console.log(dailyMemory.content); // Edit memory (requires READONLY_MODE=false and valid local token)await memory.writeDailyMemory('main-agent', updatedContent, { token: localToken });``` ### Checking Wiring Status ```typescriptimport { WiringChecker } from './src/runtime/connectors/wiring'; const wiring = new WiringChecker({ gatewayUrl: process.env.OPENCLAW_GATEWAY_URL }); const status = await wiring.getWiringStatus();status.connectors.forEach(connector => {  console.log(`${connector.name}: ${connector.status}`);  // status: 'connected' | 'partial' | 'disconnected'  if (connector.status !== 'connected') {    console.log(`  Fix: ${connector.nextStep}`);  }});``` ### Approving Tasks (Gated Endpoint) ```typescriptimport { TaskConnector } from './src/runtime/connectors/tasks'; const tasks = new TaskConnector({  gatewayUrl: process.env.OPENCLAW_GATEWAY_URL,  approvalActionsEnabled: process.env.APPROVAL_ACTIONS_ENABLED === 'true',  approvalActionsDryRun: process.env.APPROVAL_ACTIONS_DRY_RUN !== 'false',}); // This throws if APPROVAL_ACTIONS_ENABLED=false (default)try {  const result = await tasks.approveTask('task-id-123', { token: localToken });  if (result.dryRun) {    console.log('Dry run — no actual state change');  }} catch (err) {  if (err.code === 'APPROVAL_ACTIONS_DISABLED') {    console.log('Set APPROVAL_ACTIONS_ENABLED=true to enable approvals');  }}``` ## UI Section Navigation Navigate via query params: ```http://127.0.0.1:4310/?section=overview&lang=zhhttp://127.0.0.1:4310/?section=usage&lang=enhttp://127.0.0.1:4310/?section=staff&lang=zhhttp://127.0.0.1:4310/?section=collaboration&lang=enhttp://127.0.0.1:4310/?section=tasks&lang=zhhttp://127.0.0.1:4310/?section=memory&lang=enhttp://127.0.0.1:4310/?section=documents&lang=zhhttp://127.0.0.1:4310/?section=settings&lang=en``` Sections: `overview` | `usage` | `staff` | `collaboration` | `tasks` | `memory` | `documents` | `settings` Languages: `zh` (Chinese, default) | `en` (English) ## Integration Patterns ### Embedding in an Existing OpenClaw Workflow If your OpenClaw agent needs to hand off instructions to the control center for setup, use the documented install block: ```typescript// In your OpenClaw agent taskconst installInstructions = `cd openclaw-control-centernpm installcp .env.example .env# Edit .env: set OPENCLAW_GATEWAY_URL and OPENCLAW_HOMEnpm run build && npm test && npm run dev:ui`;``` ### Adding a Custom Connector All connectors live in `control-center/src/runtime/connectors/`. Follow this pattern: ```typescript// control-center/src/runtime/connectors/my-connector.tsimport { BaseConnector, ConnectorOptions } from './base'; export interface MyData {  id: string;  value: string;} export class MyConnector extends BaseConnector {  constructor(options: ConnectorOptions) {    super(options);  }   async getData(): Promise<MyData[]> {    // Always check readonly mode for any write operation    this.assertNotReadonly('getData is readonly-safe');     const response = await this.fetch('/api/my-endpoint');    return response.json() as Promise<MyData[]>;  }}``` ### Custom UI Section ```typescript// control-center/src/ui/sections/MySection.tsximport React from 'react';import { useConnector } from '../hooks/useConnector';import { MyConnector } from '../../runtime/connectors/my-connector'; export const MySection: React.FC = () => {  const { data, loading, error } = useConnector(MyConnector, 'getData');   if (loading) return <div>Loading...</div>;  if (error) return <div>Error: {error.message}</div>;   return (    <ul>      {data?.map(item => (        <li key={item.id}>{item.value}</li>      ))}    </ul>  );};``` ## Troubleshooting ### "Missing src/runtime" or "Missing core source" This almost always means the working directory is wrong: ```bash# Ensure you're in the repo rootpwd  # should end in /openclaw-control-centerls control-center/src/runtime  # should exist``` If cloned correctly but still missing: the clone was incomplete. Re-clone: ```bashgit clone https://github.com/TianyiDataScience/openclaw-control-center.git``` ### UI Doesn't Start / Port Conflicts ```bash# Check if port 4310 is in uselsof -i :4310# or on Windowsnetstat -ano | findstr :4310 # Change port in .envPORT=4311``` ### Data Not Showing (Partial or Empty Sections) 1. Open `Settings` → **接线状态** (Wiring Status) — it lists exactly which connectors are connected, partial, or missing.2. Common causes:   - `OPENCLAW_GATEWAY_URL` not set or wrong port   - `OPENCLAW_HOME` doesn't point to actual `~/.openclaw`   - OpenClaw subscription snapshot not at default path ### Token Auth Failures ```bash# Generate a local token (see openclaw docs for token location)cat ~/.openclaw/local-token # Pass via header in API callscurl -H "X-Local-Token: <token>" http://127.0.0.1:4310/api/tasks/approve``` ### Approval Actions Silently Do Nothing Check your `.env`: ```envAPPROVAL_ACTIONS_ENABLED=true   # Must be trueAPPROVAL_ACTIONS_DRY_RUN=false  # Must be false for real execution``` Both must be explicitly set. Default is disabled + dry-run. ### Memory Section Shows Inactive Agents The memory section is scoped to agents listed in `openclaw.json`. If deleted agents still appear: ```bash# Check active agentscat ~/.openclaw/openclaw.json | grep -A5 '"agents"'``` Remove stale entries from `openclaw.json` — the memory section will update on next load. ### Windows Shell Issues Prefer `npm run dev:ui` over `UI_MODE=true npm run dev`. Cross-env variable setting behaves differently in PowerShell/CMD. The `dev:ui` script handles this internally. ## Prerequisites - Node.js + npm- A running OpenClaw installation with accessible Gateway- Read access to `~/.openclaw` on the local machine- (Optional) `~/.codex` and OpenClaw subscription snapshot for full usage data