@weniatall/dsh-task-models 0.2.2 → 0.3.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/README.md CHANGED
@@ -11,12 +11,15 @@ TypeSafe Jev(System One 决策模型)参与“这个子任务属于哪一类
11
11
 
12
12
  - **按任务类型路由**:内置 `explore`、`implement`、`review`、`test`、`research`、`docs` 六类,
13
13
  可添加任意自定义类型;每类独立选择 Provider、模型和思考档位。
14
- - **规则优先**:子任务 label(如 `[review]`)或关键词命中时直接路由,零额外模型调用。
14
+ - **规则优先**:精确 label / `[review]` / `review:` 显式前缀绝对优先,其次按关键词评分;英文标识符关键词采用词边界匹配,规则命中零额外模型调用。
15
+ - **规则试运行**:设置页直接预览未保存草稿的命中关键词、分数、并列冲突和下一分类路径;不调用模型、不写设置。
16
+ - **路由解释**:workflow 模型徽标显示任务类别、规则/Jev/轻量模型来源、有效置信度、决策耗时和回退原因;区分预选路由与请求头已确认模型。
15
17
  - **可选 Jev**:规则未命中时,把截断后的父任务/子任务文本发给 Jev,让它在已配置任务类型 +
16
18
  `general` 中选一个;Jev 只返回任务类型 id,不会发明模型或 Provider。
17
19
  - **可选轻量分类**:不想用 Jev 时,可配置一个轻量模型作为回退分类器。
18
- - **按子代理决策一次**:首次请求决定后缓存,后续请求沿用同一模型,不会在工具循环中来回切换。
19
- - **安全回退**:Jev 不可用、超时、低置信度、输出非法,或分类器未配置时,保持当前路由。
20
+ - **按子代理决策一次**:首次请求只缓存通过能力校验的有效路由,后续请求沿用同一模型;能力校验失败或最终无匹配时缓存“保持当前路由”,不会重放失败候选。
21
+ - **有界等待与取消**:分类链和候选能力校验共用 `decisionTimeoutMs` 总预算(默认 5000ms);调用者取消立即传播,不启动后续分类器,未完成决策可用新 signal 重试。
22
+ - **安全回退**:Jev 不可用、超时、低置信度、输出非法时继续既定回退链;最终无匹配、分类器未配置、总预算耗尽或候选不可用时保持当前路由。
20
23
  - **可观测**:设置页提供 Jev 状态、API Key 保存和测试按钮;密钥只写本地文件,不回显。
21
24
  - **独立设置命名空间**:`task-models`,通过专用 Connection RPC 读写,不依赖宿主设置 allowlist。
22
25
 
@@ -31,7 +34,7 @@ dsh plugin --profile web add @weniatall/dsh-task-models
31
34
  或锁定版本,从 GitHub Release 安装 tarball:
32
35
 
33
36
  ```bash
34
- dsh plugin --profile web add https://github.com/veildawn/dsh-plugins/releases/download/dsh-task-models@v0.2.2/dsh-task-models-0.2.2.tgz
37
+ dsh plugin --profile web add https://github.com/veildawn/dsh-plugins/releases/download/dsh-task-models@v0.3.1/dsh-task-models-0.3.1.tgz
35
38
  ```
36
39
 
37
40
  > 本包已发布到 npm scope `@weniatall/dsh-task-models`,后续版本由 CI 通过 Trusted
@@ -44,7 +47,7 @@ dsh plugin --profile web add https://github.com/veildawn/dsh-plugins/releases/do
44
47
  cd plugins/dsh-task-models
45
48
  npm test
46
49
  npm pack
47
- dsh plugin --profile web add ./weniatall-dsh-task-models-0.2.2.tgz
50
+ dsh plugin --profile web add ./weniatall-dsh-task-models-0.3.1.tgz
48
51
  ```
49
52
 
50
53
  > 本仓库的 `AGENTS.md` 规定:除非用户明确要求,不在本机部署插件或重启服务。开发验证请只运行
@@ -59,7 +62,11 @@ dsh plugin --profile web add ./weniatall-dsh-task-models-0.2.2.tgz
59
62
  3. 选择规则未命中时的回退方式:
60
63
  - **保持当前路由**(默认):不覆盖会话原有路由;其他插件的路由仍然生效;
61
64
  - **用轻量模型分类**:需要先配置“轻量分类模型”。
62
- 4. 可选启用 Jev,填写 API Key(或留空使用环境变量/密钥文件)、Base URL、模型和阈值。
65
+ 4. 可选启用 Jev,填写 API Key(留空保留本插件已保存的 Key)、Base URL、模型和阈值;“已配置”只表示已保存 Key,不代表联网测试成功。
66
+ 5. 设置“决策总超时”,范围 100–60000ms 的整数,默认 5000ms;Jev 还受自身超时限制。
67
+ 6. 在“规则试运行”输入子任务标题与内容,预览当前未保存草稿。结果只表示规则判断及下一路径,不代替实际 Jev/轻量模型分类或候选能力校验。
68
+
69
+ 设置页编辑期间如配置被其他页面更新,会保留本地草稿和原始 revision 并提示冲突;可重新加载最新配置,直接保存时仍由宿主版本检查拒绝覆盖他人的更新。
63
70
 
64
71
  对应的 YAML:
65
72
 
@@ -70,6 +77,7 @@ task-models:
70
77
  fallback: taskRole # taskRole | llm
71
78
  useJev: true
72
79
  respectExplicitChildModel: true
80
+ decisionTimeoutMs: 5000 # 分类链 + 候选能力校验的总预算
73
81
  classifier: # fallback=llm 时使用;留空表示不用
74
82
  provider: ai-proxy
75
83
  model: deepseek-v4-flash
@@ -104,11 +112,15 @@ task-models:
104
112
  4. 仍未命中 → 保持当前路由
105
113
  ```
