@aalis/core 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.
Files changed (217) hide show
  1. package/README.md +21 -0
  2. package/dist/app.d.ts +166 -0
  3. package/dist/app.d.ts.map +1 -0
  4. package/dist/app.js +348 -0
  5. package/dist/app.js.map +1 -0
  6. package/dist/config.d.ts +174 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +377 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/constants.d.ts +31 -0
  11. package/dist/constants.d.ts.map +1 -0
  12. package/dist/constants.js +36 -0
  13. package/dist/constants.js.map +1 -0
  14. package/dist/context.d.ts +328 -0
  15. package/dist/context.d.ts.map +1 -0
  16. package/dist/context.js +521 -0
  17. package/dist/context.js.map +1 -0
  18. package/dist/disposable-chain.d.ts +31 -0
  19. package/dist/disposable-chain.d.ts.map +1 -0
  20. package/dist/disposable-chain.js +66 -0
  21. package/dist/disposable-chain.js.map +1 -0
  22. package/dist/events.d.ts +64 -0
  23. package/dist/events.d.ts.map +1 -0
  24. package/dist/events.js +145 -0
  25. package/dist/events.js.map +1 -0
  26. package/dist/hooks.d.ts +49 -0
  27. package/dist/hooks.d.ts.map +1 -0
  28. package/dist/hooks.js +102 -0
  29. package/dist/hooks.js.map +1 -0
  30. package/dist/i18n.d.ts +6 -0
  31. package/dist/i18n.d.ts.map +1 -0
  32. package/dist/i18n.js +26 -0
  33. package/dist/i18n.js.map +1 -0
  34. package/dist/identity.d.ts +26 -0
  35. package/dist/identity.d.ts.map +1 -0
  36. package/dist/identity.js +36 -0
  37. package/dist/identity.js.map +1 -0
  38. package/dist/index.d.ts +17 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +29 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/init.d.ts +20 -0
  43. package/dist/init.d.ts.map +1 -0
  44. package/dist/init.js +455 -0
  45. package/dist/init.js.map +1 -0
  46. package/dist/llm-router.d.ts.map +1 -0
  47. package/dist/llm-router.js +123 -0
  48. package/dist/llm-router.js.map +1 -0
  49. package/dist/logger.d.ts +76 -0
  50. package/dist/logger.d.ts.map +1 -0
  51. package/dist/logger.js +187 -0
  52. package/dist/logger.js.map +1 -0
  53. package/dist/marketplace-bootstrap.d.ts +54 -0
  54. package/dist/marketplace-bootstrap.d.ts.map +1 -0
  55. package/dist/marketplace-bootstrap.js +132 -0
  56. package/dist/marketplace-bootstrap.js.map +1 -0
  57. package/dist/mixin-registry.d.ts +34 -0
  58. package/dist/mixin-registry.d.ts.map +1 -0
  59. package/dist/mixin-registry.js +60 -0
  60. package/dist/mixin-registry.js.map +1 -0
  61. package/dist/model-ref.d.ts +22 -0
  62. package/dist/model-ref.d.ts.map +1 -0
  63. package/dist/model-ref.js +46 -0
  64. package/dist/model-ref.js.map +1 -0
  65. package/dist/pending-buffer.d.ts +46 -0
  66. package/dist/pending-buffer.d.ts.map +1 -0
  67. package/dist/pending-buffer.js +131 -0
  68. package/dist/pending-buffer.js.map +1 -0
  69. package/dist/platform-registry.d.ts +40 -0
  70. package/dist/platform-registry.d.ts.map +1 -0
  71. package/dist/platform-registry.js +64 -0
  72. package/dist/platform-registry.js.map +1 -0
  73. package/dist/plugin-activation.d.ts +43 -0
  74. package/dist/plugin-activation.d.ts.map +1 -0
  75. package/dist/plugin-activation.js +172 -0
  76. package/dist/plugin-activation.js.map +1 -0
  77. package/dist/plugin-topology.d.ts +40 -0
  78. package/dist/plugin-topology.d.ts.map +1 -0
  79. package/dist/plugin-topology.js +126 -0
  80. package/dist/plugin-topology.js.map +1 -0
  81. package/dist/plugin.d.ts +184 -0
  82. package/dist/plugin.d.ts.map +1 -0
  83. package/dist/plugin.js +549 -0
  84. package/dist/plugin.js.map +1 -0
  85. package/dist/providers.d.ts +85 -0
  86. package/dist/providers.d.ts.map +1 -0
  87. package/dist/providers.js +2 -0
  88. package/dist/providers.js.map +1 -0
  89. package/dist/semver-mini.d.ts +20 -0
  90. package/dist/semver-mini.d.ts.map +1 -0
  91. package/dist/semver-mini.js +94 -0
  92. package/dist/semver-mini.js.map +1 -0
  93. package/dist/service-helpers.d.ts +34 -0
  94. package/dist/service-helpers.d.ts.map +1 -0
  95. package/dist/service-helpers.js +68 -0
  96. package/dist/service-helpers.js.map +1 -0
  97. package/dist/service.d.ts +145 -0
  98. package/dist/service.d.ts.map +1 -0
  99. package/dist/service.js +279 -0
  100. package/dist/service.js.map +1 -0
  101. package/dist/types/agent.d.ts +51 -0
  102. package/dist/types/agent.d.ts.map +1 -0
  103. package/dist/types/agent.js +3 -0
  104. package/dist/types/agent.js.map +1 -0
  105. package/dist/types/app.d.ts +74 -0
  106. package/dist/types/app.d.ts.map +1 -0
  107. package/dist/types/app.js +3 -0
  108. package/dist/types/app.js.map +1 -0
  109. package/dist/types/archive.d.ts +59 -0
  110. package/dist/types/archive.d.ts.map +1 -0
  111. package/dist/types/archive.js +16 -0
  112. package/dist/types/archive.js.map +1 -0
  113. package/dist/types/authority.d.ts +63 -0
  114. package/dist/types/authority.d.ts.map +1 -0
  115. package/dist/types/authority.js +3 -0
  116. package/dist/types/authority.js.map +1 -0
  117. package/dist/types/capabilities.d.ts +53 -0
  118. package/dist/types/capabilities.d.ts.map +1 -0
  119. package/dist/types/capabilities.js +87 -0
  120. package/dist/types/capabilities.js.map +1 -0
  121. package/dist/types/cli.d.ts +14 -0
  122. package/dist/types/cli.d.ts.map +1 -0
  123. package/dist/types/cli.js +3 -0
  124. package/dist/types/cli.js.map +1 -0
  125. package/dist/types/commands.d.ts +98 -0
  126. package/dist/types/commands.d.ts.map +1 -0
  127. package/dist/types/commands.js +3 -0
  128. package/dist/types/commands.js.map +1 -0
  129. package/dist/types/core.d.ts +117 -0
  130. package/dist/types/core.d.ts.map +1 -0
  131. package/dist/types/core.js +6 -0
  132. package/dist/types/core.js.map +1 -0
  133. package/dist/types/disposable-service.d.ts +31 -0
  134. package/dist/types/disposable-service.d.ts.map +1 -0
  135. package/dist/types/disposable-service.js +3 -0
  136. package/dist/types/disposable-service.js.map +1 -0
  137. package/dist/types/embedding.d.ts +7 -0
  138. package/dist/types/embedding.d.ts.map +1 -0
  139. package/dist/types/embedding.js +3 -0
  140. package/dist/types/embedding.js.map +1 -0
  141. package/dist/types/flow-control.d.ts +51 -0
  142. package/dist/types/flow-control.d.ts.map +1 -0
  143. package/dist/types/flow-control.js +12 -0
  144. package/dist/types/flow-control.js.map +1 -0
  145. package/dist/types/gateway.d.ts +24 -0
  146. package/dist/types/gateway.d.ts.map +1 -0
  147. package/dist/types/gateway.js +15 -0
  148. package/dist/types/gateway.js.map +1 -0
  149. package/dist/types/hooks.d.ts +3 -0
  150. package/dist/types/hooks.d.ts.map +1 -0
  151. package/dist/types/hooks.js +18 -0
  152. package/dist/types/hooks.js.map +1 -0
  153. package/dist/types/image-recognition.d.ts +123 -0
  154. package/dist/types/image-recognition.d.ts.map +1 -0
  155. package/dist/types/image-recognition.js +31 -0
  156. package/dist/types/image-recognition.js.map +1 -0
  157. package/dist/types/index.d.ts +8 -0
  158. package/dist/types/index.d.ts.map +1 -0
  159. package/dist/types/index.js +17 -0
  160. package/dist/types/index.js.map +1 -0
  161. package/dist/types/llm.d.ts +146 -0
  162. package/dist/types/llm.d.ts.map +1 -0
  163. package/dist/types/llm.js +27 -0
  164. package/dist/types/llm.js.map +1 -0
  165. package/dist/types/memory.d.ts +62 -0
  166. package/dist/types/memory.d.ts.map +1 -0
  167. package/dist/types/memory.js +22 -0
  168. package/dist/types/memory.js.map +1 -0
  169. package/dist/types/persona.d.ts +45 -0
  170. package/dist/types/persona.d.ts.map +1 -0
  171. package/dist/types/persona.js +3 -0
  172. package/dist/types/persona.js.map +1 -0
  173. package/dist/types/platform.d.ts +126 -0
  174. package/dist/types/platform.d.ts.map +1 -0
  175. package/dist/types/platform.js +5 -0
  176. package/dist/types/platform.js.map +1 -0
  177. package/dist/types/plugin.d.ts +84 -0
  178. package/dist/types/plugin.d.ts.map +1 -0
  179. package/dist/types/plugin.js +24 -0
  180. package/dist/types/plugin.js.map +1 -0
  181. package/dist/types/service.d.ts +43 -0
  182. package/dist/types/service.d.ts.map +1 -0
  183. package/dist/types/service.js +38 -0
  184. package/dist/types/service.js.map +1 -0
  185. package/dist/types/services.d.ts +17 -0
  186. package/dist/types/services.d.ts.map +1 -0
  187. package/dist/types/services.js +41 -0
  188. package/dist/types/services.js.map +1 -0
  189. package/dist/types/session.d.ts +153 -0
  190. package/dist/types/session.d.ts.map +1 -0
  191. package/dist/types/session.js +19 -0
  192. package/dist/types/session.js.map +1 -0
  193. package/dist/types/storage.d.ts +100 -0
  194. package/dist/types/storage.d.ts.map +1 -0
  195. package/dist/types/storage.js +29 -0
  196. package/dist/types/storage.js.map +1 -0
  197. package/dist/types/tools.d.ts +39 -0
  198. package/dist/types/tools.d.ts.map +1 -0
  199. package/dist/types/tools.js +3 -0
  200. package/dist/types/tools.js.map +1 -0
  201. package/dist/types/trigger-policy.d.ts +16 -0
  202. package/dist/types/trigger-policy.d.ts.map +1 -0
  203. package/dist/types/trigger-policy.js +6 -0
  204. package/dist/types/trigger-policy.js.map +1 -0
  205. package/dist/types/vectorstore.d.ts +23 -0
  206. package/dist/types/vectorstore.d.ts.map +1 -0
  207. package/dist/types/vectorstore.js +3 -0
  208. package/dist/types/vectorstore.js.map +1 -0
  209. package/dist/types/web-search.d.ts +88 -0
  210. package/dist/types/web-search.d.ts.map +1 -0
  211. package/dist/types/web-search.js +23 -0
  212. package/dist/types/web-search.js.map +1 -0
  213. package/dist/types/webui.d.ts +137 -0
  214. package/dist/types/webui.d.ts.map +1 -0
  215. package/dist/types/webui.js +3 -0
  216. package/dist/types/webui.js.map +1 -0
  217. package/package.json +22 -0
