@zhin.js/core 1.1.26 → 1.1.28

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 (106) hide show
  1. package/lib/adapter.d.ts.map +1 -1
  2. package/lib/adapter.js +1 -0
  3. package/lib/adapter.js.map +1 -1
  4. package/lib/built/agent-preset.d.ts +1 -1
  5. package/lib/built/agent-preset.d.ts.map +1 -1
  6. package/lib/built/agent-preset.js +1 -1
  7. package/lib/built/agent-preset.js.map +1 -1
  8. package/lib/built/ai-trigger.d.ts +14 -3
  9. package/lib/built/ai-trigger.d.ts.map +1 -1
  10. package/lib/built/ai-trigger.js +79 -21
  11. package/lib/built/ai-trigger.js.map +1 -1
  12. package/lib/built/command.d.ts +1 -1
  13. package/lib/built/command.d.ts.map +1 -1
  14. package/lib/built/command.js +1 -1
  15. package/lib/built/command.js.map +1 -1
  16. package/lib/built/common-adapter-tools.d.ts +4 -0
  17. package/lib/built/common-adapter-tools.d.ts.map +1 -1
  18. package/lib/built/common-adapter-tools.js +27 -28
  19. package/lib/built/common-adapter-tools.js.map +1 -1
  20. package/lib/built/component.d.ts +1 -1
  21. package/lib/built/component.d.ts.map +1 -1
  22. package/lib/built/component.js +1 -1
  23. package/lib/built/component.js.map +1 -1
  24. package/lib/built/config.d.ts +1 -1
  25. package/lib/built/config.d.ts.map +1 -1
  26. package/lib/built/config.js +1 -1
  27. package/lib/built/config.js.map +1 -1
  28. package/lib/built/cron.d.ts +1 -2
  29. package/lib/built/cron.d.ts.map +1 -1
  30. package/lib/built/cron.js +1 -1
  31. package/lib/built/cron.js.map +1 -1
  32. package/lib/built/database.d.ts +1 -1
  33. package/lib/built/database.d.ts.map +1 -1
  34. package/lib/built/database.js +1 -1
  35. package/lib/built/database.js.map +1 -1
  36. package/lib/built/dispatcher.d.ts +6 -1
  37. package/lib/built/dispatcher.d.ts.map +1 -1
  38. package/lib/built/dispatcher.js +6 -5
  39. package/lib/built/dispatcher.js.map +1 -1
  40. package/lib/built/html-to-text.d.ts +13 -0
  41. package/lib/built/html-to-text.d.ts.map +1 -0
  42. package/lib/built/html-to-text.js +135 -0
  43. package/lib/built/html-to-text.js.map +1 -0
  44. package/lib/built/inbound-runner.d.ts +2 -2
  45. package/lib/built/inbound-runner.d.ts.map +1 -1
  46. package/lib/built/inbound-runner.js +2 -0
  47. package/lib/built/inbound-runner.js.map +1 -1
  48. package/lib/built/message-filter.d.ts +1 -1
  49. package/lib/built/message-filter.d.ts.map +1 -1
  50. package/lib/built/message-filter.js +1 -1
  51. package/lib/built/message-filter.js.map +1 -1
  52. package/lib/built/permission.d.ts +1 -1
  53. package/lib/built/permission.d.ts.map +1 -1
  54. package/lib/built/permission.js +1 -1
  55. package/lib/built/permission.js.map +1 -1
  56. package/lib/built/prepend-quote-context.d.ts +29 -0
  57. package/lib/built/prepend-quote-context.d.ts.map +1 -0
  58. package/lib/built/prepend-quote-context.js +103 -0
  59. package/lib/built/prepend-quote-context.js.map +1 -0
  60. package/lib/built/queue-im-field-contract.d.ts +1 -6
  61. package/lib/built/queue-im-field-contract.d.ts.map +1 -1
  62. package/lib/built/queue-im-field-contract.js +5 -13
  63. package/lib/built/queue-im-field-contract.js.map +1 -1
  64. package/lib/built/schema-feature.d.ts +1 -1
  65. package/lib/built/schema-feature.d.ts.map +1 -1
  66. package/lib/built/schema-feature.js +1 -1
  67. package/lib/built/schema-feature.js.map +1 -1
  68. package/lib/built/skill.d.ts +1 -1
  69. package/lib/built/skill.d.ts.map +1 -1
  70. package/lib/built/skill.js +1 -1
  71. package/lib/built/skill.js.map +1 -1
  72. package/lib/built/tool.d.ts +1 -1
  73. package/lib/built/tool.d.ts.map +1 -1
  74. package/lib/built/tool.js +1 -1
  75. package/lib/built/tool.js.map +1 -1
  76. package/lib/index.d.ts +5 -3
  77. package/lib/index.d.ts.map +1 -1
  78. package/lib/index.js +4 -3
  79. package/lib/index.js.map +1 -1
  80. package/lib/message-quote.d.ts +11 -0
  81. package/lib/message-quote.d.ts.map +1 -0
  82. package/lib/message-quote.js +91 -0
  83. package/lib/message-quote.js.map +1 -0
  84. package/lib/message.d.ts +5 -0
  85. package/lib/message.d.ts.map +1 -1
  86. package/lib/message.js +13 -0
  87. package/lib/message.js.map +1 -1
  88. package/lib/plugin.d.ts +102 -36
  89. package/lib/plugin.d.ts.map +1 -1
  90. package/lib/plugin.js +55 -68
  91. package/lib/plugin.js.map +1 -1
  92. package/lib/types.d.ts +28 -0
  93. package/lib/types.d.ts.map +1 -1
  94. package/package.json +6 -6
  95. package/lib/cron.d.ts +0 -5
  96. package/lib/cron.d.ts.map +0 -1
  97. package/lib/cron.js +0 -5
  98. package/lib/cron.js.map +0 -1
  99. package/lib/feature.d.ts +0 -8
  100. package/lib/feature.d.ts.map +0 -1
  101. package/lib/feature.js +0 -7
  102. package/lib/feature.js.map +0 -1
  103. package/lib/scheduler/index.d.ts +0 -6
  104. package/lib/scheduler/index.d.ts.map +0 -1
  105. package/lib/scheduler/index.js +0 -5
  106. package/lib/scheduler/index.js.map +0 -1
