Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 12 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,13 @@ DeepSeek Harness 会自动调用工具并连续作答,虽然可以使用插话

## 功能

**暂停点**:模型完成一轮工具交互、发出下一次请求前,插件让它停下来等你的位置。

- **可开关**:默认关闭,每个会话可独立开启。
- **暂停在请求前**:模型完成一轮工具交互、正要发出下一次请求之前停下,不打断任何在途 API 调用。
- **仅在暂停点暂停**:只有这个位置会停,也就是模型完成一轮工具交互、正要发出下一次请求之前。你发消息触发的第一次请求不停,也不打断任何在途 API 调用。
- **保持 composer 可用**:暂停期间输入框照常可打字,不遮挡、不切换。
- **回车即放行**:在主输入框按裸 Enter 继续。草稿为空为无感放行,草稿有字或图片则作为插话随本次请求一并发出,随后清空草稿与附件。
- **按钮同样放行**:也可直接点「已暂停·回车或点此继续」按钮,行为同上并读取当前草稿与附件。
- **图片随插话**:草稿里的图片会先经附件服务持久化,再与文字组成同一条用户消息,不会只发文字而把图片留在输入框。文件附件暂不支持插话,会提示先移除。
- **回车或按钮放行**:在主输入框按裸 Enter,或点「已暂停·回车或点此继续」按钮,都能放行暂停点。草稿为空无感放行,有字或图片则作为插话随本次请求一并发出。暂停点还没到时按回车也有效,消息留到下一个暂停点;这一轮已结束则作为新的一轮发出,按了就一定送达。
- **图片随插话**:按下回车时文字与图片一起立刻离开输入框,图片在后台序列化后随消息发出,不会只发文字而把图片留在输入框。发送失败时文字与已序列化的图片暂存到下次发送,序列化失败的图片需要重新选择。文件附件暂不支持插话,会被直接移出输入框并提示重新选择。
- **模型无感知**:上下文完整、不插入多余消息,模型察觉不到暂停存在。

## 它长什么样
Expand Down Expand Up @@ -59,9 +60,9 @@ dsh plugin --profile web remove dsh-pause
## 使用

1. 点 composer 工具行右侧的「暂停」按钮,变「暂停开」即该会话已开启。
2. 之后该会话的工具续跑请求会在发出前停下等你。
3. 需要放行时在主输入框按裸 Enter,空为无感继续,有字或有图为插话。也可点「已暂停·回车或点此继续」。
4. 用完再点「暂停开」关掉。暂停中关掉会放行正挂着的门。
2. 之后该会话的工具续跑请求会停在暂停点等你。
3. 需要放行时在主输入框按裸 Enter,空为无感继续,有字或有图为插话。也可点「已暂停·回车或点此继续」。暂停点还没到时按回车同样有效,消息会留到下一个暂停点;这一轮已经结束则作为新的一轮发出。
4. 用完再点「暂停开」关掉。暂停中关掉会放行当前暂停点。

## 配置

Expand All @@ -77,13 +78,14 @@ plugins:

## 工作原理

dsh 把一次模型请求当作一个 step,agent 连续调用工具时会经历 step、工具执行、下一次 step 的循环。本插件挂在 `agent/pre-step`,在「带工具结果的下一请求」正要进入前决定是否拉门。
dsh 把一次模型请求当作一个 step,agent 连续调用工具时会经历 step、工具执行、下一次 step 的循环。本插件监听 `agent/pre-step`,由它决定何时出现暂停点。

- 暂停点设在请求真正发出之前,故无在途调用可打断。
- 续跑判定用同一 turn 内 step 大于 1 近似,首条纯文字请求永不暂停。
- 续跑判定用同一 turn 内 step 大于 1 近似,每个 turn 的第一次请求永不暂停。
- 浏览器端经 `conversation.input.right` 槽位在 composer 工具行渲染控件。
- 带图插话由浏览器把草稿图片序列化成 base64 随放行请求上传,主机经 `attachments.admitPromptContent` 换成持久引用后与文字并入同一条 user 消息;RPC 请求体上限据此放宽到 300 MiB。
- 因 dsh 的 composer Enter 由 InputBar 私有 keymap 处理、第三方无 hook 点,暂停态用 DOM capture 拦截裸 Enter 改走放行,不改 DSH 源码。
- 因 dsh 的 composer Enter 由 InputBar 私有 keymap 处理、第三方无 hook 点,开关开启期间用 DOM capture 常驻拦截裸 Enter,改走主机裁决,不改 DSH 源码。
- 有没有暂停点由主机权威判定:有就放行,没有但 `agent/status` 为 running 就排进队列等下一个,idle 则直接 `followup` 成为新 turn;主机暂时发不出去时交回客户端暂存,不静默丢弃。
- 主机侧不经 `ctx.connection.rpc.handle`:该 API 自 0.1.2 起即不可用,改为向 webServer 自注册 `/dsh-pause` 前缀路由,复用 connection 的信任判定与浏览器鉴权,信封格式与官方一致。

## 开发
Expand Down
7 changes: 6 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "dsh-pause",
"version": "0.1.4",
"version": "0.1.5",
"packageManager": "pnpm@9.15.9",
"engines": {
"node": ">=26.3.1"
Expand Down Expand Up @@ -54,6 +54,11 @@
"peerDependencies": {
"@deepseek-ai/cordis": ">=4.0.0",
"@deepseek-ai/dsh": "^0.2.0-rc.2",
"@deepseek-ai/dsh-client-connection": "^0.2.0-rc.2",
"@deepseek-ai/dsh-client-ui-conversation": "^0.2.0-rc.2",
"@deepseek-ai/dsh-client-ui-renderer": "^0.2.0-rc.2",
"@deepseek-ai/dsh-client-ui-slots": "^0.2.0-rc.2",
"@deepseek-ai/dsh-llm": "^0.2.0-rc.2",
"react": "^18.2.0"
},
"dependencies": {
Expand Down
Loading
Loading