@zhin.js/core 1.0.25 → 1.0.27

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 (202) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +84 -342
  3. package/lib/adapter.d.ts +17 -0
  4. package/lib/adapter.d.ts.map +1 -1
  5. package/lib/adapter.js +84 -2
  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/ai-trigger.d.ts.map +1 -1
  88. package/lib/built/ai-trigger.js +7 -3
  89. package/lib/built/ai-trigger.js.map +1 -1
  90. package/lib/built/command.d.ts +33 -17
  91. package/lib/built/command.d.ts.map +1 -1
  92. package/lib/built/command.js +71 -44
  93. package/lib/built/command.js.map +1 -1
  94. package/lib/built/component.d.ts +42 -15
  95. package/lib/built/component.d.ts.map +1 -1
  96. package/lib/built/component.js +84 -52
  97. package/lib/built/component.js.map +1 -1
  98. package/lib/built/config.d.ts +64 -5
  99. package/lib/built/config.d.ts.map +1 -1
  100. package/lib/built/config.js +129 -12
  101. package/lib/built/config.js.map +1 -1
  102. package/lib/built/cron.d.ts +41 -18
  103. package/lib/built/cron.d.ts.map +1 -1
  104. package/lib/built/cron.js +106 -63
  105. package/lib/built/cron.js.map +1 -1
  106. package/lib/built/database.d.ts +55 -6
  107. package/lib/built/database.d.ts.map +1 -1
  108. package/lib/built/database.js +93 -22
  109. package/lib/built/database.js.map +1 -1
  110. package/lib/built/dispatcher.d.ts +118 -0
  111. package/lib/built/dispatcher.d.ts.map +1 -0
  112. package/lib/built/dispatcher.js +196 -0
  113. package/lib/built/dispatcher.js.map +1 -0
  114. package/lib/built/permission.d.ts +45 -5
  115. package/lib/built/permission.d.ts.map +1 -1
  116. package/lib/built/permission.js +56 -11
  117. package/lib/built/permission.js.map +1 -1
  118. package/lib/built/skill.d.ts +117 -0
  119. package/lib/built/skill.d.ts.map +1 -0
  120. package/lib/built/skill.js +191 -0
  121. package/lib/built/skill.js.map +1 -0
  122. package/lib/built/tool.d.ts +71 -164
  123. package/lib/built/tool.d.ts.map +1 -1
  124. package/lib/built/tool.js +212 -297
  125. package/lib/built/tool.js.map +1 -1
  126. package/lib/feature.d.ts +75 -0
  127. package/lib/feature.d.ts.map +1 -0
  128. package/lib/feature.js +69 -0
  129. package/lib/feature.js.map +1 -0
  130. package/lib/index.d.ts +4 -0
  131. package/lib/index.d.ts.map +1 -1
  132. package/lib/index.js +7 -0
  133. package/lib/index.js.map +1 -1
  134. package/lib/plugin.d.ts +25 -17
  135. package/lib/plugin.d.ts.map +1 -1
  136. package/lib/plugin.js +180 -20
  137. package/lib/plugin.js.map +1 -1
  138. package/lib/types.d.ts +4 -9
  139. package/lib/types.d.ts.map +1 -1
  140. package/package.json +6 -6
  141. package/src/adapter.ts +101 -2
  142. package/src/ai/agent.ts +772 -0
  143. package/src/ai/context-manager.ts +440 -0
  144. package/src/ai/conversation-memory.ts +774 -0
  145. package/src/ai/follow-up.ts +357 -0
  146. package/src/ai/index.ts +128 -0
  147. package/src/ai/init.ts +502 -0
  148. package/src/ai/output.ts +261 -0
  149. package/src/ai/providers/anthropic.ts +375 -0
  150. package/src/ai/providers/base.ts +173 -0
  151. package/src/ai/providers/index.ts +13 -0
  152. package/src/ai/providers/ollama.ts +292 -0
  153. package/src/ai/providers/openai.ts +167 -0
  154. package/src/ai/rate-limiter.ts +129 -0
  155. package/src/ai/service.ts +319 -0
  156. package/src/ai/session.ts +544 -0
  157. package/src/ai/tone-detector.ts +89 -0
  158. package/src/ai/tools.ts +218 -0
  159. package/src/ai/types.ts +296 -0
  160. package/src/ai/user-profile.ts +181 -0
  161. package/src/ai/zhin-agent.ts +845 -0
  162. package/src/built/ai-trigger.ts +6 -3
  163. package/src/built/command.ts +75 -69
  164. package/src/built/component.ts +94 -76
  165. package/src/built/config.ts +288 -128
  166. package/src/built/cron.ts +117 -101
  167. package/src/built/database.ts +128 -33
  168. package/src/built/dispatcher.ts +332 -0
  169. package/src/built/permission.ts +146 -54
  170. package/src/built/skill.ts +280 -0
  171. package/src/built/tool.ts +245 -366
  172. package/src/feature.ts +113 -0
  173. package/src/index.ts +7 -0
  174. package/src/plugin.ts +198 -33
  175. package/src/types.ts +6 -10
  176. package/tests/adapter.test.ts +153 -1
  177. package/tests/ai/agent.test.ts +614 -0
  178. package/tests/ai/ai-trigger.test.ts +368 -0
  179. package/tests/ai/context-manager.test.ts +413 -0
  180. package/tests/ai/conversation-memory.test.ts +128 -0
  181. package/tests/ai/follow-up.test.ts +175 -0
  182. package/tests/ai/integration.test.ts +584 -0
  183. package/tests/ai/output.test.ts +128 -0
  184. package/tests/ai/providers.integration.test.ts +227 -0
  185. package/tests/ai/rate-limiter.test.ts +108 -0
  186. package/tests/ai/session.test.ts +375 -0
  187. package/tests/ai/setup.ts +308 -0
  188. package/tests/ai/tone-detector.test.ts +80 -0
  189. package/tests/ai/tool.test.ts +800 -0
  190. package/tests/ai/tools-builtin.test.ts +346 -0
  191. package/tests/ai/user-profile.test.ts +73 -0
  192. package/tests/ai/zhin-agent.test.ts +177 -0
  193. package/tests/config.test.ts +46 -0
  194. package/tests/cron.test.ts +94 -5
  195. package/tests/dispatcher.test.ts +146 -0
  196. package/tests/feature.test.ts +145 -0
  197. package/tests/features-builtin.test.ts +191 -0
  198. package/tests/plugin.test.ts +88 -14
  199. package/tests/skill-feature.test.ts +179 -0
  200. package/tests/tool-feature.test.ts +254 -0
  201. package/test/minimal-bot.ts +0 -31
  202. package/test/stress-test.ts +0 -123