@@ -0,0 +1,91 @@
1
+ const MAX_RAW_QUOTE_SCAN = 64_000;
2
+ function replySegmentId(seg) {
3
+ if (seg.type !== 'reply' || !seg.data || typeof seg.data !== 'object')
4
+ return undefined;
5
+ const data = seg.data;
6
+ const raw = data.message_id ?? data.id;
7
+ if (raw == null)
8
+ return undefined;
9
+ const id = String(raw).trim();
10
+ return id || undefined;
11
+ }
12
+ /** 从 segments 解析首个 reply 的 ID */
13
+ export function quoteIdFromContent(content) {
14
+ if (!content?.length)
15
+ return undefined;
16
+ for (const seg of content) {
17
+ const id = replySegmentId(seg);
18
+ if (id)
19
+ return id;
20
+ }
21
+ return undefined;
22
+ }
23
+ function extractBracketTag(raw, tag) {
24
+ const open = `[${tag}:`;
25
+ const idx = raw.toLowerCase().indexOf(open.toLowerCase());
26
+ if (idx === -1)
27
+ return undefined;
28
+ const close = raw.indexOf(']', idx + open.length);
29
+ if (close === -1)
30
+ return undefined;
31
+ const id = raw.slice(idx + open.length, close).trim();
32
+ return id || undefined;
33
+ }
34
+ function extractCqReplyId(raw) {
35
+ const marker = '[cq:reply';
36
+ const lower = raw.toLowerCase();
37
+ let search = 0;
38
+ while (search < raw.length) {
39
+ const idx = lower.indexOf(marker, search);
40
+ if (idx === -1)
41
+ return undefined;
42
+ const close = raw.indexOf(']', idx);
43
+ if (close === -1)
44
+ return undefined;
45
+ const segment = raw.slice(idx, close + 1);
46
+ const idIdx = segment.toLowerCase().indexOf('id=');
47
+ if (idIdx !== -1) {
48
+ let start = idIdx + 3;
49
+ while (start < segment.length && /[,\s]/.test(segment[start]))
50
+ start++;
51
+ let end = start;
52
+ while (end < segment.length && segment[end] !== ',' && segment[end] !== ']' && segment[end] !== '&') {
53
+ end++;
54
+ }
55
+ const id = segment.slice(start, end).trim();
56
+ if (id)
57
+ return id;
58
+ }
59
+ search = close + 1;
60
+ }
61
+ return undefined;
62
+ }
63
+ /** icqq raw_message / OneBot CQ 中的 reply id($content 未含 reply 段时兜底) */
64
+ export function quoteIdFromRaw(raw) {
65
+ if (typeof raw !== 'string' || !raw.trim())
66
+ return undefined;
67
+ const text = raw.length > MAX_RAW_QUOTE_SCAN ? raw.slice(0, MAX_RAW_QUOTE_SCAN) : raw;
68
+ return extractBracketTag(text, 'reply') ?? extractCqReplyId(text);
69
+ }
70
+ /** 无 $quote_id 时从 $content / $raw 回填 */
71
+ export function syncQuoteId(message) {
72
+ if (message.$quote_id)
73
+ return;
74
+ const id = quoteIdFromContent(message.$content) ?? quoteIdFromRaw(message.$raw);
75
+ if (id)
76
+ message.$quote_id = id;
77
+ }
78
+ /** 将 reply 段的 id / message_id 与 $quote_id 对齐 */
79
+ export function alignReplySegments(content, quoteId) {
80
+ const id = quoteId ?? quoteIdFromContent(content);
81
+ if (!id)
82
+ return;
83
+ for (const seg of content) {
84
+ if (seg.type !== 'reply' || !seg.data || typeof seg.data !== 'object')
85
+ continue;
86
+ const data = seg.data;
87
+ data.id = id;
88
+ data.message_id = id;
89
+ }
90
+ }
91
+ //# sourceMappingURL=message-quote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-quote.js","sourceRoot":"","sources":["../src/message-quote.ts"],"names":[],"mappings":"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"}
package/lib/message.d.ts CHANGED
@@ -35,6 +35,8 @@ export interface MessageBase {
35
35
  $channel: MessageChannel;
36
36
  $timestamp: number;
37
37
  $raw: string;
38
+ /** 本条消息引用的上游 message_id(平台原样字符串) */
39
+ $quote_id?: string;
38
40
  }
39
41
  /**
40
42
  * 完整消息类型,支持扩展
@@ -45,5 +47,8 @@ export declare namespace Message {
45
47
  * 工具方法:合并自定义字段与基础消息结构
46
48
  */
47
49
  function from<T extends object>(input: T, format: MessageBase): Message<T>;
50
+ function quoteIdFromContent(content: MessageElement[]): string | undefined;
51
+ function syncQuoteId(message: Message<any>): void;
52
+ function alignReplySegments(content: MessageElement[], quoteId?: string): void;
48
53
  }
