openclaw-control-center
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
Chineseopenclaw-control-center
openclaw-control-center
Skill by 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.
由ara.so开发的Skill——2026每日Skill合集
OpenClaw控制中心将OpenClaw从一个黑盒转变为本地可审计的控制中心。它提供对Agent活动、token消耗、任务执行链、跨会话协作、内存状态和文档源的可视化能力——默认采用安全优先设置,所有修改操作默认处于关闭状态。
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
- 概览:系统健康状态、待处理项、风险信号和运营摘要
- 使用情况:每日/7天/30天token消耗、配额、上下文压力、订阅窗口
- Agent状态:当前正在执行任务与处于排队状态的Agent——而非仅显示“有任务”
- 协作追踪:父-子会话交接记录以及已验证的跨会话消息(例如 )
Main ⇄ Pandas - 任务管理:任务看板、审批流程、执行链、运行证据
- 内存管理:各Agent的内存健康状态、可搜索性及源文件编辑
- 文档管理:从实际源文件打开的共享文档和Agent核心文档
- 设置:连接器连接状态、安全风险摘要、更新状态
Installation
安装步骤
bash
git clone https://github.com/TianyiDataScience/openclaw-control-center.git
cd openclaw-control-center
npm install
cp .env.example .env
npm run build
npm test
npm run smoke:ui
npm run dev:uiOpen:
http://127.0.0.1:4310/?section=overview&lang=zhhttp://127.0.0.1:4310/?section=overview&lang=en
Useovernpm run dev:ui— more stable, especially on Windows shells.UI_MODE=true npm run dev
bash
git clone https://github.com/TianyiDataScience/openclaw-control-center.git
cd openclaw-control-center
npm install
cp .env.example .env
npm run build
npm test
npm run smoke:ui
npm run dev:ui打开以下地址访问:
http://127.0.0.1:4310/?section=overview&lang=zhhttp://127.0.0.1:4310/?section=overview&lang=en
推荐使用而非npm run dev:ui——稳定性更强,尤其在Windows终端中。UI_MODE=true npm run dev
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.mdCritical constraint: Only modify files inside. Never modifycontrol-center/.~/.openclaw/openclaw.json
openclaw-control-center/
├── control-center/ # 所有修改操作必须在此目录内进行
│ ├── src/
│ │ ├── runtime/ # 核心运行时、连接器、监控器
│ │ └── ui/ # 前端UI组件
│ ├── .env.example
│ └── package.json
├── docs/
│ └── assets/ # 截图和文档图片
├── README.md
└── README.en.md重要约束:仅可修改目录内的文件。切勿修改control-center/。~/.openclaw/openclaw.json
Environment Configuration
环境配置
Copy to and configure:
.env.example.envenv
undefined复制文件并重命名为,然后进行以下配置:
.env.example.envenv
undefinedSecurity defaults — do NOT change without understanding implications
安全默认设置——未理解影响前请勿修改
READONLY_MODE=true
LOCAL_TOKEN_AUTH_REQUIRED=true
IMPORT_MUTATION_ENABLED=false
IMPORT_MUTATION_DRY_RUN=false
APPROVAL_ACTIONS_ENABLED=false
APPROVAL_ACTIONS_DRY_RUN=true
READONLY_MODE=true
LOCAL_TOKEN_AUTH_REQUIRED=true
IMPORT_MUTATION_ENABLED=false
IMPORT_MUTATION_DRY_RUN=false
APPROVAL_ACTIONS_ENABLED=false
APPROVAL_ACTIONS_DRY_RUN=true
Connection
连接配置
OPENCLAW_GATEWAY_URL=http://127.0.0.1:PORT
OPENCLAW_HOME=~/.openclaw
OPENCLAW_GATEWAY_URL=http://127.0.0.1:PORT
OPENCLAW_HOME=~/.openclaw
UI
UI配置
PORT=4310
DEFAULT_LANG=zh
undefinedPORT=4310
DEFAULT_LANG=zh
undefinedSecurity Flag Meanings
安全标志说明
| Flag | Default | Effect |
|---|---|---|
| | All state-changing endpoints disabled |
| | Import/export and write APIs require local token |
| | Import mutations blocked entirely |
| | Dry-run mode for imports when enabled |
| | Approval actions hard-disabled |
| | Approval actions run as dry-run when enabled |
| 标志 | 默认值 | 作用 |
|---|---|---|
| | 禁用所有可修改状态的接口 |
| | 导入/导出和写入API需要本地token验证 |
| | 完全阻止导入修改操作 |
| | 启用导入时的空跑模式 |
| | 完全禁用审批操作 |
| | 启用审批操作时以空跑模式运行 |
Key Commands
关键命令
bash
undefinedbash
undefinedDevelopment
开发模式
npm run dev:ui # Start UI server (recommended)
npm run dev # One-shot monitor run, no HTTP UI
npm run dev:ui # 启动UI服务(推荐方式)
npm run dev # 单次监控运行,无HTTP UI
Build & Test
构建与测试
npm run build # TypeScript compile
npm test # Run test suite
npm run smoke:ui # Smoke test the UI endpoints
npm run build # TypeScript编译
npm test # 运行测试套件
npm run smoke:ui # 对UI接口进行冒烟测试
Lint
代码检查
npm run lint # ESLint check
npm run lint:fix # Auto-fix lint issues
undefinednpm run lint # ESLint检查
npm run lint:fix # 自动修复代码检查问题
undefinedTypeScript Code Examples
TypeScript代码示例
Connecting to the Runtime Monitor
连接到运行时监控器
typescript
import { 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 overview
const overview = await monitor.getOverview();
console.log(overview.systemStatus); // 'healthy' | 'degraded' | 'critical'
console.log(overview.pendingItems); // number
console.log(overview.activeAgents); // Agent[]typescript
import { 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',
});
// 获取当前系统概览
const overview = await monitor.getOverview();
console.log(overview.systemStatus); // 'healthy' | 'degraded' | 'critical'
console.log(overview.pendingItems); // 数字
console.log(overview.activeAgents); // Agent[]Reading Agent Staff Status
查询Agent状态
typescript
import { 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 depth
const roster = await staff.getRoster();typescript
import { StaffConnector } from './src/runtime/connectors/staff';
const staff = new StaffConnector({ gatewayUrl: process.env.OPENCLAW_GATEWAY_URL });
// 获取正在执行任务的Agent(非仅排队状态)
const activeAgents = await staff.getActiveAgents();
activeAgents.forEach(agent => {
console.log(`${agent.name}: ${agent.status}`);
// 'executing' | 'queued' | 'idle' | 'blocked'
console.log(`当前任务: ${agent.currentTask?.title ?? '无'}`);
console.log(`最后输出: ${agent.lastOutput}`);
});
// 获取包含队列深度的完整Agent列表
const roster = await staff.getRoster();Tracing Cross-Session Collaboration
追踪跨会话协作
typescript
import { CollaborationTracer } from './src/runtime/connectors/collaboration';
const tracer = new CollaborationTracer({ gatewayUrl: process.env.OPENCLAW_GATEWAY_URL });
// Get parent-child session handoffs
const 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'
});typescript
import { CollaborationTracer } from './src/runtime/connectors/collaboration';
const tracer = new CollaborationTracer({ gatewayUrl: process.env.OPENCLAW_GATEWAY_URL });
// 获取父-子会话交接记录
const handoffs = await tracer.getSessionHandoffs();
handoffs.forEach(handoff => {
console.log(`${handoff.parentSession} → ${handoff.childSession}`);
console.log(`委托任务: ${handoff.taskTitle}`);
console.log(`状态: ${handoff.status}`);
});
// 获取已验证的跨会话消息(例如 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
查询Token使用情况
typescript
import { UsageConnector } from './src/runtime/connectors/usage';
const usage = new UsageConnector({ gatewayUrl: process.env.OPENCLAW_GATEWAY_URL });
// Today's usage
const 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 days
const 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}%)`);
});typescript
import { UsageConnector } from './src/runtime/connectors/usage';
const usage = new UsageConnector({ gatewayUrl: process.env.OPENCLAW_GATEWAY_URL });
// 今日使用情况
const today = await usage.getUsageSummary('today');
console.log(`已使用Token: ${today.tokensUsed}`);
console.log(`成本: $${today.costUsd.toFixed(4)}`);
console.log(`上下文压力: ${today.contextPressure}`);
// contextPressure: 'low' | 'medium' | 'high' | 'critical'
// 7天使用趋势
const trend = await usage.getUsageTrend(7);
trend.forEach(day => {
console.log(`${day.date}: ${day.tokensUsed} 个Token, $${day.costUsd.toFixed(4)}`);
});
// 按任务统计Token消耗(哪些任务消耗了预定的Token)
const attribution = await usage.getTokenAttribution();
attribution.tasks.forEach(task => {
console.log(`${task.title}: ${task.tokensUsed} (${task.percentOfTotal}%)`);
});Reading Memory State
查询内存状态
typescript
import { 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 agent
const 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 });typescript
import { MemoryConnector } from './src/runtime/connectors/memory';
const memory = new MemoryConnector({
openclawHome: process.env.OPENCLAW_HOME ?? '~/.openclaw',
});
// 获取各活跃Agent的内存健康状态(基于openclaw.json)
const memoryState = await memory.getMemoryState();
memoryState.agents.forEach(agent => {
console.log(`${agent.name}:`);
console.log(` 可用内存: ${agent.memoryAvailable}`);
console.log(` 可搜索内存: ${agent.memorySearchable}`);
console.log(` 需要审核: ${agent.needsReview}`);
});
// 读取某个Agent的每日内存
const dailyMemory = await memory.readDailyMemory('main-agent');
console.log(dailyMemory.content);
// 编辑内存(需要READONLY_MODE=false和有效的本地token)
await memory.writeDailyMemory('main-agent', updatedContent, { token: localToken });Checking Wiring Status
检查连接器状态
typescript
import { 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}`);
}
});typescript
import { 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(` 修复建议: ${connector.nextStep}`);
}
});Approving Tasks (Gated Endpoint)
审批任务(受限接口)
typescript
import { 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');
}
}typescript
import { 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',
});
// 如果APPROVAL_ACTIONS_ENABLED=false(默认值),此代码会抛出错误
try {
const result = await tasks.approveTask('task-id-123', { token: localToken });
if (result.dryRun) {
console.log('空跑模式——未实际修改状态');
}
} catch (err) {
if (err.code === 'APPROVAL_ACTIONS_DISABLED') {
console.log('请设置APPROVAL_ACTIONS_ENABLED=true以启用审批功能');
}
}UI Section Navigation
UI板块导航
Navigate via query params:
http://127.0.0.1:4310/?section=overview&lang=zh
http://127.0.0.1:4310/?section=usage&lang=en
http://127.0.0.1:4310/?section=staff&lang=zh
http://127.0.0.1:4310/?section=collaboration&lang=en
http://127.0.0.1:4310/?section=tasks&lang=zh
http://127.0.0.1:4310/?section=memory&lang=en
http://127.0.0.1:4310/?section=documents&lang=zh
http://127.0.0.1:4310/?section=settings&lang=enSections: | | | | | | |
overviewusagestaffcollaborationtasksmemorydocumentssettingsLanguages: (Chinese, default) | (English)
zhen通过查询参数进行导航:
http://127.0.0.1:4310/?section=overview&lang=zh
http://127.0.0.1:4310/?section=usage&lang=en
http://127.0.0.1:4310/?section=staff&lang=zh
http://127.0.0.1:4310/?section=collaboration&lang=en
http://127.0.0.1:4310/?section=tasks&lang=zh
http://127.0.0.1:4310/?section=memory&lang=en
http://127.0.0.1:4310/?section=documents&lang=zh
http://127.0.0.1:4310/?section=settings&lang=en可选板块: | | | | | | |
overviewusagestaffcollaborationtasksmemorydocumentssettings支持语言:(中文,默认) | (英文)
zhenIntegration Patterns
集成模式
Embedding in an Existing OpenClaw Workflow
嵌入现有OpenClaw工作流
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 task
const installInstructions = `
cd openclaw-control-center
npm install
cp .env.example .env如果你的OpenClaw Agent需要将指令传递给控制中心进行设置,请使用以下已文档化的安装代码块:
typescript
// 在你的OpenClaw Agent任务中
const installInstructions = `
cd openclaw-control-center
npm install
cp .env.example .envEdit .env: set OPENCLAW_GATEWAY_URL and OPENCLAW_HOME
编辑.env:设置OPENCLAW_GATEWAY_URL和OPENCLAW_HOME
npm run build && npm test && npm run dev:ui
`;
undefinednpm run build && npm test && npm run dev:ui
`;
undefinedAdding a Custom Connector
添加自定义连接器
All connectors live in . Follow this pattern:
control-center/src/runtime/connectors/typescript
// control-center/src/runtime/connectors/my-connector.ts
import { 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[]>;
}
}所有连接器都位于目录下,请遵循以下模式:
control-center/src/runtime/connectors/typescript
// control-center/src/runtime/connectors/my-connector.ts
import { 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[]> {
// 对于任何写入操作,务必检查只读模式
this.assertNotReadonly('getData是只读安全的');
const response = await this.fetch('/api/my-endpoint');
return response.json() as Promise<MyData[]>;
}
}Custom UI Section
自定义UI板块
typescript
// control-center/src/ui/sections/MySection.tsx
import 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>
);
};typescript
// control-center/src/ui/sections/MySection.tsx
import 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>加载中...</div>;
if (error) return <div>错误: {error.message}</div>;
return (
<ul>
{data?.map(item => (
<li key={item.id}>{item.value}</li>
))}
</ul>
);
};Troubleshooting
故障排除
"Missing src/runtime" or "Missing core source"
“缺少src/runtime”或“缺少核心源码”
This almost always means the working directory is wrong:
bash
undefined这几乎总是因为工作目录错误导致的:
bash
undefinedEnsure you're in the repo root
确保你位于仓库根目录
pwd # should end in /openclaw-control-center
ls control-center/src/runtime # should exist
If cloned correctly but still missing: the clone was incomplete. Re-clone:
```bash
git clone https://github.com/TianyiDataScience/openclaw-control-center.gitpwd # 路径应以/openclaw-control-center结尾
ls control-center/src/runtime # 该目录应存在
如果克隆正确但仍然缺失:说明克隆不完整,请重新克隆:
```bash
git clone https://github.com/TianyiDataScience/openclaw-control-center.gitUI Doesn't Start / Port Conflicts
UI无法启动/端口冲突
bash
undefinedbash
undefinedCheck if port 4310 is in use
检查端口4310是否被占用
lsof -i :4310
lsof -i :4310
or on Windows
Windows系统请使用
netstat -ano | findstr :4310
netstat -ano | findstr :4310
Change port in .env
在.env中修改端口
PORT=4311
undefinedPORT=4311
undefinedData Not Showing (Partial or Empty Sections)
数据未显示(板块内容部分或完全为空)
- Open → 接线状态 (Wiring Status) — it lists exactly which connectors are connected, partial, or missing.
Settings - Common causes:
- not set or wrong port
OPENCLAW_GATEWAY_URL - doesn't point to actual
OPENCLAW_HOME~/.openclaw - OpenClaw subscription snapshot not at default path
- 打开→ 接线状态——该页面会列出所有连接器的连接状态:已连接、部分连接或未连接。
设置 - 常见原因:
- 未设置或端口错误
OPENCLAW_GATEWAY_URL - 未指向实际的
OPENCLAW_HOME目录~/.openclaw - OpenClaw订阅快照未位于默认路径
Token Auth Failures
Token验证失败
bash
undefinedbash
undefinedGenerate a local token (see openclaw docs for token location)
生成本地token(请查阅OpenClaw文档了解token位置)
cat ~/.openclaw/local-token
cat ~/.openclaw/local-token
Pass via header in API calls
在API调用中通过请求头传递token
curl -H "X-Local-Token: <token>" http://127.0.0.1:4310/api/tasks/approve
undefinedcurl -H "X-Local-Token: <token>" http://127.0.0.1:4310/api/tasks/approve
undefinedApproval Actions Silently Do Nothing
审批操作无响应
Check your :
.envenv
APPROVAL_ACTIONS_ENABLED=true # Must be true
APPROVAL_ACTIONS_DRY_RUN=false # Must be false for real executionBoth must be explicitly set. Default is disabled + dry-run.
检查你的文件:
.envenv
APPROVAL_ACTIONS_ENABLED=true # 必须设置为true
APPROVAL_ACTIONS_DRY_RUN=false # 若要实际执行必须设置为false这两个参数都必须显式设置,默认值为禁用+空跑模式。
Memory Section Shows Inactive Agents
内存板块显示已停用的Agent
The memory section is scoped to agents listed in . If deleted agents still appear:
openclaw.jsonbash
undefined内存板块的范围基于中列出的Agent。如果已删除的Agent仍然显示:
openclaw.jsonbash
undefinedCheck active agents
检查活跃Agent
cat ~/.openclaw/openclaw.json | grep -A5 '"agents"'
Remove stale entries from `openclaw.json` — the memory section will update on next load.cat ~/.openclaw/openclaw.json | grep -A5 '"agents"'
从`openclaw.json`中删除过时的条目——内存板块会在下次加载时更新。Windows Shell Issues
Windows终端问题
Prefer over . Cross-env variable setting behaves differently in PowerShell/CMD. The script handles this internally.
npm run dev:uiUI_MODE=true npm run devdev:ui推荐使用而非。跨环境变量设置在PowerShell/CMD中的表现不同,脚本会在内部处理此问题。
npm run dev:uiUI_MODE=true npm run devdev:uiPrerequisites
前置要求
- Node.js + npm
- A running OpenClaw installation with accessible Gateway
- Read access to on the local machine
~/.openclaw - (Optional) and OpenClaw subscription snapshot for full usage data
~/.codex
- Node.js + npm
- 已运行的OpenClaw实例,且Gateway可访问
- 本地机器上对目录的读取权限
~/.openclaw - (可选)和OpenClaw订阅快照以获取完整的使用数据
~/.codex