pi-reply-frame0.1.2
Rounded frames around assistant reply bodies in pi — thinking blocks stay unframed.
Untested on omp
This is a pi package. No one has reported whether it works on omp yet. If you try it, add your result below.
Reports 0
No reports yet.
Readme
pi-reply-frame
给 pi 的助手回复正文套一个圆角框,长回复一眼就能找到开头。思考块不套框。
让我先想想这个问题 ← thinking,原样输出
好像有两种做法
╭─ 回复 ──────────────────────────────╮
│ ## 结论 │
│ 第一种做法更好,因为 blah blah │
│ │
│ ## 细节 │
│ 第二点 │
╰─────────────────────────────────────╯

安装
pi install npm:pi-reply-frame
然后 /reload。
只想试一下、不想写进 settings:
pi -e npm:pi-reply-frame
卸载
pi remove npm:pi-reply-frame
配置
改 extensions/reply-frame.ts 顶部的常量,然后 /reload。
从 npm 装的,文件在 pi 的包目录里:
~/.pi/agent/npm/node_modules/pi-reply-frame/extensions/reply-frame.ts
直接改它有效,但 pi update 会覆盖掉。想长期改就把仓库 clone 下来,用本地路径装:
git clone https://github.com/easonlao/pi-reply-frame.git
pi install ./pi-reply-frame
本地路径不会复制文件,改完 /reload 就生效。
| 常量 | 默认 | 作用 |
|---|---|---|
LABEL |
"回复" |
顶边上的字。"" = 光板框 |
COLOR |
"customMessageLabel" |
框的颜色,填主题里的颜色名 |
MIN_LINES |
1 |
正文少于这么多行就不套框 |
OPEN_WHILE_STREAMING |
true |
流式输出时先不画底边 |
关于 COLOR
填主题里的颜色名。默认的 customMessageLabel 一般不会撞色;想换的话避开这两个:
border—— pi 的通用边框色,多数给工具块画框的扩展也用它,容易和工具框混在一起accent—— 多数主题里border就是直接指向accent(两者同色),所以跟border一样容易混
以 tokyo-night 为例可选的颜色(括号内是该主题下的实际颜色):
| 颜色名 | tokyo-night 下的颜色 |
|---|---|
customMessageLabel / mdListBullet |
紫 #bb9af7 ← 默认 |
mdHeading / warning |
黄 #e0af68 |
success / mdCodeBlock |
绿 #9ece6a |
error |
粉红 #f7768e |
borderAccent / mdCode |
青 #7dcfff |
实现说明
pi 没有给"助手消息"开渲染口子——registerMessageRenderer 只能注册自定义消息类型,管不到内置的 role: "assistant"。所以这里用的是 monkey-patch:把 pi 从包根导出的 AssistantMessageComponent.prototype.render 包一层,在渲染好的文本行外面加框。
只包 render(已经渲染完的行),不复制 pi 的 updateContent 逻辑。这一点是刻意的:updateContent 是组装内容的地方,pi 每加一个新特性(markdown 转换器、mermaid 渲染、截断提示)都会改它,任何复制它的扩展都会在 pi 升级后静默丢功能。
正文和思考块的区分:思考块是这条消息的子组件里唯一被 MouseRegion 包起来的,而 pi 渲染时会把每个子组件的行数记在 mouseLayout 里,所以能按行数精确切出思考块的范围。切不出来(pi 改了结构)就退化成"整条消息一个框",不会报错。
其它已处理的细节:
- 幂等:
/reload和子会话都会重新执行扩展文件,所以补丁状态记在 prototype 上(Symbol.for),保证render上永远只有一层补丁。 - 鼠标坐标:框多出边框行、正文右移了 2 列,所以逐行做了坐标映射,点思考块展开不会点偏。
- OSC 133:pi 贴在消息首尾行的终端标记会挪到框的最外圈。
- 窄终端:宽度小于 10 列时直接不画框。
已知边界
- 一条消息里如果文字被思考块隔开(文字→思考→文字),会有多个框;工具调用不算分隔,所以 文字→工具→文字 只有一个框。
- 折叠 thinking 时(settings 里
hideThinkingBlock: true,或用快捷键折叠),那行Thinking...和展开时一样被当成思考块,所以不套框。
许可证
MIT