@xmoon76/dsh-pi-tui 0.4.7-alpha.2 → 0.4.9

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.en.md CHANGED
@@ -54,23 +54,28 @@ next compatibility range, and fallback paths.
54
54
 
55
55
  | TUI package line | Official DSH tags for the pairing | Notes |
56
56
  |---|---|---|
57
- | `0.4.6` (published `@latest`) | `dsh-v0.1.5-rc.1`, `dsh-v0.1.5-rc.2` | Current stable line; rc.1 minimum, rc.2 compatible |
58
- | Current `next` npm line (this checkout; version `0.4.7-alpha.2`) | `dsh-v0.1.6-alpha.2` | Current next line |
59
-
60
- Do not mix the stable and `next` lines. The current `next` checkout declares
61
- the published `0.1.6-alpha.2` npm floor; older runtimes fail at the normal
62
- incompatible-runtime boundary. The startup notice is best-effort rather than a
63
- Loader startup-order guarantee. See the [full historical compatibility matrix](docs/dsh-compatibility.md)
64
- for official-tag pairings and fallback commands, and see the [latest `next`
57
+ | `0.4.9` (stable / `@latest`) | `dsh-v0.1.7-rc.2` | Current stable line; 0.1.7-rc.2 minimum |
58
+ | `0.4.8` (stable, previous) | `dsh-v0.1.7-rc.1` | Previous stable; the compatible TUI for a 0.1.7-rc.1 runtime |
59
+ | `0.4.6` (stable, previous) | `dsh-v0.1.5-rc.1`, `dsh-v0.1.5-rc.2` | Previous stable; the compatible TUI for a 0.1.5 runtime |
60
+ | `0.4.7-alpha.2` (next, previous) | `dsh-v0.1.6-alpha.2` | Previous next line; the compatible TUI for a 0.1.6-alpha.2 runtime |
61
+
62
+ Do not mix the stable and `@next` prerelease lines. The `0.4.9` line unifies its
63
+ whole DSH peer floor at `>=0.1.7-rc.2` (the rc.2 preset registry peers
64
+ `dsh-agent` exactly, so a wider legacy floor no longer satisfies a standalone
65
+ tarball install); older runtimes fail at the normal incompatible-runtime
66
+ boundary, so install the paired TUI line from the table above. The startup notice
67
+ is best-effort rather than a Loader startup-order guarantee. See the [full
68
+ historical compatibility matrix](docs/dsh-compatibility.md) for official-tag
69
+ pairings and fallback commands, and see the [latest `next`
65
70
  README](https://github.com/XMoon/dsh-pi-tui/blob/next/README.md) for the current
66
71
  integration status.
67
72
 
68
73
  New agent sessions use the official roster's selected preset id. A custom DSH
69
74
  preset literally named `code` is valid and remains `code` when it exists in the
70
75
  current roster. DSH V3 migration owns historical session `code -> ptc`
71
- conversion, while the current projection preserves a legal custom `code`. Only
72
- an omitted legacy settings default `code` falls back to `ptc` after the roster
73
- proves that no custom `code` preset exists.
76
+ conversion, while the current projection preserves a legal custom `code`. An
77
+ omitted legacy settings default is never aliased: with no matching declaration
78
+ in the current roster it is simply an invalid preference.
74
79
 
75
80
  ### Profile management
76
81
 
@@ -119,11 +124,15 @@ dsh --profile pi-tui --session <session-id>
119
124
 
120
125
  `Ctrl+O` controls Tool and System details and expands/collapses long user prompts in regular mode and in fullscreen outside Focus — in fullscreen Focus it bulk-expands the recent Thought roots or collapses them all, while long user prompts are expanded by clicking the marker (or by a search hit) and collapsed with `Ctrl+O`. `Alt+T` controls Thinking separately.
121
126
 
122
- ### Focus Mode
127
+ ### Conversation display
123
128
 
124
- `/focus` groups the current turn's Thinking, Tool Calls, and intermediate replies into a live Thought block.
129
+ `/display focus` groups the current turn's Thinking, Tool Calls, and intermediate replies into a live Thought block; `/display full` restores the normal Transcript projection. `/focus` remains available as a compatibility command. The Compact preset is reserved and `/display compact` is rejected until its projection ships.
125
130
 
126
- The full process can still be expanded when needed. In fullscreen Focus, Thought roots can be expanded/collapsed in bulk or opened with an individual card click, and the viewport survives switches and resizes. Disabling Focus restores the normal Transcript projection. Focus only changes presentation; it does not modify Session events.
131
+ The full process can still be expanded when needed. In fullscreen Focus, Thought roots can be expanded/collapsed in bulk or opened with an individual card click, and the viewport survives switches and resizes. Display presets only change presentation; they do not modify Session events.
132
+
133
+ ### Communication policy
134
+
135
+ `/settings` exposes two independent communication controls. **Progress updates** owns the mid-turn update cadence: `milestones` (default) posts a brief update only when a substantial phase completes, the direction materially changes, or required user input blocks progress — never for a freshly discovered partial finding; `frequent` keeps the user actively informed through longer multi-step work; `off` suppresses progress narration entirely. **Response style** owns the visible answer's density: `default` adds no extra guidance, `concise` is compact and result-first, `explanatory` adds rationale, architecture, and tradeoffs. Changes apply on the next prompt assembly without restarting the agent and are saved across sessions. Focus is a surface capability, not a third preference: while Focus is active the progress section is simply ineffective (progress-only intermediate messages are not generated) and the saved cadence is untouched; the response style stays active in Focus.
127
136
 
128
137
  ### Sessions
129
138
 
@@ -166,10 +175,31 @@ History results include the Prompt, working directory, timestamp, and Session in
166
175
 
167
176
  Regular `↑` / `↓` history recall is still available for recent input.
168
177
 
169
- ### Subagents and background tasks
170
-
171
- `/tasks` opens the full Task Center for all background work in the current
172
- Session; the Footer's `↓` opens the lightweight Quick Tasks view for running work.
178
+ ### Subagents and the Task Center
179
+
180
+ `/tasks` opens the full Task Center, showing the work the current Session's
181
+ Job Registry / Subagent catalog still tracks; the Footer's `↓` opens the
182
+ lightweight Quick Tasks view for the current active work. Selecting a Job
183
+ opens a detail with the official non-consuming live
184
+ output preview (status, progress and the retained output tail); it never consumes
185
+ the model's `job_output` cursor and never becomes session history.
186
+
187
+ Task Center is a live tracked/control projection, not an execution-history
188
+ list. `ACTIVE` / `TRACKED` are presentation scopes: `ACTIVE` shows only the
189
+ currently active items, `TRACKED` shows everything the current authority
190
+ still lists. DSH `0.1.7` temporarily registers a Job while an ordinary
191
+ foreground `bash` / `pwsh` command runs, so it can be observed and stopped
192
+ from the Task Center; if the command finishes inside the foreground wait,
193
+ DSH removes that temporary record and the final result stays in the
194
+ Transcript's tool card. Explicit `run_in_background: true` jobs (and jobs
195
+ promoted to the background after a foreground timeout) remain visible in
196
+ `TRACKED` after completion as long as the Job Registry keeps their record.
197
+
198
+ `/plugins` opens the active profile's Plugin Manager: installed bundles and
199
+ plugins are grouped into Current TUI / TUI Extensions / DSH Plugins, with
200
+ enable/disable, remove and install; the `dsh-pi-tui` bundle currently providing
201
+ the surface is read-only and cannot be disabled or removed from its own screen.
202
+ The `Plugins Manage…` row in `/settings` opens the same surface on demand.
173
203
 
174
204
  Subagents are shown using their complete lineage, including nested descendants:
175
205
 
@@ -186,14 +216,14 @@ The browser distinguishes:
186
216
  * `one-shot`
187
217
  * running / inactive
188
218
  * nested descendants
189
- * background Jobs
219
+ * Job Registry rows (including running foreground shell work)
190
220
 
191
221
  The Footer's `↓` opens Quick Tasks as a lightweight browsing view: it only
192
222
  supports arrow navigation, left/right expand/collapse, `Tab` type cycling,
193
223
  `Enter` open, and `Esc` close. The bottom “Open Task Center” row opens the full
194
224
  Task Center.
195
225
 
196
- The full Task Center additionally offers `A` to toggle Active / All, `/` search,
226
+ The full Task Center additionally offers `A` to toggle Active / Tracked, `/` search,
197
227
  `Tab` / `Shift+Tab` to cycle types in both directions, `S` to stop the selected
198
228
  task after confirmation, and `R` to refresh/retry. Quick Tasks consumes only the
199
229
  whitelist above; every other keystroke is a no-op that never enters search, stop
@@ -328,20 +358,22 @@ Use `/help` inside the TUI for the current command and keybinding list. The tabl
328
358
  Host shortcuts are semantic actions (`app.*`) resolved through a
329
359
  context-aware keymap — the UI (footer hints, `/help`, `/keybindings`)
330
360
  always shows the EFFECTIVE keys, so a remap updates every hint. Configure
331
- them in the `dsh-pi-tui` settings namespace; apply with `/keybindings
332
- reload` (explicit — a settings edit takes effect after the reload, no
333
- restart):
361
+ them through the in-TUI `/keybindings` panel (it writes the `keybindings`
362
+ field of the `tui-app` plugin's profile-owned configuration — since DSH
363
+ 0.1.7 TUI preferences live on the profile Config, not the retired
364
+ `dsh-pi-tui` settings namespace); apply with `/keybindings reload`
365
+ (explicit — a configuration edit takes effect after the reload, no
366
+ restart). Field shape:
334
367
 
335
368
  ```yaml
336
- dsh-pi-tui:
337
- keybindings:
338
- app.input.steer: ctrl+s # one key
339
- app.permission.cycle: [shift+tab, ctrl+shift+p] # several keys
340
- app.history.search: ctrl+r
341
- app.transcript.toggleThinking: false # disable the action's keys
342
- leader: ctrl+x # M6: leader sequences
343
- bindings:
344
- app.tasks.open: <leader>t
369
+ keybindings:
370
+ app.input.steer: ctrl+s # one key
371
+ app.permission.cycle: [shift+tab, ctrl+shift+p] # several keys
372
+ app.history.search: ctrl+r
373
+ app.transcript.toggleThinking: false # disable the action's keys
374
+ leader: ctrl+x # M6: leader sequences
375
+ bindings:
376
+ app.tasks.open: <leader>t
345
377
  ```
346
378
 
347
379
  - A plain printable key can never be bound to a Host action (it would
@@ -562,9 +594,9 @@ This section contains DSH compatibility and CI validation details only; ordinary
562
594
 
563
595
  ### npm mode (current `next`)
564
596
 
565
- The current `next` line is npm mode: it targets the published
566
- `dsh-v0.1.6-alpha.2` family declared by this checkout's `package.json` and
567
- resolved by its frozen lockfile. The isolated npm driver installs that exact
597
+ The current compatibility-train line is npm mode: it targets the published
598
+ `dsh-v0.1.7-rc.2` family declared by this checkout's `package.json` and
599
+ resolved by its lockfile. The isolated npm driver installs that exact
568
600
  family from the public registry and exercises the TUI build/test/package path:
569
601
 
570
602
  ```sh
package/README.md CHANGED
@@ -52,19 +52,23 @@ pnpm compat:dsh:npm
52
52
 
53
53
  | TUI 包版本 | 对应的官方 DSH tags | 说明 |
54
54
  |---|---|---|
55
- | `0.4.6`(已发布 `@latest`) | `dsh-v0.1.5-rc.1`、`dsh-v0.1.5-rc.2` | 当前稳定版;最低 rc.1,兼容 rc.2 |
56
- | 当前 `next` npm 线(本 checkout;版本 `0.4.7-alpha.2`) | `dsh-v0.1.6-alpha.2` | 当前 next 线 |
57
-
58
- 不要把稳定线与 `next` 线混装。当前 `next` checkout 的 peer floor 是
59
- `>=0.1.6-alpha.2`,旧 runtime 会在正常的不兼容边界以非零状态失败。完整的
60
- 历史兼容矩阵和 fallback 命令见 [兼容性文档](docs/dsh-compatibility.md);
61
- 要查看 next 的最新集成状态,请看 [next 分支 README](https://github.com/XMoon/dsh-pi-tui/blob/next/README.md)。
55
+ | `0.4.9`(stable / `@latest`) | `dsh-v0.1.7-rc.2` | 当前稳定版;最低 0.1.7-rc.2 |
56
+ | `0.4.8`(stable,历史) | `dsh-v0.1.7-rc.1` | 上一稳定版;0.1.7-rc.1 runtime 的兼容 TUI |
57
+ | `0.4.6`(stable,历史) | `dsh-v0.1.5-rc.1`、`dsh-v0.1.5-rc.2` | 上一稳定版;0.1.5 runtime 的兼容 TUI |
58
+ | `0.4.7-alpha.2`(next,历史) | `dsh-v0.1.6-alpha.2` | 上一条 next 线;0.1.6-alpha.2 runtime 的兼容 TUI |
59
+
60
+ 不要把稳定线与 `@next` 预发布线混装。`0.4.9` 的整个 DSH peer floor 统一为
61
+ `>=0.1.7-rc.2`(rc.2 的 preset registry 精确 peer `dsh-agent`,更宽的旧
62
+ floor 已无法满足独立 tarball 安装);旧 runtime 会在正常的不兼容边界以非零状态失败,
63
+ 请按上表安装配对的 TUI 线。完整的历史兼容矩阵和 fallback 命令见
64
+ [兼容性文档](docs/dsh-compatibility.md);要查看 `@next` 的最新集成状态,请看
65
+ [next 分支 README](https://github.com/XMoon/dsh-pi-tui/blob/next/README.md)。
62
66
 
63
67
  新的 Agent preset 使用当前 roster 中选定的 id。DSH 允许合法的自定义
64
68
  `code` preset;只要当前 roster 存在它,显式输入和持久化状态都会保留 `code`。
65
69
  DSH V3 migration 负责历史 session header/selection 的 `code -> ptc` 转换;
66
- 当前 projection 会原样保留合法的自定义 `code`。只有省略请求的 legacy
67
- settings default `code` 才会在确认 roster 不含 `code` 后回退到 `ptc`。
70
+ 当前 projection 会原样保留合法的自定义 `code`。省略请求的 legacy settings
71
+ default 不再做任何别名映射:当前 roster 没有声明就是无效偏好。
68
72
 
69
73
  ### Profile management
70
74
 
@@ -113,11 +117,15 @@ dsh --profile pi-tui --session <session-id>
113
117
 
114
118
  `Ctrl+O` 控制工具和系统详情,并在普通模式与全屏非 Focus 下展开/收起超长用户 Prompt;全屏 Focus 下它整体展开最近几个 Thought root 或全部收起,超长用户 Prompt 改用点击提示行(或搜索命中)展开、`Ctrl+O` 收回。`Alt+T` 单独控制 Thinking。
115
119
 
116
- ### Focus Mode
120
+ ### Conversation display
121
+
122
+ `/display focus` 将运行中的 Thinking、Tool Call 和中间回复聚合为一个实时更新的 Thought 区块;`/display full` 恢复普通 Transcript 展示。`/focus` 仍作为兼容命令保留。Compact 预设尚未开放,`/display compact` 会明确拒绝。
123
+
124
+ 需要查看过程时可以展开,关闭 Focus 后恢复普通 Transcript 展示。全屏 Focus 中可以按 Thought root 批量展开/收起,也可以单独点击卡片;切换或缩放时会保留 viewport。展示预设只影响界面投影,不修改 Session 中保存的事件。
117
125
 
118
- `/focus` 可以把运行中的 Thinking、Tool Call 和中间回复聚合为一个实时更新的 Thought 区块。
126
+ ### 沟通策略
119
127
 
120
- 需要查看过程时可以展开,关闭 Focus 后恢复普通 Transcript 展示。全屏 Focus 中可以按 Thought root 批量展开/收起,也可以单独点击卡片;切换或缩放时会保留 viewport。Focus 只影响界面投影,不修改 Session 中保存的事件。
128
+ `/settings` 提供两个独立的沟通设置。**Progress updates** 控制 Agent 工作时的中途更新节奏:`milestones`(默认)只在完整的阶段结束、方向实质变化或需要用户输入时简短汇报,不为「刚发现一个局部结论」而打断;`frequent` 在较长的多步工作中持续带用户跟进;`off` 完全不做过程叙述。**Response style** 控制可见回复的密度:`default` 不附加表达指导,`concise` 紧凑且结果优先,`explanatory` 补充原理、架构与取舍。两项切换都在下一次提示词组装时生效,无需重启 Agent,并跨会话保存。Focus 是展示能力而非第三个偏好:进入 Focus 时进度更新节只是暂时失效(不生成只含进度的中间消息),保存的节奏偏好不变,Response style 在 Focus 下仍然生效。
121
129
 
122
130
  ### Session
123
131
 
@@ -160,9 +168,13 @@ Rewind 会从选中的历史 User Turn 创建新的 Child Session,并把对应
160
168
 
161
169
  普通的 `↑` / `↓` 仍用于快速浏览最近输入。
162
170
 
163
- ### Subagent 与后台任务
171
+ ### Subagent 与 Task Center
172
+
173
+ `/tasks` 打开完整 Task Center,显示当前 Session 中仍由 Job Registry / Subagent catalog 跟踪的工作;Footer 的 `↓` 打开轻量 Quick Tasks,只看当前活动(active)工作。选中 Job 后,详情会显示官方非消耗式的实时输出预览(状态、进度与保留的输出尾部),不会消耗模型的 `job_output` 游标,也不写入会话历史。
174
+
175
+ Task Center 的 `ACTIVE` / `TRACKED` 是展示范围:`ACTIVE` 只显示当前活动项,`TRACKED` 显示当前跟踪源(Job Registry / Subagent catalog)仍列出的全部项;`TRACKED` 不是 Session 执行历史。DSH `0.1.7` 会在普通前台 `bash` / `pwsh` 执行期间临时注册 Job,使其可以在 Task Center 中观察和停止;如果命令在前台等待内完成,DSH 会移除该临时记录,最终结果仍保留在 Transcript 的 tool card 中。显式 `run_in_background: true` 或被提升为后台的 Job 在完成后,只要 Job Registry 继续保留其记录,就仍可在 `TRACKED` 中查看。
164
176
 
165
- `/tasks` 打开完整 Task Center(当前 Session 的所有后台工作);Footer 的 `↓` 直接打开轻量 Quick Tasks(只看正在运行的工作)。
177
+ `/plugins` 打开当前 profile 的 Plugin Manager:按 Current TUI / TUI Extensions / DSH Plugins 分区查看已安装的 bundle 与插件,并执行启用/禁用、删除与安装;正在提供当前界面的 `dsh-pi-tui` 只读且不可从自身界面禁用或移除。`/settings` 中的 `Plugins Manage…` 按需打开同一界面。
166
178
 
167
179
  Subagent 按完整 lineage 显示,包括嵌套创建的 descendant:
168
180
 
@@ -179,11 +191,11 @@ main
179
191
  * `one-shot`
180
192
  * running / inactive
181
193
  * nested descendant
182
- * 后台 Job
194
+ * Job Registry 跟踪的 Job(含运行中的前台 shell)
183
195
 
184
196
  Footer `↓` 打开的 Quick Tasks 是轻量浏览视图,只提供方向键导航、左右展开/折叠、`Tab` 类型过滤、`Enter` 打开和 `Esc` 关闭。底部 “Open Task Center” 行可进入完整 Task Center。
185
197
 
186
- 完整 Task Center 额外提供 `A` 切换 Active / All、`/` 搜索、`Tab` / `Shift+Tab` 双向切换类型、`S`(确认后)停止所选任务以及 `R` 刷新 / 重试。Quick Tasks 只消费上述白名单按键,其余输入一律 no-op,不会进入搜索、停止确认或任务管理状态,因此 `Esc` 始终一层关闭。
198
+ 完整 Task Center 额外提供 `A` 切换 Active / Tracked、`/` 搜索、`Tab` / `Shift+Tab` 双向切换类型、`S`(确认后)停止所选任务以及 `R` 刷新 / 重试。Quick Tasks 只消费上述白名单按键,其余输入一律 no-op,不会进入搜索、停止确认或任务管理状态,因此 `Esc` 始终一层关闭。
187
199
 
188
200
  已经结束的 one-shot Subagent 仍可以打开并查看持久化 Transcript。
189
201
 
@@ -310,20 +322,21 @@ TUI 使用 DSH 提供的模型和设置服务。
310
322
 
311
323
  Host 快捷键是语义 action(`app.*`),通过 context-aware keymap 解析——
312
324
  UI(页脚提示、`/help`、`/keybindings`)始终显示**生效**的按键,因此
313
- 改键后所有提示自动更新。在 `dsh-pi-tui` settings 命名空间中配置,
314
- 然后用 `/keybindings reload` 应用(显式 reload——改设置后执行 reload
315
- 即生效,无需重启):
325
+ 改键后所有提示自动更新。配置入口是 TUI 里的 `/keybindings` 面板
326
+ (写入 `tui-app` 插件的 profile 配置的 `keybindings` 字段——DSH 0.1.7
327
+ 起 TUI 偏好保存在 profile-owned Config,不再使用旧 `dsh-pi-tui`
328
+ settings 命名空间);保存后用 `/keybindings reload` 应用(显式
329
+ reload——配置变更后执行 reload 即生效,无需重启)。字段形状:
316
330
 
317
331
  ```yaml
318
- dsh-pi-tui:
319
- keybindings:
320
- app.input.steer: ctrl+s # 单个按键
321
- app.permission.cycle: [shift+tab, ctrl+shift+p] # 多个按键
322
- app.history.search: ctrl+r
323
- app.transcript.toggleThinking: false # 禁用该 action 的按键
324
- leader: ctrl+x # M6:leader 序列
325
- bindings:
326
- app.tasks.open: <leader>t
332
+ keybindings:
333
+ app.input.steer: ctrl+s # 单个按键
334
+ app.permission.cycle: [shift+tab, ctrl+shift+p] # 多个按键
335
+ app.history.search: ctrl+r
336
+ app.transcript.toggleThinking: false # 禁用该 action 的按键
337
+ leader: ctrl+x # M6:leader 序列
338
+ bindings:
339
+ app.tasks.open: <leader>t
327
340
  ```
328
341
 
329
342
  - 普通可打印键永远不能绑定到 Host action(会吞掉输入);坏配置只是
@@ -535,8 +548,8 @@ dsh --profile pi-tui-dev
535
548
 
536
549
  ### npm 模式(当前 `next`)
537
550
 
538
- 当前 `next` 线是 npm 模式:以本 checkout 的 `package.json` 声明、冻结
539
- lockfile 解析的已发布 `dsh-v0.1.6-alpha.2` family 为兼容目标。隔离的 npm
551
+ 当前兼容列车线是 npm 模式:以本 checkout 的 `package.json` 声明、
552
+ lockfile 解析的已发布 `dsh-v0.1.7-rc.2` family 为兼容目标。隔离的 npm
540
553
  驱动从公共 registry 安装该精确 family,并跑完整 build/test/package 路径:
541
554
 
542
555
  ```sh
package/cordis.patch.yml CHANGED
@@ -32,10 +32,25 @@
32
32
  # can fork. The row below is this bundle's own, so the dependency is
33
33
  # self-contained and a profile that disables it fails loud instead of
34
34
  # silently forking without workspace inheritance.
35
- inject: [tuiStartup, piTuiExtensions, authorization, workspaceRegistry]
35
+ # `pluginManager` is injected for the P1-A Plugin Manager surface: the
36
+ # dsh-base layer already mounts it (disabled only without a profile),
37
+ # so this is an explicit lifecycle ordering dependency, never a second
38
+ # package-manager row.
39
+ inject: [tuiStartup, piTuiExtensions, authorization, workspaceRegistry, pluginManager, jobController]
36
40
  config:
37
41
  sessionId: ''
38
42
 
43
+ # One background Job's observation stream (P1-B): the official Host
44
+ # controller wraps `jobs.events` + `jobs.readAt()` into a
45
+ # NON-CONSUMING follow stream (never `jobs.read()`), so the selected Job
46
+ # detail can render a live retained-output tail without touching the
47
+ # model's `job_output` cursor or completion notices. The rc.1 web bundle
48
+ # mounts this same row; the dsh-base layer does not, so the TUI inserts
49
+ # it. This is NOT M3: same process, same Host Context, no Client Context,
50
+ # no Connection, no transport.
51
+ - id: job-controller
52
+ name: '@deepseek-ai/dsh-api-job-controller'
53
+
39
54
  # Host-owned workspace membership (`ctx.workspaceRegistry`): D2.4 Direct
40
55
  # fork mirrors the official Host rule (use the source's directly owning
41
56
  # workspace, else the nearest ancestor workspace of a subagent source) and
@@ -61,17 +76,52 @@
61
76
  - id: authorization
62
77
  name: '@deepseek-ai/dsh-authorization'
63
78
 
64
- # Official shipped presets are the composition authority. The upstream
65
- # service defaults includeShippedRoot/includeUserRoot to true, so this
66
- # bundle deliberately owns no duplicate standard/ptc/minimal/cordis root.
67
- # DSH's V2→V3 format migration owns historical session preset conversion;
68
- # the settings/default compatibility shim is kept separately at the TUI
69
- # request boundary and does not add another preset row.
70
- - id: agent-presets
71
- name: '@deepseek-ai/dsh-agent-presets'
79
+ # The 0.1.7 declarative preset registry: preset identity, revisions and
80
+ # default/selection policy are registry-owned (deployment `default` here;
81
+ # the user's `selectedDefault` rides the profile form). The four shipped
82
+ # preset declarations follow as separate patch files under
83
+ # generated/dsh-presets/, listed after this file in package.json
84
+ # `dsh.bundle.patch` — a generated, parity-gated byte-exact mirror of
85
+ # @deepseek-ai/dsh-web-app's exported preset assets (0.1.7
86
+ # dsh.bundle.patch cannot reference another package's files).
87
+ - id: agent-preset-registry
88
+ name: '@deepseek-ai/dsh-agent-preset-registry'
72
89
  config:
73
90
  default: standard
74
91
 
92
+ # Production hardening for per-session preset composition. A live Agent
93
+ # whose standing preset generation disappears (the DSH registry owns that
94
+ # lifetime; the TUI must not remount/reparent/recreate an Agent) would
95
+ # otherwise keep addressing the model with only its Agent-own rows — the
96
+ # observed failure mode was a request whose tool list had collapsed to
97
+ # `subagent` alone, with no error anywhere. This official companion turns
98
+ # that into a loud, early failure at the next prompt assembly instead.
99
+ #
100
+ # The allowlist is deliberate and minimal: this bundle introduces exactly
101
+ # ONE production invariant, so a future layer shipping another invariant
102
+ # companion cannot silently enable itself here. The companion's own
103
+ # `/invariant` entry declares `inject = ['invariants']`; no second
104
+ # dependency management is written here.
105
+ #
106
+ # DEPENDENCY CONTRACT: `@deepseek-ai/dsh-invariants` is a COMPOSITION row
107
+ # resolved by the dsh Host (the package ships inside the dsh installation),
108
+ # not a module-graph peer — exactly like `@deepseek-ai/dsh-agent-preset`,
109
+ # which the same rule keeps in devDependencies. It therefore carries an
110
+ # exact devDependency pin for the real-mount tests and deliberately NO
111
+ # peerDependency: `scripts/naming-gate.mjs` rejects a `@deepseek-ai/*` peer
112
+ # that `src/` never imports as a dead peer, and a phantom peer would invite
113
+ # duplicate in-box copies in the profile. The companion subpath below is
114
+ # covered by the registry's own runtime peer.
115
+ - id: invariants
116
+ name: '@deepseek-ai/dsh-invariants'
117
+ config:
118
+ enabled: true
119
+ package_allowlist:
120
+ - '^@deepseek-ai/dsh-agent-preset-registry$'
121
+
122
+ - id: agent-preset-registry-invariant
123
+ name: '@deepseek-ai/dsh-agent-preset-registry/invariant'
124
+
75
125
  # The official standard preset composes its `subagent` tool with
76
126
  # `modelSelectionSettings: true`, which injects this Host-owned setting
77
127
  # service — the row is required for the standard composition to mount.
@@ -94,7 +144,8 @@
94
144
  # its tools, its prompt sections, its delegation backends. The base keeps them
95
145
  # for single-session surfaces that compose their agent process-wide; the TUI
96
146
  # now composes one preset per session, so these rows are disabled here and the
97
- # `agent-presets` row above lets each session mount a preset instead.
147
+ # official `agent-preset-registry` row above, plus the declarations it resolves,
148
+ # lets each session mount a preset instead.
98
149
  #
99
150
  # Disabling rather than deleting is deliberate: the base is shared, and a row
100
151
  # absent from a surface overlay would silently reappear the day someone
package/dist/builtins.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { B as PI_TUI_EXTENSIONS_SERVICE, I as dshVersion } from "./src-5aY9svZj.mjs";
2
- import { n as TUI_STARTUP_SERVICE } from "./startup-CGeJ1k1B.mjs";
1
+ import { L as dshVersion, V as PI_TUI_EXTENSIONS_SERVICE } from "./src-BAwPimrH.mjs";
2
+ import { n as TUI_STARTUP_SERVICE } from "./startup-xTIOW90U.mjs";
3
3
  import { readFileSync } from "node:fs";
4
4
  import { join } from "node:path";
5
5
  //#region src/builtins.ts
@@ -302,7 +302,12 @@ interface AdvancedHostState {
302
302
  setTitle(title: string | undefined): void;
303
303
  /** Override the working-indicator message (undefined clears). */
304
304
  setWorkingMessage(message: string | undefined): void;
305
- /** Set the tool-output expansion master switch. */
305
+ /** Set the transcript-detail bulk-expansion master switch (recent
306
+ * collapsible transcript content). */
307
+ setTranscriptDetailExpanded(expanded: boolean): void;
308
+ /** Set the transcript-detail bulk-expansion master switch.
309
+ * @deprecated Use {@link setTranscriptDetailExpanded} — the same runtime
310
+ * state under its canonical name (post-F6 plan §5.6). */
306
311
  setToolsExpanded(expanded: boolean): void;
307
312
  }
308
313
  /** The full advanced facade (plan §4: `advanced(service)`). */
@@ -1,2 +1,2 @@
1
- import { B as PI_TUI_EXTENSIONS_SERVICE, H as describeKey, L as apply, R as inject, V as API_VERSION, z as name } from "./src-5aY9svZj.mjs";
1
+ import { B as name, H as API_VERSION, R as apply, U as describeKey, V as PI_TUI_EXTENSIONS_SERVICE, z as inject } from "./src-BAwPimrH.mjs";
2
2
  export { API_VERSION, PI_TUI_EXTENSIONS_SERVICE, apply, describeKey, inject, name };