dsh-input-traffic 0.5.3 → 0.5.5

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/CHANGELOG.ja.md CHANGED
@@ -6,6 +6,22 @@
6
6
  - [日本語 changelog](./CHANGELOG.ja.md)
7
7
  - [한국어 changelog](./CHANGELOG.ko.md)
8
8
 
9
+ ## 0.5.5 — 2026-09-30
10
+
11
+ ### 修正: キュー行を inbox プロジェクションから読むよう修正(実機 0.1.7-rc.2 で検証)
12
+
13
+ - 実ホストではキュー行がセッションスナップショットに存在しないため、useProjection('inbox') から読むよう修正(公式 QueueDock と同一)。従来の鏡像フィールド参照は実機で必ずクラッシュし、公式キューへフォールバックしていた。
14
+ - 損壊した「入力へ戻す」ボタンを削除(黄ティアが挿入の唯一の入口)。ティア色をリテラル値に固定(スキンのトークン再定義で黄色が不可視になる問題)。
15
+
16
+ ## 0.5.4 — 2026-09-29
17
+
18
+ ### 修正:0.1.7 ライン devDeps 基線の整合 + dock アイコン描画クラッシュ
19
+
20
+ - 古い devDeps 3 件を 0.1.7 ラインに引き上げ:`client-ui-primitives ^0.0.1-rc.1`(`^0.0.x` は 0.1.x に到達不能)、`client-store` / `util-workspace-path ^0.1.2-alpha.2`(プレリリース解決の滞留)→ すべて `^0.1.7-rc.1`(実装 rc.2)。
21
+ - ソース側も primitives の `*16`/`*14` アイコン export 改名(0.1.7-rc.1 から `*Medium`/`*Regular` 系のみ)に追従:8 か所を `*Medium` に変更。
22
+ - **本バージョンは公開済み 0.5.3 の壊れた tarball を置き換える**:0.5.3 の bundle は primitives 0.1.7 に存在しないアイコン export を外部参照しており、実 0.1.7 ホストで dock 描画が即クラッシュする——陳腐な devDeps ピンがビルド時の偽装グリーンに隠していた。
23
+ - テスト環境の堅牢化:ホスト専用パスのスタブ + micromark/mdast スタックの明示 devDep + `react-dom` を 18 にピン(5 スイート 59 ケースすべて実実行)。
24
+
9
25
  ## 0.2.8 — 2026-08-24
10
26
 
11
27
  ### 追加:日夜モード自動適応
package/CHANGELOG.ko.md CHANGED
@@ -6,6 +6,22 @@
6
6
  - [日本語 changelog](./CHANGELOG.ja.md)
7
7
  - [한국어 changelog](./CHANGELOG.ko.md)
8
8
 
9
+ ## 0.5.5 — 2026-09-30
10
+
11
+ ### 修正: キュー行を inbox プロジェクションから読むよう修正(実機 0.1.7-rc.2 で検証)
12
+
13
+ - 実ホストではキュー行がセッションスナップショットに存在しないため、useProjection('inbox') から読むよう修正(公式 QueueDock と同一)。従来の鏡像フィールド参照は実機で必ずクラッシュし、公式キューへフォールバックしていた。
14
+ - 損壊した「入力へ戻す」ボタンを削除(黄ティアが挿入の唯一の入口)。ティア色をリテラル値に固定(スキンのトークン再定義で黄色が不可視になる問題)。
15
+
16
+ ## 0.5.4 — 2026-09-29
17
+
18
+ ### 수정: 0.1.7 라인 devDeps 기준 정렬 + dock 아이콘 렌더링 크래시
19
+
20
+ - 낡은 devDeps 3건을 0.1.7 라인으로 정렬: `client-ui-primitives ^0.0.1-rc.1`(`^0.0.x`는 0.1.x에 도달 불가), `client-store` / `util-workspace-path ^0.1.2-alpha.2`(프리릴리스 해석 정체) → 모두 `^0.1.7-rc.1`(실설치 rc.2).
21
+ - 소스도 primitives의 `*16`/`*14` 아이콘 export 개명(0.1.7-rc.1부터 `*Medium`/`*Regular` 계열만 존재)에 맞춰 8곳을 `*Medium`으로 변경.
22
+ - **이 버전은 게시된 0.5.3의 깨진 tarball을 대체합니다**: 0.5.3의 bundle은 primitives 0.1.7에 존재하지 않는 아이콘 export를 외부 참조하여, 실 0.1.7 호스트에서 dock 렌더링이 즉시 크래시——낡은 devDeps 고정이 빌드 시점의 가짜 그린으로 가려져 있었습니다.
23
+ - 테스트 환경 강화: 호스트 전용 경로 스텁 + micromark/mdast 스택 명시 devDep + `react-dom` 18 고정(5 스위트 59 케이스 모두 실실행).
24
+
9
25
  ## 0.2.8 — 2026-08-24
10
26
 
11
27
  ### 추가: 주야 모드 자동 적응
package/CHANGELOG.md CHANGED
@@ -2,6 +2,25 @@
2
2
 
3
3
  所有重要变更与 bug 修复记录于此。版本遵循语义化版本(`dsh plugin --profile web add dsh-input-traffic` 安装)。
4
4
 
