dsh-plugin-manager-companion 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/LICENSE +21 -0
- package/README.en.md +144 -0
- package/README.md +142 -0
- package/cordis.patch.yml +9 -0
- package/dist/about.d.ts +77 -0
- package/dist/about.js +179 -0
- package/dist/cli.d.ts +226 -0
- package/dist/cli.js +856 -0
- package/dist/client/AboutPage.d.ts +75 -0
- package/dist/client/ConsolePage.d.ts +79 -0
- package/dist/client/KindsPage.d.ts +21 -0
- package/dist/client/MarketplacePage.d.ts +36 -0
- package/dist/client/OfficialSlots.d.ts +35 -0
- package/dist/client/UpgradeRow.d.ts +108 -0
- package/dist/client/index.d.ts +26 -0
- package/dist/client/locales.d.ts +475 -0
- package/dist/client/pmSelect.d.ts +38 -0
- package/dist/client/shared.d.ts +928 -0
- package/dist/client/upgradeView.d.ts +278 -0
- package/dist/client/wire.d.ts +401 -0
- package/dist/client.js +9194 -0
- package/dist/diagnostics.d.ts +332 -0
- package/dist/diagnostics.js +2631 -0
- package/dist/envManager.d.ts +1047 -0
- package/dist/envManager.js +3214 -0
- package/dist/fix.d.ts +60 -0
- package/dist/fix.js +168 -0
- package/dist/guard.d.ts +133 -0
- package/dist/guard.js +232 -0
- package/dist/index.d.ts +121 -0
- package/dist/index.js +1150 -0
- package/dist/installSession.d.ts +111 -0
- package/dist/installSession.js +150 -0
- package/dist/kinds.d.ts +464 -0
- package/dist/kinds.js +1029 -0
- package/dist/marketView.d.ts +261 -0
- package/dist/marketView.js +406 -0
- package/dist/marketplace.d.ts +248 -0
- package/dist/marketplace.js +500 -0
- package/dist/match.d.ts +67 -0
- package/dist/match.js +203 -0
- package/dist/net.d.ts +108 -0
- package/dist/net.js +163 -0
- package/dist/official.d.ts +145 -0
- package/dist/official.js +205 -0
- package/dist/paths.d.ts +108 -0
- package/dist/paths.js +236 -0
- package/dist/presets.d.ts +299 -0
- package/dist/presets.js +578 -0
- package/dist/qualityGate.d.ts +66 -0
- package/dist/qualityGate.js +247 -0
- package/dist/rank.d.ts +88 -0
- package/dist/rank.js +164 -0
- package/dist/registry.d.ts +295 -0
- package/dist/registry.js +686 -0
- package/dist/rest.d.ts +122 -0
- package/dist/rest.js +219 -0
- package/dist/scan.d.ts +134 -0
- package/dist/scan.js +396 -0
- package/dist/settings.d.ts +447 -0
- package/dist/settings.js +263 -0
- package/dist/tags.d.ts +119 -0
- package/dist/tags.js +166 -0
- package/dist/tools.d.ts +131 -0
- package/dist/tools.js +377 -0
- package/dist/types.d.ts +651 -0
- package/dist/types.js +13 -0
- package/dist/upgrade.d.ts +428 -0
- package/dist/upgrade.js +1100 -0
- package/dist/upgradeView.d.ts +313 -0
- package/dist/upgradeView.js +273 -0
- package/docs/images/readme/01-console-health.png +0 -0
- package/docs/images/readme/02-console-envs.png +0 -0
- package/docs/images/readme/03-marketplace.png +0 -0
- package/docs/images/readme/04-official-plugin-page.png +0 -0
- package/package.json +104 -0
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 本插件的配置面。
|
|
3
|
+
*
|
|
4
|
+
* 归属:A 类·重写(新代码;旧仓库把配置散在 profile 文件与 market 缓存里)。
|
|
5
|
+
* 官方复用:ctx.settings(SettingsProvider)—— 注册一个命名空间,由官方负责
|
|
6
|
+
* 校验、落盘、修订号与观察。
|
|
7
|
+
* 前提检查:用户明确要求"无需手动编辑配置文件"。官方 settings 服务正是这条
|
|
8
|
+
* 要求的原生实现;自己写 YAML 既违背要求也与官方并发写同一文件。
|
|
9
|
+
*
|
|
10
|
+
* 配置只描述**本插件自己的行为**,绝不描述环境状态:环境状态是事实,读出来
|
|
11
|
+
* 即可,不该由用户配置。
|
|
12
|
+
*/
|
|
13
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
14
|
+
import z from '@deepseek-ai/schemastery';
|
|
15
|
+
/** 本插件在官方 settings 里的命名空间(小写连字符,官方校验)。 */
|
|
16
|
+
export declare const SETTINGS_NAMESPACE = "plugin-manager-companion";
|
|
17
|
+
/**
|
|
18
|
+
* 诊断深度。用户要求"最大化利用能力,但同时保证不出错",所以深度是**可选**的:
|
|
19
|
+
* 环境不支持某一层时,该层自动跳过并在报告里标注,而不是让整次诊断失败。
|
|
20
|
+
*/
|
|
21
|
+
export interface DiagnosticsConfig {
|
|
22
|
+
/** 依赖层(静态扫描 import 图)。 */
|
|
23
|
+
readonly dependency: boolean;
|
|
24
|
+
/** 组合层(patch 层栈与行 id)。 */
|
|
25
|
+
readonly composition: boolean;
|
|
26
|
+
/** 运行时层(loader fiber 相位、注册表冲突)。需要 Loader 服务。 */
|
|
27
|
+
readonly runtime: boolean;
|
|
28
|
+
/** 一致性层(官方 inventory 与本地文件对照)。 */
|
|
29
|
+
readonly consistency: boolean;
|
|
30
|
+
/** 生态层(市场索引的更新与风险)。需要网络。 */
|
|
31
|
+
readonly ecosystem: boolean;
|
|
32
|
+
}
|
|
33
|
+
/** 安装前质量门的配置。 */
|
|
34
|
+
export interface QualityGateConfig {
|
|
35
|
+
/** 是否在安装前扫描。关闭后安装直接交给官方,不做前置校验。 */
|
|
36
|
+
readonly enabled: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* 拦截强度。
|
|
39
|
+
* - `block`:发现问题即回滚(默认)
|
|
40
|
+
* - `warn`:只报告,仍完成安装
|
|
41
|
+
*/
|
|
42
|
+
readonly mode: 'block' | 'warn';
|
|
43
|
+
/**
|
|
44
|
+
* 豁免的包名。用于质量门误伤的第三方包(其依赖声明方式超出规则能表达的
|
|
45
|
+
* 范围)。加进来即跳过全部检查——这是用户显式承担风险的选择。
|
|
46
|
+
*/
|
|
47
|
+
readonly allowlist: readonly string[];
|
|
48
|
+
}
|
|
49
|
+
/** 市场配置。 */
|
|
50
|
+
export interface MarketplaceConfig {
|
|
51
|
+
/** 是否在设置页与市场页启用远程索引。关闭后市场页只显示已安装信息。 */
|
|
52
|
+
readonly enabled: boolean;
|
|
53
|
+
/** 索引缓存有效期(分钟)。 */
|
|
54
|
+
readonly cacheTtlMinutes: number;
|
|
55
|
+
/** 网络请求超时(毫秒)。 */
|
|
56
|
+
readonly timeoutMs: number;
|
|
57
|
+
/**
|
|
58
|
+
* 上游索引地址。默认取社区维护的 topic:dsh-plugin 全量索引。
|
|
59
|
+
* 留空表示只用内置默认源。
|
|
60
|
+
*/
|
|
61
|
+
readonly indexUrl: string;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 试装(质量门第二步,DESIGN §5.2/§5.3)的配置。
|
|
65
|
+
*
|
|
66
|
+
* 这一段的字段全部描述"点一下安装会发生什么",因为试装会在**用户机器上真实执行第三方代码**:
|
|
67
|
+
* 默认关闭,且开启后设置页必须如实告知(事实见 TRIAL_DISCLOSURE)。
|
|
68
|
+
*/
|
|
69
|
+
export interface TrialConfig {
|
|
70
|
+
/**
|
|
71
|
+
* 试装总开关。**默认关**。
|
|
72
|
+
*
|
|
73
|
+
* 打开后的后果(设置页必须原样告知用户,不要自己另写一套):
|
|
74
|
+
* · 每次安装都会先把候选包**真实安装**进一个测试环境(`<环境名>-dpmc`)并**执行它自带的安装脚本**
|
|
75
|
+
* (带 `postinstall` 的包会在你的机器上真的跑);
|
|
76
|
+
* · 一次验证启动的内存峰值约 **161 MiB**(maxrss 实测,口径见 TRIAL_DISCLOSURE.measurement);
|
|
77
|
+
* · 一轮试装约 0.65 秒(冷 store 且需联网下载候选包时约 2.3 秒);
|
|
78
|
+
* · 会在磁盘上多出一个测试环境目录(删掉它即可回收,设置页显示总占地)。
|
|
79
|
+
*
|
|
80
|
+
* 关闭时安装走的是原来的路径(静态快筛 + 官方通道),不产生任何额外进程与目录。
|
|
81
|
+
*/
|
|
82
|
+
readonly enabled: boolean;
|
|
83
|
+
/**
|
|
84
|
+
* 快照深度。
|
|
85
|
+
* · `auto`(默认):先建**浅快照**(只复制清单文件);只有基线**明确挂载失败**才升级为完整快照
|
|
86
|
+
* 重试一次,两次都起不来才说"基线本身有问题"。
|
|
87
|
+
* · `shallow`:只用浅快照。给不起完整快照的机器用(省一次官方 install),代价是层栈不全时
|
|
88
|
+
* 会把"快照缺依赖"误报成"基线起不来"。
|
|
89
|
+
* · `full`:每次试装都跑一次官方 `install --prefer-offline` 物化真实快照(约 59ms 热 / 831ms 冷),
|
|
90
|
+
* 最保真,也最慢。
|
|
91
|
+
*
|
|
92
|
+
* 用户看到的后果:这一项只影响结论的**可信度**与耗时;无论哪种深度,结论里都会写明"实际用了哪种"。
|
|
93
|
+
*/
|
|
94
|
+
readonly depth: 'auto' | 'shallow' | 'full';
|
|
95
|
+
/**
|
|
96
|
+
* 试装前做一次基线启动(DESIGN §5.2 四步的②)。**默认开**。
|
|
97
|
+
*
|
|
98
|
+
* 关掉的后果:省约 558ms,但失败时**说不出是谁的问题**——只能看到"装完后起不来",
|
|
99
|
+
* 无法区分"环境本来就起不来"与"候选包把它弄坏了"。结论会如实降级为"无法试装",而不是通过。
|
|
100
|
+
*/
|
|
101
|
+
readonly baseline: boolean;
|
|
102
|
+
/**
|
|
103
|
+
* 允许联网拉取候选包。**默认开**。
|
|
104
|
+
*
|
|
105
|
+
* 关掉的后果:只用本地 pnpm store,冷包(store 里没有)直接判"无法试装"——如实说明,**不假装通过**。
|
|
106
|
+
* 适合离线机器:代价是没下过的包永远试装不了。
|
|
107
|
+
*/
|
|
108
|
+
readonly allowNetwork: boolean;
|
|
109
|
+
/**
|
|
110
|
+
* 试装未通过(候选包导致挂载失败 / 基线起不来 / 无法试装)时的行为。
|
|
111
|
+
* · `block`(默认):**不安装**——回滚候选包并给出原因链,用户看不到半装状态;
|
|
112
|
+
* · `warn`:照常安装,但结果里带着试装结论(用户自己决定要不要留着)。
|
|
113
|
+
*
|
|
114
|
+
* 两种模式都**不会**把"无法试装"当成通过:`warn` 下装是装了,结论字段照样写"无法试装(不算通过)"。
|
|
115
|
+
*/
|
|
116
|
+
readonly onFailure: 'block' | 'warn';
|
|
117
|
+
/**
|
|
118
|
+
* 自动清理测试环境。**默认开**。开启后,每次试装结束时按 {@link TrialConfig.retentionDays}
|
|
119
|
+
* 清理**已过期**的测试环境(正在运行的永远不删),并在 `<DSH_HOME>/dpmc-trial-cleanup.log` 记账。
|
|
120
|
+
*
|
|
121
|
+
* 关掉的后果:测试环境只增不减,需要用户自己在环境列表里删(每个测试环境都可单独删除)。
|
|
122
|
+
* 无论开关如何,"一键清理过期"这个显式动作都可以用。
|
|
123
|
+
*/
|
|
124
|
+
readonly autoCleanup: boolean;
|
|
125
|
+
/**
|
|
126
|
+
* 测试环境保留天数(默认 14)。只对自动清理与"一键清理"生效。
|
|
127
|
+
*
|
|
128
|
+
* 用户看到的后果:测试环境超过这个天数没被用过就会被自动删除;改大=留得更久、占更多盘,
|
|
129
|
+
* 改小=清理更早。正在运行的测试环境不受影响(删除一律先拒,让用户自己决定停不停)。
|
|
130
|
+
*/
|
|
131
|
+
readonly retentionDays: number;
|
|
132
|
+
/**
|
|
133
|
+
* 最多保留的测试环境数;**0 = 不限(默认)**。
|
|
134
|
+
*
|
|
135
|
+
* 为什么用 0 而不是 null:settings 的 schema 里可空字段不会回填默认值(实测:值会变成
|
|
136
|
+
* undefined),这种"看不见的洞"比一个显式的 0 糟得多。
|
|
137
|
+
*
|
|
138
|
+
* 用户看到的后果:设成 N 后,若测试环境已经有 N 个(不含本次要用的那一个),试装会**拒绝执行**
|
|
139
|
+
* 并告诉你"先清理"——它**不会**为了腾位而偷偷删掉任何一个测试环境(删除只在两处发生:
|
|
140
|
+
* 你自己点删除,或超过保留期的自动清理)。这正是"不设硬上限"的意思。
|
|
141
|
+
*/
|
|
142
|
+
readonly maxKept: number;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* 升级(档三)的配置:**检查时机**与 registry 地址。
|
|
146
|
+
*
|
|
147
|
+
* 检查时机刻意不做后台轮询(官方没有这类钩子,自己挂定时器会让插件在宿主里留一个永不退出的句柄):
|
|
148
|
+
* "每天一次"的语义是"下次进入时若距上次成功检查超过 24h 就查"。
|
|
149
|
+
*/
|
|
150
|
+
export interface UpgradeConfig {
|
|
151
|
+
/**
|
|
152
|
+
* 自动检查更新。**默认开**。
|
|
153
|
+
*
|
|
154
|
+
* 关掉的后果:进入关于页不再自动出网;手动检查按钮照常可用(它不受开关与 TTL 限制)。
|
|
155
|
+
*/
|
|
156
|
+
readonly autoCheck: boolean;
|
|
157
|
+
/**
|
|
158
|
+
* 检查间隔:`session`(每次打开)/ `6h` / `daily`(默认)/ `manual`(仅手动)。
|
|
159
|
+
*
|
|
160
|
+
* 用户看到的后果:间隔越大越少出网、越省时间;代价是"最近发布了新版本"可能晚一点才看到。
|
|
161
|
+
* 检查失败也会记时间戳(1 小时内不自动重试),免得每次进入都等一次超时——手动按钮不受影响。
|
|
162
|
+
*/
|
|
163
|
+
readonly interval: 'session' | '6h' | 'daily' | 'manual';
|
|
164
|
+
/**
|
|
165
|
+
* npm registry 地址(默认官方 registry,可填镜像)。
|
|
166
|
+
*
|
|
167
|
+
* 用户看到的后果:填镜像后版本查询走镜像;镜像不可用一律显示"查不到",
|
|
168
|
+
* **不会**显示成"已是最新"(这两个是不同状态)。
|
|
169
|
+
*/
|
|
170
|
+
readonly registryUrl: string;
|
|
171
|
+
}
|
|
172
|
+
/** 本插件的完整配置。 */
|
|
173
|
+
export interface CompanionConfig {
|
|
174
|
+
readonly diagnostics: DiagnosticsConfig;
|
|
175
|
+
readonly qualityGate: QualityGateConfig;
|
|
176
|
+
readonly marketplace: MarketplaceConfig;
|
|
177
|
+
/**
|
|
178
|
+
* 试装配置。
|
|
179
|
+
*
|
|
180
|
+
* 为什么是**可选**字段(而不是像其他三段那样必填):客户端(src/client)镜像这份配置的形状,
|
|
181
|
+
* 它按自己的节奏新增字段;把这里写成必填会让"宿主加了字段"直接变成客户端编译失败(跨任务互锁)。
|
|
182
|
+
* 读配置的人因此**必须**走 effectiveTrialConfig()——它保证缺字段时拿到的是安全默认值,
|
|
183
|
+
* 而不是 undefined。运行期这份配置永远由 ConfigSchema 补齐(schema 里带 .default)。
|
|
184
|
+
*/
|
|
185
|
+
readonly trial?: TrialConfig;
|
|
186
|
+
/**
|
|
187
|
+
* 升级配置。与 trial 同为**可选**字段(客户端镜像是按自己的节奏补齐的);
|
|
188
|
+
* 读配置一律走 effectiveUpgradeConfig(),缺字段时拿到的是安全默认值。
|
|
189
|
+
*/
|
|
190
|
+
readonly upgrade?: UpgradeConfig;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* 试装配置的默认值。
|
|
194
|
+
*
|
|
195
|
+
* 单独一份(而不是只有 DEFAULT_CONFIG.trial):CompanionConfig.trial 是可选字段,
|
|
196
|
+
* 类型上它可能是 undefined;读配置的人都该拿这一份,不该拿"可能是 undefined 的默认值"。
|
|
197
|
+
*/
|
|
198
|
+
export declare const DEFAULT_TRIAL_CONFIG: TrialConfig;
|
|
199
|
+
/** 升级配置的默认值(单独一份:CompanionConfig.upgrade 是可选字段)。 */
|
|
200
|
+
export declare const DEFAULT_UPGRADE_CONFIG: UpgradeConfig;
|
|
201
|
+
/** 默认配置:诊断全开、质量门拦截、市场启用、试装关闭、升级检查每天一次。 */
|
|
202
|
+
export declare const DEFAULT_CONFIG: CompanionConfig;
|
|
203
|
+
/**
|
|
204
|
+
* 开启试装前必须让用户看到的事实(DESIGN §5.2 的"显式开启 + 明确告知")。
|
|
205
|
+
*
|
|
206
|
+
* 为什么是机器可读的常量而不是写死在文案里:这两个数字是本机实测的**口径事实**
|
|
207
|
+
* (内存 161 MiB / 会执行第三方安装脚本),文案由 UI 任务落地,但数字不能各自抄一份——
|
|
208
|
+
* 抄一份就会在下次实测后漂移,而漂移的是"用户以为自己承担了什么风险"。
|
|
209
|
+
*/
|
|
210
|
+
export interface TrialDisclosure {
|
|
211
|
+
/** 是否会真的安装候选包并执行它的安装脚本(带 postinstall 的包会真的跑)。恒为 true。 */
|
|
212
|
+
readonly executesCandidateCode: true;
|
|
213
|
+
/** 一次验证启动的实测内存峰值(MiB,maxrss 口径)。 */
|
|
214
|
+
readonly peakMemoryMiB: number;
|
|
215
|
+
/** 上面这个数字的测量口径(UI 引用数字时必须一起给出,否则数字没有意义)。 */
|
|
216
|
+
readonly measurement: string;
|
|
217
|
+
}
|
|
218
|
+
/** 试装的告知事实(口径:Linux x64 / Node 24 / DSH 0.1.6-alpha.2,headless 验证启动)。 */
|
|
219
|
+
export declare const TRIAL_DISCLOSURE: TrialDisclosure;
|
|
220
|
+
/**
|
|
221
|
+
* 官方 settings 的 schema。
|
|
222
|
+
*
|
|
223
|
+
* `.default()` 逐项给出,使旧配置文件在新增字段后仍能解析;未知字段由
|
|
224
|
+
* schemastery 丢弃,不会因为未来删字段而炸掉整份配置。
|
|
225
|
+
*/
|
|
226
|
+
export declare const ConfigSchema: z<Schemastery.ObjectS<{
|
|
227
|
+
diagnostics: z<Schemastery.ObjectS<{
|
|
228
|
+
dependency: z<boolean, boolean>;
|
|
229
|
+
composition: z<boolean, boolean>;
|
|
230
|
+
runtime: z<boolean, boolean>;
|
|
231
|
+
consistency: z<boolean, boolean>;
|
|
232
|
+
ecosystem: z<boolean, boolean>;
|
|
233
|
+
}>, Schemastery.ObjectT<{
|
|
234
|
+
dependency: z<boolean, boolean>;
|
|
235
|
+
composition: z<boolean, boolean>;
|
|
236
|
+
runtime: z<boolean, boolean>;
|
|
237
|
+
consistency: z<boolean, boolean>;
|
|
238
|
+
ecosystem: z<boolean, boolean>;
|
|
239
|
+
}>>;
|
|
240
|
+
qualityGate: z<Schemastery.ObjectS<{
|
|
241
|
+
enabled: z<boolean, boolean>;
|
|
242
|
+
mode: z<"block" | "warn", "block" | "warn">;
|
|
243
|
+
allowlist: z<string[], string[]>;
|
|
244
|
+
}>, Schemastery.ObjectT<{
|
|
245
|
+
enabled: z<boolean, boolean>;
|
|
246
|
+
mode: z<"block" | "warn", "block" | "warn">;
|
|
247
|
+
allowlist: z<string[], string[]>;
|
|
248
|
+
}>>;
|
|
249
|
+
marketplace: z<Schemastery.ObjectS<{
|
|
250
|
+
enabled: z<boolean, boolean>;
|
|
251
|
+
cacheTtlMinutes: z<number, number>;
|
|
252
|
+
timeoutMs: z<number, number>;
|
|
253
|
+
indexUrl: z<string, string>;
|
|
254
|
+
}>, Schemastery.ObjectT<{
|
|
255
|
+
enabled: z<boolean, boolean>;
|
|
256
|
+
cacheTtlMinutes: z<number, number>;
|
|
257
|
+
timeoutMs: z<number, number>;
|
|
258
|
+
indexUrl: z<string, string>;
|
|
259
|
+
}>>;
|
|
260
|
+
trial: z<Schemastery.ObjectS<{
|
|
261
|
+
enabled: z<boolean, boolean>;
|
|
262
|
+
depth: z<"auto" | "shallow" | "full", "auto" | "shallow" | "full">;
|
|
263
|
+
baseline: z<boolean, boolean>;
|
|
264
|
+
allowNetwork: z<boolean, boolean>;
|
|
265
|
+
onFailure: z<"block" | "warn", "block" | "warn">;
|
|
266
|
+
autoCleanup: z<boolean, boolean>;
|
|
267
|
+
retentionDays: z<number, number>;
|
|
268
|
+
maxKept: z<number, number>;
|
|
269
|
+
}>, Schemastery.ObjectT<{
|
|
270
|
+
enabled: z<boolean, boolean>;
|
|
271
|
+
depth: z<"auto" | "shallow" | "full", "auto" | "shallow" | "full">;
|
|
272
|
+
baseline: z<boolean, boolean>;
|
|
273
|
+
allowNetwork: z<boolean, boolean>;
|
|
274
|
+
onFailure: z<"block" | "warn", "block" | "warn">;
|
|
275
|
+
autoCleanup: z<boolean, boolean>;
|
|
276
|
+
retentionDays: z<number, number>;
|
|
277
|
+
maxKept: z<number, number>;
|
|
278
|
+
}>>;
|
|
279
|
+
upgrade: z<Schemastery.ObjectS<{
|
|
280
|
+
autoCheck: z<boolean, boolean>;
|
|
281
|
+
interval: z<"session" | "6h" | "daily" | "manual", "session" | "6h" | "daily" | "manual">;
|
|
282
|
+
registryUrl: z<string, string>;
|
|
283
|
+
}>, Schemastery.ObjectT<{
|
|
284
|
+
autoCheck: z<boolean, boolean>;
|
|
285
|
+
interval: z<"session" | "6h" | "daily" | "manual", "session" | "6h" | "daily" | "manual">;
|
|
286
|
+
registryUrl: z<string, string>;
|
|
287
|
+
}>>;
|
|
288
|
+
}>, Schemastery.ObjectT<{
|
|
289
|
+
diagnostics: z<Schemastery.ObjectS<{
|
|
290
|
+
dependency: z<boolean, boolean>;
|
|
291
|
+
composition: z<boolean, boolean>;
|
|
292
|
+
runtime: z<boolean, boolean>;
|
|
293
|
+
consistency: z<boolean, boolean>;
|
|
294
|
+
ecosystem: z<boolean, boolean>;
|
|
295
|
+
}>, Schemastery.ObjectT<{
|
|
296
|
+
dependency: z<boolean, boolean>;
|
|
297
|
+
composition: z<boolean, boolean>;
|
|
298
|
+
runtime: z<boolean, boolean>;
|
|
299
|
+
consistency: z<boolean, boolean>;
|
|
300
|
+
ecosystem: z<boolean, boolean>;
|
|
301
|
+
}>>;
|
|
302
|
+
qualityGate: z<Schemastery.ObjectS<{
|
|
303
|
+
enabled: z<boolean, boolean>;
|
|
304
|
+
mode: z<"block" | "warn", "block" | "warn">;
|
|
305
|
+
allowlist: z<string[], string[]>;
|
|
306
|
+
}>, Schemastery.ObjectT<{
|
|
307
|
+
enabled: z<boolean, boolean>;
|
|
308
|
+
mode: z<"block" | "warn", "block" | "warn">;
|
|
309
|
+
allowlist: z<string[], string[]>;
|
|
310
|
+
}>>;
|
|
311
|
+
marketplace: z<Schemastery.ObjectS<{
|
|
312
|
+
enabled: z<boolean, boolean>;
|
|
313
|
+
cacheTtlMinutes: z<number, number>;
|
|
314
|
+
timeoutMs: z<number, number>;
|
|
315
|
+
indexUrl: z<string, string>;
|
|
316
|
+
}>, Schemastery.ObjectT<{
|
|
317
|
+
enabled: z<boolean, boolean>;
|
|
318
|
+
cacheTtlMinutes: z<number, number>;
|
|
319
|
+
timeoutMs: z<number, number>;
|
|
320
|
+
indexUrl: z<string, string>;
|
|
321
|
+
}>>;
|
|
322
|
+
trial: z<Schemastery.ObjectS<{
|
|
323
|
+
enabled: z<boolean, boolean>;
|
|
324
|
+
depth: z<"auto" | "shallow" | "full", "auto" | "shallow" | "full">;
|
|
325
|
+
baseline: z<boolean, boolean>;
|
|
326
|
+
allowNetwork: z<boolean, boolean>;
|
|
327
|
+
onFailure: z<"block" | "warn", "block" | "warn">;
|
|
328
|
+
autoCleanup: z<boolean, boolean>;
|
|
329
|
+
retentionDays: z<number, number>;
|
|
330
|
+
maxKept: z<number, number>;
|
|
331
|
+
}>, Schemastery.ObjectT<{
|
|
332
|
+
enabled: z<boolean, boolean>;
|
|
333
|
+
depth: z<"auto" | "shallow" | "full", "auto" | "shallow" | "full">;
|
|
334
|
+
baseline: z<boolean, boolean>;
|
|
335
|
+
allowNetwork: z<boolean, boolean>;
|
|
336
|
+
onFailure: z<"block" | "warn", "block" | "warn">;
|
|
337
|
+
autoCleanup: z<boolean, boolean>;
|
|
338
|
+
retentionDays: z<number, number>;
|
|
339
|
+
maxKept: z<number, number>;
|
|
340
|
+
}>>;
|
|
341
|
+
upgrade: z<Schemastery.ObjectS<{
|
|
342
|
+
autoCheck: z<boolean, boolean>;
|
|
343
|
+
interval: z<"session" | "6h" | "daily" | "manual", "session" | "6h" | "daily" | "manual">;
|
|
344
|
+
registryUrl: z<string, string>;
|
|
345
|
+
}>, Schemastery.ObjectT<{
|
|
346
|
+
autoCheck: z<boolean, boolean>;
|
|
347
|
+
interval: z<"session" | "6h" | "daily" | "manual", "session" | "6h" | "daily" | "manual">;
|
|
348
|
+
registryUrl: z<string, string>;
|
|
349
|
+
}>>;
|
|
350
|
+
}>>;
|
|
351
|
+
/**
|
|
352
|
+
* 读试装配置:缺字段、字段类型不对、越界一律回落到默认值。
|
|
353
|
+
*
|
|
354
|
+
* 为什么需要它(不是多此一举):schema 的默认值只在"官方 settings 解析过这份配置"时成立。
|
|
355
|
+
* 事实是配置对象还会从别处来——测试与工具自己拼的 CompanionConfig 字面量、以及未来
|
|
356
|
+
* schemastery 行为变化(本文件里 maxKept 那条注释就是一个实测例子)。试装是**会写磁盘、会起进程**
|
|
357
|
+
* 的动作,任何一个字段读到 undefined 都必须变成"用安全默认值",不能变成"意外地开启/强制浅快照"。
|
|
358
|
+
*
|
|
359
|
+
* @param config - 任意形状的配置片段。
|
|
360
|
+
* @returns 补齐后的试装配置(全部字段都有确定值)。
|
|
361
|
+
*/
|
|
362
|
+
export declare function effectiveTrialConfig(config: {
|
|
363
|
+
readonly trial?: Partial<TrialConfig> | undefined;
|
|
364
|
+
} | undefined): TrialConfig;
|
|
365
|
+
/** 配置的读写句柄。 */
|
|
366
|
+
export interface ConfigHandle {
|
|
367
|
+
/** 当前生效配置(官方已解析默认值与用户层)。 */
|
|
368
|
+
current(): CompanionConfig;
|
|
369
|
+
/** 观察配置提交;返回取消订阅函数。 */
|
|
370
|
+
watch(listener: (next: CompanionConfig) => void): () => void;
|
|
371
|
+
/**
|
|
372
|
+
* 合并写入一个局部配置,由官方 settings 服务负责校验与落盘。
|
|
373
|
+
*
|
|
374
|
+
* 不提供"重置为默认"以外的整段替换:局部合并足以表达界面上所有开关,
|
|
375
|
+
* 而整段替换会让界面漏掉一个字段就把它打回默认值。
|
|
376
|
+
*
|
|
377
|
+
* @param patch - 局部配置。
|
|
378
|
+
* @returns 写入完成后的生效配置。
|
|
379
|
+
*/
|
|
380
|
+
update(patch: Partial<CompanionConfig>): Promise<CompanionConfig>;
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* 检查间隔对应的毫秒数;`null` = 仅手动(永不自动检查)。
|
|
384
|
+
*
|
|
385
|
+
* 纯函数、单一事实来源:引擎与界面用它算"要不要查",避免两处各写一份间隔表而漂移。
|
|
386
|
+
*
|
|
387
|
+
* @param interval - 配置里的间隔。
|
|
388
|
+
* @returns 毫秒;仅手动时为 null。
|
|
389
|
+
*/
|
|
390
|
+
export declare function upgradeIntervalMs(interval: UpgradeConfig['interval']): number | null;
|
|
391
|
+
/**
|
|
392
|
+
* 读升级配置:缺字段、类型不对一律回落默认值(与 effectiveTrialConfig 同一纪律:
|
|
393
|
+
* schema 的默认值只在官方 settings 解析过那份配置时成立;这两个字段决定要不要出网)。
|
|
394
|
+
*
|
|
395
|
+
* @param config - 任意形状的配置片段。
|
|
396
|
+
* @returns 补齐后的升级配置。
|
|
397
|
+
*/
|
|
398
|
+
export declare function effectiveUpgradeConfig(config: {
|
|
399
|
+
readonly upgrade?: Partial<UpgradeConfig> | undefined;
|
|
400
|
+
} | undefined): UpgradeConfig;
|
|
401
|
+
/**
|
|
402
|
+
* 本插件配置面的当前状态(给 capabilities 用,让"配置不可写"对用户可见)。
|
|
403
|
+
*/
|
|
404
|
+
export interface ConfigState {
|
|
405
|
+
/** 配置是否可以写入(false = 正在用只读的默认配置)。 */
|
|
406
|
+
readonly writable: boolean;
|
|
407
|
+
/** 不可写的稳定原因码;可写时为 null。 */
|
|
408
|
+
readonly reason: 'settings-missing' | 'namespace-conflict' | null;
|
|
409
|
+
/** 面向用户的一句话;可写时为 null。 */
|
|
410
|
+
readonly detail: string | null;
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* 配置面的当前状态。
|
|
414
|
+
*
|
|
415
|
+
* 为什么是模块级:装配层用 ctx.inject(['settings'], …) 在 settings 就绪时才注册,
|
|
416
|
+
* 命名空间冲突发生在那个回调里;而这件事实必须能被 probeOfficialCapabilities 读到、
|
|
417
|
+
* 进而出现在用户可见的 capabilities 里(不能只在日志里)。
|
|
418
|
+
*
|
|
419
|
+
* @returns 当前配置面状态。
|
|
420
|
+
*/
|
|
421
|
+
export declare function configState(): ConfigState;
|
|
422
|
+
/**
|
|
423
|
+
* 官方 settings 服务尚不可用时的**只读**降级句柄。
|
|
424
|
+
*
|
|
425
|
+
* 为什么需要它:settings 服务可能**晚于**本插件装配(服务挂载顺序不保证),
|
|
426
|
+
* 而配置句柄会被各模块长期持有。装配层先拿这个,等服务出现再换成真句柄。
|
|
427
|
+
*
|
|
428
|
+
* `update` 刻意**抛错**而不是静默返回默认值——静默丢写是最糟的失败形态:
|
|
429
|
+
* 用户改了配置、界面回显成功、实际什么都没发生(实测踩过,见 CONTEXT.md)。
|
|
430
|
+
*
|
|
431
|
+
* @returns 只读句柄;任何写入尝试都抛出可读错误。
|
|
432
|
+
*/
|
|
433
|
+
export declare function fallbackConfigHandle(): ConfigHandle;
|
|
434
|
+
/**
|
|
435
|
+
* 注册本插件的 settings 命名空间。
|
|
436
|
+
*
|
|
437
|
+
* 官方 `register` 在命名空间已被占用时**抛错**。这里的立场是"任何宿主都能加载、
|
|
438
|
+
* 缺能力就如实降级":冲突时退回只读的默认配置句柄,并把事实登记给 capabilities,
|
|
439
|
+
* 而不是让整个插件装配失败(那会让用户看到一个装不上、也没有可读原因的插件)。
|
|
440
|
+
*
|
|
441
|
+
* 不静默:降级句柄的 `update` 照旧**抛错**而不是丢写入,且 configState() 会让
|
|
442
|
+
* capabilities.missing 里出现一条"配置不可写"的说明。
|
|
443
|
+
*
|
|
444
|
+
* @param ctx - 本插件的 host 上下文。
|
|
445
|
+
* @returns 配置句柄;settings 不可用或命名空间冲突时返回只读的默认配置句柄。
|
|
446
|
+
*/
|
|
447
|
+
export declare function registerConfig(ctx: Context): ConfigHandle;
|