dsh-composer-ux 0.13.2 → 0.14.1
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.md +73 -0
- package/NOTICE +60 -0
- package/README.md +11 -5
- package/lib/client.js +875 -186
- package/lib/client.js.map +4 -4
- package/lib/index.js +577 -140
- package/lib/index.js.map +4 -4
- package/package.json +3 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,79 @@
|
|
|
2
2
|
|
|
3
3
|
本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
|
|
4
4
|
|
|
5
|
+
## [0.14.1] — 2026-09-30(模型下拉能选了 + 面板内容能滚了)
|
|
6
|
+
|
|
7
|
+
起因(用户原话):**「跟这个一样 点开指定模型之后可以选择」**「**我点完优化模型之后,看不到下边呀,给他安个滑动条**」。
|
|
8
|
+
|
|
9
|
+
### 1. 「模型」那一行换成真下拉(按 provider 分组、长了自己滚)
|
|
10
|
+
|
|
11
|
+
以前是「跟随会话 / 指定」两个按钮 + 一个要你自己写 `provider/model` 的输入框 —— 得记住路由名。
|
|
12
|
+
现在点开就是清单:第一项 **跟随会话模型**(并显示会话当前用的那条),下面按 provider 分组列出
|
|
13
|
+
可用模型(组标题吸顶),选中即写回设置。清单长得装不下时**自己滚**(限高 260px),
|
|
14
|
+
不会把卡片顶出面板。最后一项留了「手动输入 provider/model…」,清单读不到时不至于没路走。
|
|
15
|
+
|
|
16
|
+
清单从哪来:新增只读路由 `GET /composer-ux/models`(客户端拿不到 `llm` 服务,只有宿主知道
|
|
17
|
+
`listProviders()` + `listModels()`)。三条纪律:**单个 provider 读不到只让那一组空着并写出原因**
|
|
18
|
+
(一个坏端点不该废掉整个下拉)· 60 秒缓存(下拉打开很频繁,`?fresh=1` 绕过,界面上就是「重试」)·
|
|
19
|
+
永不抛(坏掉也要给客户端一句能显示的话)。
|
|
20
|
+
|
|
21
|
+
### 2. 面板内容区能滚了(「看不到下边」的那条)
|
|
22
|
+
|
|
23
|
+
`quickSectionBody` 以前是 `overflow: hidden` —— 卡片(七行 + 详情 + 提示词框)比面板还高时,
|
|
24
|
+
下面的内容就被面板底部裁掉、够不到。现在纵轴给滑动条(`overflow-y: auto` + `overscroll-behavior: contain`),
|
|
25
|
+
横轴仍不滚。
|
|
26
|
+
|
|
27
|
+
## 验证
|
|
28
|
+
|
|
29
|
+
- `npm test`:**2293 passed / 0 failed**(22 个套件)。新增 §5m:分组、单点失败隔离、缓存与 `?fresh=1`、非 GET 405。
|
|
30
|
+
- 变异测试:**155/155 全部被咬住**(新增 FB「一个坏端点废掉整个下拉」、FC「面板内容区又不可滚」)。
|
|
31
|
+
- 测试抓到一个真 bug 并修掉:`catch (error)` 遮蔽了外层那个 `let error` ⇒ 单个 provider 的失败原因永远写不进去。
|
|
32
|
+
- `typecheck` 0 错误。
|
|
33
|
+
## [0.14.0] — 2026-09-30(照 dsh-prompt-optimizer 移植:优化选项卡片 + 它的提示词与本体)
|
|
34
|
+
|
|
35
|
+
起因(用户原话):**「https://github.com/WestFox-AwA/dsh-prompt-optimizer 全面模仿他的 UI 和 UI 中的所有功能,效果是与快捷指令部分 ui 拼接在一起,也模仿他的内部提示词」**。
|
|
36
|
+
|
|
37
|
+
### 1. 「优化选项」卡片进面板(不再需要去设置页)
|
|
38
|
+
|
|
39
|
+
「快捷指令」面板的**优化提示词那一半**顶部现在有一张卡片,七行控件(每行 tooltip 都写清了它到底做什么):
|
|
40
|
+
权限 审查/自动 · 协作基调 普通/硬邦邦 · 模型 跟随会话/指定 · 上下文 回合 0–10 或全文 ·
|
|
41
|
+
只读工具 开/关 · 内置 Bash 开/关(默认关)· 详情(改**当前档位**的提示词 / 恢复内置)。
|
|
42
|
+
档位(关闭 / 轻度 / 标准 / 重度)留在面板标题行 —— 一眼看到强度再点 ✨。
|
|
43
|
+
**每个开关都真的有用**:上下文回合数会真的改变发出去的往来条数(0 = 不带、全文 = 尽量给全);
|
|
44
|
+
权限「自动」= 跑完自动写回输入框,但**只在输入框仍停在发起时那份原文**时才写(你在优化期间
|
|
45
|
+
手写的字绝不会被吃掉);关闭档不调用模型(面板把 ✨ 变灰并说明原因)。
|
|
46
|
+
|
|
47
|
+
### 2. 提示词与条目本体换成它那一套
|
|
48
|
+
|
|
49
|
+
硬规则 1–8 逐字搬(含「轮次之间不遗传」)、四档策略照 `strategy.js`、可选「硬邦邦」基调、
|
|
50
|
+
六领域质量维度。条目本体换成它的六类:`user_requirement` / `quality_interpretation` /
|
|
51
|
+
`observed_fact` / `implementation_option` / `proposal` / `unknown`(+ `unknownClass` + `candidates`),
|
|
52
|
+
并各自带必填依据:要求必须逐字引文、质量解读必须有 `rationale`、事实必须有 `sourceRefs`。
|
|
53
|
+
|
|
54
|
+
### 3. 成品 = 「原话原样 + 辅助小节」;**撤掉记忆链**
|
|
55
|
+
|
|
56
|
+
旧本体的 `rewrite` 回填(唯一能改写你原话的路径)整条撤掉:成品永远以你的原话开头,
|
|
57
|
+
条目只作为【你要的】等小节追加在后面 —— 这是**结构不变量**,有变异守护。
|
|
58
|
+
记忆链(0.12.0 的"接着改时把上一轮成品一起给")也撤了:它是"轮次之间不遗传"的直接违反,
|
|
59
|
+
宿主/客户端/台账里都不再有它。
|
|
60
|
+
|
|
61
|
+
### 4. 内置 Bash 真做(默认关)
|
|
62
|
+
|
|
63
|
+
解释层可以跑 shell 命令核对事实:**锁定会话工作目录**、单条**超时 20 秒并杀掉整棵进程树**、
|
|
64
|
+
输出截断(4000 字,如实标注)、命令长度上限、逐条记账。关着的时候**不把工具注册给模型**
|
|
65
|
+
(模型看不到它),与上游同一做法。它是"有界的、记账的、可关的",**不是沙箱**。
|
|
66
|
+
|
|
67
|
+
### 5. 保留我们自己的机制
|
|
68
|
+
|
|
69
|
+
结果框(逐条流水 + 依据)、「插入输入框」、✕ = 收起 / 点两次 = 丢弃、逐轮台账、只读工具默认关,
|
|
70
|
+
以及 0.13.2 的那些"别让一次真花了钱的结果消失"的细节,全部照旧。
|
|
71
|
+
|
|
72
|
+
### 归属
|
|
73
|
+
|
|
74
|
+
移植文本出自 [WestFox-AwA/dsh-prompt-optimizer](https://github.com/WestFox-AwA/dsh-prompt-optimizer)
|
|
75
|
+
(BSD-3-Clause,© 2026 啃轮胎的西狐);完整许可与逐文件清单见 [NOTICE](NOTICE)。本插件自身仍按 MIT 发布。
|
|
76
|
+
|
|
77
|
+
|
|
5
78
|
## [0.13.2] — 2026-09-30(✕ 改成「收起」:结果不再被删;另给一个点两次的「丢弃」;结果框不再像浮窗)
|
|
6
79
|
|
|
7
80
|
起因(用户原话):**「快捷指令面板和提示词优化面板在同一页面。现在它提示词优化是悬浮的特别是我点叉关闭之后居然恢复不了」**。
|
package/NOTICE
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
dsh-composer-ux(本插件)
|
|
2
|
+
Copyright (c) 2026 fangwen9527
|
|
3
|
+
本项目按 MIT 许可发布,全文见 LICENSE。
|
|
4
|
+
|
|
5
|
+
================================================================================
|
|
6
|
+
第三方组件与移植文本的归属(0.14.0 起)
|
|
7
|
+
================================================================================
|
|
8
|
+
|
|
9
|
+
上游项目:dsh-prompt-optimizer
|
|
10
|
+
仓库:https://github.com/WestFox-AwA/dsh-prompt-optimizer
|
|
11
|
+
作者:啃轮胎的西狐(WestFox-AwA)
|
|
12
|
+
版权:Copyright (c) 2026 啃轮胎的西狐
|
|
13
|
+
许可:BSD 3-Clause License(全文见本文件末尾)
|
|
14
|
+
|
|
15
|
+
本插件在 0.14.0 里**逐字移植**了它的下列内容(只把「输出格式」那一节改写成我们自己的成品契约,
|
|
16
|
+
其余一字未改;三处刻意差异与理由写在对应源文件的文件头):
|
|
17
|
+
|
|
18
|
+
· `po06/lib/interpreter.js` 的 `SYSTEM_PROMPT`(硬规则 1–8)与 `HARD_NOTE_SYSTEM`(硬邦邦基调)
|
|
19
|
+
· `po06/lib/strategy.js` 的 `TIER_STRATEGY`(四档策略:mode / candidates / maxItems / qualityDims / depth)
|
|
20
|
+
· `po06/lib/strategy.js` 的 `DOMAINS`(六个领域的质量维度与两条不许越的线)
|
|
21
|
+
|
|
22
|
+
落在本插件的这些文件里(每个文件头都写明了出处与差异):
|
|
23
|
+
· src/optimizer-transplant.ts —— 上述移植文本本体
|
|
24
|
+
· src/optimizer-prompt.ts —— 装配顺序与档位策略的接线
|
|
25
|
+
· src/optimizer-assemble.ts —— 条目本体(六类)、必填依据校验、成品装配
|
|
26
|
+
|
|
27
|
+
接口与机制层面另有借鉴(0.6 线):条目化产出、逐字引文、只丢单条、降级出声、
|
|
28
|
+
固定节序与篇幅预算。这些是机制而非文本,同样致谢。
|
|
29
|
+
|
|
30
|
+
================================================================================
|
|
31
|
+
BSD 3-Clause License(dsh-prompt-optimizer 的原许可,随附全文)
|
|
32
|
+
================================================================================
|
|
33
|
+
|
|
34
|
+
Copyright (c) 2026 啃轮胎的西狐
|
|
35
|
+
All rights reserved.
|
|
36
|
+
|
|
37
|
+
Redistribution and use in source and binary forms, with or without
|
|
38
|
+
modification, are permitted provided that the following conditions are met:
|
|
39
|
+
|
|
40
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
41
|
+
list of conditions and the following disclaimer.
|
|
42
|
+
|
|
43
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
44
|
+
this list of conditions and the following disclaimer in the documentation
|
|
45
|
+
and/or other materials provided with the distribution.
|
|
46
|
+
|
|
47
|
+
3. Neither the name of the copyright holder nor the names of its
|
|
48
|
+
contributors may be used to endorse or promote products derived from
|
|
49
|
+
this software without specific prior written permission.
|
|
50
|
+
|
|
51
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
52
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
53
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
54
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
55
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
56
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
57
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
58
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
59
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
60
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
package/README.md
CHANGED
|
@@ -129,7 +129,7 @@ dsh plugin --profile web add <你克隆或解压出来的目录>
|
|
|
129
129
|
- 两种模式**同时存在**时,新会话的第一条消息里**两批都附**:「每次」的那几条在前、「仅首次」的那几条在后,一起拼到末尾(第二条起就只剩「每次」的了)。
|
|
130
130
|
- 为什么是一个三选一控件、而不是两个勾选框:「每次」与「仅首次」互斥,两个独立勾选框能造出「同时又每次又仅首次」的矛盾状态;三选一只发出一个 mode,由 `withInsertMode` 一次把两个标志写对。
|
|
131
131
|
- 手工编辑文件时若把 `autoSend` 与 `autoSendFirst` 都写成 `true`,按「每次」处理(每次插入本来就包含第一次),并在下次写盘时修正回互斥状态。
|
|
132
|
-
- **优化提示词**:把输入框里的话交给**另一个 AI** 整理成一条能直接发给工作 AI
|
|
132
|
+
- **优化提示词**:把输入框里的话交给**另一个 AI** 整理成一条能直接发给工作 AI 的清晰指令。四档强度(0.14.0 起照 dsh-prompt-optimizer):**关闭 / 轻度 / 标准(默认)/ 重度** —— 档位=依据预算与思考方式;旧设置里的 普通/高级/极端 会自动迁移成 轻度/标准/重度。
|
|
133
133
|
- **0.12.0 起结果进「结果框」,不再自动改写你的输入框**:点「优化提示词」(或工具行的 ✨ 按钮)后面板里展开一个结果框 —— 跑的时候**逐条**显示它在核实什么,跑完把**成品**放进一个可编辑的文本框;你原来写的话一直留在输入框里,改都还能改。
|
|
134
134
|
- **逐条流式,而且每条都已通过校验**:宿主边收边扫,把**已经闭合、且引文在你原话里逐字存在**的条目一条条推过来;对不上的走 `dropped` 如实记账。所以框里出现的每一条都是"成品里可能出现的那条",不会先闪一下再消失。成品要等整段输出到齐、逐条校验装配完才存在,由最后的 `done` 一次给出。
|
|
135
135
|
- **「插入输入框」由你决定何时写回**:覆盖全文(`Ctrl+Z` 可还原),斜杠命令前缀(`/goal`)原样拼回。**若你在优化期间改过输入框**,第一次点只提示、第二次点才覆盖 —— 不静默吃掉你刚写的内容。
|
|
@@ -243,7 +243,13 @@ dsh plugin --profile web add <你克隆或解压出来的目录>
|
|
|
243
243
|
|
|
244
244
|
出网请求由宿主的模型适配器发出,浏览器侧碰不到模型路由;宿主半与客户端半之间也没有别的受支持通道。所以「优化提示词」是一次往返:浏览器 `POST /composer-ux/optimize` → 宿主用 `ctx.get('llm').stream(...)` 独立跑一次模型调用 → 把装配好的正文回给浏览器填进输入框。这条路径与 [WestFox-AwA/dsh-prompt-optimizer](https://github.com/WestFox-AwA/dsh-prompt-optimizer) 同构。
|
|
245
245
|
|
|
246
|
-
|
|
246
|
+
**提示词的来历(如实写)**:**0.14.0 起,解释层的提示词与条目本体是逐字移植它的**(见 [NOTICE](NOTICE)):
|
|
247
|
+
`po06/lib/interpreter.js` 的 `SYSTEM_PROMPT`(硬规则 1–8)与 `HARD_NOTE_SYSTEM`(硬邦邦基调)、
|
|
248
|
+
`po06/lib/strategy.js` 的 `TIER_STRATEGY`(四档策略)与 `DOMAINS`(六领域质量维度)一字未改,
|
|
249
|
+
只把【输出格式】那一节改写成我们自己的成品契约(我们产出条目、由宿主装配成「原话 + 辅助小节」)。
|
|
250
|
+
三处刻意差异与理由写在 `src/optimizer-transplant.ts` 的文件头。
|
|
251
|
+
|
|
252
|
+
更早的来历:0.5.x 那三档是逐字提取自它 0.5 线的 `lib/index.js`(BSD-3-Clause,作者「啃轮胎的西狐」)。0.6.0 起机制与提示词都改按它 **0.6 线**(`po06/lib/interpreter.js` 的 `SYSTEM_PROMPT` + `validateProvenance`、`po06/lib/compiler.js` 的固定节序与预算丢弃)**重写**,不再是逐字提取 —— 那些文件里没有现成可抄的"三档改写提示词",能借的是机制本身:条目化产出、逐字引文、只丢单条、降级出声。落在 `src/optimizer-prompt.ts`(提示词)与 `src/optimizer-assemble.ts`(校验 + 装配)两个文件,署名与来源说明保留在各个文件头。
|
|
247
253
|
|
|
248
254
|
优化用的模型**跟随你当前的默认模型**(`agentDefaultModel.currentSelection()`),不额外配置;每次优化会花一次模型调用,但**不占对话轮次、不进会话历史**。
|
|
249
255
|
|
|
@@ -500,7 +506,7 @@ Windows 上 DSH 给模型的终端工具是 **PowerShell**(工具名 `pwsh`)
|
|
|
500
506
|
| 工具循环的消息形状 / 轮次封顶 / 异常必须降级 | 同上第 6 节(假 llm 驱动整条循环,逐条检查 `role:'tool'` 与 `toolCallId`) |
|
|
501
507
|
| 工具路径:默认关、开了才派、**查完吐散文必须回落**、拿不到工作目录就不派 | `test/quick-commands.mjs` 5g 节(13 条,真路由 + 假 llm) |
|
|
502
508
|
| 工具读到的内容不进台账 | 同 5g 节:断言台账里只有工具名与次数、没有读到的文件内容 |
|
|
503
|
-
| 变异守卫真的会咬人,且**必须是指定的那条测试变红** | `npm run test:mutations`:**
|
|
509
|
+
| 变异守卫真的会咬人,且**必须是指定的那条测试变红** | `npm run test:mutations`:**155 条全部咬住**(判据是 `red.some(line => line.includes(item.expect))`,不是"有红就行") |
|
|
504
510
|
| 发布门禁三条判据 | `npm run gates` 全过;`check:tag` 实测 `v0.12.0` 的 tag 名与所指提交里的版本一致 |
|
|
505
511
|
| 三平台 CI | GitHub Actions:ubuntu / windows / macos × Node 20(`npm ci → typecheck → build → test → check:pack → check:docs`) |
|
|
506
512
|
|
|
@@ -633,9 +639,9 @@ node build.mjs # 产出 lib/index.js + lib/client.js
|
|
|
633
639
|
# ⚠️ 宿主半会**内联** schemastery / cosmokit:
|
|
634
640
|
# 优先用 DSH 检出里的 vendor 副本,检出不在时退到 node_modules
|
|
635
641
|
# 里同版本的 npm 包(两者逐字节相同)——CI 上走的就是退路
|
|
636
|
-
npm test # 22 个套件;当前
|
|
642
|
+
npm test # 22 个套件;当前 2293 passed, 0 failed(2026-09-29 实测;CI 三平台同样全绿)
|
|
637
643
|
# 走 scripts/run-tests.mjs:顺带把"多少套件/多少条"记进 test/.last-run.json
|
|
638
|
-
npm run test:mutations # 手动跑:变异测试,证明那套护栏真的在咬人(
|
|
644
|
+
npm run test:mutations # 手动跑:变异测试,证明那套护栏真的在咬人(155 条,须单独跑)
|
|
639
645
|
# 同样记录结果,供下面的文档门禁核对
|
|
640
646
|
npm run gates # 发版门禁三条一起跑:tag 指向 / 包内容 / 文档数字
|
|
641
647
|
npm run check:tag # ① tag 名里的版本 == 该 tag 所指提交里的 package.json 版本
|