5
+ ## 0.5.5 — 2026-09-30
6
+
7
+ ### 修复:队列行改读 inbox 投影(真实宿主渲染修复,实测 0.1.7-rc.2)
8
+
9
+ - 真实宿主的排队行不在会话快照上:组件改从 useProjection('inbox') 读取(next-turn=排队/绿档,next-step=插话/黄档),与官方 QueueDock 同源。此前读取的 s.queue 为类型镜像自造字段,行渲染必崩并回退官方队列。
10
+ - queueMutable 与官方判定对齐:continuable 子代理上下文同样可操作(此前整块操作按钮会在子代理会话中消失)。
11
+ - 移除真机上失效的「打回输入框」按钮(setDraft 为未文档化面);黄色档位是唯一插话入口。
12
+ - 行文本改由 content 块派生(textOf,对齐官方 textOf/previewOf),修复行预览空白。
13
+ - 三色档位圆点固定字面量配色:自定义皮肤(如 ui-skin-maid-atelier)重定义 warn 别名 token 会把黄点洗成不可见。
14
+ - CSS 压制官方 QueueDock 容器(仅崩溃回退态的可见性兜底);修复 verify-assembly 陈旧断言(settingsScope → configForms)。
15
+ ## 0.5.4 — 2026-09-29
16
+
17
+ ### 修复:0.1.7 线 devDeps 基线对齐 + dock 图标渲染崩溃
18
+
19
+ - devDeps 三处陈旧钉版拉平到 0.1.7 线:`client-ui-primitives ^0.0.1-rc.1`(`^0.0.x` 永远装不到 0.1.x)、`client-store` / `util-workspace-path ^0.1.2-alpha.2`(预发布解析规则卡死)→ 全部 `^0.1.7-rc.1`(实装 rc.2)。
20
+ - 源码跟进 primitives `*16`/`*14` 图标导出改名(0.1.7-rc.1 起只剩 `*Medium`/`*Regular` 族):8 处改用 `*Medium`。
21
+ - **此版本替换已发布 0.5.3 的坏 tarball**:0.5.3 的 bundle 外部引用了 primitives 0.1.7 中不存在的图标导出名,在真实 0.1.7 宿主上 dock 渲染即崩——陈旧 devDeps 钉版把它掩盖成构建期假绿。
22
+ - 测试环境加固:宿主专属路径桩化 + micromark/mdast 栈显式 devDep + `react-dom` 钉 18(5 套件 59 用例全部真实执行)。
23
+
5
24
  ## 0.4.1 — 2026-09-20
6
25
 
7
26
  ### 修复:等待队列尾部按钮被「调整对话宽度」把手抢走点击