49
54
  //# sourceMappingURL=message.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../src/message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,aAAa,EAAE,WAAW,EAAC,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,MAAM,IAAE;IAC3C,IAAI,EAAC,SAAS,CAAC,CAAC,GAAC;QAAC,QAAQ,CAAC,EAAC,WAAW,GAAC,OAAO,CAAC,WAAW,CAAC,CAAA;KAAC,CAAC,CAAA;IAC9D,IAAI,EAAC,CAAC,CAAA;CACT,CAAA;AACD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;CACrB;AACD;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAA;AACzD;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAC,MAAM,QAAQ,CAAA;IACvB,IAAI,EAAC,MAAM,CAAA;IACX,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,CAAC,OAAO,EAAC,WAAW,EAAC,KAAK,CAAC,EAAC,OAAO,GAAC,MAAM,GAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IACjE,OAAO,IAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACvB,QAAQ,EAAE,cAAc,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CAChB;AACD;;GAEG;AACH,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,MAAM,GAAC,EAAE,IAAE,WAAW,GAAC,CAAC,CAAC;AACvD,yBAAiB,OAAO,CAAA;IACpB;;OAEG;IACH,SAAgB,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAC,CAAC,EAAC,MAAM,EAAC,WAAW,GAAE,OAAO,CAAC,CAAC,CAAC,CAE5E;CACJ"}
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../src/message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,aAAa,EAAE,WAAW,EAAC,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAMxC;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,MAAM,IAAE;IAC3C,IAAI,EAAC,SAAS,CAAC,CAAC,GAAC;QAAC,QAAQ,CAAC,EAAC,WAAW,GAAC,OAAO,CAAC,WAAW,CAAC,CAAA;KAAC,CAAC,CAAA;IAC9D,IAAI,EAAC,CAAC,CAAA;CACT,CAAA;AACD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;CACrB;AACD;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAA;AACzD;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAC,MAAM,QAAQ,CAAA;IACvB,IAAI,EAAC,MAAM,CAAA;IACX,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,CAAC,OAAO,EAAC,WAAW,EAAC,KAAK,CAAC,EAAC,OAAO,GAAC,MAAM,GAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IACjE,OAAO,IAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACvB,QAAQ,EAAE,cAAc,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AACD;;GAEG;AACH,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,MAAM,GAAC,EAAE,IAAE,WAAW,GAAC,CAAC,CAAC;AACvD,yBAAiB,OAAO,CAAA;IACpB;;OAEG;IACH,SAAgB,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAC,CAAC,EAAC,MAAM,EAAC,WAAW,GAAE,OAAO,CAAC,CAAC,CAAC,CAE5E;IAED,SAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,GAAG,SAAS,CAEhF;IAED,SAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAEvD;IAED,SAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAEpF;CACJ"}
package/lib/message.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { alignReplySegments as alignReplySegmentsImpl, quoteIdFromContent as quoteIdFromContentImpl, syncQuoteId as syncQuoteIdImpl, } from "./message-quote.js";
1
2
  export var Message;
