Skip to content

超长用户输入发送后全文展开刷屏,应折叠显示(display-only) #40

Description

@tt-a1i

问题

用户粘贴大段内容(日志、报错堆栈、整个代码文件)发送后,pi 把它作为普通用户消息全文渲染进 transcript。几百行粘贴直接刷掉好几屏,而用户自己刚粘的内容根本不需要回看全文;之后翻历史时这些巨块也是最大的噪音源。

对比之下本包已经解决的同类问题:

用户消息是唯一没有折叠机制的 transcript 内容,而它恰恰可能是最长的。

能力边界(调研结论)

  • pi 核心的 ctrl+oapp.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 也跑)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions