@aiwayds/dsh-tui-pi 0.25.0 → 0.26.0
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 +37 -0
- package/README.zh-CN.md +527 -0
- package/README.zh.md +3 -397
- package/lib/index.js +7 -1
- package/lib/index.js.map +1 -1
- package/lib/session.js +14 -2
- package/lib/session.js.map +1 -1
- package/package.json +2 -1
package/README.zh.md
CHANGED
|
@@ -1,399 +1,5 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 简体中文文档已迁移
|
|
2
2
|
|
|
3
|
-
[
|
|
3
|
+
本文件已过时。当前的简体中文版 README 请见 [README.zh-CN.md](./README.zh-CN.md)。
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
兼容 shim(`src/commands.ts`),在运行时探测 `dsh-commands` `execute()` 的参数
|
|
7
|
-
个数——同时支持 rc.8 之前的 3 参形式 `(agent, line, signal)` 与当前的 4 参形式
|
|
8
|
-
`(agent, line, images, signal)`(自 `0.1.0-rc.8` 起未再变化)。经单元测试 +
|
|
9
|
-
tmux 真机冒烟验证。
|
|
10
|
-
|
|
11
|
-
> English version: [README.md](README.md)
|
|
12
|
-
|
|
13
|
-
## 截图
|
|
14
|
-
|
|
15
|
-
https://github.com/user-attachments/assets/6a7e00bb-1fd0-4bc5-9070-457f1e9fa54d
|
|
16
|
-
|
|
17
|
-
真实会话的终端录制(MP4,1.5× 速度)——Todos、运行中的 subagent、思考/工具面板和 powerline footer 一览。([asciinema 交互播放](https://asciinema.org/a/BE212ZO8x1zEZyZn))
|
|
18
|
-
|
|
19
|
-
### 布局总览
|
|
20
|
-
|
|
21
|
-
```
|
|
22
|
-
┌─────────────────────────────────────────────────────────────────────┐
|
|
23
|
-
│ 对话区(可滚动) │
|
|
24
|
-
│ ┌─────────────────────────────────────────────────────────────┐ │
|
|
25
|
-
│ │ 💭 thinking — 推理进行中 │ │
|
|
26
|
-
│ └─────────────────────────────────────────────────────────────┘ │
|
|
27
|
-
│ ⚙ bash python scripts/demo.py … ✔ bash │
|
|
28
|
-
│ ↳ 生成 2 个 todo, 每个 todo 起一个 10s 的 subagent │
|
|
29
|
-
│ ↳ ⠼ Workhorse 10s 任务 · 1.2k token · 19.0s │
|
|
30
|
-
└─────────────────────────────────────────────────────────────────────┘
|
|
31
|
-
┌─ ● Todos (0/8) ────────────────────────────────────────────────────┐
|
|
32
|
-
│ ├─ ☑ 调研 dsh-tui-pi 斜杠命令/补全机制 │
|
|
33
|
-
│ ├─ ◐ 调研 harness ctx.skills API │
|
|
34
|
-
│ └─ ☐ 实现 /skill:<name> 补全并触发 skill │
|
|
35
|
-
└─────────────────────────────────────────────────────────────────────┘
|
|
36
|
-
∴ working… │
|
|
37
|
-
~/github (Full access) │ ⎇ main │
|
|
38
|
-
[ 请输入指令… ] │
|
|
39
|
-
↳ 第一 打slash 命令的时候 显示 /skill:<skill name> 选择后使用 │
|
|
40
|
-
↳ ⠼ 牛马狗 · 1.5m/1m · 635.7s │
|
|
41
|
-
dsh ▸ volc-ark-plan ▸ deepseek-v4-flash ▸ high ▸ 48.7k/1.0M(4.6%) │
|
|
42
|
-
▸ ⚡ CH85.4% ▸ 15 msgs ▸ 11 tools 00:02:13 │
|
|
43
|
-
Esc ×2: stop · Ctrl+C ×2: quit · Ctrl+G: subagents · ↑↓: history │
|
|
44
|
-
└─────────────────────────────────────────────────────────────────────┘
|
|
45
|
-
│ │ │
|
|
46
|
-
│ │ └─ Footer(状态栏)
|
|
47
|
-
│ └─ 运行中的 subagent(last-request 区域)
|
|
48
|
-
└─ Todos 面板(有边框,固定在输入框上方)
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
---
|
|
52
|
-
|
|
53
|
-
## 功能特性
|
|
54
|
-
|
|
55
|
-
### Footer 状态栏
|
|
56
|
-
|
|
57
|
-
底部固定显示当前会话的实时状态:
|
|
58
|
-
|
|
59
|
-
```
|
|
60
|
-
dsh ▸ volc-ark-plan ▸ deepseek-v4-flash ▸ high ▸ 48.7k/1.0M(4.6%) ▸ ⚡ CH85.4% ▸ 15 msgs ▸ 11 tools 00:02:13
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
七个分段,全部从 O(1) 维护的计数器读取(从不扫描会话日志):
|
|
64
|
-
|
|
65
|
-
| 分段 | 内容 |
|
|
66
|
-
|---|---|
|
|
67
|
-
| **Provider** | 当前 `provider/model` 路由 |
|
|
68
|
-
| **Model** | 模型简称 |
|
|
69
|
-
| **Thinking** | 推理强度等级(`off` / `high` / `max`) |
|
|
70
|
-
| **Context** | `已用 / 上限 (百分比%)` |
|
|
71
|
-
| **Cache-hit** | `CHxx%` —— prompt 缓存命中率 |
|
|
72
|
-
| **Messages** | 用户 + 助手消息总数 |
|
|
73
|
-
| **Tools** | 工具调用总数 |
|
|
74
|
-
| **Clock** | 右对齐实时 HH:MM:SS(每秒刷新) |
|
|
75
|
-
|
|
76
|
-
分段用 [U+E0B0](https://www.nerdfonts.com/cheat-sheet) powerline 箭头渲染,配色随主题切换。
|
|
77
|
-
|
|
78
|
-
编辑器顶部边框显示工作目录和 git 分支:
|
|
79
|
-
|
|
80
|
-
```
|
|
81
|
-
~/github (Full access) │ ⎇ main
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
---
|
|
85
|
-
|
|
86
|
-
### 思考面板 & 工具面板
|
|
87
|
-
|
|
88
|
-
运行中的思考和工具调用渲染为**固定面板,固定在输入框上方**(不会出现在可滚动的对话区):
|
|
89
|
-
|
|
90
|
-
```
|
|
91
|
-
┌─ 💭 thinking ──────────────────────────────────────────────┐
|
|
92
|
-
│ Actually, I can check list_agents or wait… │
|
|
93
|
-
└────────────────────────────────────────────────────────────┘
|
|
94
|
-
⚙ bash python scripts/demo.py … ✔ bash
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
行为要点:
|
|
98
|
-
|
|
99
|
-
- **每种类型一个面板** —— 整个运行期间只有一个 `ThinkPanel` 和一个 `ToolPanel`;每次事件刷新同一个面板,不会产生对话区刷屏。
|
|
100
|
-
- **空 = 隐藏** —— 无活动时面板渲染 0 行并消失。
|
|
101
|
-
- **`dsh-tui.panelHeight`**(默认 `1`):1 行无边框(块标识 + 耗时 + 最后一行内容,右截断);`5`/`7`/`10` 带边框面板;`all` 输出全部内容。
|
|
102
|
-
- **委派工具**(`use_agent`、`subagent`、`workflow`、`ralph`)不打开工具面板 —— 它们的子进程在底部的运行子代理行中显示。
|
|
103
|
-
|
|
104
|
-
---
|
|
105
|
-
|
|
106
|
-
### Subagents 子代理
|
|
107
|
-
|
|
108
|
-
运行中的子代理在**编辑器下方的 last-request 区域**显示为每行一条的紧凑状态:
|
|
109
|
-
|
|
110
|
-
```
|
|
111
|
-
↳ 创建 2 个 todo, 每个 todo 起一个 10s 的 subagent
|
|
112
|
-
↳ ⠼ Subagent A 10s 任务 · 1.2k token · 19.0s
|
|
113
|
-
↳ ⠼ Subagent B 10s 任务 · 562 token · 6.0s
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
每行显示:spinner + 代理**名称**,重试次数(`↻N≤M`),当前上下文占用(`X/Y` —— 子代理最近一次请求的 billed input+output 加上其后消息的 CJK 估算,除以它的上下文窗口;**不是**只增不减的累计 token 消耗),rounds(`round N/M` —— assistant 消息数对上限,`maxRounds > 0` 时才显示 `/M`),耗时,以及策略注入(maxRounds 收尾、steer)到达后出现的 `⚡` 标记。不显示 provider,无边框,无标题。
|
|
117
|
-
|
|
118
|
-
**spawn 派生**与 **fork 派生**两类子代理都会被追踪——dsh 通过 `childSessionMeta` 同时写入 `origin: 'subagent'` 和 `delegationDepth` 预算,头部识别对两种标记都认得(只有预算没有 origin 的头部作为防御性兜底也会被接纳,标记为 `fork <id8>`;当前 dsh 不会产生这种形态)。非子代理会话按**值**而非字段有无被挡在板外:jsonl 持久化后端在每条恢复的头部上都会物化 `delegationDepth: 0`,所以闸门要求预算严格 `> 0`。面向用户的会话 fork(fork 出的*对话*:`Session.fork` 只设 `parentSession` + `seedLength`,不带预算)刻意不进子代理面板,仍可通过 `/resume` 恢复——`/resume` 的过滤器(`isResumableSessionHeader`)恰好排除被委派的子代理(`origin: 'subagent'` 或预算 > 0)。
|
|
119
|
-
|
|
120
|
-
#### Todos 待办面板
|
|
121
|
-
|
|
122
|
-
`● Todos (done/total)` 树是一个有边框的面板,**固定在输入框上方**(不随对话区滚动):
|
|
123
|
-
|
|
124
|
-
```
|
|
125
|
-
┌─ ● Todos (0/8) ──────────────────────────────────────────┐
|
|
126
|
-
│ ├─ ☑ 调研 dsh-tui-pi 斜杠命令/补全机制 │
|
|
127
|
-
│ ├─ ◐ 调研 harness ctx.skills API │
|
|
128
|
-
│ └─ ☐ 实现 /skill:<name> 补全并触发 skill │
|
|
129
|
-
└───────────────────────────────────────────────────────────┘
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
图标:`☑` 已完成,`◐` 进行中,`☐` 待处理。子代理完成后从列表消失;当面板和子代理行都为空时,整个区域折叠隐藏。
|
|
133
|
-
|
|
134
|
-
#### 子代理查看器 & 限制
|
|
135
|
-
|
|
136
|
-
`Ctrl+G`(或 `/subagents`)打开 80% 宽度的子代理选择器 —— 运行中的排在前面,然后是最近完成的 5 个。Enter 打开实时对话查看器(~3×/s 刷新,自动跟随尾部)。
|
|
137
|
-
|
|
138
|
-
两个限制项(通过 `/agents` → `l` 配置):
|
|
139
|
-
|
|
140
|
-
- **`maxAgents`**(默认 4,`0` = 无限制)—— 超过上限时拒绝新的子代理创建。
|
|
141
|
-
- **`maxRounds`**(默认 75,`0` = 无限制)—— 子代理的 assistant 消息数(每次 LLM 往返计 1 round)达到上限后,TUI 注入一条收尾指令,从不强制终止:运行中的子代理在**下一步边界**收到(`steer`,即下一次 LLM 往返),空闲的作为自己的下一个 turn。注入可见:紧凑行、Ctrl+G 选择器行和查看器头部显示 `⚡`,对话记录里注入消息渲染为 `⚡ <文本>`——子代理 LLM 无视收尾指令与注入从未发生,现在可以区分。
|
|
142
|
-
|
|
143
|
-
---
|
|
144
|
-
|
|
145
|
-
### DCP 动态上下文裁剪
|
|
146
|
-
|
|
147
|
-
[DCP](https://github.com/fan56/dsh-dcp) 是 dsh 的零 LLM 上下文裁剪插件 —— 自动修剪上下文以保持在限制内,无需调用 LLM 做摘要。
|
|
148
|
-
|
|
149
|
-
`dsh-tui-pi` 将 `@aiwayds/dsh-dcp` 列为依赖,但**不自动挂载** —— dsh-dcp 自带 `cordis.patch.yml`(自 `@aiwayds/dsh-dcp@0.2.0` 起)。要启用:
|
|
150
|
-
|
|
151
|
-
```sh
|
|
152
|
-
dsh plugin --profile tui add @aiwayds/dsh-dcp
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
挂载后 DCP 在后台透明运行。Footer 的 **Context** 分段计算的是当前上下文占用 —— 最近一次请求的 billed context 加上其后消息的 CJK 估算 —— 所以裁剪后下一次请求会变小,显示随之回落(百分比封顶 100,窗口是硬上限)。**Cache-hit** 分段反映会话累计的缓存复用。
|
|
156
|
-
|
|
157
|
-
在子代理内部,已提交的裁剪同样可见:DCP 在子代理自己的日志里为每次裁剪追加一行 `user/message` **notice**,Ctrl+G 的对话查看器用 `🧹` 标记渲染它(区别于通用的 `ⓘ`),选择器行的描述里带有该子代理的裁剪次数(`🧹 N×`)。DCP 的 `roundInterval` 与 TUI 的 `maxRounds` 数的是**同一样东西**——`assistant/message` 事件,每次 LLM 往返计 1——但行为不同:子代理计数达到 `maxRounds` 时 TUI 排队发一个收尾请求;会话计数达到 `roundInterval` 后 DCP 在下一个空闲边界执行裁剪(修剪上下文)。一个触发工作,一个释放上下文。
|
|
158
|
-
|
|
159
|
-
---
|
|
160
|
-
|
|
161
|
-
### APPEND_SYSTEM.md
|
|
162
|
-
|
|
163
|
-
一份用户可编辑的 markdown 文件,内容会**追加到 TUI 创建的主代理的系统提示末尾** —— 借鉴 pi 的 `~/.pi/agent/APPEND_SYSTEM.md` 约定,dsh 侧对应 `$DSH_HOME/APPEND_SYSTEM.md`(默认 `~/.dsh/APPEND_SYSTEM.md`,沿用 dsh 其余部分共用的 `$DSH_HOME` 覆盖)。
|
|
164
|
-
|
|
165
|
-
- **热应用** —— section 提供者在每次组装提示词时读盘,改完文件**下一次请求**即生效:无需重启、无需 watcher、无需 `/reload`。
|
|
166
|
-
- **首次启动自动播种** —— 文件不存在时,TUI 在启动时一次性从随包模板 `templates/APPEND_SYSTEM.md`(英文版协调者身份模板:身份、核心规则、执行工作流,含「subagent 仅指已注册子代理」的用语铁律)创建。已有文件归用户所有 —— TUI 永远不会覆盖用户内容;只在缺失标记的 todo-lifecycle 段、或尚未出现 subagents 铁律措辞(按短语匹配,幂等)时追加对应段落。
|
|
167
|
-
- **TUI 自有段落** —— 一段带标记的 block(`<!-- dsh-tui-pi:todo-lifecycle -->`)只在缺失时追加一次,并保持幂等,确保模型在所有 todo 都完成时清空 `todo/write` 列表。已带标记的文件后续启动原样保留。
|
|
168
|
-
- **旧版迁移** —— 同一段 todo block 早期通过 `~/.dsh/AGENTS.md` 下发。启动时 TUI 一次性把它剥掉(无标记时 no-op),避免重复下发。
|
|
169
|
-
- **空 / 读不到 = 不挂载该 section** —— 文件缺失或读不了时该 section 被静默丢弃,无报错、不影响 TUI 启动。
|
|
170
|
-
|
|
171
|
-
#### 作用范围:仅限主代理
|
|
172
|
-
|
|
173
|
-
该 section 注册在主代理**带作用域**的 agent context 上(`src/session.ts` 里的 `installAppendSystem`)—— 落在该 agent 自己的 prompt-scope 层,子代理的 scope 不会合并。协调者身份(「调度子代理、不要自己执行」)如果下发到子代理会自废武功,所以子代理完全看不到这个文件。机制与 `dsh-subagent-registry` 给每个子代理设置人设时相同。
|
|
174
|
-
|
|
175
|
-
#### 示例
|
|
176
|
-
|
|
177
|
-
```sh
|
|
178
|
-
# 首次启动从 templates/APPEND_SYSTEM.md 自动播种 —— 直接打开编辑即可。
|
|
179
|
-
$EDITOR ~/.dsh/APPEND_SYSTEM.md
|
|
180
|
-
|
|
181
|
-
# 或者完全替换为自己的版本(TUI 仍会保留它的标记 todo-lifecycle section,
|
|
182
|
-
# 缺失时会重新追加)。
|
|
183
|
-
cat > ~/.dsh/APPEND_SYSTEM.md <<'EOF'
|
|
184
|
-
# 项目约定
|
|
185
|
-
|
|
186
|
-
- 任何任务都先跑 `pnpm test` 再声称完成。
|
|
187
|
-
- 多步调研优先派发给 `workhorse` 子代理。
|
|
188
|
-
EOF
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
该功能没有开关斜杠命令 —— 它始终启用,完全由文件内容控制。
|
|
192
|
-
|
|
193
|
-
---
|
|
194
|
-
|
|
195
|
-
## 斜杠命令
|
|
196
|
-
|
|
197
|
-
| 命令 | 功能 |
|
|
198
|
-
|---|---|
|
|
199
|
-
| `/model` | 两阶段选择 provider/model(然后选推理等级),实时切换并持久化。面板内按键:`f` 收藏 · `h` 隐藏 · `/` 过滤(收藏/隐藏经 settings 持久化)。 |
|
|
200
|
-
| `/think` | 当前模型的推理强度选择(`Off`/`High`/`Max`)。 |
|
|
201
|
-
| `/session` | 只读信息面板:id、cwd、模型、token 用量、事件计数。 |
|
|
202
|
-
| `/resume` | 选择已保存的会话,验证日志后恢复。按最后更新时间排序(日志文件 mtime),新的在上;`Updated` 列显示生效时间。 |
|
|
203
|
-
| `/new` | 分离当前会话;下一次输入开启新会话。 |
|
|
204
|
-
| `/settings` | 文本式设置浏览器(命名空间、schema 遍历、内联编辑器、密钥脱敏)。 |
|
|
205
|
-
| `/export` | 将当前会话日志导出为 JSONL(默认 `~/Downloads/dsh-session-<id>.jsonl`)。 |
|
|
206
|
-
| `/permission` | 权限预设选择器(read-only / workspace-write / danger-full-access)。 |
|
|
207
|
-
| `/theme` | 配色方案选择器(`auto` / `light` / `dark`),实时生效。 |
|
|
208
|
-
| `/preset` | Agent 预设选择器;`<name>` 直接切换,`next` 向前循环(同 `Tab`)。 |
|
|
209
|
-
| `/agents` | 管理 agent markdown 文件 + 子代理限制(`maxAgents`、`maxRounds`)。 |
|
|
210
|
-
| `/subagents` | 选择运行中/最近的子代理,查看其实时对话。 |
|
|
211
|
-
| `/reload` | 从源码热重载插件(`pnpm build` 后执行,无需重启 dsh)。 |
|
|
212
|
-
| `/login` | 登录 provider:从目录选择(或 `/login openai` 直达),输入一个 API key。**Custom provider…** 条目(`/login custom`)打开六字段表单,接入 pi-ai 未收录的任意 OpenAI/Anthropic 兼容网关 —— 路由 id、显示名、协议、base URL、模型列表、API key —— 写出与 Web Models 页相同的 hand-declared 路由。 |
|
|
213
|
-
| `/logout` | 选择已登录的 provider,同时删除存储的 key 和 provider 配置。 |
|
|
214
|
-
| `/hotkeys` | 快捷键浏览器和实时编辑。 |
|
|
215
|
-
|
|
216
|
-
不是已注册命令的内容会作为普通提示词发送给模型。
|
|
217
|
-
|
|
218
|
-
---
|
|
219
|
-
|
|
220
|
-
## 快捷键
|
|
221
|
-
|
|
222
|
-
| 按键 | 功能 |
|
|
223
|
-
|---|---|
|
|
224
|
-
| `Enter` | 发送提示词 |
|
|
225
|
-
| `Esc` | **双击停止** —— 单击进入等待窗口(500ms);弹窗打开时关闭弹窗;空闲(无运行中任务)时不做任何操作 |
|
|
226
|
-
| `Ctrl+C` | 对话中:第一次取消当前轮次,第二次退出。空闲时:第一次清空编辑器,第二次退出。**长按自动重复不会触发退出。** |
|
|
227
|
-
| `Ctrl+D` | 退出(仅在编辑器为空时) |
|
|
228
|
-
| `Ctrl+L` | 打开模型/推理强度选择器 |
|
|
229
|
-
| `Ctrl+G` | 打开子代理选择器(有运行中的子代理时) |
|
|
230
|
-
| `Tab` | 循环切换 agent 预设(footer 品牌段显示当前预设 `dsh(<name>)`) |
|
|
231
|
-
| `↑` / `↓` | 浏览历史消息(shell 风格,保留 500 条) |
|
|
232
|
-
|
|
233
|
-
### 自定义快捷键
|
|
234
|
-
|
|
235
|
-
通过 `~/.dsh/keybindings.json` 重新映射任意应用按键 —— 一个部分 JSON 映射表,键为应用按键、值为按键 id(`ctrl+letter`、`alt+letter`、命名键)。可手动编辑,或用 `/hotkeys` 交互式修改(实时生效,无需重启)。
|
|
236
|
-
|
|
237
|
-
---
|
|
238
|
-
|
|
239
|
-
## Agent 预设
|
|
240
|
-
|
|
241
|
-
当部署提供了 `standard` 预设时,TUI 启动即选中它;否则选中扫描到的第一项。这只是本地选择:在你操作 `/preset` 或按 `Tab` 之前,创建会话时不会发送任何 `meta.agentPreset`,因此仍由服务端默认值(`agent-presets.default`)决定。footer 品牌段反映本地选择(`dsh(<name>)`);一次切换会在下一个空白会话生效。
|
|
242
|
-
|
|
243
|
-
---
|
|
244
|
-
|
|
245
|
-
## 主题
|
|
246
|
-
|
|
247
|
-
GitHub light / GitHub dark 配色方案,运行时热切换:
|
|
248
|
-
|
|
249
|
-
- `/theme` —— 实时选择器,整个屏幕重绘(含背景)。
|
|
250
|
-
- `DSH_TUI_THEME=light|dark` —— 环境变量钉选,优先于偏好设置。
|
|
251
|
-
- `DSH_TUI_TRANSPARENT=1` —— 透明画布(终端背景可见)。
|
|
252
|
-
- `DSH_TUI_MOUSE=buttons|all|off` —— 终端鼠标追踪模式(默认 `buttons`:点击/滚轮/拖选保留、空闲移动不上报;`all` = pi-tui 全动作追踪,cmux 下其事件突发可能漏进输入框;`off` = 完全关闭)。
|
|
253
|
-
- `auto` 模式自动检测终端并跟随实时明暗切换。
|
|
254
|
-
|
|
255
|
-
全屏画布背景随包内置 —— 由写流装饰器(`src/canvas-terminal.ts`)用主题色
|
|
256
|
-
经 BCE 给每条擦除序列上色,无需补丁依赖。
|
|
257
|
-
|
|
258
|
-
---
|
|
259
|
-
|
|
260
|
-
## 字体
|
|
261
|
-
|
|
262
|
-
TUI 中唯一的私有区(PUA)字形是 footer 的 Powerline 分隔箭头(U+E0B0)——
|
|
263
|
-
默认终端字体都不含它,不装字体就会显示豆腐块。`dsh-tui.iconSet` 设置
|
|
264
|
-
(`auto` | `nerdfont` | `plain`,默认 `auto`)让危险字形(U+E0B0、⏹、⭘)
|
|
265
|
-
自适应终端:
|
|
266
|
-
|
|
267
|
-
- `auto` —— 启动时探测到 Nerd/Powerline 字体就用 Powerline 字形,否则用
|
|
268
|
-
安全 Unicode 替代(`▸ ■ ●`)。
|
|
269
|
-
- `nerdfont` —— 始终用 Powerline 字形(你已经自己设好字体)。
|
|
270
|
-
- `plain` —— 始终用安全替代,无需任何字体。
|
|
271
|
-
|
|
272
|
-
**一键安装内置字体**(拷贝字体 + 尽量把终端切过去,保留原字号):
|
|
273
|
-
|
|
274
|
-
```sh
|
|
275
|
-
node scripts/install-font.mjs
|
|
276
|
-
```
|
|
277
|
-
|
|
278
|
-
脚本把 `assets/fonts/dsh-tui-pi-nerd.ttf`(约 170KB 子集:ASCII + U+E0B0 +
|
|
279
|
-
本项目渲染的全部符号)拷进用户字体目录,并尽力改终端:macOS iTerm2
|
|
280
|
-
(PlistBuddy,定点改默认 bookmark)、Linux GNOME Terminal(gsettings)与
|
|
281
|
-
kitty/alacritty/wezterm(改配置文件,先备份)。Terminal.app 明确跳过(其
|
|
282
|
-
字体是二进制 blob)——请手动设置。每一步都带防护:失败只打警告并继续,
|
|
283
|
-
绝不动坏你的配置。
|
|
284
|
-
|
|
285
|
-
**或手动设终端字体**——任意 Nerd Font 家族作为终端主字体即可(如
|
|
286
|
-
JetBrainsMono Nerd Font、Hack Nerd Font,或安装后的内置 `DSH TUI Nerd`):
|
|
287
|
-
iTerm2 → Settings → Profiles → Text → Font;Terminal.app → 设置 →
|
|
288
|
-
描述文件 → 文本;kitty → `font_family`;alacritty → `[font] family`;
|
|
289
|
-
wezterm → `wezterm.font("…")`。下次启动时 `auto` 就会解析成 Powerline 字形。
|
|
290
|
-
|
|
291
|
-
---
|
|
292
|
-
|
|
293
|
-
## 安装(本地)
|
|
294
|
-
|
|
295
|
-
`tui` profile 通过 npm registry 安装本插件——profile 的 `package.json` 钉
|
|
296
|
-
`"@aiwayds/dsh-tui-pi": "<version>"`,由 pnpm 像普通依赖一样解析。发版后
|
|
297
|
-
升级 profile:
|
|
298
|
-
|
|
299
|
-
```sh
|
|
300
|
-
node scripts/dev-upgrade.mjs # 最新版
|
|
301
|
-
node scripts/dev-upgrade.mjs 0.15.1 --dry-run # 先预览执行计划
|
|
302
|
-
```
|
|
303
|
-
|
|
304
|
-
脚本先在 registry 上校验版本存在,然后只更新
|
|
305
|
-
`~/.dsh/profiles/tui/package.json` 里的 `"@aiwayds/dsh-tui-pi"` 一个键
|
|
306
|
-
(保格式的 read-modify-write),在该目录执行 `pnpm install`,最后校验安装
|
|
307
|
-
副本的版本与目标一致。绝不碰 `~/.dsh/settings.yaml` 和
|
|
308
|
-
`.credentials.yaml`。重启 dsh(或在 TUI 内 `/reload`)加载新副本。
|
|
309
|
-
|
|
310
|
-
## 安装(npm)
|
|
311
|
-
|
|
312
|
-
在全新 profile 里安装完整的 dsh 插件套件:
|
|
313
|
-
|
|
314
|
-
```sh
|
|
315
|
-
dsh plugin --profile tui add @aiwayds/dsh-tui-pi
|
|
316
|
-
dsh plugin --profile tui add @aiwayds/dsh-subagent-registry
|
|
317
|
-
dsh plugin --profile tui add @aiwayds/dsh-dcp
|
|
318
|
-
```
|
|
319
|
-
|
|
320
|
-
然后启动:
|
|
321
|
-
|
|
322
|
-
```sh
|
|
323
|
-
dsh --profile tui
|
|
324
|
-
```
|
|
325
|
-
|
|
326
|
-
**自动完成的事:**
|
|
327
|
-
|
|
328
|
-
- dsh 将三个插件注册到 `dsh.profile.bundles`(通过 `reconcilePlugins`)。
|
|
329
|
-
- dsh 在 profile 的 `pnpm-workspace.yaml` 里设置 `autoInstallPeers: false`。
|
|
330
|
-
- 首次启动时 dsh 调用 `healProfilesModuleFallback`,在
|
|
331
|
-
`~/.dsh/profiles/node_modules/@deepseek-ai/*` 创建软链指向全局 dsh
|
|
332
|
-
闭包。所有插件共享同一个 `@deepseek-ai/cordis` 实例——无需手动建闭包。
|
|
333
|
-
- `@aiwayds/dsh-dcp` 的补丁禁用 `compaction-basic`,dsh-dcp 接管上下文压缩。
|
|
334
|
-
|
|
335
|
-
**不会自动完成的事:**
|
|
336
|
-
|
|
337
|
-
- 不再有任何补丁相关的事:自 0.8.0 起,仓库和 npm 包运行的是同一个
|
|
338
|
-
原版 `@earendil-works/pi-tui`——画布背景由我们自己的写流装饰器(BCE)
|
|
339
|
-
绘制,随包内置,消费方 profile 无需任何 `pnpm-workspace.yaml` 条目。
|
|
340
|
-
|
|
341
|
-
### 故障排查
|
|
342
|
-
|
|
343
|
-
| 症状 | 原因 | 修复 |
|
|
344
|
-
|---|---|---|
|
|
345
|
-
| `Cannot find package '<name>' imported from ~/.dsh/profiles/...` | 某个 bundle 的 `cordis.patch.yml` 的 `name` 字段与 scoped 包名不匹配 | 更新插件(所有 `@aiwayds/*` 插件已修复补丁 `name` 字段) |
|
|
346
|
-
| npm 安装的 dsh 报 `Cannot find package '@deepseek-ai/dsh-client-schema-form'` | npm 分发的 dsh 闭包缺这个包(上游打包缺口——[deepseek-harness discussion #3471](https://github.com/deepseek-ai/deepseek-harness/discussions/3471)) | 本插件自 0.8.1 起已修(辅助函数内置,不再 import 缺失的包)。其他需要它的插件:`cd ~/.dsh/profiles/<profile> && pnpm add @deepseek-ai/dsh-client-schema-form@next` |
|
|
347
|
-
| `Cannot read properties of undefined (reading 'prepare')` | profile 树里出现两个 `@deepseek-ai/cordis` 物理副本(模块重复安装) | 见 AGENTS.md 铁律 8。删掉物理副本:`rm -rf ~/.dsh/profiles/tui/node_modules/@deepseek-ai && dsh --profile tui`(dsh 会重新 heal 为软链) |
|
|
348
|
-
| pnpm 提示 `Peer dependencies that should be installed: @deepseek-ai/...` | 某个插件把 `@deepseek-ai/*` 放在 `dependencies` 而非 `peerDependencies` | 更新插件(所有 `@aiwayds/*` dsh 插件已改用 optional peerDeps),警告无害 |
|
|
349
|
-
| pnpm 提示 `Ignored build scripts: @aiwayds/dsh-tui-pi@...` | pnpm 10 默认阻止 build 脚本,tui-pi 的 postinstall 被跳过 | **正常且无害**——postinstall 只影响仓库开发流,npm 消费者由 dsh 的 `healProfilesModuleFallback` 处理闭包链接 |
|
|
350
|
-
|
|
351
|
-
---
|
|
352
|
-
|
|
353
|
-
## 使用
|
|
354
|
-
|
|
355
|
-
```sh
|
|
356
|
-
dsh --profile tui # 或:dsh-tui-pi(bin shim)
|
|
357
|
-
```
|
|
358
|
-
|
|
359
|
-
---
|
|
360
|
-
|
|
361
|
-
## 开发
|
|
362
|
-
|
|
363
|
-
```sh
|
|
364
|
-
pnpm check # tsc --noEmit
|
|
365
|
-
pnpm build # 输出 lib/
|
|
366
|
-
pnpm test # 单元测试,node --test 对 lib/ 执行(569 个测试,pretest 自动构建)
|
|
367
|
-
```
|
|
368
|
-
|
|
369
|
-
本地类型检查通过 symlink `node_modules/@deepseek-ai/*` 指向已安装的 dsh 闭包(`/opt/homebrew/lib/node_modules/@deepseek-ai/dsh/node_modules`);这些 symlink 不会打入 tarball。`scripts/link-dsh-closure.mjs`(`postinstall`)在每次 `pnpm install` 后重新创建所有 symlink。
|
|
370
|
-
|
|
371
|
-
**pi-tui**:npm 上的原版 `@earendil-works/pi-tui` 0.84.2——无补丁、无 fork。全屏画布背景由我们自己的写流装饰器实现(`src/canvas-terminal.ts`,BCE)。
|
|
372
|
-
|
|
373
|
-
---
|
|
374
|
-
|
|
375
|
-
## 目录结构
|
|
376
|
-
|
|
377
|
-
```
|
|
378
|
-
bin/dsh-tui-pi 启动器 shim(执行 dsh --profile tui)
|
|
379
|
-
cordis.patch.yml bundle 补丁:将插件挂载为 `tui-pi`
|
|
380
|
-
src/
|
|
381
|
-
index.ts cordis 插件入口:命令注册、footer、git 监控、时钟、bridge、主题热切换、关闭
|
|
382
|
-
tui.ts alt-screen 树、对话区 ScrollView、dock、canvas 背景
|
|
383
|
-
session.ts DshSessionBridge:agent 创建、followup、resume、O(1) 增量统计、子代理追踪
|
|
384
|
-
live-widgets.ts Todos 面板 + 运行子代理活动行
|
|
385
|
-
messages.ts TranscriptRenderer:会话事件 → pi-tui 组件、流式 setText、可配置高度面板
|
|
386
|
-
footer.ts PowerlineFooter(7 分段 + 时钟)
|
|
387
|
-
editor.ts CwdBorderEditor(顶部边框:cwd + git 分支)
|
|
388
|
-
subagent-policy.ts maxAgents 守卫 + maxRounds 收尾请求注入
|
|
389
|
-
(运行中走 steer;⚡ 标记,查看器可见)
|
|
390
|
-
subagent-viewer.ts Ctrl+G 选择器 + 实时对话面板
|
|
391
|
-
theme/ GitHub light/dark 配色 + 终端检测
|
|
392
|
-
test/*.test.mjs 单元测试(569 个,覆盖 38 个文件)
|
|
393
|
-
```
|
|
394
|
-
|
|
395
|
-
---
|
|
396
|
-
|
|
397
|
-
## 更新日志
|
|
398
|
-
|
|
399
|
-
见 [CHANGELOG.md](CHANGELOG.md)。
|
|
5
|
+
The Simplified Chinese README has moved to [README.zh-CN.md](./README.zh-CN.md).
|
package/lib/index.js
CHANGED
|
@@ -960,7 +960,13 @@ export function apply(ctx) {
|
|
|
960
960
|
// Seeds entered through construction never published — replaying them
|
|
961
961
|
// exactly once covers the stored log with zero overlap, zero gap.
|
|
962
962
|
const session = resumed.agent.session;
|
|
963
|
-
|
|
963
|
+
// Adopted live sessions (attach arm): EVERY event in the log was
|
|
964
|
+
// published before this surface started tracking it — the firehose
|
|
965
|
+
// dropped all of them, so replay unfiltered or the transcript misses
|
|
966
|
+
// everything the other surface did. Cold resumes keep the firstLiveSeq
|
|
967
|
+
// filter (seeded history replays once; live events re-arrive).
|
|
968
|
+
const adopted = 'adopted' in resumed && resumed.adopted === true;
|
|
969
|
+
bridge.replay(adopted ? session.events : session.events.filter(event => event.seq < session.firstLiveSeq));
|
|
964
970
|
ui.requestRender();
|
|
965
971
|
return {
|
|
966
972
|
kind: 'success',
|