简体中文 | English | 한국어 | Français | Deutsch | 日本語 | Русский | Español | Português | Italiano | Tiếng Việt | العربية
像素风「办公室」看板:把多路 AI 助手(OpenClaw、龙虾等)的工作状态实时铺在一屏上——谁在写、谁在查、谁在跑任务、谁在线,以及「昨天」留下了什么痕迹,让人一眼读懂协作现场。
本仓库是上游 Star-Office-UI 的 Node / Express 实现:保留同款画面与 HTTP 行为,方便已有 Agent 与脚本几乎零改动接入;后端按可长期运行的服务来拆层,而不是单文件堆逻辑。
本项目支持4种风格:像素、柔和、夜青、纸本,默认像素风格。

src/ 下,可读、可测、可迭代,而不是所有代码挤在一个入口文件里。engines、only-allow、.npmrc 的 engine-strict,以及 src/bootstrap/env-check.js 运行时校验),减少「我本地能跑、CI 不能跑」的摩擦。SIGTERM / SIGINT 优雅退出,适合 Docker / K8s 滚动发布;提供 GET /health(存活) 与 GET /ready(就绪) 探针。GET /yesterday-memo 会读取与仓库同级的 memory/ 目录下按日期命名的 Markdown,把日记提炼成简短展示(具体规则见实现)。下面仍保留对上源的致谢与对接说明;运行方式与 API 与英文版 README 同步维护。
感谢原作者开源像素办公室的设计与素材管线,本仓库在此基础上做 Node 化与运维向增强。
需 Node ≥ 20、pnpm ≥ 9(见 pnpm 安装)。
git clone https://github.com/wangmiaozero/Star-Office-UI-Node.git
cd Star-Office-UI-Node
pnpm install
pnpm start
默认地址:http://127.0.0.1:18791
开发(文件变更自动重启):
pnpm dev
端口占用时:
PORT=18792 pnpm start
环境变量示例:
cp .env.example .env
仅在无法用 pnpm 包裹进程时,可使用 SKIP_PNPM_CHECK=1 直接执行 node src/server.js;生产环境不建议。
docker compose up -d
浏览器访问:http://127.0.0.1:18791
切换主 Agent状态(命令行小工具):
pnpm set-state writing "正在整理文档"
pnpm set-state researching "正在查资料"
pnpm set-state executing "正在执行任务"
pnpm set-state syncing "同步进度中"
pnpm set-state error "发现问题,排查中"
pnpm set-state idle "待命中"
健康与就绪:
curl -s http://127.0.0.1:18791/health curl -s http://127.0.0.1:18791/ready
GET /health:存活探针GET /ready:就绪探针(持久化初始化完成后)GET /status:主 Agent 当前状态POST /set_state:设置主 Agent 状态GET /agents:多 Agent 列表(含过期 / 离线清理逻辑)POST /join-agent:访客 Agent 加入POST /agent-push:访客 Agent 推送状态POST /leave-agent:访客 Agent 离开POST /agent-approve / POST /agent-reject:批准或拒绝访客GET /yesterday-memo:基于 memory/ 目录的昨日小记GET /、/join、/invite:页面入口;静态资源在 /staticidle、writing、researching、executing、syncing、error兼容映射:
working / busy / write → writingrun / running / execute / exec → executingsync → syncingresearch / search → researching先调用 join-agent,拿到并缓存 agentId(后续 agent-push 必带):
curl -s -X POST http://127.0.0.1:18791/join-agent \
-H "Content-Type: application/json" \
-d '{
"name": "openclaw-agent-01",
"joinKey": "ocj_starteam02",
"state": "idle",
"detail": "刚刚加入"
}'
建议每 10~30 秒推送一次:
curl -s -X POST http://127.0.0.1:18791/agent-push \
-H "Content-Type: application/json" \
-d '{
"agentId": "agent_xxx",
"joinKey": "ocj_starteam02",
"name": "openclaw-agent-01",
"state": "writing",
"detail": "正在整理任务上下文"
}'
curl -s -X POST http://127.0.0.1:18791/leave-agent \
-H "Content-Type: application/json" \
-d '{"agentId":"agent_xxx"}'
join-agentagentId 持久化到本地agent-pushleave-agent403 / 404,停止推送并重试 join 或告警若项目对你有帮助,欢迎点一个 ⭐
Made with ❤️ by wangmiaozero