@clapecho233/pi-smart-fold 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +69 -16
- package/index.ts +1109 -61
- package/lib/config.ts +55 -7
- package/lib/fold.ts +223 -7
- package/lib/thinking.ts +194 -0
- package/package.json +3 -2
- package/test/click-sim.mjs +224 -0
- package/test/fold.test.mjs +413 -6
package/README.md
CHANGED
|
@@ -1,26 +1,68 @@
|
|
|
1
1
|
# pi-smart-fold
|
|
2
2
|
|
|
3
|
-
[pi](https://github.com/earendil-works/pi-mono) coding-agent
|
|
3
|
+
[pi](https://github.com/earendil-works/pi-mono) coding-agent 插件:保持会话记录紧凑,同时不丢失关键信息。
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
- **Thinking 折叠为单行、默认滚动显示最后一行** — 通过 pi 的 markdown transformer(`messageType: "assistant-thinking"`)把每个思考块折叠成一行,只显示**最后一行**内容;流式输出时该行随最新内容持续刷新,效果如同 `tail -f`。
|
|
7
|
-
- 截断按**终端显示宽度**计算(中文/emoji 等宽字符占 2 列),超宽时保留行尾并加 `…` 前缀。
|
|
8
|
-
- 折叠仅影响 TUI 显示,不改动会话文件与发送给模型的上下文。
|
|
5
|
+
## 功能
|
|
9
6
|
|
|
10
|
-
|
|
7
|
+
### 1. Thinking 折叠 + 计时(`smart` 默认)
|
|
8
|
+
|
|
9
|
+
- **思考中**:首行显示加粗的 **`Thinking… (8s)`**,换行后滚动显示思考文本的**结尾**(如 `tail -f`)。**点击一次 → 直接切换为完整显示至今全部思考内容**(持续跟随增长,加粗的实时计时行 **`Thinking… (8s)`** 固定在思考块**最底部**并持续更新);**再点一次 → 回到滚动结尾**。没有中间标签状态,始终在 滚动结尾 ↔ 完整显示 间单击切换:
|
|
10
|
+
|
|
11
|
+
```text
|
|
12
|
+
滚动显示(默认) 完整显示(点击后)
|
|
13
|
+
Thinking… (8s) …前面的思考内容…
|
|
14
|
+
…正在进行的思考最新一行 正在进行的思考……
|
|
15
|
+
Thinking… (9s) ← 固定在底部、持续更新
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
- **思考结束后**:若该段思考当时正处于完整显示,会平滑过渡为底部 **`Thought for 12.4s`** 定格时长行;消息结束后默认完全折叠为一行加粗的 **`Thought for 12.4s`**。
|
|
19
|
+
- **单击展开/收起单个思考块**:思考结束后默认进入隐藏态(由原型补丁预置),折叠行就是 **`Thought for 12.4s`** 标签(加粗、带实测时长)。**点击一次 → 该块展开为完整思考全文**(底部保留加粗的时长行,与斜体思考正文风格稍作区分);**再点一次 → 收起**。没有中间状态,只影响被点击的块,同一消息里的其它思考块不受干扰。
|
|
20
|
+
- **完全接管原生折叠**:pi 内置的思考隐藏标签(`Thinking...`)被替换为本插件按消息生成的 `Thought for …` 标签,点击与 ctrl+t 出现的都是我们的文本,而不是原生的 `Thinking...`(smart 模式下 ctrl+t 无额外效果,用点击或 `/fold expand` 展开)。
|
|
21
|
+
- **点击识别是精确的**:通过对 pi 公开导出的 `AssistantMessageComponent` 打一个幂等的原型补丁,预置完成思考的隐藏态并观测其内部可见性映射的点击写入(区分 ctrl+t 的清空操作);思考中的单击会被重定向(改回可见并切换插件自己的 滚动↔完整 模式),原生两态切换的中间“隐藏标签”态永远不会出现。主题切换 / 窗口缩放 / 布局重绘等全局重渲染绝不会误判为点击;若未来版本无法安装补丁,自动降级为 pi 原生显示(可用 `/fold expand` 兜底)。
|
|
22
|
+
- **时长持久化**:每段思考的时长按内容哈希记录进会话文件(`smart-fold-thinking` 自定义条目,不进入 LLM 上下文),`/resume` 恢复会话后依旧显示;同一条消息内多段思考(工具调用之间)分别计时。
|
|
23
|
+
- 截断按**终端显示宽度**计算(中文 / emoji 等宽字符占 2 列),超宽时保留行尾并加 `…` 前缀。
|
|
24
|
+
- 折叠仅影响 TUI 显示,不改动会话文件中的原文与发送给模型的上下文。
|
|
25
|
+
|
|
26
|
+
其它模式:`tail`(始终单行显示结尾 + 加粗时长前缀)、`full`(结束后直接显示全文,底部同样附时长行)、`off`(关闭,并恢复 pi 默认的思考显示)。
|
|
27
|
+
|
|
28
|
+
备用:`/fold expand on|off`(或设置面板中的"展开全部思考")临时展开/折叠全部思考块 —— 日常操作直接点击单个思考块即可,新会话默认全部折叠。
|
|
29
|
+
|
|
30
|
+
### 2. 工具输出折叠
|
|
31
|
+
|
|
32
|
+
每次 `session_start`(启动 / `/reload` / `/new` / `/resume` / `/fork`)自动调用 `ctx.ui.setToolsExpanded(false)`,工具输出保持折叠,`ctrl+o` 手动展开。
|
|
33
|
+
|
|
34
|
+
### 3. 工具调用行截断 + Write/Edit 增删统计
|
|
35
|
+
|
|
36
|
+
- **调用命令过长时截断**:`bash`/`read`/`grep`/`find`/`ls` 等工具的调用行在折叠状态下截断为单行,超宽时以 `…` 结尾(pi 自带的 ANSI 感知 `truncateToWidth`),命令还有后续行时追加 ` …` 标记;点击或 `ctrl+o` 展开后与工具输出一起完整显示。
|
|
37
|
+
- **write / edit 增删统计**:
|
|
38
|
+
- write:执行**前**读取原文件内容,与写入内容做行级 diff(公共前后缀裁剪 + LCS),首行追加 **绿色 `+新增` / 红色 `-删除`**,如 `write src/index.ts +12 -3`;新文件 `+N -0`;超大文件(>8MB)跳过。统计随工具结果**持久化进会话文件**,恢复历史会话后依旧显示(本版本之前产生的旧写入没有记录,不显示)。
|
|
39
|
+
- edit:直接对各 `edits` 的 `oldText → newText` 做行级 diff 并求和,如 `edit src/app.ts +2 -1`(参数流式传输时就实时更新)。
|
|
40
|
+
- **write/edit 默认完全折叠,不显示任何代码内容/差异**:折叠时调用区和结果区都只剩一行头部(`writeCollapsed: header` 默认;pi 原生没有此能力,通过对 renderCall + renderResult 的双重包装实现 —— 结果区的 diff 在折叠时返回空组件,错误信息仍会显示);点击 / `ctrl+o` 展开后显示完整差异 / 语法高亮内容,**头部行在折叠和展开时都保留 `+N -M` 统计**(edit 自带外壳的背景条完整保留,统计注入行尾填充、行宽不变)。可在设置中改回 `preview` 恢复 pi 原生预览。
|
|
41
|
+
- 实现方式为对 pi 内置工具的渲染包装(执行逻辑完全复用各 `create*ToolDefinition`)。
|
|
42
|
+
|
|
43
|
+
## 设置界面
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
/fold 打开 /config 样式的选择式设置(Enter/Space 切换值,Esc 关闭)
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
也可带参数直接修改(含自动补全):
|
|
11
50
|
|
|
12
51
|
```text
|
|
13
|
-
/fold
|
|
14
|
-
/fold
|
|
15
|
-
/fold
|
|
52
|
+
/fold thinking smart|tail|full|off # on=smart, off=off 兼容旧写法
|
|
53
|
+
/fold tools on|off # 启动时是否折叠工具输出
|
|
54
|
+
/fold writestat on|off # write 增删统计开关
|
|
55
|
+
/fold writecollapsed header|preview # write 折叠时仅首行 / 保留预览
|
|
16
56
|
```
|
|
17
57
|
|
|
18
|
-
配置文件 `smart-fold.config.json
|
|
58
|
+
配置文件 `smart-fold.config.json`(位于插件目录,可手工编辑;旧的 `thinkingFold` 布尔值会自动迁移):
|
|
19
59
|
|
|
20
60
|
```json
|
|
21
61
|
{
|
|
22
62
|
"toolsFold": true,
|
|
23
|
-
"
|
|
63
|
+
"thinking": "smart",
|
|
64
|
+
"writeStat": true,
|
|
65
|
+
"writeCollapsed": "header"
|
|
24
66
|
}
|
|
25
67
|
```
|
|
26
68
|
|
|
@@ -47,18 +89,29 @@ pi -e /path/to/pi-smart-fold/index.ts
|
|
|
47
89
|
## 开发
|
|
48
90
|
|
|
49
91
|
```bash
|
|
50
|
-
npm test
|
|
92
|
+
npm test # 纯函数单元测试(Node ≥ 22.18 原生 TS 类型剥离,无需构建)
|
|
93
|
+
npm run test:sim # 点击周期仿真:驱动真实 pi AssistantMessageComponent
|
|
94
|
+
# (需先把已安装的 pi 包符号链接到 node_modules/@earendil-works)
|
|
51
95
|
```
|
|
52
96
|
|
|
53
97
|
结构:
|
|
54
98
|
|
|
55
99
|
```
|
|
56
|
-
index.ts
|
|
57
|
-
lib/fold.ts
|
|
58
|
-
lib/
|
|
100
|
+
index.ts 插件入口(transformer / 事件 / write 渲染包装 / /fold 设置界面)
|
|
101
|
+
lib/fold.ts 纯函数:显示宽度、行尾截断、时长格式化、行级 diff
|
|
102
|
+
lib/thinking.ts 思考计时状态机(按内容哈希记录各段思考时长)
|
|
103
|
+
lib/config.ts 配置读写(含旧配置迁移;缺失/损坏时回退默认值)
|
|
59
104
|
test/fold.test.mjs 单元测试
|
|
105
|
+
test/click-sim.mjs 点击周期仿真(真实 pi 组件 + 模拟点击,验证 滚动↔完整 切换)
|
|
60
106
|
```
|
|
61
107
|
|
|
108
|
+
## 已知边界
|
|
109
|
+
|
|
110
|
+
- 思考中的单击切换依赖原型补丁的重定向;补丁不可用时降级为 pi 原生两态切换(此时需两次点击展开)。
|
|
111
|
+
- 展开状态为运行时状态,新会话/重载后恢复折叠;窗口缩放不会收起你已展开的块。
|
|
112
|
+
- write 增删统计只对当前会话中的写入生效(恢复的旧会话没有执行前快照可对比)。
|
|
113
|
+
- 与 pi 原生 "Hide thinking blocks"(`ctrl+t` 切换)叠加时,若隐藏了思考块,思考中不会显示滚动行 —— 建议保持默认的显示状态,由本插件负责折叠。
|
|
114
|
+
|
|
62
115
|
## 兼容性
|
|
63
116
|
|
|
64
|
-
基于 pi `0.85.1` 的公开扩展 API(`registerMarkdownTransformer`、`ctx.ui.setToolsExpanded`、`registerCommand`)。
|
|
117
|
+
基于 pi `0.85.1` 的公开扩展 API(`registerMarkdownTransformer`、`ctx.ui.setToolsExpanded`、`createWriteToolDefinition`、`registerCommand`、`appendEntry`、`SettingsList`)。
|