问题
用户粘贴大段内容(日志、报错堆栈、整个代码文件)发送后,pi 把它作为普通用户消息全文渲染进 transcript。几百行粘贴直接刷掉好几屏,而用户自己刚粘的内容根本不需要回看全文;之后翻历史时这些巨块也是最大的噪音源。
对比之下本包已经解决的同类问题:
用户消息是唯一没有折叠机制的 transcript 内容,而它恰恰可能是最长的。
能力边界(调研结论)
- pi 核心的
ctrl+o(app.tools.expand)只作用于工具输出,用户消息不在其列 registerMessageRenderer 只管 custom message;message_end 的 {message} 替换会改 LLM 上下文,不可用pi.registerMarkdownTransformer 是正确入口:官方文档明确它是 display-only——「the original message remains unchanged in the session and model context」,对 messageType === "user" 的超长输入返回截断预览,显示折叠、上下文完整,正好是本需求
提议
新扩展(或并入现有 ui 相关扩展),用 registerMarkdownTransformer:
messageType === "user" && 非流式 && 行数/字符数超阈值
→ 显示:前 N 行 + dim 的 "… 已折叠 X 行(全文已完整发给模型)"
- 阈值:默认行数 ~20 行或 ~1200 字符(取先到),与 setup 的 detail display 风格一致,可后续挂到
my-pi-setup.json - 提示语必须说清楚「全文已发给模型」——折叠只是视觉的,避免用户以为内容被截断而重复粘贴
- markdown 代码块(``` 包裹的粘贴)整块折叠,不在代码块中间截断,预览保留块的开头几行 + 语言标记
- 纯短消息(日常对话)完全不受影响
- 键盘:如果 pi 核心未来给 entry/message 加了
expanded 支持,可以接 Ctrl+O;当前 transformer 无展开状态,先做纯折叠 + 明确提示语
不做
- 不碰 LLM 上下文(transform 是 display-only 的,这条是红线)
- 不在流式 assistant 更新上做任何事(
isStreaming 直接跳过) - 不做配置面(先跑默认阈值,有真实反馈再挂 setup 开关)
验收
- 粘贴 500 行日志发送 → transcript 里只占 ~21 行,含「已折叠 479 行」提示;模型收到的上下文里是完整 500 行
- 正常短消息渲染与今天逐字节一致
- 粘贴带 ``` 包裹的代码块 → 整块折叠、预览含语言标记
- session 重载(restore)后行为一致(transformer 对 restored messages 也跑)
问题
用户粘贴大段内容(日志、报错堆栈、整个代码文件)发送后,pi 把它作为普通用户消息全文渲染进 transcript。几百行粘贴直接刷掉好几屏,而用户自己刚粘的内容根本不需要回看全文;之后翻历史时这些巨块也是最大的噪音源。
对比之下本包已经解决的同类问题:
file-mutation-display的 compact 渲染 +Ctrl+O临时展开(feat(footer): default to a one-line plain footer with a lighter layout #26 之前就有)subagentResultDisplay: compact用户消息是唯一没有折叠机制的 transcript 内容,而它恰恰可能是最长的。
能力边界(调研结论)
ctrl+o(app.tools.expand)只作用于工具输出,用户消息不在其列registerMessageRenderer只管 custom message;message_end的{message}替换会改 LLM 上下文,不可用pi.registerMarkdownTransformer是正确入口:官方文档明确它是 display-only——「the original message remains unchanged in the session and model context」,对messageType === "user"的超长输入返回截断预览,显示折叠、上下文完整,正好是本需求提议
新扩展(或并入现有 ui 相关扩展),用
registerMarkdownTransformer:my-pi-setup.jsonexpanded支持,可以接Ctrl+O;当前 transformer 无展开状态,先做纯折叠 + 明确提示语不做
isStreaming直接跳过)验收