package/dsh.plugin.json CHANGED
@@ -1,16 +1,16 @@
1
- {
2
- "id": "dsh-external/dsh-input-traffic",
3
- "version": "0.5.3",
4
- "main": "./lib/index.js",
5
- "description": "Busy-time input queue: three-tier planning, drag-to-reorder, interject/interrupt, batch clear, session freeze.",
6
- "engines": {
7
- "dsh": ">=0.1.7-rc.1 <0.1.8-0"
8
- },
9
- "contributes": {
10
- "tools": [],
11
- "skills": []
12
- },
13
- "client": {
14
- "main": "./lib/client.js"
15
- }
16
- }
1
+ {
2
+ "id": "dsh-external/dsh-input-traffic",
3
+ "version": "0.5.5",
4
+ "main": "./lib/index.js",
5
+ "description": "Busy-time input queue: three-tier planning, drag-to-reorder, interject/interrupt, batch clear, session freeze.",
6
+ "engines": {
7
+ "dsh": ">=0.1.7-rc.1 <0.1.8-0"
8
+ },
9
+ "contributes": {
10
+ "tools": [],
11
+ "skills": []
12
+ },
13
+ "client": {
14
+ "main": "./lib/client.js"
15
+ }
16
+ }
package/lib/client.js CHANGED
@@ -211,7 +211,7 @@ window.__ModuleLoader__.load({
211
211
  }
212
212
  //#endregion
213
213
  //#region \0dsh-css:E:\test\rewrite-agently\mine-dsh-plugins\dsh-input-traffic\src\client\steer-queue-dock.module.css.mjs
214
- const css$1 = ".FNESVa_dock{box-sizing:border-box;width:min(calc(100% - var(--dsh-composer-side-clearance,16px) - var(--dsh-composer-side-clearance,16px) - var(--dsh-composer-dock-inset,8px) - var(--dsh-composer-dock-inset,8px)), calc(var(--dsh-chat-content-width,100%) - var(--dsh-composer-dock-inset,8px) - var(--dsh-composer-dock-inset,8px)));max-width:calc(var(--dsh-composer-card-max-width,var(--dsh-chat-content-width,100%)) - var(--dsh-composer-dock-inset,8px) - var(--dsh-composer-dock-inset,8px));padding:0 var(--dsh-composer-dock-inset,8px);flex:none;margin:0 auto}.FNESVa_panel{background:var(--dsw-alias-bg-layer-1,#fffc);border:1px solid var(--dsw-alias-border-l2,#00000014);border-radius:10px;overflow:hidden}.FNESVa_toolbar{border-bottom:1px solid var(--dsw-alias-border-l2,#0000000f);align-items:center;gap:8px;padding:4px 8px;display:flex}.FNESVa_header{color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;padding:2px 6px;font-size:12px;display:inline-flex}.FNESVa_header:disabled{cursor:default}.FNESVa_lead{color:var(--dsw-alias-label-tertiary,#9ca3af);display:inline-flex}.FNESVa_count{font-weight:600}.FNESVa_chevron{color:var(--dsw-alias-label-tertiary,#9ca3af);display:inline-flex}.FNESVa_toolbarActions{margin-left:auto}.FNESVa_clear{color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:6px;align-items:center;gap:4px;padding:3px 8px;font-size:12px;display:inline-flex}.FNESVa_freeze{border:1px solid var(--dsw-alias-border-l3,#0000001f);color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;background:0 0;border-radius:6px;align-items:center;gap:4px;padding:3px 8px;font-size:12px;display:inline-flex}.FNESVa_freeze[aria-pressed=true]{border-color:var(--dsw-alias-state-success-primary,#30a46c);color:var(--dsw-alias-state-success-primary,#30a46c)}.FNESVa_freeze:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#0000000a)}.FNESVa_freeze:disabled{opacity:.5;cursor:default}.FNESVa_frozenBanner{border-bottom:1px solid var(--dsw-alias-border-l2,#0000000f);background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#30a46c) 8%, transparent);color:var(--dsw-alias-state-success-primary,#30a46c);padding:4px 10px;font-size:12px}.FNESVa_frozenList{margin:0;padding:4px;list-style:none}.FNESVa_frozenRow{border-radius:6px;align-items:center;gap:8px;padding:4px 6px;display:flex}.FNESVa_frozenMark{color:var(--dsw-alias-label-tertiary,#9ca3af);flex:none;margin-left:auto;font-size:11px}.FNESVa_clear:hover:not(:disabled){border-color:var(--dsw-alias-border-l3,#0000001f);background:var(--dsw-alias-interactive-bg-hover,#0000000a)}.FNESVa_clear:disabled{opacity:.5;cursor:default}.FNESVa_clearConfirm{border-color:var(--dsw-alias-state-error-primary,#e5484d);color:var(--dsw-alias-state-error-primary,#e5484d)}.FNESVa_clearConfirm:hover:not(:disabled){border-color:var(--dsw-alias-state-error-primary,#e5484d);background:color-mix(in srgb, var(--dsw-alias-state-error-primary,#e5484d) 8%, transparent)}.FNESVa_clearCancel{color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:6px;align-items:center;gap:4px;padding:3px 8px;font-size:12px;display:inline-flex}.FNESVa_clearCancel:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#0000000a)}.FNESVa_clearLabel{font-size:12px}.FNESVa_list{margin:0;padding:4px;list-style:none}.FNESVa_row{border-radius:6px;align-items:center;gap:8px;padding:4px 6px;display:flex}.FNESVa_row[draggable=true]{cursor:grab}.FNESVa_row[draggable=true]:active{cursor:grabbing}.FNESVa_rowDragOver{outline:2px dashed var(--dsw-alias-border-l4,#00000040);outline-offset:-2px;background:var(--dsw-alias-interactive-bg-hover,#0000000d)}.FNESVa_row:hover{background:var(--dsw-alias-interactive-bg-hover,#00000008)}.FNESVa_row[data-editing]{align-items:flex-start}.FNESVa_preview{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-primary,#1f2937);flex:1;font-size:13px;overflow:hidden}.FNESVa_badge{white-space:nowrap;border-radius:999px;flex:none;align-items:center;gap:4px;padding:1px 6px;font-size:11px;line-height:16px;display:inline-flex}.FNESVa_badgeLabel{color:inherit}.FNESVa_badgeNow{color:var(--dsw-alias-state-error-primary,#e5484d);background:color-mix(in srgb, var(--dsw-alias-state-error-primary,#e5484d) 10%, transparent)}.FNESVa_badgeNext{color:var(--dsw-alias-state-warn-primary,#e8a33d);background:color-mix(in srgb, var(--dsw-alias-state-warn-primary,#e8a33d) 12%, transparent)}.FNESVa_badgeLater{color:var(--dsw-alias-state-success-primary,#30a46c);background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#30a46c) 12%, transparent)}.FNESVa_badgeNow .FNESVa_dot{background:var(--dsw-alias-state-error-primary,#e5484d)}.FNESVa_badgeNext .FNESVa_dot{background:var(--dsw-alias-state-warn-primary,#e8a33d)}.FNESVa_badgeLater .FNESVa_dot{background:var(--dsw-alias-state-success-primary,#30a46c)}.FNESVa_steeringList{margin:0;padding:0 4px 4px;list-style:none}.FNESVa_steeringList .FNESVa_row{opacity:.85}.FNESVa_editor{border:1px solid var(--dsw-alias-border-l3,#00000026);background:var(--dsw-alias-bg-layer-2,#fff);resize:none;border-radius:6px;flex:1;min-width:0;max-height:160px;padding:4px 6px;font-size:13px;line-height:20px;overflow-y:auto}.FNESVa_actions{align-items:center;gap:2px;display:inline-flex}.FNESVa_action{width:24px;height:24px;color:var(--dsw-alias-label-tertiary,#9ca3af);cursor:pointer;background:0 0;border:0;border-radius:6px;justify-content:center;align-items:center;display:inline-flex}.FNESVa_action:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#0000000d);color:var(--dsw-alias-label-primary,#1f2937)}.FNESVa_action:disabled{opacity:.4;cursor:default}.FNESVa_plan{border-left:1px solid var(--dsw-alias-border-l2,#00000014);align-items:center;gap:2px;margin-left:4px;padding-left:6px;display:inline-flex}.FNESVa_tier{cursor:pointer;background:0 0;border:1px solid #0000;border-radius:6px;justify-content:center;align-items:center;width:20px;height:20px;padding:0;display:inline-flex}.FNESVa_tier:hover:not(:disabled){border-color:var(--dsw-alias-border-l4,#0003)}.FNESVa_tier:disabled{cursor:default}.FNESVa_tierLater{border-color:var(--dsw-alias-state-success-primary,#30a46c);background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#30a46c) 12%, transparent)}.FNESVa_dot{border-radius:50%;width:10px;height:10px}.FNESVa_tierNow .FNESVa_dot{background:var(--dsw-alias-state-error-primary,#e5484d)}.FNESVa_tierNext .FNESVa_dot{background:var(--dsw-alias-state-warn-primary,#e8a33d)}.FNESVa_tierLater .FNESVa_dot{background:var(--dsw-alias-state-success-primary,#30a46c)}";
214
+ const css$1 = ".FNESVa_dock{box-sizing:border-box;width:min(calc(100% - var(--dsh-composer-side-clearance,16px) - var(--dsh-composer-side-clearance,16px) - var(--dsh-composer-dock-inset,8px) - var(--dsh-composer-dock-inset,8px)), calc(var(--dsh-chat-content-width,100%) - var(--dsh-composer-dock-inset,8px) - var(--dsh-composer-dock-inset,8px)));max-width:calc(var(--dsh-composer-card-max-width,var(--dsh-chat-content-width,100%)) - var(--dsh-composer-dock-inset,8px) - var(--dsh-composer-dock-inset,8px));padding:0 var(--dsh-composer-dock-inset,8px);flex:none;margin:0 auto}.FNESVa_panel{background:var(--dsw-alias-bg-layer-1,#fffc);border:1px solid var(--dsw-alias-border-l2,#00000014);border-radius:10px;overflow:hidden}.FNESVa_toolbar{border-bottom:1px solid var(--dsw-alias-border-l2,#0000000f);align-items:center;gap:8px;padding:4px 8px;display:flex}.FNESVa_header{color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;padding:2px 6px;font-size:12px;display:inline-flex}.FNESVa_header:disabled{cursor:default}.FNESVa_lead{color:var(--dsw-alias-label-tertiary,#9ca3af);display:inline-flex}.FNESVa_count{font-weight:600}.FNESVa_chevron{color:var(--dsw-alias-label-tertiary,#9ca3af);display:inline-flex}.FNESVa_toolbarActions{margin-left:auto}.FNESVa_clear{color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:6px;align-items:center;gap:4px;padding:3px 8px;font-size:12px;display:inline-flex}.FNESVa_freeze{border:1px solid var(--dsw-alias-border-l3,#0000001f);color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;background:0 0;border-radius:6px;align-items:center;gap:4px;padding:3px 8px;font-size:12px;display:inline-flex}.FNESVa_freeze[aria-pressed=true]{border-color:var(--dsw-alias-state-success-primary,#30a46c);color:var(--dsw-alias-state-success-primary,#30a46c)}.FNESVa_freeze:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#0000000a)}.FNESVa_freeze:disabled{opacity:.5;cursor:default}.FNESVa_frozenBanner{border-bottom:1px solid var(--dsw-alias-border-l2,#0000000f);background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#30a46c) 8%, transparent);color:var(--dsw-alias-state-success-primary,#30a46c);padding:4px 10px;font-size:12px}.FNESVa_frozenList{margin:0;padding:4px;list-style:none}.FNESVa_frozenRow{border-radius:6px;align-items:center;gap:8px;padding:4px 6px;display:flex}.FNESVa_frozenMark{color:var(--dsw-alias-label-tertiary,#9ca3af);flex:none;margin-left:auto;font-size:11px}.FNESVa_clear:hover:not(:disabled){border-color:var(--dsw-alias-border-l3,#0000001f);background:var(--dsw-alias-interactive-bg-hover,#0000000a)}.FNESVa_clear:disabled{opacity:.5;cursor:default}.FNESVa_clearConfirm{border-color:var(--dsw-alias-state-error-primary,#e5484d);color:var(--dsw-alias-state-error-primary,#e5484d)}.FNESVa_clearConfirm:hover:not(:disabled){border-color:var(--dsw-alias-state-error-primary,#e5484d);background:color-mix(in srgb, var(--dsw-alias-state-error-primary,#e5484d) 8%, transparent)}.FNESVa_clearCancel{color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:6px;align-items:center;gap:4px;padding:3px 8px;font-size:12px;display:inline-flex}.FNESVa_clearCancel:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#0000000a)}.FNESVa_clearLabel{font-size:12px}.FNESVa_list{margin:0;padding:4px;list-style:none}.FNESVa_row{border-radius:6px;align-items:center;gap:8px;padding:4px 6px;display:flex}.FNESVa_row[draggable=true]{cursor:grab}.FNESVa_row[draggable=true]:active{cursor:grabbing}.FNESVa_rowDragOver{outline:2px dashed var(--dsw-alias-border-l4,#00000040);outline-offset:-2px;background:var(--dsw-alias-interactive-bg-hover,#0000000d)}.FNESVa_row:hover{background:var(--dsw-alias-interactive-bg-hover,#00000008)}.FNESVa_row[data-editing]{align-items:flex-start}.FNESVa_preview{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-primary,#1f2937);flex:1;font-size:13px;overflow:hidden}.FNESVa_badge{white-space:nowrap;border-radius:999px;flex:none;align-items:center;gap:4px;padding:1px 6px;font-size:11px;line-height:16px;display:inline-flex}.FNESVa_badgeLabel{color:inherit}.FNESVa_badgeNow{color:var(--dsw-alias-state-error-primary,#e5484d);background:color-mix(in srgb, var(--dsw-alias-state-error-primary,#e5484d) 10%, transparent)}.FNESVa_badgeNext{color:var(--dsw-alias-state-warn-primary,#e8a33d);background:color-mix(in srgb, var(--dsw-alias-state-warn-primary,#e8a33d) 12%, transparent)}.FNESVa_badgeLater{color:var(--dsw-alias-state-success-primary,#30a46c);background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#30a46c) 12%, transparent)}.FNESVa_badgeNow .FNESVa_dot{background:var(--dsw-alias-state-error-primary,#e5484d)}.FNESVa_badgeNext .FNESVa_dot{background:var(--dsw-alias-state-warn-primary,#e8a33d)}.FNESVa_badgeLater .FNESVa_dot{background:var(--dsw-alias-state-success-primary,#30a46c)}.FNESVa_steeringList{margin:0;padding:0 4px 4px;list-style:none}.FNESVa_steeringList .FNESVa_row{opacity:.85}.FNESVa_editor{border:1px solid var(--dsw-alias-border-l3,#00000026);background:var(--dsw-alias-bg-layer-2,#fff);resize:none;border-radius:6px;flex:1;min-width:0;max-height:160px;padding:4px 6px;font-size:13px;line-height:20px;overflow-y:auto}.FNESVa_actions{align-items:center;gap:2px;display:inline-flex}.FNESVa_action{width:24px;height:24px;color:var(--dsw-alias-label-tertiary,#9ca3af);cursor:pointer;background:0 0;border:0;border-radius:6px;justify-content:center;align-items:center;display:inline-flex}.FNESVa_action:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#0000000d);color:var(--dsw-alias-label-primary,#1f2937)}.FNESVa_action:disabled{opacity:.4;cursor:default}.FNESVa_plan{border-left:1px solid var(--dsw-alias-border-l2,#00000014);align-items:center;gap:2px;margin-left:4px;padding-left:6px;display:inline-flex}.FNESVa_tier{cursor:pointer;background:0 0;border:1px solid #0000;border-radius:6px;justify-content:center;align-items:center;width:20px;height:20px;padding:0;display:inline-flex}.FNESVa_tier:hover:not(:disabled){border-color:var(--dsw-alias-border-l4,#0003)}.FNESVa_tier:disabled{cursor:default}.FNESVa_tierNow{background:#e5484d1f;border-color:#e5484d}.FNESVa_tierNext{background:#e8a33d1f;border-color:#e8a33d}.FNESVa_tierLater{border-color:var(--dsw-alias-state-success-primary,#30a46c);background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#30a46c) 12%, transparent)}.FNESVa_dot{border-radius:50%;width:10px;height:10px}.FNESVa_tierNow .FNESVa_dot{background:#e5484d}.FNESVa_tierNext .FNESVa_dot{background:#e8a33d}.FNESVa_tierLater .FNESVa_dot{background:#30a46c}";
215
215
  const tagId$1 = "dsh-input-traffic/steer-queue-dock.module.css";
216
216
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
217
217
  const tag = document.createElement("style");
@@ -222,41 +222,41 @@ window.__ModuleLoader__.load({
222
222
  }
223
223
  var steer_queue_dock_module_css_default = {
224
224
  "frozenRow": "FNESVa_frozenRow",
225
- "toolbarActions": "FNESVa_toolbarActions",
226
- "chevron": "FNESVa_chevron",
227
- "frozenList": "FNESVa_frozenList",
225
+ "tier": "FNESVa_tier",
226
+ "tierNext": "FNESVa_tierNext",
228
227
  "editor": "FNESVa_editor",
229
- "list": "FNESVa_list",
230
- "badgeLater": "FNESVa_badgeLater",
231
- "clearConfirm": "FNESVa_clearConfirm",
232
- "tierNow": "FNESVa_tierNow",
233
- "clearCancel": "FNESVa_clearCancel",
234
- "clearLabel": "FNESVa_clearLabel",
235
- "plan": "FNESVa_plan",
236
- "preview": "FNESVa_preview",
237
- "badgeNow": "FNESVa_badgeNow",
238
228
  "dock": "FNESVa_dock",
239
- "toolbar": "FNESVa_toolbar",
229
+ "actions": "FNESVa_actions",
230
+ "freeze": "FNESVa_freeze",
240
231
  "action": "FNESVa_action",
232
+ "steeringList": "FNESVa_steeringList",
233
+ "clearConfirm": "FNESVa_clearConfirm",
241
234
  "tierLater": "FNESVa_tierLater",
242
- "row": "FNESVa_row",
243
- "count": "FNESVa_count",
244
- "tier": "FNESVa_tier",
235
+ "frozenList": "FNESVa_frozenList",
236
+ "plan": "FNESVa_plan",
237
+ "badgeNext": "FNESVa_badgeNext",
238
+ "toolbar": "FNESVa_toolbar",
239
+ "list": "FNESVa_list",
240
+ "chevron": "FNESVa_chevron",
241
+ "frozenMark": "FNESVa_frozenMark",
242
+ "frozenBanner": "FNESVa_frozenBanner",
243
+ "badge": "FNESVa_badge",
245
244
  "header": "FNESVa_header",
245
+ "clearCancel": "FNESVa_clearCancel",
246
+ "clearLabel": "FNESVa_clearLabel",
246
247
  "panel": "FNESVa_panel",
247
- "freeze": "FNESVa_freeze",
248
+ "rowDragOver": "FNESVa_rowDragOver",
249
+ "preview": "FNESVa_preview",
248
250
  "badgeLabel": "FNESVa_badgeLabel",
249
- "steeringList": "FNESVa_steeringList",
251
+ "badgeLater": "FNESVa_badgeLater",
250
252
  "lead": "FNESVa_lead",
251
- "actions": "FNESVa_actions",
252
- "dot": "FNESVa_dot",
253
- "badgeNext": "FNESVa_badgeNext",
254
253
  "clear": "FNESVa_clear",
255
- "rowDragOver": "FNESVa_rowDragOver",
256
- "frozenBanner": "FNESVa_frozenBanner",
257
- "frozenMark": "FNESVa_frozenMark",
258
- "tierNext": "FNESVa_tierNext",
259
- "badge": "FNESVa_badge"
254
+ "tierNow": "FNESVa_tierNow",
255
+ "dot": "FNESVa_dot",
256
+ "row": "FNESVa_row",
257
+ "badgeNow": "FNESVa_badgeNow",
258
+ "count": "FNESVa_count",
259
+ "toolbarActions": "FNESVa_toolbarActions"
260
260
  };
261
261
  //#endregion
262
262
  //#region src/client/steer-queue-dock.tsx
@@ -285,6 +285,22 @@ window.__ModuleLoader__.load({
285
285
  * run while preserving the queue (keepInbox), resume re-arms the driver by
286
286
  * re-sending the first queued row so the preserved work continues.
287
287
  */
288
+ /**
289
+ * Suppress the OFFICIAL queue dock entirely: our shadowing entry owns the
290
+ * `queue` cell, so the official dock is only ever mounted as a crash fallback
291
+ * — and its per-row 插话发送 duplicates our yellow tier. Hide the whole
292
+ * container by its css-module class (the `_7yHdaG` hash is baked into the
293
+ * host build and stable across restarts), plus the aria-label match as a
294
+ * second net in case the host rehashes.
295
+ */
296
+ const HIDE_OFFICIAL_QUEUE_CSS = "[class*=\"_7yHdaG_dock\"]{display:none!important}";
297
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"dsh-input-traffic/hide-official-steer\"]") === null) {
298
+ const tag = document.createElement("style");
299
+ tag.dataset.plugin = "dsh-input-traffic";
300
+ tag.dataset.pluginCss = "dsh-input-traffic/hide-official-steer";
301
+ tag.textContent = HIDE_OFFICIAL_QUEUE_CSS;
302
+ document.head.appendChild(tag);
303
+ }
288
304
  /** Busy marker for a whole-queue rebuild (reorder); locks every row action. */
289
305
  const REORDER_MARK = "__reorder__";
290
306
  /** localStorage key for the manual collapse state (dsh-queue-plus parity). */
@@ -311,15 +327,33 @@ window.__ModuleLoader__.load({
311
327
  el.style.height = `${el.scrollHeight}px`;
312
328
  }
313
329
  /**
330
+ * Concatenate a queued row's text blocks; null when the row carries anything
331
+ * non-text (attachments) or no content — mirrors the host queue dock's own
332
+ * helper (ui-conversation client.js `textOf`). Wire rows do NOT carry a
333
+ * `.text` field; the text lives in `content` blocks.
334
+ */
335
+ function textOf(content) {
336
+ if (content === void 0 || content.length === 0) return null;
337
+ if (!content.every((block) => block.type === "text")) return null;
338
+ const joined = content.map((block) => block.text ?? "").join("");
339
+ return joined === "" ? null : joined;
340
+ }
341
+ /**
314
342
  * Queue strip with three-tier planning: one item renders directly; multiple
315
343
  * items default to a collapsible count header; an empty queue renders nothing.
316
344
  */
317
- function SteerQueueDock({ sessionId, useSession, input, updateQueue, cancel, send, setDraft, notify, t }) {
318
- const inbox = useSession((s) => s.queue);
319
- const queue = (0, react.useMemo)(() => inbox.filter((row) => row.placement === "queued"), [inbox]);
320
- const steering = (0, react.useMemo)(() => inbox.filter((row) => row.placement === "steering"), [inbox]);
345
+ function SteerQueueDock({ sessionId, useSession, useProjection, input, updateQueue, cancel, send, setDraft, notify, t }) {
346
+ const inbox = useProjection("inbox");
347
+ const queue = (0, react.useMemo)(() => (inbox?.["next-turn"] ?? []).map((row) => ({
348
+ ...row,
349
+ text: textOf(row.content) ?? row.text ?? null
350
+ })), [inbox]);
351
+ const steering = (0, react.useMemo)(() => (inbox?.["next-step"] ?? []).map((row) => ({
352
+ ...row,
353
+ text: textOf(row.content) ?? row.text ?? null
354
+ })), [inbox]);
321
355
  const running = useSession((s) => s.running);
322
- const queueMutable = useSession((s) => s.subagent === null);
356
+ const queueMutable = useSession((s) => s.subagent === null || s.subagent.address.mode === "continuable");
323
357
  const [editing, setEditing] = (0, react.useState)(null);
324
358
  const [busy, setBusy] = (0, react.useState)(null);
325
359
  const [clearing, setClearing] = (0, react.useState)(false);
@@ -369,7 +403,6 @@ window.__ModuleLoader__.load({
369
403
  const planDisabled = !queueMutable || !running || frozen;
370
404
  const nothingPending = queue.length === 0 && steering.length === 0;
371
405
  const reorderUnsupported = queue.some((row) => row.text === null);
372
- const composerEmpty = input.draft.trim() === "";
373
406
  const applyAction = async (itemId, action, failure) => {
374
407
  setBusy(itemId);
375
408
  try {
@@ -383,7 +416,7 @@ window.__ModuleLoader__.load({
383
416
  }
384
417
  };
385
418
  const saveEdit = async () => {
386
- if (editing === null || editing.text.trim() === "") return;
419
+ if (editing === null || typeof editing.text !== "string" || editing.text.trim() === "") return;
387
420
  const itemId = editing.id;
388
421
  const text = editing.text;
389
422
  setBusy(itemId);
@@ -527,23 +560,6 @@ window.__ModuleLoader__.load({
527
560
  updatePendingAt(sid, index, text);
528
561
  setEditing(null);
529
562
  };
530
- /**
531
- * Pull one queued row back into the composer draft for editing: the text
532
- * back-fills the input box and the row leaves the queue; the user edits and
533
- * resubmits it as a fresh message.
534
- */
535
- const pullBackToComposer = async (row) => {
536
- if (row.text === null) return;
537
- setDraft(row.text);
538
- setBusy(row.id);
539
- try {
540
- await updateQueue(row.id, { kind: "remove" });
541
- } catch {
542
- notify("error", t("steer.pullBackFailed"));
543
- } finally {
544
- setBusy((current) => current === row.id ? null : current);
545
- }
546
- };
547
563
  const clearAll = async () => {
548
564
  setClearing(true);
549
565
  const pending = [...queue, ...steering];
@@ -577,7 +593,7 @@ window.__ModuleLoader__.load({
577
593
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
578
594
  className: steer_queue_dock_module_css_default.lead,
579
595
  "aria-hidden": true,
580
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconQueueOutline14, {})
596
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconQueueOutlineMedium, {})
581
597
  }),
582
598
  queue.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
583
599
  className: steer_queue_dock_module_css_default.count,
@@ -586,7 +602,7 @@ window.__ModuleLoader__.load({
586
602
  queue.length > 1 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
587
603
  className: steer_queue_dock_module_css_default.chevron,
588
604
  "aria-hidden": true,
589
- children: expanded ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, {}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronUpOutline14, {})
605
+ children: expanded ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutlineMedium, {}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronUpOutlineMedium, {})
590
606
  })
591
607
  ]
592
608
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -611,7 +627,7 @@ window.__ModuleLoader__.load({
611
627
  "aria-label": confirmClear ? t("steer.clear.confirm") : t("steer.clear"),
612
628
  disabled: clearing || busy !== null || nothingPending,
613
629
  onClick: armClear,
614
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconTrashOutline16, { size: 14 }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
630
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconTrashOutlineMedium, { size: 14 }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
615
631
  className: steer_queue_dock_module_css_default.clearLabel,
616
632
  children: confirmClear ? t("steer.clear.confirm") : t("steer.clear")
617
633
  })]
@@ -662,7 +678,7 @@ window.__ModuleLoader__.load({
662
678
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
663
679
  className: steer_queue_dock_module_css_default.lead,
664
680
  "aria-hidden": true,
665
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconQueueOutline14, {})
681
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconQueueOutlineMedium, {})
666
682
  }),
667
683
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SteerBadge, {
668
684
  tier: entry.tier === "force" ? "now" : entry.tier === "safe_point" ? "next" : "later",
@@ -712,7 +728,7 @@ window.__ModuleLoader__.load({
712
728
  onClick: () => {
713
729
  saveFrozenEdit(i);
714
730
  },
715
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCheckOutline16, { size: 14 })
731
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCheckOutlineMedium, { size: 14 })
716
732
  })
717
733
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
718
734
  label: t("queue.cancelEdit"),
@@ -725,7 +741,7 @@ window.__ModuleLoader__.load({
725
741
  onClick: () => {
726
742
  setEditing(null);
727
743
  },
728
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCloseOutline16, { size: 14 })
744
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCloseOutlineMedium, { size: 14 })
729
745
  })
730
746
  })] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