2
3
  (function (Message) {
3
4
  /**
@@ -7,5 +8,17 @@ export var Message;
7
8
  return Object.assign(input, format);
8
9
  }
9
10
  Message.from = from;
11
+ function quoteIdFromContent(content) {
12
+ return quoteIdFromContentImpl(content);
13
+ }
14
+ Message.quoteIdFromContent = quoteIdFromContent;
15
+ function syncQuoteId(message) {
16
+ syncQuoteIdImpl(message);
17
+ }
18
+ Message.syncQuoteId = syncQuoteId;
19
+ function alignReplySegments(content, quoteId) {
20
+ alignReplySegmentsImpl(content, quoteId);
21
+ }
22
+ Message.alignReplySegments = alignReplySegments;
10
23
  })(Message || (Message = {}));
11
24
  //# sourceMappingURL=message.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"message.js","sourceRoot":"","sources":["../src/message.ts"],"names":[],"mappings":"AAwCA,MAAM,KAAW,OAAO,CAOvB;AAPD,WAAiB,OAAO;IACpB;;OAEG;IACH,SAAgB,IAAI,CAAmB,KAAO,EAAC,MAAkB;QAC7D,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAC,MAAM,CAAC,CAAA;IACtC,CAAC;IAFe,YAAI,OAEnB,CAAA;AACL,CAAC,EAPgB,OAAO,KAAP,OAAO,QAOvB"}
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../src/message.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,kBAAkB,IAAI,sBAAsB,EAC5C,kBAAkB,IAAI,sBAAsB,EAC5C,WAAW,IAAI,eAAe,GAC/B,MAAM,oBAAoB,CAAC;AAwC5B,MAAM,KAAW,OAAO,CAmBvB;AAnBD,WAAiB,OAAO;IACpB;;OAEG;IACH,SAAgB,IAAI,CAAmB,KAAO,EAAC,MAAkB;QAC7D,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAC,MAAM,CAAC,CAAA;IACtC,CAAC;IAFe,YAAI,OAEnB,CAAA;IAED,SAAgB,kBAAkB,CAAC,OAAyB;QACxD,OAAO,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAFe,0BAAkB,qBAEjC,CAAA;IAED,SAAgB,WAAW,CAAC,OAAqB;QAC7C,eAAe,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAFe,mBAAW,cAE1B,CAAA;IAED,SAAgB,kBAAkB,CAAC,OAAyB,EAAE,OAAgB;QAC1E,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAFe,0BAAkB,qBAEjC,CAAA;AACL,CAAC,EAnBgB,OAAO,KAAP,OAAO,QAmBvB"}
package/lib/plugin.d.ts CHANGED
@@ -1,14 +1,17 @@
1
1
  /**
2
- * Plugin 类 - 基于 zhinjs/next 的 Hooks 实现
3
- * 移除 Dependency 继承,使用 AsyncLocalStorage 管理上下文
2
+ * Plugin 类 IM 特化插件,继承 PluginBase
3
+ *
4
+ * 在 PluginBase 的 DI/生命周期/事件基础上增加:
5
+ * - Context 类型安全(Plugin.Contexts 映射)
6
+ * - 生命周期事件类型安全(Plugin.Lifecycle)
7
+ * - 中间件系统、适配器管理、useContext 等
4
8
  */
5
9
  import { AsyncLocalStorage } from "node:async_hooks";
6
- import { EventEmitter } from "node:events";
7
10
  import type { PluginManifest } from "./types.js";
8
- import { Logger } from "@zhin.js/logger";
9
11
  import { MessageMiddleware, RegisteredAdapter, MaybePromise, ArrayItem, SendOptions } from "./types.js";
10
- import { Adapters } from "./adapter.js";
11
- import { Feature } from "./feature.js";
12
+ import { Adapter, Adapters } from "./adapter.js";
13
+ import { PluginBase, PluginBaseLifecycle } from "@zhin.js/kernel";
14
+ import type { PluginLike } from "@zhin.js/kernel";
12
15
  declare const contextsKey: unique symbol;
13
16
  export type SideEffect<A extends (keyof Plugin.Contexts)[]> = {
14
17
  (...args: ContextList<A>): MaybePromise<void | DisposeFn<ContextList<A>>>;
@@ -30,28 +33,37 @@ export declare function usePlugin(): Plugin;
30
33
  */
31
34
  export declare function getPlugin(): Plugin;
32
35
  export interface Plugin extends Plugin.Extensions {
36
+ on<K extends keyof Plugin.Lifecycle>(name: K, listener: (...args: Plugin.Lifecycle[K]) => void): this;
37
+ on(name: string | symbol, listener: (...args: any[]) => void): this;
38
+ off<K extends keyof Plugin.Lifecycle>(name: K, listener: (...args: Plugin.Lifecycle[K]) => void): this;
39
+ off(name: string | symbol, listener: (...args: any[]) => void): this;
40
+ once<K extends keyof Plugin.Lifecycle>(name: K, listener: (...args: Plugin.Lifecycle[K]) => void): this;
41
+ once(name: string | symbol, listener: (...args: any[]) => void): this;
42
+ emit<K extends keyof Plugin.Lifecycle>(name: K, ...args: Plugin.Lifecycle[K]): boolean;
43
+ emit(name: string | symbol, ...args: any[]): boolean;
33
44
  }
34
45
  /**
35
- * Plugin 类 - 核心插件系统
36
- * 直接继承 EventEmitter
46
+ * Plugin 类 - IM 特化插件,继承 PluginBase
47
+ *
48
+ * 类型窄化:
49
+ * - children: Plugin[] (而非 PluginBase[])
50
+ * - parent: Plugin | undefined
51
+ * - root: Plugin
52
+ * - $contexts: Map<string, Context<any>>
53
+ * - dispatch/broadcast: Plugin.Lifecycle 类型安全
37
54
  */
38
- export declare class Plugin extends EventEmitter<Plugin.Lifecycle> {
55
+ export declare class Plugin extends PluginBase implements PluginLike {
39
56
  #private;
40
- parent?: Plugin | undefined;
41
57
  static [contextsKey]: string[];
42
58
  adapters: (keyof Plugin.Contexts)[];
43
59
  started: boolean;
44
- $contexts: Map<string, Context<any>>;
45
- children: Plugin[];
46
- filePath: string;
47
- fileHash: string;
48
- logger: Logger;
60
+ get root(): Plugin;
49
61
  get middleware(): MessageMiddleware<RegisteredAdapter>;
50
62
  recordFeatureContribution(featureName: string, itemName: string): void;
51
63
  /**
52
64
  * 构造函数
53
65
  */
54
- constructor(filePath?: string, parent?: Plugin | undefined);
66
+ constructor(filePath?: string, parent?: Plugin);
55
67
  /**
56
68
  * 添加中间件
57
69
  * 中间件用于处理消息流转
@@ -66,13 +78,12 @@ export declare class Plugin extends EventEmitter<Plugin.Lifecycle> {
66
78
  */
67
79
  get manifest(): PluginManifest | undefined;
68
80
  /**
69
- * 根插件
81
+ * 上下文收集 — 使用类型窄化的 inject 替代直接 Map 访问
70
82
  */
71
- get root(): Plugin;
72
- get contexts(): Map<string, Context>;
73
83
  useContext<T extends (keyof Plugin.Contexts)[]>(...args: [...T, SideEffect<T>]): void;
74
84
  inject<T extends keyof Plugin.Contexts>(name: T): Plugin.Contexts[T] | undefined;
75
85
  inject(name: string): unknown;
86
+ injectAdapter(name: string): Adapter | undefined;
76
87
  contextIsReady<T extends keyof Plugin.Contexts>(name: T): boolean;
77
88
  /**
78
89
  * 启动插件
@@ -99,30 +110,29 @@ export declare class Plugin extends EventEmitter<Plugin.Lifecycle> {
99
110
  onMounted(callback: () => void | Promise<void>): void;
100
111
  onDispose(callback: () => void | Promise<void>): () => void;
101
112
  /**
102
- * dispatch - 向上冒泡到父插件,或在根节点广播
113
+ * dispatch - 向上冒泡到父插件,或者在根节点广播(类型安全版本)
103
114
  */
104
115
  dispatch<K extends keyof Plugin.Lifecycle>(name: K, ...args: Plugin.Lifecycle[K]): Promise<void>;
105
116
  /**
106
- * broadcast - 向下广播到所有子插件
117
+ * broadcast - 向下广播到所有子插件(类型安全版本)
107
118
  */
108
119
  broadcast<K extends keyof Plugin.Lifecycle>(name: K, ...args: Plugin.Lifecycle[K]): Promise<void>;
109
120
  /**
110
- * 注册上下文
121
+ * 注册上下文(类型安全版本)
111
122
  */
112
- provide<T extends keyof Plugin.Contexts>(context: Context<T>): this;
113
- provide(feature: Feature<unknown>): this;
123
+ provide(target: any): this;
114
124
  /**
115
- * 导入插件
125
+ * 导入插件(Plugin 类型窄化版本)
116
126
  */
117
127
  import(entry: string, t?: number): Promise<Plugin>;
118
128
  /**
119
- * 重载插件
129
+ * 重载插件(Plugin 类型窄化版本)
120
130
  */
121
- reload(plugin?: Plugin): Promise<void>;
131
+ reload(plugin?: PluginBase): Promise<void>;
122
132
  /**
123
- * 监听文件变化
133
+ * 监听文件变化(Plugin 类型窄化版本)
124
134
  */
125
- watch(callback: (p: Plugin) => void | Promise<void>, recursive?: boolean): void;
135
+ watch(callback: (p: PluginBase) => void | Promise<void>, recursive?: boolean): void;
126
136
  /**
127
137
  * 自动绑定核心方法(只在构造函数中调用一次)
128
138
  */
@@ -154,22 +164,78 @@ export declare namespace Plugin {
154
164
  }
155
165
  /**
156
166
  * 生命周期事件
167
+ *
168
+ * 必须包含索引签名以满足 PluginBaseLifecycle 结构子类型约束。
157
169
  */
158
- interface Lifecycle {
159
- mounted: [];
160
- dispose: [];
161
- "before-start": [Plugin];
162
- started: [Plugin];
170
+ interface Lifecycle extends PluginBaseLifecycle {
163
171
  "before-mount": [Plugin];
164
172
  "before-dispose": [Plugin];
165
- "call.recallMessage": [string, string, string];
166
- 'before.sendMessage': [SendOptions];
167
173
  "context.mounted": [keyof Plugin.Contexts];
168
174
  "context.dispose": [keyof Plugin.Contexts];
175
+ "call.recallMessage": [string, string, string];
176
+ 'before.sendMessage': [SendOptions];
169
177
  "message.receive": [any];
170
178
  "bot.login.pending": [import('./built/login-assist.js').PendingLoginTask];
171
179
  "request.receive": [any];
172
180
  "notice.receive": [any];
181
+ "ai.processing.start": [Plugin.AIEventPayload];
182
+ "ai.processing.finish": [Plugin.AIEventPayload];
183
+ "ai.processing.error": [Plugin.AIEventPayload];
184
+ "ai.agent.start": [Plugin.AIEventPayload];
185
+ "ai.agent.finish": [Plugin.AIEventPayload];
186
+ "ai.thinking": [Plugin.AIEventPayload];
187
+ "ai.tool.call": [Plugin.AIEventPayload];
188
+ "ai.tool.result": [Plugin.AIEventPayload];
189
+ "ai.response": [Plugin.AIEventPayload];
190
+ "ai.typing.start": [Plugin.AIEventPayload];
191
+ "ai.typing.stop": [Plugin.AIEventPayload];
192
+ "ai.subagent.spawn": [Plugin.AIEventPayload];
193
+ "ai.subagent.start": [Plugin.AIEventPayload];
194
+ "ai.subagent.finish": [Plugin.AIEventPayload];
195
+ "ai.deferred.start": [Plugin.AIEventPayload];
196
+ "ai.deferred.finish": [Plugin.AIEventPayload];
197
+ "ai.mcp.connect.start": [Plugin.AIEventPayload];
198
+ "ai.mcp.connect.finish": [Plugin.AIEventPayload];
199
+ "ai.mcp.connect.error": [Plugin.AIEventPayload];
200
+ "ai.session.new": [Plugin.AIEventPayload];
201
+ "ai.session.compact": [Plugin.AIEventPayload];
202
+ "ai.hook": [Plugin.AIEventPayload];
203
+ }
204
+ interface AIEventPayload {
205
+ sessionId: string;
206
+ source: 'zhin-agent' | 'ai-hook' | 'orchestrator-hook';
207
+ mode?: 'text' | 'multimodal';
208
+ path?: 'chat' | 'fast' | 'agent' | 'multimodal' | 'rate_limited';
209
+ userId?: string;
210
+ platform?: string;
211
+ botId?: string;
212
+ sceneId?: string;
213
+ messageId?: string;
214
+ scope?: string;
215
+ content?: string;
216
+ reply?: string;
217
+ thinking?: string;
218
+ toolName?: string;
219
+ args?: Record<string, unknown>;
220
+ result?: unknown;
221
+ error?: string;
222
+ model?: string;
223
+ iterations?: number;
224
+ reason?: string;
225
+ taskId?: string;
226
+ label?: string;
227
+ status?: 'ok' | 'partial' | 'error';
228
+ serverName?: string;
229
+ loadedToolNames?: string[];
230
+ hookType?: string;
231
+ hookAction?: string;
232
+ hookContext?: Record<string, unknown>;
233
+ messages?: string[];
234
+ agentId?: string;
235
+ compactedCount?: number;
236
+ savedTokens?: number;
237
+ totalTokensBefore?: number;
238
+ totalTokensAfter?: number;
173
239
  }
174
240
  /**
175
241
  * 服务类型扩展点
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIjD,OAAe,EAAE,MAAM,EAAiB,MAAM,iBAAiB,CAAC;AAEhE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACxG,OAAO,EAAW,QAAQ,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAWvC,QAAA,MAAM,WAAW,eAAqB,CAAC;AAgBvC,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI;IAC5D,CAAC,GAAG,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,IAAI,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AACD,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,IAAI,CAAC,CAAA;AACxE,MAAM,MAAM,WAAW,CAAC,EAAE,SAAS,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,CAAA;AAChM,KAAK,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;AAKlF,eAAO,MAAM,OAAO,2BAAkC,CAAC;AAgCvD;;;;GAIG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAelC;AAED;;;GAGG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAMlC;AAMD,MAAM,WAAW,MAAO,SAAQ,MAAM,CAAC,UAAU;CAAI;AACrD;;;GAGG;AACH,qBAAa,MAAO,SAAQ,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC;;IAqDd,MAAM,CAAC,EAAE,MAAM;IApDzD,MAAM,CAAC,CAAC,WAAW,CAAC,EAAS,MAAM,EAAE,CAAC;IAItC,QAAQ,EAAE,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAM;IACzC,OAAO,UAAS;IAGhB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAa;IAIjD,QAAQ,EAAE,MAAM,EAAE,CAAM;IAGxB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAM;IAGtB,MAAM,EAAE,MAAM,CAAC;IAoBf,IAAI,UAAU,IAAI,iBAAiB,CAAC,iBAAiB,CAAC,CAErD;IAED,yBAAyB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMtE;;OAEG;gBACS,QAAQ,GAAE,MAAW,EAAS,MAAM,CAAC,EAAE,MAAM,YAAA;IAsBzD;;;OAGG;IACH,aAAa,CAAC,CAAC,SAAS,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM;IAU1F;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAcjB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,cAAc,GAAG,SAAS,CA0CzC;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAGjB;IACD,IAAI,QAAQ,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAWnC;IAGD,UAAU,CAAC,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IAiC9E,MAAM,CAAC,CAAC,SAAS,MAAM,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAC,SAAS;IAC9E,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAS7B,cAAc,CAAC,CAAC,SAAS,MAAM,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;IAWvD;;OAEG;IACG,KAAK,CAAC,CAAC,CAAC,EAAC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA8DrC;;;OAGG;IACH,IAAI,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAW9B;IAED;;;OAGG;IACH,WAAW,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAarD,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAS3B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqE3B,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIrD,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI;IAW3D;;OAEG;IACG,QAAQ,CAAC,CAAC,SAAS,MAAM,MAAM,CAAC,SAAS,EAC7C,IAAI,EAAE,CAAC,EACP,GAAG,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,GAC3B,OAAO,CAAC,IAAI,CAAC;IAOhB;;OAEG;IACG,SAAS,CAAC,CAAC,SAAS,MAAM,MAAM,CAAC,SAAS,EAC9C,IAAI,EAAE,CAAC,EACP,GAAG,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,GAC3B,OAAO,CAAC,IAAI,CAAC;IAmBhB;;OAEG;IACH,OAAO,CAAC,CAAC,SAAS,MAAM,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;IACnE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IA2CxC;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAC,CAAC,CAAC,EAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA+BtD;;OAEG;IACG,MAAM,CAAC,MAAM,GAAE,MAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BlD;;OAEG;IACH,KAAK,CACH,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EAC7C,SAAS,UAAQ,GAChB,IAAI;IAgCP;;OAEG;IACH,YAAY,IAAI,IAAI;IAiBpB;;OAEG;WACU,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CA0BrE;AACD,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAE/I;AACD,MAAM,WAAW,OAAO,CAAC,CAAC,SAAS,MAAM,MAAM,CAAC,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;IACzH,IAAI,EAAE,CAAC,CAAC;IACR,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC3B,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/E,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAC9C,qCAAqC;IACrC,UAAU,CAAC,EAAE,CAAC,CAAC;CAChB;AAID,yBAAiB,MAAM,CAAC;IACtB;;OAEG;IACH,UAAiB,QAAQ;QACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB;IAED;;OAEG;IACH,UAAiB,SAAS;QACxB,OAAO,EAAE,EAAE,CAAC;QACZ,OAAO,EAAE,EAAE,CAAC;QACZ,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;QAClB,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC;QACzB,gBAAgB,EAAE,CAAC,MAAM,CAAC,CAAC;QAC3B,oBAAoB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/C,oBAAoB,EAAE,CAAC,WAAW,CAAC,CAAC;QACpC,iBAAiB,EAAE,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC3C,iBAAiB,EAAE,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC3C,iBAAiB,EAAE,CAAC,GAAG,CAAC,CAAC;QACzB,mBAAmB,EAAE,CAAC,OAAO,yBAAyB,EAAE,gBAAgB,CAAC,CAAC;QAC1E,iBAAiB,EAAE,CAAC,GAAG,CAAC,CAAC;QACzB,gBAAgB,EAAE,CAAC,GAAG,CAAC,CAAC;KACzB;IAED;;;OAGG;IACH,UAAiB,QAAS,SAAQ,QAAQ;KAAG;IAE7C;;;;OAIG;IACH,UAAiB,UAAU;KAAG;CAC/B"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
package/lib/plugin.js CHANGED
@@ -1,22 +1,21 @@
1
1
  /**
2
- * Plugin 类 - 基于 zhinjs/next 的 Hooks 实现
3
- * 移除 Dependency 继承,使用 AsyncLocalStorage 管理上下文
2
+ * Plugin 类 IM 特化插件,继承 PluginBase
3
+ *
4
+ * 在 PluginBase 的 DI/生命周期/事件基础上增加:
5
+ * - Context 类型安全(Plugin.Contexts 映射)
6
+ * - 生命周期事件类型安全(Plugin.Lifecycle)
7
+ * - 中间件系统、适配器管理、useContext 等
4
8
  */
5
9
  import { AsyncLocalStorage } from "node:async_hooks";
6
- import { EventEmitter } from "node:events";
7
10
  import * as fs from "node:fs";
8
11
  import * as path from "node:path";
9
12
  import { fileURLToPath, pathToFileURL } from "node:url";
10
- import logger, { formatCompact } from "@zhin.js/logger";
13
+ import { formatCompact } from "@zhin.js/logger";
11
14
  import { compose, remove, resolveEntry } from "./utils.js";
12
15
  import { Adapter } from "./adapter.js";
13
- import { Feature } from "./feature.js";
14
- import { resolvePluginResolveDir as _resolvePluginResolveDir, pluginCreateRequire as _pluginCreateRequire, getFileHash, watchFile, registerExtension, unregisterExtensions, installExtensionProxy, } from "@zhin.js/kernel";
16
+ import { Feature } from "@zhin.js/kernel";
17
+ import { PluginBase, resolvePluginResolveDir as _resolvePluginResolveDir, pluginCreateRequire as _pluginCreateRequire, getFileHash, watchFile, registerExtension, unregisterExtensions, installExtensionProxy, } from "@zhin.js/kernel";
15
18
  const contextsKey = Symbol("contexts");
16
- function runtimeCwd() {
17
- const g = globalThis;
18
- return g.Deno?.cwd?.() ?? process.cwd();
19
- }
20
19
  function resolvePluginResolveDir(parent) {
21
20
  return _resolvePluginResolveDir(parent);
22
21
  }
@@ -33,7 +32,7 @@ export const storage = new AsyncLocalStorage();
33
32
  */
34
33
  function getCurrentFile(metaUrl = import.meta.url) {
35
34
  if (typeof metaUrl !== "string" || metaUrl.length === 0) {
36
- return path.join(runtimeCwd(), "__zhin_edge_bootstrap__.mjs");
35
+ return path.join(process.cwd(), "__zhin_edge_bootstrap__.mjs");
37
36
  }
38
37
  const previousPrepareStackTrace = Error.prepareStackTrace;
39
38
  Error.prepareStackTrace = function (_, stack) {
@@ -45,7 +44,7 @@ function getCurrentFile(metaUrl = import.meta.url) {
45
44
  const idx = stackFiles.findIndex((f) => f === fileURLToPath(metaUrl) || f === metaUrl);
46
45
  const result = stackFiles[idx + 1];
47
46
  if (!result) {
48
- return path.join(runtimeCwd(), "__zhin_edge_bootstrap__.mjs");
47
+ return path.join(process.cwd(), "__zhin_edge_bootstrap__.mjs");
49
48
  }
50
49
  try {
51
50
  return fileURLToPath(result);
@@ -88,25 +87,26 @@ export function getPlugin() {
88
87
  return plugin;
89
88
  }
90
89
  /**
91
- * Plugin 类 - 核心插件系统
92
- * 直接继承 EventEmitter
90
+ * Plugin 类 - IM 特化插件,继承 PluginBase
91
+ *
92
+ * 类型窄化:
93
+ * - children: Plugin[] (而非 PluginBase[])
94
+ * - parent: Plugin | undefined
95
+ * - root: Plugin
96
+ * - $contexts: Map<string, Context<any>>
97
+ * - dispatch/broadcast: Plugin.Lifecycle 类型安全
93
98
  */
94
- export class Plugin extends EventEmitter {
95
- parent;
99
+ export class Plugin extends PluginBase {
96
100
  static [contextsKey] = [];
97
101
  #cachedName;
98
102
  #manifest;
99
103
  adapters = [];
100
- started = false;
101
- // 上下文存储
102
- $contexts = new Map();
103
- // 子插件
104
- children = [];
105
- // 文件信息
106
- filePath;
107
- fileHash = "";
108
- // Logger
109
- logger;
104
+ // children/parent 继承 PluginBase 的类型(PluginBase[] / PluginBase | undefined),
105
+ // 具体的 Plugin 类型通过 getter/builder 方法按需窄化
106
+ get root() {
107
+ return super.root;
108
+ }
109
+ // 插件功能
110
110
  #messageMiddleware = async (message, next) => {
111
111
  const commandService = this.inject('command');
112
112
  if (!commandService)
@@ -119,7 +119,6 @@ export class Plugin extends EventEmitter {
119
119
  return await next();
120
120
  await message.$reply(result);
121
121
  };
122
- // 插件功能
123
122
  #middlewares = [this.#messageMiddleware];
124
123
  // Feature 贡献追踪
125
124
  #featureContributions = new Map();
@@ -138,17 +137,10 @@ export class Plugin extends EventEmitter {
138
137
  * 构造函数
139
138
  */
140
139
  constructor(filePath = "", parent) {
141
- super();
142
- this.parent = parent;
143
- // 增加 EventEmitter 监听器限制,避免警告
144
- // 因为插件可能注册多个命令/组件/中间件,每个都会添加 dispose 监听器
145
- this.setMaxListeners(50);
146
- this.filePath = filePath.replace(/\?t=\d+$/, "");
147
- this.logger = this.name ? logger.getLogger(this.name) : logger;
148
- // 自动添加到父节点
149
- if (parent && !parent.children.includes(this)) {
150
- parent.children.push(this);
151
- }
140
+ super(filePath, parent);
141
+ // 自动添加到父节点 — PluginBase constructor 已处理,
142
+ // PluginBase 使用 PluginBase[],这里需要确保正确
143
+ // (super 已调用 parent.children.push(this),类型已通过 declare 窄化)
152
144
  // 绑定方法以支持解构使用
153
145
  this.$bindMethods();
154
146
  }
@@ -233,26 +225,10 @@ export class Plugin extends EventEmitter {
233
225
  this.#manifest = null;
234
226
  return undefined;
235
227
  }
228
+ // 根插件类型窄化已在 interface Plugin 声明
236
229
  /**
237
- * 根插件
230
+ * 上下文收集 — 使用类型窄化的 inject 替代直接 Map 访问
238
231
  */
239
- get root() {
240
- if (!this.parent)
241
- return this;
242
- return this.parent.root;
243
- }
244
- get contexts() {
245
- const result = new Map();
246
- for (const [key, value] of this.$contexts) {
247
- result.set(key, value);
248
- }
249
- for (const child of this.children) {
250
- for (const [key, value] of child.contexts) {
251
- result.set(key, value);
252
- }
253
- }
254
- return result;
255
- }
256
232
  useContext(...args) {
257
233
  const contexts = args.slice(0, -1);
258
234
  const sideEffect = args[args.length - 1];
@@ -295,6 +271,10 @@ export class Plugin extends EventEmitter {
295
271
  const context = this.root.contexts.get(name);
296
272
  return context?.value;
297
273
  }
274
+ injectAdapter(name) {
275
+ const value = this.inject(name);
276
+ return value instanceof Adapter ? value : undefined;
277
+ }
298
278
  #contextsIsReady(contexts) {
299
279
  if (!contexts.length)
300
280
  return true;
@@ -459,7 +439,7 @@ export class Plugin extends EventEmitter {
459
439
  }
460
440
  }
461
441
  this.#disposables.clear();
462
- // 清理 middlewares 数组(保留默认的消息中间件)
442
+ // 清空 middlewares 数组(保留默认的消息中间件)
463
443
  this.#middlewares.length = 1;
464
444
  // 清理 feature 贡献记录
465
445
  this.#featureContributions.clear();
@@ -495,7 +475,7 @@ export class Plugin extends EventEmitter {
495
475
  // 事件广播
496
476
  // ============================================================================
497
477
  /**
498
- * dispatch - 向上冒泡到父插件,或在根节点广播
478
+ * dispatch - 向上冒泡到父插件,或者在根节点广播(类型安全版本)
499
479
  */
500
480
  async dispatch(name, ...args) {
501
481
  if (this.parent) {
@@ -504,7 +484,7 @@ export class Plugin extends EventEmitter {
504
484
  return this.broadcast(name, ...args);
505
485
  }
506
486
  /**
507
- * broadcast - 向下广播到所有子插件
487
+ * broadcast - 向下广播到所有子插件(类型安全版本)
508
488
  */
509
489
  async broadcast(name, ...args) {
510
490
  const listeners = this.listeners(name);
@@ -520,6 +500,12 @@ export class Plugin extends EventEmitter {
520
500
  await child.broadcast(name, ...args);
521
501
  }
522
502
  }
503
+ // ============================================================================
504
+ // 依赖注入
505
+ // ============================================================================
506
+ /**
507
+ * 注册上下文(类型安全版本)
508
+ */
523
509
  provide(target) {
524
510
  if (target instanceof Feature) {
525
511
  const feature = target;
@@ -561,7 +547,7 @@ export class Plugin extends EventEmitter {
561
547
  // 插件加载
562
548
  // ============================================================================
563
549
  /**
564
- * 导入插件
550
+ * 导入插件(Plugin 类型窄化版本)
565
551
  */
566
552
  async import(entry, t) {
567
553
  if (!entry)
@@ -594,25 +580,26 @@ export class Plugin extends EventEmitter {
594
580
  return plugin;
595
581
  }
596
582
  /**
597
- * 重载插件
583
+ * 重载插件(Plugin 类型窄化版本)
598
584
  */
599
585
  async reload(plugin = this) {
600
- this.logger.info(formatCompact({ name: plugin.name, reload: true }));
586
+ const p = plugin;
587
+ this.logger.info(formatCompact({ name: p.name, reload: true }));
601
588
  const now = Date.now();
602
- if (!plugin.parent) {
589
+ if (!p.parent) {
603
590
  // 根插件重载 = 退出进程(由 CLI 重启)
604
591
  return process.exit(51);
605
592
  }
606
- const entry = plugin.filePath;
607
- const parent = plugin.parent;
608
- await plugin.stop();
593
+ const entry = p.filePath;
594
+ const parent = p.parent;
595
+ await p.stop();
609
596
  let fresh;
610
597
  try {
611
598
  fresh = await parent.import(entry, now);
612
599
  }
613
600
  catch (err) {
614
601
  this.logger.error(formatCompact({
615
- name: plugin.name,
602
+ name: p.name,
616
603
  reload: false,
617
604
  error: err instanceof Error ? err.message : String(err),
618
605
  hint: 'full_restart',
@@ -623,7 +610,7 @@ export class Plugin extends EventEmitter {
623
610
  this.logger.debug(formatCompact({ name: fresh.name, reload_ms: Date.now() - now }));
624
611
  }
625
612
  /**
626
- * 监听文件变化
613
+ * 监听文件变化(Plugin 类型窄化版本)
627
614
  */
628
615
  watch(callback, recursive = false) {
629
616
  if (!this.filePath || this.filePath.includes("node_modules"))