@aalis/plugin-trigger-policy 0.15.0 → 0.17.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/dist/config.d.ts +118 -157
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +55 -122
- package/dist/config.js.map +1 -1
- package/dist/idle-scheduler.d.ts +14 -9
- package/dist/idle-scheduler.d.ts.map +1 -1
- package/dist/idle-scheduler.js +37 -23
- package/dist/idle-scheduler.js.map +1 -1
- package/dist/index.d.ts +10 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +62 -49
- package/dist/index.js.map +1 -1
- package/dist/locales/en.d.ts +36 -0
- package/dist/locales/en.d.ts.map +1 -0
- package/dist/locales/en.js +36 -0
- package/dist/locales/en.js.map +1 -0
- package/dist/state.d.ts +6 -10
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +1 -3
- package/dist/state.js.map +1 -1
- package/dist/texts.d.ts +71 -0
- package/dist/texts.d.ts.map +1 -0
- package/dist/texts.js +44 -0
- package/dist/texts.js.map +1 -0
- package/package.json +19 -14
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/idle-scheduler.d.ts
CHANGED
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
import type { FlowControlService } from '@aalis/api-flow-control';
|
|
2
|
-
import {
|
|
3
|
-
import type { Logger,
|
|
4
|
-
import type { TriggerPolicyConfig } from './config.js';
|
|
2
|
+
import type { GatewayService } from '@aalis/api-gateway';
|
|
3
|
+
import type { Logger, ServiceSelection } from '@aalis/core';
|
|
4
|
+
import type { TriggerPolicyConfig, TriggerPolicySettings } from './config.js';
|
|
5
5
|
import { type TriggerSessionState } from './state.js';
|
|
6
|
-
/**
|
|
6
|
+
/** 调度器用到的能力:日志、网关与流控闸门(只读当前提供者)、本插件此刻是否生效,以及按会话现读参数 */
|
|
7
7
|
export interface IdleCaps {
|
|
8
8
|
logger: Logger;
|
|
9
|
-
gateway: Pick<
|
|
10
|
-
flowControl: Pick<
|
|
9
|
+
gateway: Pick<ServiceSelection<GatewayService>, 'present' | 'use'>;
|
|
10
|
+
flowControl: Pick<ServiceSelection<FlowControlService>, 'present' | 'use'>;
|
|
11
11
|
isActive(): boolean;
|
|
12
|
+
/** 一个会话此刻的参数;不给会话时取全局层 */
|
|
13
|
+
settingsOf(sessionId?: string, platform?: string): TriggerPolicySettings;
|
|
12
14
|
}
|
|
13
|
-
export declare function scheduleSessionIdle(caps: IdleCaps,
|
|
15
|
+
export declare function scheduleSessionIdle(caps: IdleCaps, state: TriggerSessionState, sessionId: string, reschedule: () => void): void;
|
|
14
16
|
export declare function clearSessionIdle(state: TriggerSessionState): void;
|
|
15
17
|
export declare class PlatformIdleScheduler {
|
|
16
18
|
private readonly caps;
|
|
17
|
-
private readonly
|
|
19
|
+
private readonly strategy;
|
|
18
20
|
private readonly states;
|
|
19
21
|
private timer;
|
|
20
22
|
private running;
|
|
@@ -22,8 +24,10 @@ export declare class PlatformIdleScheduler {
|
|
|
22
24
|
private stopped;
|
|
23
25
|
/** start() 时刻——无任何活动记录时拿它当「最后一次活动」的基准 */
|
|
24
26
|
private startedAt;
|
|
25
|
-
constructor(caps: IdleCaps,
|
|
27
|
+
constructor(caps: IdleCaps, strategy: TriggerPolicyConfig['idleTriggerStrategy'], states: Map<string, TriggerSessionState>);
|
|
26
28
|
start(): void;
|
|
29
|
+
/** 全局层改了:没在排 tick(原来关着)时按新值排一次;已在排的到下一个 tick 自然按新值 */
|
|
30
|
+
wake(): void;
|
|
27
31
|
stop(): void;
|
|
28
32
|
/** 距离全部会话静默达标还需多少 ms(返回 0 = 已达标) */
|
|
29
33
|
private timeUntilAllQuiet;
|
|
@@ -31,6 +35,7 @@ export declare class PlatformIdleScheduler {
|
|
|
31
35
|
private pickTarget;
|
|
32
36
|
/** 跑一次 tick(发没发出去都不影响重排间隔,故无返回值) */
|
|
33
37
|
private runOnce;
|
|
38
|
+
/** 排下一个 tick;afterTick 为真时至少隔一个阈值量级(见回调末尾) */
|
|
34
39
|
private schedule;
|
|
35
40
|
}
|
|
36
41
|
//# sourceMappingURL=idle-scheduler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idle-scheduler.d.ts","sourceRoot":"","sources":["../src/idle-scheduler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"idle-scheduler.d.ts","sourceRoot":"","sources":["../src/idle-scheduler.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtE,uDAAuD;AACvD,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,CAAC;IACnE,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,CAAC;IAC3E,QAAQ,IAAI,OAAO,CAAC;IACpB,0BAA0B;IAC1B,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,qBAAqB,CAAC;CAC1E;AA8BD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,mBAAmB,EAC1B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,IAAI,GACrB,IAAI,CA2CN;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAKjE;AAOD,qBAAa,qBAAqB;IAS9B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAVzB,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,OAAO,CAAS;IACxB,uDAAuD;IACvD,OAAO,CAAC,OAAO,CAAQ;IACvB,yCAAyC;IACzC,OAAO,CAAC,SAAS,CAAK;gBAGH,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,mBAAmB,CAAC,qBAAqB,CAAC,EACpD,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC;IAG3D,KAAK,IAAI,IAAI;IAMb,sDAAsD;IACtD,IAAI,IAAI,IAAI;IAIZ,IAAI,IAAI,IAAI;IAQZ,oCAAoC;IACpC,OAAO,CAAC,iBAAiB;IAazB,gCAAgC;IAChC,OAAO,CAAC,UAAU;IAiBlB,oCAAoC;YACtB,OAAO;IA2BrB,8CAA8C;IAC9C,OAAO,CAAC,QAAQ;CAoCjB"}
|
package/dist/idle-scheduler.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
//
|
|
3
3
|
// session 范围:每会话一个 setTimeout,触发时合成 system 提示注入 gateway。
|
|
4
4
|
// platform 范围:跨平台一个 tick,挑"最久未联系"的 session 主动开聊。
|
|
5
|
+
// 参数不在这里存:每次排定时器与每个 tick 都按会话现读(platform 范围的开关与间隔取全局层),改了下一次起生效。
|
|
5
6
|
// 到点时本插件不是生效的触发插件(trigger 服务胜者)就不开口:不注入,也不记为 bot 开口。
|
|
6
|
-
import { resolveEffectiveConfig } from '@aalis/api-gateway';
|
|
7
7
|
import { lastActivityOf } from './state.js';
|
|
8
8
|
const DEFAULT_PROMPT = '当前会话已长时间无消息,请根据人设主动开启一个轻松的话题或问候。不要提及"系统提示"或表明你是被触发发言的。';
|
|
9
9
|
function buildIdleMessage(sessionId, platform, prompt) {
|
|
@@ -20,16 +20,17 @@ function buildIdleMessage(sessionId, platform, prompt) {
|
|
|
20
20
|
* 那时 inbound:message 同样无人消费(消费方就是 gateway 插件),这次注入只记一条 debug 放弃
|
|
21
21
|
*/
|
|
22
22
|
async function injectIdle(caps, msg) {
|
|
23
|
-
|
|
24
|
-
if (!gateway) {
|
|
23
|
+
if (!caps.gateway.present) {
|
|
25
24
|
caps.logger.debug(`[trigger] 空闲触发放弃(gateway 缺席): session=${msg.sessionId}`);
|
|
26
25
|
return;
|
|
27
26
|
}
|
|
27
|
+
const gateway = caps.gateway.use;
|
|
28
28
|
await gateway.ingressMessage(msg);
|
|
29
29
|
}
|
|
30
30
|
// ===== session 范围调度 =====
|
|
31
|
-
export function scheduleSessionIdle(caps,
|
|
31
|
+
export function scheduleSessionIdle(caps, state, sessionId, reschedule) {
|
|
32
32
|
clearSessionIdle(state);
|
|
33
|
+
const cfg = caps.settingsOf(sessionId, state.platform);
|
|
33
34
|
if (cfg.idleTriggerScope !== 'session')
|
|
34
35
|
return;
|
|
35
36
|
if (cfg.idleTriggerMinutes <= 0)
|
|
@@ -48,7 +49,11 @@ export function scheduleSessionIdle(caps, cfg, state, sessionId, reschedule) {
|
|
|
48
49
|
state.idleTimer = setTimeout(async () => {
|
|
49
50
|
try {
|
|
50
51
|
// 本插件不生效、或禁言期(flow 相位也会吞,这里省掉一次注入)不开口:跳过本次并按原退避重排
|
|
51
|
-
const skip = !caps.isActive()
|
|
52
|
+
const skip = !caps.isActive()
|
|
53
|
+
? '触发策略未生效'
|
|
54
|
+
: (caps.flowControl.present ? caps.flowControl.use.isMuted(sessionId) : undefined)
|
|
55
|
+
? '禁言中'
|
|
56
|
+
: '';
|
|
52
57
|
if (skip) {
|
|
53
58
|
caps.logger.debug(`[trigger] 空闲触发跳过(${skip}): session=${sessionId}`);
|
|
54
59
|
reschedule();
|
|
@@ -79,17 +84,17 @@ export function clearSessionIdle(state) {
|
|
|
79
84
|
const IDLE_RETRY_MIN_MS = 60_000;
|
|
80
85
|
export class PlatformIdleScheduler {
|
|
81
86
|
caps;
|
|
82
|
-
|
|
87
|
+
strategy;
|
|
83
88
|
states;
|
|
84
89
|
timer = null;
|
|
85
90
|
running = false;
|
|
86
91
|
/** stop() 之后不再重排——tick 回调可能已在飞行中,回来时要认这面旗,否则留下僵尸定时器 */
|
|
87
|
-
stopped =
|
|
92
|
+
stopped = true;
|
|
88
93
|
/** start() 时刻——无任何活动记录时拿它当「最后一次活动」的基准 */
|
|
89
94
|
startedAt = 0;
|
|
90
|
-
constructor(caps,
|
|
95
|
+
constructor(caps, strategy, states) {
|
|
91
96
|
this.caps = caps;
|
|
92
|
-
this.
|
|
97
|
+
this.strategy = strategy;
|
|
93
98
|
this.states = states;
|
|
94
99
|
}
|
|
95
100
|
start() {
|
|
@@ -97,6 +102,11 @@ export class PlatformIdleScheduler {
|
|
|
97
102
|
this.startedAt = Date.now();
|
|
98
103
|
this.schedule();
|
|
99
104
|
}
|
|
105
|
+
/** 全局层改了:没在排 tick(原来关着)时按新值排一次;已在排的到下一个 tick 自然按新值 */
|
|
106
|
+
wake() {
|
|
107
|
+
if (!this.timer && !this.running)
|
|
108
|
+
this.schedule();
|
|
109
|
+
}
|
|
100
110
|
stop() {
|
|
101
111
|
this.stopped = true;
|
|
102
112
|
if (this.timer) {
|
|
@@ -120,14 +130,14 @@ export class PlatformIdleScheduler {
|
|
|
120
130
|
}
|
|
121
131
|
/** 选一个最适合主动开聊的会话(带该会话的有效提示词) */
|
|
122
132
|
pickTarget() {
|
|
123
|
-
const flow = this.caps.flowControl.
|
|
133
|
+
const flow = this.caps.flowControl.present ? this.caps.flowControl.use : undefined;
|
|
124
134
|
let best = null;
|
|
125
135
|
for (const [sid, s] of this.states) {
|
|
126
|
-
// 禁言会话选了也会被 flow 相位吞掉;冷却对闲置注入只在这里把关(flow 相位对内部注入不查冷却),限速在 flow
|
|
136
|
+
// 禁言会话选了也会被 flow 相位吞掉;冷却对闲置注入只在这里把关(flow 相位对内部注入不查冷却),限速在 flow 相位(生效范围内)还会再查一次
|
|
127
137
|
if (flow?.isMuted(sid) || flow?.isCoolingDown(sid) || flow?.isRateLimited(sid))
|
|
128
138
|
continue;
|
|
129
|
-
const e =
|
|
130
|
-
//
|
|
139
|
+
const e = this.caps.settingsOf(sid, s.platform);
|
|
140
|
+
// 按会话单独关掉('off')或改成 session 档的会话不能被 platform 档抓来开聊
|
|
131
141
|
if (e.idleTriggerScope !== 'platform')
|
|
132
142
|
continue;
|
|
133
143
|
const lastActivity = lastActivityOf(s);
|
|
@@ -165,20 +175,23 @@ export class PlatformIdleScheduler {
|
|
|
165
175
|
this.running = false;
|
|
166
176
|
}
|
|
167
177
|
}
|
|
168
|
-
|
|
178
|
+
/** 排下一个 tick;afterTick 为真时至少隔一个阈值量级(见回调末尾) */
|
|
179
|
+
schedule(afterTick = false) {
|
|
169
180
|
if (this.stopped)
|
|
170
181
|
return;
|
|
171
182
|
if (this.timer) {
|
|
172
183
|
clearTimeout(this.timer);
|
|
173
184
|
this.timer = null;
|
|
174
185
|
}
|
|
175
|
-
|
|
186
|
+
// 开关与间隔取全局层,每次排时现读
|
|
187
|
+
const global = this.caps.settingsOf();
|
|
188
|
+
if (global.idleTriggerScope !== 'platform')
|
|
176
189
|
return;
|
|
177
|
-
if (
|
|
190
|
+
if (global.idleTriggerMinutes <= 0)
|
|
178
191
|
return;
|
|
179
|
-
const baseMs =
|
|
192
|
+
const baseMs = global.idleTriggerMinutes * 60_000;
|
|
180
193
|
let delay;
|
|
181
|
-
if (this.
|
|
194
|
+
if (this.strategy === 'fixed') {
|
|
182
195
|
delay = baseMs;
|
|
183
196
|
}
|
|
184
197
|
else {
|
|
@@ -186,10 +199,11 @@ export class PlatformIdleScheduler {
|
|
|
186
199
|
if (delay === 0)
|
|
187
200
|
delay = 1000;
|
|
188
201
|
}
|
|
189
|
-
if (
|
|
190
|
-
delay =
|
|
202
|
+
if (afterTick)
|
|
203
|
+
delay = Math.max(delay, baseMs, IDLE_RETRY_MIN_MS);
|
|
191
204
|
this.timer = setTimeout(async () => {
|
|
192
|
-
|
|
205
|
+
this.timer = null;
|
|
206
|
+
if (this.strategy === 'all-quiet') {
|
|
193
207
|
const remaining = this.timeUntilAllQuiet(baseMs);
|
|
194
208
|
if (remaining > 0) {
|
|
195
209
|
this.schedule();
|
|
@@ -198,8 +212,8 @@ export class PlatformIdleScheduler {
|
|
|
198
212
|
}
|
|
199
213
|
await this.runOnce();
|
|
200
214
|
// 每轮之后**无条件**退避一个阈值量级:无候选时静默达标条件在 tick 之后仍然成立,
|
|
201
|
-
// 照 delay===0→1s 重排就是 1 Hz
|
|
202
|
-
this.schedule(
|
|
215
|
+
// 照 delay===0→1s 重排就是 1 Hz 死转。发没发出去都一样等,语义是「每轮之间至少隔一个阈值量级」(按此刻的全局值)。
|
|
216
|
+
this.schedule(true);
|
|
203
217
|
}, delay);
|
|
204
218
|
}
|
|
205
219
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idle-scheduler.js","sourceRoot":"","sources":["../src/idle-scheduler.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,EAAE;AACF,yDAAyD;AACzD,iDAAiD;AACjD,
|
|
1
|
+
{"version":3,"file":"idle-scheduler.js","sourceRoot":"","sources":["../src/idle-scheduler.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { type TriggerService } from '@aalis/api-trigger';
|
|
2
|
-
import { type TriggerPolicyConfig } from './config.js';
|
|
3
2
|
declare const _default: import("@aalis/core").PluginDefinition<{
|
|
4
3
|
logger: import("@aalis/core").ServiceDescriptor<(identity: symbol) => import("@aalis/core").Logger, import("@aalis/core").Logger>;
|
|
5
4
|
events: import("@aalis/core").ServiceDescriptor<(identity: symbol) => import("@aalis/core").Events, import("@aalis/core").Events>;
|
|
@@ -7,17 +6,20 @@ declare const _default: import("@aalis/core").PluginDefinition<{
|
|
|
7
6
|
lifecycle: import("@aalis/core").ServiceDescriptor<(identity: symbol) => import("@aalis/core").LifecycleCap, import("@aalis/core").LifecycleCap>;
|
|
8
7
|
config: import("@aalis/core").ServiceDescriptor<(identity: symbol) => Readonly<Record<string, unknown>>, Readonly<Record<string, unknown>>>;
|
|
9
8
|
provide: import("@aalis/core").ServiceDescriptor<(identity: symbol) => import("@aalis/core").Provide, import("@aalis/core").Provide>;
|
|
10
|
-
gateway: import("@aalis/core").ServiceDescriptor<import("@aalis/api-gateway").GatewayService, import("@aalis/
|
|
9
|
+
gateway: import("@aalis/core").ServiceDescriptor<import("@aalis/api-gateway").GatewayService, import("@aalis/api-gateway").GatewayService>;
|
|
11
10
|
/**
|
|
12
11
|
* trigger 由本插件自己提供,只能声明成 optional:写 required 会把激活闸架在自己的产出上。
|
|
13
12
|
* 经它判断本插件是不是生效的触发插件(服务胜者)。
|
|
14
13
|
*/
|
|
15
|
-
trigger: import("@aalis/core").OptionalUse<TriggerService,
|
|
16
|
-
flowControl: import("@aalis/core").OptionalUse<import("@aalis/api-flow-control").FlowControlService, import("@aalis/
|
|
17
|
-
persona: import("@aalis/core").OptionalUse<import("@aalis/api-persona").PersonaService, import("@aalis/
|
|
18
|
-
|
|
19
|
-
|
|
14
|
+
trigger: import("@aalis/core").OptionalUse<TriggerService, TriggerService>;
|
|
15
|
+
flowControl: import("@aalis/core").OptionalUse<import("@aalis/api-flow-control").FlowControlService, import("@aalis/api-flow-control").FlowControlService>;
|
|
16
|
+
persona: import("@aalis/core").OptionalUse<import("@aalis/api-persona").PersonaService, import("@aalis/api-persona").PersonaService>;
|
|
17
|
+
messageArchive: import("@aalis/core").OptionalUse<import("@aalis/api-message-archive").MessageArchiveService, import("@aalis/api-message-archive").MessageArchiveService>;
|
|
18
|
+
sessionManager: import("@aalis/core").OptionalUse<import("@aalis/api-session-manager").SessionManagerService, import("@aalis/api-session-manager").SessionManagerService>;
|
|
19
|
+
/** 按会话读生效范围与参数;缺席时取插件配置里的值 */
|
|
20
|
+
sessionFields: import("@aalis/core").OptionalUse<import("@aalis/api-session-settings").SessionSettingsService, import("@aalis/api-session-settings").SessionFields>;
|
|
21
|
+
/** 按会话字段的全局层:宿主配置文档里本实例的那一段 */
|
|
22
|
+
document: import("@aalis/core").OptionalUse<import("@aalis/api-host-config").HostConfig, import("@aalis/api-host-config").OwnHostConfig>;
|
|
20
23
|
}>;
|
|
21
24
|
export default _default;
|
|
22
|
-
export type { TriggerPolicyConfig };
|
|
23
25
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAOL,KAAK,cAAc,EAEpB,MAAM,oBAAoB,CAAC;;;;;;;;;IA4B1B;;;OAGG;;;;;;IASH,8BAA8B;;IAE9B,+BAA+B;;;AAKjC,wBAQG"}
|
package/dist/index.js
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
import { flowControl } from '@aalis/api-flow-control';
|
|
2
|
-
import {
|
|
2
|
+
import { audienceIncludes, gateway, INBOUND_PHASE } from '@aalis/api-gateway';
|
|
3
3
|
import { hooks } from '@aalis/api-hooks';
|
|
4
|
+
import { ownHostConfig } from '@aalis/api-host-config';
|
|
4
5
|
import { messageArchive } from '@aalis/api-message-archive';
|
|
5
6
|
import { persona } from '@aalis/api-persona';
|
|
6
|
-
import { sessionManager } from '@aalis/api-session-manager';
|
|
7
|
+
import { fromElsewhere, sessionManager } from '@aalis/api-session-manager';
|
|
8
|
+
import { sessionFields } from '@aalis/api-session-settings';
|
|
7
9
|
import { archiveSwallowed, createBotNames, hitsMuteKeyword, isActiveTrigger, isAddressed, markTriggered, trigger, } from '@aalis/api-trigger';
|
|
8
10
|
import { config, definePlugin, events, lifecycle, logger, optional, provide } from '@aalis/core';
|
|
9
11
|
import { parseConfig } from '@aalis/schema-config';
|
|
10
|
-
import {
|
|
12
|
+
import { arrivalTag } from '@aalis/schema-message';
|
|
13
|
+
import { configSchema, normalizeSettings } from './config.js';
|
|
11
14
|
import { clearSessionIdle, PlatformIdleScheduler, scheduleSessionIdle } from './idle-scheduler.js';
|
|
12
15
|
import { applyScoreDecay, calculateScoreIncrement, createState, getCurrentThreshold, sweepStaleStates, } from './state.js';
|
|
16
|
+
import { t } from './texts.js';
|
|
13
17
|
// ----- 元数据 -----
|
|
14
18
|
// ----- 入口 -----
|
|
15
19
|
const uses = {
|
|
@@ -28,14 +32,18 @@ const uses = {
|
|
|
28
32
|
// 缺席时不设禁言:关键词照样吞掉本条,但不会写入禁言期
|
|
29
33
|
flowControl: optional(flowControl),
|
|
30
34
|
persona: optional(persona),
|
|
31
|
-
// 名字表按会话取人设:解析会话配置里的角色卡;缺席时取全局默认的卡
|
|
32
|
-
sessionManager: optional(sessionManager),
|
|
33
35
|
// 缺席时被吞掉的消息不进档,判定照常
|
|
34
36
|
messageArchive: optional(messageArchive),
|
|
37
|
+
// 判从别的平台往房间里插话(入口平台与房间的出生平台不同);缺席时判不出,按消息自身判
|
|
38
|
+
sessionManager: optional(sessionManager),
|
|
39
|
+
/** 按会话读生效范围与参数;缺席时取插件配置里的值 */
|
|
40
|
+
sessionFields: optional(sessionFields),
|
|
41
|
+
/** 按会话字段的全局层:宿主配置文档里本实例的那一段 */
|
|
42
|
+
document: optional(ownHostConfig),
|
|
35
43
|
};
|
|
36
44
|
export default definePlugin({
|
|
37
45
|
name: '@aalis/plugin-trigger-policy',
|
|
38
|
-
displayName: '
|
|
46
|
+
displayName: t('displayName'),
|
|
39
47
|
subsystem: 'scheduler',
|
|
40
48
|
configSchema,
|
|
41
49
|
provides: [trigger],
|
|
@@ -44,28 +52,32 @@ export default definePlugin({
|
|
|
44
52
|
});
|
|
45
53
|
function run(caps) {
|
|
46
54
|
const { logger, events, hooks, lifecycle, provide, flowControl, messageArchive } = caps;
|
|
47
|
-
const cfg =
|
|
55
|
+
const cfg = parseConfig(configSchema, caps.config.use, logger.use);
|
|
56
|
+
const fields = caps.sessionFields.use.fields(configSchema, caps);
|
|
57
|
+
/** 一个会话此刻的参数,每次现读(改了下一条消息起生效);不给会话时取全局层 */
|
|
58
|
+
const settingsOf = (sessionId, platform) => normalizeSettings(fields.get(sessionId, { platform }));
|
|
48
59
|
const states = new Map();
|
|
49
|
-
/**
|
|
50
|
-
const botNames = createBotNames(caps.persona,
|
|
51
|
-
// 本插件在 trigger
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
const
|
|
60
|
+
/** 名字表:别名与在用的人设按会话取的名字、昵称;人设读名字出错时只剩别名 */
|
|
61
|
+
const botNames = createBotNames(caps.persona, logger.use, '[trigger]');
|
|
62
|
+
// 本插件在 trigger 服务里的实例:服务选中的是它(条目 id 即本插件的实例 id)时本插件生效,否则对每条消息直接放行、
|
|
63
|
+
// 闲置也不开口
|
|
64
|
+
const self = { label: t('triggerLabel') };
|
|
65
|
+
const selfId = lifecycle.use.id;
|
|
66
|
+
provide.use(trigger, self, { label: self.label });
|
|
67
|
+
const isActive = () => caps.trigger.list().find(p => p.selected)?.id === selfId;
|
|
68
|
+
const idleCaps = { logger: logger.use, gateway: caps.gateway, flowControl, isActive, settingsOf };
|
|
69
|
+
const platformIdle = new PlatformIdleScheduler(idleCaps, cfg.idleTriggerStrategy, states);
|
|
57
70
|
/** 计数与活跃指数清零(禁言与判定放行时) */
|
|
58
71
|
function resetCounters(s) {
|
|
59
72
|
s.messageCount = 0;
|
|
60
73
|
s.activityScore = 0;
|
|
61
74
|
}
|
|
62
|
-
/** 按会话重排 session 档 idle(非 session
|
|
75
|
+
/** 按会话重排 session 档 idle(非 session 档时只清定时器);参数按会话现读 */
|
|
63
76
|
function rescheduleIdle(sessionId) {
|
|
64
77
|
const s = states.get(sessionId);
|
|
65
78
|
if (!s)
|
|
66
79
|
return;
|
|
67
|
-
|
|
68
|
-
scheduleSessionIdle(idleCaps, e, s, sessionId, () => rescheduleIdle(sessionId));
|
|
80
|
+
scheduleSessionIdle(idleCaps, s, sessionId, () => rescheduleIdle(sessionId));
|
|
69
81
|
}
|
|
70
82
|
/** 记一条真人入站的计数:评分衰减、计数、评分增量、用户交互。衰减按上一条消息的时间算,须在 recordActivity 之前调用 */
|
|
71
83
|
function recordIncoming(s, e, userId) {
|
|
@@ -77,7 +89,7 @@ function run(caps) {
|
|
|
77
89
|
}
|
|
78
90
|
/**
|
|
79
91
|
* 记一次真人活动:最近消息时间、闲置退避复位为 1,并从现在起重排 session 档 idle。
|
|
80
|
-
*
|
|
92
|
+
* 生效范围内的真人消息都算,禁言期内与命中禁言关键词的也算(它们只是不计数)
|
|
81
93
|
*/
|
|
82
94
|
function recordActivity(sessionId, s) {
|
|
83
95
|
s.lastMessageTime = Date.now();
|
|
@@ -107,35 +119,36 @@ function run(caps) {
|
|
|
107
119
|
const reason = `计数=${s.messageCount}/${e.fixedInterval} 指数=${s.activityScore.toFixed(3)} (阈值=${threshold.toFixed(3)})`;
|
|
108
120
|
return { speak, reason };
|
|
109
121
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
122
|
+
// 启动日志写全局层;按会话设的另在各层
|
|
123
|
+
const global = settingsOf();
|
|
124
|
+
logger.use.info(`[trigger] 已启用 (生效范围=${global.audience}, 模式=${global.intervalMode}, 固定间隔=${global.fixedInterval}, ` +
|
|
125
|
+
`阈值=${global.activityScoreLower}~${global.activityScoreUpper}, @提及=${global.triggerOnAt}, ` +
|
|
126
|
+
`别名=${global.triggerNames.length}, mute关键词=${global.muteKeywords.length}, mute时长=${global.muteTimeSeconds}s, ` +
|
|
127
|
+
`idle=${global.idleTriggerScope}/${cfg.idleTriggerStrategy})`);
|
|
115
128
|
// ===== inbound:trigger 相位:要不要开口 =====
|
|
116
129
|
// 由 plugin-gateway 在 inbound:command 之后、inbound:flow 之前触发。放行的消息写好 triggerType,
|
|
117
130
|
// 交给 flow 相位做节流硬闸(immediate 穿透冷却与限速)。判定是同步的:记入站、判定、清零在同一拍做完,
|
|
118
131
|
// 同一会话接连到达的消息按到达顺序逐条判定,放行顺序即到达顺序。
|
|
119
|
-
hooks.middleware(INBOUND_PHASE.TRIGGER, async (data, next) => {
|
|
132
|
+
hooks.use.middleware(INBOUND_PHASE.TRIGGER, async (data, next) => {
|
|
120
133
|
// 不是生效的触发插件:什么都不做(不计数、不识别、不归档),交给生效者或往下走
|
|
121
|
-
if (!isActiveTrigger(data, caps.trigger,
|
|
134
|
+
if (!isActiveTrigger(data, caps.trigger, selfId))
|
|
122
135
|
return next();
|
|
123
|
-
const { message } = data;
|
|
124
|
-
// 内部注入(闲置触发、定时任务、workflow
|
|
125
|
-
// 真人消息由平台适配器投递,不设 source
|
|
126
|
-
if (message.
|
|
127
|
-
return next();
|
|
128
|
-
// 不在触发策略作用域内(默认 *:group):直接放行。
|
|
129
|
-
// 必须在 mute 检查之前进行,否则 QQ 群的 mute 关键词会泄漏到 WebUI/私聊等不在 scope 内的会话。
|
|
130
|
-
const tid = extractTargetId(message);
|
|
131
|
-
if (!isScopeEnabled(cfg, message.platform, message.sessionType, tid))
|
|
136
|
+
const { message, chat } = data;
|
|
137
|
+
// 内部注入(闲置触发、定时任务、workflow)都带 source(网关不给聊天窗口),跳过策略:不计数、不改 triggerType。
|
|
138
|
+
// 真人消息由平台适配器投递,不设 source。从别的平台往房间里插话(owner 从 WebUI 往群里发)同样直接放行
|
|
139
|
+
if (!chat || fromElsewhere(message, caps.sessionManager))
|
|
132
140
|
return next();
|
|
133
141
|
const sessionId = message.sessionId;
|
|
134
|
-
const
|
|
135
|
-
//
|
|
142
|
+
const e = settingsOf(sessionId, message.platform);
|
|
143
|
+
// 不在生效范围内(默认只管多方房间):直接放行。
|
|
144
|
+
// 必须在 mute 检查之前进行,否则群里的 mute 关键词会泄漏到私聊等不在范围内的会话。
|
|
145
|
+
if (!audienceIncludes(e.audience, chat.multiParty))
|
|
146
|
+
return next();
|
|
147
|
+
const flow = flowControl.present ? flowControl.use : undefined;
|
|
148
|
+
// 范围内的真人消息都是会话活动,禁言期内的也是:会话还没有状态(如平台禁言先于任何消息)就在这里建
|
|
136
149
|
let s = states.get(sessionId);
|
|
137
150
|
if (!s) {
|
|
138
|
-
s = createState(message.platform
|
|
151
|
+
s = createState(message.platform);
|
|
139
152
|
states.set(sessionId, s);
|
|
140
153
|
}
|
|
141
154
|
// 禁言期:不累计计数,已攒的计数与评分清零(平台禁言只能在这里清:禁言期来消息时);
|
|
@@ -145,24 +158,23 @@ function run(caps) {
|
|
|
145
158
|
recordActivity(sessionId, s);
|
|
146
159
|
return next();
|
|
147
160
|
}
|
|
148
|
-
const e = resolveEffectiveConfig(cfg, message.platform, message.sessionType, tid);
|
|
149
161
|
// 禁言关键词:设置自禁言、计数与评分当场清零,记为真人活动,吞掉本条
|
|
150
162
|
if (hitsMuteKeyword(message, e.muteKeywords)) {
|
|
151
|
-
logger.info(`[trigger] mute 关键词命中 → swallow + setMuted(${e.muteTimeSeconds}s): ${sessionId}`);
|
|
163
|
+
logger.use.info(`[trigger] mute 关键词命中 → swallow + setMuted(${e.muteTimeSeconds}s): ${sessionId}`);
|
|
152
164
|
flow?.setMuted(sessionId, e.muteTimeSeconds, message.platform);
|
|
153
165
|
resetCounters(s);
|
|
154
166
|
recordActivity(sessionId, s);
|
|
155
|
-
await archiveSwallowed(message, messageArchive, logger, '[trigger]');
|
|
167
|
+
await archiveSwallowed(message, messageArchive, logger.use, '[trigger]');
|
|
156
168
|
return; // swallow
|
|
157
169
|
}
|
|
158
170
|
recordIncoming(s, e, message.userId);
|
|
159
171
|
recordActivity(sessionId, s);
|
|
160
172
|
const addressed = isAddressed(message, botNames(e.triggerNames, message), e);
|
|
161
173
|
const decision = decide(s, e, addressed);
|
|
162
|
-
//
|
|
163
|
-
logger.debug(`[trigger]
|
|
174
|
+
// 判定日志:不含消息正文,带到达序号
|
|
175
|
+
logger.use.debug(`[trigger] 判定${arrivalTag(message)} | session=${sessionId} | speak=${decision.speak} | addressed=${addressed} | reason=${decision.reason}`);
|
|
164
176
|
if (!decision.speak) {
|
|
165
|
-
await archiveSwallowed(message, messageArchive, logger, '[trigger]');
|
|
177
|
+
await archiveSwallowed(message, messageArchive, logger.use, '[trigger]');
|
|
166
178
|
return; // swallow
|
|
167
179
|
}
|
|
168
180
|
// 判定放行即复位:之后若被 flow 相位的冷却/限速吞掉,这次触发作废
|
|
@@ -173,7 +185,7 @@ function run(caps) {
|
|
|
173
185
|
});
|
|
174
186
|
// agent 真实回复:记为 bot 开口并重排 session 档 idle。不复位退避——bot 回复闲置提示不算真人活动。
|
|
175
187
|
// 不生效时不记(闲置也不开口)
|
|
176
|
-
events.on('outbound:message', (msg) => {
|
|
188
|
+
events.use.on('outbound:message', (msg) => {
|
|
177
189
|
if (msg.source !== 'agent' || !msg.sessionId || !isActive())
|
|
178
190
|
return;
|
|
179
191
|
const s = states.get(msg.sessionId);
|
|
@@ -182,20 +194,21 @@ function run(caps) {
|
|
|
182
194
|
s.lastBotActivityAt = Date.now();
|
|
183
195
|
rescheduleIdle(msg.sessionId);
|
|
184
196
|
});
|
|
185
|
-
// 平台级 idle
|
|
186
|
-
events.on('app:ready', () => {
|
|
197
|
+
// 平台级 idle 启动;全局层改了(宿主文档变化)时原来关着的随即按新值排
|
|
198
|
+
events.use.on('app:ready', () => {
|
|
187
199
|
platformIdle.start();
|
|
188
200
|
});
|
|
201
|
+
events.use.on('host-config:changed', () => platformIdle.wake());
|
|
189
202
|
// 长寿进程下避免 states 无限增长:每天扫描一次,清理 30 天无活动且无 idle 定时器的会话
|
|
190
203
|
const SWEEP_INTERVAL_MS = 24 * 60 * 60 * 1000;
|
|
191
204
|
const sweepTimer = setInterval(() => {
|
|
192
205
|
const cleaned = sweepStaleStates(states, Date.now());
|
|
193
206
|
if (cleaned > 0)
|
|
194
|
-
logger.debug(`[trigger] TTL 清理已淘汰 ${cleaned} 个长期非活跃会话状态`);
|
|
207
|
+
logger.use.debug(`[trigger] TTL 清理已淘汰 ${cleaned} 个长期非活跃会话状态`);
|
|
195
208
|
}, SWEEP_INTERVAL_MS);
|
|
196
209
|
if (typeof sweepTimer.unref === 'function')
|
|
197
210
|
sweepTimer.unref();
|
|
198
|
-
lifecycle.onDispose(() => {
|
|
211
|
+
lifecycle.use.onDispose(() => {
|
|
199
212
|
clearInterval(sweepTimer);
|
|
200
213
|
platformIdle.stop();
|
|
201
214
|
for (const s of states.values())
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|