dsh-switchman 1.11.6 → 1.11.7

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.zh.md CHANGED
@@ -12,30 +12,27 @@
12
12
 
13
13
  用 DSH 干活久了有两件烦心事:一是会话越聊越重,上下文被历史撑到几十万 token,模型开始忘事、变慢、变贵,手动 /compact 又丢细节;二是主力模型什么都自己干,查个文件、跑个测试、对个数据都是它在啃,大半活其实该交给便宜模型。
14
14
 
15
- dsh-switchman 是一个 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)(DSH)插件。装上之后,主模型从「亲自干活」变成调度员:量水位、选车道、派任务、盯验收。它不是新模型,是一套挂在 DSH 上的调度规程加一个配置界面,一共做八件事:
15
+ dsh-switchman 是一个 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)(DSH)插件。装上之后,主模型照旧亲自干活,只是从此干得更精明:有所选择地干——轻活小活派进便宜的车道,急活难活按意图自动落位,最值得出手的部分才亲自上;摒弃臃肿、提炼精华地干——消化过的旧账自动折叠成紧凑摘要,水位表全程盯着量入为出,上下文始终轻装上阵;忙不过来就带团队干——拉常驻队友上共享任务板分工,自己退到调度与验收。它不是新模型,是一套挂在 DSH 上的调度规程加一个配置界面,一共做九件事:
16
16
 
17
- **1. 上下文水位:长会话不撑爆。** 每轮实时统计会话 token,三条水位线逐级加码:80k(soft,可调)提醒「该委派了」;95k(hard)收紧单次读取预算、引导收尾;150k(force)自动交接——写交接文档(追加式会话日志本身就是完整备份)、压缩上下文、唤醒续跑,任务不断线。交接那一刻还在跑的后台子智能体也不会丢:id、任务、报告路径都写进交接文档,续跑的会话知道去哪收报告,不会重复派活。每个子智能体自带独立硬顶,到顶写完 HANDOFF 摘要退场。自动干预不合手时可临时接管:`/ctx-pause` 停掉全部水位动作(测量照跑、尾部水位行转成 paused,只是不动手),`/ctx-resume` 随时恢复——重启 DSH 后干预也会自动回来,是临时放手,不是永久关闭;`/ctx-handover` 不等水位到顶,主动发起同一次交接:写交接文档、压缩上下文、唤醒续跑(会话先被引导到空闲边界,结果可能要等几分钟)。
17
+ **1. 上下文自动裁剪:会话越聊越长,成本始终压得住。** 手动 `/compact` 要等人、会丢细节,还把服务商的提示词缓存打穿。裁剪引擎把这些全自动:已被消化掉的对话区间,在空闲边界被折叠成紧凑的确定性摘要(side model 执笔,紧急压力下走无模型的机械折叠),此后每个出站请求都由折叠状态重建——摘要块顶替旧区间,活动尾部原样保留;存储的会话日志一个字节不改写,流式过程中绝不动手。折叠只追加、重建确定,两次折叠之间前缀字节不变,缓存照常命中;出问题一律 fail-open 退回透传,绝不产生坏请求。三档全自动(增长闸门 / 压力 / 紧急),另有 advisory 档让模型自己动手折——机制细节见文末「自动上下文裁剪」。
18
18
 
19
- **2. 六个派发池:什么活配什么模型。** 轻量池(批量小活)、机械池(模板化改写)、主力池(日常编码)、高难池(高难推理与大规模重构)、多模态池(看图)、复审池(独立验证)。设置页里勾候选、排优先级、标 S/A/B/C 档,还能给每条路线单独钉思考强度——档位下拉来自该模型真实支持的级别,不是通用三档。主模型每轮提示词里都带着一张 `[SWITCHMAN:POOLS]` 推荐表,照表派活。执行模式三态:关闭 / 建议 / 强制(强制 = 池外模型直接拒绝)。
19
+ **2. 上下文水位:长会话不撑爆。** 每轮实时统计 token,三条水位线逐级加码:80k(soft,可调)提醒「该委派了」;100k(hard)收紧单次读取预算、引导收尾;200k(force)自动交接——写交接文档(追加式会话日志本身就是完整备份)、压缩上下文、唤醒续跑,任务不断线。交接那一刻还在跑的后台子智能体也不丢:id、任务、报告路径都写进交接文档,续跑的会话知道去哪收报告、不重复派活;每个子智能体另有独立硬顶,到顶写完 HANDOFF 摘要退场。水位读的是裁剪后模型真正看到的 view,重度折叠的会话不会被钉死在高位。不合手时可临时接管:`/ctx-pause` 停掉干预(测量照跑),`/ctx-resume` 随时恢复、重启后自动回来;`/ctx-handover` 不等水位到顶,主动发起同一次交接。
20
20
 
