@zhin.js/core 1.0.24 → 1.0.26

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 (211) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +84 -342
  3. package/lib/adapter.d.ts +45 -1
  4. package/lib/adapter.d.ts.map +1 -1
  5. package/lib/adapter.js +182 -1
  6. package/lib/adapter.js.map +1 -1
  7. package/lib/ai/agent.d.ts +126 -0
  8. package/lib/ai/agent.d.ts.map +1 -0
  9. package/lib/ai/agent.js +645 -0
  10. package/lib/ai/agent.js.map +1 -0
  11. package/lib/ai/context-manager.d.ts +213 -0
  12. package/lib/ai/context-manager.d.ts.map +1 -0
  13. package/lib/ai/context-manager.js +313 -0
  14. package/lib/ai/context-manager.js.map +1 -0
  15. package/lib/ai/conversation-memory.d.ts +181 -0
  16. package/lib/ai/conversation-memory.d.ts.map +1 -0
  17. package/lib/ai/conversation-memory.js +581 -0
  18. package/lib/ai/conversation-memory.js.map +1 -0
  19. package/lib/ai/follow-up.d.ts +131 -0
  20. package/lib/ai/follow-up.d.ts.map +1 -0
  21. package/lib/ai/follow-up.js +265 -0
  22. package/lib/ai/follow-up.js.map +1 -0
  23. package/lib/ai/index.d.ts +29 -0
  24. package/lib/ai/index.d.ts.map +1 -0
  25. package/lib/ai/index.js +34 -0
  26. package/lib/ai/index.js.map +1 -0
  27. package/lib/ai/init.d.ts +30 -0
  28. package/lib/ai/init.d.ts.map +1 -0
  29. package/lib/ai/init.js +424 -0
  30. package/lib/ai/init.js.map +1 -0
  31. package/lib/ai/output.d.ts +93 -0
  32. package/lib/ai/output.d.ts.map +1 -0
  33. package/lib/ai/output.js +176 -0
  34. package/lib/ai/output.js.map +1 -0
  35. package/lib/ai/providers/anthropic.d.ts +23 -0
  36. package/lib/ai/providers/anthropic.d.ts.map +1 -0
  37. package/lib/ai/providers/anthropic.js +322 -0
  38. package/lib/ai/providers/anthropic.js.map +1 -0
  39. package/lib/ai/providers/base.d.ts +43 -0
  40. package/lib/ai/providers/base.d.ts.map +1 -0
  41. package/lib/ai/providers/base.js +135 -0
  42. package/lib/ai/providers/base.js.map +1 -0
  43. package/lib/ai/providers/index.d.ts +12 -0
  44. package/lib/ai/providers/index.d.ts.map +1 -0
  45. package/lib/ai/providers/index.js +9 -0
  46. package/lib/ai/providers/index.js.map +1 -0
  47. package/lib/ai/providers/ollama.d.ts +25 -0
  48. package/lib/ai/providers/ollama.d.ts.map +1 -0
  49. package/lib/ai/providers/ollama.js +243 -0
  50. package/lib/ai/providers/ollama.js.map +1 -0
  51. package/lib/ai/providers/openai.d.ts +46 -0
  52. package/lib/ai/providers/openai.d.ts.map +1 -0
  53. package/lib/ai/providers/openai.js +132 -0
  54. package/lib/ai/providers/openai.js.map +1 -0
  55. package/lib/ai/rate-limiter.d.ts +38 -0
  56. package/lib/ai/rate-limiter.d.ts.map +1 -0
  57. package/lib/ai/rate-limiter.js +86 -0
  58. package/lib/ai/rate-limiter.js.map +1 -0
  59. package/lib/ai/service.d.ts +81 -0
  60. package/lib/ai/service.d.ts.map +1 -0
  61. package/lib/ai/service.js +274 -0
  62. package/lib/ai/service.js.map +1 -0
  63. package/lib/ai/session.d.ts +186 -0
  64. package/lib/ai/session.d.ts.map +1 -0
  65. package/lib/ai/session.js +443 -0
  66. package/lib/ai/session.js.map +1 -0
  67. package/lib/ai/tone-detector.d.ts +19 -0
  68. package/lib/ai/tone-detector.d.ts.map +1 -0
  69. package/lib/ai/tone-detector.js +72 -0
  70. package/lib/ai/tone-detector.js.map +1 -0
  71. package/lib/ai/tools.d.ts +45 -0
  72. package/lib/ai/tools.d.ts.map +1 -0
  73. package/lib/ai/tools.js +206 -0
  74. package/lib/ai/tools.js.map +1 -0
  75. package/lib/ai/types.d.ts +264 -0
  76. package/lib/ai/types.d.ts.map +1 -0
  77. package/lib/ai/types.js +6 -0
  78. package/lib/ai/types.js.map +1 -0
  79. package/lib/ai/user-profile.d.ts +56 -0
  80. package/lib/ai/user-profile.d.ts.map +1 -0
  81. package/lib/ai/user-profile.js +130 -0
  82. package/lib/ai/user-profile.js.map +1 -0
  83. package/lib/ai/zhin-agent.d.ts +165 -0
  84. package/lib/ai/zhin-agent.d.ts.map +1 -0
  85. package/lib/ai/zhin-agent.js +707 -0
  86. package/lib/ai/zhin-agent.js.map +1 -0
  87. package/lib/built/adapter-process.d.ts +4 -0
  88. package/lib/built/adapter-process.d.ts.map +1 -1
  89. package/lib/built/adapter-process.js +94 -0
  90. package/lib/built/adapter-process.js.map +1 -1
  91. package/lib/built/ai-trigger.d.ts +89 -0
  92. package/lib/built/ai-trigger.d.ts.map +1 -0
  93. package/lib/built/ai-trigger.js +166 -0
  94. package/lib/built/ai-trigger.js.map +1 -0
  95. package/lib/built/command.d.ts +33 -17
  96. package/lib/built/command.d.ts.map +1 -1
  97. package/lib/built/command.js +71 -44
  98. package/lib/built/command.js.map +1 -1
  99. package/lib/built/component.d.ts +42 -15
  100. package/lib/built/component.d.ts.map +1 -1
  101. package/lib/built/component.js +84 -52
  102. package/lib/built/component.js.map +1 -1
  103. package/lib/built/config.d.ts +54 -5
  104. package/lib/built/config.d.ts.map +1 -1
  105. package/lib/built/config.js +76 -10
  106. package/lib/built/config.js.map +1 -1
  107. package/lib/built/cron.d.ts +41 -18
  108. package/lib/built/cron.d.ts.map +1 -1
  109. package/lib/built/cron.js +106 -63
  110. package/lib/built/cron.js.map +1 -1
  111. package/lib/built/database.d.ts +55 -6
  112. package/lib/built/database.d.ts.map +1 -1
  113. package/lib/built/database.js +93 -22
  114. package/lib/built/database.js.map +1 -1
  115. package/lib/built/dispatcher.d.ts +118 -0
  116. package/lib/built/dispatcher.d.ts.map +1 -0
  117. package/lib/built/dispatcher.js +196 -0
  118. package/lib/built/dispatcher.js.map +1 -0
  119. package/lib/built/permission.d.ts +45 -5
  120. package/lib/built/permission.d.ts.map +1 -1
  121. package/lib/built/permission.js +56 -11
  122. package/lib/built/permission.js.map +1 -1
  123. package/lib/built/skill.d.ts +117 -0
  124. package/lib/built/skill.d.ts.map +1 -0
  125. package/lib/built/skill.js +191 -0
  126. package/lib/built/skill.js.map +1 -0
  127. package/lib/built/tool.d.ts +188 -0
  128. package/lib/built/tool.d.ts.map +1 -0
  129. package/lib/built/tool.js +749 -0
  130. package/lib/built/tool.js.map +1 -0
  131. package/lib/feature.d.ts +75 -0
  132. package/lib/feature.d.ts.map +1 -0
  133. package/lib/feature.js +69 -0
  134. package/lib/feature.js.map +1 -0
  135. package/lib/index.d.ts +6 -0
  136. package/lib/index.d.ts.map +1 -1
  137. package/lib/index.js +11 -0
  138. package/lib/index.js.map +1 -1
  139. package/lib/plugin.d.ts +53 -18
  140. package/lib/plugin.d.ts.map +1 -1
  141. package/lib/plugin.js +301 -31
  142. package/lib/plugin.js.map +1 -1
  143. package/lib/types.d.ts +248 -9
  144. package/lib/types.d.ts.map +1 -1
  145. package/lib/utils.d.ts.map +1 -1
  146. package/lib/utils.js +38 -12
  147. package/lib/utils.js.map +1 -1
  148. package/package.json +4 -4
  149. package/src/adapter.ts +206 -2
  150. package/src/ai/agent.ts +772 -0
  151. package/src/ai/context-manager.ts +440 -0
  152. package/src/ai/conversation-memory.ts +774 -0
  153. package/src/ai/follow-up.ts +357 -0
  154. package/src/ai/index.ts +128 -0
  155. package/src/ai/init.ts +502 -0
  156. package/src/ai/output.ts +261 -0
  157. package/src/ai/providers/anthropic.ts +375 -0
  158. package/src/ai/providers/base.ts +173 -0
  159. package/src/ai/providers/index.ts +13 -0
  160. package/src/ai/providers/ollama.ts +292 -0
  161. package/src/ai/providers/openai.ts +167 -0
  162. package/src/ai/rate-limiter.ts +129 -0
  163. package/src/ai/service.ts +319 -0
  164. package/src/ai/session.ts +544 -0
  165. package/src/ai/tone-detector.ts +89 -0
  166. package/src/ai/tools.ts +218 -0
  167. package/src/ai/types.ts +296 -0
  168. package/src/ai/user-profile.ts +181 -0
  169. package/src/ai/zhin-agent.ts +845 -0
  170. package/src/built/adapter-process.ts +99 -0
  171. package/src/built/ai-trigger.ts +259 -0
  172. package/src/built/command.ts +75 -69
  173. package/src/built/component.ts +94 -76
  174. package/src/built/config.ts +238 -128
  175. package/src/built/cron.ts +117 -101
  176. package/src/built/database.ts +128 -33
  177. package/src/built/dispatcher.ts +332 -0
  178. package/src/built/permission.ts +146 -54
  179. package/src/built/skill.ts +280 -0
  180. package/src/built/tool.ts +928 -0
  181. package/src/feature.ts +113 -0
  182. package/src/index.ts +11 -0
  183. package/src/plugin.ts +359 -69
  184. package/src/types.ts +306 -11
  185. package/src/utils.ts +37 -13
  186. package/tests/adapter.test.ts +153 -1
  187. package/tests/ai/agent.test.ts +614 -0
  188. package/tests/ai/ai-trigger.test.ts +368 -0
  189. package/tests/ai/context-manager.test.ts +413 -0
  190. package/tests/ai/conversation-memory.test.ts +128 -0
  191. package/tests/ai/follow-up.test.ts +175 -0
  192. package/tests/ai/integration.test.ts +584 -0
  193. package/tests/ai/output.test.ts +128 -0
  194. package/tests/ai/providers.integration.test.ts +227 -0
  195. package/tests/ai/rate-limiter.test.ts +108 -0
  196. package/tests/ai/session.test.ts +375 -0
  197. package/tests/ai/setup.ts +308 -0
  198. package/tests/ai/tone-detector.test.ts +80 -0
  199. package/tests/ai/tool.test.ts +800 -0
  200. package/tests/ai/tools-builtin.test.ts +346 -0
  201. package/tests/ai/user-profile.test.ts +73 -0
  202. package/tests/ai/zhin-agent.test.ts +177 -0
  203. package/tests/component-new.test.ts +17 -6
  204. package/tests/config.test.ts +46 -0
  205. package/tests/cron.test.ts +94 -5
  206. package/tests/dispatcher.test.ts +146 -0
  207. package/tests/feature.test.ts +145 -0
  208. package/tests/features-builtin.test.ts +191 -0
  209. package/tests/plugin.test.ts +88 -14
  210. package/tests/skill-feature.test.ts +179 -0
  211. package/tests/tool-feature.test.ts +254 -0