106
114
 
115
+ - 精确 label(`review`)或显式前缀(`[review]`、`review:`)优先于所有关键词分数;禁用类型不参与匹配。
116
+ - 没有显式类型时,关键词命中 label 计 3 分、仅命中任务内容计 1 分,每个关键词只计一次。纯 ASCII 字母/数字/下划线关键词采用 Unicode 字母、数字和下划线边界:`read` 不会命中 `Thread`、`reading`、`my_read`;中文关键词仍使用包含匹配。
107
117
  - 规则并列(tie)不会按配置顺序随机选择,而是交给 Jev/轻量模型/回退。
108
118
  - 其他子系统通过 `modelRole` 标记的内部子代理、计划模式、非子代理会话都会旁路。
109
119
  - 子任务如果显式选择了与父级当前路由不同的模型,默认跳过任务类型路由,避免无声覆盖
110
120
  (`respectExplicitChildModel`)。显式选择恰好等于父级基线时无法检测,见“已知限制”。
111
- - 第二次及后续请求会重放缓存的任务类型路由;不会退回父级/当前模型。
121
+ - 第二次及后续请求只重放已通过校验并采用的路由;校验失败、无匹配或总预算耗尽的子代理继续保持当前路由,不重复分类或误用失败候选。
122
+ - Jev 的 `confidence` 必须为 `[0,1]` 内的有限数值且达到阈值。**兼容性变化**:旧接口省略 confidence、返回数字字符串或越界数值时不再采用该选择,转入既定回退链。
123
+ - 轻量分类必须正常结束;带有部分类型文本的失败/取消响应不能被当作有效选择。
112
124
 
113
125
  ## 与 Agent Preset 无关
114
126
 
@@ -124,7 +136,8 @@ task-models:
124
136
  - `jevStatus` 只返回“是否已配置”和模型名,不返回 Key 或掩码。
125
137
  - 启用 Jev 后,规则未命中时会把父任务、子任务 label/prompt(截断到 `maxStateChars`)发送到
126
138
  TypeSafe;图片不会发送。敏感任务请关闭 Jev 或改用仅规则/轻量分类。
127
- - 首次子任务请求最多增加 `timeoutMs` 的等待;Jev 失败只告警一次,不阻塞子任务。
139
+ - Jev 调用受 `jev.timeoutMs` 与剩余决策总预算共同限制;首次请求的插件分类/能力校验等待由 `routing.decisionTimeoutMs` 约束。Jev 失败只告警一次,不阻止既定回退。
140
+ - 规则试运行不会调用 Jev/轻量模型,也不会发送输入到 TypeSafe;保存草稿和试运行是两个独立操作。
128
141
 
129
142
  ## 工作流成员模型标注
130
143
 
@@ -133,15 +146,16 @@ task-models:
133
146
 
134
147
  实现方式:
135
148
 
136
- - Host 端在每次子代理 `agent/request` 后记录其**最终生效**的 provider/model/effort,覆盖本插件
137
- 路由、其他角色路由以及显式子代理模型三种来源。
149
+ - Host 端通过公开的 `request/header` 会话事件记录子代理**请求头已确认**的 provider/model/effort,覆盖本插件路由、其他角色路由以及显式子代理模型;这不等于 Provider 已成功响应。
150
+ - 路由解释区分 `selectedRoute`(本插件选中的候选,`status=adopted` 才表示已通过能力校验;不可用候选会明确标记原因)与 `effectiveRoute`(请求头确认值)。尚未确认请求头时不把预选模型当成实际模型。
138
151
  - 对插件升级/重启前已存在的 workflow,Host 会尽力从 `~/.dsh/sessions/**/<childId>/session.v4.jsonl(.zstd)`
139
152
  的 `request/header` 回溯该成员的最终模型;读不到日志时静默留空,不影响运行。