21
- **3. Agent Teams 模式:从单干到带团队。** 默认关闭,装完就是轻量的 subagent 派发。设置页两个独立开关:
21
+ **3. 意图识别自动抉择:消息进来,模型自动落位。** 给会话选上「Auto(意图识别)」,每条用户消息先由分类器小模型判型,落到最合适的候选——每个候选可附一句能力描述,供判型参考。同一轮锁定决策:置信度不足、或仍在缓存窗口内时沿用当前模型(prompt cache 续用,不白烧缓存钱);置信度够高、或当前模型不在候选里才切换。切换在调用层静默完成,会话里不留「模型已切换」的噪音,输入框上方 chip 实时显示当前路由与置信度。分类器用决策小模型或通用对话模型都行,候选、阈值、缓存窗口随时回设置页调。
22
22
 
23
- - **智能体团队模式**——打开后注入团队规程(默认委派 + 分级验证 + 共享任务板纪律),并自动启用 DSH 的 Agent Teams:主模型可以拉常驻队友(`spawn_teammate`)、往共享任务板派活(`team_task_*`)、和队友互发消息。什么时候建团队有明确纪律:可并行的独立子任务、量大且自包含、主上下文水位已高、需要角色分离;一次性的单点调查仍走 subagent。再关掉开关,团队条款零残留,也不会撤走正在运行的会话里的团队工具。
24
- - **同步子智能体模型白名单**——DSH 有张「允许 Agent 为子智能体选择模型」的授权白名单:池里选了但没授权的路线,点名派发会被拒(团队模式下会标 ⚠)。打开这个开关,六个池的并集整体写入那张白名单——switchman 做唯一事实源,不用两边重复配置。白名单按「新建会话」快照生效,同步只对之后新开的会话起作用。
23
+ **4. Agent Teams:从单干到带团队。** 默认关闭——装完就是轻量的 subagent 派发,想带团队再开。设置页两个独立开关:**智能体团队模式**,打开后注入团队规程(默认委派 + 分级验证 + 共享任务板纪律),并自动启用 DSH 的 Agent Teams:主模型可拉常驻队友(`spawn_teammate`)、往共享任务板派活(`team_task_*`)、与队友互发消息;建团有明确纪律——可并行的独立子任务、量大且自包含、主上下文水位已高、需要角色分离,一次性的单点调查仍走 subagent;关闭后团队条款零残留,也不打扰运行中的会话。**子智能体模型白名单同步**,把六个池的并集整体写入 DSH 的授权白名单——switchman 做唯一事实源,不用两边重复配置(按新建会话快照生效)。
25
24
 
26
- 会话头部有直观反馈:⚡「自主团队」徽标、◇ 当前会话实际模型;自动交接进行时出现「交接进行中 · 写入交接文档 / 压缩上下文 / 唤醒续接」的实时提示。
25
+ **5. 六个派发池:什么活配什么模型。** 轻量池(批量小活)、机械池(模板化改写)、主力池(日常编码)、高难池(高难推理与大规模重构)、多模态池(看图)、复审池(独立验证)。设置页勾候选、排优先级、标 S/A/B/C 档,每条路线可单独钉思考强度——档位下拉来自该模型真实支持的级别。主模型每轮提示词都带着一张 `[SWITCHMAN:POOLS]` 推荐表,照表派活;执行模式三态:关闭 / 建议 / 强制(强制 = 池外模型直接拒绝)。
27
26
 