@@ -1,54 +1,81 @@
1
+ /**
2
+ * CommandFeature
3
+ * 管理所有插件注册的命令,继承自 Feature 抽象类
4
+ */
5
+ import { Feature } from "../feature.js";
1
6
  import { getPlugin } from "../plugin.js";
2
7
  /**
3
- * 创建命令 Context
8
+ * 命令服务 Feature
4
9
  */
5
- export function createCommandService() {
6
- const items = [];
7
- const byName = new Map();
8
- const pluginMap = new Map();
9
- const value = {
10
- items,
11
- byName,
12
- add(command, pluginName) {
13
- items.push(command);
14
- byName.set(command.pattern, command);
15
- pluginMap.set(command, pluginName);
16
- return () => value.remove(command);
17
- },
18
- remove(command) {
19
- const index = items.indexOf(command);
20
- if (index !== -1) {
21
- items.splice(index, 1);
22
- byName.delete(command.pattern);
23
- pluginMap.delete(command);
24
- return true;
25
- }
26
- return false;
27
- },
28
- get(pattern) {
29
- return byName.get(pattern);
30
- },
31
- async handle(message, plugin) {
32
- for (const command of items) {
33
- const result = await command.handle(message, plugin);
34
- if (result)
35
- return result;
36
- }
37
- return null;
10
+ export class CommandFeature extends Feature {
11
+ name = 'command';
12
+ icon = 'Terminal';
13
+ desc = '命令';
14
+ /** pattern 索引 */
15
+ byName = new Map();
16
+ /**
17
+ * 添加命令
18
+ */
19
+ add(command, pluginName) {
20
+ this.byName.set(command.pattern, command);
21
+ return super.add(command, pluginName);
22
+ }
23
+ /**
24
+ * 移除命令
25
+ */
26
+ remove(command) {
27
+ this.byName.delete(command.pattern);
28
+ return super.remove(command);
29
+ }
30
+ /**
31
+ * 按 pattern 获取命令
32
+ */
33
+ get(pattern) {
34
+ return this.byName.get(pattern);
35
+ }
36
+ /**
37
+ * 处理消息,依次尝试匹配命令
38
+ */
39
+ async handle(message, plugin) {
40
+ for (const command of this.items) {
41
+ const result = await command.handle(message, plugin);
42
+ if (result)
43
+ return result;
38
44
  }
39
- };
40
- return {
41
- name: 'command',
42
- description: '命令服务',
43
- value,
44
- extensions: {
45
+ return null;
46
+ }
47
+ /**
48
+ * 序列化为 JSON
49
+ */
50
+ toJSON(pluginName) {
51
+ const list = pluginName ? this.getByPlugin(pluginName) : this.items;
52
+ return {
53
+ name: this.name,
54
+ icon: this.icon,
55
+ desc: this.desc,
56
+ count: list.length,
57
+ items: list.map(c => ({
58
+ name: c.pattern,
59
+ desc: c.helpInfo?.desc,
60
+ usage: c.helpInfo?.usage,
61
+ examples: c.helpInfo?.examples,
62
+ })),
63
+ };
64
+ }
65
+ /**
66
+ * 提供给 Plugin.prototype 的扩展方法
67
+ */
68
+ get extensions() {
69
+ const feature = this;
70
+ return {
45
71
  addCommand(command) {
46
72
  const plugin = getPlugin();
47
- const dispose = value.add(command, plugin.name);
73
+ const dispose = feature.add(command, plugin.name);
74
+ plugin.recordFeatureContribution(feature.name, command.pattern);
48
75
  plugin.onDispose(dispose);
49
76
  return dispose;
50
- }
51
- }
52
- };
77
+ },
78
+ };
79
+ }
53
80
  }
54
81
  //# sourceMappingURL=command.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/built/command.ts"],"names":[],"mappings":"AAMA,OAAO,EAAmB,SAAS,EAAE,MAAM,cAAc,CAAC;AAuC1D;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,KAAK,GAAwC,EAAE,CAAC;IACtD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA6C,CAAC;IACpE,MAAM,SAAS,GAAG,IAAI,GAAG,EAA6C,CAAC;IAEvE,MAAM,KAAK,GAAmB;QAC5B,KAAK;QACL,MAAM;QAEN,GAAG,CAAC,OAAO,EAAE,UAAU;YACrB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpB,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACrC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YACnC,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;QAED,MAAM,CAAC,OAAO;YACZ,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjB,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBACvB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC/B,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC1B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,GAAG,CAAC,OAAO;YACT,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM;YAC1B,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;gBAC5B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACrD,IAAI,MAAM;oBAAE,OAAO,MAAM,CAAC;YAC5B,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,MAAM;QACnB,KAAK;QACL,UAAU,EAAE;YACV,UAAU,CAA8B,OAA0B;gBAChE,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;gBAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,OAA4C,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBACrF,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAC1B,OAAO,OAAO,CAAC;YACjB,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/built/command.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAe,MAAM,eAAe,CAAC;AAGrD,OAAO,EAAU,SAAS,EAAE,MAAM,cAAc,CAAC;AAqBjD;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,OAA0C;IACnE,IAAI,GAAG,SAAkB,CAAC;IAC1B,IAAI,GAAG,UAAU,CAAC;IAClB,IAAI,GAAG,IAAI,CAAC;IAErB,mBAAmB;IACV,MAAM,GAAG,IAAI,GAAG,EAA6C,CAAC;IAEvE;;OAEG;IACH,GAAG,CAAC,OAA0C,EAAE,UAAkB;QAChE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1C,OAAO,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,OAA0C;QAC/C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,OAAe;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,OAAmD,EAAE,MAAc;QAC9E,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACrD,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAC;QAC5B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,UAAmB;QACxB,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QACpE,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACpB,IAAI,EAAE,CAAC,CAAC,OAAO;gBACf,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI;gBACtB,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK;gBACxB,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ;aAC/B,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,IAAI,UAAU;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC;QACrB,OAAO;YACL,UAAU,CAA8B,OAA0B;gBAChE,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;gBAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAA4C,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBACvF,MAAM,CAAC,yBAAyB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;gBAChE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAC1B,OAAO,OAAO,CAAC;YACjB,CAAC;SACF,CAAC;IACJ,CAAC;CACF"}
@@ -1,9 +1,10 @@
1
1
  /**
2
- * Component Context
3
- * 管理所有插件注册的组件
2
+ * ComponentFeature
3
+ * 管理所有插件注册的组件,继承自 Feature 抽象类
4
4
  */
5
+ import { Feature, FeatureJSON } from "../feature.js";
5
6
  import { Component } from "../component.js";
6
- import { Context } from "../plugin.js";
7
+ import { Plugin } from "../plugin.js";
7
8
  /**
8
9
  * ComponentContext 扩展方法类型
9
10
  */
@@ -16,27 +17,53 @@ declare module "../plugin.js" {
16
17
  interface Extensions extends ComponentContextExtensions {
17
18
  }
18
19
  interface Contexts {
19
- component: ComponentService;
20
+ component: ComponentFeature;
20
21
  }
21
22
  }
22
23
  }
