@aalis/core 0.7.0 → 0.9.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 (212) hide show
  1. package/dist/app.d.ts +16 -13
  2. package/dist/app.d.ts.map +1 -1
  3. package/dist/app.js +20 -45
  4. package/dist/app.js.map +1 -1
  5. package/dist/config.d.ts +2 -25
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +2 -96
  8. package/dist/config.js.map +1 -1
  9. package/dist/context.d.ts +105 -34
  10. package/dist/context.d.ts.map +1 -1
  11. package/dist/context.js +185 -43
  12. package/dist/context.js.map +1 -1
  13. package/dist/contributions.d.ts +75 -0
  14. package/dist/contributions.d.ts.map +1 -0
  15. package/dist/contributions.js +83 -0
  16. package/dist/contributions.js.map +1 -0
  17. package/dist/disposable-chain.d.ts +47 -6
  18. package/dist/disposable-chain.d.ts.map +1 -1
  19. package/dist/disposable-chain.js +92 -12
  20. package/dist/disposable-chain.js.map +1 -1
  21. package/dist/events.d.ts +1 -9
  22. package/dist/events.d.ts.map +1 -1
  23. package/dist/events.js +1 -23
  24. package/dist/events.js.map +1 -1
  25. package/dist/hooks.d.ts +7 -22
  26. package/dist/hooks.d.ts.map +1 -1
  27. package/dist/hooks.js +6 -2
  28. package/dist/hooks.js.map +1 -1
  29. package/dist/index.d.ts +6 -5
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +5 -4
  32. package/dist/index.js.map +1 -1
  33. package/dist/plugin-activation.d.ts +2 -0
  34. package/dist/plugin-activation.d.ts.map +1 -1
  35. package/dist/plugin-activation.js +9 -5
  36. package/dist/plugin-activation.js.map +1 -1
  37. package/dist/plugin-topology.d.ts +6 -2
  38. package/dist/plugin-topology.d.ts.map +1 -1
  39. package/dist/plugin-topology.js +6 -4
  40. package/dist/plugin-topology.js.map +1 -1
  41. package/dist/plugin.d.ts +20 -14
  42. package/dist/plugin.d.ts.map +1 -1
  43. package/dist/plugin.js +53 -72
  44. package/dist/plugin.js.map +1 -1
  45. package/dist/{service-helpers.d.ts → services-helpers.d.ts} +2 -2
  46. package/dist/services-helpers.d.ts.map +1 -0
  47. package/dist/{service-helpers.js → services-helpers.js} +2 -2
  48. package/dist/{service-helpers.js.map → services-helpers.js.map} +1 -1
  49. package/dist/{service.d.ts → services.d.ts} +43 -9
  50. package/dist/services.d.ts.map +1 -0
  51. package/dist/{service.js → services.js} +34 -11
  52. package/dist/services.js.map +1 -0
  53. package/dist/types/app.d.ts +8 -8
  54. package/dist/types/app.d.ts.map +1 -1
  55. package/dist/types/contributions.d.ts +3 -0
  56. package/dist/types/contributions.d.ts.map +1 -0
  57. package/dist/types/contributions.js +10 -0
  58. package/dist/types/contributions.js.map +1 -0
  59. package/dist/types/events.d.ts +44 -0
  60. package/dist/types/events.d.ts.map +1 -0
  61. package/dist/types/events.js +6 -0
  62. package/dist/types/events.js.map +1 -0
  63. package/dist/types/hooks.d.ts +8 -0
  64. package/dist/types/hooks.d.ts.map +1 -1
  65. package/dist/types/index.d.ts +5 -3
  66. package/dist/types/index.d.ts.map +1 -1
  67. package/dist/types/index.js +8 -6
  68. package/dist/types/index.js.map +1 -1
  69. package/dist/types/plugin.d.ts +12 -4
  70. package/dist/types/plugin.d.ts.map +1 -1
  71. package/dist/types/plugin.js.map +1 -1
  72. package/dist/types/services.d.ts +4 -0
  73. package/dist/types/services.d.ts.map +1 -1
  74. package/package.json +1 -1
  75. package/dist/constants.d.ts +0 -31
  76. package/dist/constants.d.ts.map +0 -1
  77. package/dist/constants.js +0 -36
  78. package/dist/constants.js.map +0 -1
  79. package/dist/i18n.d.ts +0 -6
  80. package/dist/i18n.d.ts.map +0 -1
  81. package/dist/i18n.js +0 -26
  82. package/dist/i18n.js.map +0 -1
  83. package/dist/identity.d.ts +0 -26
  84. package/dist/identity.d.ts.map +0 -1
  85. package/dist/identity.js +0 -36
  86. package/dist/identity.js.map +0 -1
  87. package/dist/init.d.ts +0 -20
  88. package/dist/init.d.ts.map +0 -1
  89. package/dist/init.js +0 -455
  90. package/dist/init.js.map +0 -1
  91. package/dist/llm-router.d.ts.map +0 -1
  92. package/dist/llm-router.js +0 -123
  93. package/dist/llm-router.js.map +0 -1
  94. package/dist/marketplace-bootstrap.d.ts +0 -54
  95. package/dist/marketplace-bootstrap.d.ts.map +0 -1
  96. package/dist/marketplace-bootstrap.js +0 -132
  97. package/dist/marketplace-bootstrap.js.map +0 -1
  98. package/dist/mixin-registry.d.ts +0 -34
  99. package/dist/mixin-registry.d.ts.map +0 -1
  100. package/dist/mixin-registry.js +0 -60
  101. package/dist/mixin-registry.js.map +0 -1
  102. package/dist/model-ref.d.ts +0 -22
  103. package/dist/model-ref.d.ts.map +0 -1
  104. package/dist/model-ref.js +0 -46
  105. package/dist/model-ref.js.map +0 -1
  106. package/dist/pending-buffer.d.ts +0 -46
  107. package/dist/pending-buffer.d.ts.map +0 -1
  108. package/dist/pending-buffer.js +0 -131
  109. package/dist/pending-buffer.js.map +0 -1
  110. package/dist/platform-registry.d.ts +0 -40
  111. package/dist/platform-registry.d.ts.map +0 -1
  112. package/dist/platform-registry.js +0 -64
  113. package/dist/platform-registry.js.map +0 -1
  114. package/dist/semver-mini.d.ts +0 -20
  115. package/dist/semver-mini.d.ts.map +0 -1
  116. package/dist/semver-mini.js +0 -94
  117. package/dist/semver-mini.js.map +0 -1
  118. package/dist/service-helpers.d.ts.map +0 -1
  119. package/dist/service.d.ts.map +0 -1
  120. package/dist/service.js.map +0 -1
  121. package/dist/types/agent.d.ts +0 -51
  122. package/dist/types/agent.d.ts.map +0 -1
  123. package/dist/types/agent.js +0 -3
  124. package/dist/types/agent.js.map +0 -1
  125. package/dist/types/archive.d.ts +0 -59
  126. package/dist/types/archive.d.ts.map +0 -1
  127. package/dist/types/archive.js +0 -16
  128. package/dist/types/archive.js.map +0 -1
  129. package/dist/types/authority.d.ts +0 -63
  130. package/dist/types/authority.d.ts.map +0 -1
  131. package/dist/types/authority.js +0 -3
  132. package/dist/types/authority.js.map +0 -1
  133. package/dist/types/capabilities.d.ts +0 -53
  134. package/dist/types/capabilities.d.ts.map +0 -1
  135. package/dist/types/capabilities.js +0 -87
  136. package/dist/types/capabilities.js.map +0 -1
  137. package/dist/types/cli.d.ts +0 -14
  138. package/dist/types/cli.d.ts.map +0 -1
  139. package/dist/types/cli.js +0 -3
  140. package/dist/types/cli.js.map +0 -1
  141. package/dist/types/commands.d.ts +0 -98
  142. package/dist/types/commands.d.ts.map +0 -1
  143. package/dist/types/commands.js +0 -3
  144. package/dist/types/commands.js.map +0 -1
  145. package/dist/types/core.d.ts +0 -116
  146. package/dist/types/core.d.ts.map +0 -1
  147. package/dist/types/core.js +0 -6
  148. package/dist/types/core.js.map +0 -1
  149. package/dist/types/embedding.d.ts +0 -7
  150. package/dist/types/embedding.d.ts.map +0 -1
  151. package/dist/types/embedding.js +0 -3
  152. package/dist/types/embedding.js.map +0 -1
  153. package/dist/types/flow-control.d.ts +0 -51
  154. package/dist/types/flow-control.d.ts.map +0 -1
  155. package/dist/types/flow-control.js +0 -12
  156. package/dist/types/flow-control.js.map +0 -1
  157. package/dist/types/gateway.d.ts +0 -24
  158. package/dist/types/gateway.d.ts.map +0 -1
  159. package/dist/types/gateway.js +0 -15
  160. package/dist/types/gateway.js.map +0 -1
  161. package/dist/types/image-recognition.d.ts +0 -123
  162. package/dist/types/image-recognition.d.ts.map +0 -1
  163. package/dist/types/image-recognition.js +0 -31
  164. package/dist/types/image-recognition.js.map +0 -1
  165. package/dist/types/llm.d.ts +0 -146
  166. package/dist/types/llm.d.ts.map +0 -1
  167. package/dist/types/llm.js +0 -27
  168. package/dist/types/llm.js.map +0 -1
  169. package/dist/types/memory.d.ts +0 -62
  170. package/dist/types/memory.d.ts.map +0 -1
  171. package/dist/types/memory.js +0 -22
  172. package/dist/types/memory.js.map +0 -1
  173. package/dist/types/persona.d.ts +0 -45
  174. package/dist/types/persona.d.ts.map +0 -1
  175. package/dist/types/persona.js +0 -3
  176. package/dist/types/persona.js.map +0 -1
  177. package/dist/types/platform.d.ts +0 -126
  178. package/dist/types/platform.d.ts.map +0 -1
  179. package/dist/types/platform.js +0 -5
  180. package/dist/types/platform.js.map +0 -1
  181. package/dist/types/service.d.ts +0 -41
  182. package/dist/types/service.d.ts.map +0 -1
  183. package/dist/types/service.js +0 -35
  184. package/dist/types/service.js.map +0 -1
  185. package/dist/types/session.d.ts +0 -153
  186. package/dist/types/session.d.ts.map +0 -1
  187. package/dist/types/session.js +0 -19
  188. package/dist/types/session.js.map +0 -1
  189. package/dist/types/storage.d.ts +0 -100
  190. package/dist/types/storage.d.ts.map +0 -1
  191. package/dist/types/storage.js +0 -29
  192. package/dist/types/storage.js.map +0 -1
  193. package/dist/types/tools.d.ts +0 -39
  194. package/dist/types/tools.d.ts.map +0 -1
  195. package/dist/types/tools.js +0 -3
  196. package/dist/types/tools.js.map +0 -1
  197. package/dist/types/trigger-policy.d.ts +0 -16
  198. package/dist/types/trigger-policy.d.ts.map +0 -1
  199. package/dist/types/trigger-policy.js +0 -6
  200. package/dist/types/trigger-policy.js.map +0 -1
  201. package/dist/types/vectorstore.d.ts +0 -23
  202. package/dist/types/vectorstore.d.ts.map +0 -1
  203. package/dist/types/vectorstore.js +0 -3
  204. package/dist/types/vectorstore.js.map +0 -1
  205. package/dist/types/web-search.d.ts +0 -88
  206. package/dist/types/web-search.d.ts.map +0 -1
  207. package/dist/types/web-search.js +0 -23
  208. package/dist/types/web-search.js.map +0 -1
  209. package/dist/types/webui.d.ts +0 -137
  210. package/dist/types/webui.d.ts.map +0 -1
  211. package/dist/types/webui.js +0 -3
  212. package/dist/types/webui.js.map +0 -1
