开源 · MIT · 单用户 · 本地优先

给你正在跑的 agent,
配一个外部操作页

引擎照旧跑在你自己的电脑上。你在网页里看它干活、管它的工具与模型、随时插话纠正;需要时直接翻文件、开终端、在网页上圈出那句要改的地方。 单用户、只听回环、不引数据库 —— 会话的事实源永远是引擎自己的落盘文件。

npm -g install oh-my-agent-web
看看界面
pi / Codex / Claude Code / opencode / DeepSeek Harness Windows · macOS · Linux Node ≥ 22.19
127.0.0.1:25257 · demo-app
一次真实会话:左侧项目与会话,中间过程里的思考段与工具卡,右侧同一个仓库的改动对比

一次真实会话:思考、工具、改动、用量,都在同一屏里。

它是什么

不是新的 agent 引擎,
也不把会话搬到云上

它不重写 prompt、不接管工具实现 —— 你装的是 pi、Codex、Claude Code、opencode,工作台只给它们配一套能看的界面、能点的按钮和能落盘的会话列表。三条硬纪律决定了它长什么样。

01 / NO DATABASE

不引数据库

会话就是引擎自己写的 JSONL / thread。网页只读它、改名字、必要时删它,从不复制一份到自己的库里。

02 / NO FAKING

不假装

引擎没有的能力就在界面上藏起来(能力矩阵);面板拿不到数据就直说,不拿别的引擎的配置冒充。

03 / NO OVERREACH

不越界

默认只听 127.0.0.1。要远程就显式 -H 0.0.0.0,并且先在本机把密码设好。

一次对话

过程是摊开的,不是一个转圈

思考块、工具调用、改动文件、token 与花费都在对话流里;回合没跑完也能插话、排队、停下。

看得见它怎么想、做了什么

工具卡给参数、完整命令、输出、耗时与成败;跑完自动收成一行「N 段思考 · N 次工具 · 耗时」,点开就是完整时间线。

✓尾注是本轮用量:in / out / cache / 花费,点「复制」整段带走。
✓改动文件 chip:这一轮改过哪些文件,点一下落到右栏 diff。
✓路径可点:正文里的 src/App.tsx 直接开预览。
一条回复的尾注:markdown 表格、改动文件 chip、这一轮的 token 与花费

插队、排队、停止

回合跑着的时候输入框不会锁死:插队立刻生效,排队等本回合结束,停止保留已经产出的内容。

# 正在跑 › 先看一下 store.ts 的写盘 # 你插了一句 › 顺便把 App 的订阅也改掉 已插队 # 又排了一条 › 跑完补个测试 排队 1
steerqueuestop非 pi 引擎自动降级为排队

圈出重点再提意见

选中一段回复,浮出小工具条:加进会话、写一条标注、或丢到临时会话里单独问。正文上会留 ①②③ 编号,输入框里多出一颗「N 条注释」。

标注之后:正文里留下编号徽标,输入框里多出「1 条注释」

@ 找文件,/ 发指令

输入框里打 @ 就在工作区里找文件,↑↓ 选中、回车插入 @src/store.ts;打 / 是本地指令(新建、改名、切模型、统计)与直接交给 agent 的指令(压缩上下文、计划模式)。

输入 @ 后弹出的文件提及面板,分「添加」与「最近用过」两组
右栏工作区

看文件、跑命令、
直接在网页上标「这里要改」

右栏是一个多标签工作区:文件预览、改动对比、真终端、内置网页、临时会话。前三个用来复核,网页那个用来开发。

文件与改动

