@gehennawu/dsh-service 2.0.8 → 2.0.10

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.md CHANGED
@@ -9,9 +9,9 @@
9
9
  <em>A service-control &amp; operations plugin for DeepSeek Harness (DSH) Web.</em>
10
10
  </p>
11
11
 
12
- [![Version](https://img.shields.io/badge/version-2.0.8-3b82f6.svg?style=flat-square)](package.json)
12
+ [![Version](https://img.shields.io/badge/version-2.0.10-3b82f6.svg?style=flat-square)](package.json)
13
13
  [![License: MIT](https://img.shields.io/badge/License-MIT-10b981.svg?style=flat-square)](LICENSE)
14
- [![DSH Compatibility](https://img.shields.io/badge/DSH-%E2%89%A50.1.1--rc.2%20%C2%B7%20%E5%B7%B2%E9%80%82%E9%85%8D%200.2.1--alpha.2-6366f1.svg?style=flat-square)](https://github.com/deepseek-ai/deepseek-harness)
14
+ [![DSH Compatibility](https://img.shields.io/badge/DSH-%E2%89%A50.1.1--rc.2%20%C2%B7%20%E6%97%A0%E4%B8%8A%E7%95%8C-6366f1.svg?style=flat-square)](https://github.com/deepseek-ai/deepseek-harness)
15
15
  [![Cordis](https://img.shields.io/badge/Cordis-v4.x-f59e0b.svg?style=flat-square)](https://cordis.moe/)
16
16
  [![Platform](https://img.shields.io/badge/platform-DSH%20Web-ec4899.svg?style=flat-square)](https://github.com/gehennawu/dsh-service)
17
17
  [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](https://github.com/gehennawu/dsh-service/issues)
@@ -57,8 +57,8 @@ DSH Web 服务控制与运维插件:安全重启、版本管理与一键升级
57
57
 
58
58
  ### 概览
59
59
 
60
- - 状态摘要(error → warning → info → normal 聚合,带状态点)→ 可行动项(仅在存在时)→ 版本与运行环境 → 指标格 → 近期报错(仅非空时渲染,默认折叠)
61
- - 状态聚合规则:健康/诊断/备份/统计/额度/重启任一失败即 error;权限异常、非咨询性诊断警告为 warning;可更新、尚无备份为 info(额度窗口高占用只在额度查询页内以进度条呈现;疑似终端手动启动属常驻环境事实,也只在健康诊断检查项与重启/升级确认中呈现——两者都不再进概览提醒)
60
+ - 查看服务状态、待处理问题、DSH / 插件版本、运行环境与近期报错。
61
+ - 健康诊断、备份、统计、额度等异常会汇总为提醒;可更新与尚无备份属于信息提示。
62
62
 
63
63
  ### 维护与配置聚合页
64
64
 
@@ -66,15 +66,15 @@ DSH Web 服务控制与运维插件:安全重启、版本管理与一键升级
66
66
 
67
67
  ![配置页](./screenshots/configuration.png)
68
68
 
69
- - 「维护」集中会话管理、技能、备份维护与重启;子代理在「模型配置」独立子页,不重复入口;记住最近使用的子页,关闭对应功能后自动回退到仍可用的项目
70
- - 「配置」集中功能开关、任务通知与设置栏标签;开关按功能组展示并热生效,任务通知关闭时保留入口但显示置灰状态,设置栏标签支持对设置弹窗左侧全部导航标签进行手动排序(拖拽/上下箭头换位)与显隐管理,配置持久化到服务端统一配置文件 `$DSH_HOME/dsh-service-config.json`(多设备同步、启动自动拉取,本地缓存兜底),即时生效(服务控制面板永久锁定显示防锁死);额度卡的排序与显隐走同一份配置(`quotaCards` 区块,进入额度页时拉取)
71
- - 插件统一配置文件:各功能的轻量偏好收敛在 `$DSH_HOME/dsh-service-config.json` 单一文件(原子写入、`0600`),按功能分区块隔离——修改或清除某一区块绝不影响其他区块;大缓存(使用统计索引等)与加密凭据不在此文件内
69
+ - 「维护」集中会话管理、技能、备份维护与重启,并记住最近使用的子页。
70
+ - 「配置」集中功能开关、任务通知与设置栏标签;支持拖拽 / 箭头排序和显隐管理,服务控制入口始终保留。
71
+ - 设置栏标签与额度卡片偏好支持多设备同步,保存在 `$DSH_HOME/dsh-service-config.json`;各功能配置互不影响。
72
72
 
73
73
  ### 版本与更新
74
74
 
75
75
  - 显示当前 DSH 与插件版本,链接 GitHub Releases
76
76
  - 自动检查 npm **正式版 + 预览版**(latest / next 双 tag)
77
- - 「本次更新内容」入口跟在当前版本号之后且常驻:点开读**当前这一版**的更新说明;有新版本时状态文本「有新版本:x.y.z」整体可点,展开**新版**的 release 信息。正文一律由宿主从 GitHub Releases API 取回后就地渲染(纯 Markdown,不嵌 iframe、不跳转),带版本号、发布日期与预发布标记;未建 Release 或读取失败各有明确提示;点版本卡以外的任意位置或按 Esc 即关闭。两行的版本号与「本次更新内容」入口按钮按同一套列对齐,版本号右对齐使它与入口按钮的间距固定,**与版本号长度无关**——长短版本号只把整列一起推宽,不会让某一行错位;窄容器(手机与窄设置面板)沿用同一对齐——版本号吃掉行内余量并右对齐,两行的版本号与入口按钮仍各自同列
77
+ - 「本次更新内容」查看当前版本更新说明;有新版时点击版本提示查看新版说明,支持就地阅读与 Esc 关闭。
78
78
  - 一键升级,完成后自动重启;未检测到进程管理器时先确认后果,保持运行并提示手动重启
79
79
  - 升级落地但进程尚未重启期间(手动启动环境尤为常见),版本行改示「已安装 X,重启后生效」并收起升级按钮,重开面板或刷新页面状态依旧;重启进程后恢复常态
80
80
 
@@ -92,28 +92,25 @@ DSH Web 服务控制与运维插件:安全重启、版本管理与一键升级
92
92
 
93
93
  ![健康诊断](./screenshots/health-diagnostics.png)
94
94
 
95
- - 运行时间、内存、会话数、活跃 Agent 与后台任务;「进程与运行环境」卡显示平台、架构与 Node 版本
96
- - 完整诊断:会话存储、工作区注册表、备份目录、tar 可用性、文件权限、运行环境、Node 版本与**使用统计索引**——**两行检查清单**(检查名+状态点 / 详情),异常行局部淡染强调、正常行低对比
97
- - **使用统计索引**:报出已索引会话数、索引更新时间与未能索引的会话数(单会话折读失败会让用量静默少算)。失败会话按「部分成功」处理,记提示而非警告,不点亮警告状态、不进概览可行动项;尚未建立索引(还没打开过模型统计页)记信息级;「模型统计」开关关闭时整项不检查(宿主在该状态下本就不刷新索引,报了只会是陈旧误导)
98
- - **通知权限**:诊断页在宿主检查项之后追加一行浏览器侧检查——系统通知被拒绝或尚未授权都意味着「通知不会响」,并给出恢复入口;浏览器不支持时记信息级。该行只留在诊断页内,不进概览可行动项、不点亮标签 ⚠(是否用通知是用户选择),「任务通知」开关关闭时整行不渲染
99
- - **插件健康检查**:只检查异常(官方插件页已有完整清单与开关,这里不做重复清单)——插件失败或依赖未就绪时检查项报错/警告,刚启动的 pending/loading 有短暂宽限;已释放或未知状态显式标为信息级,不误报为警告。检查清单下方列出异常插件(名称、已脱敏且限长的错误、缺失依赖);失败插件可**两段式确认后重新加载**(只作用于宿主已确认失败的条目);手动停用的插件(无论内置还是自定义)一律不算异常
100
- - 文件权限深检与修复(两段式确认)收敛在**默认折叠**的「权限与修复」区(有异常时按钮显示计数)
101
- - 疑似手动启动 → 黄色警示「重启无保障」;无备份属信息级提示,不点亮 ⚠
95
+ - 查看运行时间、内存、会话数、活跃 Agent、后台任务、平台、架构与 Node 版本。
96
+ - 检查会话存储、工作区注册表、备份目录、tar、文件权限、运行环境与使用统计索引。
97
+ - **使用统计索引**显示已索引 / 失败会话数与更新时间;部分读取失败不会阻止其他会话统计,关闭模型统计后不再检查此项。
98
+ - **通知权限**提示浏览器未授权或拒绝通知,并给出恢复入口;不影响概览状态,关闭任务通知后不再显示。
99
+ - **插件健康检查**列出失败或依赖未就绪的插件及错误;失败插件可确认后重新加载。手动停用不算异常,已释放或未知状态仅作信息提示。
100
+ - 「权限与修复」提供文件权限深检与两段式确认修复。
101
+ - 疑似手动启动时提示「重启无保障」;无备份仅作信息提示。
102
102
 
103
103
  ### 模型统计
104
104
 
105
105
  ![模型统计](./screenshots/model-usage.png)
106
106
 
107
- - 近 7 天输入 / 输出 / 缓存 token 堆叠柱图,按项目筛选、悬停显示精确值;**图例与刷新统一收进统计区头部行**,图表带可访问的文本摘要。悬浮提示为七行:日期 + 输入/输出/缓存命中三项明细,再追加 **token 总量、成功模型步骤、缓存命中率**;命中率取宿主按当日桶加权的值(比率不跨桶相加)
108
- - 模型明细横条,列表头部「今日 / 近 7 天 / 累计」切换
109
- - 卡片最下方**日用量热力日历**:覆盖索引内全部日期(上限 20 周、起点对齐周一),四档强度按单日峰值分位、悬停看当日明细;随项目筛选联动。主图只画近 7 天,这里补上长期视图
110
- - 热力块右上角可切到**「小时」打卡图**:7 行(周一–周日)× 24 列(0–23 时),格 = 该时段累计 token,回答「几点最忙」;同一批小时桶换个维度折出,不新增持久化字段。方格布局为星期标签与间距预留宽度,窄屏在块内横向滚动
111
- - **已统计的用量永久保留**:删除会话或删除项目文件夹都不会扣减历史,总量与热力图始终是「索引建立以来的完整历史」;索引版本升级先保留旧摘要,可读取的会话仅在完整重建成功后替换,失败时保留历史并重试
112
- - **项目文件夹已删除**时,该项目不再出现在项目筛选入口里,但它贡献的用量仍计入「全部」总量、日期桶与模型明细
113
- - 最近 48 小时模型 / 工具报错统计(默认折叠、仅非空渲染)
114
- - **打开面板即自动补拉,不靠手动刷新**:挂载时无条件同步一次(先渲染持久缓存,再在后台折叠增量);此后只在**真实边沿**上补拉——跨本地零点(「今日」卡落到新的一天)、从后台切回前台、以及每次进入统计页。敞着不动不做任何周期轮询,停在别的页面也不花这份成本。同步期间刷新钮显示「刷新中…」(实测空闲折叠约 0.3 秒,存在历史格式会话且语料在变动时可达数十秒)
115
- - 提供方未上报 token 用量的步骤不纳入统计
116
- - 单个会话无法读取、迁移或解析时继续统计其他会话,显示全项目成功/跳过数量与可展开的会话 ID、错误类别及安全摘要;失败会话有旧缓存时保留并标明过期,首次失败不计入,下次刷新重试。只有服务不可用、列表读取或索引写入失败等全局错误才让整次刷新失败。该提示可关闭(关闭后记入本地存储),且**只静音同一批失败**——出现新的跳过会话或错误类别变化时会再次提示,不会一次关闭就永久盖住新问题
107
+ - 近 7 天输入 / 输出 / 缓存 token 趋势,按项目筛选;悬停查看 token 总量、成功模型步骤与缓存命中率。
108
+ - 模型明细可切换「今日 / 近 7 天 / 累计」。
109
+ - **日用量热力日历**覆盖最多 20 周,可切换为星期 × 小时分布,随项目筛选联动。
110
+ - **历史用量永久保留**:删除会话或项目不会扣减已统计用量;已删除项目从筛选中移除,但仍计入全部总量。
111
+ - 查看最近 48 小时模型 / 工具报错;无报错时不显示。
112
+ - 打开面板、进入统计页、跨本地零点或返回前台时自动同步,也可手动刷新;闲置时不周期轮询。
113
+ - 提供方未上报 token 的步骤不纳入统计。单会话读取失败时保留旧缓存、标明过期并重试,其他会话照常统计;可展开查看失败原因,新的失败会重新提示。
117
114
 
118
115
  ### 额度查询
119
116
 
@@ -133,6 +130,9 @@ DSH Web 服务控制与运维插件:安全重启、版本管理与一键升级
133
130
  | OpenCode Go | `{baseURL}/usage`(内置渠道未写 baseURL 时用注册表默认端点 `https://opencode.ai/zen/go/v1`) |
134
131
  | OpenRouter | credits 已用百分比 |
135
132
  | Kimi / 硅基流动 | 人民币余额 |
133
+ | Vercel AI Gateway | 官方 `GET /v1/credits` 查询团队剩余 USD 余额(Gateway API key;累计消费不作为套餐上限) |
134
+ | Poe | API key 查询剩余 points(非货币积分,不显示金额油表) |
135
+ | ClinePass | API key 查询 5 小时 / 每周 / 每月套餐用量及重置时间 |
136
136
  | StepFun 余额 | 官方 `GET /v1/accounts`(API key,com/ai 双域) |
137
137
  | StepFun Step Plan | 控制台 BFF 订阅额度(Oasis-Token 登录令牌;5 小时/周窗口与 Credit 月池自动识别) |
138
138
  | 小米 MiMo Token Plan | 控制台同源套餐额度(网页登录态 Cookie) |
@@ -151,7 +151,6 @@ DSH Web 服务控制与运维插件:安全重启、版本管理与一键升级
151
151
 
152
152
  ![备份管理](./screenshots/backup-management.png)
153
153
 
154
- - 备份记录列表为两行轻行(文件名主行 + 体积 · 时间次行,分隔线布局;会话管理列表同款)
155
154
 
156
155
  - 创建会话、配置与插件 profile 清单的 `.tar.gz` 归档;会话经持久化层稳定快照(活跃 agent 写入不再导致失败),创建过程以单条连续进度条分阶段显示(复制/打包/校验/发布,带步骤号 1/4–4/4,复制阶段为真实百分比)
157
156
  - **备份时版本信息**:归档文件名带备份那一刻的 DSH 版本(`dsh-backup-YYYYMMDD-HHmmss-dsh0.1.7-rc.1.tar.gz`),归档内另有 `meta/backup.json` 记录 DSH 版本、插件版本与创建时刻;面板行内与恢复预检都显示该版本,便于判断这份快照出自哪个版本(跨版本降级恢复读不动新格式会话)。旧版本插件所出的归档没有版本段,列表照常显示、恢复照常进行,只是不显示版本行;导入同时接受带版本段与不带版本段两种文件名
@@ -167,64 +166,46 @@ DSH Web 服务控制与运维插件:安全重启、版本管理与一键升级
167
166
  ![技能管理](./screenshots/skill-manager.png)
168
167
 
169
168
  - 按 **自动加载 / 仅手动调用 / 完全停用** 三区展示本地技能;同名遮蔽与被遮蔽副本均有标注,内置目录只读
170
- - 条目默认全部折叠成一行(名称 + 来源/只读/已注释徽标);顶部按钮对当前可见条目一键「全部展开 / 全部折叠」,点单条名称行可独立开合;无效条目的 ⚠ 与一键修复折叠态也保留
171
169
  - 双开关直接改写 SKILL.md frontmatter(`disable-model-invocation` / `user-invocable`),约 200ms 热生效
172
170
  - 带 camelCase 旧版键的条目会被官方解析器剔除:⚠ 提示 + 一键修复
173
171
  - ✨ AI 补全说明:选模型生成描述草稿(跟随界面语言),确认后存入插件侧车索引——**绝不改写 SKILL.md**;支持一键批量补全(宿主后台运行、可取消)。已注释技能会在计划中单列,经「确认强制补全」二次确认后才会被覆盖(不再是一旦注释就永远无法再次补全);补全日志时间按本机时区显示
174
172
 
175
173
  ### 模型配置
176
174
 
177
- > 模型配置写入要求宿主提供可追踪的配置 revision;缺少该能力的旧宿主仅可查看,写操作会明确拒绝。旧工作台源码与测试作为兼容回归资产保留,当前界面和宿主仅注册 models3 流程。敏感认证 headers 和历史人工恢复状态请通过 DSH 原生配置/恢复流程处理,本页不自动清理。
178
-
179
- - 顶级「模型配置」页:左子标签**渠道与模型**(默认)+ 右**子代理路由**(复用「子代理模型」区块,只剩一个可用子页时子标签栏整条隐藏)。**只有一套界面**(旧版按 localStorage 隐形切换的 Simple/Legacy 双模式已退役)
180
- - **纵向手风琴**:渠道按内置 / 自定义两组平铺成卡片,点标题行展开该渠道详情,一次只开一个,再点收起;窄屏(≤640px)只收窄内边距,**不改成左右并排**。有未保存草稿时切换渠道先确认
181
- - **渠道优先闭环**:渠道列表 →「添加自定义渠道」(标识 / 显示名 / 协议 / 地址 / API Key / 手填或勾选模型 ID)→ 渠道详情 → 模型列表 · 独立模型详情 · 单独换密钥 · 删除与最近恢复;创建默认不探测;填写 API Key 时在确认创建后保存为独立凭据引用
182
- - **本页只编辑少数渠道字段**:显示名、地址、协议(自定义渠道可改,内置渠道只读展示当前解析出的协议)与凭据。渠道默认、headers、thinkingBudgets、transport/cache、超时、图像预算与 retryPolicy 等渠道级高级键本页不提供编辑器,**保存不会把它们清除**(写入按字段补丁合并,未展示的键原样保留);本页也不做双 JSON 编辑
183
- - **Anthropic 在线模型列表**:支持 `anthropic-messages` 的 `/v1/models?limit=1000`,兼容地址末尾有无 `/v1`,使用 `x-api-key` 与 `anthropic-version`,解析 `display_name`。只取单页、不自动追随分页;沿用公网与响应护栏,不调用官方无 SSRF 限制的抓取路径。
184
- - **发现与手填并重**:只有显式点「在线获取」才出网;结果区分已添加与可添加,支持搜索与勾选批量添加;发现失败、协议不支持、安全策略拒绝探测都只提示,**手动输入 ID 的路径照常可用**。拿到列表 ≠ 调用成功
185
- - **单模型面板**:模型 ID **可编辑**(含从「在线获取」列表添加的条目),值受宿主三处限制:必须符合模型 ID 格式、同渠道内不得重名、重命名同样拒绝撞已有 ID,已停用模型需先明确启用才能改名;重命名按「删旧增新」提交,所以仍会经过删除引用守卫。同面板还有显示名、上下文窗口 / 最大输出 token(**可写 `256K`、`1M` 这类 K/M 后缀**,留空 = 继承目录默认值)、输入模态(文本一项勾选且禁用,只有图片可切换;保存时按宿主 schema 明确声明)、输出模态(只读展示文本——pi-ai 的模型 profile 没有该字段)、推理档位。保存按钮在面板**底部**,与「尚未保存」状态同排,无改动时禁用;提交只写被改动的字段
186
- - **高级模型参数区没有折叠头**:输入模态与推理档位在模型详情里始终展开可见,不藏在折叠标题后面
187
- - **删模型与删渠道都要核对引用**:删除确认先列出**确切引用位置**——主对话默认模型、子代理主模型、子代理回退模型,逐条给出 `provider / model`,存在引用就阻止删除;自定义渠道不能删到零模型,继承渠道不能用复位伪装删除
188
- - **启停即时生效、无二次确认**:渠道右上开关与每个模型行的开关点下去立即提交(宿主先取计划,同一次点击内直接提交,不再弹出二次确认);渠道开关的悬停提示写明「关闭后该渠道不再可选,主对话和子代理均不能发起新调用;配置和密钥保留」。停用状态按 Profile 保存,停用渠道从输入框及子代理模型目录排除,并拒绝新的精确模型调用(包含已保存路由、显式指定和已准备但尚未发送的调用);已有正在执行的请求不会被强行取消。此为插件可用性策略,不是官方 `enabled` 配置字段;卸载插件会撤去策略
189
- - **基础调用测试不等于能力验证**:模型列表测试按钮直接测试已保存的条目,不弹费用二次确认;宿主固定发送短文本,上限 30,000 token / 120 秒,可能计费。测试期间显示耗时,失败显示脱敏的错误码、HTTP 状态、结束原因与信息;只验证基础文本调用,不验证图片、容量或全部思考档位。失败不回滚已保存配置
190
- - **内置继承不误报**:内置渠道的能力字段由目录继承(运行时回落目录 base),「配置没写」不等于「能力缺失」——不会反复提示补全思考等级
191
- - **手动编辑器**:ID / 名称 / 上下文 / 最大输出常显,能力区始终展开(识图两枚开关、六档等宽横排推理复选框(不展示 off);资料中的 wire 映射保留,wire 编辑输入目前不在可见界面展示);清空字段 = 删除显式覆盖改为继承默认,`reasoningEfforts: false` = 明确声明不支持(与省略区分)
192
- - **删除保留凭据并可恢复**:删除渠道只移除 settings 中的路由,凭据引用保留(不影响共享同一凭据的其它渠道);删除前整份渠道配置进快照,**恢复入口常驻列表底部**,不随渠道行消失。恢复写回引用,但**不恢复旧密钥值**
193
- - **思考配置与调用选择不同**:档位复选框声明可选等级,不代表每次调用选中该等级;全部未配置时继承已有值或由接口默认行为决定,不等于关闭思考。智能填充保留资料中明确声明的 wire 映射;手动勾选非 off 档位暂以英文档位名作为参数值,适用性需自行核对。至少一个非 off 映射才能保存
194
- - **草稿留在当前页**:保存失败或并发冲突不清空草稿,冲突后对照最新值重新确认;有未保存编辑时离开先提醒;不跨刷新持久化草稿(避免密钥进浏览器存储)
195
- - **内置与自定义目录分开处理**:内置渠道显示解析后的协议,可追加目录外模型并编辑当前 Profile 的模型条目;目录提供的默认值作为继承展示,未改动字段不整份复制写死。已有未知覆盖和高级字段保留,不冻结整张动态目录
196
- - **首页零外网**:总览只读当前 Profile、pi-ai 目录、运行时提供方和侧车,分别显示保存 / 加载 / 基础调用状态;进入列表不会查询外部资料
197
- - **单模型智能填充**:每次进详情默认 OFF;ON 自动查询本机 pi-ai 索引和固定 modelparams.dev / OpenRouter 资料,**不探测渠道、不发推理、不自动保存**。**本轮是「模型 ID 维度」的填充:不绑定当前渠道或协议来源**,界面没有来源选择与绑定交互(候选只作依据,不写进配置)
198
- - **建议按参数分开展示**:显示名、上下文容量、最大输出、输入模态与思考等级分别展示;模态按集合比较,顺序不同不算差异。多来源候选按稳定顺序选取建议,思考等级优先采用有明确映射的资料,不以当前渠道筛选;没有映射不猜测具体档位。modelparams 的请求范围上限不当模型最大输出;资料只是参考,不代表接口能力实测
199
- - **统一确认填入**:「一键填入」弹层先列出将覆盖哪些字段的草稿值,确认后**只更新草稿**,不写配置,仍需点保存;不再提供来源绑定或逐项 ✓ / ✕。开关悬停说明资料来源与操作边界
200
- - **思考等级两条提示分开**:模型资料声明「支持思考」但拿不到具体等级建议时提示「支持思考但未获取到等级建议值,默认行为要看该接口」;完全没有思考资料时提示「未获取到思考等级建议值,请手填」。**资料缺席 ≠ 不支持**,`reasoningEfforts: false` 才是明确声明不支持
201
- - **档位徽标用英文等级名**:当前与建议档位以 `minimal / low / medium / high / xhigh / max` 徽标展示(不随界面语言翻译;`models.smart.effort.*` 的中文词典另有保留但未用于这里),「当前等级 / 建议等级」的标签本身仍跟随界面语言
202
- - **先快照再写入**:普通保存一次点击,删除 / 换密钥 / 恢复先展示后果再确认;写前快照落盘失败则不写配置。新建、编辑与恢复均捕获 owner / 完整指纹 / revision,拒绝并发覆盖,后续外部修改阻止撤销。普通快照不含敏感 headers;含敏感值且无法完整恢复的删除直接拒绝
203
- - **联网查证**:按模型 ID 查 OpenRouter 模型档案(固定域名、不跟随重定向),结果只作参考展示,不改配置
175
+ ![模型配置](./screenshots/model-configuration.png)
176
+
177
+ - 「模型配置」包含**渠道与模型**、**子代理路由**两个子页,区分内置与自定义渠道。
178
+ - **添加自定义渠道**:填写标识、显示名、协议、地址、API Key 与模型 ID;创建不会自动探测接口。
179
+ - **混合协议渠道提示**:渠道目录同时含多种协议(如 0.2.1-alpha.3 起 pi-ai 的 `azure`)时,模板选择与渠道编辑会提示「路由级协议覆盖该路由全部模型」,避免把 Chat Completions 模型钉到 Responses 协议。
180
+ - **渠道编辑**:修改显示名、地址与凭据;自定义渠道可修改协议,内置协议只读。未展示的 headers、超时、缓存与其他高级参数保留不变。
181
+ - **模型获取**:可手填 ID,也可点击「在线获取」搜索、勾选并批量添加;支持 OpenAI 兼容与 Anthropic 模型列表。获取失败不影响手动添加,拿到列表不等于调用成功。
182
+ - **模型编辑**:修改 ID、显示名、上下文窗口、最大输出、图片输入和思考等级;容量支持 `256K`、`1M`,留空继承目录默认值。同渠道 ID 不得重复,已停用模型需启用后改名。
183
+ - **即时启停**:停用后主对话与子代理不能发起新调用,配置和密钥保留,已运行请求不强行取消。该策略随插件卸载撤去。
184
+ - **基础调用测试可能计费**:使用已保存模型发送短文本,显示耗时和脱敏错误;只验证文本调用,不验证图片、容量或全部思考档位,失败不会回滚配置。
185
+ - **智能填充默认关闭**:开启后按模型 ID 查询本机 pi-ai、modelparams.dev 和 OpenRouter 资料;不探测渠道、不发推理、不自动保存。建议按参数展示,「一键填入」确认后只更新草稿,仍需保存。
186
+ - **思考等级需核对**:可选档位声明与调用时选择不同;缺少资料不等于不支持,未配置时沿用继承值或接口默认行为。手动填写的档位参数需与实际接口核对。
187
+ - **删除引用检查**:先列出主对话默认模型、子代理主模型和回退模型引用,存在引用则阻止删除;自定义渠道不能删到零模型。
188
+ - **恢复与凭据**:删除渠道前保存配置快照,删除保留凭据引用;可恢复配置,但不恢复旧密钥值。换密钥默认建立独立引用,替换共享凭据前列出使用者。
189
+ - **草稿与并发保护**:保存失败保留草稿,离开未保存编辑前提醒;配置发生外部变动时拒绝覆盖,重新核对后再保存。草稿不跨刷新保存。
204
190
 
205
191
  #### URL 与密钥安全机制
206
192
 
207
- - **零输入拼接**:地址编辑仅作为配置数据,经 schema 校验,不因输入地址而出网;普通保存不抓该地址。在线发现只请求**宿主当前 Profile 读出的 baseURL**;模型 ID / 名称绝不进 shell、文件路径或命令参数,固定资料请求只使用宿主白名单域名
208
- - **在线发现护栏**:HTTPS-only、无 userinfo、端口空或 443、拒 IP 字面量、**DNS 解析全部结果**须为非私网/保留段、拒重定向、钉住解析地址直连并带 Host 头(防 DNS rebinding)、10s 超时、传输 ≤4MB 且解压后 ≤8MB。非公网 / HTTP / 非 443 地址仍可保存与手填,只是禁在线发现并标注「未由插件验证」
209
- - **密钥独立管理**:更换密钥只经 loopback 提交到系统凭据库,不回显、不落日志或快照;默认新建独立引用,不覆盖已有共享值。显式共享替换先列使用者;配置失败如实报告已写凭据,不以补偿为名误删。发现解析 `apiKeyEnv`,只发往该渠道当前地址,绝不发资料站
210
- - **短命宿主句柄**:编辑基线、删除、恢复与凭据后果由 `sessionId` / `planId` 绑定,提交复核完整基线与 revision;未知、过期或重放句柄拒绝。手动参数通过闭集 schema 验证
211
- - **结构性写保护**:写入走 `settings.mutate(entryId, ops, expectedRevision)`,新版 entryId 由当前 pi-ai owner 解析,旧版才用 `llm-pi-ai`;官方完整校验、原子落盘与热生效,绝不手写真实配置 YAML
212
- - **仅 loopback**:全部端点经 `/dsh-service` 单层 channel 暴露,authority 一律 `loopback`
193
+ - 旧宿主缺少可追踪配置 revision 时仅可查看,写操作明确拒绝;配置写入经过 DSH 官方校验与原子保存。
194
+ - 输入或保存地址不会自动出网;在线获取只使用当前 Profile 已保存地址,要求公网 HTTPS、443 端口,拒绝私网、IP 字面量与重定向,并限制超时和响应大小。本地 / HTTP 渠道仍可保存并手填模型。
195
+ - 密钥只经 loopback 保存到 DSH 凭据库,不回显、不写入日志或快照,只发往对应渠道,绝不发往资料站。
213
196
 
214
197
  ### 子代理模型
215
198
 
216
199
  ![子代理模型](./screenshots/subagent-model.png)
217
200
 
218
- - 三种模式:**初始**(不干预)/ **跟随主模型**(取主对话最近一次实际使用的 provider/model)/ **自定义**(固定到所选模型)
219
- - 派生请求自带 provider/model 时始终优先,绝不覆盖预设钉死
220
- - 自定义模式可选**思考等级**:仅当所选的 **exact provider/model** 由适配器声明了可选等级时才显示下拉;留空表示「使用目标模型默认」,由适配器在请求时物化默认值
221
- - 该字段来自适配器 metadata(`reasoning.efforts[].id`),等级 ID 对宿主不透明;无等级声明的模型禁用下拉并提示
222
- - **inherit / follow / 功能开关关闭** 均不注入任何 provider、model 或思考等级;显式指定 provider/model 的子代理不受影响
223
- - **模式切换保留配置**:已保存的自定义模型(含思考等级)与回退列表在三种模式间切换时不会被清除——模式只决定是否生效,切回「自定义」无需重新选择(供应商/模型已不在运行时清单时自动回落到清单首项)
224
- - **进入无位移**:本页以最近一次成功读取的配置作为首帧缓存,进入即直接落在真实模式上,不会先显示「初始」再跳到「自定义」;首次安装或换浏览器(无缓存)时先显示一行「读取配置…」
225
- - **回退模型(按顺序)**:跟随与自定义模式都可配置回退列表——第一路由不可用时(渠道已卸载、额度查询判定其不可服务)依次尝试后续模型;全部不可用则回落原生继承,不让派生失败。回退条目与主路由同一道白名单校验,思考等级逐条可选
226
- - **对话页可见性**:输入框下方常驻一行本会话子代理实际使用的模型,如 `子代理:cpa/gpt-5.6-luna (xhigh) · opencode-go/deepseek-v4-flash (max)`——含回退命中、显式路由与继承来源,可直接核对自定义路由是否生效。行挂官方 `conversation.composer.dock` 槽位,独占官方统计行的下一行、不与统计胶囊/上下文圆环同行挤占;20s 刷新,不依赖回合数据(会话发生 compaction 折叠工具调用也照常显示),由宿主派发记录兜底,任何视图都能看到;可在 模型配置 → 子代理路由 页用独立开关关闭。记录存宿主内存(页面刷新不丢、进程重启即清),官方「指派子代理模型」开关关闭与否都不影响本功能
227
- - 配置存 `$DSH_HOME/dsh-service-subagent-route.json`(原子写入、`0600`),可一键重置
201
+ - 三种模式:**初始**(不干预)/ **跟随主模型**(主对话最近实际使用的模型)/ **自定义**(固定到所选模型)。入口:模型配置 → 子代理路由。
202
+ - 派生请求显式指定 provider/model 时始终优先,不覆盖指定路由。
203
+ - 自定义模型声明可选思考等级时可选择,留空使用目标模型默认值;未声明等级时提示不可选。
204
+ - **切换模式保留配置**:自定义模型、思考等级和回退列表不会清除,切回自定义即可恢复。
205
+ - **有序回退**:跟随与自定义模式可配置回退模型,渠道卸载或额度不可用时依次尝试;全部不可用则回落原生继承。
206
+ - **独立 Agent 预设**(0.2.1-alpha.3+ 宿主):可为派生的子代理统一指定独立预设(角色与工具随预设);留空跟随父代,调用方显式指定的预设优先,仅对支持独立预设的后端生效。
207
+ - 输入框下方可显示本会话子代理实际使用的模型,包含回退命中和显式路由;可独立关闭。页面刷新不清除记录,进程重启后清除。
208
+ - 配置保存在 `$DSH_HOME/dsh-service-subagent-route.json`,可一键重置。
228
209
 
229
210
  ### 任务通知
230
211
 
@@ -239,49 +220,36 @@ DSH Web 服务控制与运维插件:安全重启、版本管理与一键升级
239
220
 
240
221
  ![会话管理](./screenshots/session-manager.png)
241
222
 
242
- - **查看**:统一列表展示会话(运行中 / 冷会话 / 已归档),行内标状态徽章、工作区、事件数、文件体积;列表支持按创建时间正/倒序、按标题排序或**按项目分区显示**(每个工作区一个分区头:路径 + 会话数,同项目内最新在前;分区**默认折叠**,点击分区头展开 / 收起);**默认停在「仅归档」视图**,全部 / 仅归档 / 已删除三个筛选各自**首次**按需向宿主拉取对应子集并缓存(模块级缓存:切换筛选零请求、**关掉面板再打开秒显缓存 + 后台静默刷新一次保鲜**,页面刷新才清零),「刷新」按钮可强制重拉当前视图;普通列表提供「批量选择」按钮,进入后可直接点击整条会话(无需精确点复选框)进行选择 / 取消选择,也可一键全选 / 取消全选当前筛选结果,选中行以左侧品牌色标记而不改变背景;工具栏按资格显示可执行数量并支持批量导出 / 归档 / 删除(切换筛选、搜索或进入详情会自动退出批量态);文件体积不随列表下发、行内按需懒加载(模块级 + 宿主进程内存双层缓存:刷新浏览器 / 重开面板直接复用,删除时失效);**进详情记住列表滚动位置,返回列表原地不动**(沿用官方面板滚动容器,详情期间切筛选 / 改搜索则放弃恢复);详情按事件卡片分页浏览(宿主单槽位快照缓存:翻页/重进详情零重复读取,live 会话 30 秒内保鲜),**正文按官方 Markdown 富文本渲染**(复用平台官方渲染器 `MarkdownText`,与聊天界面观感一致:代码块/列表/表格/数学公式、默认拒原始 HTML 与危险链接;老版本 DSH 未提供该渲染器时自动回落纯文本),连续系统事件与**工具消息各自默认折叠为计数块**(工具消息 = `tool/call`、`tool/result` 等 `tool/*` 事件,以及通篇只有工具调用的 assistant 消息——这类消息占真实长会话的多数,工具参数不会再铺满详情页),点击折叠行展开明细、再点收起;搜索命中落在折叠块内时该块自动展开并保持命中高亮
243
- - **子代理识别**:派生的子代理会话行内标「子代理」徽章(判定取自官方会话头字段:`origin=subagent` 产品分类为准,`delegationDepth` 派生深度兜底老日志;仅 `parentSession` 的普通 fork 血统不算子代理);搜索行「仅子代理」复选框聚焦(与「仅搜归档」同行同款控件;正交于全部 / 仅归档叠加过滤,已删除视图不显示、切换视图时状态保留),批量选择态提供「选中子代理」一键把当前可见的子代理会话并入选择集(不清既有选择;视图里没有子代理行时该按钮隐藏),配合批量归档 / 删除快速清理;老版本插件宿主不下发该标志时列表照常,勾选筛选会明示「宿主较旧、未携带子代理标志」而非留一份无解释的空列表
244
- - **导出**:一键或批量下载官方完整 ZIP(每个会话一个 ZIP,含子代理与附件),复用官方导出链路,宿主不自己拼包
245
- - **归档与恢复**:单项或批量归档非运行中会话,归档后从官方侧栏隐藏;DSH ≥0.1.6 宿主支持单项或批量恢复(取消归档),老版本 DSH 保持单向归档提示
246
- - **内容搜索**:对话全文语义搜索(大小写不敏感、空白灵活),跨会话命中列表(匹配文本高亮;多命中显示 seq 位置芯片、可一键直达)→ **命中窗口视图**:打开即以命中 seq 为中心展示上下文窗口(命中前后各 15 条事件;命中行标「命中」徽章高亮、**自动滚动定位并闪烁 2 秒**),支持**上一个 / 下一个命中**翻跳与导航条 seq 芯片直达(参考 dsh-session-kb 的 Locate 交互);窗口可继续加载后续事件;可限定仅搜归档区
247
- - **删除**:仅已归档会话可删除,且执行前再次拒绝运行中的会话;两段式确认先展示会话 id / 标题 / 工作区 / 文件体积,删除记录先原子落盘、再移除日志目录;已删除记录在「已删除」筛选下可见,支持单条清除或批量多选 / 全选清除(两段式确认,永久从记录中移除);删除成功后即时同步官方侧(补发官方会话移除事件、清掉归档集合里的死 id),官方侧栏与「已归档会话」设置页无需刷新浏览器即反映最新状态
248
- - 入口:「维护」页子标签「会话管理」(默认开),设置页左列入口可选(默认关)
249
- - 删除记录存 `$DSH_HOME/dsh-service-sessions-deleted.json`(原子写入、`0600`,仅标题/时间,不含内容、不可恢复)
223
+ - **查看**:列出运行中、冷会话与已归档会话,显示工作区、事件数与体积;支持时间 / 标题排序及按项目分组,默认显示仅归档。
224
+ - **详情**:分页浏览 Markdown 正文,系统事件和工具消息可折叠;返回列表保留滚动位置。
225
+ - **子代理筛选**:支持「仅子代理」与批量「选中子代理」,普通 fork 不误判为子代理。
226
+ - **导出**:单项或批量下载官方完整 ZIP,每份包含子代理与附件。
227
+ - **归档与恢复**:单项或批量归档非运行中会话;DSH ≥0.1.6 支持恢复归档,老宿主仅支持单向归档。
228
+ - **内容搜索**:跨会话搜索正文,支持大小写不敏感与灵活空白匹配;可限定归档区,跳转命中上下文并切换上一个 / 下一个命中。
229
+ - **删除**:仅已归档会话可删除,运行中会话再次校验并拒绝;两段式确认列出 ID、标题、工作区与体积,删除后同步官方侧栏。
230
+ - **已删除记录**:可查看并单条 / 批量清除;记录只含标题与时间,不含正文、不能恢复会话。
231
+ - 入口:维护 → 会话管理;设置栏快捷入口默认关闭。
250
232
 
251
233
  ### 移动端适配
252
234
 
253
235
  ![移动端适配](./screenshots/mobile-adaptation.png)
254
236
 
255
- - 默认关闭;仅在视口 <1024px(手机竖屏 / 窄窗口)生效,桌面完全无感
256
- - 侧栏变抽屉、详情列移动端隐藏(对齐官方窄屏语义)、模态变全屏面板、设置左列导航变顶部横滑
257
- - 官方插件面板页(「插件」)顶部手机端不折行:标题+简介与「刷新/添加插件」放不下时工具栏整体落到第二行右缘,简介与按钮文案各自单行;同时修掉抽屉钮让位内边距连带改写该页头部纵向/右侧内边距的旧写法(曾把「安装、启用和配置插件」挤成两行、「添加插件」按钮内文案折两行溢出胶囊)
258
- - 模型选择按钮自适应零截断与思考程度常驻:放宽官方 45cqw 硬限宽,使测宽基于真实无损文字;空间充裕时完整显示「厂家图标 + 模型全名 + 思考程度」(零截断),空间吃紧时(小屏手机、长模型名或被其他插件占用工具栏)模型全名自动收缩为紧凑态,但思考程度(如 High / Low)与厂家图标永远保持显示([厂家图标] High ▾),无思考程度的模型则收成 45px 纯图标钮,全程单行不折行、不截断文字;移动端模型选择弹窗隐藏「搜索模型…」行,防止 autoFocus 强行唤起软键盘遮挡面板,模型列表直接展示更清爽
259
- - 统计条(输入框下方「轮/步/tok/s | tok/缓存命中」)在手机上**保持一行、居中且不歪**:收紧这一行自身的左右内边距(官方 32px→2px)与列间距换出可用宽度,两枚统计交给官方 `justify-content` 居中排开——≥~420px 视口零截断,更窄视口按比例各让一点(远少于官方的固定截断),不换行、不横向滚动;同时兼容老版本 DSH(0.1.5-rc.2 上这条行是整行宽,早期实现的子项 `flex-grow` 会把两枚统计整组推到左边,现已改为不生长)(桌面不受影响)
260
- - 会话顶栏手机端重排(≤560px):标题行只留**标题 + 模式芯片**(芯片右靠贴住「…」钮,标题基本完整可见),「N 个子代理」与「N 个后台任务运行中」两枚计数芯片泊到「对话/轨迹」标签行右缘成一对(标签间距 36→20,点芯片本体仍开各自菜单);官方 crumbs 放不下时的**拦腰硬裁**彻底消除,561px 以上与桌面保持官方原布局。DSH 0.1.7-rc.1 起官方给模式芯片加了 `@container (width<=540px)` 隐藏(容器是标题行,约合 606px 视口),手机上曾整片消失——本插件在整个移动端带内覆盖回可见(390px 以上标题仍完整不裁,仅 320~375px 档标题略带省略号)
261
- - Agent Team 弹窗手机端不越屏(<1024px):官方 Agent Team 面板自带左锚(`left:0`),挂在头部右侧动作槽上会整体右移出屏(实测 320~1023px 越出 112~352px)。移动端把会话头部设为定位上下文、面板改**右锚 16px** 并按 `100vw − 32px` 封顶,两缘各留 16px;桌面 ≥1024px 官方几何逐字不变
262
- - 滑动沉浸:会话内下滑自动收起头部、左上角抽屉图标与输入框全屏阅读(左上角抽屉图标与右上角右侧栏展开按钮同步上滑淡出,收起时让出输入框占位,正文真正铺满整屏;回显时若仍停在会话末尾会自动对齐到底),上滑 / 点「回到底部」浮钮 / 聚焦输入框即恢复(无额外悬浮钮);已经停在会话末尾时往回一点即回显(不再等满阈值),点回底后停留位置会补一次贴底对齐;流式贴底、锚点跳转等程序化滚动绝不误触发
263
- - 滑动开合抽屉:双抽屉关闭时,横移主导的右滑任意位置打开侧栏抽屉、左滑任意位置打开官方右侧栏(DSH 0.1.5+,未就绪时该方向无效);开启后反向横滑任意位置关闭;从屏幕边缘起滑额外享有浏览器手势接管的补完加成,编辑器等真横滚区内的滑动不误触发
264
- - 「回到底部」浮钮右移贴边(不再空出大片右侧留白);其上方新增同款圆形上箭头(全平台生效,不含移动端),点击逐条跳转上一条用户回复、可连续向上回溯,目标在未加载历史时会自动点「加载更早」补齐,跳到最顶部后按钮自动隐藏、下滑即复现
265
- - 大 JSON 响应透明压缩(≥4KB 按 `Accept-Encoding` 自动 gzip/brotli),长会话历史首屏提速
266
- - 自动补 `viewport-fit=cover` 避让刘海、禁双击缩放、输入框 ≥16px 防 iOS 聚焦放大
267
- - `?dshsvc-mobile-debug=1` 显示浮动诊断条(仅调试)
237
+ - 默认关闭;开启后仅在视口 <1024px 生效,桌面不受影响。
238
+ - 支持侧栏抽屉、窄屏设置导航和全屏面板,适配模型选择、会话任务菜单与 Agent Team 弹窗。
239
+ - **滑动沉浸阅读**:下滑收起头部和输入框,上滑、回到底部或聚焦输入框恢复;流式更新不会误触发。
240
+ - **抽屉手势**:右滑打开侧栏,左滑打开右侧栏,反向滑动关闭;编辑器横向滚动不误触发。
241
+ - 上箭头可逐条跳到上一条用户消息,未加载历史时自动补齐。
242
+ - 长会话 JSON 响应自动压缩,并处理安全区与手机输入框聚焦缩放。
268
243
 
269
244
  ### 模型厂家图标
270
245
 
271
- - 输入框里那颗**模型按钮会显示当前渠道的厂家图标**:宽屏(>480px)加在模型名**前面**;手机上(≤480px,官方把名称收成图标的形态)**替换**掉官方那枚通用图标
272
- - **没适配的渠道保持官方默认图标不变**(宽屏不加、手机照旧显示官方图标),不会出现空缺或错图
273
- - 覆盖 **pi-ai 内置 40 个 provider 中的 38 个**(`ant-ling`、`radius` 无对应品牌图形,走默认图标),并补充 ollama、vLLM、LM Studio、Perplexity、Cohere、火山引擎、豆包、混元、元宝、阶跃、商汤、百川、零一万物、Fal、Replicate、Midjourney 等常用渠道,共 62 张图形 / 76 条渠道映射;区域与计费变体(如 `xiaomi-token-plan-*`、`qwen-token-plan-*`)共用同一品牌图形
274
- - **自定义渠道名按前缀/别名自动识别**:`opencode-goo` → opencode、`openrouter-f` → openrouter、`zai-coding-cn` → 智谱、`xiaomi-token-plan-cn` → 小米、`command-goat` → Command Code 等
275
- - **识别不到时按余额查询的手动适配兜底**:某个渠道名既不在内置表、也不符合前缀规则时,如果你在余额查询里把它**手动适配**成了某个类型(如 `cpa` → CLIProxyAPI,或任意中转 → OpenRouter / 智谱 / Command Code / StepFun 等),就显示该类型的厂家图标;适配类型一改图标立即跟着换,撤销适配立即回落官方默认图标。两个前提:只有**手动**适配算数(仅由 baseURL 自动推断出来的类型不算),且**名字能识别时以名字为准**(叫 `openrouter-f` 的渠道即使另外适配成别的类型,也仍显示 OpenRouter 标)
276
- - **CLIProxyAPI 图标按需出现**:手绘的「内凹菱形 + 镜像漩涡」品牌标**只在你在余额查询里把某个渠道手动适配成 CLIProxyAPI 后**才显示在模型按钮上(渠道名不限,叫 `cpa` 还是自定义名都一样);它就是上面那条兜底规则的一个实例,撤销适配立即回落官方默认图标
277
- - **余额查询的渠道卡片同样带图标**:已适配卡片的渠道名前显示同一套厂家小图标(14px;彩色档原样上品牌色、单色档跟随主题文字色)。上面那条「按手动适配兜底」的规则在这里同样生效——卡片区正是你做适配的地方,改完适配立即出现/换标
278
- - **模型选择弹窗的分组标题同样带图标**:点开模型按钮 → 「模型」二级列表后,每个**厂家/渠道商分组名前面**也显示同一枚图标(13px,与 12px 的分组标题同量级)。同一套解析与兜底规则,未识别的渠道分组保持官方标题原样、不加图标
279
- - **浅色 / 深色都清晰**:品牌色对浅底与深底**两侧**对比度都达标才保留原色,否则自动改用跟随主题文字色的单色版——不会出现深色模式下「黑图标糊在黑底上」或浅色模式下近乎隐形
280
- - **零运行期网络请求**:图标在构建期内联进客户端产物,离线可用、不影响 CSP,也不向第三方暴露你的渠道名称
281
- - 图标尺寸与输入框旁的**额度圆环**一致(生成期把每个图标的 viewBox 收紧到真实绘制范围并正方形化,所以各品牌「看起来一样大」,不会有的满格有的缩成一团)
282
- - 开关在 插件 → 插件配置 → 交互(默认开,热生效)
283
- - 图标来自 MIT 许可的 [LobeHub Icons](https://github.com/lobehub/lobe-icons)(版本钉死 `@1.95.0`);小米图标取自 CC0 的 [Simple Icons](https://github.com/simple-icons/simple-icons) 纯 mi 标(LobeHub 那份是「Xiaomi / MIMO」两行文字组合标,15px 下糊成一团)。**品牌图形版权归各厂商**,正式对外使用前请查阅对应厂商的品牌条款
284
- - **全部图标可在一页里查看**:[图标目录](docs/model-icons.html)——62 张图形、76 条渠道映射、匹配规则与深浅色对照;离线单文件,与构建期内联进客户端的数据同源生成
246
+ - 模型按钮、模型选择列表与额度卡片显示渠道厂家图标;未识别渠道保留官方默认图标。
247
+ - 覆盖 pi-ai 常用内置厂家,以及 Ollama、vLLM、LM Studio、Perplexity、Cohere、火山引擎、豆包、混元、阶跃、Cline 等渠道。
248
+ - 自定义渠道名按前缀 / 别名识别,例如 `openrouter-f`、`zai-coding-cn`、`command-goat`、`cline-official`。
249
+ - 名称无法识别时,可按额度页**手动选择的适配类型**匹配;名称匹配优先,CLIProxyAPI 图标需手动适配后显示。
250
+ - 图标内置,离线可用,不向第三方发送渠道名称;开关在插件配置 → 交互,默认开启。
251
+ - 来源:[LobeHub Icons](https://github.com/lobehub/lobe-icons)(MIT)与 [Simple Icons](https://github.com/simple-icons/simple-icons)(CC0)。品牌图形归各厂商所有。
252
+ - 全部图标与渠道匹配规则见[图标目录](docs/model-icons.html)。
285
253
 
286
254
  ### 右栏文件编辑
287
255
 
@@ -351,7 +319,7 @@ flowchart TB
351
319
  1. 打开左侧边栏的「**插件**」页。
352
320
  2. 点右上角的「**+ 添加插件**」按钮。
353
321
  3. 在弹窗里按来源**三选一**填写(同一个输入框接受三种形式,底部提示会随填写内容变化):
354
- - **npm 包名(推荐)**:`@gehennawu/dsh-service@2.0.8`——**带上精确版本号**(写法 `包名@版本号`);
322
+ - **npm 包名(推荐)**:`@gehennawu/dsh-service@2.0.10`——**带上精确版本号**(写法 `包名@版本号`);
355
323
  - **GitHub 仓库地址**:`https://github.com/gehennawu/dsh-service`(公开仓库,无需令牌;`github:gehennawu/dsh-service` 简写同样可用);
356
324
  - **本地插件目录**:本机上的绝对路径,例如 `/path/to/dsh-service`(自研或已下载的插件)。
357
325
  4. 「**安装源**」按网络情况选择:默认「**npm 官方源**」;国内网络拉取受限时可选「**中国大陆镜像源**」(影响走包名安装时的拉取源,GitHub 地址与本地目录不受其影响)。
@@ -362,17 +330,17 @@ flowchart TB
362
330
 
363
331
  > 提示:三种形式都走官方安装链路,无需手动改 profile 文件;图形界面填 GitHub 地址与命令行 `github:` 前缀等价。
364
332
 
365
- > **npm 方式为什么建议带版本号**:pnpm 11 默认启用供应链发布观察期(`minimumReleaseAge`,1440 分钟)。**不带版本号**(含 `@latest`)时,发布时间未满观察期的版本不会被自动安装,包管理器会退到「最近的、已过观察期的那一版」——插件页因此可能提示「本次安装的是 x.y.z,而非最新版本 a.b.c」;**写精确版本号**(如 `@gehennawu/dsh-service@2.0.8`)才会安装你点名的那一版。观察期属供应链安全策略,不代表新版有问题;不着急时等满 24 小时,不带版本号安装同样会装到新版。
333
+ > **npm 方式为什么建议带版本号**:pnpm 11 默认启用供应链发布观察期(`minimumReleaseAge`,1440 分钟)。**不带版本号**(含 `@latest`)时,发布时间未满观察期的版本不会被自动安装,包管理器会退到「最近的、已过观察期的那一版」——插件页因此可能提示「本次安装的是 x.y.z,而非最新版本 a.b.c」;**写精确版本号**(如 `@gehennawu/dsh-service@2.0.10`)才会安装你点名的那一版。观察期属供应链安全策略,不代表新版有问题;不着急时等满 24 小时,不带版本号安装同样会装到新版。
366
334
 
367
335
  ### 方式二:命令行
368
336
 
369
337
  | 方式 | 命令 |
370
338
  | --- | --- |
371
- | npm(推荐) | `dsh plugin --profile web add @gehennawu/dsh-service@2.0.8` |
339
+ | npm(推荐) | `dsh plugin --profile web add @gehennawu/dsh-service@2.0.10` |
372
340
  | GitHub | `dsh plugin --profile web add github:gehennawu/dsh-service` |
373
341
  | 本地开发 | `dsh plugin --profile web add link:/path/to/dsh-service` |
374
342
 
375
- 命令行走 npm / pnpm 的默认源;需要镜像时,请先按 npm / pnpm 的常规做法把 registry 指到镜像站,再执行上面的命令。npm 方式同样受 pnpm 发布观察期影响:不带版本号会装到最近的、已过观察期的版本,写精确版本号(`@gehennawu/dsh-service@2.0.8`)才会装该版(原因见「方式一」的提示)。
343
+ 命令行走 npm / pnpm 的默认源;需要镜像时,请先按 npm / pnpm 的常规做法把 registry 指到镜像站,再执行上面的命令。npm 方式同样受 pnpm 发布观察期影响:不带版本号会装到最近的、已过观察期的版本,写精确版本号(`@gehennawu/dsh-service@2.0.10`)才会装该版(原因见「方式一」的提示)。
376
344
 
377
345
  安装或更新后重启 DSH Web:
378
346
 
@@ -424,11 +392,10 @@ pm2 start "dsh web --host 127.0.0.1" --name dsh-web
424
392
 
425
393
  运行要求:Node.js `>=22`,DSH Web 能加载 Host 与 Client 两半插件。更新检查需访问 `registry.npmjs.org`;网络失败不影响其他功能。
426
394
 
427
- **DSH 适配口径(alpha.1 基线)**:已适配 DSH `0.2.1-alpha.1`——会话格式 V4(V3 日志首读时由官方迁移为 `session.v4.jsonl.zstd` 代际文件,旧 `session.v3.jsonl.zstd` 按格式目录策略保留;详情视图自动归档系统事件)、`SettingsForms` 配置面(插件配置改由 Profile 的 `cordis.patch.yml` 承载,热更新走 `loader/volatile-update`;旧的 `settings.register` 在 0.1.5/0.1.6 上仍是权威来源,装在同一宿主上两者互不串台)、会话格式 V3 既有适配全部保留(`system/message` 入史、sessionPersistence handle 化、官方右栏、turn-process 对象化)、移动端底行触发钮双哈希兼容、子代理回合尾模型行 list 槽位自适应兼容、`plugins.bundle.config` 槽位注入、会话详情打开接入 `uiWorkspace` 降级链路。旧版 DSH(`>=0.1.1-rc.2`)保持兼容。alpha.1 轮曾将声明支持区间扩展到 `0.2.1-alpha.1`(当时 `engines.dsh` 上界 `<0.2.1-alpha.2`);0.2.1-alpha.1 源码级、npm 产物级(按 rolldown `//#region` 切片做逐源模块 sha256)与真机挂载审查(266 commits)确认:20 条既有接缝 17 条区域级逐字节相同、3 条均不触及本插件契约,9 个 slot key、25 个主题令牌、插件使用的 35 项官方 `data-*` 零丢失,宿主 RPC / `webServer` / 设置面 / persistence / session-format 产物逐字节全等;官方本版移除运行时 invariant 机制(各包 `./invariant` 导出 38→0、`dsh-invariants` 包退役)本插件零引用,并修复了「启停插件误删其它插件样式」。**唯一展示面破坏已双模式适配**:官方把 composer 统计行拆成 `activity`/`usage` 两个 dock 条目并删除行根类 `.root`,移动端规则除保留旧锚 `[class*="bOPqQW_root"]`(老宿主命中)外,新增官方新钩子 `[data-composer-stat]` 的同形约束与 ≤375px 字号阶梯(新宿主命中);0.2.0-rc.2 轮的模型弹窗分组标题 `MenuGroup` 双选适配继续有效,Client Inspect 挂起缺陷自 0.2.0-rc.2 起保持修复。rc.1 起新增的插件版本兼容门禁只读取 `peerDependencies`(本插件无该声明,不受门禁约束),并已在 DSH `0.2.1-alpha.1` 真机挂载运行。设置面、persistence/布局 seam 均按运行时能力探测走双形态,旧宿主上针对新结构的适配项天然不生效(纯展示,无功能损失)。注意:升级后写入的会话日志无法被旧版 DSH 读取,**备份不可跨版本降级恢复**。插件市场按 `package.json` 的 `engines.dsh` 区间判定兼容性(当前区间见下方 alpha.2 补充口径)。
395
+ **DSH 兼容范围**:`>=0.1.1-rc.2`(**无上界**),已验证至 `0.2.1-alpha.4`。不设上界的理由:`0.2.1-alpha.4` 起宿主门禁改为「插件声明了 `engines.dsh` 就由它单独裁决」,一旦上界写死,每次 DSH 发新版都会把插件整包挡掉(**且插件的一键升级会被同一门禁挡死,无法自救**);改用开区间后新版本插件照常加载,个别新功能可能尚未适配,但不阻断使用,也无需为 `engines.dsh` 单独发版。新版会话格式不能由旧版 DSH 读取,**备份不可跨版本降级恢复**。
428
396
 
429
- **DSH 0.2.1-alpha.2 补充适配**:支持范围扩展至 `0.2.1-alpha.2`(`engines.dsh`:`>=0.1.1-rc.2 <0.2.1-alpha.3`)。子代理启动同时兼容新版 `startActivation(spec)` 与老版 `start` / `startContinuable`;移动端任务芯片兼容官方移除 `.QsffPG_root`、任务菜单改用 body portal 定位。已在 alpha.2 当前 Web 宿主验证插件 RPC、子代理路由 `available:true`、真实 `subagent` 和 `subagent_fork` 派生及各自的路由派发记录,旧版和新版接口单测均通过。移动端在 alpha.2 真实有后台任务的会话上验证 320/360/390/560px 泊位几何、561px 在流回退及 390px portaled 菜单两次开合无越屏;320px 下任务计数文字完全省略但图标/箭头及完整 `aria-label` 保留。**老宿主真机 UI 对照与不同标签数尚未实测**。
430
397
 
431
- **DSH 桌面端(DSH Desktop / Electron)口径**:桌面端复用同一份 Web 前端与同一张客户端插件图(`platform: web`),插件照常加载,绝大多数功能原样可用;语义不同的只有「重启」与「一键升级」。宿主由桌面应用托管,**重启一律不再 `process.exit(42)`**(桌面壳把任何非 0 退出判为 Host 崩溃,会弹原生「启动失败」对话框且不会自动重拉,官方也没有可编程重启 RPC)——「重启」按钮、对话里的 `/restart` 与备份恢复后的重启统一改为提示「请在桌面端退出应用后重新打开」;**一键升级在桌面端置灰**并指向应用自带的插件管理页(桌面端 CLI 不能启动/改写 `profiles/desktop`,升级端点直接短路返回 `desktop-managed-upgrade`,不产生任何 subprocess);健康诊断的「运行环境」行显示「由桌面端托管(Electron)」。判据是宿主进程内的 `process.versions.electron`(Windows 桌面版真机实测 `44.0.0`,同进程 `ELECTRON_RUN_AS_NODE=1`、stdin/stdout 均非 TTY);非 Electron 的桌面封装可用 `DSH_SERVICE_RUNTIME_ENV=desktop` 显式声明。任务通知在桌面端**可用**(权限 granted,真机已收到系统通知);唯一的边界是**点击通知唤不回窗口**(桌面端关窗=隐藏窗口,`dshDesktop` 无窗口 API,请用托盘唤回)。macOS / Linux 桌面端未验证。
398
+ **DSH Desktop**:重启与恢复后的重启改为提示退出应用后重新打开;一键升级使用桌面应用自带的插件管理页。通知需授予系统权限,点击通知可能无法唤回隐藏窗口,请用托盘打开。其他平台尽力而为,不承诺兼容。
432
399
 
433
400
  ## 🔒 安全设计
434
401
 
@@ -518,7 +485,7 @@ Step Plan 订阅没有 API-key 形态的查询接口,需要网页登录态令
518
485
  <details>
519
486
  <summary><strong>插件管理页装了插件,版本却停在旧版?</strong></summary>
520
487
 
521
- pnpm 11 默认启用供应链发布观察期(`minimumReleaseAge`,1440 分钟):安装时**不带版本号**(含 `@latest`)只会选「发布时间已满观察期的最新版」,刚发布的新版会被跳过,官方插件页会提示「本次安装的是 x.y.z,而非最新版本 a.b.c」。要立刻装上新版:在插件管理页卸载后按 `包名@版本号` 重装(例如 `@gehennawu/dsh-service@2.0.8`),或直接用本插件的「**服务控制 → 一键升级**」——它按精确版本安装,不受观察期影响。观察期属供应链安全策略(新发布版本可能含尚未被发现的缺陷),等满 24 小时后不带版本号安装也会自然装到新版。
488
+ pnpm 11 默认启用供应链发布观察期(`minimumReleaseAge`,1440 分钟):安装时**不带版本号**(含 `@latest`)只会选「发布时间已满观察期的最新版」,刚发布的新版会被跳过,官方插件页会提示「本次安装的是 x.y.z,而非最新版本 a.b.c」。要立刻装上新版:在插件管理页卸载后按 `包名@版本号` 重装(例如 `@gehennawu/dsh-service@2.0.10`),或直接用本插件的「**服务控制 → 一键升级**」——它按精确版本安装,不受观察期影响。观察期属供应链安全策略(新发布版本可能含尚未被发现的缺陷),等满 24 小时后不带版本号安装也会自然装到新版。
522
489
  </details>
523
490
 
524
491
  <details>