@@ -0,0 +1,75 @@
1
+ /**
2
+ * 贡献 spec 的内核契约:只要求一个 id。
3
+ *
4
+ * id 是**局部名**(如 'context'、'group-hint'),注册时由门面自动冠以
5
+ * `${ctx.id}/` 前缀成为全局键(见 {@link ContributionHandle.key})——
6
+ * **spec.id 侧**的抢注/顶替由此杜绝,无需归属权校验(与 provide 的
7
+ * entryId 前缀约定同源,但由构造保证而非 warn)。
8
+ *
9
+ * 边界如实声明:该保证以 ctx.id 为信任锚。`ctx.fork(id)` 与
10
+ * `ctx.useModule(module)`(childId = `${父id}#${模块名}`)都不保证 ctx.id
11
+ * 唯一,重复 ctx.id 会使两方共用同一命名空间、后注册者替换先注册者。
12
+ * 这是 Context 模型的信任边界(provide / middleware 的 contextId 归属同理
13
+ * 暴露),如需硬化应在 fork 层统一处理,而非各原语自设门禁。
14
+ */
15
+ export interface ContributionSpec {
16
+ /**
17
+ * 局部幂等键:同一 ctx 内同 id 重复注册 = 替换。
18
+ *
19
+ * 必须**非空且不含 `/`**(`/` 是全局键的分隔符,含它可构造出跨 ctx 的
20
+ * 键碰撞),违者注册期抛 `TypeError`。
21
+ */
22
+ id: string;
23
+ }
24
+ /** collect 的枚举条目:全局键 + 注册时原样传入的 spec(不拷贝、不改写)。 */
25
+ export interface ContributionHandle<S extends ContributionSpec = ContributionSpec> {
26
+ /** 全局键 `${contextId}/${spec.id}`——归属标识与幂等键。 */
27
+ readonly key: string;
28
+ /** 注册方交付的 spec 本体(引用,非副本)。 */
29
+ readonly spec: S;
30
+ }
31
+ /**
32
+ * 贡献点注册表 —— 与 services 成对偶的数据原语。
33
+ *
34
+ * 四原语按「执行/数据」二分:events(执行·无返回·隔离)、hooks(执行·可变·
35
+ * 短路)、services(数据·解析单胜者)、contributions(数据·确定性枚举全量)。
36
+ *
37
+ * 本注册表**永不执行插件代码**:register/collect 是同步的数据插入与快照枚举。
38
+ * 如何调用 spec(并行/隔离/超时)是收集方(贡献点 owner)的策略,不在内核。
39
+ *
40
+ * 确定性:collect 按全局键(`${contextId}/${id}`)码元序排序——同一注册集合
41
+ * 在任意注册顺序、任意机器上枚举结果逐字节相同;顺序是键的纯函数,
42
+ * 重复注册也无法影响排位。
43
+ *
44
+ * 插件面与 events / services / hooks 同一门面纪律(方法窄面,对象不外露):
45
+ * 注册经 `ctx.contribute(point, spec)`(冠 ctx.id 前缀 + 挂 dispose 链),
46
+ * 枚举经 `ctx.collect(point)`(驱动公开——任何插件都可拥有自己的贡献点)。
47
+ * 完整注册表仅 App(组合根)与 Context 内部持有。
48
+ *
49
+ * 注册表本身只认 {@link ContributionSpec}(不透明数据面);按贡献点键精化
50
+ * spec 类型是 Context 门面的职责(经 types/contributions.ts 的
51
+ * ContributionPointMap declaration merging)。
52
+ */
53
+ export declare class ContributionRegistry {
54
+ /** point → 全局键 → 注册项 */
55
+ private points;
56
+ /**
57
+ * 注册一份贡献,返回 dispose 函数。
58
+ *
59
+ * 全局键 = `${contextId}/${spec.id}`;同键重复注册为替换(幂等),
60
+ * 旧注册的 dispose 函数在替换后失效(不会误删新注册)。
61
+ */
62
+ register(point: string, spec: ContributionSpec, contextId: string): () => void;
63
+ /**
64
+ * 枚举某贡献点的全部条目,按全局键码元序(`Array.prototype.sort` 默认
65
+ * 比较,无 locale 依赖)。返回数组快照;spec 按**引用**给出——不拷贝、
66
+ * 不改写字段,故 class 实例 spec 的原型方法、getter 语义均完好保留
67
+ * (注册表"永不执行插件代码"因此在枚举侧也成立)。
68
+ */
69
+ collect(point: string): ReadonlyArray<ContributionHandle>;
70
+ /**
71
+ * 按 contextId 移除该上下文的全部贡献(插件卸载清扫)。
72
+ */
73
+ unregisterByContext(contextId: string): void;
74
+ }
75
+ //# sourceMappingURL=contributions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contributions.d.ts","sourceRoot":"","sources":["../src/contributions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,kDAAkD;AAClD,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB;IAC/E,+CAA+C;IAC/C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,8BAA8B;IAC9B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;CAClB;AAOD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,oBAAoB;IAC/B,wBAAwB;IACxB,OAAO,CAAC,MAAM,CAAgD;IAE9D;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,IAAI;IA0B9E;;;;;OAKG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,kBAAkB,CAAC;IAMzD;;OAEG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAQ7C"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * 贡献点注册表 —— 与 services 成对偶的数据原语。
3
+ *
4
+ * 四原语按「执行/数据」二分:events(执行·无返回·隔离)、hooks(执行·可变·
5
+ * 短路)、services(数据·解析单胜者)、contributions(数据·确定性枚举全量)。
6
+ *
7
+ * 本注册表**永不执行插件代码**:register/collect 是同步的数据插入与快照枚举。
8
+ * 如何调用 spec(并行/隔离/超时)是收集方(贡献点 owner)的策略,不在内核。
9
+ *
10
+ * 确定性:collect 按全局键(`${contextId}/${id}`)码元序排序——同一注册集合
11
+ * 在任意注册顺序、任意机器上枚举结果逐字节相同;顺序是键的纯函数,
12
+ * 重复注册也无法影响排位。
13
+ *
14
+ * 插件面与 events / services / hooks 同一门面纪律(方法窄面,对象不外露):
15
+ * 注册经 `ctx.contribute(point, spec)`(冠 ctx.id 前缀 + 挂 dispose 链),
16
+ * 枚举经 `ctx.collect(point)`(驱动公开——任何插件都可拥有自己的贡献点)。
17
+ * 完整注册表仅 App(组合根)与 Context 内部持有。
18
+ *
19
+ * 注册表本身只认 {@link ContributionSpec}(不透明数据面);按贡献点键精化
20
+ * spec 类型是 Context 门面的职责(经 types/contributions.ts 的
21
+ * ContributionPointMap declaration merging)。
22
+ */
23
+ export class ContributionRegistry {
24
+ /** point → 全局键 → 注册项 */
25
+ points = new Map();
26
+ /**
27
+ * 注册一份贡献,返回 dispose 函数。
28
+ *
29
+ * 全局键 = `${contextId}/${spec.id}`;同键重复注册为替换(幂等),
30
+ * 旧注册的 dispose 函数在替换后失效(不会误删新注册)。
31
+ */
32
+ register(point, spec, contextId) {
33
+ // 空 id 会静默同键碰撞;含 '/' 的局部 id 可构造出与他人 `${contextId}/${id}`
34
+ // 相同的全局键(如 ctx 'a' + id 'b/c' 撞 ctx 'a/b' + id 'c'),打破
35
+ // 「spec.id 侧无法顶替他人贡献」的保证——两者都必须在注册期拒绝。
36
+ if (!spec.id || spec.id.includes('/')) {
37
+ throw new TypeError(`贡献点 "${point}" 的 spec.id 必须非空且不含 '/'(得到 "${spec.id}")`);
38
+ }
39
+ let byKey = this.points.get(point);
40
+ if (!byKey) {
41
+ byKey = new Map();
42
+ this.points.set(point, byKey);
43
+ }
44
+ const key = `${contextId}/${spec.id}`;
45
+ const entry = { spec, contextId };
46
+ byKey.set(key, entry);
47
+ return () => {
48
+ // 仅当当前占位仍是本次注册时才删除——同键已被替换时旧 dispose 是 no-op
49
+ const current = this.points.get(point);
50
+ if (current?.get(key) === entry) {
51
+ current.delete(key);
52
+ if (current.size === 0)
53
+ this.points.delete(point);
54
+ }
55
+ };
56
+ }
57
+ /**
58
+ * 枚举某贡献点的全部条目,按全局键码元序(`Array.prototype.sort` 默认
59
+ * 比较,无 locale 依赖)。返回数组快照;spec 按**引用**给出——不拷贝、
60
+ * 不改写字段,故 class 实例 spec 的原型方法、getter 语义均完好保留
61
+ * (注册表"永不执行插件代码"因此在枚举侧也成立)。
62
+ */
63
+ collect(point) {
64
+ const byKey = this.points.get(point);
65
+ if (!byKey)
66
+ return [];
67
+ return [...byKey.keys()].sort().map(key => ({ key, spec: byKey.get(key).spec }));
68
+ }
69
+ /**
70
+ * 按 contextId 移除该上下文的全部贡献(插件卸载清扫)。
71
+ */
72
+ unregisterByContext(contextId) {
73
+ for (const [point, byKey] of this.points) {
74
+ for (const [key, entry] of byKey) {
75
+ if (entry.contextId === contextId)
76
+ byKey.delete(key);
77
+ }
78
+ if (byKey.size === 0)
79
+ this.points.delete(point);
80
+ }
81
+ }
82
+ }
83
+ //# sourceMappingURL=contributions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contributions.js","sourceRoot":"","sources":["../src/contributions.ts"],"names":[],"mappings":"AAqCA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,oBAAoB;IAC/B,wBAAwB;IAChB,MAAM,GAAG,IAAI,GAAG,EAAqC,CAAC;IAE9D;;;;;OAKG;IACH,QAAQ,CAAC,KAAa,EAAE,IAAsB,EAAE,SAAiB;QAC/D,yDAAyD;QACzD,uDAAuD;QACvD,uCAAuC;QACvC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,SAAS,CAAC,QAAQ,KAAK,+BAA+B,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;QACD,MAAM,GAAG,GAAG,GAAG,SAAS,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,KAAK,GAAiB,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAChD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAEtB,OAAO,GAAG,EAAE;YACV,6CAA6C;YAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACvC,IAAI,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC;gBAChC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACpB,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;oBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACpD,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,OAAO,CAAC,KAAa;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAkB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACrG,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,SAAiB;QACnC,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;gBACjC,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;oBAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvD,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;gBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;CACF"}
@@ -5,7 +5,8 @@ import type { Logger } from './logger.js';
5
5
  * 用途:Context 及其他需要累积「注册 → 卸载」副作用的场景,提供:
