@aalis/runtime 0.15.1 → 0.16.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.
Files changed (55) hide show
  1. package/README.md +11 -2
  2. package/dist/config-store.d.ts +49 -12
  3. package/dist/config-store.d.ts.map +1 -1
  4. package/dist/config-store.js +415 -56
  5. package/dist/config-store.js.map +1 -1
  6. package/dist/config-sync.d.ts +19 -8
  7. package/dist/config-sync.d.ts.map +1 -1
  8. package/dist/config-sync.js +76 -33
  9. package/dist/config-sync.js.map +1 -1
  10. package/dist/console-sink.d.ts +1 -1
  11. package/dist/file-logger.d.ts +4 -4
  12. package/dist/file-logger.d.ts.map +1 -1
  13. package/dist/file-logger.js +6 -5
  14. package/dist/file-logger.js.map +1 -1
  15. package/dist/home.d.ts +64 -0
  16. package/dist/home.d.ts.map +1 -0
  17. package/dist/home.js +229 -0
  18. package/dist/home.js.map +1 -0
  19. package/dist/host-logs.d.ts +9 -0
  20. package/dist/host-logs.d.ts.map +1 -0
  21. package/dist/host-logs.js +104 -0
  22. package/dist/host-logs.js.map +1 -0
  23. package/dist/index.d.ts +5 -3
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +7 -4
  26. package/dist/index.js.map +1 -1
  27. package/dist/instance-lock.d.ts +56 -0
  28. package/dist/instance-lock.d.ts.map +1 -0
  29. package/dist/instance-lock.js +281 -0
  30. package/dist/instance-lock.js.map +1 -0
  31. package/dist/node-modules-loader.d.ts +2 -2
  32. package/dist/node-modules-loader.d.ts.map +1 -1
  33. package/dist/node-modules-loader.js +8 -4
  34. package/dist/node-modules-loader.js.map +1 -1
  35. package/dist/plugin-discovery.d.ts +9 -4
  36. package/dist/plugin-discovery.d.ts.map +1 -1
  37. package/dist/plugin-discovery.js +28 -16
  38. package/dist/plugin-discovery.js.map +1 -1
  39. package/dist/providers.d.ts +38 -13
  40. package/dist/providers.d.ts.map +1 -1
  41. package/dist/providers.js +91 -218
  42. package/dist/providers.js.map +1 -1
  43. package/dist/secrets.d.ts +44 -0
  44. package/dist/secrets.d.ts.map +1 -0
  45. package/dist/secrets.js +104 -0
  46. package/dist/secrets.js.map +1 -0
  47. package/dist/start.d.ts +19 -12
  48. package/dist/start.d.ts.map +1 -1
  49. package/dist/start.js +166 -43
  50. package/dist/start.js.map +1 -1
  51. package/dist/yaml-file.d.ts +35 -0
  52. package/dist/yaml-file.d.ts.map +1 -0
  53. package/dist/yaml-file.js +213 -0
  54. package/dist/yaml-file.js.map +1 -0
  55. package/package.json +13 -7
@@ -1,14 +1,22 @@
1
1
  // ============================================================
2
- // config-store —— 宿主配置文档(内存态 + 危险键闸 + 落盘委托)与 host-config 服务
2
+ // config-store —— 宿主配置文档(内存态 + 危险键闸 + 落盘委托)、密钥存储与 host-config 服务
3
3
  //
4
4
  // 运行态(实例配置、禁用态、服务偏好)在 core;本模块持「下次启动用什么」的文档:
5
- // - 启动:宿主从文档取每个实例的配置与禁用标记交给 app.pluginAll,偏好经根绑定 services.prefer 应用;
6
- // - 运行:管理动作只改运行态,要跨重启保留的调用方经 host-config 自己写文档并 save()。
7
- // 本模块不碰文件(无 node: import):持久化与外部变更监听由注入的 ConfigProvider 完成。
5
+ // - 启动:宿主从文档取每个实例的配置(解析密钥引用后)与禁用标记交给 app.pluginAll,偏好(全局与本插件)经根绑定
6
+ // services.prefer 应用,热重载时按改动前后的文档对账;
7
+ // - 运行:改插件配置经 host-config 的 applyPluginConfig 一步完成;启停、偏好等管理动作只改运行态,
8
+ // 要跨重启保留的调用方经 host-config 自己写文档并 save()。
9
+ // 文档是文档形态:schema 里 `secret: true` 的字段只放引用 `{ $secret: '<键>' }`,值在密钥存储里(见 secrets.ts)。
10
+ // 本模块不碰文件:持久化与外部变更监听由注入的 provider 完成。
8
11
  // ============================================================
