dsh-plugin-compat-check 0.0.0-stage → 0.1.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/README.md +78 -2
- package/cordis.patch.yml +3 -0
- package/index.js +1584 -0
- package/kernel/lib/baseline.mjs +233 -0
- package/kernel/lib/extract.mjs +1643 -0
- package/kernel/lib/verdict.mjs +620 -0
- package/kernel/lib/version.mjs +37 -0
- package/kernel/rules/README.md +232 -0
- package/kernel/rules/dsh-api-catalog.json +689 -0
- package/kernel/rules/severity.json +1056 -0
- package/kernel/rules/usage-inventory.json +144 -0
- package/lib/client.js +562 -0
- package/package.json +55 -4
- package/scripts/prepublish-check.mjs +84 -0
- package/scripts/stage-kernel.mjs +68 -0
- package/scripts/stage-skill.mjs +53 -0
- package/scripts/unstage-kernel.mjs +21 -0
- package/skill/SKILL.md +149 -0
|
@@ -0,0 +1,1056 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"description": "服务/方法 → 严重度 + 影响面。判定由这张表驱动,不由 LLM 决定;表未覆盖的 API 落到 defaults。",
|
|
4
|
+
"_coverageBasis": {
|
|
5
|
+
"usedServices": "rules/usage-inventory.json(快照)与 `node lib/extract.mjs ~/.dsh/profiles/desktop/node_modules <out>` 的真实输出(实测 58 个服务)",
|
|
6
|
+
"serviceSemantics": "DSH 桌面端 app.asar 内官方生成的 API 目录(宿主 dsh-tool-cordis/lib/types/api-catalog.js、客户端 dsh-cordis-client-runner/lib/client.js)。每条 summary 与每个方法含义都取自它,不自行发明。",
|
|
7
|
+
"coverageReport": "覆盖率的前后对比、\"有官方目录依据\"与\"从调用点推断\"的分列、以及**故意没填**的清单见 rules/README.md"
|
|
8
|
+
},
|
|
9
|
+
"_entryConventions": {
|
|
10
|
+
"layer": "host = Node 宿主侧(ctx 在宿主进程里);client = 浏览器客户端侧;both = 同名服务两侧都有但**语义/签名不同**(sessions、timer),此时逐方法再标一次 layer",
|
|
11
|
+
"summary": "这个服务是干什么的(人话,来自官方目录的 summary/description)",
|
|
12
|
+
"severity": "只能是 fatal / feature-dead / degraded 三档之一,语义见 severityLevels",
|
|
13
|
+
"impact": "一句人话:什么东西坏了,或者怎么个降级法。禁止\"可能有问题\"这类空话",
|
|
14
|
+
"basis": "该条判定的证据等级:catalog = 官方 API 目录的 summary/description 直接支持;catalog-description = 目录没声明方法,但官方 description 里明确写了这个方法;callsite = 目录里没有,依据是真实插件在该调用点上的代码(会在 evidence 里给出文件:行)",
|
|
15
|
+
"evidence": "basis=callsite 时必须给出具体文件:行",
|
|
16
|
+
"knownGoneIn": "已知在某个 DSH 版本起不再提供(沿用既有条目的写法)",
|
|
17
|
+
"note": "补充说明;不影响判定"
|
|
18
|
+
},
|
|
19
|
+
"severityLevels": {
|
|
20
|
+
"fatal": "致命:插件条目没有激活(pending/failed),整个插件是死的",
|
|
21
|
+
"feature-dead": "功能失效:某个特性确定不可用",
|
|
22
|
+
"degraded": "降级:仍可用,但能力缩水(例如事件变轮询)"
|
|
23
|
+
},
|
|
24
|
+
"layerDefaults": [
|
|
25
|
+
{
|
|
26
|
+
"when": "宿主 loader 里该条目 fiber.state 为 FAILED 或 PENDING",
|
|
27
|
+
"severity": "fatal",
|
|
28
|
+
"basis": "运行时事实,无需静态分析"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"when": "插件在 inject 里声明了某服务,而宿主没有它",
|
|
32
|
+
"severity": "fatal",
|
|
33
|
+
"basis": "条目会停在 pending(waiting for service: X),等价于没起来"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"when": "插件用 ctx.get('x') 取服务,宿主没有 x",
|
|
37
|
+
"severity": "feature-dead",
|
|
38
|
+
"basis": "不会导致未激活,但取不到 → 相关功能静默失效或抛错"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"when": "服务存在、方法不存在,且该方法不在本表中",
|
|
42
|
+
"severity": "feature-dead",
|
|
43
|
+
"impact": "影响面未知",
|
|
44
|
+
"basis": "默认档;必须显式标注“影响面未知”,不得假装判断过"
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
"services": {
|
|
48
|
+
"agentDefaultModel": {
|
|
49
|
+
"layer": "host",
|
|
50
|
+
"summary": "默认模型选择",
|
|
51
|
+
"methods": {
|
|
52
|
+
"currentSelection": {
|
|
53
|
+
"severity": "feature-dead",
|
|
54
|
+
"impact": "读不到当前模型,插件无法跟随模型变化"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"agentPresets": {
|
|
59
|
+
"layer": "host",
|
|
60
|
+
"summary": "YAML 声明的 agent 预设注册表,以及活动 agent 保留的预设修订",
|
|
61
|
+
"methods": {
|
|
62
|
+
"resolve": {
|
|
63
|
+
"severity": "feature-dead",
|
|
64
|
+
"impact": "解析不出预设身份 → 依赖预设的装配失效:父代理的预设(工具集/人设)传不到子代理,子代理只能按默认组合启动",
|
|
65
|
+
"basis": "catalog",
|
|
66
|
+
"evidence": "dsh-better-sidebar/lib/index.js:3325(用父会话记录的预设 id 装配子代理)"
|
|
67
|
+
},
|
|
68
|
+
"mount": {
|
|
69
|
+
"severity": "feature-dead",
|
|
70
|
+
"impact": "预设绑定不到新建的 agent 上:按预设装配出来的 agent/子代理缺预设声明的工具集与人设",
|
|
71
|
+
"basis": "catalog",
|
|
72
|
+
"evidence": "dsh-better-sidebar/lib/index.js:3329"
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
"agentTeams": {
|
|
77
|
+
"layer": "host",
|
|
78
|
+
"summary": "Agent Teams 服务:以正在运行的 Lead 会话日志为准的团队/任务服务",
|
|
79
|
+
"methods": {
|
|
80
|
+
"tryMembership": {
|
|
81
|
+
"severity": "feature-dead",
|
|
82
|
+
"impact": "认不出调用者属于哪个团队 → 团队作用域的工具装不上:会话里看不到 Agent Teams 那一套工具",
|
|
83
|
+
"basis": "catalog",
|
|
84
|
+
"evidence": "官方目录:tryMembership “Resolve a caller without throwing, used by scoped-tool installation and observers”;调用点 dsh-better-sidebar/lib/index.js:3030"
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
"agents": {
|
|
89
|
+
"layer": "host",
|
|
90
|
+
"summary": "agent 实例",
|
|
91
|
+
"note": "usage-inventory 里的 agents.listDescendants 是提取误报(子代理变量名里的 “agents.” 被当成 agents 服务),见 knownExtractionArtifacts —— 不要为它补规则",
|
|
92
|
+
"methods": {
|
|
93
|
+
"list": {
|
|
94
|
+
"severity": "feature-dead",
|
|
95
|
+
"impact": "看不到 agent 列表"
|
|
96
|
+
},
|
|
97
|
+
"get": {
|
|
98
|
+
"severity": "feature-dead",
|
|
99
|
+
"impact": "定位不到 agent,相关功能失效"
|
|
100
|
+
},
|
|
101
|
+
"create": {
|
|
102
|
+
"severity": "feature-dead",
|
|
103
|
+
"impact": "无法创建 agent"
|
|
104
|
+
},
|
|
105
|
+
"resume": {
|
|
106
|
+
"severity": "feature-dead",
|
|
107
|
+
"impact": "恢复不了已暂停的 agent,任务停在暂停态",
|
|
108
|
+
"basis": "catalog"
|
|
109
|
+
},
|
|
110
|
+
"roots": {
|
|
111
|
+
"severity": "feature-dead",
|
|
112
|
+
"impact": "拿不到 agent 的根集合,插件的 agent 视图为空",
|
|
113
|
+
"basis": "catalog"
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
"attachments": {
|
|
118
|
+
"layer": "host",
|
|
119
|
+
"summary": "附件读取",
|
|
120
|
+
"methods": {
|
|
121
|
+
"readImage": {
|
|
122
|
+
"severity": "feature-dead",
|
|
123
|
+
"impact": "无法读取图片附件,视觉相关功能失效"
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
"commands": {
|
|
128
|
+
"layer": "host",
|
|
129
|
+
"summary": "斜杠命令",
|
|
130
|
+
"methods": {
|
|
131
|
+
"register": {
|
|
132
|
+
"severity": "feature-dead",
|
|
133
|
+
"impact": "该命令不存在,输入 /xxx 无反应"
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
"configEditor": {
|
|
138
|
+
"layer": "host",
|
|
139
|
+
"summary": "读写 profile 的完整原始配置,并走正常 Loader 路径应用",
|
|
140
|
+
"methods": {},
|
|
141
|
+
"note": "本机 21 个插件里只见到服务级依赖(dsh-mnemon 的 inject),没有提取到方法级调用(目录声明的 configuration/edit/entries 都没被调用),故不给方法级判定。"
|
|
142
|
+
},
|
|
143
|
+
"connection": {
|
|
144
|
+
"layer": "host",
|
|
145
|
+
"summary": "宿主连接/鉴权面(供传输无关的适配器消费:admit、authenticatedUrl、authorizeIndex 等)",
|
|
146
|
+
"methods": {
|
|
147
|
+
"authenticatedUrl": {
|
|
148
|
+
"severity": "degraded",
|
|
149
|
+
"impact": "拼不出带鉴权的连接 URL,插件的直链/预览入口失效",
|
|
150
|
+
"basis": "catalog"
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
"note": "5 个插件声明依赖了它,但都没有提取到方法级调用,故不给方法级判定。"
|
|
154
|
+
},
|
|
155
|
+
"credentials": {
|
|
156
|
+
"layer": "host",
|
|
157
|
+
"summary": "凭据解析:把一个环境变量名解析成背后的值(进程环境 → 托管存储 → .env 分层)",
|
|
158
|
+
"note": "官方目录对 credentials **一个方法都不声明**(抽象服务),但官方 description 明确写了 resolve 的行为。这正是“目录 ≠ 运行时 API 面”的典型:不要因为目录为空就认定 resolve 不存在。",
|
|
159
|
+
"methods": {
|
|
160
|
+
"resolve": {
|
|
161
|
+
"severity": "feature-dead",
|
|
162
|
+
"impact": "解析不出凭据:插件拿不到 API Key/Token,相关联网功能失败(取不到时返回 undefined 而不是抛错,所以是静默失效)",
|
|
163
|
+
"basis": "catalog-description",
|
|
164
|
+
"evidence": "官方 description:“an empty stored value is absent everywhere — resolve skips it”;调用点 dsh-pet/lib/index.js:2230"
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
"deepseekAccount": {
|
|
169
|
+
"layer": "host",
|
|
170
|
+
"methods": {
|
|
171
|
+
"getBalance": {
|
|
172
|
+
"severity": "degraded",
|
|
173
|
+
"impact": "读不到账号余额,插件的额度显示为空",
|
|
174
|
+
"basis": "callsite",
|
|
175
|
+
"evidence": "dsh-pet/lib/index.js:2239"
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
"jobs": {
|
|
180
|
+
"layer": "host",
|
|
181
|
+
"summary": "后台任务",
|
|
182
|
+
"note": "客户端另有一个**同名**的 jobs 服务(watchRows/observe/kill/state,由 dsh-better-sidebar 的客户端代码软取),与这里的宿主任务注册表不是一回事。本表这一条只描述宿主侧。",
|
|
183
|
+
"methods": {
|
|
184
|
+
"onJobsChanged": {
|
|
185
|
+
"severity": "degraded",
|
|
186
|
+
"impact": "任务状态不再实时推送,插件退化为轮询(约 5 秒延迟)",
|
|
187
|
+
"knownGoneIn": [
|
|
188
|
+
"0.2.0-rc.2"
|
|
189
|
+
]
|
|
190
|
+
},
|
|
191
|
+
"list": {
|
|
192
|
+
"severity": "feature-dead",
|
|
193
|
+
"impact": "看不到任务列表,相关面板为空"
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
"layout": {
|
|
198
|
+
"layer": "client",
|
|
199
|
+
"summary": "客户端面板导航:选中央面板、开关侧栏/右栏、发起一次导航",
|
|
200
|
+
"methods": {
|
|
201
|
+
"selectPanel": {
|
|
202
|
+
"severity": "degraded",
|
|
203
|
+
"impact": "切不动中央面板(点击后面板不切换):能探测缺失的插件会退回侧栏入口(mnemon 已内置该回退),入口降级但界面仍可用",
|
|
204
|
+
"basis": "catalog",
|
|
205
|
+
"evidence": "dsh-mnemon/lib/client.js:11653(open 时切到自己的主面板,不可用则挂侧栏条目兜底)"
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
},
|
|
209
|
+
"llm": {
|
|
210
|
+
"layer": "host",
|
|
211
|
+
"summary": "模型访问",
|
|
212
|
+
"methods": {
|
|
213
|
+
"listModels": {
|
|
214
|
+
"severity": "feature-dead",
|
|
215
|
+
"impact": "模型选择器为空"
|
|
216
|
+
},
|
|
217
|
+
"resolveCallConfig": {
|
|
218
|
+
"severity": "feature-dead",
|
|
219
|
+
"impact": "无法发起模型调用"
|
|
220
|
+
},
|
|
221
|
+
"listProviders": {
|
|
222
|
+
"severity": "degraded",
|
|
223
|
+
"impact": "列不出已注册的模型提供方,插件只能按 provider id 显示(modlens 退回显示上游 id 而不是显示名)",
|
|
224
|
+
"basis": "callsite",
|
|
225
|
+
"evidence": "@liustack/modlens/dsh/index.js:397(typeof 探测不成立即整体跳过名称解析)"
|
|
226
|
+
},
|
|
227
|
+
"resolveModelInfo": {
|
|
228
|
+
"severity": "degraded",
|
|
229
|
+
"impact": "拿不到模型的元信息(上下文窗口/定价),插件只能按默认值估算",
|
|
230
|
+
"basis": "catalog"
|
|
231
|
+
},
|
|
232
|
+
"stream": {
|
|
233
|
+
"severity": "feature-dead",
|
|
234
|
+
"impact": "无法流式调用模型 —— 插件的 AI 功能整体不可用",
|
|
235
|
+
"basis": "catalog"
|
|
236
|
+
},
|
|
237
|
+
"providerRetryPolicy": {
|
|
238
|
+
"severity": "degraded",
|
|
239
|
+
"impact": "读不到宿主的重试策略,插件自行重试可能与宿主策略叠加(重复请求/重复计费)",
|
|
240
|
+
"basis": "catalog"
|
|
241
|
+
},
|
|
242
|
+
"registerAdapter": {
|
|
243
|
+
"severity": "feature-dead",
|
|
244
|
+
"impact": "注册的模型适配器不生效,这个插件提供的模型用不了",
|
|
245
|
+
"basis": "catalog"
|
|
246
|
+
},
|
|
247
|
+
"listConfigurableProviders": {
|
|
248
|
+
"severity": "degraded",
|
|
249
|
+
"impact": "列不出可配置的模型提供方,插件的模型配置界面为空",
|
|
250
|
+
"basis": "callsite",
|
|
251
|
+
"evidence": "dsh-pet/lib/index.js:2541"
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
},
|
|
255
|
+
"loader": {
|
|
256
|
+
"layer": "host",
|
|
257
|
+
"summary": "插件条目加载器(cordis 内建,不在官方服务目录里)",
|
|
258
|
+
"methods": {
|
|
259
|
+
"entries": {
|
|
260
|
+
"severity": "feature-dead",
|
|
261
|
+
"impact": "依赖插件清单的功能(如插件管理面板)失效"
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
},
|
|
265
|
+
"locale": {
|
|
266
|
+
"layer": "client",
|
|
267
|
+
"summary": "客户端文案字典",
|
|
268
|
+
"methods": {
|
|
269
|
+
"register": {
|
|
270
|
+
"severity": "degraded",
|
|
271
|
+
"impact": "插件的文案回退到 key 或英文,界面仍可用"
|
|
272
|
+
},
|
|
273
|
+
"bind": {
|
|
274
|
+
"severity": "feature-dead",
|
|
275
|
+
"impact": "取不到翻译函数,插件界面可能直接抛错"
|
|
276
|
+
},
|
|
277
|
+
"subscribe": {
|
|
278
|
+
"severity": "degraded",
|
|
279
|
+
"impact": "语言切换不再实时生效"
|
|
280
|
+
},
|
|
281
|
+
"getSnapshot": {
|
|
282
|
+
"severity": "degraded",
|
|
283
|
+
"impact": "只影响插件自己的语言状态读取"
|
|
284
|
+
},
|
|
285
|
+
"getLocale": {
|
|
286
|
+
"severity": "degraded",
|
|
287
|
+
"impact": "读不到当前语言快照,插件只能用自己写死的默认语言(界面仍可用,只是不跟随语言切换)",
|
|
288
|
+
"basis": "catalog"
|
|
289
|
+
},
|
|
290
|
+
"addLanguage": {
|
|
291
|
+
"severity": "feature-dead",
|
|
292
|
+
"impact": "语言包注册不进去:这门语言不会出现在语言切换列表里",
|
|
293
|
+
"basis": "catalog"
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
},
|
|
297
|
+
"logger": {
|
|
298
|
+
"layer": "host",
|
|
299
|
+
"summary": "日志(cordis 内建,不在官方服务目录里)",
|
|
300
|
+
"methods": {
|
|
301
|
+
"warn": {
|
|
302
|
+
"severity": "degraded",
|
|
303
|
+
"impact": "日志缺失,功能不受影响(但会让后续排障变难)"
|
|
304
|
+
},
|
|
305
|
+
"info": {
|
|
306
|
+
"severity": "degraded",
|
|
307
|
+
"impact": "同上"
|
|
308
|
+
},
|
|
309
|
+
"error": {
|
|
310
|
+
"severity": "degraded",
|
|
311
|
+
"impact": "同上"
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
},
|
|
315
|
+
"pluginManager": {
|
|
316
|
+
"layer": "host",
|
|
317
|
+
"summary": "管理 profile 文件并执行其声明的重载生命周期",
|
|
318
|
+
"methods": {},
|
|
319
|
+
"note": "只有服务级依赖(dsh-mnemon),没有方法级调用可判。"
|
|
320
|
+
},
|
|
321
|
+
"profileContext": {
|
|
322
|
+
"layer": "host",
|
|
323
|
+
"summary": "当前 profile 的事实(名称/路径等);调度与修改归调用方",
|
|
324
|
+
"methods": {},
|
|
325
|
+
"note": "3 个插件声明依赖,无方法级调用可判。"
|
|
326
|
+
},
|
|
327
|
+
"sandboxPolicy": {
|
|
328
|
+
"layer": "host",
|
|
329
|
+
"summary": "沙箱策略:部署默认模式、回退工作区根与当前请求的策略段",
|
|
330
|
+
"methods": {},
|
|
331
|
+
"note": "dsh-recall-plugin 声明依赖,无方法级调用可判。"
|
|
332
|
+
},
|
|
333
|
+
"sessionPersistence": {
|
|
334
|
+
"layer": "host",
|
|
335
|
+
"summary": "只追加的会话持久化存储(按会话句柄寻址的抽象服务,目录里不声明方法)",
|
|
336
|
+
"methods": {
|
|
337
|
+
"open": {
|
|
338
|
+
"severity": "feature-dead",
|
|
339
|
+
"impact": "打不开某个已持久化的会话 → 读取历史会话日志、回放的功能失效",
|
|
340
|
+
"basis": "catalog-description",
|
|
341
|
+
"evidence": "官方 description 明写可见性由 stat/list/open 提供;调用点 dsh-better-sidebar/lib/index.js:3267"
|
|
342
|
+
},
|
|
343
|
+
"list": {
|
|
344
|
+
"severity": "feature-dead",
|
|
345
|
+
"impact": "列不出持久化会话 → 冷会话清单/归档扫描为空",
|
|
346
|
+
"basis": "catalog-description",
|
|
347
|
+
"evidence": "@michengai/dsh-archive-manager/lib/workspace.js:1041"
|
|
348
|
+
},
|
|
349
|
+
"acquireLease": {
|
|
350
|
+
"severity": "degraded",
|
|
351
|
+
"impact": "拿不到会话写租约,多端并发时可能互相覆盖",
|
|
352
|
+
"basis": "callsite",
|
|
353
|
+
"evidence": "@michengai/dsh-archive-manager/lib/workspace.js:465"
|
|
354
|
+
},
|
|
355
|
+
"locate": {
|
|
356
|
+
"severity": "feature-dead",
|
|
357
|
+
"impact": "定位不到会话的存储位置,归档/离线读取整条失效",
|
|
358
|
+
"basis": "callsite",
|
|
359
|
+
"evidence": "@michengai/dsh-archive-manager/lib/workspace.js:382"
|
|
360
|
+
},
|
|
361
|
+
"prepare": {
|
|
362
|
+
"severity": "feature-dead",
|
|
363
|
+
"impact": "准备不了持久化会话,冷会话(未激活)读不出来",
|
|
364
|
+
"basis": "callsite",
|
|
365
|
+
"evidence": "@michengai/dsh-archive-manager/lib/workspace.js:1054"
|
|
366
|
+
},
|
|
367
|
+
"readFrom": {
|
|
368
|
+
"severity": "degraded",
|
|
369
|
+
"impact": "读不了旧版存储格式(向后兼容路径失效),老会话打不开",
|
|
370
|
+
"basis": "callsite",
|
|
371
|
+
"evidence": "@michengai/dsh-archive-manager/lib/workspace.js:718"
|
|
372
|
+
},
|
|
373
|
+
"readZstdPrefix": {
|
|
374
|
+
"severity": "feature-dead",
|
|
375
|
+
"impact": "读不了 zstd 压缩存储的会话头,压缩格式的会话整条打不开",
|
|
376
|
+
"basis": "callsite",
|
|
377
|
+
"evidence": "@michengai/dsh-archive-manager/lib/workspace.js:414"
|
|
378
|
+
},
|
|
379
|
+
"stat": {
|
|
380
|
+
"severity": "degraded",
|
|
381
|
+
"impact": "查不到会话的存储状态,插件无法判断\"是否已持久化\"",
|
|
382
|
+
"basis": "callsite",
|
|
383
|
+
"evidence": "@michengai/dsh-archive-manager/lib/workspace.js:584"
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
},
|
|
387
|
+
"sessionProjectionCache": {
|
|
388
|
+
"layer": "host",
|
|
389
|
+
"summary": "持久化的会话投影缓存(节流写回 + 会话创建/turn 结束/会话释放三个强制点,写失败只告警并自愈)",
|
|
390
|
+
"methods": {
|
|
391
|
+
"cachedSnapshot": {
|
|
392
|
+
"severity": "degraded",
|
|
393
|
+
"impact": "取不到投影缓存,每次都要全量重算(大 profile 上会明显变慢)",
|
|
394
|
+
"basis": "catalog"
|
|
395
|
+
},
|
|
396
|
+
"clearTombstone": {
|
|
397
|
+
"severity": "degraded",
|
|
398
|
+
"impact": "墓碑清不掉,已删除的投影可能被反复重建",
|
|
399
|
+
"basis": "callsite",
|
|
400
|
+
"evidence": "@michengai/dsh-archive-manager/lib/workspace.js:870"
|
|
401
|
+
},
|
|
402
|
+
"delete": {
|
|
403
|
+
"severity": "degraded",
|
|
404
|
+
"impact": "删不掉缓存条目,会读到过期的投影",
|
|
405
|
+
"basis": "callsite",
|
|
406
|
+
"evidence": "@michengai/dsh-archive-manager/lib/workspace.js:868"
|
|
407
|
+
},
|
|
408
|
+
"put": {
|
|
409
|
+
"severity": "degraded",
|
|
410
|
+
"impact": "写不进缓存,每次都要重算(功能可用但变慢)",
|
|
411
|
+
"basis": "callsite",
|
|
412
|
+
"evidence": "@michengai/dsh-archive-manager/lib/workspace.js:695"
|
|
413
|
+
},
|
|
414
|
+
"whenIdle": {
|
|
415
|
+
"severity": "degraded",
|
|
416
|
+
"impact": "等不到\"缓存空闲\"信号,插件的后台整理时机无从判断",
|
|
417
|
+
"basis": "callsite",
|
|
418
|
+
"evidence": "@michengai/dsh-archive-manager/lib/workspace.js:869"
|
|
419
|
+
}
|
|
420
|
+
},
|
|
421
|
+
"note": "dsh-archive-manager 声明依赖,无方法级调用可判。"
|
|
422
|
+
},
|
|
423
|
+
"sessionProjections": {
|
|
424
|
+
"layer": "host",
|
|
425
|
+
"summary": "会话投影单元表与其驱动:每个提交事件过一遍各注册单元的 apply,变更只在其原始结果变化时通知",
|
|
426
|
+
"methods": {
|
|
427
|
+
"restore": {
|
|
428
|
+
"severity": "feature-dead",
|
|
429
|
+
"impact": "投影恢复不了,插件的历史/归档视图为空",
|
|
430
|
+
"basis": "catalog"
|
|
431
|
+
}
|
|
432
|
+
},
|
|
433
|
+
"note": "2 个插件声明依赖,无方法级调用可判。"
|
|
434
|
+
},
|
|
435
|
+
"sessionQuery": {
|
|
436
|
+
"layer": "host",
|
|
437
|
+
"summary": "统一的会话查询服务:优先读实时会话,回退到持久化记录",
|
|
438
|
+
"methods": {
|
|
439
|
+
"listSessions": {
|
|
440
|
+
"severity": "feature-dead",
|
|
441
|
+
"impact": "列不出会话全集 → 历史会话清单、统计与归档扫描全为空",
|
|
442
|
+
"basis": "catalog",
|
|
443
|
+
"evidence": "dsh-recall-plugin/lib/index.js:144"
|
|
444
|
+
},
|
|
445
|
+
"readSession": {
|
|
446
|
+
"severity": "feature-dead",
|
|
447
|
+
"impact": "读不出某个会话的完整事件日志 → 回放/导出/内容分析拿不到数据",
|
|
448
|
+
"basis": "catalog",
|
|
449
|
+
"evidence": "@michengai/dsh-archive-manager/lib/routes-manage.js:381"
|
|
450
|
+
},
|
|
451
|
+
"observeSession": {
|
|
452
|
+
"severity": "feature-dead",
|
|
453
|
+
"impact": "无法实时观察某个会话的事件流 → 实时跟随/预览停在打开时的状态",
|
|
454
|
+
"basis": "catalog",
|
|
455
|
+
"evidence": "@michengai/dsh-archive-manager/lib/snapshots.js:494"
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
},
|
|
459
|
+
"sessionTitle": {
|
|
460
|
+
"layer": "host",
|
|
461
|
+
"summary": "会话标题:日志折叠出标题 + 自动生成的兜底",
|
|
462
|
+
"methods": {
|
|
463
|
+
"rename": {
|
|
464
|
+
"severity": "feature-dead",
|
|
465
|
+
"impact": "写不进用户指定的会话标题:标题会继续由自动生成覆盖(better-sidebar 的侧会话标题钉不住)",
|
|
466
|
+
"basis": "catalog",
|
|
467
|
+
"evidence": "官方目录:rename 追加一条 source=user 的 session/title 事件从而“钉住”标题;调用点 dsh-better-sidebar/lib/index.js:3472"
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
},
|
|
471
|
+
"sessions": {
|
|
472
|
+
"layer": "both",
|
|
473
|
+
"summary": "会话仓库:宿主侧是内存 session store(ctx.sessions),客户端侧是会话引用/作用域的面(同名不同 API)",
|
|
474
|
+
"note": "**同名不同义**:宿主 sessions 有 create/enter/flush/fork/get/list/announce,客户端 sessions 有 binding/scope/search/retain/using。方法级条目已逐条标 layer,判定时必须按调用点所在的那一侧比目录,不能拿宿主方法集去比客户端调用(也不该反过来)。",
|
|
475
|
+
"methods": {
|
|
476
|
+
"get": {
|
|
477
|
+
"severity": "feature-dead",
|
|
478
|
+
"impact": "定位不到会话,插件相关入口点不动",
|
|
479
|
+
"layer": "host"
|
|
480
|
+
},
|
|
481
|
+
"list": {
|
|
482
|
+
"severity": "feature-dead",
|
|
483
|
+
"impact": "会话列表为空",
|
|
484
|
+
"layer": "host"
|
|
485
|
+
},
|
|
486
|
+
"map": {
|
|
487
|
+
"severity": "feature-dead",
|
|
488
|
+
"impact": "同上",
|
|
489
|
+
"layer": "host"
|
|
490
|
+
},
|
|
491
|
+
"open": {
|
|
492
|
+
"severity": "feature-dead",
|
|
493
|
+
"impact": "点击后无法跳转到会话",
|
|
494
|
+
"layer": "client"
|
|
495
|
+
},
|
|
496
|
+
"fork": {
|
|
497
|
+
"severity": "feature-dead",
|
|
498
|
+
"impact": "无法从会话分叉",
|
|
499
|
+
"layer": "host"
|
|
500
|
+
},
|
|
501
|
+
"binding": {
|
|
502
|
+
"severity": "feature-dead",
|
|
503
|
+
"impact": "会话绑定关系读不到",
|
|
504
|
+
"layer": "client"
|
|
505
|
+
},
|
|
506
|
+
"getSnapshot": {
|
|
507
|
+
"severity": "degraded",
|
|
508
|
+
"impact": "拿不到会话快照,相关 UI 显示不全",
|
|
509
|
+
"layer": "client"
|
|
510
|
+
},
|
|
511
|
+
"liveEntryFor": {
|
|
512
|
+
"severity": "feature-dead",
|
|
513
|
+
"impact": "拿不到会话在内存 store 里的条目 → “先定位条目再动手”的操作(归档/摘除)直接失败",
|
|
514
|
+
"layer": "host",
|
|
515
|
+
"basis": "callsite",
|
|
516
|
+
"evidence": "@michengai/dsh-archive-manager/lib/workspace.js:932(紧接 sessions.flush 之后取条目)"
|
|
517
|
+
},
|
|
518
|
+
"detachEntered": {
|
|
519
|
+
"severity": "feature-dead",
|
|
520
|
+
"impact": "无法把已进入 store 的会话摘下来:归档/关闭会话后它仍留在内存 store 里,列表与内存不收敛",
|
|
521
|
+
"layer": "host",
|
|
522
|
+
"basis": "callsite",
|
|
523
|
+
"evidence": "@michengai/dsh-archive-manager/lib/workspace.js:933(官方 enter() 的 description 里对应\"返回 detach disposer\"那一半)"
|
|
524
|
+
},
|
|
525
|
+
"scope": {
|
|
526
|
+
"severity": "feature-dead",
|
|
527
|
+
"impact": "拿不到会话的 Agent 作用域上下文 → 依赖它往会话里写入的操作失败(better-sidebar 只能打印警告、草稿不插入)",
|
|
528
|
+
"layer": "client",
|
|
529
|
+
"basis": "catalog",
|
|
530
|
+
"evidence": "官方客户端目录 sessions.scope(id): AgentContext | undefined;“借用已保留的 Agent 作用域,不延长其生命周期”;调用点 dsh-better-sidebar/lib/client.js:18645"
|
|
531
|
+
},
|
|
532
|
+
"search": {
|
|
533
|
+
"severity": "feature-dead",
|
|
534
|
+
"impact": "会话内容搜索不可用:搜索结果为空或直接报错",
|
|
535
|
+
"layer": "client",
|
|
536
|
+
"basis": "catalog"
|
|
537
|
+
},
|
|
538
|
+
"using": {
|
|
539
|
+
"severity": "degraded",
|
|
540
|
+
"impact": "拿不到“受管引用”通道,插件退回 sessions.binding()(archive-manager 已内置该回退):引用不会被自动释放,能力缩水但仍可用",
|
|
541
|
+
"layer": "client",
|
|
542
|
+
"basis": "callsite",
|
|
543
|
+
"evidence": "@michengai/dsh-archive-manager/lib/client.js(typeof sessions.using === 'function' 不成立时走 sessions.binding)"
|
|
544
|
+
},
|
|
545
|
+
"announce": {
|
|
546
|
+
"severity": "degraded",
|
|
547
|
+
"impact": "宿主不再广播会话变化,插件的会话列表不会自动刷新",
|
|
548
|
+
"basis": "catalog"
|
|
549
|
+
},
|
|
550
|
+
"create": {
|
|
551
|
+
"severity": "feature-dead",
|
|
552
|
+
"impact": "建不了会话,插件无法开启新会话",
|
|
553
|
+
"basis": "catalog"
|
|
554
|
+
},
|
|
555
|
+
"enter": {
|
|
556
|
+
"severity": "feature-dead",
|
|
557
|
+
"impact": "进不去会话,插件的跳转/激活失效",
|
|
558
|
+
"basis": "catalog"
|
|
559
|
+
},
|
|
560
|
+
"flush": {
|
|
561
|
+
"severity": "feature-dead",
|
|
562
|
+
"impact": "会话变更写不下去,重启后这部分内容丢失",
|
|
563
|
+
"basis": "catalog"
|
|
564
|
+
},
|
|
565
|
+
"openSubagent": {
|
|
566
|
+
"severity": "degraded",
|
|
567
|
+
"impact": "开不了子 agent,插件的子任务入口点了没反应",
|
|
568
|
+
"basis": "callsite",
|
|
569
|
+
"evidence": "dsh-better-sidebar/lib/client.js:19817"
|
|
570
|
+
}
|
|
571
|
+
},
|
|
572
|
+
"serviceMissingSeverity": "fatal",
|
|
573
|
+
"serviceMissingNote": "需要 sessions 才能挂载客户端半边的插件(如 dsh-plugin-message-edit)会在客户端直接抛错,等同于整个插件不可用"
|
|
574
|
+
},
|
|
575
|
+
"settings": {
|
|
576
|
+
"layer": "host",
|
|
577
|
+
"summary": "设置文档的读写 seam",
|
|
578
|
+
"note": "同名不同义:客户端设置页走的是客户端 slots/configForms 那一套,与这里的宿主设置文档不是一回事",
|
|
579
|
+
"methods": {
|
|
580
|
+
"register": {
|
|
581
|
+
"severity": "feature-dead",
|
|
582
|
+
"impact": "插件的设置页/设置项会消失",
|
|
583
|
+
"knownGoneIn": [
|
|
584
|
+
"0.2.0-rc.2"
|
|
585
|
+
],
|
|
586
|
+
"note": "0.2.0-rc.2 实际提供 configure/describe/mutate/replace/schema 等"
|
|
587
|
+
},
|
|
588
|
+
"describe": {
|
|
589
|
+
"severity": "feature-dead",
|
|
590
|
+
"impact": "读不到设置项,插件的配置界面空白"
|
|
591
|
+
},
|
|
592
|
+
"update": {
|
|
593
|
+
"severity": "feature-dead",
|
|
594
|
+
"impact": "设置改不动"
|
|
595
|
+
},
|
|
596
|
+
"get": {
|
|
597
|
+
"severity": "feature-dead",
|
|
598
|
+
"impact": "读不到设置值,插件按默认值运行"
|
|
599
|
+
},
|
|
600
|
+
"installSection": {
|
|
601
|
+
"severity": "feature-dead",
|
|
602
|
+
"impact": "走旧版 settings.installSection 通道注册的设置项不会出现(该通道在 0.2.0-rc.2 已被移除,插件需改用 Config 投影)",
|
|
603
|
+
"knownGoneIn": [
|
|
604
|
+
"0.2.0-rc.2"
|
|
605
|
+
],
|
|
606
|
+
"basis": "callsite",
|
|
607
|
+
"evidence": "@nonamelego/dsh-catppuccin/lib/index.js:734(typeof 探测后再调用,且其注释写明该通道对应 DSH <= 0.1.6-alpha.2,0.1.7-alpha.1 起已移除)"
|
|
608
|
+
},
|
|
609
|
+
"configure": {
|
|
610
|
+
"severity": "feature-dead",
|
|
611
|
+
"impact": "设置面配不动,插件的设置页无法初始化",
|
|
612
|
+
"basis": "catalog"
|
|
613
|
+
},
|
|
614
|
+
"replace": {
|
|
615
|
+
"severity": "feature-dead",
|
|
616
|
+
"impact": "整份设置替换不了,插件的配置迁移/重置失效",
|
|
617
|
+
"basis": "catalog"
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
},
|
|
621
|
+
"shell": {
|
|
622
|
+
"layer": "host",
|
|
623
|
+
"summary": "本地命令执行 seam",
|
|
624
|
+
"_note": "这个服务此前**整个没有条目** —— 而 dsh-recall-plugin 的 store.js 在用它跑命令。`run` / `execute` 两种形态并存(插件两个都试),所以两条都要有影响面。",
|
|
625
|
+
"methods": {
|
|
626
|
+
"execute": {
|
|
627
|
+
"severity": "feature-dead",
|
|
628
|
+
"impact": "跑不了命令 —— 插件的本地执行功能整体不可用",
|
|
629
|
+
"basis": "callsite",
|
|
630
|
+
"evidence": "dsh-recall-plugin/lib/store.js:136"
|
|
631
|
+
},
|
|
632
|
+
"resolve": {
|
|
633
|
+
"severity": "degraded",
|
|
634
|
+
"impact": "解析不出命令的可执行路径,插件无法预先校验命令是否存在",
|
|
635
|
+
"basis": "callsite",
|
|
636
|
+
"evidence": "dsh-recall-plugin/lib/store.js:211"
|
|
637
|
+
},
|
|
638
|
+
"run": {
|
|
639
|
+
"severity": "feature-dead",
|
|
640
|
+
"impact": "跑不了命令 —— 插件的本地执行功能整体不可用",
|
|
641
|
+
"basis": "callsite",
|
|
642
|
+
"evidence": "dsh-recall-plugin/lib/store.js:134"
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
},
|
|
646
|
+
"skills": {
|
|
647
|
+
"layer": "host",
|
|
648
|
+
"summary": "skill 提供方注册表:插件把自己的 SKILL.md 挂进会话技能目录,agent 才看得到、调得动",
|
|
649
|
+
"methods": {
|
|
650
|
+
"registerProvider": {
|
|
651
|
+
"severity": "feature-dead",
|
|
652
|
+
"impact": "插件自带的 SKILL.md 不会被会话看见:agent 收不到它的 description,也调不到这个 skill(包里放文件不算数,必须注册)",
|
|
653
|
+
"basis": "catalog",
|
|
654
|
+
"evidence": "官方目录:registerProvider 在插件 apply 期间同步注册一个 provider,dispose 时注销;调用点 @changfenhuang/dsh-genui/lib/index.js:5175"
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
},
|
|
658
|
+
"slots": {
|
|
659
|
+
"layer": "client",
|
|
660
|
+
"summary": "客户端唯一往界面里加东西的通道",
|
|
661
|
+
"methods": {
|
|
662
|
+
"register": {
|
|
663
|
+
"severity": "feature-dead",
|
|
664
|
+
"impact": "插件在界面上的一切都会消失(按钮/标签页/面板)"
|
|
665
|
+
},
|
|
666
|
+
"inject": {
|
|
667
|
+
"severity": "feature-dead",
|
|
668
|
+
"impact": "插件的 UI 注册永远不会执行"
|
|
669
|
+
},
|
|
670
|
+
"entries": {
|
|
671
|
+
"severity": "degraded",
|
|
672
|
+
"impact": "只影响插件自己的内省能力"
|
|
673
|
+
},
|
|
674
|
+
"get": {
|
|
675
|
+
"severity": "degraded",
|
|
676
|
+
"impact": "只影响插件自己的内省能力"
|
|
677
|
+
},
|
|
678
|
+
"set": {
|
|
679
|
+
"severity": "degraded",
|
|
680
|
+
"impact": "只影响插件自己的内省能力"
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
},
|
|
684
|
+
"spillStore": {
|
|
685
|
+
"layer": "host",
|
|
686
|
+
"summary": "溢写存储:把超长内容落盘,返回定位符、精确字节数与检索提示",
|
|
687
|
+
"methods": {},
|
|
688
|
+
"note": "dsh-archive-manager 声明依赖,无方法级调用可判。"
|
|
689
|
+
},
|
|
690
|
+
"storageDomain": {
|
|
691
|
+
"layer": "host",
|
|
692
|
+
"summary": "已挂载的持久化域设施:按路由后端打开声明的域,一个域名字只允许打开一次",
|
|
693
|
+
"methods": {
|
|
694
|
+
"open": {
|
|
695
|
+
"severity": "feature-dead",
|
|
696
|
+
"impact": "打不开持久化域 → 依赖域表(table)的读写全部失败(archive-manager 的投影缓存导入会被整体跳过)",
|
|
697
|
+
"basis": "callsite",
|
|
698
|
+
"evidence": "@michengai/dsh-archive-manager/lib/projcache.js:102(未被 try/catch 之外的守卫包裹)",
|
|
699
|
+
"note": "官方目录声明的是 closeAll/get,没有 open;但官方 description 写的是“Opens declared domains over routed backends”。方法名与目录不一致,故证据等级标 callsite 而不是 catalog。"
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
},
|
|
703
|
+
"subagents": {
|
|
704
|
+
"layer": "host",
|
|
705
|
+
"summary": "子代理提供方注册表 + 继续型子代理(durable child)的启动/观察/中断操作",
|
|
706
|
+
"methods": {
|
|
707
|
+
"list": {
|
|
708
|
+
"severity": "feature-dead",
|
|
709
|
+
"impact": "列不出已注册的子代理提供方:按提供方名字挑选子代理的功能失败,连“可用提供方有哪些”都报不出来",
|
|
710
|
+
"basis": "catalog"
|
|
711
|
+
},
|
|
712
|
+
"getProvider": {
|
|
713
|
+
"severity": "feature-dead",
|
|
714
|
+
"impact": "按名字取不到子代理提供方 → 派生子代理/接管成员直接失败(agent-teams 会抛 no subagent provider)",
|
|
715
|
+
"basis": "catalog",
|
|
716
|
+
"evidence": "@nanmicoder/dsh-agent-teams/lib/members.js:499"
|
|
717
|
+
},
|
|
718
|
+
"startContinuable": {
|
|
719
|
+
"severity": "feature-dead",
|
|
720
|
+
"impact": "派生不出可续跑的子代理(durable child)→ 团队/成员的初始任务起不来",
|
|
721
|
+
"basis": "catalog",
|
|
722
|
+
"evidence": "@nanmicoder/dsh-agent-teams/lib/members.js:514"
|
|
723
|
+
},
|
|
724
|
+
"interrupt": {
|
|
725
|
+
"severity": "feature-dead",
|
|
726
|
+
"impact": "停不掉正在跑的继续型子代理:中断不生效,它会继续跑完当前回合",
|
|
727
|
+
"basis": "catalog",
|
|
728
|
+
"evidence": "@nanmicoder/dsh-agent-teams/lib/members.js:582"
|
|
729
|
+
},
|
|
730
|
+
"listDescendants": {
|
|
731
|
+
"severity": "feature-dead",
|
|
732
|
+
"impact": "列不出子代理的后代树 → 子代理拓扑/层级视图为空(better-sidebar 的子代理页返回 503)",
|
|
733
|
+
"basis": "catalog",
|
|
734
|
+
"evidence": "dsh-better-sidebar/lib/index.js:2950"
|
|
735
|
+
},
|
|
736
|
+
"drainContinuableChildren": {
|
|
737
|
+
"severity": "feature-dead",
|
|
738
|
+
"impact": "无法强制回收常驻子代理 → 一个团队被停止后成员仍可能继续执行:只能取消当前模型回合,不能关闭准入并清空排队任务",
|
|
739
|
+
"basis": "catalog",
|
|
740
|
+
"evidence": "@nanmicoder/dsh-agent-teams/lib/tools.js:193"
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
},
|
|
744
|
+
"subprocess": {
|
|
745
|
+
"layer": "host",
|
|
746
|
+
"summary": "子进程",
|
|
747
|
+
"methods": {
|
|
748
|
+
"spawn": {
|
|
749
|
+
"severity": "feature-dead",
|
|
750
|
+
"impact": "插件无法执行外部命令"
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
},
|
|
754
|
+
"systemPrompt": {
|
|
755
|
+
"layer": "host",
|
|
756
|
+
"summary": "系统提示词贡献",
|
|
757
|
+
"methods": {
|
|
758
|
+
"section": {
|
|
759
|
+
"severity": "feature-dead",
|
|
760
|
+
"impact": "插件注入的提示词消失,agent 行为随之退化"
|
|
761
|
+
},
|
|
762
|
+
"getSectionOrder": {
|
|
763
|
+
"severity": "degraded",
|
|
764
|
+
"impact": "段落顺序控制失效"
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
},
|
|
768
|
+
"theme": {
|
|
769
|
+
"layer": "client",
|
|
770
|
+
"summary": "客户端主题",
|
|
771
|
+
"methods": {
|
|
772
|
+
"getTheme": {
|
|
773
|
+
"severity": "degraded",
|
|
774
|
+
"impact": "读不到当前主题,配色可能不同步"
|
|
775
|
+
},
|
|
776
|
+
"setTheme": {
|
|
777
|
+
"severity": "feature-dead",
|
|
778
|
+
"impact": "主题切换按钮点了没反应"
|
|
779
|
+
},
|
|
780
|
+
"register": {
|
|
781
|
+
"severity": "feature-dead",
|
|
782
|
+
"impact": "第三方主题注册不上:主题选择列表里没有它,配色插件(如 dsh-catppuccin)等于没装",
|
|
783
|
+
"basis": "catalog"
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
},
|
|
787
|
+
"timer": {
|
|
788
|
+
"layer": "both",
|
|
789
|
+
"summary": "可随 fiber 释放的定时器助手(宿主与客户端都有同名服务,**签名不同**)",
|
|
790
|
+
"note": "宿主 overload 是 timeout(delay): Promise<void>;客户端 overload 是 timeout(callback, delay): () => void。同名不同签名,判定时要按调用点所在的那一侧看。",
|
|
791
|
+
"methods": {
|
|
792
|
+
"timeout": {
|
|
793
|
+
"severity": "degraded",
|
|
794
|
+
"impact": "定时/延时逻辑失效,插件退回原生 setTimeout(recall 已内置该回退):功能仍在,但定时器不再随插件卸载自动清理",
|
|
795
|
+
"layer": "both",
|
|
796
|
+
"basis": "callsite",
|
|
797
|
+
"evidence": "dsh-recall-plugin/lib/client.js:1430(typeof timer.timeout === 'function' 不成立即用 setTimeout,属客户端 overload)"
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
},
|
|
801
|
+
"tools": {
|
|
802
|
+
"layer": "host",
|
|
803
|
+
"summary": "向 agent 注册工具",
|
|
804
|
+
"note": "usage-inventory 里的 tools.filter / tools.join / tools.push 是数组方法的误报,见 knownExtractionArtifacts",
|
|
805
|
+
"methods": {
|
|
806
|
+
"register": {
|
|
807
|
+
"severity": "feature-dead",
|
|
808
|
+
"impact": "agent 失去该工具,相关能力在对话里完全不可用"
|
|
809
|
+
},
|
|
810
|
+
"get": {
|
|
811
|
+
"severity": "degraded",
|
|
812
|
+
"impact": "只影响插件对工具清单的内省"
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
},
|
|
816
|
+
"typert": {
|
|
817
|
+
"layer": "host",
|
|
818
|
+
"summary": "类型化调用的注册表:生成的 schema、包反射、调用端点与远程依赖提供方",
|
|
819
|
+
"methods": {
|
|
820
|
+
"register": {
|
|
821
|
+
"severity": "feature-dead",
|
|
822
|
+
"impact": "注册不了插件自己的 schema/远程调用端点 → 依赖它的跨进程(Remote)调用不可用(archive-manager 会直接抛 typert is unavailable)",
|
|
823
|
+
"basis": "catalog",
|
|
824
|
+
"evidence": "@michengai/dsh-archive-manager/lib/workspace.js:255、:264(后者在缺失时直接抛错)"
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
},
|
|
828
|
+
"uiWorkspace": {
|
|
829
|
+
"layer": "client",
|
|
830
|
+
"summary": "客户端的会话/工作区跳转与目录操作(打开会话、打开工作区、列目录、归档会话等)",
|
|
831
|
+
"methods": {
|
|
832
|
+
"openSession": {
|
|
833
|
+
"severity": "feature-dead",
|
|
834
|
+
"impact": "跳不过去:无法把某个会话切到前台显示(git-graph 建完 worktree 后跳到新会话的动作失效)",
|
|
835
|
+
"basis": "catalog",
|
|
836
|
+
"evidence": "@linxin666/dsh-client-ui-git-graph/lib/client.js:1933"
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
},
|
|
840
|
+
"webServer": {
|
|
841
|
+
"layer": "host",
|
|
842
|
+
"summary": "宿主侧 HTTP 路由",
|
|
843
|
+
"methods": {
|
|
844
|
+
"register": {
|
|
845
|
+
"severity": "feature-dead",
|
|
846
|
+
"impact": "插件自己的 HTTP 接口(含其前端资源)全部 404"
|
|
847
|
+
},
|
|
848
|
+
"registerUpgrade": {
|
|
849
|
+
"severity": "feature-dead",
|
|
850
|
+
"impact": "插件的 WebSocket 通道建不起来"
|
|
851
|
+
},
|
|
852
|
+
"tapIndex": {
|
|
853
|
+
"severity": "degraded",
|
|
854
|
+
"impact": "读不到首页 HTML,插件的首页改写不生效",
|
|
855
|
+
"basis": "catalog"
|
|
856
|
+
}
|
|
857
|
+
}
|
|
858
|
+
},
|
|
859
|
+
"workspaceRegistry": {
|
|
860
|
+
"layer": "host",
|
|
861
|
+
"summary": "工作区注册表",
|
|
862
|
+
"methods": {
|
|
863
|
+
"list": {
|
|
864
|
+
"severity": "feature-dead",
|
|
865
|
+
"impact": "工作区列表为空"
|
|
866
|
+
},
|
|
867
|
+
"create": {
|
|
868
|
+
"severity": "feature-dead",
|
|
869
|
+
"impact": "无法新建工作区"
|
|
870
|
+
},
|
|
871
|
+
"delete": {
|
|
872
|
+
"severity": "feature-dead",
|
|
873
|
+
"impact": "无法删除工作区"
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
},
|
|
877
|
+
"workspaces": {
|
|
878
|
+
"layer": "client",
|
|
879
|
+
"summary": "客户端的工作区注册项管理(注册/改名/删除工作区、归档会话)",
|
|
880
|
+
"methods": {
|
|
881
|
+
"create": {
|
|
882
|
+
"severity": "feature-dead",
|
|
883
|
+
"impact": "注册不了新工作区(git-graph 从 worktree 建工作区那一步失败,整个流程会回滚并删掉刚建的 worktree)",
|
|
884
|
+
"basis": "catalog",
|
|
885
|
+
"evidence": "@linxin666/dsh-client-ui-git-graph/lib/client.js:1931"
|
|
886
|
+
},
|
|
887
|
+
"delete": {
|
|
888
|
+
"severity": "feature-dead",
|
|
889
|
+
"impact": "删不掉工作区注册项:它会一直留在工作区列表里,只能手动清理",
|
|
890
|
+
"basis": "catalog"
|
|
891
|
+
}
|
|
892
|
+
}
|
|
893
|
+
}
|
|
894
|
+
},
|
|
895
|
+
"declarationChecks": {
|
|
896
|
+
"engines.dsh": {
|
|
897
|
+
"missing": "插件没有声明 DSH 版本范围——闸门不会拦,但也没有任何兼容保证",
|
|
898
|
+
"mismatch": "声明的范围不覆盖当前 DSH 版本,却被装上了(通常是被 allow-version 强装)"
|
|
899
|
+
},
|
|
900
|
+
"dsh.compatibility.dshReleases": {
|
|
901
|
+
"mismatch": "声明当前版本 compatible,但实测存在失效项——这是本工具相对既有方案最不可替代的结论",
|
|
902
|
+
"missing": "插件没有逐版本声明,只能依赖实测"
|
|
903
|
+
}
|
|
904
|
+
},
|
|
905
|
+
"knownExtractionArtifacts": {
|
|
906
|
+
"_note": "**不要为这些补规则。** 它们是正则提取的产物,不是 DSH API。为它们填影响面等于把假阳性升格成“看起来确定”的结论,会毁掉本工具唯一的资产。真源是 rules/usage-inventory.json 与 lib/extract.mjs 的输出。",
|
|
907
|
+
"_evidenceBase": "desktop profile,node lib/extract.mjs ~/.dsh/profiles/desktop/node_modules(2026-10-10,DSH 0.2.0-rc.2)",
|
|
908
|
+
"items": [
|
|
909
|
+
{
|
|
910
|
+
"service": "parser",
|
|
911
|
+
"methods": "全部 40 个(consume/subparse/rule/...)",
|
|
912
|
+
"why": "vendored 代码里的同名局部变量:这个是 markdown 解析器的 parser 上下文,不是宿主服务",
|
|
913
|
+
"evidence": "dsh-better-sidebar/lib/client-mermaid.js"
|
|
914
|
+
},
|
|
915
|
+
{
|
|
916
|
+
"service": "ruleNames",
|
|
917
|
+
"methods": [
|
|
918
|
+
"get",
|
|
919
|
+
"has",
|
|
920
|
+
"set"
|
|
921
|
+
],
|
|
922
|
+
"why": "同上,vendored markdown 解析器内部对象",
|
|
923
|
+
"evidence": "dsh-better-sidebar/lib/client-mermaid.js"
|
|
924
|
+
},
|
|
925
|
+
{
|
|
926
|
+
"service": "topoIndex",
|
|
927
|
+
"methods": [
|
|
928
|
+
"get",
|
|
929
|
+
"set"
|
|
930
|
+
],
|
|
931
|
+
"why": "vendored 代码里的局部变量",
|
|
932
|
+
"evidence": "dsh-better-sidebar/lib/client-mermaid.js"
|
|
933
|
+
},
|
|
934
|
+
{
|
|
935
|
+
"service": "settings",
|
|
936
|
+
"methods": [
|
|
937
|
+
"isTrusted",
|
|
938
|
+
"reportNonstrict",
|
|
939
|
+
"useStrictBehavior"
|
|
940
|
+
],
|
|
941
|
+
"why": "KaTeX 的 parser.settings API(vendored 的数学公式渲染代码),与 DSH 的 settings 服务无关",
|
|
942
|
+
"evidence": "dsh-better-sidebar/lib/client-mermaid.js、katex/dist/katex.js"
|
|
943
|
+
},
|
|
944
|
+
{
|
|
945
|
+
"service": "settings",
|
|
946
|
+
"methods": [
|
|
947
|
+
"settingsGet",
|
|
948
|
+
"externalDisable"
|
|
949
|
+
],
|
|
950
|
+
"why": "better-sidebar 自己声明的设置面(lib/types/index.d.ts 里的 SidebarSettingsFace 声明了 get/externalDisable/update),不是 DSH settings 服务的方法",
|
|
951
|
+
"evidence": "dsh-better-sidebar/lib/types/index.d.ts:45"
|
|
952
|
+
},
|
|
953
|
+
{
|
|
954
|
+
"service": "agents",
|
|
955
|
+
"methods": [
|
|
956
|
+
"listDescendants"
|
|
957
|
+
],
|
|
958
|
+
"why": "alias 正则漏了词边界:源码里是 subagents.listDescendants,前缀词 subagents 里的 “agents.” 被当成 agents 服务的调用",
|
|
959
|
+
"evidence": "dsh-better-sidebar/lib/index.js:2950 与 :3238 的原文是 await subagents.listDescendants(...);desktop profile 上共 2 处"
|
|
960
|
+
},
|
|
961
|
+
{
|
|
962
|
+
"service": "jobs",
|
|
963
|
+
"methods": [
|
|
964
|
+
"closeTab",
|
|
965
|
+
"fileIcon",
|
|
966
|
+
"folderIcon",
|
|
967
|
+
"getFileViewers",
|
|
968
|
+
"getTab",
|
|
969
|
+
"getTabs",
|
|
970
|
+
"isTabEnabled",
|
|
971
|
+
"openTab",
|
|
972
|
+
"registerFileViewer",
|
|
973
|
+
"registerTab",
|
|
974
|
+
"setSurface",
|
|
975
|
+
"updateTab",
|
|
976
|
+
"subscribe"
|
|
977
|
+
],
|
|
978
|
+
"why": "同文件内别名撞名:`const service = ctx.get(\"jobs\")` 与 6 处 `const service = ctx.get(\"betterSidebar\")` 共用变量名 service,于是文件里所有 `service.X()`(**包括 JSDoc 注释里的**)被同时算到 jobs 头上。这些其实是 betterSidebar 的标签页 API",
|
|
979
|
+
"evidence": "dsh-better-sidebar/lib/client.js:977 是注释里的 `service.getTabs()`;真正属于宿主/客户端 jobs 的只有 watchRows/observe/kill 这几个"
|
|
980
|
+
},
|
|
981
|
+
{
|
|
982
|
+
"service": "locale",
|
|
983
|
+
"methods": [
|
|
984
|
+
"startsWith"
|
|
985
|
+
],
|
|
986
|
+
"why": "字符串方法",
|
|
987
|
+
"evidence": "usage-inventory.json"
|
|
988
|
+
},
|
|
989
|
+
{
|
|
990
|
+
"service": "tools",
|
|
991
|
+
"methods": [
|
|
992
|
+
"filter",
|
|
993
|
+
"join",
|
|
994
|
+
"push"
|
|
995
|
+
],
|
|
996
|
+
"why": "数组方法",
|
|
997
|
+
"evidence": "usage-inventory.json"
|
|
998
|
+
},
|
|
999
|
+
{
|
|
1000
|
+
"service": "sessions",
|
|
1001
|
+
"methods": [
|
|
1002
|
+
"map",
|
|
1003
|
+
"filter",
|
|
1004
|
+
"reduce",
|
|
1005
|
+
"some",
|
|
1006
|
+
"sort",
|
|
1007
|
+
"slice",
|
|
1008
|
+
"values",
|
|
1009
|
+
"has",
|
|
1010
|
+
"set",
|
|
1011
|
+
"findIndex",
|
|
1012
|
+
"delete"
|
|
1013
|
+
],
|
|
1014
|
+
"why": "数组/集合方法,被当成 sessions 服务的方法",
|
|
1015
|
+
"evidence": "usage-inventory.json"
|
|
1016
|
+
},
|
|
1017
|
+
{
|
|
1018
|
+
"service": "sessions",
|
|
1019
|
+
"methods": [
|
|
1020
|
+
"has",
|
|
1021
|
+
"set",
|
|
1022
|
+
"values",
|
|
1023
|
+
"sort",
|
|
1024
|
+
"reduce"
|
|
1025
|
+
],
|
|
1026
|
+
"why": "集合方法名。实测 `dsh-recall-plugin/lib/client.js` 里 `ws.sessions` 是**那个对象的 Map 字段**(同处还有 views.delete / navigationRevisions.delete),`sessions.has/set/values/sort/reduce` 全来自它。另外 `this.ctx.sessions` 是**真服务**,所以只排这几个方法、不排整个服务。",
|
|
1027
|
+
"evidence": "dsh-recall-plugin/lib/client.js:800,801,804,807,2425(`ws.sessions.*`)"
|
|
1028
|
+
}
|
|
1029
|
+
]
|
|
1030
|
+
},
|
|
1031
|
+
"needsReview": {
|
|
1032
|
+
"_note": "既有条目里**看起来可疑、但本轮没有改**的项。改它们会改变输出,按 Plan.md §4 第 3 条应先摊开差异再由人决定,所以这里只登记证据。",
|
|
1033
|
+
"items": [
|
|
1034
|
+
{
|
|
1035
|
+
"entry": "sessions.open / sessions.getSnapshot",
|
|
1036
|
+
"problem": "宿主与客户端两个官方目录里都没有这两个方法。客户端侧真正的跳转入口是 uiWorkspace.openSession,archive-manager 也是把它当回退用的。",
|
|
1037
|
+
"evidence": "@michengai/dsh-archive-manager/lib/client.js(typeof openSession === 'function' ? openSession : N.sessions.open)"
|
|
1038
|
+
},
|
|
1039
|
+
{
|
|
1040
|
+
"entry": "sessions.refresh",
|
|
1041
|
+
"problem": "两个官方目录都没有它(客户端目录里有的是 refreshProjections)。无法判断是旧版 API 还是误报,故不补规则。",
|
|
1042
|
+
"evidence": "@michengai/dsh-archive-manager/lib/client.js(typeof 守卫后调用)"
|
|
1043
|
+
},
|
|
1044
|
+
{
|
|
1045
|
+
"entry": "settings.get",
|
|
1046
|
+
"problem": "0.2.0-rc.2 的宿主目录里 settings 没有 get(只有 configure/describe/mutate/prepareDocument/replace/update)。它可能和 settingsGet/externalDisable 一样来自插件自有的设置面。",
|
|
1047
|
+
"evidence": "rules/dsh-api-catalog.json 的 host.settings.methods"
|
|
1048
|
+
},
|
|
1049
|
+
{
|
|
1050
|
+
"entry": "attachments.readImage",
|
|
1051
|
+
"problem": "宿主目录里是 readImageRequest,没有 readImage。条目本身写得通顺(“无法读取图片附件”),但方法名对不上,需要一次运行时探针来确认到底哪个是真的。",
|
|
1052
|
+
"evidence": "rules/dsh-api-catalog.json 的 host.attachments.methods"
|
|
1053
|
+
}
|
|
1054
|
+
]
|
|
1055
|
+
}
|
|
1056
|
+
}
|