6
6
  * - `push(fn)` 追加清理函数
7
7
  * - `remove(fn)` 精确移除单个清理函数(不执行)
8
- * - `dispose()` 逆序调用所有清理函数并清空;期间任一抛错不影响其他
8
+ * - `dispose()` 同步逆序调用所有清理函数并清空;期间任一抛错不影响其他
9
+ * - `disposeAsync(timeoutMs?)` 逆序**串行等待**每个清理函数(含异步返回值)
9
10
  *
10
11
  * 相比散落的 `this._disposables: (() => void)[]`,集中管理能避免
11
12
  * 「忘记 push / 忘记清空 / 错误处理不一致」等低级 bug。
@@ -15,17 +16,57 @@ export declare class DisposableChain {
15
16
  private _items;
16
17
  private _disposed;
17
18
  constructor(logger?: Logger | undefined);
18
- /** 追加一个清理函数。dispose 后追加会立刻执行。 */
19
- push(fn: () => void): void;
19
+ /** 追加一个清理函数。dispose 后追加会立刻执行(异步返回值不等待)。 */
20
+ push(fn: () => unknown): void;
20
21
  /** 精确移除单个 disposable(不执行)。用于缓冲项"取消"场景。 */
21
- remove(fn: () => void): boolean;
22
+ remove(fn: () => unknown): boolean;
22
23
  get disposed(): boolean;
23
24
  /** 当前登记的清理函数数量(诊断 / 测试用:可检测闭包是否如期自移除)。 */
24
25
  get size(): number;
25
26
  /**
26
- * 逆序执行所有清理函数并清空。重复调用无效果。
27
- * 单个函数抛错被 swallow(可选择通过 logger 记录 debug)。
27
+ * 置位 disposed、快照并清空 items——两个 dispose 入口共用,避免逻辑漂移。
28
+ *
29
+ * 先清空再迭代快照:dispose 期间 disposer 常回调 remove(自身)(provide /
30
+ * whenService / subscribe 的自移除语义)。若在迭代中 splice 活动数组,索引
31
+ * 会错位、长度缩短,导致取到 undefined 而抛 "is not a function"。清空在前
32
+ * 则这些 remove 作用于空数组、安全 no-op(返回 false,符合各自移除点注释
33
+ * 的预期),快照索引也始终稳定。
34
+ */
35
+ private take;
36
+ /**
37
+ * 同步逆序执行所有清理函数并清空。重复调用无效果。
38
+ * 单个函数抛错被 swallow(可选择通过 logger 记录 debug);
39
+ * 异步返回值**不等待**——需要等待落盘类清理时用 {@link disposeAsync}。
28
40
  */
29
41
  dispose(): void;
42
+ /**
43
+ * 逆序**串行**等待所有清理函数完成。
44
+ *
45
+ * 串行而非并发是刻意的:逆序是本类对外承诺的语义(消费侧清理先于提供侧),
46
+ * 落盘类清理常有顺序依赖。单项抛错/拒绝被隔离,不中断后续清理。
47
+ *
48
+ * @param timeoutMs 单个异步清理项的等待上限;超时后放弃等待该项、
49
+ * **继续执行后续清理项**(定时器/监听器仍能摘干净),并 warn 点名。
50
+ * 缺省或 <=0 不设限。
51
+ */
52
+ disposeAsync(timeoutMs?: number): Promise<void>;
53
+ /**
54
+ * 等待单个清理 promise,可选超时护栏。
55
+ *
56
+ * 环境无关性记账:这是 core 首个计时器使用点。`setTimeout`/`clearTimeout`
57
+ * 是所有 JS 运行时(浏览器/Node/Deno/Worker)的共有全局,非 `node:` 专属,
58
+ * 不引入环境假设。
59
+ */
60
+ private awaitWithTimeout;
30
61
  }
