dsh-one-click-polish 0.0.0-stage → 1.2.0
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/LICENSE +21 -0
- package/README.md +291 -2
- package/client.js +2710 -0
- package/cordis.patch.yml +14 -0
- package/icon.svg +6 -0
- package/index.js +2531 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +66 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 dsh-one-click-polish contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,292 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 一键润色 / 扩写 / 自动驾驶
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
给 DeepSeek Harness(dsh)桌面端的输入框加一组动作:**润色**、**扩写**、**自动驾驶**。所有模型调用都用**你当前会话正在用的那个模型**,结果直接写回输入框。
|
|
4
|
+
|
|
5
|
+
- 润色:按三档深度重写草稿
|
|
6
|
+
- 扩写:把一句话扩写成能直接开工的需求说明
|
|
7
|
+
- 自动驾驶:让 AI 读对话、写下一步提示词、发给助手,一轮接一轮推进到你设定的目标
|
|
8
|
+
|
|
9
|
+
装好之后,输入框左下角多一排按钮:
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
[+ 完全权限] 润色 深度 扩写 自动
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 需要什么
|
|
18
|
+
|
|
19
|
+
| 项 | 要求 |
|
|
20
|
+
| --- | --- |
|
|
21
|
+
| dsh | 桌面端(Web UI),带 `settings.section` / `conversation.input.left` 槽位 |
|
|
22
|
+
| Node | ≥ 20 |
|
|
23
|
+
| 模型 | 会话里能正常发消息即可;润色用的就是这个模型 |
|
|
24
|
+
|
|
25
|
+
没有额外依赖,不需要 API key——插件借的是 dsh 已经配好的模型通道。
|
|
26
|
+
|
|
27
|
+
## 安装
|
|
28
|
+
|
|
29
|
+
### 界面里装(最省事)
|
|
30
|
+
|
|
31
|
+
打开 dsh → 设置 → 插件 → 添加插件,在输入框里粘这个:
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
https://github.com/HTRP1486/dsh-one-click-polish
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
下面这些写法等价,都行:
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
https://github.com/HTRP1486/dsh-one-click-polish
|
|
41
|
+
https://github.com/HTRP1486/dsh-one-click-polish.git
|
|
42
|
+
github:HTRP1486/dsh-one-click-polish
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**末尾不要加斜杠**。加了会报 `a URL must point at a git repository or a tarball` —— dsh 的判断规则是 `^https?://主机/用户/仓库(.git)?$`,最后一段不允许出现 `/`。
|
|
46
|
+
|
|
47
|
+
### 命令行装
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
dsh plugin --profile <你的 profile 名> install github:HTRP1486/dsh-one-click-polish
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
不知道 profile 名的话,看你 `~/.dsh/profiles/` 下的目录名,常见的是 `desktop`。
|
|
54
|
+
|
|
55
|
+
### 其他方式
|
|
56
|
+
|
|
57
|
+
| 方式 | 做法 |
|
|
58
|
+
| --- | --- |
|
|
59
|
+
| 本地目录 | target 填仓库的**绝对路径**,如 `D:\Documents\dsh-one-click-polish`(相对路径会被拒绝) |
|
|
60
|
+
| Release 包 | 从 [Releases](https://github.com/HTRP1486/dsh-one-click-polish/releases) 下 `.tgz`,target 填该文件的绝对路径 |
|
|
61
|
+
|
|
62
|
+
装完**重启 dsh**。判断是否成功:输入框左下角出现 `润色 | 深度 | 扩写 | 自动`,设置里多出「润色 / 扩写」一页。
|
|
63
|
+
|
|
64
|
+
### 装不上时
|
|
65
|
+
|
|
66
|
+
| 报错 | 原因 |
|
|
67
|
+
| --- | --- |
|
|
68
|
+
| `a URL must point at a git repository or a tarball` | 地址末尾多了斜杠,或不是 `.tgz` 结尾 |
|
|
69
|
+
| `a local path must be absolute` | 填了相对路径或 `./xxx` |
|
|
70
|
+
| `unmet DSH version requirement` | 你的 dsh 版本低于插件要求 |
|
|
71
|
+
| 装完没生效 | 没重启。改 profile 的 bundles 后必须重启,刷新页面不够 |
|
|
72
|
+
|
|
73
|
+
## 用法
|
|
74
|
+
|
|
75
|
+
### 润色
|
|
76
|
+
|
|
77
|
+
打字 → 点 `润色` → 草稿被重写并写回。
|
|
78
|
+
|
|
79
|
+
档位胶囊点一下循环 `轻度 → 标准 → 深度`(默认深度,记在浏览器本地)。它决定**动手前查多少资料**:
|
|
80
|
+
|
|
81
|
+
| 档位 | 动手前 | 改写力度 |
|
|
82
|
+
| --- | --- | --- |
|
|
83
|
+
| 轻度 | 什么都不查 | 只改错别字、标点、语法 |
|
|
84
|
+
| 标准 | AI 翻项目目录和 dsh 配置目录,找相关文件 | 改措辞和句式、去冗余 |
|
|
85
|
+
| 深度 | 标准 + 联网检索(必应 / 百度 / GitHub) | 重组结构、拆长句、换精准用词 |
|
|
86
|
+
|
|
87
|
+
检索不是关键词匹配:Host 把 `list_dir` / `read_file` / `search_files` / `search_content` / `web_search` 交给模型,由它自己决定查什么、要不要再追一轮。轮数、检索时长、改写时长都能在设置里调,默认 4 轮 / 45 秒 / 120 秒。**只读**,越出项目目录与 dsh 配置目录的路径会被拒绝。
|
|
88
|
+
|
|
89
|
+
改动前后可以对比:草稿被覆盖,`Ctrl+Z` 能撤回。
|
|
90
|
+
|
|
91
|
+
### 扩写
|
|
92
|
+
|
|
93
|
+
输入一句粗需求,例如 `帮我写一个登录功能`,点 `扩写`。
|
|
94
|
+
|
|
95
|
+
它先**判断你要的是哪一种**,再按那种形态写,第一行会说明它的判断:
|
|
96
|
+
|
|
97
|
+
| 形态 | 什么时候 | 输出 |
|
|
98
|
+
| --- | --- | --- |
|
|
99
|
+
| 要造的 | 你打算做或让别人做 | 需求说明:做什么、边缘怎么表现、怎么算做完 |
|
|
100
|
+
| 要货的 | 你想要成品本身 | 直接给成品(提示词 / 文案 / 模板 / 清单),不解释怎么设计 |
|
|
101
|
+
| 要判断的 | 句子里藏着一个选择 | 摆出取舍 + 带条件的建议,不给方案书 |
|
|
102
|
+
| 要问的 | 缺一个事实,说了也白说 | 只问那一个问题,不扩成问卷 |
|
|
103
|
+
|
|
104
|
+
它**不会替你决定范围**——不会自己宣布「不做注册、不做找回密码」,而是把这类分叉摆出来、说清楚每个选择会改变什么。它会读完整的对话历史(最近的对话保留全文,更早的压缩成一行摘要),所以知道你在做什么产品、哪些决策已经定了。
|
|
105
|
+
|
|
106
|
+
### 自动驾驶
|
|
107
|
+
|
|
108
|
+
点 `自动` 弹出面板:
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
自动驾驶
|
|
112
|
+
○ 循环几次结束 [ 5 ]
|
|
113
|
+
☑ 限制运行时间 [ 0 ] 小时 [ 30 ] 分钟
|
|
114
|
+
○ 直到达成目标结束
|
|
115
|
+
|
|
116
|
+
目标(可选):写清楚要达成什么,达成后自动停;不填就只看轮数
|
|
117
|
+
[ ]
|
|
118
|
+
|
|
119
|
+
[ 启动 ]
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
点启动 → 确认弹窗 → 才真正开始。运行中再点 `自动`:
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
运行中 3/5 · 已跑 12 分钟
|
|
126
|
+
上下文:8 条消息 / 1300 字
|
|
127
|
+
查看驱动 AI 读到的上下文
|
|
128
|
+
|
|
129
|
+
[ 中断 ] [ 结束循环 ]
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
- **中断**:掐掉当前这一轮,循环继续,它会重新判断再发一条
|
|
133
|
+
- **结束循环**:整个关掉
|
|
134
|
+
- 轮数用尽 / 时间到 / 目标达成 / 出错 / 你点停 —— 五种情况都会立刻停机
|
|
135
|
+
|
|
136
|
+
停止条件可以叠加:`循环 5 次 + 填个目标` = 最多 5 轮,做完了提前收工。
|
|
137
|
+
|
|
138
|
+
**它读到的对话你能看见**:面板里的「查看驱动 AI 读到的上下文」会显示这一轮实际传给驱动 AI 的对话全文。
|
|
139
|
+
|
|
140
|
+
**它的思考和调用也能看见**:面板里的「查看思考与调用」会列出每一轮的推理、它调用了哪个工具、参数是什么、返回了什么,以及最终发给助手的那条消息。按类型上色:
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
思考 1 The draft is vague. I should look at the project directory…
|
|
144
|
+
list_dir - index.js - client.js d locale
|
|
145
|
+
search_files d dsh-one-click-polish - cordis.patch.yml
|
|
146
|
+
思考 2 Likely a DSH plugin. Let me check the config directory…
|
|
147
|
+
已发送 1 请把这句话改得更正式:…
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
这份记录来自同一个任务表(`GET …/progress?id=autopilot-<sessionId>`),所以润色/扩写时那个进度窗也能看到同样的过程。
|
|
151
|
+
|
|
152
|
+
**右侧贴边窗口**:点「在右侧显示」,思考窗会滑入屏幕右缘,跟着当前对话实时刷新(每 500ms 一轮),可以上下翻、折叠、关闭。切到别的对话时它会自己跟过去;那个对话没有记录时就是空的。
|
|
153
|
+
|
|
154
|
+
**按钮会报告上一次怎么结束的**:
|
|
155
|
+
|
|
156
|
+
| 按钮 | 含义 |
|
|
157
|
+
| --- | --- |
|
|
158
|
+
| 🔵 转圈 `自动 2/5` | 正在跑 |
|
|
159
|
+
| 🟢 `已完成` | 跑满轮数,或驱动 AI 判断目标达成 |
|
|
160
|
+
| 🔴 `出错` | 出错停下,点开能看到错误全文 |
|
|
161
|
+
| 🟡 `意外停止` | 它自己停下了:想不出下一步、助手一直在忙、或到了时长上限 |
|
|
162
|
+
| 🟡 `已中断` | 你手动停的 |
|
|
163
|
+
|
|
164
|
+
点开按钮能看到为什么停、读了哪些文件、完整思考记录,底部有「从中断处继续」(停下的情况)或「重新开始」+「清除状态」。
|
|
165
|
+
|
|
166
|
+
**设置页有每个对话的自动运行日志**:它读了哪些文件、调用了什么、发了什么,按会话归档,重启后仍在。长工具行和长思考行默认收起,点一下展开,收起时保留首行预览。
|
|
167
|
+
|
|
168
|
+
## 换窗口 / 重启 会怎样
|
|
169
|
+
|
|
170
|
+
| 场景 | 结果 |
|
|
171
|
+
| --- | --- |
|
|
172
|
+
| 切会话、切标签、最小化 | 继续跑(在 Host 进程里) |
|
|
173
|
+
| 切走再回来 | 继续跑,按钮上轮数跟着涨 |
|
|
174
|
+
| 重启 dsh | 不自动跑,面板里给「从中断处继续」按钮,点了才续 |
|
|
175
|
+
|
|
176
|
+
每轮都会把进度写进 profile 目录的 `.one-click-polish-autopilot.json`,重启后据此提供恢复入口。正常结束会自动清掉。
|
|
177
|
+
|
|
178
|
+
## 设置
|
|
179
|
+
|
|
180
|
+
**设置 → 润色 / 扩写**:
|
|
181
|
+
|
|
182
|
+
| 项 | 说明 |
|
|
183
|
+
| --- | --- |
|
|
184
|
+
| 模型来源 | `跟随当前对话`(默认)用输入框里选中的模型;`固定模型` 始终用指定那个 |
|
|
185
|
+
| 模型 | 选 `固定模型` 后出现,带搜索的下拉框,按供应商分组 |
|
|
186
|
+
| 思考程度 | 照 dsh 的 `Default / Low / High / Max` 做,**选项按该模型实际支持的档位生成**,不支持就整栏隐藏;换模型时旧档位自动回落 |
|
|
187
|
+
| 等待助手完成上一轮的上限 | 自动驾驶要发下一条时助手仍在忙,等多久放弃。默认 5 分钟,可到 60 |
|
|
188
|
+
| 检索预算 | 查资料总共能用多久、最多几轮。默认 45 秒 / 4 轮 |
|
|
189
|
+
| 改写预算 | 模型写答案这一步最多等多久。默认 120 秒 |
|
|
190
|
+
| 自动运行日志 | 每个对话的自动驾驶记录,按会话归档 |
|
|
191
|
+
|
|
192
|
+
改动先留在页面上,点 `保存` 才写入 profile,`撤销修改` 回到上次保存的状态。
|
|
193
|
+
|
|
194
|
+
## 配置
|
|
195
|
+
|
|
196
|
+
在 profile 的 `cordis.patch.yml` 里覆盖本行 `config`:
|
|
197
|
+
|
|
198
|
+
```yaml
|
|
199
|
+
- id: one-click-polish
|
|
200
|
+
config:
|
|
201
|
+
modelSource: follow # follow | fixed
|
|
202
|
+
provider: '' # modelSource 为 fixed 时必填
|
|
203
|
+
model: ''
|
|
204
|
+
reasoningEffort: '' # '' = 默认;否则必须是该模型支持的档位
|
|
205
|
+
defaultStrength: strong # light | standard | strong
|
|
206
|
+
maxInputChars: 12000 # 单次输入字符上限
|
|
207
|
+
timeoutMs: 120000 # 单次改写预算
|
|
208
|
+
exploreMs: 45000 # 检索预算
|
|
209
|
+
exploreRounds: 4 # 最多检索几轮
|
|
210
|
+
idleWaitMs: 300000 # 等助手空下来的上限
|
|
211
|
+
instruction: '' # 追加给模型的额外要求
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
## 原理
|
|
215
|
+
|
|
216
|
+
- **模型解析**在 Host 侧:会话日志里最新的 `model/selection` → 最近一次 `request/header` → profile 默认模型。所以模型选择器切到哪个就用哪个,切了还没发消息也认得。
|
|
217
|
+
- **润色 / 扩写**是手工构造的 `llm.stream()`:不写会话日志、不开 Turn、不动对话历史,只借一次模型能力。
|
|
218
|
+
- **长任务用 202 + 轮询**:桌面 webview 会掐断长时间静默的请求,所以 `POST …/polish` 立刻返回 202,浏览器每 700ms 轮询 `GET …/progress` 取结果。
|
|
219
|
+
- **自动驾驶**用 `agent.followup()` 往会话里追加用户消息并唤醒,用 `await agent.whenIdle()` 等这一轮跑完。每轮按 session id 重新取 agent,所以切换会话销毁重建 agent 也不影响。
|
|
220
|
+
|
|
221
|
+
## HTTP 接口
|
|
222
|
+
|
|
223
|
+
都在 `/plugins/dsh-one-click-polish` 下:
|
|
224
|
+
|
|
225
|
+
| 方法 | 路径 | 作用 |
|
|
226
|
+
| --- | --- | --- |
|
|
227
|
+
| POST | `/polish` | 提交润色/扩写任务,返回 202 + requestId |
|
|
228
|
+
| GET | `/progress?id=` | 轮询任务状态与结果 |
|
|
229
|
+
| GET | `/settings` | 读/写设置与模型目录 |
|
|
230
|
+
| GET | `/efforts?provider=&model=` | 某模型支持的思考档位 |
|
|
231
|
+
| GET/POST | `/autopilot` | 读/写自动驾驶状态,`?resumable=1` 列可恢复的运行 |
|
|
232
|
+
| GET | `/runs` | 按会话归档的自动运行日志;`?sessionId=` 取某会话 |
|
|
233
|
+
| GET | `/status` | 当前会话解析到的模型 |
|
|
234
|
+
| GET | `/diag` | 排查用:会话、目录、上下文快照 |
|
|
235
|
+
|
|
236
|
+
## 文件
|
|
237
|
+
|
|
238
|
+
| 文件 | 作用 |
|
|
239
|
+
| --- | --- |
|
|
240
|
+
| `index.js` | Host 半身:模型解析、检索、改写、轮询任务、自动驾驶驱动 |
|
|
241
|
+
| `client.js` | 浏览器半身:工具栏按钮组、进度窗、右侧思考窗、设置页 |
|
|
242
|
+
| `cordis.patch.yml` | 插件行声明 |
|
|
243
|
+
| `locale/*.json` | 插件管理页的标题与描述 |
|
|
244
|
+
| `TESTING.md` | 测试纪律:自动驾驶会真往会话里发消息,不能拿真实对话试 |
|
|
245
|
+
|
|
246
|
+
## 出问题怎么查
|
|
247
|
+
|
|
248
|
+
**按钮没出现**
|
|
249
|
+
|
|
250
|
+
1. 确认插件真的加载了:设置 → 插件 里能看到 `dsh-one-click-polish`
|
|
251
|
+
2. 重启 dsh(改 `package.json` 的 bundles 后必须重启,刷新页面不够)
|
|
252
|
+
3. 打开 `http://127.0.0.1:<dsh 端口>/plugins/dsh-one-click-polish/status`,返回 `{"ok":true,...}` 就是活着
|
|
253
|
+
|
|
254
|
+
**按钮出现了但点了没反应**
|
|
255
|
+
|
|
256
|
+
打开同一端口下的 `/diag`,看 `processCwd` 和 `profileDir`。如果 `profileDir` 是空的,说明插件认不出 profile 目录(判断依据是那个目录里要有 `cordis.patch.yml`,且不含 `package.json` + `client.js`)。
|
|
257
|
+
|
|
258
|
+
**润色一直转圈不结束**
|
|
259
|
+
|
|
260
|
+
设置页把「检索预算」和「改写预算」调大。深度档要联网检索,网络慢的时候 45 秒不够。
|
|
261
|
+
|
|
262
|
+
**自动驾驶自己停了**
|
|
263
|
+
|
|
264
|
+
按钮颜色会告诉你原因,点开有全文:
|
|
265
|
+
|
|
266
|
+
| 颜色 | 原因 |
|
|
267
|
+
| --- | --- |
|
|
268
|
+
| 🟡 意外停止 | 驱动 AI 想不出下一步 / 助手一直在忙(超过等待上限)/ 到了时长上限 |
|
|
269
|
+
| 🟠 已中断 | 你自己点的 |
|
|
270
|
+
| 🔴 出错 | 具体错误在面板里,红字 |
|
|
271
|
+
| 🟢 已完成 | 跑满轮数或目标达成 |
|
|
272
|
+
|
|
273
|
+
停下不等于失败:底部有「从中断处继续」,从已跑的轮数接着来。
|
|
274
|
+
|
|
275
|
+
**想复盘它做了什么**
|
|
276
|
+
|
|
277
|
+
设置 → 润色 / 扩写 → 自动运行日志,按会话列出每一次运行:读了哪些文件、调用了什么工具、发了什么消息。或者面板里点「查看思考与调用」。
|
|
278
|
+
|
|
279
|
+
**看到的上下文不完整**
|
|
280
|
+
|
|
281
|
+
长对话会被压缩:最近的保留全文,更早的压成一行摘要,中间放不下的丢掉并标注「中间省略了 N 条」。面板上会显示「压缩省略 N 条」。想让它看更多,就在目标里写得具体一点。
|
|
282
|
+
|
|
283
|
+
## 隐私
|
|
284
|
+
|
|
285
|
+
- 插件**只读**本地文件。越出项目工作目录和 dsh 配置目录的路径会被拒绝。
|
|
286
|
+
- 敏感文件名和目录**一律不读不列**:cookie、凭据、`id_rsa`、`.env`、微信 / QQ 数据目录、`node_modules`、`.git` 等。
|
|
287
|
+
- 自动驾驶每轮的推理、工具调用、发出的消息会写到 profile 目录下的 `.one-click-polish-log.json`,**按会话归档**。这个文件只在你的机器上,不会上传。不想要就删掉它。
|
|
288
|
+
- 插件不会把运行时数据写进自己的源码目录。
|
|
289
|
+
|
|
290
|
+
## 许可
|
|
291
|
+
|
|
292
|
+
MIT
|