28
- **4. 语言偏好:问一次,记一辈子。** 回复、代码注释、文档三种语言各一个下拉,作用域可选全局或按项目(`.switchman/lang.json`)。不设也行——首次用到时用你 DSH 界面的语言问一次,记住后每个会话自动遵守。
27
+ **6. 语言偏好:问一次,记一辈子。** 回复、代码注释、文档三种语言各一个下拉,作用域可选全局或按项目(`.switchman/lang.json`)。不设也行——首次用到时用你 DSH 界面的语言问一次,记住后每个会话自动遵守。
29
28
 
30
- **5. 界面语言:插件自己也说你的话。** 设置页顶部的「界面」区里一个「界面语言」下拉(设置键 `uiLocale`):自动(默认,跟随 DeepSeek Harness 应用语言),或手动选任一内置界面语言——选项一律显示语言原名、不作翻译。它只切换本插件自己的界面(徽标、首页面板、设置页),不动 DSH 应用语言:选中即实时预览、无需重启,保存后记住、下次启动自动恢复,任何失败都回退到应用语言;词典全部内联在插件包里,无需下载。
29
+ **7. 界面语言:插件自己也说你的话。** 设置页顶部的「界面」区里一个「界面语言」下拉(设置键 `uiLocale`):自动(跟随 DeepSeek Harness 应用语言;出厂默认为简体中文),或手动选任一内置界面语言——选项一律显示语言原名、不作翻译。它只切换本插件自己的界面(徽标、首页面板、设置页),不动 DSH 应用语言:选中即实时预览、无需重启,保存后记住、下次启动自动恢复,任何失败都回退到应用语言;词典全部内联在插件包里,无需下载。
31
30
 
32
- **6. 分级验证:改完必查。** 超过 20 行的改动交 tester 验证;超过 300 行、或动了核心 / 安全 / 数据一致性逻辑,再交一个 reviewer 独立复审。复审模型锚定「写出这份 diff 的智能体」所用的模型来选,尽量避开;池里实在避不开时,会在结论里声明 DOWNGRADED。你说一句「不要用团队」,它立刻退回单干。
31
+ **8. 分级验证:改完必查。** 超过 20 行的改动交 tester 验证;超过 300 行、或动了核心 / 安全 / 数据一致性逻辑,再交一个 reviewer 独立复审。复审模型锚定「写出这份 diff 的智能体」所用的模型来选,尽量避开;池里实在避不开时,会在结论里声明 DOWNGRADED。你说一句「不要用团队」,它立刻退回单干。
33
32
 
34
- **7. `/vision`:纯文本模型也能处理图。** 主力模型读不了图时,DSH 会在入口直接拒掉带图消息。贴上图、输入 `/vision 这张图错在哪`,图片会被交给多模态池的模型去读,结论回到当前会话。输入框上方会提前提示「当前模型不支持读图」;直接发图被拒时,自动改写成 `/vision` 重发一次,不用手动重来;多模态池没配时命令会拒绝并给出配置指引。
33
+ **9. `/vision`:纯文本模型也能处理图。** 主力模型读不了图时,DSH 会在入口直接拒掉带图消息。贴上图、输入 `/vision 这张图错在哪`,图片会被交给多模态池的模型去读,结论回到当前会话。输入框上方会提前提示「当前模型不支持读图」;直接发图被拒时,自动改写成 `/vision` 重发一次,不用手动重来;多模态池没配时命令会拒绝并给出配置指引。
35
34
 