目录树、按文件名搜、全文检索(支持 web/src/** 这样的路径掩码);预览支持 markdown、mermaid、图片、PDF、音视频。顶到「改动」就是与 HEAD 的对比:+10 −1 概览、行级红绿、可只看改动。

✓选中行「追加到对话」,写进草稿的是 @src/store.ts:120-138
✓网页端只读:改文件交给 agent 或终端,这里用 diff 复核
改动视图:与 HEAD 对比,+10 −1 概览与行级红绿

真终端

右栏的终端是真 PTY(node-pty + xterm.js):vim、top、Ctrl-C、颜色、行编辑都正常,cwd 跟会话所在项目一致。刷新页面不会恢复终端会话,切标签则不会断。

zsh颜色Ctrl-Ccwd 跟随会话
demo-app on main $ git status -s M src/App.tsx M src/store.ts $ git diff --stat src/App.tsx | 5 +++-- src/store.ts | 11 ++++++++++- $ npm test -- --run ✓ src/store.test.ts (3 tests) Tests 5 passed (5)

网页开发闭环:打开、标注、发给 agent

在右栏打开本地页面(请求走本机代理,不带 cookie),点刷新旁边的 📍 进入拾取模式:点页面上要改的那一处,就地写一句意见,页面上留下 ①②③ 标记;一次能连着标好几处,整批进输入框的「N 条注释」。

✓标记会复原:刷新、跳转回来,按选择器重新画框。
✓按页编号:同一页 1、2、3 递增,不重号;Esc 退出拾取。
✓与注释分开存:页面标记留在本机,注释发出去就清空。
右栏打开活动报名页,标题被标成 ①、输入框里出现「1 条注释」
配置面板

模型、技能、MCP、插件、子代理,
都跟着当前引擎走

切到 Codex,面板读的就是 Codex 自己的东西;没接的面板会直说,不拿 pi 的配置冒充。

模型与供应商面板:服务商列表与端点、模型白名单

模型与供应商

订阅 OAuth 登录、内置填 key、自定义端点与 API 形态;逐个勾选白名单。key 不出服务端,只回尾 4 位。

技能面板:已装、启用、禁用三档,右侧是 SKILL.md 摘要

技能

读 ~/.agents/skills;启停就是改文件名,没有第二份状态文件。Skill Hub 支持分类搜索与一键安装。

MCP 面板:全局与项目两份配置、启停、暴露方式、测试连接

MCP

全局与项目两份配置、项目同名覆盖;exposure 四档;「测试连接」真握手后即断,报工具数。

子代理面板:模板、默认并发与启用开关

子代理

内置 explore / general-purpose / plan,可改可停;并发 1–12,超出的排队。每个子代理都是一个真实会话。

插件面板:pi package 的加载状态与按包停用

插件

插件就是 pi package:npm / git / 本地目录,四态 loaded · installed · missing · disabled,按包停用不删文件。

推送面板:本机推送状态、目标设备与测试推送

推送与语音

回合结束推一条(失败 ❌ / 中断 ⏹ 带前缀),点通知直达会话;四类事件提示音 + 本地 TTS,不联网。

界面巡览

五个区,各管一件事

左栏是项目与会话,中间是对话,右栏是工作区,底栏是「这一句怎么跑」。所有入口都能在设置里逐项隐藏。

127.0.0.1:25257
界面全景

左栏项目与会话 · 中间对话 · 右栏源码 · 底栏状态

多引擎

各跑各的原生 loop

引擎不是「同一个 prompt 换个皮」:每个都接自己的官方循环,能力差异在界面上按矩阵隐藏按钮。

pi原生 SDK · 默认
Codexapp-server · JSON-RPC
DeepSeek HarnessACP
opencodeACP
Claude CodeACP 适配器
能力picodexdshopencodeclaude
审批✓✓✓看配置✓
模型 / 思考档✓✓✓✓模型可切 / 无档位
恢复历史会话✓✓✓✓✓
插队(steer)✓————
子代理面板✓————
工作台管 provider✓————
临时会话(内存)✓————
开始使用

两条命令,打开就是工作台

要求 Node ≥ 22.19。装完就有 oh-my-agent-web / aw / agent-web 三个等价命令。Linux 上内嵌终端需要就地编译 node-pty(make / g++ / python3)。

装

npm -g install oh-my-agent-web,或一行脚本装到 ~/.oh-my-agent-web,不碰系统全局目录。

起

进到你的项目目录敲 aw:前台运行并打开浏览器,默认只监听 127.0.0.1:25257。

用

点「新会话」发第一句。想从手机或别的电脑进,就 -H 0.0.0.0,并且先在本机「设置 → 远程」设好密码。

终端
# 安装
npm -g install oh-my-agent-web

# 在你的项目里启动(前台 + 打开浏览器)
cd ~/code/my-proj
aw

# 后台跑、看状态、停掉
aw -d
aw status
aw stop

# 换端口 / 指定工作区
aw -p 25258
AGENT_WEB_CWD=~/code/my-proj aw
aw前台启动 + 打开页面(Ctrl-C 退出)
aw -d后台运行,日志进 daemon.log
aw statuspid / 端口 / 引擎 / 会话数 / 工作区
aw -H 0.0.0.0允许远程访问(需先设密码)
安全模型

默认只活在回环里

单用户工具的安全边界应该小到能讲清楚:谁能进、怎么进、失败会怎样。

1
本机免密,其余一律要密码

对端是回环且 Host 是回环才放行;其它来源未设密码时全拒。

2
密码只能在本机设

远程不能设第一个密码 —— 否则端口一暴露,谁先扫到谁接管。密码落在数据目录,改完立即生效。

3
连续 3 次错误暂停 30 分钟

次数与时长可改(1–20 次 / 1–1440 分钟),锁会落盘,重启不解锁;设置里还能看到登录活动。

4
工具与命令走审批

只读工具自动放行,其余按「工具 + 目标」询问;「总是允许」写进 approval-rules.json。回合结束会清掉悬置审批。

5
内置网页代理不带 cookie

iframe 沙箱不含 allow-same-origin,远端 JS 摸不到工作台的存储与接口。

远程暴露 = 两件事

-H 0.0.0.0 让外面连得上,密码负责拦住人。域名、局域网 IP、外网 IP 一视同仁,不需要额外白名单。

数据落在哪

会话在引擎自己的目录(pi: ~/.pi/agent/sessions);工作台只存 settings.json、锁、日志、推送订阅与本机界面偏好。换台设备打开,看到的是同一批会话文件。

FAQ

常见问题

它会把我正在用的 Claude Code / Codex 会话复制走吗?

不会。工作台读的是引擎自己的会话文件或 thread,只做展示、改名和删除;不建第二份库,也不改引擎的 prompt 与工具实现。

代码会不会被传到别的服务器?

不会额外上传。只有你自己配置的模型 provider 会收到请求;工作台本身不经过任何中转服务。

为什么默认只有本机能访问?

因为它能直接跑命令、读写文件。默认只听 127.0.0.1,等于「能打开页面的人本来就已经能操作这台机器」。要远程必须显式开 -H 并设密码。

手机上能用吗?

能。窄屏自动切成单栏、侧栏变抽屉、输入框 18px 防缩放。远程访问用 -H 0.0.0.0 + 密码;想收推送需要 https(添加到主屏的 PWA 也行)。

支持哪些系统?

macOS、Linux、Windows 都支持。Linux 的内嵌终端需要就地编译 node-pty:装好 make / g++ / python3,或让一行脚本带 --with-build-tools。

子代理和临时会话有什么区别?

临时会话是人开的另一条通道:不落盘、关掉就销毁,可以保存成正式对话。子代理是 agent 派出去的子任务:有自己的上下文与会话文件,跑完把结论带回来。

面板里为什么有些功能是灰的?

那是能力矩阵在起作用:当前引擎不支持的语义(比如非 pi 引擎的插队、子代理面板)就不显示按钮,而不是发一条注定失败的命令。