9
- import { hostConfig, isConfigSaveRefused } from '@aalis/api-host-config';
10
- import { events, provide, services } from '@aalis/core';
11
- import { CORE_CONFIG_SCHEMA, cloneConfigObject, defaultsFrom, isUnsafeConfigKey } from '@aalis/schema-config';
12
+ import { isDeepStrictEqual } from 'node:util';
13
+ import { doctor } from '@aalis/api-doctor';
14
+ import { hostConfig, isConfigSaveRefused, } from '@aalis/api-host-config';
15
+ import { parseInstanceId, provide, services, } from '@aalis/core';
16
+ import { CORE_CONFIG_SCHEMA, cloneConfigObject, defaultsFrom, isUnsafeConfigKey, } from '@aalis/schema-config';
17
+ import { configToReload } from './config-sync.js';
18
+ import { moduleDefinitionOf } from './plugin-discovery.js';
19
+ import { describeDangling, plainSecretPaths, referencedKeys, resolveSecrets, splitSecrets, } from './secrets.js';
12
20
  /**
13
21
  * 插件 id 不得当 `plugins` / 禁用名单的对象键——那三条会落到原型链。
14
22
  * 按 id 取放的入口共用这一抛错,文案给 WebUI 映射 400。
@@ -17,11 +25,35 @@ function assertSafePluginId(id) {
17
25
  if (isUnsafeConfigKey(id))
18
26
  throw new Error(`插件 id 不合法: ${id}`);
19
27
  }
20
- export function createConfigStore(initial, provider) {
28
+ /**
29
+ * @param secrets 宿主的密钥存储;不给时没有密钥存储(嵌入式宿主、只在内存里的配置),密钥照旧以明文留在文档里
30
+ */
31
+ export function createConfigStore(initial, provider, secrets) {
32
+ // 配置会落盘、密钥却不能:引用写进文件,值只在内存里,重启后全部落空
33
+ if (secrets && !secrets.provider?.save && provider?.save) {
34
+ throw new Error('配置文档会落盘、密钥存储却不能保存:引用会在重启后落空。给密钥存储一个能保存的 provider,或者不给密钥存储');
35
+ }
21
36
  let config = normalize(initial);
22
- let unwatchFn = null;
37
+ // 配置文件上的那一份(最后读入或写出的):密钥文件拒写之后按文件对账时,文档退回这一份
38
+ let fileDoc = snapshot(config);
39
+ let values = secretMap(secrets?.values ?? {});
40
+ // 已提交、还没写进密钥文件的值:密钥文件在这期间被外部改动重新读入时并进新内容,文档里的引用可能正指着它们
41
+ const pending = new Map();
42
+ // 密钥文件拒写过:下一次密钥文件变更按文件对账,不再并进 pending(见 watch)。refusedGen 是拒写的代数:
43
+ // 写成的那次保存只在它写盘期间没有新的拒写时清标志,并发的另一次保存被拒时标志留着
44
+ let secretsRefused = false;
45
+ let refusedGen = 0;
46
+ // 宿主经自己的写入换掉、删掉或新建的键:文档落盘之后,不再被任何配置引用的就从密钥存储里删掉。
47
+ // 手改配置文件不经这里,不触发删除;手加进 secrets.yaml 还没被引用的键也不在其中
48
+ const orphanCandidates = new Set();
49
+ const unwatchFns = [];
23
50
  let onChangeCallback = null;
51
+ const markReplaced = (instanceId) => {
52
+ if (Object.hasOwn(config.plugins, instanceId))
53
+ referencedKeys(config.plugins[instanceId], orphanCandidates);
54
+ };
24
55
  const store = {
56
+ hasSecretStore: secrets !== undefined,
25
57
  get: key => config[key],
26
58
  getAll: () => config,
27
59
  set: (key, value) => {
@@ -33,11 +65,13 @@ export function createConfigStore(initial, provider) {
33
65
  },
34
66
  setPluginConfig(instanceId, next) {
35
67
  assertSafePluginId(instanceId);
68
+ markReplaced(instanceId);
36
69
  // 值也过闸:外来对象(WebUI 请求体、工具参数)里 JSON 解出的 __proto__ 等键不进文档,调用方之后改它也写不穿
37
70
  config.plugins[instanceId] = cloneConfigObject(next);
38
71
  },
39
72
  removePluginConfig(instanceId) {
40
73
  assertSafePluginId(instanceId);
74
+ markReplaced(instanceId);
41
75
  delete config.plugins[instanceId];
42
76
  },
43
77
  isPluginDisabled(instanceId) {
@@ -53,87 +87,408 @@ export function createConfigStore(initial, provider) {
53
87
  else if (!enabled && idx < 0)
54
88
  config.disabledPlugins.push(instanceId);
55
89
  },
56
- getServicePreferences: () => config.servicePreferences ?? {},
57
- setServicePreference(name, contextId) {
90
+ getServicePreferences: scope => preferencesIn(config, scope) ?? {},
91
+ setServicePreference(name, contextId, scope) {
58
92
  if (isUnsafeConfigKey(name))
59
93
  return;
60
- config.servicePreferences ??= {};
61
- config.servicePreferences[name] = contextId;
94
+ let prefs = preferencesIn(config, scope);
95
+ if (!prefs) {
96
+ prefs = {};
97
+ if (scope?.for === undefined)
98
+ config.servicePreferences = prefs;
99
+ else
100
+ config.pluginServicePreferences = { ...config.pluginServicePreferences, [scope.for]: prefs };
101
+ }
102
+ prefs[name] = contextId;
62
103
  },
63
- removeServicePreference(name) {
64
- if (!config.servicePreferences || isUnsafeConfigKey(name))
104
+ removeServicePreference(name, scope) {
105
+ const prefs = preferencesIn(config, scope);
106
+ if (!prefs || isUnsafeConfigKey(name))
65
107
  return;
66
- delete config.servicePreferences[name];
108
+ delete prefs[name];
109
+ // 本插件偏好删空了就整段去掉,文件里不留空段
110
+ if (scope?.for !== undefined && Object.keys(prefs).length === 0)
111
+ delete config.pluginServicePreferences?.[scope.for];
67
112
  },
68
- // async:同步 provider 的抛错也以拒绝传出,调用方统一经 Promise 接住
113
+ resolvePluginConfig(instanceId, schema, doc, staged) {
114
+ const source = doc ?? store.getPluginConfig(instanceId);
115
+ return resolveSecrets(schema, source, key => {
116
+ if (staged?.has(key))
117
+ return { value: staged.get(key) };
118
+ return values.has(key) ? { value: values.get(key) } : undefined;
119
+ });
120
+ },
121
+ splitPluginSecrets(instanceId, schema, submitted, base) {
122
+ if (!secrets)
123
+ return { doc: submitted, writes: new Map(), placed: [] };
124
+ const inUse = referencedKeys(config.plugins);
125
+ referencedKeys(submitted, inUse);
126
+ return splitSecrets(schema, instanceId, submitted, base ?? store.getPluginConfig(instanceId), key => {
127
+ return inUse.has(key) || values.has(key);
128
+ });
129
+ },
130
+ commitSecrets(writes) {
131
+ if (writes.size === 0)
132
+ return () => { };
133
+ const before = new Map();
134
+ for (const [key, value] of writes) {
135
+ before.set(key, {
136
+ stored: values.has(key) ? { value: values.get(key) } : undefined,
137
+ pending: pending.has(key) ? { value: pending.get(key) } : undefined,
138
+ });
139
+ values.set(key, value);
140
+ pending.set(key, value);
141
+ // 新写入的键同样是候选:落盘时还有人引用就留着,没人引用了(文件对账回退、被后来的写入顶掉)就删
142
+ orphanCandidates.add(key);
143
+ }
144
+ return () => {
145
+ for (const [key, prev] of before) {
146
+ if (prev.stored)
147
+ values.set(key, prev.stored.value);
148
+ else
149
+ values.delete(key);
150
+ if (prev.pending)
151
+ pending.set(key, prev.pending.value);
152
+ else
153
+ pending.delete(key);
154
+ }
155
+ };
156
+ },
157
+ // async:同步 provider 的抛错也以拒绝传出,调用方统一经 Promise 接住。
158
+ // 先写密钥再写文档:文档里的引用落盘时,它指向的键已经在盘上
69
159
  persist: async () => {
160
+ const secretProvider = secrets?.provider;
161
+ if (pending.size > 0 && secretProvider?.save) {
162
+ // 写盘途中可能有新的提交:写成后只清掉这次写出去、之后没再改过的
163
+ const flushing = new Map(pending);
164
+ const gen = refusedGen;
165
+ try {
166
+ await secretProvider.save(Object.fromEntries(values));
167
+ }
168
+ catch (err) {
169
+ if (isConfigSaveRefused(err)) {
170
+ refusedGen++;
171
+ secretsRefused = true;
172
+ }
173
+ throw err;
174
+ }
175
+ // 写成了:盘上已是内存里的内容,不必再按文件对账(文件被原样改回后保存就会走到这里)
176
+ if (refusedGen === gen)
177
+ secretsRefused = false;
178
+ for (const [key, value] of flushing)
179
+ if (pending.get(key) === value)
180
+ pending.delete(key);
181
+ }
70
182
  if (!provider?.save)
71
183
  return false;
184
+ // 写出的这一份在交给 provider 时定格:落盘途中文档可能又被改过
185
+ const written = snapshot(config);
72
186
  await provider.save(config);
187
+ fileDoc = written;
188
+ // 孤儿键在文档写成之后删:没写成时盘上的旧文档可能还引用着它们。主配置已经写成,这一步写密钥失败
189
+ // 不让保存报错,删掉的键放回去,下次保存再删
190
+ if (orphanCandidates.size > 0 && secretProvider?.save) {
191
+ const onDisk = referencedKeys(written.plugins);
192
+ const live = referencedKeys(config.plugins);
193
+ const removed = new Map();
194
+ for (const key of orphanCandidates) {
195
+ // 刚写出的文档与内存文档对它的引用不一致(落盘途中才去掉或才引用的):留作候选,下次落盘后再判
196
+ if (onDisk.has(key) !== live.has(key))
197
+ continue;
198
+ orphanCandidates.delete(key);
199
+ if (live.has(key) || !values.has(key))
200
+ continue;
201
+ removed.set(key, values.get(key));
202
+ values.delete(key);
203
+ }
204
+ if (removed.size > 0) {
205
+ try {
206
+ await secretProvider.save(Object.fromEntries(values));
207
+ }
208
+ catch {
209
+ for (const [key, value] of removed) {
210
+ values.set(key, value);
211
+ orphanCandidates.add(key);
212
+ }
213
+ }
214
+ }
215
+ }
73
216
  return true;
74
217
  },
75
218
  watch(onChange) {
76
219
  if (onChangeCallback)
77
220
  throw new Error('配置变更只支持一个订阅者,先 unwatch 再订阅');
78
221
  onChangeCallback = onChange;
79
- unwatchFn =
80
- provider?.watch?.(next => {
81
- config = normalize(next);
82
- onChangeCallback?.();
83
- }) ?? null;
222
+ const configWatch = provider?.watch?.(next => {
223
+ const previous = config;
224
+ config = normalize(next);
225
+ fileDoc = snapshot(config);
226
+ onChangeCallback?.(previous);
227
+ });
228
+ if (configWatch)
229
+ unwatchFns.push(configWatch);
230
+ const secretsWatch = secrets?.provider?.watch?.(next => {
231
+ const previous = config;
232
+ values = secretMap(next);
233
+ if (secretsRefused) {
234
+ // 拒写之后的这次变更按文件对账,同主配置拒写:没写成的密钥作废,与它们一起改的文档退回配置文件上那一份。
235
+ // 配置不落盘的宿主没有那一份,文档不动
236
+ secretsRefused = false;
237
+ pending.clear();
238
+ if (provider?.save)
239
+ config = snapshot(fileDoc);
240
+ }
241
+ else {
242
+ for (const [key, value] of pending)
243
+ values.set(key, value);
244
+ }
245
+ onChangeCallback?.(previous);
246
+ });
247
+ if (secretsWatch)
248
+ unwatchFns.push(secretsWatch);
84
249
  return () => store.unwatch();
85
250
  },
86
251
  unwatch() {
87
- unwatchFn?.();
88
- unwatchFn = null;
252
+ for (const fn of unwatchFns.splice(0))
253
+ fn();
89
254
  onChangeCallback = null;
90
255
  },
91
256
  };
92
257
  return store;
93
258
  }
94
259
  /**
95
- * 把文档接到 App:以 host-config 服务独占登记在根激活上,应用文档里的服务偏好,
96
- * 并在服务上线时记录它有无用户偏好。须在注册任何插件之前调用,偏好才先于全部提供者生效。
260
+ * 实例的定义:已登记的取它自己的;没登记的后缀实例取同模块在册实例的(见 moduleDefinitionOf),模块需声明 reusable
261
+ */
262
+ function definitionOf(app, instanceId) {
263
+ const own = app.plugins.getPlugin(instanceId)?.definition;
264
+ if (own)
265
+ return own;
266
+ const { moduleName, suffix } = parseInstanceId(instanceId);
267
+ if (!suffix)
268
+ return undefined;
269
+ const found = moduleDefinitionOf(app, moduleName);
270
+ return found?.reusable ? found : undefined;
271
+ }
272
+ /**
273
+ * 文档里引用了 `keys` 中任一键的已登记实例,按解析后的新值重载(解析结果与运行态相同的不动)。
274
+ * 改了被共用的密钥之后,共用它的实例跟着换上新值。
275
+ */
276
+ async function reloadSecretSharers(app, store, keys, except) {
277
+ if (keys.size === 0)
278
+ return;
279
+ for (const status of app.plugins.getStatus()) {
280
+ if (status.instanceId === except)
281
+ continue;
282
+ const refs = referencedKeys(store.getPluginConfig(status.instanceId));
283
+ if (![...keys].some(key => refs.has(key)))
284
+ continue;
285
+ const next = configToReload(app, store, status.instanceId, '共用的密钥已更改');
286
+ if (next)
287
+ await app.plugins.updateConfig(status.instanceId, next);
288
+ }
289
+ }
290
+ /**
291
+ * 把文档接到 App:以 host-config 服务独占登记在根激活上,应用文档里的服务偏好。
292
+ * 须在注册任何插件之前调用,偏好才先于全部提供者生效。
97
293
  * `opts` 传交给配置同步(withPluginConfigSync / installConfigHotReload)的同一份:host-config 的
98
294
  * `trimUnknownFields` 据此声明宿主的裁剪政策(缺省与配置同步一样按裁剪)。
99
295
  */
100
296
  export function installHostConfig(app, store, opts) {
101
- const host = app.bind({ events, provide, services });
102
- const { persist, watch: _watch, unwatch: _unwatch, ...doc } = store;
103
- host.provide(hostConfig, {
104
- ...doc,
105
- trimUnknownFields: opts?.trimUnknownFields ?? true,
106
- // 失败在这里记一笔并标记已处理:不 await 的调用方不会因一次落盘失败变成未处理拒绝、被宿主当致命错误退出
107
- save: () => {
108
- const done = (async () => {
109
- // 宿主不持久化时没有写盘,不记「已保存」
110
- if (await persist())
111
- app.logger.info('配置已保存');
112
- })();
113
- done.catch(err => {
114
- try {
115
- // 拒写是保护盘上外部修改的预期结果,调用方已收到拒绝:一行告警即可,不带栈
116
- if (isConfigSaveRefused(err))
117
- app.logger.warn(`配置未保存:${err.message}`);
118
- else
119
- app.logger.error('配置保存失败:', err);
120
- }
121
- catch {
122
- /* 上报器自身失败不再外抛 */
123
- }
297
+ const host = app.bind({ provide, services });
298
+ // 失败在这里记一笔并标记已处理:不 await 的调用方不会因一次落盘失败变成未处理拒绝、被宿主当致命错误退出
299
+ const save = () => {
300
+ const done = (async () => {
301
+ // 宿主不持久化时没有写盘,不记「已保存」
302
+ if (await store.persist())
303
+ app.logger.info('配置已保存');
304
+ })();
305
+ done.catch(err => {
306
+ try {
307
+ // 拒写是保护盘上外部修改的预期结果,调用方已收到拒绝:一行告警即可,不带栈
308
+ if (isConfigSaveRefused(err))
309
+ app.logger.warn(`配置未保存:${err.message}`);
310
+ else
311
+ app.logger.error('配置保存失败:', err);
312
+ }
313
+ catch {
314
+ /* 上报器自身失败不再外抛 */
315
+ }
316
+ });
317
+ return done;
318
+ };
319
+ const applyPluginConfig = async (instanceId, submitted) => {
320
+ assertSafePluginId(instanceId);
321
+ const entry = app.plugins.getPlugin(instanceId);
322
+ const definition = entry?.definition ?? definitionOf(app, instanceId);
323
+ if (!definition)
324
+ throw new Error(`插件 ${instanceId} 不存在,也没有可用来新建它的同模块定义(模块须已登记且声明 reusable)`);
325
+ const schema = definition.configSchema;
326
+ const { doc, writes, placed } = store.splitPluginSecrets(instanceId, schema, submitted);
327
+ const { config: resolved, dangling } = store.resolvePluginConfig(instanceId, schema, doc, writes);
328
+ if (dangling.length > 0) {
329
+ // 本次提交新引入的悬空引用(键既不在密钥存储里、也不是这次写入的)拒收,运行态与文档都不动;
330
+ // 提交前就悬空、原样带回的照常放行(插件仍会激活失败,并记 error)
331
+ const known = new Set(store.resolvePluginConfig(instanceId, schema).dangling.map(d => d.key));
332
+ const introduced = dangling.filter(d => !known.has(d.key));
333
+ if (introduced.length > 0) {
334
+ throw new Error(`${instanceId} 引用的密钥不在 secrets.yaml 里:${introduced.map(d => `${d.path}(键 ${d.key})`).join('、')};` +
335
+ '重新填写值,或先在 secrets.yaml 里补上这些键');
336
+ }
337
+ app.logger.error(describeDangling(instanceId, dangling));
338
+ }
339
+ let reloaded = true;
340
+ if (entry) {
341
+ // 解析出的配置与运行态相同、实例在 active:不重建(updateConfig 即 bounce,会连带重启依赖它所提供服务的下游),
342
+ // 只写文档与落盘。error 态的实例靠原样保存重试激活,照旧走 updateConfig
343
+ if (entry.state === 'active' && isDeepStrictEqual(resolved, entry.config))
344
+ reloaded = false;
345
+ else if (!(await app.plugins.updateConfig(instanceId, resolved)))
346
+ return { status: 'refused' };
347
+ store.commitSecrets(writes);
348
+ store.setPluginConfig(instanceId, doc);
349
+ }
350
+ else {
351
+ // 后缀实例由配置段定义:先写文档再登记,免得登记途中的热重载按还没有这一段的文件把它卸掉
352
+ const previous = Object.hasOwn(store.getAll().plugins, instanceId)
353
+ ? store.getPluginConfig(instanceId)
354
+ : undefined;
355
+ const undo = store.commitSecrets(writes);
356
+ store.setPluginConfig(instanceId, doc);
357
+ const registered = await app.plugins.register(definition, resolved, instanceId, {
358
+ disabled: store.isPluginDisabled(instanceId),
124
359
  });
125
- return done;
360
+ if (!registered) {
361
+ undo();
362
+ if (previous)
363
+ store.setPluginConfig(instanceId, previous);
364
+ else
365
+ store.removePluginConfig(instanceId);
366
+ return { status: 'refused' };
367
+ }
368
+ }
369
+ // 写进的若是被别处共用的已有键,共用它的实例跟着换上新值(新建的键没有别人引用)
370
+ await reloadSecretSharers(app, store, new Set(writes.keys()), instanceId);
371
+ try {
372
+ await save();
373
+ }
374
+ catch (saveError) {
375
+ return { status: 'applied', reloaded, saveError };
376
+ }
377
+ // 写成之后才记:落盘失败时值只在内存里
378
+ for (const { path, key } of placed)
379
+ app.logger.info(`已把 ${instanceId} 的 ${path} 写进 secrets.yaml(键 ${key})`);
380
+ return { status: 'applied', reloaded };
381
+ };
382
+ host.provide.use(hostConfig, {
383
+ get: store.get,
384
+ getAll: store.getAll,
385
+ // plugins 整块替换会绕过下面 setPluginConfig 的形态检查与孤儿键记账
386
+ set: (key, value) => {
387
+ if (key === 'plugins')
388
+ throw new Error('plugins 不能整块替换:改插件配置用 applyPluginConfig 或 setPluginConfig');
389
+ store.set(key, value);
390
+ },
391
+ getPluginConfig: store.getPluginConfig,
392
+ // 只收文档形态:查得到 schema 时,密钥字段上的明文(例如把 caps.config 原样写回)拒绝,不让原值进文档
393
+ setPluginConfig: (instanceId, next) => {
394
+ assertSafePluginId(instanceId);
395
+ const schema = store.hasSecretStore ? definitionOf(app, instanceId)?.configSchema : undefined;
396
+ const plain = plainSecretPaths(schema, next);
397
+ if (plain.length > 0) {
398
+ throw new Error(`setPluginConfig 只收文档形态:${instanceId} 的 ${plain.join('、')} 是密钥字段,不能写原值;改配置请用 applyPluginConfig`);
399
+ }
400
+ store.setPluginConfig(instanceId, next);
126
401
  },
402
+ applyPluginConfig,
403
+ removePluginConfig: store.removePluginConfig,
404
+ isPluginDisabled: store.isPluginDisabled,
405
+ setPluginEnabled: store.setPluginEnabled,
406
+ getServicePreferences: store.getServicePreferences,
407
+ setServicePreference: store.setServicePreference,
408
+ removeServicePreference: store.removeServicePreference,
409
+ trimUnknownFields: opts?.trimUnknownFields ?? true,
410
+ save,
127
411
  }, { exclusive: true });
128
- for (const [name, contextId] of Object.entries(store.getServicePreferences()))
129
- host.services.prefer(name, contextId);
130
- host.events.on('service:registered', name => {
131
- const pref = store.getServicePreferences()[name];
132
- if (pref)
133
- app.logger.debug(`服务 "${name}" 注册时存在用户偏好: ${pref}`);
412
+ // 悬空的密钥引用除了日志,也在诊断里报出来:不走 parseConfig 的第三方插件拿到引用对象不会激活失败,
413
+ // 只看日志的话这种情况没人发现。诊断插件没上线时登记排队,上线后生效
414
+ app.bind({ doctor }).doctor.use.registerCheck({
415
+ id: 'config.secrets',
416
+ category: 'config',
417
+ run: () => {
418
+ const results = [];
419
+ for (const status of app.plugins.getStatus()) {
420
+ const entry = app.plugins.getPlugin(status.instanceId);
421
+ if (!entry)
422
+ continue;
423
+ const { dangling } = store.resolvePluginConfig(status.instanceId, entry.definition.configSchema);
424
+ if (dangling.length === 0)
425
+ continue;
426
+ results.push({
427
+ id: `config.secrets.${status.instanceId}`,
428
+ category: 'config',
429
+ level: 'error',
430
+ message: describeDangling(status.instanceId, dangling),
431
+ });
432
+ }
433
+ return results.length > 0
434
+ ? results
435
+ : { id: 'config.secrets', category: 'config', level: 'ok', message: '配置引用的密钥都在 secrets.yaml 里' };
436
+ },
134
437
  });
438
+ applyServicePreferences(host.services.use, store.getAll());
439
+ }
440
+ /**
441
+ * 文档里的服务偏好(全局与本插件)对到运行态:`previous` 是改动前的文档(热重载时给),这一份没有、它有的撤回,
442
+ * 没变的不动;不给时(启动)全部应用
443
+ */
444
+ export function applyServicePreferences(live, next, previous) {
445
+ const scopes = (doc) => doc ? [undefined, ...Object.keys(doc.pluginServicePreferences ?? {}).map(id => ({ for: id }))] : [];
446
+ const prefsOf = (doc, scope) => (doc && preferencesIn(doc, scope)) ?? {};
447
+ for (const scope of scopes(previous)) {
448
+ const kept = prefsOf(next, scope);
449
+ for (const name of Object.keys(prefsOf(previous, scope)))
450
+ if (!Object.hasOwn(kept, name))
451
+ live.unprefer(name, scope);
452
+ }
453
+ for (const scope of scopes(next)) {
454
+ const before = prefsOf(previous, scope);
455
+ for (const [name, contextId] of Object.entries(prefsOf(next, scope))) {
456
+ if (!Object.hasOwn(before, name) || before[name] !== contextId)
457
+ live.prefer(name, contextId, scope);
458
+ }
459
+ }
135
460
  }
136
461
  // ----- helpers -----
462
+ /** 文档的拷贝:之后对文档的就地修改(禁用名单、服务偏好、插件配置里的子对象)不会改到它 */
463
+ function snapshot(doc) {
464
+ return cloneConfigObject(doc);
465
+ }
466
+ /** 一个范围里的偏好:不给 `for` 是全局偏好,给了是那个插件实例的本插件偏好;还没有时为 undefined */
467
+ function preferencesIn(doc, scope) {
468
+ if (scope?.for === undefined)
469
+ return doc.servicePreferences;
470
+ assertSafePluginId(scope.for);
471
+ const byPlugin = doc.pluginServicePreferences;
472
+ return byPlugin && Object.hasOwn(byPlugin, scope.for) ? byPlugin[scope.for] : undefined;
473
+ }
474
+ /** 密钥文件的键值:危险键不收 */
475
+ function secretMap(input) {
476
+ return new Map(Object.entries(input).filter(([key]) => !isUnsafeConfigKey(key)));
477
+ }
478
+ /** 本插件偏好:插件实例 id → 服务偏好,危险键不收,空段不留 */
479
+ function copyPluginPreferences(input) {
480
+ const out = {};
481
+ if (!input || typeof input !== 'object' || Array.isArray(input))
482
+ return out;
483
+ for (const id of Object.keys(input)) {
484
+ if (isUnsafeConfigKey(id))
485
+ continue;
486
+ const prefs = copyOwnSafeStringDict(input[id]);
487
+ if (Object.keys(prefs).length > 0)
488
+ out[id] = prefs;
489
+ }
490
+ return out;
491
+ }
137
492
  function copyOwnSafeStringDict(input) {
138
493
  const out = {};
139
494
  if (!input || typeof input !== 'object' || Array.isArray(input))
@@ -166,6 +521,10 @@ function normalize(input) {
166
521
  merged.servicePreferences = copyOwnSafeStringDict(value);
167
522
  continue;
168
523
  }
524
+ if (key === 'pluginServicePreferences') {
525
+ merged.pluginServicePreferences = copyPluginPreferences(value);
526
+ continue;
527
+ }
169
528
  merged[key] = value;
170
529
  }
171
530
  return merged;
@@ -1 +1 @@
1
- {"version":3,"file":"config-store.js","sourceRoot":"","sources":["../src/config-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-store.js","sourceRoot":"","sources":["../src/config-store.ts"],"names":[],"mappings":"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"}