36
- **8. 意图识别自动选模型:消息进来,模型自动落位。** 设置页新增【意图识别】分组:主开关(默认关闭,开启需配置分类器并至少一个候选)、分类器小模型路由(provider + model + 可选 effort,TypeSafe Jev 类决策模型与通用对话模型都支持,输出宽容解析)、分类器类型三选(auto / decision / chat)、独立候选模型列表(每个候选 provider + model + 可选 effort + 一句能力描述)、缓存窗口秒数(默认 300,对齐厂商 prompt cache 约 5 分钟)、切换置信度阈值(默认 80)、分类超时(默认 60000ms)、历史消息条数(默认 6)与字符预算(默认 2400)、可选兜底模型(可单独固定可选 effort;未固定时使用所选兜底模型的默认 effort,与分类器 effort 独立)。模型选择器出现「Auto · Switchman」分组下的「Auto」入口(客户端渲染为本地化的「自动(意图识别)」);选中后每条用户消息先由分类器判定最合适的候选,同一轮锁定决策:置信度不足或仍在缓存窗口内时优先沿用当前模型(缓存续用),置信度足够高或当前模型不在候选里才切换;切换在调用层静默完成,不往会话里插「模型已切换」。输入框上方有状态 chip(自动路由时显示当前路由模型与上次决策置信度),候选与阈值随时回设置页查看。
37
-
38
- 只有一个模型也值得装——水位控制和分级验证与模型数量无关,单模型长会话同样受益。
35
+ 只有一个模型也值得装——自动裁剪、水位控制、分级验证都与模型数量无关,单模型长会话同样受益;意图识别要有多模型候选才有意义,留着以后扩编再用。
39
36
 
40
37
  ## 捆绑技能
41
38
 
