dsh-input-traffic 0.5.4 → 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 +7 -0
- package/CHANGELOG.ko.md +7 -0
- package/CHANGELOG.md +10 -0
- package/dsh.plugin.json +1 -1
- package/lib/client.js +84 -80
- package/lib/client.js.map +1 -1
- package/lib/types/client/freeze-button.d.ts +3 -3
- package/lib/types/client/freeze-button.d.ts.map +1 -1
- package/lib/types/client/freeze-button.js +12 -4
- package/lib/types/client/freeze-button.js.map +1 -1
- package/lib/types/client/index.d.ts +12 -7
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/index.js +3 -2
- package/lib/types/client/index.js.map +1 -1
- package/lib/types/client/steer-queue-dock.d.ts +11 -1
- package/lib/types/client/steer-queue-dock.d.ts.map +1 -1
- package/lib/types/client/steer-queue-dock.js +53 -36
- package/lib/types/client/steer-queue-dock.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.ja.md
CHANGED
|
@@ -6,6 +6,13 @@
|
|
|
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
|
+
|
|
9
16
|
## 0.5.4 — 2026-09-29
|
|
10
17
|
|
|
11
18
|
### 修正:0.1.7 ライン devDeps 基線の整合 + dock アイコン描画クラッシュ
|
package/CHANGELOG.ko.md
CHANGED
|
@@ -6,6 +6,13 @@
|
|
|
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
|
+
|
|
9
16
|
## 0.5.4 — 2026-09-29
|
|
10
17
|
|
|
11
18
|
### 수정: 0.1.7 라인 devDeps 기준 정렬 + dock 아이콘 렌더링 크래시
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,16 @@
|
|
|
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)。
|
|
5
15
|
## 0.5.4 — 2026-09-29
|
|
6
16
|
|
|
7
17
|
### 修复:0.1.7 线 devDeps 基线对齐 + dock 图标渲染崩溃
|
package/dsh.plugin.json
CHANGED
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
|
|
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");
|
|
@@ -221,42 +221,42 @@ window.__ModuleLoader__.load({
|
|
|
221
221
|
document.head.appendChild(tag);
|
|
222
222
|
}
|
|
223
223
|
var steer_queue_dock_module_css_default = {
|
|
224
|
-
"
|
|
225
|
-
"clearConfirm": "FNESVa_clearConfirm",
|
|
226
|
-
"preview": "FNESVa_preview",
|
|
227
|
-
"tierNow": "FNESVa_tierNow",
|
|
228
|
-
"dock": "FNESVa_dock",
|
|
229
|
-
"frozenList": "FNESVa_frozenList",
|
|
230
|
-
"badgeNow": "FNESVa_badgeNow",
|
|
231
|
-
"toolbarActions": "FNESVa_toolbarActions",
|
|
232
|
-
"badgeLater": "FNESVa_badgeLater",
|
|
233
|
-
"header": "FNESVa_header",
|
|
234
|
-
"rowDragOver": "FNESVa_rowDragOver",
|
|
235
|
-
"actions": "FNESVa_actions",
|
|
224
|
+
"frozenRow": "FNESVa_frozenRow",
|
|
236
225
|
"tier": "FNESVa_tier",
|
|
237
|
-
"
|
|
238
|
-
"chevron": "FNESVa_chevron",
|
|
239
|
-
"dot": "FNESVa_dot",
|
|
240
|
-
"toolbar": "FNESVa_toolbar",
|
|
241
|
-
"clearCancel": "FNESVa_clearCancel",
|
|
242
|
-
"count": "FNESVa_count",
|
|
243
|
-
"row": "FNESVa_row",
|
|
244
|
-
"plan": "FNESVa_plan",
|
|
226
|
+
"tierNext": "FNESVa_tierNext",
|
|
245
227
|
"editor": "FNESVa_editor",
|
|
228
|
+
"dock": "FNESVa_dock",
|
|
229
|
+
"actions": "FNESVa_actions",
|
|
246
230
|
"freeze": "FNESVa_freeze",
|
|
247
|
-
"
|
|
248
|
-
"frozenBanner": "FNESVa_frozenBanner",
|
|
249
|
-
"frozenMark": "FNESVa_frozenMark",
|
|
231
|
+
"action": "FNESVa_action",
|
|
250
232
|
"steeringList": "FNESVa_steeringList",
|
|
233
|
+
"clearConfirm": "FNESVa_clearConfirm",
|
|
234
|
+
"tierLater": "FNESVa_tierLater",
|
|
235
|
+
"frozenList": "FNESVa_frozenList",
|
|
236
|
+
"plan": "FNESVa_plan",
|
|
251
237
|
"badgeNext": "FNESVa_badgeNext",
|
|
238
|
+
"toolbar": "FNESVa_toolbar",
|
|
239
|
+
"list": "FNESVa_list",
|
|
240
|
+
"chevron": "FNESVa_chevron",
|
|
241
|
+
"frozenMark": "FNESVa_frozenMark",
|
|
242
|
+
"frozenBanner": "FNESVa_frozenBanner",
|
|
252
243
|
"badge": "FNESVa_badge",
|
|
253
|
-
"
|
|
244
|
+
"header": "FNESVa_header",
|
|
245
|
+
"clearCancel": "FNESVa_clearCancel",
|
|
254
246
|
"clearLabel": "FNESVa_clearLabel",
|
|
247
|
+
"panel": "FNESVa_panel",
|
|
248
|
+
"rowDragOver": "FNESVa_rowDragOver",
|
|
249
|
+
"preview": "FNESVa_preview",
|
|
255
250
|
"badgeLabel": "FNESVa_badgeLabel",
|
|
256
|
-
"
|
|
251
|
+
"badgeLater": "FNESVa_badgeLater",
|
|
257
252
|
"lead": "FNESVa_lead",
|
|
258
|
-
"
|
|
259
|
-
"
|
|
253
|
+
"clear": "FNESVa_clear",
|
|
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 =
|
|
319
|
-
const queue = (0, react.useMemo)(() => inbox.
|
|
320
|
-
|
|
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];
|
|
@@ -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.
|
|
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,
|
|
@@ -986,23 +1002,6 @@ window.__ModuleLoader__.load({
|
|
|
986
1002
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutlineMedium, {})
|
|
987
1003
|
})
|
|
988
1004
|
}),
|
|
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.IconRightUpOutlineMedium, {})
|
|
1004
|
-
})
|
|
1005
|
-
}),
|
|
1006
1005
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
|
|
1007
1006
|
label: t("queue.edit"),
|
|
1008
1007
|
side: "bottom",
|
|
@@ -1017,7 +1016,7 @@ 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
1022
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconEditOutlineMedium, { size: 14 })
|
|
@@ -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.
|
|
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,
|
|
@@ -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({
|
|
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
|
|
1266
|
+
const inbox = useProjection("inbox");
|
|
1268
1267
|
const freeze = async () => {
|
|
1269
|
-
const
|
|
1270
|
-
const
|
|
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.
|
|
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
|
|
1377
|
-
* `
|
|
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.
|