731
747
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
@@ -739,7 +755,7 @@ window.__ModuleLoader__.load({
739
755
  "aria-label": t("steer.moveUp"),
740
756
  disabled: i === 0,
741
757
  onClick: () => movePending(sid, i, i - 1),
742
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronUpOutline14, {})
758
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronUpOutlineMedium, {})
743
759
  })
744
760
  }),
745
761
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
@@ -753,7 +769,7 @@ window.__ModuleLoader__.load({
753
769
  "aria-label": t("steer.moveDown"),
754
770
  disabled: i === frozenPending.length - 1,
755
771
  onClick: () => movePending(sid, i, i + 1),
756
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, {})
772
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutlineMedium, {})
757
773
  })
758
774
  }),
759
775
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
@@ -770,7 +786,7 @@ window.__ModuleLoader__.load({
770
786
  text
771
787
  });
772
788
  },
773
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconEditOutline16, { size: 14 })
789
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconEditOutlineMedium, { size: 14 })
774
790
  })
775
791
  }),
776
792
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
@@ -782,7 +798,7 @@ window.__ModuleLoader__.load({
782
798
  className: steer_queue_dock_module_css_default.action,
783
799
  "aria-label": t("queue.remove"),
784
800
  onClick: () => removePendingAt(sid, i),
785
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconTrashOutline16, { size: 14 })
801
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconTrashOutlineMedium, { size: 14 })
786
802
  })
