跳到主要内容

oh-my-pi v15.12 发布 —— 发给别人的协作链接,现在能分「能看」和「能改」了

· 阅读需 7 分钟

不是他故意捣乱,而是 collab 从设计上就没想过「只让看」这个场景。链接发出去,进来的就是 full access:能打字、能打断 agent、能触发命令。你想让老板看看进度,老板莫名其妙拿到了 root 权限。你想让实习生围观你 debug,他一个手滑打了一行字进去。

v15.12 这个版本把这件事拆清楚了——「能看」和「能改」现在是两个不同的权限级别。顺带还把分享链接从明文变成 AES-256-GCM 加密、HTML 导出从 mock 变成真正的 React 组件渲染。

oh-my-pi v15.12 封面

痛点:collab 只有一把「全通钥匙」

之前的 collab 链接只包含一个 room key(32 字节)。你发给任何人,他拿到的权限和你一样——能看、能打字、能 kill subagent。你不是不信任对方,是这个设计本身就没给「只读」选项。

实际情况是:collab 的目的是让你实时分享 session,不是让你开放 shell 权限给任何人。即使是一个团队内部,review 代码的同事和远程 pair 的同事需要的操作级别也不一样。

怎么解决的:读写分离 + 加密快照

v15.12.0 拆了两个关键概念:

写 token 和只读链接。 完整的 collab 链接现在有两个 segment:room key(32 字节,用于建立加密通道)和 write token(48 字节,用于授权写操作)。只传 room key 的链接进来就是只读——能看 transcript、能翻子 agent、能看到 streaming——但不能打字,不能打断 agent,不能发 prompt。如果你用 collab.view 命令生成的 spectator 链接,那就更绝了:它连写 token 都不带。

/share 命令从明文 gist 升级成加密快照。 之前 /share 会把 session 导出为 HTML 发到 gistpreview,全程明文。现在改了——session JSON 先 gzip 压缩,再用 AES-256-GCM 加密,密钥放在 URL fragment 里(# 后面,不经过 HTTP 请求),然后推送到 share server(默认 https://my.omp.sh/s)。浏览器的 viewer 页面拿到 blob 后本地解密,密钥从不离开客户端。配置了 share.redactSecrets(默认开)的话,敏感字段在快照前会被脱敏。

这个架构有个细节值得说:加密快照的 viewer 不需要登录,不需要安装,打开链接就能看。对于跨公司分享 debug 现场或者给客户演示的场景——对方不想装你的 CLI,你不想用明文传 session 数据——这个落地的扎实程度比之前直接扔 gist 高了不止一个等级。

连带改善:HTML 导出换了一副骨架

如果你用过 oh-my-pi 的 HTML session 导出,大概知道之前的版本是怎么回事——tool call 渲染用的是 string-built dummy renderer,看起来像「一个叫 bash 的工具执行了」的文本框,没有结构化展示。

v15.12.0 把所有 built-in tool 的渲染器用 React 重写了(在 src/tool-render/ 下维护,通过 <omp-tool-view> web component 嵌入)。bash 的渲染有命令、有输出、有退出码;edit diff 有增删行高亮;todo board 有完成状态;eval cell 有执行结果;browser screenshot 直接显示截图。而且这些渲染器跟 collab web client 用的是同一套——导出内容和在线观看内容完全一致,不出现「导出看起来不一样」的问题。

更实用的改进是子 agent transcript 的嵌入。之前导出只记主线 agent 的对话,子 agent 的活动完全丢失。现在 <session>/<AgentId>.jsonl 文件会随导出打包,agent id 变成了可点击的 drill-down 链接,点击展开对应子 agent 的完整 transcript——包括它自己的 tool card 和更深层的嵌套 agent。一次性 debug 现场,导出 HTML 发给同事,对方能完整看到 subagent 树干了什么。

Agent Hub 焦点模式:在主视图里监控子 agent

Agent Hub 之前的问题是:你想看某个子 agent 的状态,要么在表格里看缩略信息,要么切过去。没有「一边写当前 prompt,一边盯着特定子 agent 进展」的体验。

v15.12.0 的焦点模式解决了这个:在本地 agent 上按 Enter,主视图直接 retarget 到那个子 agent 的实时 transcript,流式渲染、tool card、状态行全有。Esc 返回主 session,←← 回到父 agent。聚焦期间模型 cycling 和 thinking 预设被屏蔽——防止你在看子 agent 的时候不小心切了父 session 的模型配置。

这个改动不大,但在多 agent 协作的场景里体验差异很明显。之前你只能「看表格→猜进度」,现在你能「进去看」。

Mnemopi 本地嵌入:终于不用默默下载 270MB

v15.12.0 另一个不那么 visible 但影响面很大的改动:Mnemopi 的 local embedding 从 eager dependency 变成了 on-demand runtime。

之前 npm installbun install -g 会一并拉 fastembedonnxruntime-node 的 ~270MB native 依赖。即使你从来不用本地嵌入,这 270MB 也得下。现在这两个包变成 optional peerDependencies,只有在 Mnemopi 第一次尝试用本地嵌入时才会 lazy-install 到 ~/.omp/cache/fastembed-runtime/ 下。

对于 bundler 用户(Bun 编译 CLI、pkg 二进制安装等),之前 fastembed 的 native module 根本加载不了——Bun bundle 把 loader 内联后 relative require 就断掉了,报 Cannot find module 'onnxruntime_binding.node'。现在 runtime-install 机制在缓存目录里 bun install 完整依赖,从那里 resolve native binding,bundled 和 compiled 安装都可以正常使用本地嵌入了(#2389)。

同一批补丁中的后续修复

v15.12.0 发布当天下午又陆续发了三个补丁:

v15.12.1(同一天 +36 分钟):引入了 pruneUseless 压缩配置,可以自动裁剪 tool result 中的无用输出(dropUseless 谓词)。但不是好消息——double-Esc 快捷键被改回了 message-history 模式(#2396),也就是你按两次 Esc 不再回到 /tree 视图,而是翻聊天记录。这个改动在用户层面争议很大。

v15.12.2(+1 小时):修了两个问题。collab 链接的 room secret 现在用 dot-join 避免 URL fragment 里出现 # 导致解析错误。Homebrew 用户遇到的 sandbox-exec 错误(#2398)也修了——做 macOS 沙箱兼容的时候漏了一个 code signing 路径。

v15.12.3(+45 分钟):最直接的修复——把 double-Esc 的默认行为改回 /tree 视图,同时修了 Esc 打开 selector 时终端的 scrollback 残留问题。v15.12.1 改出去大概 2 小时就意识到了问题,v15.12.3 追回来。

三个补丁前后用了不到 3 小时全部发完,修复链快速且目标明确。v15.12.0 的核心内容(collab 读写分离、加密快照、HTML 导出重构)不受影响。

升级

# macOS/Linux 一键安装
curl -fsSL https://omp.sh/install | sh

# Homebrew
brew install can1357/tap/omp

# Bun(推荐)
bun install -g @oh-my-pi/pi-coding-agent

# 已安装用户
omp update

完整更新日志:GitHub Release v15.12.0

📢 关注我,获取最新开源更新日志和开发者工具动态。

#oh-my-pi #collaboration #terminal-TUI