@aalis/runtime 0.15.1 → 0.17.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 (66) hide show
  1. package/README.md +11 -2
  2. package/dist/config-store.d.ts +47 -12
  3. package/dist/config-store.d.ts.map +1 -1
  4. package/dist/config-store.js +446 -60
  5. package/dist/config-store.js.map +1 -1
  6. package/dist/config-sync.d.ts +22 -8
  7. package/dist/config-sync.d.ts.map +1 -1
  8. package/dist/config-sync.js +86 -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 +236 -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 +282 -0
  30. package/dist/instance-lock.js.map +1 -0
  31. package/dist/locales/en.d.ts +16 -0
  32. package/dist/locales/en.d.ts.map +1 -0
  33. package/dist/locales/en.js +16 -0
  34. package/dist/locales/en.js.map +1 -0
  35. package/dist/node-modules-loader.d.ts +2 -2
  36. package/dist/node-modules-loader.d.ts.map +1 -1
  37. package/dist/node-modules-loader.js +8 -4
  38. package/dist/node-modules-loader.js.map +1 -1
  39. package/dist/plugin-discovery.d.ts +9 -4
  40. package/dist/plugin-discovery.d.ts.map +1 -1
  41. package/dist/plugin-discovery.js +28 -16
  42. package/dist/plugin-discovery.js.map +1 -1
  43. package/dist/providers.d.ts +38 -13
  44. package/dist/providers.d.ts.map +1 -1
  45. package/dist/providers.js +107 -232
  46. package/dist/providers.js.map +1 -1
  47. package/dist/secrets.d.ts +47 -0
  48. package/dist/secrets.d.ts.map +1 -0
  49. package/dist/secrets.js +108 -0
  50. package/dist/secrets.js.map +1 -0
  51. package/dist/start.d.ts +19 -12
  52. package/dist/start.d.ts.map +1 -1
  53. package/dist/start.js +174 -48
  54. package/dist/start.js.map +1 -1
  55. package/dist/subcommand.d.ts.map +1 -1
  56. package/dist/subcommand.js +2 -2
  57. package/dist/subcommand.js.map +1 -1
  58. package/dist/texts.d.ts +31 -0
  59. package/dist/texts.d.ts.map +1 -0
  60. package/dist/texts.js +21 -0
  61. package/dist/texts.js.map +1 -0
  62. package/dist/yaml-file.d.ts +36 -0
  63. package/dist/yaml-file.d.ts.map +1 -0
  64. package/dist/yaml-file.js +220 -0
  65. package/dist/yaml-file.js.map +1 -0
  66. package/package.json +14 -7
@@ -1,6 +1,7 @@
1
+ import { type AalisConfig } from '@aalis/api-host-config';
1
2
  import { type App, type PluginDefinition } from '@aalis/core';
