dsh-input-traffic 0.2.7 → 0.2.8
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 +9 -0
- package/README.md +10 -1
- package/lib/client.js +35 -62
- package/lib/client.js.map +1 -1
- package/lib/types/client/auto-continue-core.d.ts +103 -0
- package/lib/types/client/auto-continue-core.d.ts.map +1 -0
- package/lib/types/client/auto-continue-core.js +131 -0
- package/lib/types/client/auto-continue-core.js.map +1 -0
- package/lib/types/client/auto-continue-store.d.ts +41 -0
- package/lib/types/client/auto-continue-store.d.ts.map +1 -0
- package/lib/types/client/auto-continue-store.js +93 -0
- package/lib/types/client/auto-continue-store.js.map +1 -0
- package/lib/types/client/freeze-button.d.ts +1 -1
- package/lib/types/client/freeze-button.d.ts.map +1 -1
- package/lib/types/client/freeze-button.js +9 -15
- package/lib/types/client/freeze-button.js.map +1 -1
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/index.js +0 -21
- package/lib/types/client/index.js.map +1 -1
- package/lib/types/client/steer-queue-dock.d.ts +0 -2
- package/lib/types/client/steer-queue-dock.d.ts.map +1 -1
- package/lib/types/client/steer-queue-dock.js.map +1 -1
- package/package.json +104 -104
package/README.en.md
CHANGED
|
@@ -31,6 +31,7 @@ A cordis client plugin assembled via the `dsh plugin` command and a bundle patch
|
|
|
31
31
|
- **Edits are never lost**: if saving an edit fails (the agent already claimed the message), the edited content automatically moves back to the composer; an occupied draft is never overwritten.
|
|
32
32
|
- **Peak-hour freeze**: a "Freeze session" button on the composer's right — near DeepSeek peak pricing hours (09:00-12:00, 14:00-18:00) it pauses API consumption: the current turn finishes naturally, then the unsent queue is frozen; "Resume session" continues during off-peak hours.
|
|
33
33
|
- **Official behavior takeover**: while the plugin is mounted, the official "busy-Enter behavior" settings row is hidden (Enter stays queue-later).
|
|
34
|
+
- **Day/night auto-adapt**: the dock and the freeze button use dsh's official semantic tokens (`--dsw-alias-*`) exclusively, so they follow the system dark mode / dsh dark theme automatically — in dark mode they switch to a **dark-gray surface with inverted (white) text**, with no configuration (see "Day/night mode").
|
|
34
35
|
|
|
35
36
|
## UI preview
|
|
36
37
|
|
|
@@ -95,6 +96,14 @@ When editing a queued message (inline):
|
|
|
95
96
|
- **Shortcuts**: `Enter` saves, `Shift+Enter` inserts a newline, `Esc` cancels (composition input is protected from accidental saves);
|
|
96
97
|
- **Failure fallback**: if the save fails because the agent already claimed the message (e.g. "started sending"), the edited content automatically moves back to the composer with a notice — **nothing is lost**; the back-fill only happens when the composer is empty, so an existing draft is never overwritten.
|
|
97
98
|
|
|
99
|
+
## Day/night mode (automatic dark adaptation)
|
|
100
|
+
|
|
101
|
+
The dock and the freeze button **no longer use hand-drawn colors** — they reference dsh's official semantic tokens (`--dsw-alias-*`: `bg-layer-*` / `border-l*` / `label-*` / `interactive-bg-hover` / `state-success|warn|error-primary`) maintained by the dsh theme system:
|
|
102
|
+
|
|
103
|
+
- **Automatic follow**: dsh's default theme preference is "system" — when the OS switches to dark mode (or you pick a dark theme in dsh settings), `body[data-ds-dark-theme]` takes effect and the tokens switch to the dark palette, so the dock becomes a **dark-gray surface with inverted (white) text** and the tier colors use the official dark-adapted values (contrast is guaranteed by dsh);
|
|
104
|
+
- **No configuration**: the plugin does not watch the system and adds no settings — light/dark is fully delegated to the dsh theme; the day appearance is unchanged;
|
|
105
|
+
- **Scope**: the waiting-area dock (including the frozen banner / frozen list) and the "Freeze session" button on the composer's right.
|
|
106
|
+
|
|
98
107
|
## Installation
|
|
99
108
|
|
|
100
109
|
```sh
|
package/README.md
CHANGED
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
- **编辑不丢内容**:编辑保存失败(消息已被 agent 认领)时,编辑内容自动退回主输入框,不会丢失;主输入框已有内容时不覆盖。
|
|
32
32
|
- **高峰期冻结**:输入框右侧「冻结会话」按钮——邻近 DeepSeek 高峰收费时段(9:00-12:00、14:00-18:00)时主动暂停 API 消耗:当前轮次自然完成后暂停,未发送队列冻结保存;「恢复会话」后在非高价时间继续处理。
|
|
33
33
|
- **接管官方行为**:插件生效时,官方设置面板的「繁忙时 Enter 键行为」设置行不再显示(Enter 行为固定为绿色排队)。
|
|
34
|
+
- **日夜自动适配**:队列框与冻结按钮全部改用 dsh 官方语义 token(`--dsw-alias-*`),自动跟随系统深色模式 / dsh 暗色主题——深色下自动变为**深灰底 + 白色反色字**,无需任何设置(见「日夜模式」)。
|
|
34
35
|
|
|
35
36
|
## 界面预览
|
|
36
37
|
|
|
@@ -95,6 +96,14 @@
|
|
|
95
96
|
- **快捷键**:`Enter` 保存,`Shift+Enter` 换行,`Esc` 取消(中文输入法组合期间不会误保存);
|
|
96
97
|
- **失败兜底**:保存时若消息已被 agent 认领(如「已经开始发送」),编辑内容自动退回主输入框并提示,**不会丢失**;仅当主输入框为空时回填,已有草稿不被覆盖。
|
|
97
98
|
|
|
99
|
+
## 日夜模式(自动适配深色)
|
|
100
|
+
|
|
101
|
+
队列框与冻结按钮的配色**不再使用自绘颜色**,全部改为引用 dsh 官方语义 token(`--dsw-alias-*`:`bg-layer-*` / `border-l*` / `label-*` / `interactive-bg-hover` / `state-success|warn|error-primary`)。这些 token 由 dsh 主题系统统一维护:
|
|
102
|
+
|
|
103
|
+
- **自动跟随**:dsh 默认主题偏好为「跟随系统」——系统切到深色模式(或在 dsh 设置里手动选暗色主题)时,`body[data-ds-dark-theme]` 生效,token 自动切换为深色盘,队列框变为**深灰底 + 白色反色字**,三档色用官方暗色适配值(对比度由 dsh 保证);
|
|
104
|
+
- **无需配置**:插件本身不监听系统、不新增设置项——深浅完全交给 dsh 主题,白天外观保持不变;
|
|
105
|
+
- **范围**:等待区 dock(含冻结横幅 / 冻结列表)与输入框右侧「冻结会话」按钮。
|
|
106
|
+
|
|
98
107
|
## 安装
|
|
99
108
|
|
|
100
109
|
```sh
|
|
@@ -119,7 +128,7 @@ dsh web
|
|
|
119
128
|
npm install --legacy-peer-deps # @deepseek-ai client 包链在 npm 上不完整,仅装工具链
|
|
120
129
|
npm run build # tsc(lib/types)+ tsdown(lib/index.js + lib/client.js)
|
|
121
130
|
node examples/verify-assembly.mjs # 12 项装配断言
|
|
122
|
-
npm test #
|
|
131
|
+
npm test # 36 项 vitest 组件测试
|
|
123
132
|
npm run lint # ESLint(src + tests,flat config)
|
|
124
133
|
npm run verify # 一体化门禁:lint + test + build + verify-assembly
|
|
125
134
|
```
|
package/lib/client.js
CHANGED
|
@@ -195,7 +195,7 @@ window.__ModuleLoader__.load({
|
|
|
195
195
|
}
|
|
196
196
|
//#endregion
|
|
197
197
|
//#region \0dsh-css:E:\test\rewrite-agently\dsh-input-traffic\src\client\steer-queue-dock.module.css.mjs
|
|
198
|
-
const css$1 = ".cev0eq_dock{width:100%}.cev0eq_panel{background:var(--
|
|
198
|
+
const css$1 = ".cev0eq_dock{width:100%}.cev0eq_panel{background:var(--dsw-alias-bg-layer-1,#fffc);border:1px solid var(--dsw-alias-border-l2,#00000014);border-radius:10px;overflow:hidden}.cev0eq_toolbar{border-bottom:1px solid var(--dsw-alias-border-l2,#0000000f);align-items:center;gap:8px;padding:4px 8px;display:flex}.cev0eq_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}.cev0eq_header:disabled{cursor:default}.cev0eq_lead{color:var(--dsw-alias-label-tertiary,#9ca3af);display:inline-flex}.cev0eq_count{font-weight:600}.cev0eq_chevron{color:var(--dsw-alias-label-tertiary,#9ca3af);display:inline-flex}.cev0eq_toolbarActions{margin-left:auto}.cev0eq_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}.cev0eq_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}.cev0eq_freeze[aria-pressed=true]{border-color:var(--dsw-alias-state-success-primary,#30a46c);color:var(--dsw-alias-state-success-primary,#30a46c)}.cev0eq_freeze:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#0000000a)}.cev0eq_freeze:disabled{opacity:.5;cursor:default}.cev0eq_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}.cev0eq_frozenList{margin:0;padding:4px;list-style:none}.cev0eq_frozenRow{border-radius:6px;align-items:center;gap:8px;padding:4px 6px;display:flex}.cev0eq_frozenMark{color:var(--dsw-alias-label-tertiary,#9ca3af);flex:none;margin-left:auto;font-size:11px}.cev0eq_clear:hover:not(:disabled){border-color:var(--dsw-alias-border-l3,#0000001f);background:var(--dsw-alias-interactive-bg-hover,#0000000a)}.cev0eq_clear:disabled{opacity:.5;cursor:default}.cev0eq_clearConfirm{border-color:var(--dsw-alias-state-error-primary,#e5484d);color:var(--dsw-alias-state-error-primary,#e5484d)}.cev0eq_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)}.cev0eq_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}.cev0eq_clearCancel:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#0000000a)}.cev0eq_clearLabel{font-size:12px}.cev0eq_list{margin:0;padding:4px;list-style:none}.cev0eq_row{border-radius:6px;align-items:center;gap:8px;padding:4px 6px;display:flex}.cev0eq_row[draggable=true]{cursor:grab}.cev0eq_row[draggable=true]:active{cursor:grabbing}.cev0eq_rowDragOver{outline:2px dashed var(--dsw-alias-border-l4,#00000040);outline-offset:-2px;background:var(--dsw-alias-interactive-bg-hover,#0000000d)}.cev0eq_row:hover{background:var(--dsw-alias-interactive-bg-hover,#00000008)}.cev0eq_row[data-editing]{align-items:flex-start}.cev0eq_preview{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-primary,#1f2937);flex:1;font-size:13px;overflow:hidden}.cev0eq_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}.cev0eq_badgeLabel{color:inherit}.cev0eq_badgeNow{color:var(--dsw-alias-state-error-primary,#e5484d);background:color-mix(in srgb, var(--dsw-alias-state-error-primary,#e5484d) 10%, transparent)}.cev0eq_badgeNext{color:var(--dsw-alias-state-warn-primary,#e8a33d);background:color-mix(in srgb, var(--dsw-alias-state-warn-primary,#e8a33d) 12%, transparent)}.cev0eq_badgeLater{color:var(--dsw-alias-state-success-primary,#30a46c);background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#30a46c) 12%, transparent)}.cev0eq_badgeNow .cev0eq_dot{background:var(--dsw-alias-state-error-primary,#e5484d)}.cev0eq_badgeNext .cev0eq_dot{background:var(--dsw-alias-state-warn-primary,#e8a33d)}.cev0eq_badgeLater .cev0eq_dot{background:var(--dsw-alias-state-success-primary,#30a46c)}.cev0eq_steeringList{margin:0;padding:0 4px 4px;list-style:none}.cev0eq_steeringList .cev0eq_row{opacity:.85}.cev0eq_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}.cev0eq_actions{align-items:center;gap:2px;display:inline-flex}.cev0eq_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}.cev0eq_action:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#0000000d);color:var(--dsw-alias-label-primary,#1f2937)}.cev0eq_action:disabled{opacity:.4;cursor:default}.cev0eq_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}.cev0eq_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}.cev0eq_tier:hover:not(:disabled){border-color:var(--dsw-alias-border-l4,#0003)}.cev0eq_tier:disabled{cursor:default}.cev0eq_tierLater{border-color:var(--dsw-alias-state-success-primary,#30a46c);background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#30a46c) 12%, transparent)}.cev0eq_dot{border-radius:50%;width:10px;height:10px}.cev0eq_tierNow .cev0eq_dot{background:var(--dsw-alias-state-error-primary,#e5484d)}.cev0eq_tierNext .cev0eq_dot{background:var(--dsw-alias-state-warn-primary,#e8a33d)}.cev0eq_tierLater .cev0eq_dot{background:var(--dsw-alias-state-success-primary,#30a46c)}";
|
|
199
199
|
const tagId$1 = "dsh-input-traffic/steer-queue-dock.module.css";
|
|
200
200
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
|
|
201
201
|
const tag = document.createElement("style");
|
|
@@ -205,42 +205,42 @@ window.__ModuleLoader__.load({
|
|
|
205
205
|
document.head.appendChild(tag);
|
|
206
206
|
}
|
|
207
207
|
var steer_queue_dock_module_css_default = {
|
|
208
|
+
"chevron": "cev0eq_chevron",
|
|
209
|
+
"clearCancel": "cev0eq_clearCancel",
|
|
210
|
+
"dock": "cev0eq_dock",
|
|
211
|
+
"badgeNow": "cev0eq_badgeNow",
|
|
212
|
+
"toolbar": "cev0eq_toolbar",
|
|
213
|
+
"frozenRow": "cev0eq_frozenRow",
|
|
208
214
|
"badge": "cev0eq_badge",
|
|
209
|
-
"
|
|
210
|
-
"panel": "cev0eq_panel",
|
|
215
|
+
"badgeLabel": "cev0eq_badgeLabel",
|
|
211
216
|
"freeze": "cev0eq_freeze",
|
|
212
|
-
"
|
|
213
|
-
"
|
|
217
|
+
"steeringList": "cev0eq_steeringList",
|
|
218
|
+
"badgeLater": "cev0eq_badgeLater",
|
|
219
|
+
"action": "cev0eq_action",
|
|
220
|
+
"tierNow": "cev0eq_tierNow",
|
|
214
221
|
"dot": "cev0eq_dot",
|
|
222
|
+
"frozenList": "cev0eq_frozenList",
|
|
223
|
+
"frozenBanner": "cev0eq_frozenBanner",
|
|
224
|
+
"list": "cev0eq_list",
|
|
225
|
+
"toolbarActions": "cev0eq_toolbarActions",
|
|
226
|
+
"clear": "cev0eq_clear",
|
|
227
|
+
"preview": "cev0eq_preview",
|
|
215
228
|
"tier": "cev0eq_tier",
|
|
216
|
-
"chevron": "cev0eq_chevron",
|
|
217
229
|
"clearLabel": "cev0eq_clearLabel",
|
|
218
|
-
"
|
|
219
|
-
"steeringList": "cev0eq_steeringList",
|
|
230
|
+
"badgeNext": "cev0eq_badgeNext",
|
|
220
231
|
"row": "cev0eq_row",
|
|
232
|
+
"clearConfirm": "cev0eq_clearConfirm",
|
|
233
|
+
"tierNext": "cev0eq_tierNext",
|
|
234
|
+
"editor": "cev0eq_editor",
|
|
235
|
+
"count": "cev0eq_count",
|
|
221
236
|
"frozenMark": "cev0eq_frozenMark",
|
|
222
|
-
"
|
|
237
|
+
"lead": "cev0eq_lead",
|
|
238
|
+
"header": "cev0eq_header",
|
|
223
239
|
"actions": "cev0eq_actions",
|
|
224
|
-
"
|
|
225
|
-
"
|
|
226
|
-
"tierNext": "cev0eq_tierNext",
|
|
227
|
-
"frozenBanner": "cev0eq_frozenBanner",
|
|
228
|
-
"action": "cev0eq_action",
|
|
229
|
-
"badgeNow": "cev0eq_badgeNow",
|
|
230
|
-
"toolbar": "cev0eq_toolbar",
|
|
231
|
-
"list": "cev0eq_list",
|
|
232
|
-
"clearConfirm": "cev0eq_clearConfirm",
|
|
233
|
-
"preview": "cev0eq_preview",
|
|
234
|
-
"badgeLabel": "cev0eq_badgeLabel",
|
|
240
|
+
"tierLater": "cev0eq_tierLater",
|
|
241
|
+
"panel": "cev0eq_panel",
|
|
235
242
|
"plan": "cev0eq_plan",
|
|
236
|
-
"
|
|
237
|
-
"rowDragOver": "cev0eq_rowDragOver",
|
|
238
|
-
"toolbarActions": "cev0eq_toolbarActions",
|
|
239
|
-
"lead": "cev0eq_lead",
|
|
240
|
-
"frozenList": "cev0eq_frozenList",
|
|
241
|
-
"badgeNext": "cev0eq_badgeNext",
|
|
242
|
-
"badgeLater": "cev0eq_badgeLater",
|
|
243
|
-
"frozenRow": "cev0eq_frozenRow"
|
|
243
|
+
"rowDragOver": "cev0eq_rowDragOver"
|
|
244
244
|
};
|
|
245
245
|
//#endregion
|
|
246
246
|
//#region src/client/steer-queue-dock.tsx
|
|
@@ -1169,7 +1169,7 @@ window.__ModuleLoader__.load({
|
|
|
1169
1169
|
}
|
|
1170
1170
|
//#endregion
|
|
1171
1171
|
//#region \0dsh-css:E:\test\rewrite-agently\dsh-input-traffic\src\client\freeze-button.module.css.mjs
|
|
1172
|
-
const css = ".Klmgza_freeze{border:1px solid var(--
|
|
1172
|
+
const css = ".Klmgza_freeze{border:1px solid var(--dsw-alias-border-l3,#0000001f);height:24px;color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;white-space:nowrap;background:0 0;border-radius:6px;align-items:center;gap:4px;padding:0 8px;font-size:12px;display:inline-flex}.Klmgza_freeze:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#0000000a)}.Klmgza_freeze[aria-pressed=true]{border-color:var(--dsw-alias-state-success-primary,#30a46c);color:var(--dsw-alias-state-success-primary,#30a46c);background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#30a46c) 8%, transparent)}.Klmgza_label{font-size:12px}";
|
|
1173
1173
|
const tagId = "dsh-input-traffic/freeze-button.module.css";
|
|
1174
1174
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
|
|
1175
1175
|
const tag = document.createElement("style");
|
|
@@ -1198,15 +1198,15 @@ window.__ModuleLoader__.load({
|
|
|
1198
1198
|
* Freeze/resume toggle for the peak-hour scenario.
|
|
1199
1199
|
* @param props - slot props; the session snapshot drives the detach list.
|
|
1200
1200
|
*/
|
|
1201
|
-
function FreezeButton({ session, updateQueue, cancel, send,
|
|
1201
|
+
function FreezeButton({ session, updateQueue, cancel, send, notify, t }) {
|
|
1202
1202
|
const { frozen } = (0, react.useSyncExternalStore)(freezeStore.subscribe, freezeStore.getSnapshot);
|
|
1203
1203
|
const freeze = async () => {
|
|
1204
|
-
const
|
|
1205
|
-
const pending =
|
|
1204
|
+
const queued = session.queue.filter((row) => row.placement === "queued");
|
|
1205
|
+
const pending = queued.flatMap((row) => row.text === null ? [] : [{
|
|
1206
1206
|
text: row.text,
|
|
1207
|
-
tier:
|
|
1207
|
+
tier: "queue"
|
|
1208
1208
|
}]);
|
|
1209
|
-
await Promise.all(
|
|
1209
|
+
await Promise.all(queued.map((row) => updateQueue(row.id, { kind: "remove" }).catch(() => void 0)));
|
|
1210
1210
|
freezeStore.set({
|
|
1211
1211
|
frozen: true,
|
|
1212
1212
|
pending
|
|
@@ -1221,8 +1221,7 @@ window.__ModuleLoader__.load({
|
|
|
1221
1221
|
try {
|
|
1222
1222
|
for (const entry of pending) {
|
|
1223
1223
|
if (entry.tier === "force") await cancel();
|
|
1224
|
-
|
|
1225
|
-
else await send(entry.text);
|
|
1224
|
+
await send(entry.text);
|
|
1226
1225
|
}
|
|
1227
1226
|
} catch {
|
|
1228
1227
|
notify("error", t("steer.resumeFailed"));
|
|
@@ -1256,30 +1255,6 @@ window.__ModuleLoader__.load({
|
|
|
1256
1255
|
const CONVERSATION_SETTINGS_NAMESPACE = "ui-conversation";
|
|
1257
1256
|
/** Busy-Enter field inside that namespace; the plugin pins it to queue. */
|
|
1258
1257
|
const BUSY_ENTER_FIELD = "busyEnter";
|
|
1259
|
-
/**
|
|
1260
|
-
* Deliver one plain-text message into the session's next step. The exposed
|
|
1261
|
-
* conversation `send` verb only queues into the next turn, so resume steers
|
|
1262
|
-
* through the session face's steer-mode prompt instead (no harness change).
|
|
1263
|
-
* @param ctx - root context (resolves the session face behind the scope).
|
|
1264
|
-
* @param actx - agent-scoped context of the owning session.
|
|
1265
|
-
* @param text - message text to deliver.
|
|
1266
|
-
*/
|
|
1267
|
-
function steerPrompt(ctx, actx, text) {
|
|
1268
|
-
const session = ctx.sessions.sessionOf(actx);
|
|
1269
|
-
if (session === void 0) return Promise.reject(/* @__PURE__ */ new Error("steer resume: session scope unavailable"));
|
|
1270
|
-
return session.prompt([{
|
|
1271
|
-
type: "text",
|
|
1272
|
-
text
|
|
1273
|
-
}], "steer").then((result) => {
|
|
1274
|
-
if (!result.ok) {
|
|
1275
|
-
const error = result.error ?? {
|
|
1276
|
-
code: "unknown",
|
|
1277
|
-
message: "steer prompt rejected"
|
|
1278
|
-
};
|
|
1279
|
-
throw new Error(`conversation.sendSteer failed: ${error.code}: ${error.message}`);
|
|
1280
|
-
}
|
|
1281
|
-
});
|
|
1282
|
-
}
|
|
1283
1258
|
/** Services required by the browser half. */
|
|
1284
1259
|
const inject = [
|
|
1285
1260
|
"slots",
|
|
@@ -1314,7 +1289,6 @@ window.__ModuleLoader__.load({
|
|
|
1314
1289
|
updateQueue: (itemId, action) => conversation.updateQueue(itemId, action),
|
|
1315
1290
|
cancel: () => conversation.cancel(),
|
|
1316
1291
|
send: (text) => conversation.send(text),
|
|
1317
|
-
sendSteer: (text) => steerPrompt(ctx, actx, text),
|
|
1318
1292
|
setDraft: (text) => {
|
|
1319
1293
|
conversation.input.for(actx).actions.setDraft(text);
|
|
1320
1294
|
},
|
|
@@ -1338,7 +1312,6 @@ window.__ModuleLoader__.load({
|
|
|
1338
1312
|
updateQueue: (itemId, action) => conversation.updateQueue(itemId, action),
|
|
1339
1313
|
cancel: () => conversation.cancel(),
|
|
1340
1314
|
send: (text) => conversation.send(text),
|
|
1341
|
-
sendSteer: (text) => steerPrompt(ctx, actx, text),
|
|
1342
1315
|
setDraft: (text) => {
|
|
1343
1316
|
conversation.input.for(actx).actions.setDraft(text);
|
|
1344
1317
|
},
|