@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
@@ -0,0 +1,64 @@
1
+ import type { AalisEvents } from './types/index.js';
2
+ type EventHandler<Args extends unknown[]> = (...args: Args) => void | Promise<void>;
3
+ /**
4
+ * 类型安全的事件总线
5
+ *
6
+ * 内置事件使用 AalisEvents 接口提供类型推导。
7
+ * 第三方插件可以通过 TS declaration merging 扩展 AalisEvents,
8
+ * 也可以使用任意字符串 key 注册/触发自定义事件(运行时安全)。
9
+ */
10
+ export declare class EventBus {
11
+ private handlers;
12
+ /**
13
+ * handler 抛错时的上报回调(含 sticky 补发路径的同步/异步抛错)。
14
+ *
15
+ * EventBus 自身不依赖 Logger(保持环境无关);宿主(App)在构造后
16
+ * 注入一个指向自己 logger 的上报器。未设置时错误被静默丢弃——
17
+ * 但无论是否设置,单个 handler 抛错都**不会**中断同事件的其余 handler,
18
+ * 也不会使 emit reject。
19
+ */
20
+ onHandlerError?: (event: string, error: unknown) => void;
21
+ private reportHandlerError;
22
+ /**
23
+ * 一次性事件(sticky):emit 后保留最近一次参数;后续 on/once 监听该事件时
24
+ * 立即用缓存参数同步触发回调。用于"应用生命周期里只发一次的里程碑事件",
25
+ * 让被热重载的插件在 reactivate 后仍能拿到启动通知。
26
+ * 当前标记为 sticky 的事件:'ready'、'app:started'。
27
+ *
28
+ * - 注册:`markSticky(event)` 由 App 在构造时调用
29
+ * - 清除:`clearSticky(event)` 由 App.restart()/stop() 在复用实例时调用,
30
+ * 避免下一轮启动时被旧的 sticky 参数误触发
31
+ */
32
+ private stickyArgs;
33
+ private stickyEvents;
34
+ markSticky(event: string): void;
35
+ clearSticky(event?: string): void;
36
+ /**
37
+ * 监听事件,返回 dispose 函数
38
+ *
39
+ * 若该事件已被标记为 sticky 且历史上 emit 过,则在下一个微任务里
40
+ * 立即用缓存的参数调用 handler 一次(保证语义同步:调用方注册完返回后
41
+ * 再触发,避免 handler 内部的 await 影响调用方流程)。
42
+ */
43
+ on<E extends string & keyof AalisEvents>(event: E, handler: EventHandler<AalisEvents[E]>): () => void;
44
+ /**
45
+ * 监听事件一次
46
+ */
47
+ once<E extends string & keyof AalisEvents>(event: E, handler: EventHandler<AalisEvents[E]>): () => void;
48
+ /**
49
+ * 触发事件,按注册顺序依次调用,支持异步 handler。
50
+ *
51
+ * Per-handler 隔离:单个 handler 抛错(同步或异步)只影响它自己——
52
+ * 错误经 {@link onHandlerError} 上报,其余 handler 照常执行,emit 始终 resolve。
53
+ * 事件是"通知多方"语义,一个旁观者失败不该连坐其他订阅者,更不该
54
+ * 反向把失败传染给发射方(如 plugin:loaded 的 emit 不能把刚激活成功的
55
+ * 插件打成 error 终态)。
56
+ */
57
+ emit<E extends string & keyof AalisEvents>(event: E, ...args: AalisEvents[E]): Promise<void>;
58
+ /**
59
+ * 移除指定事件的所有监听器
60
+ */
61
+ removeAll(event?: string): void;
62
+ }
63
+ export {};
64
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,KAAK,YAAY,CAAC,IAAI,SAAS,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEpF;;;;;;GAMG;AACH,qBAAa,QAAQ;IAEnB,OAAO,CAAC,QAAQ,CAA6C;IAE7D;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAEzD,OAAO,CAAC,kBAAkB;IAa1B;;;;;;;;;OASG;IAEH,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,YAAY,CAAqB;IAEzC,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI/B,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAQjC;;;;;;OAMG;IACH,EAAE,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAgCrG;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IASvG;;;;;;;;OAQG;IACG,IAAI,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBlG;;OAEG;IACH,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;CAOhC"}
package/dist/events.js ADDED
@@ -0,0 +1,145 @@
1
+ /**
2
+ * 类型安全的事件总线
3
+ *
4
+ * 内置事件使用 AalisEvents 接口提供类型推导。
5
+ * 第三方插件可以通过 TS declaration merging 扩展 AalisEvents,
6
+ * 也可以使用任意字符串 key 注册/触发自定义事件(运行时安全)。
7
+ */
8
+ export class EventBus {
9
+ // biome-ignore lint/suspicious/noExplicitAny: 泛型擦除场景,handlers 容器持有不同事件类型,运行时按事件名分发
10
+ handlers = new Map();
11
+ /**
12
+ * handler 抛错时的上报回调(含 sticky 补发路径的同步/异步抛错)。
13
+ *
14
+ * EventBus 自身不依赖 Logger(保持环境无关);宿主(App)在构造后
15
+ * 注入一个指向自己 logger 的上报器。未设置时错误被静默丢弃——
16
+ * 但无论是否设置,单个 handler 抛错都**不会**中断同事件的其余 handler,
17
+ * 也不会使 emit reject。
18
+ */
19
+ onHandlerError;
20
+ reportHandlerError(event, error) {
21
+ try {
22
+ // onHandlerError 签名为 void,但运行时可能返回 promise(如异步 logger 实现)。
23
+ // 同步抛错被 catch;异步 rejection 单独吞掉,避免逃逸成 unhandledRejection(审计 #4)。
24
+ const ret = this.onHandlerError?.(event, error);
25
+ if (ret && typeof ret.then === 'function') {
26
+ ret.catch(() => { });
27
+ }
28
+ }
29
+ catch {
30
+ /* 上报器自身抛错不再向外传播 */
31
+ }
32
+ }
33
+ /**
34
+ * 一次性事件(sticky):emit 后保留最近一次参数;后续 on/once 监听该事件时
35
+ * 立即用缓存参数同步触发回调。用于"应用生命周期里只发一次的里程碑事件",
36
+ * 让被热重载的插件在 reactivate 后仍能拿到启动通知。
37
+ * 当前标记为 sticky 的事件:'ready'、'app:started'。
38
+ *
39
+ * - 注册:`markSticky(event)` 由 App 在构造时调用
40
+ * - 清除:`clearSticky(event)` 由 App.restart()/stop() 在复用实例时调用,
41
+ * 避免下一轮启动时被旧的 sticky 参数误触发
42
+ */
43
+ // biome-ignore lint/suspicious/noExplicitAny: 同上
44
+ stickyArgs = new Map();
45
+ stickyEvents = new Set();
46
+ markSticky(event) {
47
+ this.stickyEvents.add(event);
48
+ }
49
+ clearSticky(event) {
50
+ if (event) {
51
+ this.stickyArgs.delete(event);
52
+ }
53
+ else {
54
+ this.stickyArgs.clear();
55
+ }
56
+ }
57
+ /**
58
+ * 监听事件,返回 dispose 函数
59
+ *
60
+ * 若该事件已被标记为 sticky 且历史上 emit 过,则在下一个微任务里
61
+ * 立即用缓存的参数调用 handler 一次(保证语义同步:调用方注册完返回后
62
+ * 再触发,避免 handler 内部的 await 影响调用方流程)。
63
+ */
64
+ on(event, handler) {
65
+ let set = this.handlers.get(event);
66
+ if (!set) {
67
+ set = new Set();
68
+ this.handlers.set(event, set);
69
+ }
70
+ set.add(handler);
71
+ if (this.stickyEvents.has(event) && this.stickyArgs.has(event)) {
72
+ const args = this.stickyArgs.get(event);
73
+ queueMicrotask(() => {
74
+ // 注册可能在微任务执行前被立即 dispose;此时跳过补发
75
+ if (!set?.has(handler))
76
+ return;
77
+ // 补发没有 emit 调用方兜底——handler 同步抛错会直达 uncaughtException
78
+ // 崩进程,异步抛错变 unhandledRejection,必须就地捕获。
79
+ try {
80
+ const ret = handler(...args);
81
+ if (ret && typeof ret.then === 'function') {
82
+ ret.catch(err => this.reportHandlerError(event, err));
83
+ }
84
+ }
85
+ catch (err) {
86
+ this.reportHandlerError(event, err);
87
+ }
88
+ });
89
+ }
90
+ return () => {
91
+ set.delete(handler);
92
+ if (set.size === 0)
93
+ this.handlers.delete(event);
94
+ };
95
+ }
96
+ /**
97
+ * 监听事件一次
98
+ */
99
+ once(event, handler) {
100
+ const wrapper = (...args) => {
101
+ dispose();
102
+ return handler(...args);
103
+ };
104
+ const dispose = this.on(event, wrapper);
105
+ return dispose;
106
+ }
107
+ /**
108
+ * 触发事件,按注册顺序依次调用,支持异步 handler。
109
+ *
110
+ * Per-handler 隔离:单个 handler 抛错(同步或异步)只影响它自己——
111
+ * 错误经 {@link onHandlerError} 上报,其余 handler 照常执行,emit 始终 resolve。
112
+ * 事件是"通知多方"语义,一个旁观者失败不该连坐其他订阅者,更不该
113
+ * 反向把失败传染给发射方(如 plugin:loaded 的 emit 不能把刚激活成功的
114
+ * 插件打成 error 终态)。
115
+ */
116
+ async emit(event, ...args) {
117
+ if (this.stickyEvents.has(event)) {
118
+ this.stickyArgs.set(event, args);
119
+ }
120
+ const set = this.handlers.get(event);
121
+ if (!set)
122
+ return;
123
+ // 直接迭代活 Set:handler 中 dispose 尚未访问的条目会被正确跳过(Set 迭代语义)
124
+ for (const handler of set) {
125
+ try {
126
+ await handler(...args);
127
+ }
128
+ catch (err) {
129
+ this.reportHandlerError(event, err);
130
+ }
131
+ }
132
+ }
133
+ /**
134
+ * 移除指定事件的所有监听器
135
+ */
136
+ removeAll(event) {
137
+ if (event) {
138
+ this.handlers.delete(event);
139
+ }
140
+ else {
141
+ this.handlers.clear();
142
+ }
143
+ }
144
+ }
145
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { HookContextMap, MiddlewareFn } from './types/index.js';
2
+ /**
3
+ * 钩子注册表 —— 命名生命周期事件的 handler 总线
4
+ *
5
+ * 设计哲学:每个钩子键代表一个 **语义清晰的生命周期事件**(例如
6
+ * `inbound:command` / `inbound:flow` / `agent:llm:before`),handler
7
+ * 在事件内部按 **注册顺序** 串行执行洋葱模型 (Koa-style next)。
8
+ *
9
+ * 不再使用数字 priority:相位之间的次序由调度方(plugin-gateway 等)
10
+ * 显式表达;相位内部的 handler 应顺序无关,或由相位拥有方约定。
11
+ *
12
+ * 插件通过 `ctx.middleware(hook, fn)` 注册 handler。
13
+ * 服务在关键流程点执行 `hooks.run(hook, data, defaultAction)`。
14
+ *
15
+ * Handler 可以:
16
+ * - 修改 data 对象(引用传递)
17
+ * - 调用 next() 继续管道
18
+ * - 不调用 next() 来中断流程(包括 defaultAction)—— 标准的"已处理"信号
19
+ *
20
+ * 第三方插件可通过 TS declaration merging 扩展 HookContextMap。
21
+ */
22
+ export declare class HookRegistry {
23
+ private hooks;
24
+ /**
25
+ * 注册 handler,返回 dispose 函数。
26
+ * 同一钩子键内的多个 handler 按注册顺序执行。
27
+ */
28
+ register<K extends string & keyof HookContextMap>(hook: K, fn: MiddlewareFn<HookContextMap[K]>, contextId?: string): () => void;
29
+ /**
30
+ * 执行钩子链
31
+ *
32
+ * Handler 不调用 next() 即可中断整个管道(包括 defaultAction)。
33
+ * 这是拦截/跳过的标准手段,无需额外的 skip 标志。
34
+ *
35
+ * 返回 `true` 表示链路完整走完(执行了 defaultAction,或本就没有 handler);
36
+ * 返回 `false` 表示被某个 handler swallow。
37
+ * 调度方(如 plugin-gateway 多相位调度)可据此决定是否进入后续相位。
38
+ *
39
+ * @param hook - 钩子键(命名生命周期事件)
40
+ * @param data - 传递给 handler 的数据对象(会被 handler 修改)
41
+ * @param defaultAction - 所有 handler 都 next() 通过后的默认操作
42
+ */
43
+ run<K extends string & keyof HookContextMap>(hook: K, data: HookContextMap[K], defaultAction?: () => Promise<void>): Promise<boolean>;
44
+ /**
45
+ * 按 contextId 移除所有中间件
46
+ */
47
+ unregisterByContext(contextId: string): void;
48
+ }
49
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAkB,MAAM,kBAAkB,CAAC;AAOrF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,YAAY;IAEvB,OAAO,CAAC,KAAK,CAAuC;IAEpD;;;OAGG;IACH,QAAQ,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,cAAc,EAC9C,IAAI,EAAE,CAAC,EACP,EAAE,EAAE,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EACnC,SAAS,GAAE,MAAe,GACzB,MAAM,IAAI;IAsBb;;;;;;;;;;;;;OAaG;IACG,GAAG,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,cAAc,EAC/C,IAAI,EAAE,CAAC,EACP,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,EACvB,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAClC,OAAO,CAAC,OAAO,CAAC;IAwBnB;;OAEG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAU7C"}
package/dist/hooks.js ADDED
@@ -0,0 +1,102 @@
1
+ /**
2
+ * 钩子注册表 —— 命名生命周期事件的 handler 总线
3
+ *
4
+ * 设计哲学:每个钩子键代表一个 **语义清晰的生命周期事件**(例如
5
+ * `inbound:command` / `inbound:flow` / `agent:llm:before`),handler
6
+ * 在事件内部按 **注册顺序** 串行执行洋葱模型 (Koa-style next)。
7
+ *
8
+ * 不再使用数字 priority:相位之间的次序由调度方(plugin-gateway 等)
9
+ * 显式表达;相位内部的 handler 应顺序无关,或由相位拥有方约定。
10
+ *
11
+ * 插件通过 `ctx.middleware(hook, fn)` 注册 handler。
12
+ * 服务在关键流程点执行 `hooks.run(hook, data, defaultAction)`。
13
+ *
14
+ * Handler 可以:
15
+ * - 修改 data 对象(引用传递)
16
+ * - 调用 next() 继续管道
17
+ * - 不调用 next() 来中断流程(包括 defaultAction)—— 标准的"已处理"信号
18
+ *
19
+ * 第三方插件可通过 TS declaration merging 扩展 HookContextMap。
20
+ */
21
+ export class HookRegistry {
22
+ // biome-ignore lint/suspicious/noExplicitAny: 泛型擦除场景,hooks 容器持有不同钩子键的 entry,运行时按 key 分发
23
+ hooks = new Map();
24
+ /**
25
+ * 注册 handler,返回 dispose 函数。
26
+ * 同一钩子键内的多个 handler 按注册顺序执行。
27
+ */
28
+ register(hook, fn, contextId = 'root') {
29
+ let list = this.hooks.get(hook);
30
+ if (!list) {
31
+ list = [];
32
+ this.hooks.set(hook, list);
33
+ }
34
+ const entry = { fn, contextId };
35
+ list.push(entry);
36
+ return () => {
37
+ // 查 registry 当前数组而非闭包捕获的 list:unregisterByContext 会整体
38
+ // 换数组,捕获旧引用的 dispose 会变 no-op(中间件泄漏)。
39
+ const current = this.hooks.get(hook);
40
+ if (!current)
41
+ return;
42
+ const idx = current.indexOf(entry);
43
+ if (idx >= 0) {
44
+ current.splice(idx, 1);
45
+ if (current.length === 0)
46
+ this.hooks.delete(hook);
47
+ }
48
+ };
49
+ }
50
+ /**
51
+ * 执行钩子链
52
+ *
53
+ * Handler 不调用 next() 即可中断整个管道(包括 defaultAction)。
54
+ * 这是拦截/跳过的标准手段,无需额外的 skip 标志。
55
+ *
56
+ * 返回 `true` 表示链路完整走完(执行了 defaultAction,或本就没有 handler);
57
+ * 返回 `false` 表示被某个 handler swallow。
58
+ * 调度方(如 plugin-gateway 多相位调度)可据此决定是否进入后续相位。
59
+ *
60
+ * @param hook - 钩子键(命名生命周期事件)
61
+ * @param data - 传递给 handler 的数据对象(会被 handler 修改)
62
+ * @param defaultAction - 所有 handler 都 next() 通过后的默认操作
63
+ */
64
+ async run(hook, data, defaultAction) {
65
+ // 快照:handler 执行中 register/dispose(splice 活数组)不能扰动本次遍历的
66
+ // 游标——否则会跳过下一个 handler 或误报 reachedEnd。
67
+ const snapshot = [...(this.hooks.get(hook) ?? [])];
68
+ let index = 0;
69
+ let reachedEnd = false;
70
+ const next = async () => {
71
+ while (index < snapshot.length) {
72
+ const entry = snapshot[index++];
73
+ // 执行前确认 entry 仍在注册表中——运行途中被 dispose 的 handler 跳过
74
+ const current = this.hooks.get(hook);
75
+ if (!current?.includes(entry))
76
+ continue;
77
+ await entry.fn(data, next);
78
+ return;
79
+ }
80
+ reachedEnd = true;
81
+ if (defaultAction)
82
+ await defaultAction();
83
+ };
84
+ await next();
85
+ return reachedEnd;
86
+ }
87
+ /**
88
+ * 按 contextId 移除所有中间件
89
+ */
90
+ unregisterByContext(contextId) {
91
+ for (const [hook, list] of this.hooks) {
92
+ const filtered = list.filter(e => e.contextId !== contextId);
93
+ if (filtered.length === 0) {
94
+ this.hooks.delete(hook);
95
+ }
96
+ else {
97
+ this.hooks.set(hook, filtered);
98
+ }
99
+ }
100
+ }
101
+ }
102
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
package/dist/i18n.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ import type { I18nResources } from './types/index.js';
2
+ export declare const DEFAULT_LOCALE = "zh-CN";
3
+ export declare function resolveI18nText(resources: I18nResources | undefined, locale: string | undefined, key: string, fallback?: string): string;
4
+ export declare function normalizeLocale(locale: string | undefined): string;
5
+ export declare function resolveLocalePreference(locale: string | undefined, fallbackLocale?: string): string;
6
+ //# sourceMappingURL=i18n.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,eAAO,MAAM,cAAc,UAAU,CAAC;AAEtC,wBAAgB,eAAe,CAC7B,SAAS,EAAE,aAAa,GAAG,SAAS,EACpC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,GAAG,EAAE,MAAM,EACX,QAAQ,SAAM,GACb,MAAM,CAWR;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAIlE;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,cAAc,SAAiB,GAAG,MAAM,CAI3G"}
package/dist/i18n.js ADDED
@@ -0,0 +1,26 @@
1
+ export const DEFAULT_LOCALE = 'zh-CN';
2
+ export function resolveI18nText(resources, locale, key, fallback = key) {
3
+ const normalized = normalizeLocale(locale);
4
+ const exact = resources?.[normalized]?.[key];
5
+ if (exact)
6
+ return exact;
7
+ const baseLocale = normalized.split('-')[0];
8
+ const base = resources?.[baseLocale]?.[key];
9
+ if (base)
10
+ return base;
11
+ const zh = resources?.[DEFAULT_LOCALE]?.[key];
12
+ return zh ?? fallback;
13
+ }
14
+ export function normalizeLocale(locale) {
15
+ const value = locale?.trim();
16
+ if (!value || value === 'auto')
17
+ return DEFAULT_LOCALE;
18
+ return value;
19
+ }
20
+ export function resolveLocalePreference(locale, fallbackLocale = DEFAULT_LOCALE) {
21
+ const value = locale?.trim();
22
+ if (!value || value === 'auto')
23
+ return normalizeLocale(fallbackLocale);
24
+ return value;
25
+ }
26
+ //# sourceMappingURL=i18n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AAEtC,MAAM,UAAU,eAAe,CAC7B,SAAoC,EACpC,MAA0B,EAC1B,GAAW,EACX,QAAQ,GAAG,GAAG;IAEd,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IAExB,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAEtB,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAC9C,OAAO,EAAE,IAAI,QAAQ,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAA0B;IACxD,MAAM,KAAK,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,cAAc,CAAC;IACtD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAA0B,EAAE,cAAc,GAAG,cAAc;IACjG,MAAM,KAAK,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,eAAe,CAAC,cAAc,CAAC,CAAC;IACvE,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * 用户身份标识工具函数
3
+ *
4
+ * 统一 userId / nickname 的使用模式,避免各插件实现不一致。
5
+ */
6
+ /**
7
+ * 获取消息发送者的显示标签。
8
+ * 同时展示 nickname 和 userId 帮助 LLM 关联身份。
9
+ * - 两者都有时返回 `昵称(ID)`
10
+ * - 只有 nickname 返回 nickname
11
+ * - 只有 userId 返回 userId
12
+ * - 都无返回 undefined
13
+ */
14
+ export declare function getSenderLabel(nickname?: string, userId?: string): string | undefined;
15
+ /**
16
+ * 将发送者标签格式化为消息前缀。
17
+ * 有标签时返回 `[label]: content`,无标签时原样返回 content。
18
+ */
19
+ export declare function prefixSender(content: string, nickname?: string, userId?: string): string;
20
+ /**
21
+ * 获取适用于 Message.name / OpenAI API name 字段的安全标识符。
22
+ * 使用 userId(稳定不变)而非 nickname(可变)。
23
+ * 返回 undefined 表示不设置 name 字段。
24
+ */
25
+ export declare function getMessageName(userId?: string): string | undefined;
26
+ //# sourceMappingURL=identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIrF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAGxF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAElE"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * 用户身份标识工具函数
3
+ *
4
+ * 统一 userId / nickname 的使用模式,避免各插件实现不一致。
5
+ */
6
+ /**
7
+ * 获取消息发送者的显示标签。
8
+ * 同时展示 nickname 和 userId 帮助 LLM 关联身份。
9
+ * - 两者都有时返回 `昵称(ID)`
10
+ * - 只有 nickname 返回 nickname
11
+ * - 只有 userId 返回 userId
12
+ * - 都无返回 undefined
13
+ */
14
+ export function getSenderLabel(nickname, userId) {
15
+ const nick = nickname?.trim();
16
+ if (nick && userId)
17
+ return `${nick}(${userId})`;
18
+ return nick || userId || undefined;
19
+ }
20
+ /**
21
+ * 将发送者标签格式化为消息前缀。
22
+ * 有标签时返回 `[label]: content`,无标签时原样返回 content。
23
+ */
24
+ export function prefixSender(content, nickname, userId) {
25
+ const label = getSenderLabel(nickname, userId);
26
+ return label ? `[${label}]: ${content}` : content;
27
+ }
28
+ /**
29
+ * 获取适用于 Message.name / OpenAI API name 字段的安全标识符。
30
+ * 使用 userId(稳定不变)而非 nickname(可变)。
31
+ * 返回 undefined 表示不设置 name 字段。
32
+ */
33
+ export function getMessageName(userId) {
34
+ return userId || undefined;
35
+ }
36
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,QAAiB,EAAE,MAAe;IAC/D,MAAM,IAAI,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAI,IAAI,IAAI,MAAM;QAAE,OAAO,GAAG,IAAI,IAAI,MAAM,GAAG,CAAC;IAChD,OAAO,IAAI,IAAI,MAAM,IAAI,SAAS,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,QAAiB,EAAE,MAAe;IAC9E,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC/C,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AACpD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAAe;IAC5C,OAAO,MAAM,IAAI,SAAS,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,17 @@
1
+ export type { AppOptions } from './app.js';
2
+ export { App, createApp } from './app.js';
3
+ export type { AalisConfig, ConfigManagerOptions } from './config.js';
4
+ export { CORE_CONFIG_SCHEMA, ConfigManager, ScopedConfigManager } from './config.js';
5
+ export { Context } from './context.js';
6
+ export { EventBus } from './events.js';
7
+ export { HookRegistry } from './hooks.js';
8
+ export type { LogEntry, LogLevel } from './logger.js';
9
+ export { DefaultLogger, formatLogLine, type Logger, LogHub, parseLogLine } from './logger.js';
10
+ export type { PluginEntry, PluginModule, PluginState } from './plugin.js';
11
+ export { PluginManager, parseInstanceId } from './plugin.js';
12
+ export type { ConfigProvider, PluginDescriptor, PluginLoader, RestartStrategy } from './providers.js';
13
+ export type { NormalizedDependency, ServiceEntry, ServicePriorityValue } from './service.js';
14
+ export { ScopedServiceContainer, ServiceContainer, ServicePriority } from './service.js';
15
+ export type { AalisEvents, AppService, CapabilityList, CapabilityOf, ConfigSchema, DependencyDeclaration, DisposableService, HookContextMap, InjectDeclaration, MiddlewareFn, MiddlewareNext, PluginManagerService, PluginStatusEntry, SchemaArray, SchemaField, SchemaFieldType, SchemaFieldTypes, SchemaGroup, ServiceCapabilityMap, ServiceDependency, ServiceOf, ServiceTypeMap, } from './types/index.js';
16
+ export { probeCapability, registerCapabilityProbe } from './types/index.js';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAgBA,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,YAAY,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE9F,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC7D,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtG,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC7F,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEzF,YAAY,EACV,WAAW,EACX,UAAU,EACV,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,qBAAqB,EACrB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,WAAW,EACX,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,oBAAoB,EACpB,iBAAiB,EACjB,SAAS,EACT,cAAc,GACf,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,29 @@
1
+ // ============================================================
2
+ // @aalis/core — 公共 API 导出
3
+ //
4
+ // core 仅提供:
5
+ // - 运行时基础设施(App / Context / EventBus / ServiceContainer / HookRegistry / ConfigManager / Logger / PluginManager 等)
6
+ // - 通用 IoC 数据契约(Schema / AalisEvents / Middleware / Dependency 声明 等)
7
+ // - 三个扩展点(ServiceCapabilityMap / AalisEvents / HookContextMap)+ PluginModule augmentation
8
+ // - 服务能力声明框架(ServiceCapabilityMap + Probe)
9
+ //
10
+ // 所有业务/领域类型均由各 @aalis/plugin-*-api 包导出:
11
+ // - Message / ContentSegment → @aalis/plugin-agent-api
12
+ // - ToolCall / ToolDefinition / ToolFunction → @aalis/plugin-tools-api
13
+ // - LLM / Memory / Storage / Embedding / VectorStore / Tools / Commands / Gateway /
14
+ // WebUI / Authority / Agent / Platform 等服务接口及关联业务类型同样在各自的 plugin-*-api。
15
+ // ============================================================
16
+ // ----- 运行时基础设施 -----
17
+ export { App, createApp } from './app.js';
18
+ export { CORE_CONFIG_SCHEMA, ConfigManager, ScopedConfigManager } from './config.js';
19
+ export { Context } from './context.js';
20
+ // 注:DisposableChain 是 Context 的内部清理链实现,不再从包根导出(零外部消费,
21
+ // 避免 semver 负担)。嵌入方如确需独立使用,从 './disposable-chain.js' 直接 import。
22
+ export { EventBus } from './events.js';
23
+ export { HookRegistry } from './hooks.js';
24
+ export { DefaultLogger, formatLogLine, LogHub, parseLogLine } from './logger.js';
25
+ export { PluginManager, parseInstanceId } from './plugin.js';
26
+ export { ScopedServiceContainer, ServiceContainer, ServicePriority } from './service.js';
27
+ // ----- 服务能力声明框架 -----
28
+ export { probeCapability, registerCapabilityProbe } from './types/index.js';
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,0BAA0B;AAC1B,EAAE;AACF,YAAY;AACZ,qHAAqH;AACrH,uEAAuE;AACvE,4FAA4F;AAC5F,6CAA6C;AAC7C,EAAE;AACF,wCAAwC;AACxC,mEAAmE;AACnE,yEAAyE;AACzE,sFAAsF;AACtF,4EAA4E;AAC5E,+DAA+D;AAG/D,sBAAsB;AACtB,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,sDAAsD;AACtD,gEAAgE;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAe,MAAM,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG9F,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG7D,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AA0BzF,uBAAuB;AACvB,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/init.d.ts ADDED
@@ -0,0 +1,20 @@
1
+ /**
2
+ * 首启交互式初始化向导。
3
+ *
4
+ * 当 aalis.config.yaml 不存在时被 src/index.ts 调用。
5
+ *
6
+ * 设计:
7
+ * - 不依赖任何插件实例(只 dynamic import 各 plugin 的入口模块以读取静态导出的 provides/inject)。
8
+ * - 不再硬编码插件清单或"bundled 必装"概念:
9
+ * · 扫 packages/plugin-* 与已经位于 node_modules/@aalis/plugin-* 的本地包;
10
+ * · 用各 plugin 模块的 `provides[]` 把它们按服务分组,让用户在每个服务里多选;
11
+ * · 不 provide 任何服务的归为"工具与扩展"。
12
+ * - 配置块写空对象 `{}`,密钥等留给用户启动后从 WebUI 或 yaml 填。
13
+ * 末尾会列出"启用了但通常需要进一步配置"的插件提醒。
14
+ */
15
+ export interface InitWizardOptions {
16
+ configPath?: string;
17
+ requireTty?: boolean;
18
+ }
19
+ export declare function runInitWizardIfNeeded(opts?: InitWizardOptions): Promise<boolean>;
20
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA8RH,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAsB,qBAAqB,CAAC,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,CAmM1F"}