@@ -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;
@@ -13,19 +14,77 @@ export declare class ConfigLoader<T extends object> {
13
14
  }
14
15
  export declare namespace ConfigLoader {
15
16
  const supportedExtensions: string[];
17
+ /**
18
+ * 自动发现配置文件(按优先级:yml > yaml > json > toml)
19
+ */
20
+ function discover(basename: string): string | null;
16
21
  function load<T extends object>(filename: string, initial?: T, schema?: Schema<T>): ConfigLoader<T>;
17
22
  }
18
- export declare class ConfigService {
19
- configs: Map<string, ConfigLoader<any>>;
20
- constructor();
23
+ /**
24
+ * 配置项声明记录
25
+ */
26
+ export interface ConfigRecord {
27
+ key: string;
28
+ defaultValue: any;
29
+ }
30
+ /**
31
+ * ConfigFeature 扩展方法类型
32
+ */
33
+ export interface ConfigContextExtensions {
34
+ /** 声明插件配置项(key + 默认值),如果配置文件中不存在则写入默认值 */
35
+ addConfig(key: string, defaultValue: any): () => void;
36
+ }
37
+ declare module "../plugin.js" {
38
+ namespace Plugin {
39
+ interface Extensions extends ConfigContextExtensions {
40
+ }
41
+ interface Contexts {
42
+ config: ConfigFeature;
43
+ }
44
+ }
45
+ }
46
+ export declare class ConfigFeature extends Feature<ConfigRecord> {
47
+ #private;
48
+ readonly name: "config";
49
+ readonly icon = "Settings";
50
+ readonly desc = "\u914D\u7F6E";
51
+ /** 内部配置文件管理 */
52
+ readonly configs: Map<string, ConfigLoader<any>>;
53
+ /** 获取主配置文件名 */
54
+ get primaryFile(): string;
55
+ /**
56
+ * 加载配置文件
57
+ */
21
58
  load<T extends object>(filename: string, initial?: Partial<T>, schema?: Schema<T>): ConfigLoader<T>;
59
+ /**
60
+ * 获取配置数据(代理模式,自动保存)
61
+ */
22
62
  get<T extends object>(filename: string, initial?: Partial<T>, schema?: Schema<T>): T;
63
+ /**
64
+ * 获取主配置文件数据(第一个加载的配置文件)
65
+ */
66
+ getPrimary<T extends object>(): T;
67
+ /**
68
+ * 获取原始配置数据
69
+ */
23
70
  getRaw<T extends object>(filename: string, initial?: Partial<T>, schema?: Schema<T>): T;
24
71
  /**
25
72
  * 更新配置文件内容
26
- * @param filename 配置文件名
27
- * @param data 新的配置数据
28
73
  */
29
74
  set<T extends object>(filename: string, data: T): void;
75
+ /**
76
+ * 序列化为 JSON
77
+ */
78
+ toJSON(pluginName?: string): FeatureJSON;
79
+ /**
80
+ * 提供给 Plugin.prototype 的扩展方法
81
+ */
82
+ get extensions(): {
83
+ addConfig(key: string, defaultValue: any): () => void;
84
+ };
30
85
  }
86
+ /**
87
+ * @deprecated Use ConfigFeature instead
88
+ */
89
+ export declare const ConfigService: typeof ConfigFeature;
31
90
  //# 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":"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"}
@@ -1,6 +1,17 @@
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 { parse as parseToml, stringify as stringifyToml } from "smol-toml";
10
+ import { Feature } from "../feature.js";
11
+ import { getPlugin } from "../plugin.js";
12
+ // ============================================================================
13
+ // ConfigLoader(保持不变)
14
+ // ============================================================================
4
15
  export class ConfigLoader {
5
16
  filename;
6
17
  initial;
@@ -24,27 +35,41 @@ export class ConfigLoader {
24
35
  #proxy(data, loader) {
25
36
  return new Proxy(data, {
26
37
  get(target, prop, receiver) {
27
- // 对于特殊属性(如 Symbol、prototype 等),直接返回原始值
28
38
  if (typeof prop === 'symbol' || prop === 'constructor' || prop === 'prototype') {
29
39
  return Reflect.get(target, prop, receiver);
30
40
  }
31
41
  const result = Reflect.get(target, prop, receiver);
32
- // 对于函数属性(如数组的 map、filter 等),直接返回,不进行代理
33
42
  if (typeof result === 'function') {
34
43
  return result;
35
44
  }
36
- // 对于对象和数组,递归代理(但排除函数)
37
45
  if (result instanceof Object && result !== null && typeof result !== 'function') {
38
46
  return loader.#proxy(result, loader);
39
47
  }
40
- // 处理环境变量占位符
41
48
  if (typeof result === 'string') {
42
49
  if (result.startsWith('\\${') && result.endsWith('}'))
43
50
  return result.slice(1);
44
51
  if (/^\$\{(.*)\}$/.test(result)) {
45
52
  const content = result.slice(2, -1);
46
- const [key, ...rest] = content.split(':');
47
- const defaultValue = rest.length > 0 ? rest.join(':') : undefined;
53
+ // 支持 bash 风格的默认值语法:${VAR:-default} 和 ${VAR:=default}
54
+ // 同时兼容简单语法 ${VAR:default}
55
+ let key;
56
+ let defaultValue;
57
+ const bashDefaultMatch = content.match(/^([^:}]+):[-=](.*)$/);
58
+ if (bashDefaultMatch) {
59
+ // ${VAR:-default} 或 ${VAR:=default}
60
+ key = bashDefaultMatch[1];
61
+ defaultValue = bashDefaultMatch[2];
62
+ }
63
+ else if (content.includes(':')) {
64
+ // ${VAR:default}(旧的简单语法)
65
+ const [k, ...rest] = content.split(':');
66
+ key = k;
67
+ defaultValue = rest.join(':');
68
+ }
69
+ else {
70
+ key = content;
71
+ defaultValue = undefined;
72
+ }
48
73
  return process.env[key] ?? defaultValue ?? loader.initial[key] ?? result;
49
74
  }
50
75
  }
@@ -77,6 +102,9 @@ export class ConfigLoader {
77
102
  case ".yml":
78
103
  rawConfig = parseYaml(content);
79
104
  break;
105
+ case ".toml":
106
+ rawConfig = parseToml(content);
107
+ break;
80
108
  }
81
109
  if (this.schema) {
82
110
  this.#data = this.schema(rawConfig || this.initial);
@@ -94,11 +122,28 @@ export class ConfigLoader {
94
122
  case ".yml":
95
123
  fs.writeFileSync(fullPath, stringifyYaml(this.#data));
96
124
  break;
125
+ case ".toml":
126
+ fs.writeFileSync(fullPath, stringifyToml(this.#data));
127
+ break;
97
128
  }
98
129
  }
99
130
  }
100
131
  (function (ConfigLoader) {
101
- ConfigLoader.supportedExtensions = [".json", ".yaml", ".yml"];
132
+ ConfigLoader.supportedExtensions = [".json", ".yaml", ".yml", ".toml"];
133
+ /**
134
+ * 自动发现配置文件(按优先级:yml > yaml > json > toml)
135
+ */
136
+ function discover(basename) {
137
+ const cwd = process.cwd();
138
+ for (const ext of ['.yml', '.yaml', '.json', '.toml']) {
139
+ const filename = `${basename}${ext}`;
140
+ if (fs.existsSync(path.resolve(cwd, filename))) {
141
+ return filename;
142
+ }
143
+ }
144
+ return null;
145
+ }
146
+ ConfigLoader.discover = discover;
102
147
  function load(filename, initial, schema) {
103
148
  const result = new ConfigLoader(filename, initial ?? {}, schema);
104
149
  result.load();
@@ -106,10 +151,21 @@ export class ConfigLoader {
106
151
  }
107
152
  ConfigLoader.load = load;
108
153
  })(ConfigLoader || (ConfigLoader = {}));
109
- export class ConfigService {
154
+ export class ConfigFeature extends Feature {
155
+ name = 'config';
156
+ icon = 'Settings';
157
+ desc = '配置';
158
+ /** 内部配置文件管理 */
110
159
  configs = new Map();
111
- constructor() {
160
+ /** 主配置文件名(第一个加载的配置文件) */
161
+ #primaryConfigFile = '';
162
+ /** 获取主配置文件名 */
163
+ get primaryFile() {
164
+ return this.#primaryConfigFile;
112
165
  }
166
+ /**
167
+ * 加载配置文件
168
+ */
113
169
  load(filename, initial, schema) {
114
170
  const ext = path.extname(filename).toLowerCase();
115
171
  if (!ConfigLoader.supportedExtensions.includes(ext)) {
@@ -117,8 +173,14 @@ export class ConfigService {
117
173
  }
118
174
  const config = ConfigLoader.load(filename, initial, schema);
119
175
  this.configs.set(filename, config);
176
+ if (!this.#primaryConfigFile) {
177
+ this.#primaryConfigFile = filename;
178
+ }
120
179
  return config;
121
180
  }
181
+ /**
182
+ * 获取配置数据(代理模式,自动保存)
183
+ */
122
184
  get(filename, initial, schema) {
123
185
  if (!this.configs.has(filename))
124
186
  this.load(filename, initial, schema);
@@ -127,6 +189,17 @@ export class ConfigService {
127
189
  throw new Error(`配置文件 ${filename} 未加载`);
128
190
  return config.data;
129
191
  }
192
+ /**
193
+ * 获取主配置文件数据(第一个加载的配置文件)
194
+ */
195
+ getPrimary() {
196
+ if (!this.#primaryConfigFile)
197
+ throw new Error('没有加载任何配置文件');
198
+ return this.get(this.#primaryConfigFile);
199
+ }
200
+ /**
201
+ * 获取原始配置数据
202
+ */
130
203
  getRaw(filename, initial, schema) {
131
204
  if (!this.configs.has(filename))
132
205
  this.load(filename, initial, schema);
@@ -137,16 +210,60 @@ export class ConfigService {
137
210
  }
138
211
  /**
139
212
  * 更新配置文件内容
140
- * @param filename 配置文件名
141
- * @param data 新的配置数据
142
213
  */
143
214
  set(filename, data) {
144
215
  const config = this.configs.get(filename);
145
216
  if (!config)
146
217
  throw new Error(`配置文件 ${filename} 未加载`);
147
- // 直接更新内部数据(会触发 Proxy 的 set 拦截器并自动保存)
148
218
  Object.assign(config.raw, data);
149
219
  config.save(path.resolve(process.cwd(), filename));
150
220
  }
221
+ /**
222
+ * 序列化为 JSON
223
+ */
224
+ toJSON(pluginName) {
225
+ const list = pluginName ? this.getByPlugin(pluginName) : this.items;
226
+ return {
227
+ name: this.name,
228
+ icon: this.icon,
229
+ desc: this.desc,
230
+ count: list.length,
231
+ items: list.map(r => ({
232
+ name: r.key,
233
+ // 不暴露 defaultValue 以防止泄露密钥/令牌
234
+ })),
235
+ };
236
+ }
237
+ /**
238
+ * 提供给 Plugin.prototype 的扩展方法
239
+ */
240
+ get extensions() {
241
+ const feature = this;
242
+ return {
243
+ addConfig(key, defaultValue) {
244
+ const plugin = getPlugin();
245
+ // 尝试写入主配置文件(如果 key 不存在)
246
+ if (feature.#primaryConfigFile) {
247
+ const config = feature.configs.get(feature.#primaryConfigFile);
248
+ if (config) {
249
+ const raw = config.raw;
250
+ if (!(key in raw)) {
251
+ raw[key] = defaultValue;
252
+ config.save(path.resolve(process.cwd(), feature.#primaryConfigFile));
253
+ }
254
+ }
255
+ }
256
+ const record = { key, defaultValue };
257
+ const dispose = feature.add(record, plugin.name);
258
+ plugin.recordFeatureContribution(feature.name, key);
259
+ plugin.onDispose(dispose);
260
+ return dispose;
261
+ },
262
+ };
263
+ }
151
264
  }
265
+ /**
266
+ * @deprecated Use ConfigFeature instead
267
+ */
268
+ export const ConfigService = ConfigFeature;
152
269
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/built/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/built/config.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  /**
2
- * Cron Context
3
- * 管理所有插件注册的定时任务
2
+ * CronFeature
3
+ * 管理所有插件注册的定时任务,继承自 Feature 抽象类
4
4
  */
5
+ import { Feature, FeatureJSON } from "../feature.js";
5
6
  import { Cron } from "../cron.js";
6
- import { Context } from "../plugin.js";
7
7
  /**
8
8
  * CronContext 扩展方法类型
9
9
  */
@@ -16,38 +16,61 @@ declare module "../plugin.js" {
16
16
  interface Extensions extends CronContextExtensions {
17
17
  }
18
18
  interface Contexts {
19
- cron: CronService;
19
+ cron: CronFeature;
20
20
  }
21
21
  }
22
22
  }
23
23
  /**
24
- * 定时任务服务数据
24
+ * 定时任务服务 Feature
25
25
  */
26
- export interface CronService {
27
- /** 任务列表 */
28
- readonly items: Cron[];
26
+ export declare class CronFeature extends Feature<Cron> {
27
+ readonly name: "cron";
28
+ readonly icon = "Clock";
29
+ readonly desc = "\u5B9A\u65F6\u4EFB\u52A1";
29
30
  /** 按 ID/表达式 索引 */
30
31
  readonly byName: Map<string, Cron>;
31
- /** 添加任务 */
32
+ /**
33
+ * 添加定时任务,自动启动
34
+ */
32
35
  add(cron: Cron, pluginName: string): () => void;
33
- /** 移除任务 */
36
+ /**
37
+ * 移除定时任务,自动停止
38
+ */
34
39
  remove(cron: Cron): boolean;
35
- /** 按名称获取 */
40
+ /**
41
+ * 按 ID/表达式 获取
42
+ */
36
43
  get(id: string): Cron | undefined;
37
- /** 停止所有任务 */
44
+ /**
45
+ * 停止所有任务
46
+ */
38
47
  stopAll(): void;
39
- /** 启动所有任务 */
48
+ /**
49
+ * 启动所有任务
50
+ */
40
51
  startAll(): void;
41
- /** 获取状态 */
52
+ /**
53
+ * 获取所有任务状态
54
+ */
42
55
  getStatus(): Array<{
43
56
  expression: string;
44
57
  running: boolean;
45
58
  nextExecution: Date | null;
46
59
  plugin: string;
47
60
  }>;
61
+ /**
62
+ * 生命周期: 销毁时停止所有任务
63
+ */
64
+ dispose(): void;
65
+ /**
66
+ * 序列化为 JSON
67
+ */
68
+ toJSON(pluginName?: string): FeatureJSON;
69
+ /**
70
+ * 提供给 Plugin.prototype 的扩展方法
71
+ */
72
+ get extensions(): {
73
+ addCron(cron: Cron): () => void;
74
+ };
48
75
  }
49
- /**
50
- * 创建定时任务 Context
51
- */
52
- export declare function createCronService(): Context<'cron', CronContextExtensions>;
53
76
  //# sourceMappingURL=cron.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cron.d.ts","sourceRoot":"","sources":["../../src/built/cron.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,OAAO,EAAqB,MAAM,cAAc,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,aAAa;IACb,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,IAAI,CAAC;CACjC;AAGD,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,MAAM,CAAC;QACf,UAAU,UAAW,SAAQ,qBAAqB;SAAG;QACrD,UAAU,QAAQ;YAChB,IAAI,EAAE,WAAW,CAAC;SACnB;KACF;CACF;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,WAAW;IACX,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;IACvB,kBAAkB;IAClB,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACnC,WAAW;IACX,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;IAChD,WAAW;IACX,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;IAC5B,YAAY;IACZ,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,aAAa;IACb,OAAO,IAAI,IAAI,CAAC;IAChB,aAAa;IACb,QAAQ,IAAI,IAAI,CAAC;IACjB,WAAW;IACX,SAAS,IAAI,KAAK,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,OAAO,CAAC;QACjB,aAAa,EAAE,IAAI,GAAG,IAAI,CAAC;QAC3B,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAmF1E"}
1
+ {"version":3,"file":"cron.d.ts","sourceRoot":"","sources":["../../src/built/cron.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGlC;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,aAAa;IACb,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,IAAI,CAAC;CACjC;AAGD,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,MAAM,CAAC;QACf,UAAU,UAAW,SAAQ,qBAAqB;SAAG;QACrD,UAAU,QAAQ;YAChB,IAAI,EAAE,WAAW,CAAC;SACnB;KACF;CACF;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,OAAO,CAAC,IAAI,CAAC;IAC5C,QAAQ,CAAC,IAAI,EAAG,MAAM,CAAU;IAChC,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,IAAI,8BAAU;IAEvB,kBAAkB;IAClB,QAAQ,CAAC,MAAM,oBAA2B;IAE1C;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,IAAI;IAS/C;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO;IAQ3B;;OAEG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAIjC;;OAEG;IACH,OAAO,IAAI,IAAI;IAQf;;OAEG;IACH,QAAQ,IAAI,IAAI;IAQhB;;OAEG;IACH,SAAS,IAAI,KAAK,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,OAAO,CAAC;QACjB,aAAa,EAAE,IAAI,GAAG,IAAI,CAAC;QAC3B,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAmBF;;OAEG;IACH,OAAO,IAAI,IAAI;IAIf;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW;IAcxC;;OAEG;IACH,IAAI,UAAU;sBAGI,IAAI,SA1GqB,IAAI;MAkH9C;CACF"}
package/lib/built/cron.js CHANGED
@@ -1,79 +1,122 @@
1
+ /**
2
+ * CronFeature
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 createCronService() {
6
- const items = [];
7
- const byName = new Map();
8
- const pluginMap = new Map();
9
- const value = {
10
- items,
11
- byName,
12
- add(cron, pluginName) {
13
- items.push(cron);
14
- byName.set(cron.id || cron.cronExpression, cron);
15
- pluginMap.set(cron, pluginName);
16
- // 自动启动
17
- if (!cron.running) {
18
- cron.run();
19
- }
20
- return () => value.remove(cron);
21
- },
22
- remove(cron) {
23
- const index = items.indexOf(cron);
24
- if (index !== -1) {
25
- // 自动停止
26
- if (cron.running) {
27
- cron.stop();
28
- }
29
- items.splice(index, 1);
30
- byName.delete(cron.id || cron.cronExpression);
31
- pluginMap.delete(cron);
32
- return true;
10
+ export class CronFeature extends Feature {
11
+ name = 'cron';
12
+ icon = 'Clock';
13
+ desc = '定时任务';
14
+ /** ID/表达式 索引 */
15
+ byName = new Map();
16
+ /**
17
+ * 添加定时任务,自动启动
18
+ */
19
+ add(cron, pluginName) {
20
+ this.byName.set(cron.id || cron.cronExpression, cron);
21
+ // 自动启动
22
+ if (!cron.running) {
23
+ cron.run();
24
+ }
25
+ return super.add(cron, pluginName);
26
+ }
27
+ /**
28
+ * 移除定时任务,自动停止
29
+ */
30
+ remove(cron) {
31
+ if (cron.running) {
32
+ cron.stop();
33
+ }
34
+ this.byName.delete(cron.id || cron.cronExpression);
35
+ return super.remove(cron);
36
+ }
37
+ /**
38
+ * 按 ID/表达式 获取
39
+ */
40
+ get(id) {
41
+ return this.byName.get(id);
42
+ }
43
+ /**
44
+ * 停止所有任务
45
+ */
46
+ stopAll() {
47
+ for (const cron of this.items) {
48
+ if (cron.running) {
49
+ cron.stop();
33
50
  }
34
- return false;
35
- },
36
- get(id) {
37
- return byName.get(id);
38
- },
39
- stopAll() {
40
- for (const cron of items) {
41
- if (cron.running) {
42
- cron.stop();
43
- }
51
+ }
52
+ }
53
+ /**
54
+ * 启动所有任务
55
+ */
56
+ startAll() {
57
+ for (const cron of this.items) {
58
+ if (!cron.running && !cron.disposed) {
59
+ cron.run();
44
60
  }
45
- },
46
- startAll() {
47
- for (const cron of items) {
48
- if (!cron.running && !cron.disposed) {
49
- cron.run();
61
+ }
62
+ }
63
+ /**
64
+ * 获取所有任务状态
65
+ */
66
+ getStatus() {
67
+ return this.items.map(cron => {
68
+ // 从 pluginItems 中找到对应的插件名
69
+ let pluginName = 'unknown';
70
+ for (const [name, items] of this.pluginItems) {
71
+ if (items.includes(cron)) {
72
+ pluginName = name;
73
+ break;
50
74
  }
51
75
  }
52
- },
53
- getStatus() {
54
- return items.map(cron => ({
76
+ return {
55
77
  expression: cron.cronExpression,
56
78
  running: cron.running,
57
79
  nextExecution: cron.running ? cron.getNextExecutionTime() : null,
58
- plugin: pluginMap.get(cron) || 'unknown',
59
- }));
60
- }
61
- };
62
- return {
63
- name: 'cron',
64
- description: '定时任务服务',
65
- value,
66
- dispose() {
67
- value.stopAll();
68
- },
69
- extensions: {
80
+ plugin: pluginName,
81
+ };
82
+ });
83
+ }
84
+ /**
85
+ * 生命周期: 销毁时停止所有任务
86
+ */
87
+ dispose() {
88
+ this.stopAll();
89
+ }
90
+ /**
91
+ * 序列化为 JSON
92
+ */
93
+ toJSON(pluginName) {
94
+ const list = pluginName ? this.getByPlugin(pluginName) : this.items;
95
+ return {
96
+ name: this.name,
97
+ icon: this.icon,
98
+ desc: this.desc,
99
+ count: list.length,
100
+ items: list.map(c => ({
101
+ expression: c.cronExpression,
102
+ running: c.running,
103
+ })),
104
+ };
105
+ }
106
+ /**
107
+ * 提供给 Plugin.prototype 的扩展方法
108
+ */
109
+ get extensions() {
110
+ const feature = this;
111
+ return {
70
112
  addCron(cron) {
71
113
  const plugin = getPlugin();
72
- const dispose = value.add(cron, plugin.name);
114
+ const dispose = feature.add(cron, plugin.name);
115
+ plugin.recordFeatureContribution(feature.name, cron.id || cron.cronExpression);
73
116
  plugin.onDispose(dispose);
74
117
  return dispose;
75
- }
76
- }
77
- };
118
+ },
119
+ };
120
+ }
78
121
  }
79
122
  //# sourceMappingURL=cron.js.map