140
153
  - Client 端以 `priority: -1` 覆盖宿主的 `workflow-run` 渲染器(DSH 支持的 keyed slot 阴影机制),
141
154
  保留运行/阶段状态、展开收起与运行中成员跳转,只额外加入模型徽标。
142
- - 模型信息通过本插件自己的 `/task-models-settings` RPC 的 `childModels` 方法读取;面板每 2 秒
143
- 刷新一次,子代理首次请求完成后徽标即出现。
155
+ - 模型和解释通过本插件自己的 `/task-models-settings` RPC 的 `routingDetails` 方法读取;运行中面板每 2 秒刷新一次,请求头确认后即可显示徽标。旧 `childModels` 方法保留其兼容返回格式。
156
+ - 悬停或通过辅助技术读取徽标,可查看类别、决策来源、有效置信度、耗时和稳定的回退原因。旧会话只有模型记录时显示“原因未知”,不反推猜测。
144
157
  - 未知模型且成员仍在运行时显示“模型…”;已完成但未知则不显示,避免猜测。
158
+ - 决策解释仅保存在有界内存缓存(最多 2000 个子代理摘要),不会把完整任务文本或 Key 写入缓存/新日志;插件重载后历史模型可回溯,历史决策原因可能未知。
145
159
 
146
160
  > 该增强依赖宿主 `conversation.chat.node` 的 keyed slot 与 `workflow-run` 节点数据。若未来 DSH
147
161
  > 改动该 UI,可能需要跟随升级;禁用/卸载本插件会立即恢复宿主原生 workflow 卡片。
@@ -153,7 +167,8 @@ task-models:
153
167
  - 不处理 ACP / Codex / Claude Code 等外部进程子代理的模型选择;这些由各自外部进程决定。
154
168
  - 主任务自动分类、识图委派、顾问复核不在本插件职责内;由宿主或相应插件负责。本插件只处理
155
169
  子任务模型映射。
156
- - 已运行的子代理在设置修改后保持原路由;新子代理使用新设置。
170
+ - 已采用路由的子代理在修改模型/档位、禁用或删除任务类型后仍保持原路由;新子代理使用新设置。**总路由开关是例外**:关闭后立即停止覆盖,重新开启后旧子代理恢复原已采用路由;内部角色与计划模式旁路始终优先。若首次分类尚未结束就关闭路由/进入旁路,该候选不会被正式采用,重开也不会突然启用它。
171
+ - 以上决策冻结为进程内状态;插件重载/进程重启后,本插件不会重新分类已经有请求头的会话,交由宿主恢复原有请求路由。
157
172
  - 显式选择恰好等于父级当前路由时无法检测,可能被任务类型路由覆盖。
158
173
  - 宿主 `subagentModelSelection` 的 allowedModels 不会在本插件路由层再次强制;需要严格白名单时
159
174
  请关闭本插件的任务路由或 `respectExplicitChildModel` 不能覆盖的部分改由宿主控制。
@@ -162,13 +177,13 @@ task-models:
162
177
 
163
178
  ```bash
164
179
  cd plugins/dsh-task-models
165
- npm test # core + routing + package + 宿主设置门禁
180
+ npm test # core + routing + rpc + integration + package + 宿主设置门禁
166
181
  npm pack --dry-run
167
182
  ```
168
183
 
169
- 测试覆盖:配置默认值与校验、关键词/label 规则、tie 回退、Jev choice 解析、自定义 Jev HTTP
170
- 端点、低置信度回退、轻量分类、显式 route 跳过、主会话/内部子代理旁路、设置 RPC 和客户端
171
- bundle 渲染。
184
+ 测试覆盖:配置默认值与超时预算校验、显式 label 优先、英文词边界/中文包含匹配、tie 回退、严格 Jev confidence、自定义 Jev HTTP 端点、轻量分类、取消重试、挂起分类器与能力校验超时、不可用候选不重放、热更新行为矩阵、并发决策复用、显式 route 跳过、主会话/内部角色/计划模式旁路、规则试运行 RPC、预选与请求头确认模型区分,以及客户端交互与草稿 revision 冲突保护。
185
+
186
+ 请求链集成测试使用真实 Cordis waterfall 与 LLM Runtime、内存 Adapter 和请求头事件,不访问外部模型;网络测试仅用 loopback HTTP 与隔离临时目录。宿主设置门禁在隔离临时环境挂载 Config,不安装到真实 Profile、不重启服务。
172
187
 
173
188
  ## License
174
189
 
package/cordis.patch.yml CHANGED
@@ -26,6 +26,7 @@
26
26
  fallback: taskRole
27
27
  useJev: true
28
28
  respectExplicitChildModel: true
29
+ decisionTimeoutMs: 5000
29
30
  profiles: []
30
31
  jev:
31
32
  enabled: false