787
803
  }),
788
804
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
@@ -885,7 +901,7 @@ window.__ModuleLoader__.load({
885
901
  queue.length === 1 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
886
902
  className: steer_queue_dock_module_css_default.lead,
887
903
  "aria-hidden": true,
888
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconQueueOutline14, {})
904
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconQueueOutlineMedium, {})
889
905
  }),
890
906
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SteerBadge, {
891
907
  tier: badgeFor("queued"),
@@ -919,7 +935,7 @@ window.__ModuleLoader__.load({
919
935
  }
920
936
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
921
937
  className: steer_queue_dock_module_css_default.preview,
922
- children: row.preview
938
+ children: row.text
923
939
  }),
924
940
  queueMutable && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
925
941
  className: steer_queue_dock_module_css_default.actions,
@@ -935,7 +951,7 @@ window.__ModuleLoader__.load({
935
951
  onClick: () => {
936
952
  saveEdit();
937
953
  },
938
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCheckOutline16, { size: 14 })
954
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCheckOutlineMedium, { size: 14 })
939
955
  })
940
956
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
941
957
  label: t("queue.cancelEdit"),
@@ -949,7 +965,7 @@ window.__ModuleLoader__.load({
949
965
  onClick: () => {
950
966
  setEditing(null);
951
967
  },
952
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCloseOutline16, { size: 14 })
968
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCloseOutlineMedium, { size: 14 })
953
969
  })