62
+ /**
63
+ * 等待一个 promise,可选超时护栏;超时则放弃等待并调 `onTimeout` 上报。
64
+ *
65
+ * 环境无关性记账:`setTimeout`/`clearTimeout` 是所有 JS 运行时(浏览器/Node/
66
+ * Deno/Worker)的共有全局,非 `node:` 专属,不引入环境假设。
67
+ *
68
+ * @internal 仅供 core 内部(DisposableChain 逐项等待、Context join 在飞拆卸)复用,
69
+ * 不从包根导出。
70
+ */
71
+ export declare function awaitWithTimeout(p: Promise<unknown>, timeoutMs: number | undefined, onTimeout: () => void): Promise<void>;
31
72
  //# sourceMappingURL=disposable-chain.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"disposable-chain.d.ts","sourceRoot":"","sources":["../src/disposable-chain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;;;;;;;;;GAUG;AACH,qBAAa,eAAe;IAId,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAHpC,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,SAAS,CAAS;gBAEG,MAAM,CAAC,EAAE,MAAM,YAAA;IAE5C,iCAAiC;IACjC,IAAI,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAY1B,0CAA0C;IAC1C,MAAM,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO;IAO/B,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,0CAA0C;IAC1C,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;OAGG;IACH,OAAO,IAAI,IAAI;CAkBhB"}