23
24
  /**
24
- * 组件服务数据
25
+ * 组件服务 Feature
25
26
  */
26
- export interface ComponentService {
27
+ export declare class ComponentFeature extends Feature<Component<any>> {
28
+ #private;
29
+ readonly name: "component";
30
+ readonly icon = "Box";
31
+ readonly desc = "\u7EC4\u4EF6";
27
32
  /** 按名称索引 */
28
33
  readonly byName: Map<string, Component<any>>;
29
- /** 添加组件 */
34
+ /**
35
+ * 添加组件
36
+ */
30
37
  add(component: Component<any>, pluginName: string): () => void;
31
- /** 获取所有组件名称 */
32
- getAllNames(): string[];
33
- /** 移除组件 */
38
+ /**
39
+ * 移除组件
40
+ */
34
41
  remove(component: Component<any>): boolean;
35
- /** 按名称获取 */
42
+ /**
43
+ * 获取所有组件名称
44
+ */
45
+ getAllNames(): string[];
46
+ /**
47
+ * 按名称获取组件
48
+ */
36
49
  get(name: string): Component<any> | undefined;
50
+ /**
51
+ * 生命周期: 挂载时注册消息渲染监听器
52
+ */
53
+ mounted(plugin: Plugin): void;
54
+ /**
55
+ * 生命周期: 销毁时移除监听器
56
+ */
57
+ dispose(): void;
58
+ /**
59
+ * 序列化为 JSON
60
+ */
61
+ toJSON(pluginName?: string): FeatureJSON;
62
+ /**
63
+ * 提供给 Plugin.prototype 的扩展方法
64
+ */
65
+ get extensions(): {
66
+ addComponent<T extends Component<any>>(component: T): () => void;
67
+ };
37
68
  }
38
- /**
39
- * 创建组件 Context
40
- */
41
- export declare function createComponentService(): Context<'component', ComponentContextExtensions>;
42
69
  //# sourceMappingURL=component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../src/built/component.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAoB,MAAM,iBAAiB,CAAC;AAE9D,OAAO,EAAE,OAAO,EAAqB,MAAM,cAAc,CAAC;AAI1D;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,WAAW;IACX,YAAY,CAAC,CAAC,SAAS,SAAS,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,MAAM,IAAI,CAAC;CAClE;AAGD,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,MAAM,CAAC;QACf,UAAU,UAAW,SAAQ,0BAA0B;SAAG;QAC1D,UAAU,QAAQ;YAChB,SAAS,EAAE,gBAAgB,CAAC;SAC7B;KACF;CACF;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,YAAY;IACZ,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,WAAW;IACX,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;IAC/D,eAAe;IACf,WAAW,IAAI,MAAM,EAAE,CAAC;IACxB,WAAW;IACX,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;IAC3C,YAAY;IACZ,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;CAC/C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAAC,WAAW,EAAE,0BAA0B,CAAC,CA6DzF"}
1
+ {"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../src/built/component.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,SAAS,EAAoB,MAAM,iBAAiB,CAAC;AAE9D,OAAO,EAAE,MAAM,EAAa,MAAM,cAAc,CAAC;AAIjD;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,WAAW;IACX,YAAY,CAAC,CAAC,SAAS,SAAS,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,MAAM,IAAI,CAAC;CAClE;AAGD,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,MAAM,CAAC;QACf,UAAU,UAAW,SAAQ,0BAA0B;SAAG;QAC1D,UAAU,QAAQ;YAChB,SAAS,EAAE,gBAAgB,CAAC;SAC7B;KACF;CACF;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;;IAC3D,QAAQ,CAAC,IAAI,EAAG,WAAW,CAAU;IACrC,QAAQ,CAAC,IAAI,SAAS;IACtB,QAAQ,CAAC,IAAI,kBAAQ;IAErB,YAAY;IACZ,QAAQ,CAAC,MAAM,8BAAqC;IAMpD;;OAEG;IACH,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,IAAI;IAK9D;;OAEG;IACH,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,OAAO;IAK1C;;OAEG;IACH,WAAW,IAAI,MAAM,EAAE;IAIvB;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,SAAS;IAI7C;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQ7B;;OAEG;IACH,OAAO,IAAI,IAAI;IAOf;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW;IAcxC;;OAEG;IACH,IAAI,UAAU;qBAGG,CAAC,SAAS,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,SAvEG,IAAI;MA+E7D;CACF"}
@@ -1,65 +1,97 @@
1
1
  /**
2
- * Component Context
3
- * 管理所有插件注册的组件
2
+ * ComponentFeature
3
+ * 管理所有插件注册的组件,继承自 Feature 抽象类
4
4
  */
5
+ import { Feature } from "../feature.js";
5
6
  import { renderComponents } from "../component.js";
6
7
  import { getPlugin } from "../plugin.js";
7
8
  /**
8
- * 创建组件 Context
9
+ * 组件服务 Feature
9
10
  */
10
- export function createComponentService() {
11
- const byName = new Map();
12
- const pluginMap = new Map();
13
- let listener;
14
- let rootPlugin;
15
- const value = {
16
- byName,
17
- add(component, pluginName) {
18
- byName.set(component.name, component);
19
- pluginMap.set(component, pluginName);
20
- return () => value.remove(component);
21
- },
22
- getAllNames() {
23
- return Array.from(byName.keys());
24
- },
25
- remove(component) {
26
- if (byName.has(component.name)) {
27
- byName.delete(component.name);
28
- pluginMap.delete(component);
29
- return true;
30
- }
31
- return false;
32
- },
33
- get(name) {
34
- return byName.get(name);
11
+ export class ComponentFeature extends Feature {
12
+ name = 'component';
13
+ icon = 'Box';
14
+ desc = '组件';
15
+ /** 按名称索引 */
16
+ byName = new Map();
17
+ /** 内部状态:消息渲染监听器 & 宿主插件 */
18
+ #listener;
19
+ #rootPlugin;
20
+ /**
21
+ * 添加组件
22
+ */
23
+ add(component, pluginName) {
24
+ this.byName.set(component.name, component);
25
+ return super.add(component, pluginName);
26
+ }
27
+ /**
28
+ * 移除组件
29
+ */
30
+ remove(component) {
31
+ this.byName.delete(component.name);
32
+ return super.remove(component);
33
+ }
34
+ /**
35
+ * 获取所有组件名称
36
+ */
37
+ getAllNames() {
38
+ return Array.from(this.byName.keys());
39
+ }
40
+ /**
41
+ * 按名称获取组件
42
+ */
43
+ get(name) {
44
+ return this.byName.get(name);
45
+ }
46
+ /**
47
+ * 生命周期: 挂载时注册消息渲染监听器
48
+ */
49
+ mounted(plugin) {
50
+ this.#rootPlugin = plugin;
51
+ this.#listener = (options) => {
52
+ return renderComponents(this.byName, options);
53
+ };
54
+ plugin.root.on('before.sendMessage', this.#listener);
55
+ }
56
+ /**
57
+ * 生命周期: 销毁时移除监听器
58
+ */
59
+ dispose() {
60
+ if (this.#listener && this.#rootPlugin) {
61
+ this.#rootPlugin.root.off('before.sendMessage', this.#listener);
62
+ this.#listener = undefined;
35
63
  }
36
- };
37
- return {
38
- name: 'component',
39
- description: '组件服务',
40
- mounted(plugin) {
41
- rootPlugin = plugin;
42
- // 创建消息渲染监听器
43
- listener = (options) => {
44
- return renderComponents(byName, options);
45
- };
46
- plugin.root.on('before.sendMessage', listener);
47
- return value;
48
- },
49
- dispose() {
50
- if (listener && rootPlugin) {
51
- rootPlugin.root.off('before.sendMessage', listener);
52
- listener = undefined;
53
- }
54
- },
55
- extensions: {
64
+ }
65
+ /**
66
+ * 序列化为 JSON
67
+ */
68
+ toJSON(pluginName) {
69
+ const list = pluginName ? this.getByPlugin(pluginName) : this.items;
70
+ return {
71
+ name: this.name,
72
+ icon: this.icon,
73
+ desc: this.desc,
74
+ count: list.length,
75
+ items: list.map(c => ({
76
+ name: c.name,
77
+ type: 'component',
78
+ })),
79
+ };
80
+ }
81
+ /**
82
+ * 提供给 Plugin.prototype 的扩展方法
83
+ */
84
+ get extensions() {
85
+ const feature = this;
86
+ return {
56
87
  addComponent(component) {
57
88
  const plugin = getPlugin();
58
- const dispose = value.add(component, plugin.name);
89
+ const dispose = feature.add(component, plugin.name);
90
+ plugin.recordFeatureContribution(feature.name, component.name);
59
91
  plugin.onDispose(dispose);
60
92
  return dispose;
61
- }
62
- }
63
- };
93
+ },
94
+ };
95
+ }
64
96
  }
65
97
  //# sourceMappingURL=component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"component.js","sourceRoot":"","sources":["../../src/built/component.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAa,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAE9D,OAAO,EAAmB,SAAS,EAAE,MAAM,cAAc,CAAC;AAsC1D;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,MAAM,MAAM,GAAG,IAAI,GAAG,EAA0B,CAAC;IACjD,MAAM,SAAS,GAAG,IAAI,GAAG,EAA0B,CAAC;IACpD,IAAI,QAA8B,CAAC;IACnC,IAAI,UAA8B,CAAC;IAEnC,MAAM,KAAK,GAAqB;QAC9B,MAAM;QAEN,GAAG,CAAC,SAAS,EAAE,UAAU;YACvB,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACtC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YACrC,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACvC,CAAC;QACD,WAAW;YACT,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,CAAC,SAAS;YACd,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC9B,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC5B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,GAAG,CAAC,IAAI;YACN,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;KACF,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,MAAM;QAEnB,OAAO,CAAC,MAAc;YACpB,UAAU,GAAG,MAAM,CAAC;YACpB,YAAY;YACZ,QAAQ,GAAG,CAAC,OAAoB,EAAE,EAAE;gBAClC,OAAO,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC3C,CAAC,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;YAC/C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO;YACL,IAAI,QAAQ,IAAI,UAAU,EAAE,CAAC;gBAC3B,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;gBACpD,QAAQ,GAAG,SAAS,CAAC;YACvB,CAAC;QACH,CAAC;QAED,UAAU,EAAE;YACV,YAAY,CAA2B,SAAY;gBACjD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;gBAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBAClD,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAC1B,OAAO,OAAO,CAAC;YACjB,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"component.js","sourceRoot":"","sources":["../../src/built/component.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { Schema } from "@zhin.js/schema";
2
+ import { Feature, FeatureJSON } from "../feature.js";
2
3
  export declare class ConfigLoader<T extends object> {
3
4
  #private;
4
5
  filename: string;
@@ -15,17 +16,65 @@ export declare namespace ConfigLoader {
15
16
  const supportedExtensions: string[];
16
17
  function load<T extends object>(filename: string, initial?: T, schema?: Schema<T>): ConfigLoader<T>;
17
18
  }
18
- export declare class ConfigService {
19
- configs: Map<string, ConfigLoader<any>>;
20
- constructor();
19
+ /**
20
+ * 配置项声明记录
21
+ */
22
+ export interface ConfigRecord {
23
+ key: string;
24
+ defaultValue: any;
25
+ }
26
+ /**
27
+ * ConfigFeature 扩展方法类型
28
+ */
29
+ export interface ConfigContextExtensions {
30
+ /** 声明插件配置项(key + 默认值),如果配置文件中不存在则写入默认值 */
31
+ addConfig(key: string, defaultValue: any): () => void;
32
+ }
33
+ declare module "../plugin.js" {
34
+ namespace Plugin {
35
+ interface Extensions extends ConfigContextExtensions {
36
+ }
37
+ interface Contexts {
38
+ config: ConfigFeature;
39
+ }
40
+ }
41
+ }
42
+ export declare class ConfigFeature extends Feature<ConfigRecord> {
43
+ #private;
44
+ readonly name: "config";
45
+ readonly icon = "Settings";
46
+ readonly desc = "\u914D\u7F6E";
47
+ /** 内部配置文件管理 */
48
+ readonly configs: Map<string, ConfigLoader<any>>;
49
+ /**
50
+ * 加载配置文件
51
+ */
21
52
  load<T extends object>(filename: string, initial?: Partial<T>, schema?: Schema<T>): ConfigLoader<T>;
53
+ /**
54
+ * 获取配置数据(代理模式,自动保存)
55
+ */
22
56
  get<T extends object>(filename: string, initial?: Partial<T>, schema?: Schema<T>): T;
57
+ /**
58
+ * 获取原始配置数据
59
+ */
23
60
  getRaw<T extends object>(filename: string, initial?: Partial<T>, schema?: Schema<T>): T;
24
61
  /**
25
62
  * 更新配置文件内容
26
- * @param filename 配置文件名
27
- * @param data 新的配置数据
28
63
  */
29
64
  set<T extends object>(filename: string, data: T): void;
65
+ /**
66
+ * 序列化为 JSON
67
+ */
68
+ toJSON(pluginName?: string): FeatureJSON;
69
+ /**
70
+ * 提供给 Plugin.prototype 的扩展方法
71
+ */
72
+ get extensions(): {
73
+ addConfig(key: string, defaultValue: any): () => void;
74
+ };
30
75
  }
76
+ /**
77
+ * @deprecated Use ConfigFeature instead
78
+ */
79
+ export declare const ConfigService: typeof ConfigFeature;
31
80
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/built/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,qBAAa,YAAY,CAAC,CAAC,SAAS,MAAM;;IAWnB,QAAQ,EAAE,MAAM;IAAS,OAAO,EAAC,CAAC;IAAS,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAThF,IAAI,IAAI,IAAI,CAAC,CAEZ;IACD,IAAI,GAAG,IAAI,CAAC,CAEX;IACD,IAAI,SAAS,WAEZ;gBACkB,QAAQ,EAAE,MAAM,EAAS,OAAO,EAAC,CAAC,EAAS,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,YAAA;IA+ChF,IAAI;IAsBJ,IAAI,CAAC,QAAQ,EAAE,MAAM;CAWxB;AACD,yBAAiB,YAAY,CAAA;IAClB,MAAM,mBAAmB,UAA6B,CAAC;IAC9D,SAAgB,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAC,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,mBAItF;CACJ;AACD,qBAAa,aAAa;IACtB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAa;;IAGpD,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAShF,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;IAMnF,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;IAMtF;;;;OAIG;IACH,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI;CAOzD"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/built/config.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAOrD,qBAAa,YAAY,CAAC,CAAC,SAAS,MAAM;;IAWrB,QAAQ,EAAE,MAAM;IAAS,OAAO,EAAE,CAAC;IAAS,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IATjF,IAAI,IAAI,IAAI,CAAC,CAEZ;IACD,IAAI,GAAG,IAAI,CAAC,CAEX;IACD,IAAI,SAAS,WAEZ;gBACkB,QAAQ,EAAE,MAAM,EAAS,OAAO,EAAE,CAAC,EAAS,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,YAAA;IA2CjF,IAAI;IAsBJ,IAAI,CAAC,QAAQ,EAAE,MAAM;CAWtB;AAED,yBAAiB,YAAY,CAAC;IACrB,MAAM,mBAAmB,UAA6B,CAAC;IAC9D,SAAgB,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,mBAIvF;CACF;AAMD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,GAAG,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,0CAA0C;IAC1C,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,GAAG,MAAM,IAAI,CAAC;CACvD;AAED,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,MAAM,CAAC;QACf,UAAU,UAAW,SAAQ,uBAAuB;SAAG;QACvD,UAAU,QAAQ;YAChB,MAAM,EAAE,aAAa,CAAC;SACvB;KACF;CACF;AAED,qBAAa,aAAc,SAAQ,OAAO,CAAC,YAAY,CAAC;;IACtD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,IAAI,kBAAQ;IAErB,eAAe;IACf,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAa;IAK7D;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;IAanG;;OAEG;IACH,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;IAOpF;;OAEG;IACH,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;IAOvF;;OAEG;IACH,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI;IAOtD;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW;IAcxC;;OAEG;IACH,IAAI,UAAU;uBAGK,MAAM,gBAAgB,GAAG;MAsB3C;CACF;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,sBAAgB,CAAC"}
@@ -1,6 +1,16 @@
1
+ /**
2
+ * ConfigFeature
3
+ * 配置管理服务,继承自 Feature 抽象类
4
+ * 保留原有 ConfigLoader / ConfigService 逻辑,增加 addConfig 扩展
5
+ */
1
6
  import path from "node:path";
2
7
  import fs from "node:fs";
3
8
  import { stringify as stringifyYaml, parse as parseYaml } from "yaml";
9
+ import { Feature } from "../feature.js";
10
+ import { getPlugin } from "../plugin.js";
11
+ // ============================================================================
12
+ // ConfigLoader(保持不变)
13
+ // ============================================================================
4
14
  export class ConfigLoader {
5
15
  filename;
6
16
  initial;
@@ -24,20 +34,16 @@ export class ConfigLoader {
24
34
  #proxy(data, loader) {
25
35
  return new Proxy(data, {
26
36
  get(target, prop, receiver) {
27
- // 对于特殊属性(如 Symbol、prototype 等),直接返回原始值
28
37
  if (typeof prop === 'symbol' || prop === 'constructor' || prop === 'prototype') {
29
38
  return Reflect.get(target, prop, receiver);
30
39
  }
31
40
  const result = Reflect.get(target, prop, receiver);
32
- // 对于函数属性(如数组的 map、filter 等),直接返回,不进行代理
33
41
  if (typeof result === 'function') {
34
42
  return result;
35
43
  }
36
- // 对于对象和数组,递归代理(但排除函数)
37
44
  if (result instanceof Object && result !== null && typeof result !== 'function') {
38
45
  return loader.#proxy(result, loader);
39
46
  }
40
- // 处理环境变量占位符
41
47
  if (typeof result === 'string') {
42
48
  if (result.startsWith('\\${') && result.endsWith('}'))
43
49
  return result.slice(1);
@@ -106,10 +112,17 @@ export class ConfigLoader {
106
112
  }
107
113
  ConfigLoader.load = load;
108
114
  })(ConfigLoader || (ConfigLoader = {}));
109
- export class ConfigService {
115
+ export class ConfigFeature extends Feature {
116
+ name = 'config';
117
+ icon = 'Settings';
118
+ desc = '配置';
119
+ /** 内部配置文件管理 */
110
120
  configs = new Map();
111
- constructor() {
112
- }
121
+ /** 主配置文件名(第一个加载的配置文件) */
122
+ #primaryConfigFile = '';
123
+ /**
124
+ * 加载配置文件
125
+ */
113
126
  load(filename, initial, schema) {
114
127
  const ext = path.extname(filename).toLowerCase();
115
128
  if (!ConfigLoader.supportedExtensions.includes(ext)) {
@@ -117,8 +130,14 @@ export class ConfigService {
117
130
  }
118
131
  const config = ConfigLoader.load(filename, initial, schema);
119
132
  this.configs.set(filename, config);
133
+ if (!this.#primaryConfigFile) {
134
+ this.#primaryConfigFile = filename;
135
+ }
120
136
  return config;
121
137
  }
138
+ /**
139
+ * 获取配置数据(代理模式,自动保存)
140
+ */
122
141
  get(filename, initial, schema) {
123
142
  if (!this.configs.has(filename))
124
143
  this.load(filename, initial, schema);
@@ -127,6 +146,9 @@ export class ConfigService {
127
146
  throw new Error(`配置文件 ${filename} 未加载`);
128
147
  return config.data;
129
148
  }
149
+ /**
150
+ * 获取原始配置数据
151
+ */
130
152
  getRaw(filename, initial, schema) {
131
153
  if (!this.configs.has(filename))
132
154
  this.load(filename, initial, schema);
@@ -137,16 +159,60 @@ export class ConfigService {
137
159
  }
138
160
  /**
139
161
  * 更新配置文件内容
140
- * @param filename 配置文件名
141
- * @param data 新的配置数据
142
162
  */
143
163
  set(filename, data) {
144
164
  const config = this.configs.get(filename);
145
165
  if (!config)
146
166
  throw new Error(`配置文件 ${filename} 未加载`);
147
- // 直接更新内部数据(会触发 Proxy 的 set 拦截器并自动保存)
148
167
  Object.assign(config.raw, data);
149
168
  config.save(path.resolve(process.cwd(), filename));
150
169
  }
170
+ /**
171
+ * 序列化为 JSON
172
+ */
173
+ toJSON(pluginName) {
174
+ const list = pluginName ? this.getByPlugin(pluginName) : this.items;
175
+ return {
176
+ name: this.name,
177
+ icon: this.icon,
178
+ desc: this.desc,
179
+ count: list.length,
180
+ items: list.map(r => ({
181
+ name: r.key,
182
+ // 不暴露 defaultValue 以防止泄露密钥/令牌
183
+ })),
184
+ };
185
+ }
186
+ /**
187
+ * 提供给 Plugin.prototype 的扩展方法
188
+ */
189
+ get extensions() {
190
+ const feature = this;
191
+ return {
192
+ addConfig(key, defaultValue) {
193
+ const plugin = getPlugin();
194
+ // 尝试写入主配置文件(如果 key 不存在)
195
+ if (feature.#primaryConfigFile) {
196
+ const config = feature.configs.get(feature.#primaryConfigFile);
197
+ if (config) {
198
+ const raw = config.raw;
199
+ if (!(key in raw)) {
200
+ raw[key] = defaultValue;
201
+ config.save(path.resolve(process.cwd(), feature.#primaryConfigFile));
202
+ }
203
+ }
204
+ }
205
+ const record = { key, defaultValue };
206
+ const dispose = feature.add(record, plugin.name);
207
+ plugin.recordFeatureContribution(feature.name, key);
208
+ plugin.onDispose(dispose);
209
+ return dispose;
210
+ },
211
+ };
212
+ }
151
213
  }
214
+ /**
215
+ * @deprecated Use ConfigFeature instead
216
+ */
217
+ export const ConfigService = ConfigFeature;
152
218
  //# sourceMappingURL=config.js.map