@aalis/plugin-trigger-policy 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -0
- package/dist/config.d.ts +38 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +144 -0
- package/dist/config.js.map +1 -0
- package/dist/detector.d.ts +9 -0
- package/dist/detector.d.ts.map +1 -0
- package/dist/detector.js +47 -0
- package/dist/detector.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +200 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +16 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +48 -0
package/README.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# @aalis/plugin-trigger-policy
|
|
2
|
+
|
|
3
|
+
运行时插件
|
|
4
|
+
|
|
5
|
+
## 角色
|
|
6
|
+
|
|
7
|
+
运行时插件
|
|
8
|
+
|
|
9
|
+
## 安装
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
pnpm add @aalis/plugin-trigger-policy
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## 文档
|
|
16
|
+
|
|
17
|
+
详见 [docs/plugins/plugin-trigger-policy.md](../../docs/plugins/plugin-trigger-policy.md)。
|
|
18
|
+
|
|
19
|
+
## 许可
|
|
20
|
+
|
|
21
|
+
见仓库根目录 LICENSE。
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface TriggerPolicyConfig {
|
|
2
|
+
/**
|
|
3
|
+
* 统一作用域名单:platform:sessionType[:targetId],支持 *。
|
|
4
|
+
* 默认 ['*:group'];空数组 = 不生效(等于禁用触发策略)。
|
|
5
|
+
* 若存在任一 overrides[].scope 命中也视为启用。
|
|
6
|
+
*/
|
|
7
|
+
scopes: string[];
|
|
8
|
+
/**
|
|
9
|
+
* 分作用域覆盖:每条针对一个 scope,仅在命中时覆盖列出的字段;未列字段穿透到顶层默认。
|
|
10
|
+
* 最具体匹配优先(targetId > sessionType > platform > 通配)。
|
|
11
|
+
* 写一条 override 即自动启用该 scope,无需重复在 scopes 中列出。
|
|
12
|
+
*/
|
|
13
|
+
overrides: TriggerScopeOverride[];
|
|
14
|
+
/** 模式:fixed=按计数,dynamic=按评分阈值,both=任一满足 */
|
|
15
|
+
intervalMode: 'fixed' | 'dynamic' | 'both';
|
|
16
|
+
/** 是否检测 @ 提及作为即时触发 */
|
|
17
|
+
triggerOnAt: boolean;
|
|
18
|
+
/** 额外的触发名(除 persona 名字外的别名) */
|
|
19
|
+
triggerNames: string[];
|
|
20
|
+
/** mute 关键词(命中时设置自禁言) */
|
|
21
|
+
muteKeywords: string[];
|
|
22
|
+
/** mute 关键词命中时通知 flow-control 设置的禁言时长(秒) */
|
|
23
|
+
muteTimeSeconds: number;
|
|
24
|
+
}
|
|
25
|
+
export interface TriggerScopeOverride {
|
|
26
|
+
scope: string;
|
|
27
|
+
intervalMode?: 'fixed' | 'dynamic' | 'both';
|
|
28
|
+
triggerOnAt?: boolean;
|
|
29
|
+
triggerNames?: string[];
|
|
30
|
+
muteKeywords?: string[];
|
|
31
|
+
muteTimeSeconds?: number;
|
|
32
|
+
}
|
|
33
|
+
export declare const defaultTriggerPolicyConfig: TriggerPolicyConfig;
|
|
34
|
+
export declare function resolveTriggerPolicyConfig(raw: Record<string, unknown>): TriggerPolicyConfig;
|
|
35
|
+
/** scope 匹配:3 段 platform:sessionType[:targetId],支持 * 与省略。 */
|
|
36
|
+
export declare function isScopeEnabled(cfg: TriggerPolicyConfig, platform: string | undefined, sessionType: string | undefined, targetId?: string | undefined): boolean;
|
|
37
|
+
export declare function resolveEffectiveConfig(cfg: TriggerPolicyConfig, platform: string | undefined, sessionType: string | undefined, targetId?: string | undefined): TriggerPolicyConfig;
|
|
38
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB;;;;OAIG;IACH,SAAS,EAAE,oBAAoB,EAAE,CAAC;IAClC,2CAA2C;IAC3C,YAAY,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IAC3C,sBAAsB;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,+BAA+B;IAC/B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,yBAAyB;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,4CAA4C;IAC5C,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IAC5C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,eAAO,MAAM,0BAA0B,EAAE,mBAQxC,CAAC;AAaF,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,mBAAmB,CAiB5F;AAED,6DAA6D;AAC7D,wBAAgB,cAAc,CAC5B,GAAG,EAAE,mBAAmB,EACxB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,GAC5B,OAAO,CAWT;AAED,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,mBAAmB,EACxB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,GAC5B,mBAAmB,CAwBrB"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// ----- 触发策略配置 -----
|
|
2
|
+
export const defaultTriggerPolicyConfig = {
|
|
3
|
+
scopes: ['*:group'],
|
|
4
|
+
overrides: [],
|
|
5
|
+
intervalMode: 'both',
|
|
6
|
+
triggerOnAt: true,
|
|
7
|
+
triggerNames: [],
|
|
8
|
+
muteKeywords: [],
|
|
9
|
+
muteTimeSeconds: 60,
|
|
10
|
+
};
|
|
11
|
+
function parseStringList(val) {
|
|
12
|
+
if (Array.isArray(val))
|
|
13
|
+
return val.filter(Boolean).map(String);
|
|
14
|
+
if (typeof val === 'string' && val.trim()) {
|
|
15
|
+
return val
|
|
16
|
+
.split(',')
|
|
17
|
+
.map(s => s.trim())
|
|
18
|
+
.filter(Boolean);
|
|
19
|
+
}
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
export function resolveTriggerPolicyConfig(raw) {
|
|
23
|
+
const d = defaultTriggerPolicyConfig;
|
|
24
|
+
return {
|
|
25
|
+
scopes: raw.scopes === undefined ? d.scopes : parseStringList(raw.scopes),
|
|
26
|
+
overrides: parseOverrides(raw.overrides),
|
|
27
|
+
intervalMode: (() => {
|
|
28
|
+
const v = raw.intervalMode;
|
|
29
|
+
return v === 'fixed' || v === 'dynamic' || v === 'both' ? v : d.intervalMode;
|
|
30
|
+
})(),
|
|
31
|
+
triggerOnAt: raw.triggerOnAt ?? d.triggerOnAt,
|
|
32
|
+
triggerNames: parseStringList(raw.triggerNames),
|
|
33
|
+
muteKeywords: parseStringList(raw.muteKeywords),
|
|
34
|
+
muteTimeSeconds: typeof raw.muteTimeSeconds === 'number' && raw.muteTimeSeconds > 0
|
|
35
|
+
? Math.floor(raw.muteTimeSeconds)
|
|
36
|
+
: d.muteTimeSeconds,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/** scope 匹配:3 段 platform:sessionType[:targetId],支持 * 与省略。 */
|
|
40
|
+
export function isScopeEnabled(cfg, platform, sessionType, targetId) {
|
|
41
|
+
const p = platform ?? '';
|
|
42
|
+
const t = sessionType ?? '';
|
|
43
|
+
const tid = targetId ?? '';
|
|
44
|
+
for (const raw of cfg.scopes) {
|
|
45
|
+
if (matchScopeString(raw, p, t, tid))
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
for (const o of cfg.overrides) {
|
|
49
|
+
if (matchScopeString(o.scope, p, t, tid))
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
export function resolveEffectiveConfig(cfg, platform, sessionType, targetId) {
|
|
55
|
+
if (cfg.overrides.length === 0)
|
|
56
|
+
return cfg;
|
|
57
|
+
const p = platform ?? '';
|
|
58
|
+
const t = sessionType ?? '';
|
|
59
|
+
const tid = targetId ?? '';
|
|
60
|
+
let best = null;
|
|
61
|
+
let bestSpec = -1;
|
|
62
|
+
for (const o of cfg.overrides) {
|
|
63
|
+
const parts = parseScopePattern(o.scope);
|
|
64
|
+
if (!matchScopeParts(parts, p, t, tid))
|
|
65
|
+
continue;
|
|
66
|
+
const spec = scopeSpecificity(parts);
|
|
67
|
+
if (spec > bestSpec) {
|
|
68
|
+
best = o;
|
|
69
|
+
bestSpec = spec;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (!best)
|
|
73
|
+
return cfg;
|
|
74
|
+
const merged = { ...cfg };
|
|
75
|
+
if (best.intervalMode !== undefined)
|
|
76
|
+
merged.intervalMode = best.intervalMode;
|
|
77
|
+
if (best.triggerOnAt !== undefined)
|
|
78
|
+
merged.triggerOnAt = best.triggerOnAt;
|
|
79
|
+
if (best.triggerNames !== undefined)
|
|
80
|
+
merged.triggerNames = best.triggerNames;
|
|
81
|
+
if (best.muteKeywords !== undefined)
|
|
82
|
+
merged.muteKeywords = best.muteKeywords;
|
|
83
|
+
if (best.muteTimeSeconds !== undefined)
|
|
84
|
+
merged.muteTimeSeconds = best.muteTimeSeconds;
|
|
85
|
+
return merged;
|
|
86
|
+
}
|
|
87
|
+
function parseScopePattern(s) {
|
|
88
|
+
const parts = (s || '').split(':');
|
|
89
|
+
return {
|
|
90
|
+
platform: parts[0] || '*',
|
|
91
|
+
sessionType: parts[1] || '*',
|
|
92
|
+
targetId: parts[2] || '*',
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function matchScopeParts(pat, p, t, tid) {
|
|
96
|
+
return ((pat.platform === '*' || pat.platform === '' || pat.platform === p) &&
|
|
97
|
+
(pat.sessionType === '*' || pat.sessionType === '' || pat.sessionType === t) &&
|
|
98
|
+
(pat.targetId === '*' || pat.targetId === '' || pat.targetId === tid));
|
|
99
|
+
}
|
|
100
|
+
function matchScopeString(raw, p, t, tid) {
|
|
101
|
+
return matchScopeParts(parseScopePattern(raw), p, t, tid);
|
|
102
|
+
}
|
|
103
|
+
function scopeSpecificity(pat) {
|
|
104
|
+
return ((pat.platform !== '*' && pat.platform !== '' ? 4 : 0) +
|
|
105
|
+
(pat.sessionType !== '*' && pat.sessionType !== '' ? 2 : 0) +
|
|
106
|
+
(pat.targetId !== '*' && pat.targetId !== '' ? 1 : 0));
|
|
107
|
+
}
|
|
108
|
+
function parseOverrides(raw) {
|
|
109
|
+
if (!Array.isArray(raw))
|
|
110
|
+
return [];
|
|
111
|
+
const out = [];
|
|
112
|
+
for (const item of raw) {
|
|
113
|
+
if (!item || typeof item !== 'object')
|
|
114
|
+
continue;
|
|
115
|
+
const obj = item;
|
|
116
|
+
if (typeof obj.scope !== 'string' || !obj.scope.trim())
|
|
117
|
+
continue;
|
|
118
|
+
const o = { scope: obj.scope.trim() };
|
|
119
|
+
const mode = obj.intervalMode;
|
|
120
|
+
if (mode === 'fixed' || mode === 'dynamic' || mode === 'both')
|
|
121
|
+
o.intervalMode = mode;
|
|
122
|
+
if (typeof obj.triggerOnAt === 'boolean')
|
|
123
|
+
o.triggerOnAt = obj.triggerOnAt;
|
|
124
|
+
// 字符串字段:仅在非空时视为覆盖;空串/未填 → 穿透到顶层默认
|
|
125
|
+
if (typeof obj.triggerNames === 'string' && obj.triggerNames.trim() !== '') {
|
|
126
|
+
o.triggerNames = parseStringList(obj.triggerNames);
|
|
127
|
+
}
|
|
128
|
+
else if (Array.isArray(obj.triggerNames) && obj.triggerNames.length > 0) {
|
|
129
|
+
o.triggerNames = parseStringList(obj.triggerNames);
|
|
130
|
+
}
|
|
131
|
+
if (typeof obj.muteKeywords === 'string' && obj.muteKeywords.trim() !== '') {
|
|
132
|
+
o.muteKeywords = parseStringList(obj.muteKeywords);
|
|
133
|
+
}
|
|
134
|
+
else if (Array.isArray(obj.muteKeywords) && obj.muteKeywords.length > 0) {
|
|
135
|
+
o.muteKeywords = parseStringList(obj.muteKeywords);
|
|
136
|
+
}
|
|
137
|
+
if (typeof obj.muteTimeSeconds === 'number' && obj.muteTimeSeconds > 0) {
|
|
138
|
+
o.muteTimeSeconds = Math.floor(obj.muteTimeSeconds);
|
|
139
|
+
}
|
|
140
|
+
out.push(o);
|
|
141
|
+
}
|
|
142
|
+
return out;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Context } from '@aalis/core';
|
|
2
|
+
import type { TriggerPolicyConfig } from './config.js';
|
|
3
|
+
/** @ 检测:覆盖 onebot 内联格式(<at self>、CQ:at) */
|
|
4
|
+
export declare function checkImmediateMention(content: string): boolean;
|
|
5
|
+
export declare function getBotNames(ctx: Context, cfg: TriggerPolicyConfig): string[];
|
|
6
|
+
export declare function checkNameMention(content: string, names: string[]): boolean;
|
|
7
|
+
export declare function checkImmediateTrigger(ctx: Context, cfg: TriggerPolicyConfig, content: string): boolean;
|
|
8
|
+
export declare function checkMuteKeyword(_ctx: Context, cfg: TriggerPolicyConfig, content: string): boolean;
|
|
9
|
+
//# sourceMappingURL=detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../src/detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAKvD,2CAA2C;AAC3C,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAI9D;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,mBAAmB,GAAG,MAAM,EAAE,CAY5E;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAK1E;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAItG;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAKlG"}
|
package/dist/detector.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// PersonaService 仅用于 getBotNames(读取昵称/名字)。mute 关键词统一由 trigger-policy 下发配置,
|
|
2
|
+
// 不再从 persona 读取(避免单例 PersonaService 跨平台泄漏)。
|
|
3
|
+
/** @ 检测:覆盖 onebot 内联格式(<at self>、CQ:at) */
|
|
4
|
+
export function checkImmediateMention(content) {
|
|
5
|
+
if (/<at self[\s>][\s\S]*?<\/at>/.test(content))
|
|
6
|
+
return true;
|
|
7
|
+
if (/\[CQ:at,qq=\d+\]/.test(content))
|
|
8
|
+
return true;
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
export function getBotNames(ctx, cfg) {
|
|
12
|
+
const names = [...cfg.triggerNames];
|
|
13
|
+
const persona = ctx.getService('persona');
|
|
14
|
+
if (persona) {
|
|
15
|
+
const personaName = persona.getPersonaName?.();
|
|
16
|
+
if (personaName && !names.includes(personaName))
|
|
17
|
+
names.push(personaName);
|
|
18
|
+
const nicks = persona.getNickNames?.() ?? [];
|
|
19
|
+
for (const n of nicks) {
|
|
20
|
+
if (n && !names.includes(n))
|
|
21
|
+
names.push(n);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return names;
|
|
25
|
+
}
|
|
26
|
+
export function checkNameMention(content, names) {
|
|
27
|
+
for (const name of names) {
|
|
28
|
+
if (name && content.includes(name))
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
export function checkImmediateTrigger(ctx, cfg, content) {
|
|
34
|
+
if (cfg.triggerOnAt && checkImmediateMention(content))
|
|
35
|
+
return true;
|
|
36
|
+
if (checkNameMention(content, getBotNames(ctx, cfg)))
|
|
37
|
+
return true;
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
export function checkMuteKeyword(_ctx, cfg, content) {
|
|
41
|
+
for (const kw of cfg.muteKeywords) {
|
|
42
|
+
if (content.includes(kw))
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../src/detector.ts"],"names":[],"mappings":"AAIA,2EAA2E;AAC3E,6CAA6C;AAE7C,2CAA2C;AAC3C,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,IAAI,6BAA6B,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7D,IAAI,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAClD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAY,EAAE,GAAwB;IAChE,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAiB,SAAS,CAAC,CAAC;IAC1D,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;QAC/C,IAAI,WAAW,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC;QAC7C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,KAAe;IAC/D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IAClD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAY,EAAE,GAAwB,EAAE,OAAe;IAC3F,IAAI,GAAG,CAAC,WAAW,IAAI,qBAAqB,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACnE,IAAI,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAClE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAa,EAAE,GAAwB,EAAE,OAAe;IACvF,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;QAClC,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;IACxC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ConfigSchema, Context } from '@aalis/core';
|
|
2
|
+
import '@aalis/plugin-gateway-api';
|
|
3
|
+
export type { TriggerDecision, TriggerKind, TriggerPolicyService } from './types.js';
|
|
4
|
+
import { type TriggerPolicyConfig } from './config.js';
|
|
5
|
+
export declare const name = "@aalis/plugin-trigger-policy";
|
|
6
|
+
export declare const displayName = "\u89E6\u53D1\u7B56\u7565";
|
|
7
|
+
export declare const subsystem = "scheduler";
|
|
8
|
+
export declare const provides: string[];
|
|
9
|
+
export declare const inject: {
|
|
10
|
+
required: string[];
|
|
11
|
+
optional: string[];
|
|
12
|
+
};
|
|
13
|
+
export declare const configSchema: ConfigSchema;
|
|
14
|
+
export declare const defaultConfig: TriggerPolicyConfig;
|
|
15
|
+
export declare function apply(ctx: Context, raw: Record<string, unknown>): void;
|
|
16
|
+
export type { TriggerPolicyConfig };
|
|
17
|
+
declare module '@aalis/core' {
|
|
18
|
+
interface ServiceTypeMap {
|
|
19
|
+
'trigger-policy': import('./types.js').TriggerPolicyService;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAMzD,OAAO,2BAA2B,CAAC;AAEnC,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGrF,OAAO,EAKL,KAAK,mBAAmB,EACzB,MAAM,aAAa,CAAC;AAKrB,eAAO,MAAM,IAAI,iCAAiC,CAAC;AACnD,eAAO,MAAM,WAAW,6BAAS,CAAC;AAClC,eAAO,MAAM,SAAS,cAAc,CAAC;AACrC,eAAO,MAAM,QAAQ,UAAqB,CAAC;AAC3C,eAAO,MAAM,MAAM;;;CAGlB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,YAuD1B,CAAC;AAEF,eAAO,MAAM,aAAa,qBAA6B,CAAC;AAIxD,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CA0ItE;AAED,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAGpC,OAAO,QAAQ,aAAa,CAAC;IAC3B,UAAU,cAAc;QACtB,gBAAgB,EAAE,OAAO,YAAY,EAAE,oBAAoB,CAAC;KAC7D;CACF"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import '@aalis/plugin-gateway-api';
|
|
2
|
+
import { INBOUND_PHASE } from '@aalis/plugin-gateway-api';
|
|
3
|
+
import { defaultTriggerPolicyConfig, isScopeEnabled, resolveEffectiveConfig, resolveTriggerPolicyConfig, } from './config.js';
|
|
4
|
+
import { checkImmediateTrigger, checkMuteKeyword, getBotNames } from './detector.js';
|
|
5
|
+
// ----- 元数据 -----
|
|
6
|
+
export const name = '@aalis/plugin-trigger-policy';
|
|
7
|
+
export const displayName = '触发策略';
|
|
8
|
+
export const subsystem = 'scheduler';
|
|
9
|
+
export const provides = ['trigger-policy'];
|
|
10
|
+
export const inject = {
|
|
11
|
+
required: ['gateway'],
|
|
12
|
+
optional: ['flow-control', 'persona', 'message-archive'],
|
|
13
|
+
};
|
|
14
|
+
export const configSchema = {
|
|
15
|
+
scopes: {
|
|
16
|
+
type: 'multiselect',
|
|
17
|
+
label: '生效作用域',
|
|
18
|
+
default: defaultTriggerPolicyConfig.scopes,
|
|
19
|
+
dynamicOptions: 'gateway-scopes',
|
|
20
|
+
allowCustom: true,
|
|
21
|
+
description: '格式 platform:sessionType,支持通配 *;onebot:group / *:group / onebot:* / *。默认 *:group。',
|
|
22
|
+
},
|
|
23
|
+
intervalMode: {
|
|
24
|
+
type: 'select',
|
|
25
|
+
label: '间隔模式',
|
|
26
|
+
default: defaultTriggerPolicyConfig.intervalMode,
|
|
27
|
+
options: [
|
|
28
|
+
{ label: 'fixed (仅按计数)', value: 'fixed' },
|
|
29
|
+
{ label: 'dynamic (仅按评分阈值)', value: 'dynamic' },
|
|
30
|
+
{ label: 'both (任一满足)', value: 'both' },
|
|
31
|
+
],
|
|
32
|
+
},
|
|
33
|
+
triggerOnAt: { type: 'boolean', label: '检测 @ 提及', default: defaultTriggerPolicyConfig.triggerOnAt },
|
|
34
|
+
triggerNames: { type: 'string', label: '触发名别名(逗号分隔)', default: '' },
|
|
35
|
+
muteKeywords: { type: 'string', label: '禁言关键词(逗号分隔)', default: '' },
|
|
36
|
+
muteTimeSeconds: {
|
|
37
|
+
type: 'number',
|
|
38
|
+
label: '禁言关键词命中时长(秒)',
|
|
39
|
+
default: defaultTriggerPolicyConfig.muteTimeSeconds,
|
|
40
|
+
},
|
|
41
|
+
overrides: {
|
|
42
|
+
type: 'array',
|
|
43
|
+
label: '分作用域覆盖',
|
|
44
|
+
description: '每项 {scope: "platform:sessionType[:targetId]", ...} 仅在该 scope 命中时覆盖列出的字段;字段留空(或不填)= 沿用上方默认,不会被覆盖为 0/空。写一条 override 自动启用该 scope。',
|
|
45
|
+
default: [],
|
|
46
|
+
items: {
|
|
47
|
+
scope: {
|
|
48
|
+
type: 'string',
|
|
49
|
+
label: '作用域',
|
|
50
|
+
description: '格式 platform:sessionType[:targetId],支持 *',
|
|
51
|
+
required: true,
|
|
52
|
+
},
|
|
53
|
+
intervalMode: {
|
|
54
|
+
type: 'select',
|
|
55
|
+
label: '间隔模式',
|
|
56
|
+
options: [
|
|
57
|
+
{ label: 'fixed', value: 'fixed' },
|
|
58
|
+
{ label: 'dynamic', value: 'dynamic' },
|
|
59
|
+
{ label: 'both', value: 'both' },
|
|
60
|
+
],
|
|
61
|
+
},
|
|
62
|
+
triggerOnAt: { type: 'boolean', label: '检测 @ 提及' },
|
|
63
|
+
triggerNames: { type: 'string', label: '触发名别名(逗号分隔)' },
|
|
64
|
+
muteKeywords: { type: 'string', label: '禁言关键词(逗号分隔)' },
|
|
65
|
+
muteTimeSeconds: { type: 'number', label: '禁言关键词时长(秒)' },
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
export const defaultConfig = defaultTriggerPolicyConfig;
|
|
70
|
+
// ----- 入口 -----
|
|
71
|
+
export function apply(ctx, raw) {
|
|
72
|
+
const cfg = resolveTriggerPolicyConfig(raw);
|
|
73
|
+
/** 从 IncomingMessage 派生 per-scope override 用的 targetId(群=groupId / 私=userId / 其他=空) */
|
|
74
|
+
function extractTargetId(message) {
|
|
75
|
+
if (message.sessionType === 'group')
|
|
76
|
+
return message.groupId ?? '';
|
|
77
|
+
if (message.sessionType === 'private')
|
|
78
|
+
return message.userId ?? '';
|
|
79
|
+
return '';
|
|
80
|
+
}
|
|
81
|
+
/** 把"被策略吞掉"的入站消息归档(与 flow-control 的 shadow 归档对齐) */
|
|
82
|
+
async function shadowArchive(message) {
|
|
83
|
+
const archive = ctx.getService('message-archive');
|
|
84
|
+
if (!archive)
|
|
85
|
+
return;
|
|
86
|
+
try {
|
|
87
|
+
await archive.archiveIncoming(message);
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
ctx.logger.warn(`[trigger] shadow 归档失败: ${err}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const service = {
|
|
94
|
+
decide(message) {
|
|
95
|
+
const tid = extractTargetId(message);
|
|
96
|
+
if (!isScopeEnabled(cfg, message.platform, message.sessionType, tid)) {
|
|
97
|
+
return {
|
|
98
|
+
kind: 'direct',
|
|
99
|
+
reason: `scope 不在触发策略名单内 (${message.platform ?? '?'}:${message.sessionType ?? '?'})`,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
const eff = resolveEffectiveConfig(cfg, message.platform, message.sessionType, tid);
|
|
103
|
+
// 特殊通知事件(poke 等)视同 @ 直触发:能进到这里说明 adapter 已经判断过
|
|
104
|
+
// 目标是 bot(私聊 poke 全部回复 / 群聊 poke 仅在 target=self 时才转成 inbound)。
|
|
105
|
+
if (message.noticeType === 'poke') {
|
|
106
|
+
return { kind: 'immediate', reason: 'poke notice' };
|
|
107
|
+
}
|
|
108
|
+
if (checkImmediateTrigger(ctx, eff, message.content)) {
|
|
109
|
+
return { kind: 'immediate', reason: '@/name match' };
|
|
110
|
+
}
|
|
111
|
+
const flow = ctx.getService('flow-control');
|
|
112
|
+
const snap = flow?.getStateSnapshot(message.sessionId);
|
|
113
|
+
if (!snap) {
|
|
114
|
+
return { kind: 'interval', reason: 'no flow state, default-pass' };
|
|
115
|
+
}
|
|
116
|
+
const fixedOk = snap.messageCount >= snap.fixedInterval;
|
|
117
|
+
const dynamicOk = snap.activityScore >= (flow?.getThreshold(message.sessionId) ?? 0);
|
|
118
|
+
let trigger = false;
|
|
119
|
+
switch (eff.intervalMode) {
|
|
120
|
+
case 'fixed':
|
|
121
|
+
trigger = fixedOk;
|
|
122
|
+
break;
|
|
123
|
+
case 'dynamic':
|
|
124
|
+
trigger = dynamicOk;
|
|
125
|
+
break;
|
|
126
|
+
case 'both':
|
|
127
|
+
trigger = fixedOk || dynamicOk;
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
return trigger
|
|
131
|
+
? { kind: 'interval', reason: `interval-mode=${eff.intervalMode}` }
|
|
132
|
+
: { kind: 'swallow', reason: 'below threshold' };
|
|
133
|
+
},
|
|
134
|
+
getBotNames() {
|
|
135
|
+
return getBotNames(ctx, cfg);
|
|
136
|
+
},
|
|
137
|
+
detectMuteKeyword(content) {
|
|
138
|
+
return checkMuteKeyword(ctx, cfg, content);
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
ctx.provide('trigger-policy', service);
|
|
142
|
+
ctx.logger.info(`[trigger] 已启用 (模式=${cfg.intervalMode}, @提及=${cfg.triggerOnAt}, ` +
|
|
143
|
+
`别名=${cfg.triggerNames.length}, mute关键词=${cfg.muteKeywords.length}, ` +
|
|
144
|
+
`mute时长=${cfg.muteTimeSeconds}s, scopes=${cfg.scopes.join('|') || '<空>'}, ` +
|
|
145
|
+
`overrides=${cfg.overrides.length})`);
|
|
146
|
+
// ===== inbound:trigger 相位:触发判定 =====
|
|
147
|
+
// 由 plugin-gateway 在 inbound:flow 之后、inbound:dispatch 之前触发。
|
|
148
|
+
// 进入本相位意味着已通过冷却/限速闸门。
|
|
149
|
+
ctx.middleware(INBOUND_PHASE.TRIGGER, async (data, next) => {
|
|
150
|
+
const { message } = data;
|
|
151
|
+
if (message.source === 'idle-trigger')
|
|
152
|
+
return next(); // 内部注入跳过策略
|
|
153
|
+
const flow = ctx.getService('flow-control');
|
|
154
|
+
const tid = extractTargetId(message);
|
|
155
|
+
// 不在触发策略作用域内(默认 *:group):直接放行。
|
|
156
|
+
// 必须在 mute 检查之前进行,否则 QQ 群的 mute 关键词会泄漏到 WebUI/私聊等不在 scope 内的会话。
|
|
157
|
+
if (!isScopeEnabled(cfg, message.platform, message.sessionType, tid)) {
|
|
158
|
+
return next();
|
|
159
|
+
}
|
|
160
|
+
const eff = resolveEffectiveConfig(cfg, message.platform, message.sessionType, tid);
|
|
161
|
+
// mute 关键词命中:设置自禁言并 swallow
|
|
162
|
+
if (checkMuteKeyword(ctx, eff, message.content)) {
|
|
163
|
+
ctx.logger.info(`[trigger] mute 关键词命中 → swallow + setMuted(${eff.muteTimeSeconds}s): ${message.sessionId}`);
|
|
164
|
+
flow?.setMuted(message.sessionId, eff.muteTimeSeconds);
|
|
165
|
+
// 与 dev OneBot ChatFlow 一致:设置自禁言后调度一次 idle,
|
|
166
|
+
// 让禁言结束附近能正常进入「长期静默→主动招呼」路径。
|
|
167
|
+
flow?.rescheduleIdle(message.sessionId, message.platform);
|
|
168
|
+
await shadowArchive(message);
|
|
169
|
+
return; // swallow
|
|
170
|
+
}
|
|
171
|
+
let decision;
|
|
172
|
+
try {
|
|
173
|
+
decision = service.decide(message);
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
ctx.logger.warn(`[trigger] decide() 异常,默认放行: ${err}`);
|
|
177
|
+
await next();
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
// 统一状态日志(与历史 dev OneBot ChatFlow 的"消息计数/发言指数"日志保持一致):
|
|
181
|
+
// 让运维可以一眼看到"还差多少条/多少分会触发"。
|
|
182
|
+
const snap = flow?.getStateSnapshot(message.sessionId);
|
|
183
|
+
const threshold = flow?.getThreshold(message.sessionId);
|
|
184
|
+
const stateStr = snap
|
|
185
|
+
? `计数=${snap.messageCount}/${snap.fixedInterval} | 指数=${snap.activityScore.toFixed(3)} (阈值=${(threshold ?? 0).toFixed(3)})`
|
|
186
|
+
: '无 flow 状态';
|
|
187
|
+
if (decision.kind === 'immediate' || decision.kind === 'interval') {
|
|
188
|
+
ctx.logger.debug(`[trigger] ${decision.kind} → 触发 | session=${message.sessionId} | ${stateStr} | ${decision.reason}`);
|
|
189
|
+
flow?.recordTriggered(message.sessionId);
|
|
190
|
+
message.triggerType = decision.kind;
|
|
191
|
+
await next();
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
// swallow
|
|
195
|
+
ctx.logger.debug(`[trigger] 未触发 → 吞噬 | session=${message.sessionId} | ${stateStr} | ${decision.reason}`);
|
|
196
|
+
await shadowArchive(message);
|
|
197
|
+
// flow-control 已在前置中调度 idle,无需重复
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { IncomingMessage } from '@aalis/plugin-message-api';
|
|
2
|
+
export type TriggerKind = 'immediate' | 'interval' | 'swallow' | 'direct';
|
|
3
|
+
export interface TriggerDecision {
|
|
4
|
+
kind: TriggerKind;
|
|
5
|
+
/** 调试/日志用 */
|
|
6
|
+
reason: string;
|
|
7
|
+
}
|
|
8
|
+
export interface TriggerPolicyService {
|
|
9
|
+
/** 综合决策(含 @/名字检测、间隔/评分判定、私聊直放等) */
|
|
10
|
+
decide(message: IncomingMessage): TriggerDecision;
|
|
11
|
+
/** 当前生效的 bot 名称别名列表(含 persona) */
|
|
12
|
+
getBotNames(): string[];
|
|
13
|
+
/** 检查内容是否含 mute 关键词 */
|
|
14
|
+
detectMuteKeyword(content: string): boolean;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEjE,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE1E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,WAAW,CAAC;IAClB,aAAa;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,mCAAmC;IACnC,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,eAAe,CAAC;IAClD,kCAAkC;IAClC,WAAW,IAAI,MAAM,EAAE,CAAC;IACxB,uBAAuB;IACvB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;CAC7C"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,EAAE;AACF,6CAA6C;AAC7C,kDAAkD"}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aalis/plugin-trigger-policy",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"aalis-plugin"
|
|
7
|
+
],
|
|
8
|
+
"main": "dist/index.js",
|
|
9
|
+
"types": "dist/index.d.ts",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@aalis/plugin-gateway-api": "^0.1.0"
|
|
15
|
+
},
|
|
16
|
+
"devDependencies": {
|
|
17
|
+
"@types/node": "^22.0.0",
|
|
18
|
+
"typescript": "^5.7.0",
|
|
19
|
+
"@aalis/plugin-flow-control-api": "0.1.0",
|
|
20
|
+
"@aalis/plugin-message-api": "0.1.0",
|
|
21
|
+
"@aalis/plugin-persona-api": "0.1.0",
|
|
22
|
+
"@aalis/plugin-webui-api": "0.1.0",
|
|
23
|
+
"@aalis/plugin-message-archive-api": "0.1.0",
|
|
24
|
+
"@aalis/core": "0.1.0"
|
|
25
|
+
},
|
|
26
|
+
"peerDependencies": {
|
|
27
|
+
"@aalis/core": "^0.1.0"
|
|
28
|
+
},
|
|
29
|
+
"aalis": {
|
|
30
|
+
"service": {
|
|
31
|
+
"required": [
|
|
32
|
+
"gateway"
|
|
33
|
+
],
|
|
34
|
+
"optional": [
|
|
35
|
+
"flow-control",
|
|
36
|
+
"persona",
|
|
37
|
+
"message-archive"
|
|
38
|
+
],
|
|
39
|
+
"provides": [
|
|
40
|
+
"trigger-policy"
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"scripts": {
|
|
45
|
+
"build": "tsc",
|
|
46
|
+
"dev": "tsc --watch"
|
|
47
|
+
}
|
|
48
|
+
}
|