954
970
  })] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
955
971
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
@@ -966,7 +982,7 @@ window.__ModuleLoader__.load({
966
982
  onClick: () => {
967
983
  reorder(row.id, -1);
968
984
  },
969
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronUpOutline14, {})
985
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronUpOutlineMedium, {})
970
986
  })
971
987
  }),
972
988
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
@@ -983,24 +999,7 @@ window.__ModuleLoader__.load({
983
999
  onClick: () => {
984
1000
  reorder(row.id, 1);
985
1001
  },
986
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, {})
987
- })
988
- }),
989
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
990
- label: t("steer.pullBack"),
991
- side: "bottom",
992
- delayMs: 500,
993
- disabled: row.text === null || !composerEmpty,
994
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
995
- type: "button",
996
- className: steer_queue_dock_module_css_default.action,
997
- "aria-label": t("steer.pullBack"),
998
- title: row.text === null ? t("steer.pullBack.unsupported") : !composerEmpty ? t("steer.pullBack.composerBusy") : void 0,
999
- disabled: busy !== null || frozen || row.text === null || !composerEmpty,
1000
- onClick: () => {
1001
- pullBackToComposer(row);
1002
- },
1003
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconRightUpOutline16, {})
1002
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutlineMedium, {})
1004
1003
  })