1
+ {"version":3,"file":"disposable-chain.d.ts","sourceRoot":"","sources":["../src/disposable-chain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;;;;;;;;;;GAWG;AACH,qBAAa,eAAe;IAId,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAHpC,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,SAAS,CAAS;gBAEG,MAAM,CAAC,EAAE,MAAM,YAAA;IAE5C,2CAA2C;IAC3C,IAAI,CAAC,EAAE,EAAE,MAAM,OAAO,GAAG,IAAI;IAY7B,0CAA0C;IAC1C,MAAM,CAAC,EAAE,EAAE,MAAM,OAAO,GAAG,OAAO;IAOlC,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,0CAA0C;IAC1C,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;;;;;;OAQG;IACH,OAAO,CAAC,IAAI;IAOZ;;;;OAIG;IACH,OAAO,IAAI,IAAI;IAYf;;;;;;;;;OASG;IACG,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAerD;;;;;;OAMG;YACW,gBAAgB;CAK/B;AAED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,IAAI,iBAsB/G"}
@@ -4,7 +4,8 @@
4
4
  * 用途:Context 及其他需要累积「注册 → 卸载」副作用的场景,提供:
5
5
  * - `push(fn)` 追加清理函数
6
6
  * - `remove(fn)` 精确移除单个清理函数(不执行)
7
- * - `dispose()` 逆序调用所有清理函数并清空;期间任一抛错不影响其他
7
+ * - `dispose()` 同步逆序调用所有清理函数并清空;期间任一抛错不影响其他
8
+ * - `disposeAsync(timeoutMs?)` 逆序**串行等待**每个清理函数(含异步返回值)
8
9
  *
9
10
  * 相比散落的 `this._disposables: (() => void)[]`,集中管理能避免
10
11
  * 「忘记 push / 忘记清空 / 错误处理不一致」等低级 bug。
@@ -16,7 +17,7 @@ export class DisposableChain {
16
17
  constructor(logger) {
17
18
  this.logger = logger;
18
19
  }
19
- /** 追加一个清理函数。dispose 后追加会立刻执行。 */
20
+ /** 追加一个清理函数。dispose 后追加会立刻执行(异步返回值不等待)。 */
20
21
  push(fn) {
21
22
  if (this._disposed) {
22
23
  try {
@@ -45,20 +46,29 @@ export class DisposableChain {
45
46
  return this._items.length;
46
47
  }
47
48
  /**
48
- * 逆序执行所有清理函数并清空。重复调用无效果。
49
- * 单个函数抛错被 swallow(可选择通过 logger 记录 debug)。
49
+ * 置位 disposed、快照并清空 items——两个 dispose 入口共用,避免逻辑漂移。
50
+ *
51
+ * 先清空再迭代快照:dispose 期间 disposer 常回调 remove(自身)(provide /
52
+ * whenService / subscribe 的自移除语义)。若在迭代中 splice 活动数组,索引
53
+ * 会错位、长度缩短,导致取到 undefined 而抛 "is not a function"。清空在前
54
+ * 则这些 remove 作用于空数组、安全 no-op(返回 false,符合各自移除点注释
55
+ * 的预期),快照索引也始终稳定。
50
56
  */
51
- dispose() {
52
- if (this._disposed)
53
- return;
57
+ take() {
54
58
  this._disposed = true;
55
- // 先快照并清空,再迭代快照:dispose 期间 disposer 常回调 remove(自身)
56
- // (provide / whenService / subscribe 的自移除语义)。若在迭代中 splice 活动
57
- // 数组,索引会错位、长度缩短,导致 `this._items[i]` 取到 undefined 而抛
58
- // "is not a function"。清空在前则这些 remove 作用于空数组、安全 no-op
59
- // (返回 false,符合各自移除点注释的预期),快照索引也始终稳定。
60
59
  const items = this._items;
61
60
  this._items = [];
61
+ return items;
62
+ }
63
+ /**
64
+ * 同步逆序执行所有清理函数并清空。重复调用无效果。
65
+ * 单个函数抛错被 swallow(可选择通过 logger 记录 debug);
66
+ * 异步返回值**不等待**——需要等待落盘类清理时用 {@link disposeAsync}。
67
+ */
68
+ dispose() {
69
+ if (this._disposed)
70
+ return;
71
+ const items = this.take();
62
72
  for (let i = items.length - 1; i >= 0; i--) {
63
73
  try {
64
74
  items[i]();
@@ -68,5 +78,75 @@ export class DisposableChain {
68
78
  }
69
79
  }
70
80
  }
81
+ /**
82
+ * 逆序**串行**等待所有清理函数完成。
83
+ *
84
+ * 串行而非并发是刻意的:逆序是本类对外承诺的语义(消费侧清理先于提供侧),
85
+ * 落盘类清理常有顺序依赖。单项抛错/拒绝被隔离,不中断后续清理。
86
+ *
87
+ * @param timeoutMs 单个异步清理项的等待上限;超时后放弃等待该项、
88
+ * **继续执行后续清理项**(定时器/监听器仍能摘干净),并 warn 点名。
89
+ * 缺省或 <=0 不设限。
90
+ */
91
+ async disposeAsync(timeoutMs) {
92
+ if (this._disposed)
93
+ return;
94
+ const items = this.take();
95
+ for (let i = items.length - 1; i >= 0; i--) {
96
+ try {
97
+ const ret = items[i]();
98
+ if (ret && typeof ret.then === 'function') {
99
+ await this.awaitWithTimeout(Promise.resolve(ret), timeoutMs);
100
+ }
101
+ }
102
+ catch (err) {
103
+ this.logger?.debug('DisposableChain: dispose 抛出,已忽略:', err);
104
+ }
105
+ }
106
+ }
107
+ /**
108
+ * 等待单个清理 promise,可选超时护栏。
109
+ *
110
+ * 环境无关性记账:这是 core 首个计时器使用点。`setTimeout`/`clearTimeout`
111
+ * 是所有 JS 运行时(浏览器/Node/Deno/Worker)的共有全局,非 `node:` 专属,
112
+ * 不引入环境假设。
113
+ */
114
+ async awaitWithTimeout(p, timeoutMs) {
115
+ await awaitWithTimeout(p, timeoutMs, () => this.logger?.warn(`DisposableChain: 异步清理超过 ${timeoutMs}ms,放弃等待,继续后续清理`));
116
+ }
117
+ }
118
+ /**
119
+ * 等待一个 promise,可选超时护栏;超时则放弃等待并调 `onTimeout` 上报。
120
+ *
121
+ * 环境无关性记账:`setTimeout`/`clearTimeout` 是所有 JS 运行时(浏览器/Node/
122
+ * Deno/Worker)的共有全局,非 `node:` 专属,不引入环境假设。
123
+ *
124
+ * @internal 仅供 core 内部(DisposableChain 逐项等待、Context join 在飞拆卸)复用,
125
+ * 不从包根导出。
126
+ */
127
+ export async function awaitWithTimeout(p, timeoutMs, onTimeout) {
128
+ if (!timeoutMs || timeoutMs <= 0) {
129
+ await p;
130
+ return;
131
+ }
132
+ let timer;
133
+ try {
134
+ const winner = await Promise.race([
135
+ p.then(() => 'done'),
136
+ new Promise(resolve => {
137
+ timer = setTimeout(() => resolve('timeout'), timeoutMs);
138
+ }),
139
+ ]);
140
+ if (winner === 'timeout') {
141
+ // 放弃等待,但给原 promise 挂空 catch——迟到的 rejection 不得逃逸成 unhandledRejection
142
+ p.catch(() => { });
143
+ onTimeout();
144
+ }
145
+ }
146
+ finally {
147
+ // clearTimeout 必须在 finally:悬空定时器会拖住事件循环,延迟进程退出
148
+ if (timer !== undefined)
149
+ clearTimeout(timer);
150
+ }
71
151
  }
72
152
  //# sourceMappingURL=disposable-chain.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"disposable-chain.js","sourceRoot":"","sources":["../src/disposable-chain.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,MAAM,OAAO,eAAe;IAIG;IAHrB,MAAM,GAAmB,EAAE,CAAC;IAC5B,SAAS,GAAG,KAAK,CAAC;IAE1B,YAA6B,MAAe;QAAf,WAAM,GAAN,MAAM,CAAS;IAAG,CAAC;IAEhD,iCAAiC;IACjC,IAAI,CAAC,EAAc;QACjB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,EAAE,EAAE,CAAC;YACP,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,uCAAuC,GAAG,EAAE,CAAC,CAAC;YAClE,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC;IAED,0CAA0C;IAC1C,MAAM,CAAC,EAAc;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,GAAG,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,0CAA0C;IAC1C,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,OAAO;QACL,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,kDAAkD;QAClD,6DAA6D;QAC7D,oDAAoD;QACpD,qDAAqD;QACrD,qCAAqC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC;gBACH,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACb,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"disposable-chain.js","sourceRoot":"","sources":["../src/disposable-chain.ts"],"names":[],"mappings":"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"}
package/dist/events.d.ts CHANGED
@@ -20,7 +20,7 @@ export declare class EventBus {
20
20
  onHandlerError?: (event: string, error: unknown) => void;
21
21
  private reportHandlerError;
22
22
  /**
23
- * 一次性事件(sticky):emit 后保留最近一次参数;后续 on/once 监听该事件时
23
+ * 一次性事件(sticky):emit 后保留最近一次参数;后续 on 监听该事件时
24
24
  * 立即用缓存参数同步触发回调。用于"应用生命周期里只发一次的里程碑事件",
25
25
  * 让被热重载的插件在 reactivate 后仍能拿到启动通知。
26
26
  * 当前标记为 sticky 的事件:'ready'、'app:started'。
@@ -41,10 +41,6 @@ export declare class EventBus {
41
41
  * 再触发,避免 handler 内部的 await 影响调用方流程)。
42
42
  */
43
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
44
  /**
49
45
  * 触发事件,按注册顺序依次调用,支持异步 handler。
50
46
  *
@@ -55,10 +51,6 @@ export declare class EventBus {
55
51
  * 插件打成 error 终态)。
56
52
  */
57
53
  emit<E extends string & keyof AalisEvents>(event: E, ...args: AalisEvents[E]): Promise<void>;
58
- /**
59
- * 移除指定事件的所有监听器
60
- */
61
- removeAll(event?: string): void;
62
54
  }
63
55
  export {};
64
56
  //# sourceMappingURL=events.d.ts.map
@@ -1 +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"}
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;;;;;;;;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;CAenG"}
package/dist/events.js CHANGED
@@ -31,7 +31,7 @@ export class EventBus {
31
31
  }
32
32
  }
33
33
  /**
34
- * 一次性事件(sticky):emit 后保留最近一次参数;后续 on/once 监听该事件时
34
+ * 一次性事件(sticky):emit 后保留最近一次参数;后续 on 监听该事件时
35
35
  * 立即用缓存参数同步触发回调。用于"应用生命周期里只发一次的里程碑事件",
36
36
  * 让被热重载的插件在 reactivate 后仍能拿到启动通知。
37
37
  * 当前标记为 sticky 的事件:'ready'、'app:started'。
@@ -93,17 +93,6 @@ export class EventBus {
93
93
  this.handlers.delete(event);
94
94
  };
95
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
96
  /**
108
97
  * 触发事件,按注册顺序依次调用,支持异步 handler。
109
98
  *
@@ -130,16 +119,5 @@ export class EventBus {
130
119
  }
131
120
  }
132
121
  }
133
- /**
134
- * 移除指定事件的所有监听器
135
- */
136
- removeAll(event) {
137
- if (event) {
138
- this.handlers.delete(event);
139
- }
140
- else {
141
- this.handlers.clear();
142
- }
143
- }
144
122
  }
145
123
  //# sourceMappingURL=events.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
package/dist/hooks.d.ts CHANGED
@@ -1,23 +1,4 @@
1
1
  import type { HookContextMap, MiddlewareFn } from './types/index.js';
2
- /**
3
- * 钩子执行面 —— `ctx.hooks` 暴露给插件的窄接口。
4
- *
5
- * 与 events / services 相同的门面纪律(驱动公开、挂载走 id 绑定门面):
6
- * - **驱动公开**:任何插件都可 `ctx.hooks.run(...)` 驱动自己定义的钩子链
7
- * (对称钩子系统的立身之本,地位等价于 `ctx.emit`);
8
- * - **挂载走门面**:注册 handler 只经 `ctx.middleware(hook, fn)` —— 它闭包当前
9
- * ctx.id 作 contextId 并登记 dispose 链,插件卸载时才能被 `unregisterByContext`
10
- * 清扫。裸 `register` 默认落到 'root',会静默泄漏进全局管道,故不在本接口上。
11
- *
12
- * 完整的 {@link HookRegistry}(register / unregisterByContext / onStall)仅
13
- * App(组合根,接 onStall 到 logger)与 Context 内部持有。
14
- */
15
- export interface HookRunner {
16
- /** 执行钩子链;语义见 {@link HookRegistry.run}。 */
17
- run<K extends string & keyof HookContextMap>(hook: K, data: HookContextMap[K], defaultAction?: () => Promise<void>, opts?: {
18
- warnOnStall?: boolean;
19
- }): Promise<boolean>;
20
- }
21
2
  /**
22
3
  * 钩子注册表 —— 命名生命周期事件的 handler 总线
23
4
  *
@@ -28,8 +9,12 @@ export interface HookRunner {
28
9
  * 不再使用数字 priority:相位之间的次序由调度方(plugin-gateway 等)
29
10
  * 显式表达;相位内部的 handler 应顺序无关,或由相位拥有方约定。
30
11
  *
31
- * 插件通过 `ctx.middleware(hook, fn)` 注册 handler。
32
- * 服务在关键流程点执行 `hooks.run(hook, data, defaultAction)`。
12
+ * 插件面与 events / services 同一门面纪律(方法窄面,对象不外露):
13
+ * 注册 handler 只经 `ctx.middleware(hook, fn)`(闭包 ctx.id 作 contextId 并登记
14
+ * dispose 链,插件卸载时被 `unregisterByContext` 清扫;裸 `register` 默认落
15
+ * 'root',会静默泄漏进全局管道);驱动钩子链经 `ctx.runHook(hook, data,
16
+ * defaultAction)`。完整注册表仅 App(组合根,接 onStall 到 logger)与
17
+ * Context 内部持有。
33
18
  *
34
19
  * Handler 可以:
35
20
  * - 修改 data 对象(引用传递)
@@ -38,7 +23,7 @@ export interface HookRunner {
38
23
  *
39
24
  * 第三方插件可通过 TS declaration merging 扩展 HookContextMap。
40
25
  */
41
- export declare class HookRegistry implements HookRunner {
26
+ export declare class HookRegistry {
42
27
  private hooks;
43
28
  /**
44
29
  * 广播型相位的"卡链"上报回调(由 App 接到 logger)。
@@ -1 +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;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,UAAU;IACzB,0CAA0C;IAC1C,GAAG,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,cAAc,EACzC,IAAI,EAAE,CAAC,EACP,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,EACvB,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EACnC,IAAI,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,GAC/B,OAAO,CAAC,OAAO,CAAC,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,YAAa,YAAW,UAAU;IAE7C,OAAO,CAAC,KAAK,CAAuC;IAEpD;;;;;OAKG;IACH,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IAE1E;;;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,EACnC,IAAI,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,GAC/B,OAAO,CAAC,OAAO,CAAC;IA8BnB;;OAEG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAU7C"}
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;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,YAAY;IAEvB,OAAO,CAAC,KAAK,CAAuC;IAEpD;;;;;OAKG;IACH,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IAE1E;;;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,EACnC,IAAI,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,GAC/B,OAAO,CAAC,OAAO,CAAC;IA8BnB;;OAEG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAU7C"}
package/dist/hooks.js CHANGED
@@ -8,8 +8,12 @@
8
8
  * 不再使用数字 priority:相位之间的次序由调度方(plugin-gateway 等)
9
9
  * 显式表达;相位内部的 handler 应顺序无关,或由相位拥有方约定。
10
10
  *
11
- * 插件通过 `ctx.middleware(hook, fn)` 注册 handler。
12
- * 服务在关键流程点执行 `hooks.run(hook, data, defaultAction)`。
11
+ * 插件面与 events / services 同一门面纪律(方法窄面,对象不外露):
12
+ * 注册 handler 只经 `ctx.middleware(hook, fn)`(闭包 ctx.id 作 contextId 并登记
13
+ * dispose 链,插件卸载时被 `unregisterByContext` 清扫;裸 `register` 默认落
14
+ * 'root',会静默泄漏进全局管道);驱动钩子链经 `ctx.runHook(hook, data,
15
+ * defaultAction)`。完整注册表仅 App(组合根,接 onStall 到 logger)与
16
+ * Context 内部持有。
13
17
  *
14
18
  * Handler 可以:
15
19
  * - 修改 data 对象(引用传递)
package/dist/hooks.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,16 +1,17 @@
1
1
  export type { AppOptions } from './app.js';
2
2
  export { App, createApp } from './app.js';
3
3
  export type { AalisConfig, ConfigManagerOptions } from './config.js';
4
- export { CORE_CONFIG_SCHEMA, ConfigManager } from './config.js';
4
+ export { ConfigManager } from './config.js';
5
5
  export { Context } from './context.js';
6
+ export { type ContributionHandle, ContributionRegistry, type ContributionSpec } from './contributions.js';
6
7
  export { EventBus } from './events.js';
7
- export { HookRegistry, type HookRunner } from './hooks.js';
8
+ export { HookRegistry } from './hooks.js';
8
9
  export type { LogEntry, LogLevel } from './logger.js';
9
10
  export { DefaultLogger, formatLogLine, type Logger, LogHub, parseLogLine } from './logger.js';
10
11
  export type { PluginEntry, PluginModule, PluginState } from './plugin.js';
11
12
  export { PluginManager, parseInstanceId } from './plugin.js';
12
13
  export type { ConfigProvider, PluginDescriptor, PluginLoader, RestartStrategy } from './providers.js';
13
- export type { NormalizedDependency, ServiceEntry, ServicePriorityValue } from './service.js';
14
- export { ServiceContainer, ServicePriority } from './service.js';
15
- export type { AalisEvents, AppService, ConfigSchema, DependencyDeclaration, DisposableService, HookContextMap, InjectDeclaration, MiddlewareFn, MiddlewareNext, PluginManagerService, PluginStatusEntry, SchemaArray, SchemaField, SchemaFieldType, SchemaFieldTypes, SchemaGroup, ServiceDependency, ServiceOf, ServiceTypeMap, } from './types/index.js';
14
+ export type { NormalizedDependency, ServiceEntry, ServicePriorityValue } from './services.js';
15
+ export { ServiceContainer, ServicePriority } from './services.js';
16
+ export type { AalisEvents, AppService, ContributionPointMap, DependencyDeclaration, DisposableService, HookContextMap, InjectDeclaration, MiddlewareFn, MiddlewareNext, PluginManagerService, PluginStatusEntry, ServiceDependency, ServiceOf, ServiceTypeMap, } from './types/index.js';
16
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAeA,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,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAE3D,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,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEjE,YAAY,EACV,WAAW,EACX,UAAU,EACV,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,iBAAiB,EACjB,SAAS,EACT,cAAc,GACf,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAeA,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,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,KAAK,kBAAkB,EAAE,oBAAoB,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC1G,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,eAAe,CAAC;AAC9F,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAElE,YAAY,EACV,WAAW,EACX,UAAU,EACV,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,SAAS,EACT,cAAc,GACf,MAAM,kBAAkB,CAAC"}