@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.
- package/lib/adapter.d.ts.map +1 -1
- package/lib/adapter.js +1 -0
- package/lib/adapter.js.map +1 -1
- package/lib/built/agent-preset.d.ts +1 -1
- package/lib/built/agent-preset.d.ts.map +1 -1
- package/lib/built/agent-preset.js +1 -1
- package/lib/built/agent-preset.js.map +1 -1
- package/lib/built/ai-trigger.d.ts +14 -3
- package/lib/built/ai-trigger.d.ts.map +1 -1
- package/lib/built/ai-trigger.js +79 -21
- package/lib/built/ai-trigger.js.map +1 -1
- package/lib/built/command.d.ts +1 -1
- package/lib/built/command.d.ts.map +1 -1
- package/lib/built/command.js +1 -1
- package/lib/built/command.js.map +1 -1
- package/lib/built/common-adapter-tools.d.ts +4 -0
- package/lib/built/common-adapter-tools.d.ts.map +1 -1
- package/lib/built/common-adapter-tools.js +27 -28
- package/lib/built/common-adapter-tools.js.map +1 -1
- package/lib/built/component.d.ts +1 -1
- package/lib/built/component.d.ts.map +1 -1
- package/lib/built/component.js +1 -1
- package/lib/built/component.js.map +1 -1
- package/lib/built/config.d.ts +1 -1
- package/lib/built/config.d.ts.map +1 -1
- package/lib/built/config.js +1 -1
- package/lib/built/config.js.map +1 -1
- package/lib/built/cron.d.ts +1 -2
- package/lib/built/cron.d.ts.map +1 -1
- package/lib/built/cron.js +1 -1
- package/lib/built/cron.js.map +1 -1
- package/lib/built/database.d.ts +1 -1
- package/lib/built/database.d.ts.map +1 -1
- package/lib/built/database.js +1 -1
- package/lib/built/database.js.map +1 -1
- package/lib/built/dispatcher.d.ts +6 -1
- package/lib/built/dispatcher.d.ts.map +1 -1
- package/lib/built/dispatcher.js +6 -5
- package/lib/built/dispatcher.js.map +1 -1
- package/lib/built/html-to-text.d.ts +13 -0
- package/lib/built/html-to-text.d.ts.map +1 -0
- package/lib/built/html-to-text.js +135 -0
- package/lib/built/html-to-text.js.map +1 -0
- package/lib/built/inbound-runner.d.ts +2 -2
- package/lib/built/inbound-runner.d.ts.map +1 -1
- package/lib/built/inbound-runner.js +2 -0
- package/lib/built/inbound-runner.js.map +1 -1
- package/lib/built/message-filter.d.ts +1 -1
- package/lib/built/message-filter.d.ts.map +1 -1
- package/lib/built/message-filter.js +1 -1
- package/lib/built/message-filter.js.map +1 -1
- package/lib/built/permission.d.ts +1 -1
- package/lib/built/permission.d.ts.map +1 -1
- package/lib/built/permission.js +1 -1
- package/lib/built/permission.js.map +1 -1
- package/lib/built/prepend-quote-context.d.ts +29 -0
- package/lib/built/prepend-quote-context.d.ts.map +1 -0
- package/lib/built/prepend-quote-context.js +103 -0
- package/lib/built/prepend-quote-context.js.map +1 -0
- package/lib/built/queue-im-field-contract.d.ts +1 -6
- package/lib/built/queue-im-field-contract.d.ts.map +1 -1
- package/lib/built/queue-im-field-contract.js +5 -13
- package/lib/built/queue-im-field-contract.js.map +1 -1
- package/lib/built/schema-feature.d.ts +1 -1
- package/lib/built/schema-feature.d.ts.map +1 -1
- package/lib/built/schema-feature.js +1 -1
- package/lib/built/schema-feature.js.map +1 -1
- package/lib/built/skill.d.ts +1 -1
- package/lib/built/skill.d.ts.map +1 -1
- package/lib/built/skill.js +1 -1
- package/lib/built/skill.js.map +1 -1
- package/lib/built/tool.d.ts +1 -1
- package/lib/built/tool.d.ts.map +1 -1
- package/lib/built/tool.js +1 -1
- package/lib/built/tool.js.map +1 -1
- package/lib/index.d.ts +5 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +4 -3
- package/lib/index.js.map +1 -1
- package/lib/message-quote.d.ts +11 -0
- package/lib/message-quote.d.ts.map +1 -0
- package/lib/message-quote.js +91 -0
- package/lib/message-quote.js.map +1 -0
- package/lib/message.d.ts +5 -0
- package/lib/message.d.ts.map +1 -1
- package/lib/message.js +13 -0
- package/lib/message.js.map +1 -1
- package/lib/plugin.d.ts +102 -36
- package/lib/plugin.d.ts.map +1 -1
- package/lib/plugin.js +55 -68
- package/lib/plugin.js.map +1 -1
- package/lib/types.d.ts +28 -0
- package/lib/types.d.ts.map +1 -1
- package/package.json +6 -6
- package/lib/cron.d.ts +0 -5
- package/lib/cron.d.ts.map +0 -1
- package/lib/cron.js +0 -5
- package/lib/cron.js.map +0 -1
- package/lib/feature.d.ts +0 -8
- package/lib/feature.d.ts.map +0 -1
- package/lib/feature.js +0 -7
- package/lib/feature.js.map +0 -1
- package/lib/scheduler/index.d.ts +0 -6
- package/lib/scheduler/index.d.ts.map +0 -1
- package/lib/scheduler/index.js +0 -5
- 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
|
package/lib/message.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
package/lib/message.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.js","sourceRoot":"","sources":["../src/message.ts"],"names":[],"mappings":"
|
|
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 类
|
|
3
|
-
*
|
|
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 {
|
|
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
|
-
*
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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?:
|
|
131
|
+
reload(plugin?: PluginBase): Promise<void>;
|
|
122
132
|
/**
|
|
123
|
-
*
|
|
133
|
+
* 监听文件变化(Plugin 类型窄化版本)
|
|
124
134
|
*/
|
|
125
|
-
watch(callback: (p:
|
|
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
|
* 服务类型扩展点
|
package/lib/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA
|
|
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 类
|
|
3
|
-
*
|
|
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
|
|
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 "
|
|
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(
|
|
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(
|
|
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
|
-
*
|
|
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
|
|
95
|
-
parent;
|
|
99
|
+
export class Plugin extends PluginBase {
|
|
96
100
|
static [contextsKey] = [];
|
|
97
101
|
#cachedName;
|
|
98
102
|
#manifest;
|
|
99
103
|
adapters = [];
|
|
100
|
-
|
|
101
|
-
//
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|
|
143
|
-
//
|
|
144
|
-
//
|
|
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
|
-
//
|
|
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
|
-
|
|
586
|
+
const p = plugin;
|
|
587
|
+
this.logger.info(formatCompact({ name: p.name, reload: true }));
|
|
601
588
|
const now = Date.now();
|
|
602
|
-
if (!
|
|
589
|
+
if (!p.parent) {
|
|
603
590
|
// 根插件重载 = 退出进程(由 CLI 重启)
|
|
604
591
|
return process.exit(51);
|
|
605
592
|
}
|
|
606
|
-
const entry =
|
|
607
|
-
const parent =
|
|
608
|
-
await
|
|
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:
|
|
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"))
|