1005
1004
  }),
1006
1005
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
@@ -1017,10 +1016,10 @@ window.__ModuleLoader__.load({
1017
1016
  onClick: () => {
1018
1017
  if (row.text !== null) setEditing({
1019
1018
  id: row.id,
1020
- text: row.text
1019
+ text: row.text ?? ""
1021
1020
  });
1022
1021
  },
1023
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconEditOutline16, { size: 14 })
1022
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconEditOutlineMedium, { size: 14 })
1024
1023
  })
1025
1024
  }),
1026
1025
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
@@ -1035,7 +1034,7 @@ window.__ModuleLoader__.load({
1035
1034
  onClick: () => {
1036
1035
  applyAction(row.id, { kind: "remove" }, t("queue.removeFailed"));
1037
1036
  },
1038
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconTrashOutline16, { size: 14 })
1037
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconTrashOutlineMedium, { size: 14 })
1039
1038
  })
1040
1039
  }),
1041
1040
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
@@ -1117,7 +1116,7 @@ window.__ModuleLoader__.load({
1117
1116
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1118
1117
  className: steer_queue_dock_module_css_default.lead,
1119
1118
  "aria-hidden": true,
1120
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconQueueOutline14, {})
1119
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconQueueOutlineMedium, {})
1121
1120
  }),