@@ -75,7 +72,7 @@ dsh-switchman 是一个 [DeepSeek Harness](https://github.com/deepseek-ai/deepse
75
72
  - **派发池**——六张卡片两行三列:上排轻量、机械、主力,下排高难、多模态、复审。卡片按供应商分组勾候选模型;勾上「手动序」变成编号优先列表,用 ⤒(一键登顶)、↑、↓、× 调顺序;每条路线可钉思考强度(默认「跟随泳道」)。顶部汇总行实时更新,图中即「已配置 4/6 池 · 排名 2 项 · 模式 建议」。
76
73
  - **能力排序 + 执行模式**——六池选中模型的并集按能力排序、最强在前(图中 glm-5.3 锚 S 档、glm-5.3-flash 锚 A 档),可调序、可删减;执行模式建议 / 强制(强制 = 池外模型直接拒绝)。
77
74
  - **智能体团队**——团队模式与白名单同步两个开关,默认全关;图中为开启状态,开关下方有同步状态行。
78
- - **上下文水位**——三档阈值(图中 80000 / 120000 / 150000)、单次读取预算(3000)、硬档行为(限流放行 / 拦截)、自动交接开关、子智能体独立上限,都在这区。底部一行命令:`/ctx-pause` 暂停干预 · `/ctx-resume` 恢复 · `/ctx-handover` 立即交接(它会把会话引导到空闲边界再压缩,结果可能要等几分钟)。
75
+ - **上下文水位**——三档阈值(图中 80000 / 100000 / 200000)、单次读取预算(3500)、硬档行为(限流放行 / 拦截)、自动交接开关、子智能体独立上限,都在这区。底部一行命令:`/ctx-pause` 暂停干预 · `/ctx-resume` 恢复 · `/ctx-handover` 立即交接(它会把会话引导到空闲边界再压缩,结果可能要等几分钟)。
79
76
  - **意图识别**——主开关、分类器小模型路由、分类器类型(auto / decision / chat)、独立候选列表(每项附一句能力描述)、缓存窗口 / 置信度阈值 / 分类超时 / 历史消息预算、可选兜底模型。开启后模型选择器出现「自动(意图识别)」入口,输入框上方显示当前路由模型与置信度 chip。
80
77
 
81
78
  4. **验证**——会话头部出现 ⚡「自主团队」徽标(旁边 ◇ 显示当前会话模型);或者直接问模型「你系统提示词最后一段标题是什么」,答案应提到 dsh-switchman 规程。
@@ -92,19 +89,19 @@ bash <安装目录>/skills/db-query/scripts/setup.sh
92
89
 
93
90
  以下为新安装后的全部默认值(权威来源:`host/config.js` 的 zod schema)。
94
91
 
95
- **界面与语言**:`uiLocale` = `auto`(跟随 DSH 应用语言);`langScope` = `global`;`langConversation/Comments/Docs` = 空(首次对话问一次后记住;注释与文档语言跟随对话语言)。
92
+ **界面与语言**:`uiLocale` = `zh`(简体中文,出厂默认;`auto` 跟随 DSH 应用语言);`langScope` = `project`;`langConversation` = `zh-CN`,`langComments/Docs` = 空(出厂默认;清空后首次对话问一次后记住;注释与文档语言跟随对话语言)。
96
93
 
97
94
  **派发池**:六条泳道(economy/mechanical/main/hard/vision/review)候选均为空(= 用系统默认模型,不干预);手动排序与 effort 钉选均为关/空;`dispatchEnforce` = `advice`(建议不强制)。
98
95
 
99
- **上下文水位**:soft `80000` / hard `95000` / force `150000` tokens;单次读取预算 `3000`;超预算行为 `cap`(截断加警告);`wmAutoHandover` = 开(force 档自动写交接文档+压缩);子会话硬顶 = 开(共享 150k)。
96
+ **上下文水位**:soft `80000` / hard `100000` / force `200000` tokens;单次读取预算 `3500`;超预算行为 `cap`(截断加警告);`wmAutoHandover` = 开(force 档自动写交接文档+压缩);子会话硬顶 = 开(共享 200k)。
100
97
 
101
- **Agent Teams**:`teamsMode` = 关;`syncWhitelist` = 关(两者相互独立)。
98
+ **Agent Teams**:`teamsMode` = 开;`syncWhitelist` = 开(两者相互独立)。
102
99
 
103
- **意图识别**(默认不可用,需配置分类器 + 至少一个候选 + 打开主开关):`intentEnabled` = 关(关闭时 Auto 入口隐藏,已选 Auto 的会话走兜底链);分类器路由未设置;分类器类型 `chat`;候选列表空(预置分类需填模型才参与路由);缓存窗口 `300` 秒 / 切换置信度 `80` / 分类超时 `60000` ms;历史 `6` 条 / `2400` 字符;`intentContextWindow` = `200000`。
100
+ **意图识别**(默认不可用,需配置分类器 + 至少一个候选 + 打开主开关):`intentEnabled` = 关(关闭时 Auto 入口隐藏,已选 Auto 的会话走兜底链);分类器路由未设置;分类器类型 `chat`;候选列表空(预置分类需填模型才参与路由);缓存窗口 `300` 秒 / 切换置信度 `80` / 分类超时 `60000` ms;历史 `6` 条 / `2400` 字符;`intentContextWindow` = `250000`。
104
101
 
105
- **上下文裁剪**:`trimEnabled` = 开;`trimMode` = `auto`(全自动);增长闸门 `22500` token + 增量 `25000` token;压力 `65%` / 紧急 `95%`;advisory 提醒 `65%` / `95%`;保护尾部 `10` 条;折叠节奏上限每小时 `30` 次;side model 未设置(继承会话模型)——详见下文「自动上下文裁剪」一节。
102
+ **上下文裁剪**:`trimEnabled` = 开;`trimMode` = `advisory`(提醒+折叠工具,模型自行折叠;全自动需切回 `auto`);增长闸门 `22500` token + 增量 `45000` token;压力 `45%` / 紧急 `90%`;advisory 提醒 `50%` / `80%`;保护尾部 `6` 条;折叠节奏上限每小时 `30` 次;side model 未设置(继承会话模型)——详见下文「自动上下文裁剪」一节。
106
103
 
107
- **开箱要点**:① 意图识别开箱不可用是有意设计,三步开启(分类器、候选、开关);② Auto 有效窗口开箱即为 200000——护栏保证 0.8×窗口 ≥ force 档(150000),核心压缩线(160000)永远在平滑交接线(150000)之后;③ 开箱最有感的是水位三件套:80k 提醒委派 / 95k 收敛读取 / 150k 自动交接(写文档+压缩),无需任何设置。
104
+ **开箱要点**:① 意图识别开箱不可用是有意设计,三步开启(分类器、候选、开关);② Auto 有效窗口开箱即为 250000——护栏保证 0.8×窗口 ≥ force 档(200000),核心压缩线(200000)恰好落在平滑交接线(200000)上;③ 开箱最有感的是水位三件套:80k 提醒委派 / 100k 收敛读取 / 200k 自动交接(写文档+压缩),无需任何设置。
108
105
 
109
106
  ## 自动上下文裁剪
110
107
 
@@ -113,23 +110,25 @@ bash <安装目录>/skills/db-query/scripts/setup.sh
113
110
  自动化层级(`trimMode`):
114
111
 
115
112
  - **`off`**——只测量:用量与缓存命中采样照常运行;无横幅、无折叠。
116
- - **`advisory`**——会话模型自己折叠:向其暴露 `ctx_trim_fold` 与 `ctx_trim_status` 工具和协议头。会话压力达到有效窗口的 `trimAdvisoryPercent` 时,引擎将一次性固定折叠提醒作为 `user/message` 后缀追加到实时会话 surface 尾部(不修改本次派发的 system 头)——升级到 critical 立即重发,压力回落到线下后清除。
117
- - **`auto`**(默认)——以上全部,外加空闲边界上的自动折叠,分三档:增长闸门(自上次折叠后的低谷起算的增长 > `trimGrowthTokens`——该锚点保证高位折叠后闸门依然有效——且连续可压缩增量 ≥ `trimIncrementTokens`)、压力档(上下文窗口的 `trimPressurePercent`)、紧急档(`trimEmergencyPercent`——带独立冷却的机械折叠)。
113
+ - **`advisory`**(默认)——会话模型自己折叠:向其暴露 `ctx_trim_fold` 与 `ctx_trim_status` 工具和协议头。会话压力达到有效窗口的 `trimAdvisoryPercent` 时,引擎将一次性固定折叠提醒作为 `user/message` 后缀追加到实时会话 surface 尾部(不修改本次派发的 system 头)——升级到 critical 立即重发,压力回落到线下后清除。压力到达临界线时引擎自身会执行一次机械救援折叠(90 秒冷却,`trimCriticalRelief` = 开)。
114
+ - **`auto`**——以上全部,外加空闲边界上的自动折叠,分三档:增长闸门(自上次折叠后的低谷起算的增长 > `trimGrowthTokens`——该锚点保证高位折叠后闸门依然有效——且连续可压缩增量 ≥ `trimIncrementTokens`)、压力档(上下文窗口的 `trimPressurePercent`)、紧急档(`trimEmergencyPercent`——带独立冷却的机械折叠)。
118
115
 
119
116
  所有键位于 设置 → dsh-switchman;默认值出自 `host/config.js`:
120
117
 
121
118
  | 键 | 默认值 | 含义 |
122
119
  | --- | --- | --- |
123
120
  | `trimEnabled` | `true` | 总开关。关闭后折叠与度量全部停用(监听器退化为纯透传)。 |
124
- | `trimMode` | `auto` | `off` 只测量 / `advisory` 模型自折 / `auto` 系统自动折。 |
121
+ | `trimMode` | `advisory` | `off` 只测量 / `advisory` 模型自折 / `auto` 系统自动折。 |
125
122
  | `trimGrowthTokens` | `22500` | 增长闸门:出站 view 自上次 fold 以来增长到该值即触发折叠。 |
126
- | `trimIncrementTokens` | `25000` | 闸门搭档:连续可压缩增量也须达到该规模。 |
127
- | `trimPressurePercent` | `65` | 压力档:view 用量达到上下文窗口该百分比即折叠。 |
128
- | `trimEmergencyPercent` | `95` | 紧急档:到该百分比强制机械折叠(无 side model 调用)。 |
129
- | `trimAdvisoryPercent` | `65` | advisory 提醒线:压力达到有效窗口的该百分比时,引擎提醒模型立即用 `ctx_trim_fold` 折叠(仅 advisory 模式)。 |
130
- | `trimAdvisoryCriticalPercent` | `95` | critical 提醒线:到线立即重发提醒,不受 10 分钟同档节流限制。 |
123
+ | `trimIncrementTokens` | `45000` | 闸门搭档:连续可压缩增量也须达到该规模。 |
124
+ | `trimPressurePercent` | `45` | 压力档:view 用量达到上下文窗口该百分比即折叠。 |
125
+ | `trimEmergencyPercent` | `90` | 紧急档:到该百分比强制机械折叠(无 side model 调用)。 |
126
+ | `trimAdvisoryPercent` | `50` | advisory 提醒线:压力达到有效窗口的该百分比时,引擎提醒模型立即用 `ctx_trim_fold` 折叠(仅 advisory 模式)。 |
127
+ | `trimAdvisoryCriticalPercent` | `80` | critical 提醒线:到线立即重发提醒,不受 10 分钟同档节流限制。 |
131
128
  | `trimWindowTokens` | `0` | 窗口上限:压力与紧急档按 min(模型窗口, 上限) 计算。`0` = 跟随 `wmForceTokens`。 |
132
- | `trimProtectedTail` | `10` | 最后 N 条消息永不折叠。 |
129
+ | `trimCriticalRelief` | `true` | advisory 临界纾缓:到达 critical 线时引擎自行执行一次机械(紧急档式)折叠,90 秒冷却。 |
130
+ | — | — | trim 百分比与输入框旁的上下文面板不可直接比较:trim 按最近一次实付 prompt(max(view, wire))除以有效窗口(含上限)计算,面板显示的是计量器对下一次 prompt 的预测值除以模型全窗口。 |
131
+ | `trimProtectedTail` | `6` | 最后 N 条消息永不折叠。 |
133
132
  | `trimMaxFoldsPerHour` | `30` | 每滚动小时 side model 折叠的节奏上限(紧急档豁免)。 |
134
133
  | `trimSideModel` | 未设置 | 写摘要的 side model 路由。留空 = 跟随会话当前 provider/model,不继承调用的 effort;ladder distillation 也使用此路由。摘要 effort 可单独手动固定;未固定时按模型元数据推荐最低启用的 reasoning 档,只有开/关选项时选 off。不支持 reasoning 或元数据不可用时不发送 effort,保留模型/适配器默认行为。 |
135
134
  | `trimFoldFallbackModel` | 未设置 | 摘要 side model 失败时折叠改用的重试路由;压力档仍失败则退回机械折叠。留空 = 无兜底。手动选择的折叠兜底模型有独立 effort 固定值;未设置时按摘要模型相同的模型元数据规则推荐,元数据缺失则使用该模型默认值。尽量选择冷却、风控与并发余量充足的路由。 |
@@ -138,7 +137,7 @@ bash <安装目录>/skills/db-query/scripts/setup.sh
138
137
 
139
138
  **触发路径。** 档位检查在空闲边界上运行;在空闲状态事件不可达的宿主上,兜底改为在每次模型流式完成后也检查一次(每个会话节流为每 60 秒至多评估一次)。每个决策——fold 与 no-op 皆然——都以「ISO 时间戳 + `key=value` 字段」的形式追加一行到裁剪状态目录(见 `trimStateDir`)下的 `decisions.log`,为 fold 留下离线审计轨迹;行词汇(`view-applied`、fold 决策/结果行、`surface-replace`、`surface-replace skipped reason=…`)收录于 [docs/context-trim.md](./docs/context-trim.md)。
140
139
 
141
- **线上真值与稳态。** 决策行携带 `view=<n>`,响应落地后还会带上 `wire=<n>`——真实的供应商提示词(未缓存输入 + 缓存读取 + 缓存写入,从流的 usage 事件采样得到)。view 估算只统计 messages 数组,并且总是比线上读数小一个固定开销(实测 ≈ 17.3k:系统提示词 + 工具 schema + persona),所以压力档与紧急档按 `max(view, wire)` 评估,只有 `wire` 才是提示词大小的读数。150k 窗口下,健康的锯齿波在每次 fold 刚结束时线上 ≈ 40k ↔ 下次 fold 时 64–97.5k(占窗口的 ≈27%–65%),每 ~25k 原始增长折叠一次,上限由压力档而非窗口钉在 97.5k 附近。若 `view` 持续攀升却从不出现 `surface-replace` 行,就去读跳过行(`incomplete-seqs`、`no-service`、`compaction-lock`)。
140
+ **线上真值与稳态。** 决策行携带 `view=<n>`,响应落地后还会带上 `wire=<n>`——真实的供应商提示词(未缓存输入 + 缓存读取 + 缓存写入,从流的 usage 事件采样得到)。view 估算只统计 messages 数组,并且总是比线上读数小一个固定开销(实测 ≈ 17.3k:系统提示词 + 工具 schema + persona),所以压力档与紧急档按 `max(view, wire)` 评估,只有 `wire` 才是提示词大小的读数。200k 窗口下,健康的锯齿波在每次 fold 刚结束时线上 ≈ 40k ↔ 下次 fold 时 64–90k(占窗口的 ≈20%–45%),每 ~45k 原始增长折叠一次,上限由压力档而非窗口钉在 90k 附近。若 `view` 持续攀升却从不出现 `surface-replace` 行,就去读跳过行(`incomplete-seqs`、`no-service`、`compaction-lock`)。
142
141
 
143
142
  **宿主压缩纪元。** fold 引用锚定在消息 id 与内容哈希上,因此宿主自身的压缩一旦替换了重发历史,整本账就会同时老化:所有块都无法定位,view 静默回退为原始历史(fail-open——决策日志会记录 `view-applied applied=0`),插件在下一次请求时把增长基线重锚到压缩后的视图。宿主压缩因此是兜底的裁剪层,插件 fold 负责单个宿主纪元内的细粒度工作。 部分派发改用完全冻结的请求数组或选项对象(当前的 agent loop 会深冻结装配好的请求);对这类派发,`injectView` 会在决策日志里报告结果:`nothing-to-apply`(没有定位到 fold 块——原始历史本身就是 view)、`in-place`/`swapped`(fold view 已随请求发出)或 `none`(fold 存在但冻结的派发带不动它——线上发送原始历史)。**Surface replace 是可用时的发送路径**(`surfaceFold`,默认开启):在串行的 `agent/turn-stopping` 边界外加一次空闲清扫,插件追加宿主风格的 shadow-price 计量事件和一条携带 `surfaceOp {op:'replace', startSeq, endSeq}` 的 `user/message` 替换事件,`sourceEventSeqs` 覆盖被遮蔽的每个表面节点——与宿主自身压缩用的是同一机制——已提交的 fold 由此从源头直达线上,冻结派发也不例外。当某会话近期派发都记录 `none` 时,view 仅用于计量:水位改用服务商上报的计数(force 档与自动交接照常工作)。折叠只在 surface 通道同样不可用时才暂停——由持久的可用性探测判定(会话在线且暴露 `append`/`surface.nodes`、没有打开的 compaction 锁),与「最近是否发过货」无关,因此重启不再把引擎冻住。只有当该会话从未成功发出过任何 surface 替换时,裁剪横幅才以 `wire=raw`(folds not shipping; watermark reads the tally)标记该行;没有 surface 机制的宿主(或开关关闭时)保持的正是这套旧行为。
144
143
 
@@ -164,6 +163,12 @@ bash <安装目录>/skills/db-query/scripts/setup.sh
164
163
  - `npm pack --dry-run` 应保持审计过的 60 文件 / ~380 kB 形态(解压后 ~1.26 MB,`docs/` 不进包)。
165
164
  - **零运行时依赖——硬性不变量。** 宿主侧包(`@deepseek-ai/schemastery`、cordis 等)只允许声明为 `peerDependencies`,由运行中的 DSH 用它自己的副本满足。普通 `dependencies` 会被物理安装进 profile 工作区(`<profile>/node_modules/…`),从而对同处 profile 的其他插件遮蔽宿主副本——1.7.0 把 schemastery 声明为普通依赖时,正是这个机制让 dshmarket 插件市场崩溃(一个进程里出现两份 schemastery,市场产生的 schema 与宿主不再同类)。`scripts/validate.mjs` 会在 `dependencies` 再次出现时直接失败;因此安装、升级、卸载 dsh-switchman 都不会再影响 dshmarket 或任何其他社区包在运行时解析到的模块。
166
165
 
166
+ ## 下载量
167
+
168
+ 自首次发布以来的 npm 累计下载量 — 数据来自官方 [npm downloads API](https://api.npmjs.org/),由 GitHub Actions 每日自动重绘([图表脚本](scripts/downloads-chart.mjs)):
169
+
170
+ ![dsh-switchman 的 npm 累计下载量](docs/assets/downloads.svg)
171
+
167
172
  ## License
168
173
 
169
174
  MIT