package/README.md ADDED
@@ -0,0 +1,21 @@
1
+ # @aalis/core
2
+
3
+ Aalis 内核:Context / Service / Plugin / Config 等基础设施
4
+
5
+ ## 角色
6
+
7
+ Aalis 内核:Context / Service / Plugin / Config 等基础设施
8
+
9
+ ## 安装
10
+
11
+ ```bash
12
+ pnpm add @aalis/core
13
+ ```
14
+
15
+ ## 使用
16
+
17
+ 参考 [docs/architecture.md](../../docs/architecture.md) 与 [docs/guide/third-party-plugin.md](../../docs/guide/third-party-plugin.md)。
18
+
19
+ ## 许可
20
+
21
+ 见仓库根目录 LICENSE。
package/dist/app.d.ts ADDED
@@ -0,0 +1,166 @@
1
+ import { type AalisConfig, ConfigManager } from './config.js';
2
+ import { Context } from './context.js';
3
+ import { EventBus } from './events.js';
4
+ import { HookRegistry } from './hooks.js';
5
+ import { type Logger, LogHub } from './logger.js';
6
+ import { PluginManager, type PluginModule } from './plugin.js';
7
+ import type { ConfigProvider, PluginLoader, RestartStrategy } from './providers.js';
8
+ import { ServiceContainer } from './service.js';
9
+ /**
10
+ * App 构造选项
11
+ *
12
+ * core 不感知"文件系统 / 进程 / 终端"等任何 I/O 概念——这些通过 provider 注入:
13
+ * - `config`:当前配置快照(必填;由宿主从任意来源加载好传进来)
14
+ * - `configProvider`:可选,提供 save() / watch() 能力;省略则配置只读
15
+ * - `pluginLoader`:可选,提供插件发现+导入;省略则 `autoLoadPlugins()` 为 no-op
16
+ * - `restartStrategy`:可选,提供重启实现;省略则 `restart()` 抛错
17
+ *
18
+ * 所有内核子系统(events / services / hooks / config)均可注入自定义实例,
19
+ * 用于沙盒/测试/多实例场景。
20
+ */
21
+ export interface AppOptions {
22
+ /**
23
+ * 配置快照——必填。
24
+ * 测试可直接传字面量 `{ name: 'X', logLevel: 'error', plugins: {} }`;
25
+ * 生产入口由宿主从文件/URL/远端加载后传入。
26
+ *
27
+ * 也接受已构造好的 `ConfigManager`(沙盒共享、scope 等场景)。
28
+ */
29
+ config: AalisConfig | ConfigManager;
30
+ /** 配置持久化与外部变更监听;缺省=只读内存模式 */
31
+ configProvider?: ConfigProvider;
32
+ /** 业务数据目录(plugin 用作相对路径基准) */
33
+ dataDir?: string;
34
+ /** 插件加载器;缺省=不自动加载任何插件(必须通过 `app.plugin(mod)` 手动注册) */
35
+ pluginLoader?: PluginLoader;
36
+ /** 重启策略;缺省=`restart()` 抛错 */
37
+ restartStrategy?: RestartStrategy;
38
+ /** 注入自定义事件总线 */
39
+ events?: EventBus;
40
+ /** 注入自定义服务容器 */
41
+ services?: ServiceContainer;
42
+ /** 注入自定义钩子注册表 */
43
+ hooks?: HookRegistry;
44
+ /**
45
+ * 注入自定义 LogHub。多 App 沙盒 / 集成测试 / 嵌入多实例场景下
46
+ * 可以传入 `new LogHub()`使每个 App 拥有独立的日志通道,不互相串台。
47
+ * 缺省 = `LogHub.default`(进程级共享,runtime sink 默认订阅的也是它)。
48
+ */
49
+ logHub?: LogHub;
50
+ /**
51
+ * 注入自定义 Logger 实现(如 pino/winston 适配对象)。
52
+ * 注入后 core 不再写 LogHub 管线——runtime 的 console/file/webui sink
53
+ * 监听的是 LogHub,是否对接由注入方自理。缺省 = DefaultLogger(写入 logHub)。
54
+ */
55
+ logger?: Logger;
56
+ /**
57
+ * 必需服务列表——这些服务必须至少有一个提供者在运行。
58
+ * 默认 `[]`,core 不假设任何具体服务存在。
59
+ */
60
+ requiredServices?: string[];
61
+ /**
62
+ * 插件配置同步政策。`trimUnknownFields=false` 时 `syncPluginDefaults`
63
+ * 保留 configSchema 之外的未知字段(默认 `true`:按 schema 裁剪)。
64
+ * 仅在传入配置快照时生效;传入现成 ConfigManager 时政策属于该实例自身。
65
+ */
66
+ configSync?: {
67
+ trimUnknownFields?: boolean;
68
+ };
69
+ /**
70
+ * 必需服务恢复政策。`autoEnableDisabled=false` 时恢复路径不会自动启用
71
+ * 被用户禁用的提供者插件(默认 `true`:"必需服务可用"压过"尊重禁用")。
72
+ */
73
+ serviceRecovery?: {
74
+ autoEnableDisabled?: boolean;
75
+ };
76
+ /**
77
+ * 开发模式开关——传递给根 Context,决定 `provide` 是否跑能力探测。
78
+ * 默认 `true`(dev-safe);生产宿主应显式传入 `false` 跳过热路径开销。
79
+ * core 不读 `process.env`,完全以宿主传入为准。
80
+ */
81
+ devMode?: boolean;
82
+ }
83
+ /**
84
+ * 创建 App 实例的工厂函数。
85
+ *
86
+ * @example
87
+ * // 浏览器/嵌入式:内存配置 + 内存插件加载
88
+ * const app = createApp({
89
+ * config: { name: 'embedded', logLevel: 'info', plugins: {} },
90
+ * pluginLoader: bundledLoader([memoryPlugin, agentPlugin]),
91
+ * });
92
+ *
93
+ * // Node 宿主由 src/runtime 提供 fs/yaml/spawn 实现
94
+ */
95
+ export declare function createApp(options: AppOptions): App;
96
+ /**
97
+ * Aalis 应用主容器
98
+ *
99
+ * core 的"内核"——只持有内存中的抽象(events / services / hooks / config / plugins),
100
+ * 不接触任何外部 I/O。所有 I/O 通过 `AppOptions` 注入的 provider 完成。
101
+ */
102
+ export declare class App {
103
+ readonly ctx: Context;
104
+ readonly plugins: PluginManager;
105
+ readonly logger: Logger;
106
+ readonly events: EventBus;
107
+ readonly services: ServiceContainer;
108
+ readonly hooks: HookRegistry;
109
+ readonly requiredServices: readonly string[];
110
+ private readonly pluginLoader?;
111
+ private readonly restartStrategy?;
112
+ /** 已发现插件的描述符索引(按模块名)。用于热重载时拿到 source/metadata。 */
113
+ private readonly discoveredCache;
114
+ constructor(options: AppOptions);
115
+ /**
116
+ * 注册插件
117
+ *
118
+ * @param module 插件模块
119
+ * @param config 插件配置(覆盖文件配置)
120
+ * @param instanceId 实例 ID(多实例时为 `name:suffix`,留空则使用 module.name)
121
+ */
122
+ plugin(module: PluginModule, config?: Record<string, unknown>, instanceId?: string): Promise<void>;
123
+ /**
124
+ * 通过 `pluginLoader` 自动加载所有发现的插件。
125
+ * 未注入 loader 时为 no-op,调用方需自行 `app.plugin(mod)` 手动注册。
126
+ */
127
+ autoLoadPlugins(): Promise<void>;
128
+ /**
129
+ * 重新扫描插件源,加载新发现的插件(已注册的跳过)。
130
+ * 返回新加载的插件名列表。
131
+ *
132
+ * 优先调用 `pluginLoader.reload(desc)` 实现热重载(loader 可做缓存失效);
133
+ * 未实现 reload 时退化到普通 `load(desc)`。
134
+ */
135
+ rescanPlugins(): Promise<string[]>;
136
+ /**
137
+ * 保存当前配置(委托给 configProvider;无 provider 时静默忽略)。
138
+ */
139
+ saveConfig(): void;
140
+ /**
141
+ * 配置外部变更时的处理:重新计算各插件配置并热重载差异。
142
+ */
143
+ private handleConfigFileChanged;
144
+ /**
145
+ * 启动应用
146
+ */
147
+ start(): Promise<void>;
148
+ /**
149
+ * 重启应用——委托给 `restartStrategy`。
150
+ *
151
+ * core 只负责发出 `restarting` 事件并把 `stop` 回调交给策略;
152
+ * **任何"等响应返回"的延迟、stop 与 restart 的顺序都由策略决定**。
153
+ *
154
+ * 未注入策略时抛错(明确暴露"嵌入式宿主没声明重启能力"的事实)。
155
+ */
156
+ restart(): void;
157
+ /**
158
+ * 停止应用
159
+ */
160
+ stop(): Promise<void>;
161
+ /**
162
+ * 检查核心必需服务是否就绪,缺失时自动寻找并启动提供者
163
+ */
164
+ private ensureRequiredServices;
165
+ }
166
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
package/dist/app.js ADDED
@@ -0,0 +1,348 @@
1
+ import { ConfigManager } from './config.js';
2
+ import { Context } from './context.js';
3
+ import { EventBus } from './events.js';
4
+ import { HookRegistry } from './hooks.js';
5
+ import { DefaultLogger, LogHub } from './logger.js';
6
+ import { PluginManager, parseInstanceId } from './plugin.js';
7
+ import { ServiceContainer } from './service.js';
8
+ /**
9
+ * 创建 App 实例的工厂函数。
10
+ *
11
+ * @example
12
+ * // 浏览器/嵌入式:内存配置 + 内存插件加载
13
+ * const app = createApp({
14
+ * config: { name: 'embedded', logLevel: 'info', plugins: {} },
15
+ * pluginLoader: bundledLoader([memoryPlugin, agentPlugin]),
16
+ * });
17
+ *
18
+ * // Node 宿主由 src/runtime 提供 fs/yaml/spawn 实现
19
+ */
20
+ export function createApp(options) {
21
+ return new App(options);
22
+ }
23
+ /**
24
+ * Aalis 应用主容器
25
+ *
26
+ * core 的"内核"——只持有内存中的抽象(events / services / hooks / config / plugins),
27
+ * 不接触任何外部 I/O。所有 I/O 通过 `AppOptions` 注入的 provider 完成。
28
+ */
29
+ export class App {
30
+ ctx;
31
+ plugins;
32
+ logger;
33
+ events;
34
+ services;
35
+ hooks;
36
+ requiredServices;
37
+ pluginLoader;
38
+ restartStrategy;
39
+ /** 已发现插件的描述符索引(按模块名)。用于热重载时拿到 source/metadata。 */
40
+ discoveredCache = new Map();
41
+ constructor(options) {
42
+ // 1. 配置:接受快照或已构造的 ConfigManager
43
+ const config = options.config instanceof ConfigManager
44
+ ? options.config
45
+ : new ConfigManager(options.config, {
46
+ provider: options.configProvider,
47
+ dataDir: options.dataDir,
48
+ trimUnknownFields: options.configSync?.trimUnknownFields,
49
+ });
50
+ this.events = options.events ?? new EventBus();
51
+ // 'ready' / 'app:started' 是"应用启动完成"里程碑:app.start() 仅 emit
52
+ // 一次,但插件配置热重载会触发 bouncePlugin → 新插件实例的
53
+ // ctx.on('ready'/'app:started', ...) 必须也能拿到通知,否则 adapter /
54
+ // CLI TUI 等"在启动后才建立"的逻辑在 bounce 后就永远不会重新执行。
55
+ // 标记为 sticky 后,bounce 出来的新实例注册 listener 时立即被微任务补发一次。
56
+ this.events.markSticky('ready');
57
+ this.events.markSticky('app:started');
58
+ this.services = options.services ?? new ServiceContainer();
59
+ this.hooks = options.hooks ?? new HookRegistry();
60
+ this.logger =
61
+ options.logger ??
62
+ new DefaultLogger('aalis', config.get('logLevel'), options.logHub ?? LogHub.default);
63
+ // EventBus 保持环境无关不持有 Logger,handler 错误经此回调上报。
64
+ // 外部注入的 bus 若已自带上报器则尊重之(??=)。
65
+ this.events.onHandlerError ??= (event, err) => {
66
+ this.logger.warn(`事件 "${event}" 的监听器抛错(已隔离):`, err);
67
+ };
68
+ this.pluginLoader = options.pluginLoader;
69
+ this.restartStrategy = options.restartStrategy;
70
+ // 2. 根上下文
71
+ this.ctx = new Context({
72
+ id: 'root',
73
+ events: this.events,
74
+ services: this.services,
75
+ hooks: this.hooks,
76
+ logger: this.logger,
77
+ config,
78
+ devMode: options.devMode ?? true,
79
+ });
80
+ // 3. 插件管理器
81
+ this.plugins = new PluginManager(this.ctx, this.logger);
82
+ this.requiredServices = options.requiredServices ?? [];
83
+ this.plugins.requiredServices = this.requiredServices;
84
+ this.plugins.recoveryPolicy = { autoEnableDisabled: options.serviceRecovery?.autoEnableDisabled ?? true };
85
+ // 4. 注册核心服务
86
+ this.ctx.provide('app', this, { capabilities: ['lifecycle', 'config'] });
87
+ this.ctx.provide('plugins', this.plugins, { capabilities: ['plugin-mgmt'] });
88
+ // 5. 应用启动时已存在的服务偏好
89
+ const initialPrefs = config.getServicePreferences();
90
+ for (const [svcName, ctxId] of Object.entries(initialPrefs)) {
91
+ this.ctx.preferService(svcName, ctxId);
92
+ }
93
+ // 6. 服务偏好诊断日志
94
+ this.ctx.on('service:registered', svcName => {
95
+ const pref = config.getServicePreferences()[svcName];
96
+ if (pref) {
97
+ this.logger.debug(`服务 "${svcName}" 注册时存在用户偏好: ${pref}`);
98
+ }
99
+ });
100
+ // 7. 必需服务掉线自动恢复
101
+ this.ctx.on('service:unregistered', async (name) => {
102
+ if (!this.requiredServices.includes(name))
103
+ return;
104
+ if (this.ctx.hasService(name))
105
+ return;
106
+ this.logger.warn(`必需服务 "${name}" 被卸载,尝试自动恢复...`);
107
+ const activated = await this.plugins.ensureServiceProvider(name);
108
+ if (activated) {
109
+ this.logger.info(`必需服务 "${name}" 已通过插件 "${activated}" 恢复`);
110
+ }
111
+ else if (!this.ctx.hasService(name)) {
112
+ this.logger.error(`必需服务 "${name}" 自动恢复失败!`);
113
+ }
114
+ });
115
+ this.logger.info(`Aalis v0.1.0 - ${config.get('name')}`);
116
+ }
117
+ /**
118
+ * 注册插件
119
+ *
120
+ * @param module 插件模块
121
+ * @param config 插件配置(覆盖文件配置)
122
+ * @param instanceId 实例 ID(多实例时为 `name:suffix`,留空则使用 module.name)
123
+ */
124
+ async plugin(module, config, instanceId) {
125
+ const id = instanceId ?? module.name;
126
+ // 合并优先级: 插件默认配置 ← 配置文件 ← 代码传入
127
+ const defaults = module.defaultConfig ?? {};
128
+ const fileConfig = this.ctx.config.getPluginConfig(id);
129
+ const mergedConfig = { ...defaults, ...fileConfig, ...config };
130
+ await this.plugins.register(module, mergedConfig, id);
131
+ }
132
+ /**
133
+ * 通过 `pluginLoader` 自动加载所有发现的插件。
134
+ * 未注入 loader 时为 no-op,调用方需自行 `app.plugin(mod)` 手动注册。
135
+ */
136
+ async autoLoadPlugins() {
137
+ if (!this.pluginLoader) {
138
+ this.logger.debug('未注入 pluginLoader,跳过自动加载');
139
+ return;
140
+ }
141
+ const discovered = await this.pluginLoader.discover();
142
+ this.logger.info(`发现 ${discovered.length} 个插件`);
143
+ // 按模块名索引(用于多实例查找)
144
+ const loadedModules = new Map();
145
+ // 加载所有模块(M2 后无 Context.extend 顶层副作用,单次遍历即可:加载并立即注册激活)
146
+ for (const desc of discovered) {
147
+ this.discoveredCache.set(desc.name, desc);
148
+ try {
149
+ const mod = await this.pluginLoader.load(desc);
150
+ if (!mod || typeof mod.apply !== 'function' || !mod.name) {
151
+ this.logger.debug(`跳过非插件模块: ${desc.name}(缺少 name 或 apply)`);
152
+ continue;
153
+ }
154
+ loadedModules.set(mod.name, mod);
155
+ try {
156
+ await this.plugin(mod);
157
+ }
158
+ catch (err) {
159
+ const message = err instanceof Error ? err.message : String(err);
160
+ this.logger.error(`注册插件 "${mod.name}" 失败: ${message}`);
161
+ }
162
+ }
163
+ catch (err) {
164
+ const message = err instanceof Error ? err.message : String(err);
165
+ this.logger.error(`加载插件 "${desc.name}" 失败: ${message}`);
166
+ }
167
+ }
168
+ // 扫描配置中的多实例条目(name:suffix 格式)
169
+ const pluginConfigs = this.ctx.config.get('plugins') ?? {};
170
+ for (const configKey of Object.keys(pluginConfigs)) {
171
+ const { moduleName, suffix } = parseInstanceId(configKey);
172
+ if (!suffix)
173
+ continue;
174
+ const mod = loadedModules.get(moduleName);
175
+ if (!mod) {
176
+ this.logger.warn(`多实例配置 "${configKey}" 对应的模块 "${moduleName}" 未找到,跳过`);
177
+ continue;
178
+ }
179
+ if (!mod.reusable) {
180
+ this.logger.warn(`插件 "${moduleName}" 未声明 reusable,跳过多实例 "${configKey}"`);
181
+ continue;
182
+ }
183
+ try {
184
+ await this.plugin(mod, undefined, configKey);
185
+ }
186
+ catch (err) {
187
+ const message = err instanceof Error ? err.message : String(err);
188
+ this.logger.error(`加载多实例插件 "${configKey}" 失败: ${message}`);
189
+ }
190
+ }
191
+ // 同步插件 defaultConfig
192
+ const changed = this.ctx.config.syncPluginDefaults(this.plugins.getStatus());
193
+ for (const id of changed)
194
+ this.logger.debug(`同步插件配置: ${id}`);
195
+ if (changed.length > 0)
196
+ this.logger.info('已将插件配置同步到配置文件');
197
+ }
198
+ /**
199
+ * 重新扫描插件源,加载新发现的插件(已注册的跳过)。
200
+ * 返回新加载的插件名列表。
201
+ *
202
+ * 优先调用 `pluginLoader.reload(desc)` 实现热重载(loader 可做缓存失效);
203
+ * 未实现 reload 时退化到普通 `load(desc)`。
204
+ */
205
+ async rescanPlugins() {
206
+ if (!this.pluginLoader)
207
+ return [];
208
+ const discovered = await this.pluginLoader.discover();
209
+ const loaded = [];
210
+ for (const desc of discovered) {
211
+ this.discoveredCache.set(desc.name, desc);
212
+ // 跳过已注册的
213
+ if (this.plugins.getPlugin(desc.name))
214
+ continue;
215
+ try {
216
+ const mod = this.pluginLoader.reload
217
+ ? await this.pluginLoader.reload(desc)
218
+ : await this.pluginLoader.load(desc);
219
+ if (!mod || typeof mod.apply !== 'function' || !mod.name) {
220
+ this.logger.debug(`跳过非插件模块: ${desc.name}`);
221
+ continue;
222
+ }
223
+ await this.plugin(mod);
224
+ loaded.push(desc.name);
225
+ this.logger.info(`热加载插件: ${desc.name}`);
226
+ }
227
+ catch (err) {
228
+ const message = err instanceof Error ? err.message : String(err);
229
+ this.logger.error(`热加载插件 "${desc.name}" 失败: ${message}`);
230
+ }
231
+ }
232
+ return loaded;
233
+ }
234
+ /**
235
+ * 保存当前配置(委托给 configProvider;无 provider 时静默忽略)。
236
+ */
237
+ saveConfig() {
238
+ this.ctx.config.save();
239
+ this.logger.info('配置已保存');
240
+ }
241
+ /**
242
+ * 配置外部变更时的处理:重新计算各插件配置并热重载差异。
243
+ */
244
+ async handleConfigFileChanged() {
245
+ this.logger.info('检测到配置变更,正在热重载...');
246
+ try {
247
+ // 先按与启动路径相同的政策同步一遍(补 defaultConfig 缺失字段 +
248
+ // 按 trimUnknownFields 裁剪 schema 外字段)——否则热重载读入的
249
+ // 原始快照会绕过政策,内存态与启动态在字段清理上不一致。
250
+ const synced = this.ctx.config.syncPluginDefaults(this.plugins.getStatus());
251
+ for (const id of synced)
252
+ this.logger.debug(`热重载配置同步: ${id}`);
253
+ let changed = false;
254
+ for (const p of this.plugins.getStatus()) {
255
+ const defaults = p.defaultConfig ?? {};
256
+ const fileConfig = this.ctx.config.getPluginConfig(p.instanceId);
257
+ const newConfig = { ...defaults, ...fileConfig };
258
+ if (JSON.stringify(newConfig) !== JSON.stringify(p.config)) {
259
+ this.logger.info(`插件 ${p.instanceId} 配置已变更,正在重新加载...`);
260
+ await this.plugins.updatePluginConfig(p.instanceId, newConfig);
261
+ changed = true;
262
+ }
263
+ }
264
+ if (changed) {
265
+ await this.ctx.emit('plugins:changed');
266
+ }
267
+ this.logger.info('配置热重载完成');
268
+ }
269
+ catch (e) {
270
+ this.logger.error('配置热重载失败:', e);
271
+ }
272
+ }
273
+ /**
274
+ * 启动应用
275
+ */
276
+ async start() {
277
+ this.logger.info('正在启动...');
278
+ await this.ctx.emit('app:starting');
279
+ await this.ensureRequiredServices();
280
+ // 注:消息路由由 @aalis/plugin-gateway 承担。
281
+ await this.ctx.emit('ready');
282
+ // 监听配置外部变更(provider 不支持 watch 时为 no-op)
283
+ this.ctx.config.watch(() => this.handleConfigFileChanged());
284
+ this.logger.info('启动完成');
285
+ await this.ctx.emit('app:started');
286
+ }
287
+ /**
288
+ * 重启应用——委托给 `restartStrategy`。
289
+ *
290
+ * core 只负责发出 `restarting` 事件并把 `stop` 回调交给策略;
291
+ * **任何"等响应返回"的延迟、stop 与 restart 的顺序都由策略决定**。
292
+ *
293
+ * 未注入策略时抛错(明确暴露"嵌入式宿主没声明重启能力"的事实)。
294
+ */
295
+ restart() {
296
+ if (!this.restartStrategy) {
297
+ throw new Error('App.restart() 不可用:未注入 restartStrategy。');
298
+ }
299
+ const strategy = this.restartStrategy;
300
+ // 防御性清掉全部 sticky 缓存('ready' + 'app:started'):strategy 可能走
301
+ // "快速重启"路径不调 stop(),此时新一轮启动期间的早期订阅者会收到上一轮
302
+ // 的 sticky 信号。stop() 内部会再清一次,重复调用无副作用。
303
+ this.events.clearSticky();
304
+ this.ctx
305
+ .emit('restarting')
306
+ .then(() => strategy.restart({ stop: () => this.stop() }))
307
+ .catch(err => {
308
+ this.logger.warn(`restart 失败: ${err}`);
309
+ });
310
+ }
311
+ /**
312
+ * 停止应用
313
+ */
314
+ async stop() {
315
+ this.logger.info('正在停止...');
316
+ this.ctx.config.unwatch();
317
+ await this.ctx.emit('app:stopping');
318
+ // 先按拓扑逆序 dispose 所有 active 插件——消费者先关,提供者后关——这样下游
319
+ // 插件的 ctx.onDispose 还能安全访问其依赖的服务。stopAll 会置位 shuttingDown,
320
+ // 屏蔽反应式 service:unregistered 级联,避免无意义 bounce 噪声。
321
+ await this.plugins.stopAll();
322
+ // 清掉全部 sticky 缓存('ready' + 'app:started'),防止后续 restart
323
+ // 复用过时的"已启动"标记
324
+ this.events.clearSticky();
325
+ this.ctx.dispose();
326
+ this.logger.info('已停止');
327
+ }
328
+ /**
329
+ * 检查核心必需服务是否就绪,缺失时自动寻找并启动提供者
330
+ */
331
+ async ensureRequiredServices() {
332
+ for (const service of this.requiredServices) {
333
+ if (this.ctx.hasService(service)) {
334
+ this.logger.debug(`必需服务 "${service}" 已就绪`);
335
+ continue;
336
+ }
337
+ this.logger.warn(`必需服务 "${service}" 未就绪,尝试自动恢复...`);
338
+ const activated = await this.plugins.ensureServiceProvider(service);
339
+ if (activated) {
340
+ this.logger.info(`必需服务 "${service}" 已通过插件 "${activated}" 恢复`);
341
+ }
342
+ else {
343
+ this.logger.error(`必需服务 "${service}" 无法恢复!系统功能将受限。`);
344
+ }
345
+ }
346
+ }
347
+ }
348
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}