1122
1121
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SteerBadge, {
1123
1122
  tier: badgeFor("steering"),
@@ -1125,7 +1124,7 @@ window.__ModuleLoader__.load({
1125
1124
  }),
1126
1125
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1127
1126
  className: steer_queue_dock_module_css_default.preview,
1128
- children: row.preview
1127
+ children: row.text
1129
1128
  }),
1130
1129
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1131
1130
  className: steer_queue_dock_module_css_default.actions,
@@ -1235,8 +1234,8 @@ window.__ModuleLoader__.load({
1235
1234
  document.head.appendChild(tag);
1236
1235
  }
1237
1236
  var freeze_button_module_css_default = {
1238
- "label": "BUSMDW_label",
1239
- "freeze": "BUSMDW_freeze"
1237
+ "freeze": "BUSMDW_freeze",
1238
+ "label": "BUSMDW_label"
1240
1239
  };
1241
1240
  //#endregion
1242
1241
  //#region src/client/freeze-button.tsx
@@ -1261,16 +1260,20 @@ window.__ModuleLoader__.load({
1261
1260
  * Freeze/resume toggle for the peak-hour scenario.
1262
1261
  * @param props - slot props; the session snapshot drives the detach list.
1263
1262
  */
1264
- function FreezeButton({ useSession, updateQueue, cancel, send, sendSteer, sessionId, setComposerBlock, notify, t }) {
1263
+ function FreezeButton({ useProjection, updateQueue, cancel, send, sendSteer, sessionId, setComposerBlock, notify, t }) {
1265
1264
  const sid = sessionId ?? "";
1266
1265
  const { frozen } = (0, react.useSyncExternalStore)(freezeStore.subscribe, () => freezeStore.getSnapshot(sid));
1267
- const queue = useSession((s) => s.queue);
1266
+ const inbox = useProjection("inbox");
1268
1267
  const freeze = async () => {
1269
- const rows = queue.filter((row) => row.placement === "queued" || row.placement === "steering");
1270
- const pending = rows.flatMap((row) => row.text === null ? [] : [{
1268
+ const steeredIds = new Set((inbox?.["next-step"] ?? []).map((row) => row.id));
1269
+ const rows = [...inbox?.["next-turn"] ?? [], ...inbox?.["next-step"] ?? []].map((row) => ({
1270
+ ...row,
1271
+ text: textOf(row.content) ?? row.text ?? null
1272
+ }));
1273
+ const pending = rows.flatMap((row) => typeof row.text === "string" && row.text !== "" ? [{
1271
1274
  text: row.text,
1272
- tier: row.placement === "steering" ? "safe_point" : "queue"
1273
- }]);
1275
+ tier: steeredIds.has(row.id) ? "safe_point" : "queue"
1276
+ }] : []);
1274
1277
  await Promise.all(rows.map((row) => updateQueue(row.id, { kind: "remove" }).catch(() => void 0)));
1275
1278
  freezeStore.set(sid, {
1276
1279
  frozen: true,
@@ -1373,8 +1376,9 @@ window.__ModuleLoader__.load({
1373
1376
  *
1374
1377
  * List rows render sorted by `order` ascending, so a value above every other
1375
1378
  * contributor keeps the strip as the bottom-most entry of the band — directly
1376
- * on top of the composer card. Known contributors on 0.1.5-rc.2: `todo` 0,
1377
- * `goal` 10, official `queue` 20, `dsh-perm-gate.notice` 30. DSH has no "last"
1379
+ * on top of the composer card. Known contributors (stable across hosts
1380
+ * 0.1.5-rc.1 → 0.2.0-rc.2): `todo` 0, official `queue` 20,
1381
+ * `dsh-perm-gate.notice` 30, `dsh-tidy-display-entry` 0. DSH has no "last"
1378
1382
  * slot semantics, so this is a convention, not a
1379
1383
  * structural guarantee: a third party registering a larger value could still
1380
1384
  * land below us.