2
- import type { ConfigStore } from './config-store.js';
3
- import type { PluginDiscovery, PluginLoader } from './plugin-discovery.js';
3
+ import { type ConfigStore } from './config-store.js';
4
+ import { type PluginDiscovery, type PluginLoader } from './plugin-discovery.js';
4
5
  export interface ConfigSyncOptions {
5
6
  /**
6
7
  * 是否按 configSchema 裁剪未知字段(默认 `true`)。
@@ -13,18 +14,22 @@ export interface ConfigSyncOptions {
13
14
  * 将各插件 schema 派生默认值中缺失的字段合并到配置;同时按 configSchema
14
15
  * 移除多余字段。返回发生变更的插件 instanceId 列表。
15
16
  *
16
- * 覆盖已登记的实例,以及文档里新出现、尚未登记的 `name:suffix` 实例(模块已登记且 reusable 时):
17
+ * 覆盖已登记的实例,以及文档里新出现、尚未登记的 `name:suffix` 实例(模块已登记且 reusable 时,定义取法同热重载登记):
17
18
  * 后者随后由热重载按文档登记,先在这里规范化,首次 apply 拿到的就是带默认值的这一份。
18
19
  *
19
- * 副作用:对每个变化条目 setPluginConfig;若有变化最终落盘。
20
+ * `previous` 是热重载前的文档:密钥字段上的明文写进它在同一位置引用的键,与 WebUI 替换同一规则。
21
+ * 不给(启动时)就取新键。
22
+ *
23
+ * 副作用:对每个变化条目 setPluginConfig;若有变化最终落盘,移进密钥存储的字段写成之后才记日志。
20
24
  * 插件的 configSchema 经 `getPlugin(instanceId).definition` 读取
21
25
  * (core 的状态摘要不携带配置详情)。
22
26
  */
23
- export declare function syncPluginDefaults(app: App, store: ConfigStore, opts?: ConfigSyncOptions): string[];
27
+ export declare function syncPluginDefaults(app: App, store: ConfigStore, opts?: ConfigSyncOptions, previous?: Readonly<AalisConfig>): string[];
24
28
  /**
25
29
  * 宿主加载政策:导入定义后、交给 Core 注册前规范化主实例与已配置的复用实例。
26
30
  * 首次加载批次只落盘一次;随后市场 rescan 的 load/reload 也走同一政策。
27
31
  * 发现驱动随后按文档取每个实例的配置交给 core,首次 apply 拿到的就是规范化后的这一份。
32
+ * 配置段被改了的实例各发一次 host-config:changed(带 instanceId)。
28
33
  */
29
34
  export declare function withPluginConfigSync(loader: PluginLoader, app: App, store: ConfigStore, opts?: ConfigSyncOptions): {
30
35
  loader: {
@@ -35,14 +40,23 @@ export declare function withPluginConfigSync(loader: PluginLoader, app: App, sto
35
40
  finishInitialLoad(): void;
36
41
  };
37
42
  /**
38
- * 配置外部变更时的处理:先卸载文件里已没有配置段的 `name:suffix` 实例,再按启动路径同一政策同步,
43
+ * 配置外部变更时的处理:先对账服务偏好(全局与本插件),卸载文件里已没有配置段的 `name:suffix` 实例,再按启动路径同一政策同步,
39
44
  * 重新计算各插件配置并热重载差异(updateConfig → bounce),最后经发现驱动登记文件里新出现的后缀实例
40
- * (判据同冷启动与热扫描)。
45
+ * (判据同冷启动与热扫描)。`previous` 是变更前的文档:对账偏好的基线(不给时只应用新文档里的),也交给同步作拆密钥的基线
46
+ * (见 {@link syncPluginDefaults})。
47
+ * 结束时(成功与失败都一样)文档与 `previous` 不同就发 host-config:changed(带 document):热重载换下整份文档,不经 host-config
48
+ * 的写方法。只换了密钥文件、文档没换时不发;不给 `previous` 时按变了处理。配置文件解析失败的变更到不了这里
41
49
  */
42
- export declare function handleConfigChanged(app: App, store: ConfigStore, discovery: Pick<PluginDiscovery, 'registerConfiguredInstances'>, opts?: ConfigSyncOptions): Promise<void>;
50
+ export declare function handleConfigChanged(app: App, store: ConfigStore, discovery: Pick<PluginDiscovery, 'registerConfiguredInstances'>, opts?: ConfigSyncOptions, previous?: Readonly<AalisConfig>): Promise<void>;
43
51
  /**
44
52
  * 接管配置外部变更监听(provider 不支持 watch 时为 no-op),在 app:stopping(在飞动作排干后)停止监听。
45
53
  * startAalis 默认调用;嵌入式宿主可自行选择是否接。
46
54
  */
47
55
  export declare function installConfigHotReload(app: App, store: ConfigStore, discovery: Pick<PluginDiscovery, 'registerConfiguredInstances'>, opts?: ConfigSyncOptions): void;
56
+ /**
57
+ * 按文档重新解析一个已登记实例的配置,悬空引用记 error。与运行态相同返回 undefined;不同则按状态记一行(`change` 是起因,
58
+ * 如「配置已变更」)并返回新配置,由调用方交给 updateConfig(即 bounce;禁用态只换配置、保持禁用)。
59
+ * 热重载与改了共用密钥之后的重载共用;不在这里 await,没有改动时调用方一路同步走完
60
+ */
61
+ export declare function configToReload(app: App, store: ConfigStore, instanceId: string, change: string): Record<string, unknown> | undefined;
48
62
  //# sourceMappingURL=config-sync.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-sync.d.ts","sourceRoot":"","sources":["../src/config-sync.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,GAAG,EAAU,KAAK,gBAAgB,EAAmB,MAAM,aAAa,CAAC;AAEvF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE3E,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAenG;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,iBAAiB;;;;;;;EAmChH;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE,6BAA6B,CAAC,EAC/D,IAAI,CAAC,EAAE,iBAAiB,GACvB,OAAO,CAAC,IAAI,CAAC,CAsCf;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE,6BAA6B,CAAC,EAC/D,IAAI,CAAC,EAAE,iBAAiB,GACvB,IAAI,CAGN"}
1
+ {"version":3,"file":"config-sync.d.ts","sourceRoot":"","sources":["../src/config-sync.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,WAAW,EAAuB,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,KAAK,GAAG,EAAU,KAAK,gBAAgB,EAA6B,MAAM,aAAa,CAAC;AAEjG,OAAO,EAA2B,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAsB,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGpG,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,WAAW,EAClB,IAAI,CAAC,EAAE,iBAAiB,EACxB,QAAQ,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,GAC/B,MAAM,EAAE,CAkBV;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,iBAAiB;;;;;;;EAwChH;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE,6BAA6B,CAAC,EAC/D,IAAI,CAAC,EAAE,iBAAiB,EACxB,QAAQ,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,GAC/B,OAAO,CAAC,IAAI,CAAC,CAmCf;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE,6BAA6B,CAAC,EAC/D,IAAI,CAAC,EAAE,iBAAiB,GACvB,IAAI,CAGN;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAarC"}
@@ -1,56 +1,70 @@
1
1
  // ============================================================
2
2
  // config-sync —— 插件配置同步政策 + 配置热重载编排(宿主政策层)
3
3
  //
4
- // - syncPluginDefaults:schema 派生默认值回填 + 按 configSchema 裁剪未知字段
4
+ // - syncPluginDefaults:schema 派生默认值回填 + 按 configSchema 裁剪未知字段 + 密钥字段上的明文移进密钥存储
5
5
  // - handleConfigChanged / installConfigHotReload:配置外部变更的 diff + bounce 编排(后缀实例随文件增删登记或卸载)
6
6
  //
7
7
  // 这些是**政策**(要不要裁剪、怎么合并、何时 bounce)。配置文档在 config-store,core 只持有
8
8
  // 运行态与 updateConfig 机制。不接本模块的嵌入式宿主将没有自动配置同步与热重载——需要时用
9
9
  // 公开 API 自行编排。
10
10
  // ============================================================
11
+ import { isDeepStrictEqual } from 'node:util';
11
12
  import { isConfigSaveRefused } from '@aalis/api-host-config';
12
- import { events, parseInstanceId } from '@aalis/core';
13
+ import { events, parseInstanceId, services } from '@aalis/core';
13
14
  import { deepMergeDefaults, defaultsFrom, removeExtraFields, validateConfig } from '@aalis/schema-config';
15
+ import { applyServicePreferences } from './config-store.js';
16
+ import { moduleDefinitionOf } from './plugin-discovery.js';
17
+ import { describeDangling } from './secrets.js';
14
18
  /**
15
19
  * 将各插件 schema 派生默认值中缺失的字段合并到配置;同时按 configSchema
16
20
  * 移除多余字段。返回发生变更的插件 instanceId 列表。
17
21
  *
18
- * 覆盖已登记的实例,以及文档里新出现、尚未登记的 `name:suffix` 实例(模块已登记且 reusable 时):
22
+ * 覆盖已登记的实例,以及文档里新出现、尚未登记的 `name:suffix` 实例(模块已登记且 reusable 时,定义取法同热重载登记):
19
23
  * 后者随后由热重载按文档登记,先在这里规范化,首次 apply 拿到的就是带默认值的这一份。
20
24
  *
21
- * 副作用:对每个变化条目 setPluginConfig;若有变化最终落盘。
25
+ * `previous` 是热重载前的文档:密钥字段上的明文写进它在同一位置引用的键,与 WebUI 替换同一规则。
26
+ * 不给(启动时)就取新键。
27
+ *
28
+ * 副作用:对每个变化条目 setPluginConfig;若有变化最终落盘,移进密钥存储的字段写成之后才记日志。
22
29
  * 插件的 configSchema 经 `getPlugin(instanceId).definition` 读取
23
30
  * (core 的状态摘要不携带配置详情)。
24
31
  */
25
- export function syncPluginDefaults(app, store, opts) {
32
+ export function syncPluginDefaults(app, store, opts, previous) {
26
33
  const changed = [];
34
+ const moved = [];
35
+ const baseOf = (id) => (previous && Object.hasOwn(previous.plugins, id) ? previous.plugins[id] : undefined);
27
36
  for (const status of app.plugins.getStatus()) {
28
37
  const entry = app.plugins.getPlugin(status.instanceId);
29
38
  if (!entry)
30
39
  continue;
31
- if (syncPluginConfig(app, store, entry.definition, status.instanceId, opts))
32
- changed.push(status.instanceId);
40
+ const id = status.instanceId;
41
+ if (syncPluginConfig(app, store, entry.definition, id, moved, opts, baseOf(id)))
42
+ changed.push(id);
33
43
  }
34
44
  for (const id of Object.keys(store.get('plugins'))) {
35
45
  const { moduleName, suffix } = parseInstanceId(id);
36
46
  if (!suffix || app.plugins.getPlugin(id))
37
47
  continue;
38
- const definition = app.plugins.getPlugin(moduleName)?.definition;
39
- if (definition?.reusable && syncPluginConfig(app, store, definition, id, opts))
48
+ const definition = moduleDefinitionOf(app, moduleName);
49
+ if (definition?.reusable && syncPluginConfig(app, store, definition, id, moved, opts, baseOf(id)))
40
50
  changed.push(id);
41
51
  }
42
52
  if (changed.length > 0)
43
- saveSyncedConfig(app, store);
53
+ saveSyncedConfig(app, store, moved);
44
54
  return changed;
45
55
  }
46
56
  /**
47
57
  * 宿主加载政策:导入定义后、交给 Core 注册前规范化主实例与已配置的复用实例。
48
58
  * 首次加载批次只落盘一次;随后市场 rescan 的 load/reload 也走同一政策。
49
59
  * 发现驱动随后按文档取每个实例的配置交给 core,首次 apply 拿到的就是规范化后的这一份。
60
+ * 配置段被改了的实例各发一次 host-config:changed(带 instanceId)。
50
61
  */
51
62
  export function withPluginConfigSync(loader, app, store, opts) {
63
+ const host = app.bind({ events });
52
64
  let initialLoad = true;
53
65
  let initialChanged = false;
66
+ // 首次加载批次里移进密钥存储的字段:合并的那次保存写成之后再记
67
+ const initialMoved = [];
54
68
  const prepare = async (loaded) => {
55
69
  const definition = await loaded;
56
70
  if (!definition)
@@ -64,16 +78,18 @@ export function withPluginConfigSync(loader, app, store, opts) {
64
78
  }
65
79
  }
66
80
  let changed = false;
81
+ const moved = initialLoad ? initialMoved : [];
67
82
  for (const id of ids) {
68
- if (!syncPluginConfig(app, store, definition, id, opts))
83
+ if (!syncPluginConfig(app, store, definition, id, moved, opts))
69
84
  continue;
70
85
  app.logger.debug(`同步插件配置: ${id}`);
71
86
  changed = true;
87
+ void host.events.use.emit('host-config:changed', { instanceId: id });
72
88
  }
73
89
  if (initialLoad)
74
90
  initialChanged ||= changed;
75
91
  else if (changed)
76
- saveSyncedConfig(app, store);
92
+ saveSyncedConfig(app, store, moved);
77
93
  return definition;
78
94
  };
79
95
  return {
@@ -85,19 +101,24 @@ export function withPluginConfigSync(loader, app, store, opts) {
85
101
  finishInitialLoad() {
86
102
  initialLoad = false;
87
103
  if (initialChanged)
88
- saveSyncedConfig(app, store);
104
+ saveSyncedConfig(app, store, initialMoved.splice(0));
89
105
  initialChanged = false;
90
106
  },
91
107
  };
92
108
  }
93
109
  /**
94
- * 配置外部变更时的处理:先卸载文件里已没有配置段的 `name:suffix` 实例,再按启动路径同一政策同步,
110
+ * 配置外部变更时的处理:先对账服务偏好(全局与本插件),卸载文件里已没有配置段的 `name:suffix` 实例,再按启动路径同一政策同步,
95
111
  * 重新计算各插件配置并热重载差异(updateConfig → bounce),最后经发现驱动登记文件里新出现的后缀实例
96
- * (判据同冷启动与热扫描)。
112
+ * (判据同冷启动与热扫描)。`previous` 是变更前的文档:对账偏好的基线(不给时只应用新文档里的),也交给同步作拆密钥的基线
113
+ * (见 {@link syncPluginDefaults})。
114
+ * 结束时(成功与失败都一样)文档与 `previous` 不同就发 host-config:changed(带 document):热重载换下整份文档,不经 host-config
115
+ * 的写方法。只换了密钥文件、文档没换时不发;不给 `previous` 时按变了处理。配置文件解析失败的变更到不了这里
97
116
  */
98
- export async function handleConfigChanged(app, store, discovery, opts) {
117
+ export async function handleConfigChanged(app, store, discovery, opts, previous) {
99
118
  app.logger.info('检测到配置变更,正在热重载...');
119
+ const host = app.bind({ events, services });
100
120
  try {
121
+ applyServicePreferences(host.services.use, store.getAll(), previous);
101
122
  // 后缀实例由配置段定义,冷启动只登记文件里有的;重载同样以文件为准,没有配置段的就卸载,新出现的在最后登记。
102
123
  // 留着不管的话,下面的同步会把它当成缺配置的实例:运行态配置被换成默认值(无默认值时是 {}),
103
124
  // 默认值还会作为一个新配置段写回文件。
@@ -110,21 +131,15 @@ export async function handleConfigChanged(app, store, discovery, opts) {
110
131
  }
111
132
  // 与启动路径同一政策先同步一遍(补 schema 派生默认值缺失字段 + 裁剪 schema 外字段)
112
133
  // ——否则热重载读入的原始快照会绕过政策,内存态与启动态在字段清理上不一致。
113
- const synced = syncPluginDefaults(app, store, opts);
134
+ const synced = syncPluginDefaults(app, store, opts, previous);
114
135
  for (const id of synced)
115
136
  app.logger.debug(`热重载配置同步: ${id}`);
116
- // 启用中的插件由 updateConfig 收尾的重算发 plugins:changed;禁用插件只换配置、状态不变,这里都不必再补发
137
+ // 启用中的插件由 updateConfig 收尾的重算发 plugins:changed;禁用插件只换配置、状态不变,这里都不必再补发。
138
+ // 密钥文件的变更也走这里,只有解析结果变了的实例才重载
117
139
  for (const status of app.plugins.getStatus()) {
118
- const entry = app.plugins.getPlugin(status.instanceId);
119
- if (!entry)
120
- continue;
121
- const newConfig = store.getPluginConfig(status.instanceId);
122
- if (JSON.stringify(newConfig) !== JSON.stringify(entry.config)) {
123
- app.logger.info(entry.state === 'disabled'
124
- ? `插件 ${status.instanceId} 配置已变更;插件已禁用,启用时按新配置激活`
125
- : `插件 ${status.instanceId} 配置已变更,正在重新加载...`);
126
- await app.plugins.updateConfig(status.instanceId, newConfig);
127
- }
140
+ const next = configToReload(app, store, status.instanceId, '配置已变更');
141
+ if (next)
142
+ await app.plugins.updateConfig(status.instanceId, next);
128
143
  }
129
144
  // 按上面已规范化的文档登记,首次 apply 即带默认值
130
145
  await discovery.registerConfiguredInstances();
@@ -133,17 +148,42 @@ export async function handleConfigChanged(app, store, discovery, opts) {
133
148
  catch (e) {
134
149
  app.logger.error('配置热重载失败:', e);
135
150
  }
151
+ finally {
152
+ if (!isDeepStrictEqual(previous, store.getAll()))
153
+ await host.events.use.emit('host-config:changed', { document: true });
154
+ }
136
155
  }
137
156
  /**
138
157
  * 接管配置外部变更监听(provider 不支持 watch 时为 no-op),在 app:stopping(在飞动作排干后)停止监听。
139
158
  * startAalis 默认调用;嵌入式宿主可自行选择是否接。
140
159
  */
141
160
  export function installConfigHotReload(app, store, discovery, opts) {
142
- store.watch(() => void handleConfigChanged(app, store, discovery, opts));
143
- app.bind({ events }).events.on('app:stopping', () => store.unwatch());
161
+ store.watch(previous => void handleConfigChanged(app, store, discovery, opts, previous));
162
+ app.bind({ events }).events.use.on('app:stopping', () => store.unwatch());
163
+ }
164
+ /**
165
+ * 按文档重新解析一个已登记实例的配置,悬空引用记 error。与运行态相同返回 undefined;不同则按状态记一行(`change` 是起因,
166
+ * 如「配置已变更」)并返回新配置,由调用方交给 updateConfig(即 bounce;禁用态只换配置、保持禁用)。
167
+ * 热重载与改了共用密钥之后的重载共用;不在这里 await,没有改动时调用方一路同步走完
168
+ */
169
+ export function configToReload(app, store, instanceId, change) {
170
+ const entry = app.plugins.getPlugin(instanceId);
171
+ if (!entry)
172
+ return undefined;
173
+ // 拿解析后的配置与运行态比:文档里是引用、运行态是原值,直接比永远不等
174
+ const { config, dangling } = store.resolvePluginConfig(instanceId, entry.definition.configSchema);
175
+ if (dangling.length > 0)
176
+ app.logger.error(describeDangling(instanceId, dangling).source);
177
+ if (isDeepStrictEqual(config, entry.config))
178
+ return undefined;
179
+ app.logger.info(entry.state === 'disabled'
180
+ ? `插件 ${instanceId} ${change};插件已禁用,启用时按新配置激活`
181
+ : `插件 ${instanceId} ${change},正在重新加载...`);
182
+ return config;
144
183
  }
145
184
  // ---- helpers ----
146
- function syncPluginConfig(app, store, definition, id, opts) {
185
+ /** 同步一个实例的配置,返回文档有没有变。移进密钥存储的字段说明记进 `moved`,由落盘写成之后记日志 */
186
+ function syncPluginConfig(app, store, definition, id, moved, opts, base) {
147
187
  const schema = definition.configSchema;
148
188
  const fileConfig = store.getPluginConfig(id);
149
189
  let merged = deepMergeDefaults(defaultsFrom(schema), fileConfig);
@@ -153,6 +193,15 @@ function syncPluginConfig(app, store, definition, id, opts) {
153
193
  if (removed.length > 0)
154
194
  app.logger.warn(`配置同步:${id} 裁掉 schema 外字段 [${removed.join(', ')}]`);
155
195
  }
196
+ // 密钥字段上的明文(手写进配置文件的、旧配置里的)移进密钥存储,文档里换成引用。这会改写用户刚编辑过的文件,
197
+ // 日志只写路径与键,不写值
198
+ const { doc, writes, placed } = store.splitPluginSecrets(id, schema, merged, base);
199
+ if (writes.size > 0) {
200
+ store.commitSecrets(writes);
201
+ merged = doc;
202
+ for (const p of placed)
203
+ moved.push(`${id} 的 ${p.path} 移进 secrets.yaml(键 ${p.key})`);
204
+ }
156
205
  // 脏值在这里只告警、不改文档也不拦登记,读取时怎么处置归插件(parseConfig 回落默认值、忽略或拒绝激活);
157
206
  // 禁用实例的休眠配置不产生必填缺失噪音。
158
207
  if (!store.isPluginDisabled(id)) {
@@ -167,8 +216,12 @@ function syncPluginConfig(app, store, definition, id, opts) {
167
216
  store.setPluginConfig(id, merged);
168
217
  return true;
169
218
  }
170
- function saveSyncedConfig(app, store) {
171
- store.persist().catch(err => {
219
+ /** 落盘;`moved` 是这批移进密钥存储的字段,写成之后才记:拒写或写失败时明文还在配置文件里 */
220
+ function saveSyncedConfig(app, store, moved) {
221
+ store.persist().then(() => {
222
+ for (const line of moved)
223
+ app.logger.info(`配置同步:已把 ${line}`);
224
+ }, err => {
172
225
  // 拒写是保护盘上外部修改的预期结果,与 host-config 的 save 同一口径:一行告警,不带栈
173
226
  if (isConfigSaveRefused(err))
174
227
  app.logger.warn(`配置同步未落盘:${err.message}`);
@@ -1 +1 @@
1
- {"version":3,"file":"config-sync.js","sourceRoot":"","sources":["../src/config-sync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-sync.js","sourceRoot":"","sources":["../src/config-sync.ts"],"names":[],"mappings":"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"}
@@ -20,7 +20,7 @@ export interface ConsoleSinkHandle {
20
20
  * 当任何 UI 接管终端时自动停止写 stdout。
21
21
  *
22
22
  * 必须显式调用——`installConsoleSink()` 在 App 之前运行(需要捕获最早期日志),
23
- * 此时还没有事件总线可订阅。传宿主根绑定的 events(`app.bind({ events }).events`)。
23
+ * 此时还没有事件总线可订阅。传宿主根绑定的 events(`app.bind({ events }).events.use`)。
24
24
  */
25
25
  bindEvents(events: Events): void;
26
26
  /** 当前是否染色输出(供调试 / 状态视图使用) */
@@ -1,6 +1,6 @@
1
- /** 默认日志文件路径。webui-server 等下游目前各自硬编码同一相对路径。 */
2
- export declare const DEFAULT_LOG_FILE = "data/latest.log";
3
1
  export interface FileLoggerHandle {
2
+ /** 日志文件的绝对路径 */
3
+ readonly path: string;
4
4
  flush(): Promise<void>;
5
5
  /**
6
6
  * 冲洗后退订 LogHub —— 与 ConsoleSinkHandle.dispose 对称。
@@ -8,11 +8,11 @@ export interface FileLoggerHandle {
8
8
  */
9
9
  dispose(): Promise<void>;
10
10
  }
11
- export declare function appendCrashLog(label: string, err: unknown, logFile?: string): Promise<void>;
11
+ export declare function appendCrashLog(label: string, err: unknown, logFile: string): Promise<void>;
12
12
  /**
13
13
  * 装文件日志:先把上一轮的日志改名保留(见 rotateLogs),再把启动期日志写入新的 logFile,之后实时追加。
14
14
  * 轮转失败不拦启动:照旧覆盖写 logFile,并记一条告警写明原因。不接在原内容后面写:一个文件只装一轮,
15
15
  * seq 从 0 起随文件位置单调递增,webui 的历史分页与 CLI 的启动恢复都以此为前提。
16
16
  */
17
- export declare function setupFileLogger(logFile?: string): Promise<FileLoggerHandle>;
17
+ export declare function setupFileLogger(logFile: string): Promise<FileLoggerHandle>;
18
18
  //# sourceMappingURL=file-logger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-logger.d.ts","sourceRoot":"","sources":["../src/file-logger.ts"],"names":[],"mappings":"AAMA,8CAA8C;AAC9C,eAAO,MAAM,gBAAgB,oBAAoB,CAAC;AAOlD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB;;;OAGG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAOD,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,SAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAY3G;AAsBD;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,OAAO,SAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAkC3F"}
1
+ {"version":3,"file":"file-logger.d.ts","sourceRoot":"","sources":["../src/file-logger.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB;IAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB;;;OAGG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAOD,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYhG;AAsBD;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAoChF"}
@@ -3,8 +3,7 @@ import { dirname, extname } from 'node:path';
3
3
  import { DefaultLogger, LogHub } from '@aalis/core';
4
4
  import { formatLogLine } from '@aalis/schema-log';
5
5
  import { getBootstrapBuffer } from './bootstrap-buffer.js';
6
- /** 默认日志文件路径。webui-server 等下游目前各自硬编码同一相对路径。 */
7
- export const DEFAULT_LOG_FILE = 'data/latest.log';
6
+ import { assertAbsolute } from './home.js';
8
7
  const RUNTIME_SCOPE = 'aalis:runtime';
9
8
  /** 启动时保留的上几轮日志份数:latest.1.log(上一轮)到 latest.5.log,更早的被挤掉。 */
10
9
  const LOG_HISTORY_COUNT = 5;
@@ -13,7 +12,7 @@ function formatUnknownError(err) {
13
12
  return err.stack || err.message;
14
13
  return typeof err === 'string' ? err : JSON.stringify(err);
15
14
  }
16
- export async function appendCrashLog(label, err, logFile = DEFAULT_LOG_FILE) {
15
+ export async function appendCrashLog(label, err, logFile) {
17
16
  await mkdir(dirname(logFile), { recursive: true });
18
17
  await appendFile(logFile, formatLogLine({
19
18
  seq: LogHub.default.allocSeq(),
@@ -23,7 +22,7 @@ export async function appendCrashLog(label, err, logFile = DEFAULT_LOG_FILE) {
23
22
  message: `${label}: ${formatUnknownError(err)}`,
24
23
  }));
25
24
  }
26
- /** 第 n 份历史日志的路径,编号插在扩展名前:data/latest.log → data/latest.1.log。 */
25
+ /** 第 n 份历史日志的路径,编号插在扩展名前:logs/latest.log → logs/latest.1.log。 */
27
26
  function historyPath(logFile, n) {
28
27
  const ext = extname(logFile);
29
28
  return `${logFile.slice(0, logFile.length - ext.length)}.${n}${ext}`;
@@ -48,7 +47,8 @@ async function rotateLogs(logFile) {
48
47
  * 轮转失败不拦启动:照旧覆盖写 logFile,并记一条告警写明原因。不接在原内容后面写:一个文件只装一轮,
49
48
  * seq 从 0 起随文件位置单调递增,webui 的历史分页与 CLI 的启动恢复都以此为前提。
50
49
  */
51
- export async function setupFileLogger(logFile = DEFAULT_LOG_FILE) {
50
+ export async function setupFileLogger(logFile) {
51
+ assertAbsolute('Log file path', logFile);
52
52
  let queue = Promise.resolve();
53
53
  await mkdir(dirname(logFile), { recursive: true });
54
54
  let rotateError;
@@ -73,6 +73,7 @@ export async function setupFileLogger(logFile = DEFAULT_LOG_FILE) {
73
73
  await queue.catch(() => { });
74
74
  };
75
75
  return {
76
+ path: logFile,
76
77
  flush,
77
78
  async dispose() {
78
79
  await flush();
@@ -1 +1 @@
1
- {"version":3,"file":"file-logger.js","sourceRoot":"","sources":["../src/file-logger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file-logger.js","sourceRoot":"","sources":["../src/file-logger.ts"],"names":[],"mappings":"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"}
package/dist/home.d.ts ADDED
@@ -0,0 +1,64 @@
1
+ import type { HostPaths } from '@aalis/api-host-paths';
2
+ /** 宿主件的路径参数必须是绝对路径:相对路径会按调用那一刻的 cwd 解析,而 cwd 不带语义 */
3
+ export declare function assertAbsolute(what: string, p: string): void;
4
+ /**
5
+ * 绝对路径。Windows 上还要带盘符或 UNC 前缀:`\aalis` 这类按当前盘解析,仍然依赖 cwd。
6
+ */
7
+ export declare function isFullyAbsolute(p: string, platform?: NodeJS.Platform): boolean;
8
+ /** 家目录相关的输入有误(参数缺值、profile 名不合法、来源冲突):宿主据此一行报错退出。 */
9
+ export declare class HomeArgsError extends Error {
10
+ name: string;
11
+ }
12
+ /** 出现在子命令之前的宿主参数。 */
13
+ export interface HostArgs {
14
+ home?: string;
15
+ profile?: string;
16
+ /** `--init`:初始化家目录后退出 */
17
+ init: boolean;
18
+ /** `--service`:由服务管理器拉起;实例锁被占时按正常退出,免得被反复拉起 */
19
+ service: boolean;
20
+ /** 余下的 argv:非空即子命令 */
21
+ rest: string[];
22
+ }
23
+ /**
24
+ * 只认开头的宿主参数(`--home <dir>`、`--home=<dir>`、`--profile`、`--init`、`--service`),遇到第一个别的参数即停:
25
+ * 之后的都属于子命令,子命令自己的参数里出现同名写法也不会被吃掉。
26
+ * 开头这一段里的 `--` 跳过:`pnpm dev -- --init` 会把 `--` 原样传进来。
27
+ */
28
+ export declare function parseHostArgs(argv: readonly string[]): HostArgs;
29
+ export interface ResolveHomeInput {
30
+ args: Pick<HostArgs, 'home' | 'profile'>;
31
+ env: Readonly<Record<string, string | undefined>>;
32
+ /** 宿主代码给的兜底家目录,优先级最低,必须是绝对路径 */
33
+ defaultHome?: string;
34
+ /** 解析命令行与环境变量里相对路径的基准:启动时的 cwd。取不到(目录已被删除)时不给,只有遇到相对路径才需要它 */
35
+ cwd?: string;
36
+ /** 用户主目录 */
37
+ userHome?: string;
38
+ }
39
+ /**
40
+ * 家目录的覆盖顺序:`--home` → `AALIS_HOME` → `--profile` / `AALIS_PROFILE`(`~/.aalis-<p>`)→ 宿主的 defaultHome → `~/.aalis`。
41
+ * 指定了 profile、同时又有更高优先级的 `--home` 或 `AALIS_HOME` 时报错,不静默忽略 profile:
42
+ * 以为进了测试实例、实际写进主实例,是这类配置错误最坏的后果。
43
+ */
44
+ export declare function resolveHome(input: ResolveHomeInput): {
45
+ home: string;
46
+ profile?: string;
47
+ };
48
+ /**
49
+ * 按真实路径补认 profile:家目录的真实路径就是 `~/.aalis-<p>` 的真实路径时为 p。补上按写法认不出的情形:
50
+ * 大小写写错、经指向它的符号链接选中、用户主目录本身是符号链接。`~/.aalis-<p>` 自己是指向别处的链接时,
51
+ * 经那个别处的路径选中仍认不出。用户主目录不存在时没有 profile。
52
+ */
53
+ export declare function profileOfRealHome(realHome: string, userHome?: string): string | undefined;
54
+ /** 由家目录与安装集派生全部路径(家目录布局见计划书「家目录布局」)。 */
55
+ export declare function derivePaths(home: string, app: string, profile?: string): HostPaths;
56
+ /** 初始化的判据:主配置文件存在。 */
57
+ export declare function isHomeInitialized(paths: HostPaths): boolean;
58
+ /**
59
+ * 建家目录:目录 0700,写默认主配置与空的密钥文件(0600),建布局里的子目录。主配置里写上 owner 平台的平台档。
60
+ * 已初始化时拒绝,不覆盖任何文件。目录已存在时只接受空目录,或只有布局自己条目的目录(上次初始化中途失败),
61
+ * 沿用并收紧为 0700:`--home ~ --init` 这类笔误不能把用户主目录改成 0700、再往里铺一层布局。
62
+ */
63
+ export declare function initHome(paths: HostPaths): void;
64
+ //# sourceMappingURL=home.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../src/home.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAYvD,qDAAqD;AACrD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAE5D;AAqBD;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,OAAO,CAEhG;AAED,qDAAqD;AACrD,qBAAa,aAAc,SAAQ,KAAK;IAC7B,IAAI,SAAmB;CACjC;AAED,qBAAqB;AACrB,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yBAAyB;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,+CAA+C;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,sBAAsB;IACtB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,QAAQ,CAmB/D;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAClD,gCAAgC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CA0BvF;AAaD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAkB,GAAG,MAAM,GAAG,SAAS,CAQpG;AAyBD,wCAAwC;AACxC,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAwBlF;AAED,sBAAsB;AACtB,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAE3D;AAaD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAqC/C"}