@zhin.js/plugin-content-moderation 1.1.25 → 1.1.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +7 -2
- package/lib/bypass.d.ts +6 -2
- package/lib/bypass.d.ts.map +1 -1
- package/lib/bypass.js +4 -8
- package/lib/bypass.js.map +1 -1
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +9 -4
- package/lib/config.js.map +1 -1
- package/lib/types.d.ts +7 -2
- package/lib/types.d.ts.map +1 -1
- package/lib/types.js.map +1 -1
- package/middlewares/inbound/index.js +4 -16
- package/middlewares/inbound/index.ts +4 -20
- package/package.json +16 -19
- package/schema.json +64 -17
- package/src/bypass.ts +8 -9
- package/src/config.ts +9 -4
- package/src/types.ts +7 -2
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 凉菜
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -22,10 +22,11 @@ content-moderation:
|
|
|
22
22
|
maskChar: "*"
|
|
23
23
|
# 省略 replyTemplate 时跟随本次消息语言;填写后原样使用,不自动翻译。
|
|
24
24
|
# replyTemplate: "消息含不当内容,已拦截。"
|
|
25
|
-
masters: [] # 额外 master userId(兜底)
|
|
26
25
|
inbound:
|
|
27
26
|
enabled: true
|
|
28
|
-
|
|
27
|
+
# 满足任一 permit 的发送者跳过入站审查(ADR 0056 §5,与命令 / 工具同一评估器)。
|
|
28
|
+
# 内容审核是平台功能:默认 zhin owner 或平台群主 / 管理员;[] 表示都审。
|
|
29
|
+
bypass: [owner, "platform:admin"]
|
|
29
30
|
whitelist:
|
|
30
31
|
userIds: []
|
|
31
32
|
conversationIds: []
|
|
@@ -63,6 +64,10 @@ content-moderation:
|
|
|
63
64
|
|
|
64
65
|
|
|
65
66
|
|
|
67
|
+
## 分层配置(ADR 0050 / 0055)
|
|
68
|
+
|
|
69
|
+
审查引擎每代配置一次,所有字段(审查源、动作、词库、群管理范围等)只能在全局层修改;启停开关支持适配器、账号与会话四级,停用后该会话的入站 / 出站审查中间件都不运行。注意:开启群内自助后,群 `admin` 也能用 `功能 关闭 content-moderation` 关闭本群审查;需要强制审查的部署不要开启群内自助,或在 Console 收紧角色。
|
|
70
|
+
|
|
66
71
|
## 可选的自动群管理
|
|
67
72
|
|
|
68
73
|
默认关闭。`groupModeration` 逐项绑定适配器、endpoint 实例名、实际登录账号和群号;四项必须同时匹配,不能仅凭群号跨账号执行。
|
package/lib/bypass.d.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
+
import { type PermissionSubject } from '@zhin.js/permission';
|
|
1
2
|
import type { ModerationConfig } from './types.js';
|
|
2
3
|
export interface BypassInput {
|
|
3
4
|
readonly sender?: string;
|
|
4
5
|
readonly conversationId: string;
|
|
5
|
-
/**
|
|
6
|
-
|
|
6
|
+
/**
|
|
7
|
+
* The message projected for the shared permit evaluator (`toPermissionSubject(message)`): zhin
|
|
8
|
+
* chat role (`sender.chatRole`) and platform standing (`sender.platform`), ADR 0056 §5.
|
|
9
|
+
*/
|
|
10
|
+
readonly subject?: PermissionSubject;
|
|
7
11
|
}
|
|
8
12
|
export declare function shouldBypassInbound(config: ModerationConfig, input: BypassInput): boolean;
|
|
9
13
|
export declare function shouldBypassOutbound(config: ModerationConfig): boolean;
|
package/lib/bypass.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bypass.d.ts","sourceRoot":"","sources":["../src/bypass.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC
|
|
1
|
+
{"version":3,"file":"bypass.d.ts","sourceRoot":"","sources":["../src/bypass.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC;CACtC;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,WAAW,GACjB,OAAO,CAeT;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAGtE"}
|
package/lib/bypass.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { checkBuiltinPermit } from '@zhin.js/permission';
|
|
1
2
|
export function shouldBypassInbound(config, input) {
|
|
2
3
|
if (!config.enabled || !config.inbound.enabled)
|
|
3
4
|
return true;
|
|
@@ -5,14 +6,9 @@ export function shouldBypassInbound(config, input) {
|
|
|
5
6
|
if (sender) {
|
|
6
7
|
if (config.inbound.whitelist.userIds.includes(sender))
|
|
7
8
|
return true;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
...(input.endpointMasters ?? []),
|
|
12
|
-
].map(String));
|
|
13
|
-
if (masters.has(sender))
|
|
14
|
-
return true;
|
|
15
|
-
}
|
|
9
|
+
const subject = input.subject;
|
|
10
|
+
if (subject && config.inbound.bypass.some(permit => checkBuiltinPermit(permit, subject)))
|
|
11
|
+
return true;
|
|
16
12
|
}
|
|
17
13
|
if (config.inbound.whitelist.conversationIds.includes(input.conversationId)) {
|
|
18
14
|
return true;
|
package/lib/bypass.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bypass.js","sourceRoot":"","sources":["../src/bypass.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bypass.js","sourceRoot":"","sources":["../src/bypass.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAA0B,MAAM,qBAAqB,CAAC;AAajF,MAAM,UAAU,mBAAmB,CACjC,MAAwB,EACxB,KAAkB;IAElB,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE5D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;IACpC,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QACnE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,IAAI,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;IACxG,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;QAC5E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAwB;IAC3D,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC7D,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC;AACzC,CAAC"}
|
package/lib/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,MAAM,EAGX,KAAK,gBAAgB,EAErB,KAAK,QAAQ,EAEd,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC,CAMxE,CAAC;AAEH,eAAO,MAAM,yBAAyB,EAAE,gBAmBtC,CAAC;AAQH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,CA8CtE"}
|
package/lib/config.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isBuiltinPermit } from '@zhin.js/permission';
|
|
1
2
|
import { isAction, } from './types.js';
|
|
2
3
|
export const DEFAULT_ACTIONS = Object.freeze({
|
|
3
4
|
pass: Object.freeze(['allow']),
|
|
@@ -11,10 +12,9 @@ export const DEFAULT_MODERATION_CONFIG = Object.freeze({
|
|
|
11
12
|
enabled: true,
|
|
12
13
|
onError: 'open',
|
|
13
14
|
maskChar: '*',
|
|
14
|
-
masters: Object.freeze([]),
|
|
15
15
|
inbound: Object.freeze({
|
|
16
16
|
enabled: true,
|
|
17
|
-
|
|
17
|
+
bypass: Object.freeze(['owner', 'platform:admin']),
|
|
18
18
|
whitelist: Object.freeze({
|
|
19
19
|
userIds: Object.freeze([]),
|
|
20
20
|
conversationIds: Object.freeze([]),
|
|
@@ -27,6 +27,12 @@ export const DEFAULT_MODERATION_CONFIG = Object.freeze({
|
|
|
27
27
|
actions: DEFAULT_ACTIONS,
|
|
28
28
|
sources: Object.freeze([]),
|
|
29
29
|
});
|
|
30
|
+
/** Built-in permit expressions only; removed / unknown spellings are dropped (logged by the schema on load). */
|
|
31
|
+
function parseBypass(value) {
|
|
32
|
+
if (!Array.isArray(value))
|
|
33
|
+
return DEFAULT_MODERATION_CONFIG.inbound.bypass;
|
|
34
|
+
return Object.freeze([...new Set(value.filter((item) => typeof item === 'string' && isBuiltinPermit(item.trim())).map(item => item.trim()))]);
|
|
35
|
+
}
|
|
30
36
|
export function resolveModerationConfig(raw) {
|
|
31
37
|
const input = raw && typeof raw === 'object' ? raw : {};
|
|
32
38
|
const inboundRaw = asRecord(input.inbound);
|
|
@@ -51,10 +57,9 @@ export function resolveModerationConfig(raw) {
|
|
|
51
57
|
onError,
|
|
52
58
|
maskChar,
|
|
53
59
|
...(replyTemplate === undefined ? {} : { replyTemplate }),
|
|
54
|
-
masters: freezeStrings(input.masters),
|
|
55
60
|
inbound: Object.freeze({
|
|
56
61
|
enabled: inboundRaw.enabled !== false,
|
|
57
|
-
|
|
62
|
+
bypass: parseBypass(inboundRaw.bypass),
|
|
58
63
|
whitelist: Object.freeze({
|
|
59
64
|
userIds: freezeStrings(whitelistRaw.userIds),
|
|
60
65
|
conversationIds: freezeStrings(whitelistRaw.conversationIds),
|
package/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,GAQT,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,MAAM,eAAe,GAAkD,MAAM,CAAC,MAAM,CAAC;IAC1F,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAU,CAAC;IACvC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAU,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAU,CAAC;IAC1C,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAU,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAU,CAAC;CACrD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,yBAAyB,GAAqB,MAAM,CAAC,MAAM,CAAC;IACvE,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;IAClC,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,MAAM;IACf,QAAQ,EAAE,GAAG;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/lib/types.d.ts
CHANGED
|
@@ -85,10 +85,15 @@ export interface ModerationConfig {
|
|
|
85
85
|
readonly maskChar: string;
|
|
86
86
|
/** Omitted templates use the inbound operation's language. Explicit text is never translated. */
|
|
87
87
|
readonly replyTemplate?: string;
|
|
88
|
-
readonly masters: readonly string[];
|
|
89
88
|
readonly inbound: {
|
|
90
89
|
readonly enabled: boolean;
|
|
91
|
-
|
|
90
|
+
/** Lowest chat role (ADR 0056) whose senders skip inbound review; `none` reviews everyone. */
|
|
91
|
+
/**
|
|
92
|
+
* Permit expressions (ADR 0056 §5 built-in DSL); a sender matching **any** of them skips inbound
|
|
93
|
+
* review. Content moderation is a platform function, so the default is `owner` (zhin owner) or
|
|
94
|
+
* `platform:admin` (group owner / admin). `[]` reviews everyone.
|
|
95
|
+
*/
|
|
96
|
+
readonly bypass: readonly string[];
|
|
92
97
|
readonly whitelist: {
|
|
93
98
|
readonly userIds: readonly string[];
|
|
94
99
|
readonly conversationIds: readonly string[];
|
package/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/lib/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAkIA,MAAM,CAAC,MAAM,aAAa,GAAuC,MAAM,CAAC,MAAM,CAAC;IAC7E,IAAI,EAAE,CAAC;IACP,GAAG,EAAE,CAAC;IACN,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,CAAC;IACP,QAAQ,EAAE,CAAC;CACZ,CAAC,CAAC;AAEH,MAAM,UAAU,WAAW,CAAC,CAAW,EAAE,CAAW;IAClD,OAAO,aAAa,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,KAAK,KAAK,MAAM;WAClB,KAAK,KAAK,KAAK;WACf,KAAK,KAAK,QAAQ;WAClB,KAAK,KAAK,MAAM;WAChB,KAAK,KAAK,UAAU,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,KAAK,KAAK,OAAO;WACnB,KAAK,KAAK,KAAK;WACf,KAAK,KAAK,OAAO;WACjB,KAAK,KAAK,QAAQ;WAClB,KAAK,KAAK,MAAM;WAChB,KAAK,KAAK,QAAQ,CAAC;AAC1B,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// Generated by build-plugin-runtime-entries.mjs. Do not edit.
|
|
2
|
+
import { toPermissionSubject } from '@zhin.js/permission';
|
|
2
3
|
import { defineMiddleware } from 'zhin.js/middleware';
|
|
3
4
|
import { aiCompletionToken, createDeliveryTarget, databaseHostToken, getLogger, hasResource, outboundHostToken, usageSubjectFromMessage } from 'zhin.js';
|
|
4
5
|
import { adapterFeatureId } from 'zhin.js/adapter';
|
|
@@ -26,11 +27,10 @@ export default defineMiddleware({
|
|
|
26
27
|
const locale = resolveLocale(message.locale);
|
|
27
28
|
const sender = message.sender?.id;
|
|
28
29
|
const conversationId = message.conversation.id;
|
|
29
|
-
const endpointMasters = resolveEndpointMasters(message, config);
|
|
30
30
|
const bypass = shouldBypassInbound(config, {
|
|
31
31
|
sender,
|
|
32
32
|
conversationId,
|
|
33
|
-
|
|
33
|
+
subject: toPermissionSubject(message),
|
|
34
34
|
});
|
|
35
35
|
const review = await enqueueGroupModeration(context, config, bypass);
|
|
36
36
|
if (bypass) {
|
|
@@ -193,7 +193,8 @@ async function enqueueGroupModeration(context, config, bypass) {
|
|
|
193
193
|
conversation, memberId: message.sender.id, trigger: hit.category, newcomer: hit.newcomer,
|
|
194
194
|
sentAt: Number(message.metadata?.platformSentAt), evidence: hit.evidence,
|
|
195
195
|
...(message.sender?.name ? { memberName: message.sender.name } : {}),
|
|
196
|
-
...(message.sender?.
|
|
196
|
+
...(message.sender?.chatRole ? { memberChatRole: message.sender.chatRole } : {}),
|
|
197
|
+
...(message.sender?.platform ? { memberPlatform: message.sender.platform } : {}),
|
|
197
198
|
...(messageId ? { messageId } : {}),
|
|
198
199
|
...(hit.recall ? { recall: hit.recall } : {}),
|
|
199
200
|
});
|
|
@@ -228,16 +229,3 @@ async function enqueueGroupModeration(context, config, bypass) {
|
|
|
228
229
|
logger.warn('Automatic group moderation unavailable', error instanceof Error ? error.message : String(error));
|
|
229
230
|
}
|
|
230
231
|
}
|
|
231
|
-
/**
|
|
232
|
-
* Masters from plugin config + optional metadata.endpointMaster / metadata.master.
|
|
233
|
-
*/
|
|
234
|
-
function resolveEndpointMasters(message, config) {
|
|
235
|
-
const out = [...config.masters];
|
|
236
|
-
const meta = message.metadata ?? {};
|
|
237
|
-
for (const key of ['master', 'endpointMaster', 'owner']) {
|
|
238
|
-
const value = meta[key];
|
|
239
|
-
if (typeof value === 'string' && value.trim())
|
|
240
|
-
out.push(value.trim());
|
|
241
|
-
}
|
|
242
|
-
return Object.freeze(out);
|
|
243
|
-
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { toPermissionSubject } from '@zhin.js/permission';
|
|
1
2
|
import { defineMiddleware, type MiddlewareContext } from 'zhin.js/middleware';
|
|
2
3
|
import type { Message } from '@zhin.js/core/runtime';
|
|
3
4
|
import { aiCompletionToken, createDeliveryTarget, databaseHostToken, getLogger, hasResource,
|
|
@@ -35,12 +36,10 @@ export default defineMiddleware<Message, ModerationConfig>({
|
|
|
35
36
|
const locale = resolveLocale(message.locale);
|
|
36
37
|
const sender = message.sender?.id;
|
|
37
38
|
const conversationId = message.conversation.id;
|
|
38
|
-
const endpointMasters = resolveEndpointMasters(message, config);
|
|
39
|
-
|
|
40
39
|
const bypass = shouldBypassInbound(config, {
|
|
41
40
|
sender,
|
|
42
41
|
conversationId,
|
|
43
|
-
|
|
42
|
+
subject: toPermissionSubject(message),
|
|
44
43
|
});
|
|
45
44
|
const review = await enqueueGroupModeration(context, config, bypass);
|
|
46
45
|
if (bypass) {
|
|
@@ -196,7 +195,8 @@ async function enqueueGroupModeration(
|
|
|
196
195
|
conversation, memberId: message.sender!.id, trigger: hit.category, newcomer: hit.newcomer,
|
|
197
196
|
sentAt: Number(message.metadata?.platformSentAt), evidence: hit.evidence,
|
|
198
197
|
...(message.sender?.name ? { memberName: message.sender.name } : {}),
|
|
199
|
-
...(message.sender?.
|
|
198
|
+
...(message.sender?.chatRole ? { memberChatRole: message.sender.chatRole } : {}),
|
|
199
|
+
...(message.sender?.platform ? { memberPlatform: message.sender.platform } : {}),
|
|
200
200
|
...(messageId ? { messageId } : {}),
|
|
201
201
|
...(hit.recall ? { recall: hit.recall } : {}),
|
|
202
202
|
});
|
|
@@ -226,19 +226,3 @@ async function enqueueGroupModeration(
|
|
|
226
226
|
logger.warn('Automatic group moderation unavailable', error instanceof Error ? error.message : String(error));
|
|
227
227
|
}
|
|
228
228
|
}
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* Masters from plugin config + optional metadata.endpointMaster / metadata.master.
|
|
232
|
-
*/
|
|
233
|
-
function resolveEndpointMasters(
|
|
234
|
-
message: Message,
|
|
235
|
-
config: ModerationConfig,
|
|
236
|
-
): readonly string[] {
|
|
237
|
-
const out: string[] = [...config.masters];
|
|
238
|
-
const meta = message.metadata ?? {};
|
|
239
|
-
for (const key of ['master', 'endpointMaster', 'owner'] as const) {
|
|
240
|
-
const value = meta[key];
|
|
241
|
-
if (typeof value === 'string' && value.trim()) out.push(value.trim());
|
|
242
|
-
}
|
|
243
|
-
return Object.freeze(out);
|
|
244
|
-
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhin.js/plugin-content-moderation",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.27",
|
|
4
4
|
"description": "Content moderation plugin for Zhin.js — inbound/outbound multi-source scanning (Plugin Runtime)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -39,18 +39,19 @@
|
|
|
39
39
|
},
|
|
40
40
|
"license": "MIT",
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"
|
|
43
|
-
"@zhin.js/
|
|
44
|
-
"@zhin.js/
|
|
45
|
-
"@zhin.js/
|
|
46
|
-
"@zhin.js/
|
|
47
|
-
"@zhin.js/
|
|
42
|
+
"zod": "^4.6.7",
|
|
43
|
+
"@zhin.js/console-contract": "1.1.6",
|
|
44
|
+
"@zhin.js/core": "1.6.0",
|
|
45
|
+
"@zhin.js/logger": "1.1.3",
|
|
46
|
+
"@zhin.js/page": "1.1.18",
|
|
47
|
+
"@zhin.js/permission": "1.2.0",
|
|
48
|
+
"@zhin.js/skill": "1.1.17",
|
|
49
|
+
"@zhin.js/tool": "1.1.19"
|
|
48
50
|
},
|
|
49
51
|
"devDependencies": {
|
|
50
52
|
"typescript": "^6.0.3",
|
|
51
53
|
"vitest": "^4.1.10",
|
|
52
|
-
"
|
|
53
|
-
"zhin.js": "1.1.25"
|
|
54
|
+
"zhin.js": "1.1.27"
|
|
54
55
|
},
|
|
55
56
|
"repository": {
|
|
56
57
|
"type": "git",
|
|
@@ -91,12 +92,11 @@
|
|
|
91
92
|
"plugins": []
|
|
92
93
|
},
|
|
93
94
|
"peerDependencies": {
|
|
94
|
-
"
|
|
95
|
-
"@zhin.js/
|
|
96
|
-
"@zhin.js/
|
|
97
|
-
"@zhin.js/
|
|
98
|
-
"
|
|
99
|
-
"zhin.js": "^1.1.25"
|
|
95
|
+
"@zhin.js/middleware": "^1.1.17",
|
|
96
|
+
"@zhin.js/page": "^1.1.18",
|
|
97
|
+
"@zhin.js/skill": "^1.1.17",
|
|
98
|
+
"@zhin.js/tool": "^1.1.19",
|
|
99
|
+
"zhin.js": "^1.1.27"
|
|
100
100
|
},
|
|
101
101
|
"peerDependenciesMeta": {
|
|
102
102
|
"@zhin.js/middleware": {
|
|
@@ -110,14 +110,11 @@
|
|
|
110
110
|
},
|
|
111
111
|
"@zhin.js/tool": {
|
|
112
112
|
"optional": true
|
|
113
|
-
},
|
|
114
|
-
"zod": {
|
|
115
|
-
"optional": true
|
|
116
113
|
}
|
|
117
114
|
},
|
|
118
115
|
"scripts": {
|
|
119
116
|
"build": "tsc",
|
|
120
117
|
"clean": "rimraf lib",
|
|
121
|
-
"test": "
|
|
118
|
+
"test": "vitest run --root ../../.. plugins/utils/content-moderation/tests"
|
|
122
119
|
}
|
|
123
120
|
}
|
package/schema.json
CHANGED
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"type": "object",
|
|
4
4
|
"additionalProperties": false,
|
|
5
|
+
"x-zhin-config": {
|
|
6
|
+
"levels": [
|
|
7
|
+
"global",
|
|
8
|
+
"adapter",
|
|
9
|
+
"endpoint",
|
|
10
|
+
"conversation"
|
|
11
|
+
]
|
|
12
|
+
},
|
|
5
13
|
"properties": {
|
|
6
14
|
"groupModeration": {
|
|
7
15
|
"type": "array",
|
|
@@ -39,6 +47,11 @@
|
|
|
39
47
|
"en": {
|
|
40
48
|
"description": "Exact scope for automatic advertising/abuse moderation. Disabled when unconfigured. Requires AI, atomic persistent state and adapter group-management support."
|
|
41
49
|
}
|
|
50
|
+
},
|
|
51
|
+
"x-zhin-config": {
|
|
52
|
+
"levels": [
|
|
53
|
+
"global"
|
|
54
|
+
]
|
|
42
55
|
}
|
|
43
56
|
},
|
|
44
57
|
"enabled": {
|
|
@@ -49,6 +62,11 @@
|
|
|
49
62
|
"en": {
|
|
50
63
|
"description": "Enable moderation."
|
|
51
64
|
}
|
|
65
|
+
},
|
|
66
|
+
"x-zhin-config": {
|
|
67
|
+
"levels": [
|
|
68
|
+
"global"
|
|
69
|
+
]
|
|
52
70
|
}
|
|
53
71
|
},
|
|
54
72
|
"onError": {
|
|
@@ -63,6 +81,11 @@
|
|
|
63
81
|
"en": {
|
|
64
82
|
"description": "Default policy when a review source fails: open treats it as passed; closed treats it as critical."
|
|
65
83
|
}
|
|
84
|
+
},
|
|
85
|
+
"x-zhin-config": {
|
|
86
|
+
"levels": [
|
|
87
|
+
"global"
|
|
88
|
+
]
|
|
66
89
|
}
|
|
67
90
|
},
|
|
68
91
|
"maskChar": {
|
|
@@ -75,6 +98,11 @@
|
|
|
75
98
|
"en": {
|
|
76
99
|
"description": "Text masking character."
|
|
77
100
|
}
|
|
101
|
+
},
|
|
102
|
+
"x-zhin-config": {
|
|
103
|
+
"levels": [
|
|
104
|
+
"global"
|
|
105
|
+
]
|
|
78
106
|
}
|
|
79
107
|
},
|
|
80
108
|
"replyTemplate": {
|
|
@@ -84,19 +112,11 @@
|
|
|
84
112
|
"en": {
|
|
85
113
|
"description": "Reply text for the reply action. When omitted, use the message language; explicit text is preserved."
|
|
86
114
|
}
|
|
87
|
-
}
|
|
88
|
-
},
|
|
89
|
-
"masters": {
|
|
90
|
-
"type": "array",
|
|
91
|
-
"items": {
|
|
92
|
-
"type": "string"
|
|
93
115
|
},
|
|
94
|
-
"
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
"description": "Additional user IDs treated as masters, merged with endpoint masters as a fallback."
|
|
99
|
-
}
|
|
116
|
+
"x-zhin-config": {
|
|
117
|
+
"levels": [
|
|
118
|
+
"global"
|
|
119
|
+
]
|
|
100
120
|
}
|
|
101
121
|
},
|
|
102
122
|
"inbound": {
|
|
@@ -107,13 +127,20 @@
|
|
|
107
127
|
"type": "boolean",
|
|
108
128
|
"default": true
|
|
109
129
|
},
|
|
110
|
-
"
|
|
111
|
-
"type": "
|
|
112
|
-
"
|
|
113
|
-
|
|
130
|
+
"bypass": {
|
|
131
|
+
"type": "array",
|
|
132
|
+
"items": {
|
|
133
|
+
"type": "string",
|
|
134
|
+
"minLength": 1
|
|
135
|
+
},
|
|
136
|
+
"default": [
|
|
137
|
+
"owner",
|
|
138
|
+
"platform:admin"
|
|
139
|
+
],
|
|
140
|
+
"description": "满足任一 permit 表达式的发送者跳过入站审查(ADR 0056 §5 内置 DSL,与命令 / 工具同一评估器)。内容审核是平台功能,默认 zhin owner 或平台群主 / 管理员(platform:admin);[] 表示都审",
|
|
114
141
|
"x-i18n": {
|
|
115
142
|
"en": {
|
|
116
|
-
"description": "
|
|
143
|
+
"description": "Senders matching any of these permit expressions skip inbound review (ADR 0056 §5 built-in DSL, the same evaluator as commands and tools). Moderation is a platform function: the default exempts the zhin owner and platform group owners / admins (platform:admin); [] reviews everyone."
|
|
117
144
|
}
|
|
118
145
|
}
|
|
119
146
|
},
|
|
@@ -137,6 +164,11 @@
|
|
|
137
164
|
}
|
|
138
165
|
}
|
|
139
166
|
}
|
|
167
|
+
},
|
|
168
|
+
"x-zhin-config": {
|
|
169
|
+
"levels": [
|
|
170
|
+
"global"
|
|
171
|
+
]
|
|
140
172
|
}
|
|
141
173
|
},
|
|
142
174
|
"outbound": {
|
|
@@ -157,6 +189,11 @@
|
|
|
157
189
|
}
|
|
158
190
|
}
|
|
159
191
|
}
|
|
192
|
+
},
|
|
193
|
+
"x-zhin-config": {
|
|
194
|
+
"levels": [
|
|
195
|
+
"global"
|
|
196
|
+
]
|
|
160
197
|
}
|
|
161
198
|
},
|
|
162
199
|
"actions": {
|
|
@@ -319,6 +356,11 @@
|
|
|
319
356
|
"en": {
|
|
320
357
|
"description": "Severity-to-action mapping (string or array); uses the stricter default mapping when omitted."
|
|
321
358
|
}
|
|
359
|
+
},
|
|
360
|
+
"x-zhin-config": {
|
|
361
|
+
"levels": [
|
|
362
|
+
"global"
|
|
363
|
+
]
|
|
322
364
|
}
|
|
323
365
|
},
|
|
324
366
|
"sources": {
|
|
@@ -479,6 +521,11 @@
|
|
|
479
521
|
}
|
|
480
522
|
}
|
|
481
523
|
}
|
|
524
|
+
},
|
|
525
|
+
"x-zhin-config": {
|
|
526
|
+
"levels": [
|
|
527
|
+
"global"
|
|
528
|
+
]
|
|
482
529
|
}
|
|
483
530
|
}
|
|
484
531
|
}
|
package/src/bypass.ts
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
|
+
import { checkBuiltinPermit, type PermissionSubject } from '@zhin.js/permission';
|
|
1
2
|
import type { ModerationConfig } from './types.js';
|
|
2
3
|
|
|
3
4
|
export interface BypassInput {
|
|
4
5
|
readonly sender?: string;
|
|
5
6
|
readonly conversationId: string;
|
|
6
|
-
/**
|
|
7
|
-
|
|
7
|
+
/**
|
|
8
|
+
* The message projected for the shared permit evaluator (`toPermissionSubject(message)`): zhin
|
|
9
|
+
* chat role (`sender.chatRole`) and platform standing (`sender.platform`), ADR 0056 §5.
|
|
10
|
+
*/
|
|
11
|
+
readonly subject?: PermissionSubject;
|
|
8
12
|
}
|
|
9
13
|
|
|
10
14
|
export function shouldBypassInbound(
|
|
@@ -16,13 +20,8 @@ export function shouldBypassInbound(
|
|
|
16
20
|
const sender = input.sender?.trim();
|
|
17
21
|
if (sender) {
|
|
18
22
|
if (config.inbound.whitelist.userIds.includes(sender)) return true;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
...config.masters,
|
|
22
|
-
...(input.endpointMasters ?? []),
|
|
23
|
-
].map(String));
|
|
24
|
-
if (masters.has(sender)) return true;
|
|
25
|
-
}
|
|
23
|
+
const subject = input.subject;
|
|
24
|
+
if (subject && config.inbound.bypass.some(permit => checkBuiltinPermit(permit, subject))) return true;
|
|
26
25
|
}
|
|
27
26
|
|
|
28
27
|
if (config.inbound.whitelist.conversationIds.includes(input.conversationId)) {
|
package/src/config.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isBuiltinPermit } from '@zhin.js/permission';
|
|
1
2
|
import {
|
|
2
3
|
isAction,
|
|
3
4
|
type Action,
|
|
@@ -22,10 +23,9 @@ export const DEFAULT_MODERATION_CONFIG: ModerationConfig = Object.freeze({
|
|
|
22
23
|
enabled: true,
|
|
23
24
|
onError: 'open',
|
|
24
25
|
maskChar: '*',
|
|
25
|
-
masters: Object.freeze([] as string[]),
|
|
26
26
|
inbound: Object.freeze({
|
|
27
27
|
enabled: true,
|
|
28
|
-
|
|
28
|
+
bypass: Object.freeze(['owner', 'platform:admin']),
|
|
29
29
|
whitelist: Object.freeze({
|
|
30
30
|
userIds: Object.freeze([] as string[]),
|
|
31
31
|
conversationIds: Object.freeze([] as string[]),
|
|
@@ -39,6 +39,12 @@ export const DEFAULT_MODERATION_CONFIG: ModerationConfig = Object.freeze({
|
|
|
39
39
|
sources: Object.freeze([] as SourceConfig[]),
|
|
40
40
|
});
|
|
41
41
|
|
|
42
|
+
/** Built-in permit expressions only; removed / unknown spellings are dropped (logged by the schema on load). */
|
|
43
|
+
function parseBypass(value: unknown): ModerationConfig['inbound']['bypass'] {
|
|
44
|
+
if (!Array.isArray(value)) return DEFAULT_MODERATION_CONFIG.inbound.bypass;
|
|
45
|
+
return Object.freeze([...new Set(value.filter((item): item is string => typeof item === 'string' && isBuiltinPermit(item.trim())).map(item => item.trim()))]);
|
|
46
|
+
}
|
|
47
|
+
|
|
42
48
|
export function resolveModerationConfig(raw: unknown): ModerationConfig {
|
|
43
49
|
const input = raw && typeof raw === 'object' ? raw as Record<string, unknown> : {};
|
|
44
50
|
const inboundRaw = asRecord(input.inbound);
|
|
@@ -66,10 +72,9 @@ export function resolveModerationConfig(raw: unknown): ModerationConfig {
|
|
|
66
72
|
onError,
|
|
67
73
|
maskChar,
|
|
68
74
|
...(replyTemplate === undefined ? {} : { replyTemplate }),
|
|
69
|
-
masters: freezeStrings(input.masters),
|
|
70
75
|
inbound: Object.freeze({
|
|
71
76
|
enabled: inboundRaw.enabled !== false,
|
|
72
|
-
|
|
77
|
+
bypass: parseBypass(inboundRaw.bypass),
|
|
73
78
|
whitelist: Object.freeze({
|
|
74
79
|
userIds: freezeStrings(whitelistRaw.userIds),
|
|
75
80
|
conversationIds: freezeStrings(whitelistRaw.conversationIds),
|
package/src/types.ts
CHANGED
|
@@ -99,10 +99,15 @@ export interface ModerationConfig {
|
|
|
99
99
|
readonly maskChar: string;
|
|
100
100
|
/** Omitted templates use the inbound operation's language. Explicit text is never translated. */
|
|
101
101
|
readonly replyTemplate?: string;
|
|
102
|
-
readonly masters: readonly string[];
|
|
103
102
|
readonly inbound: {
|
|
104
103
|
readonly enabled: boolean;
|
|
105
|
-
|
|
104
|
+
/** Lowest chat role (ADR 0056) whose senders skip inbound review; `none` reviews everyone. */
|
|
105
|
+
/**
|
|
106
|
+
* Permit expressions (ADR 0056 §5 built-in DSL); a sender matching **any** of them skips inbound
|
|
107
|
+
* review. Content moderation is a platform function, so the default is `owner` (zhin owner) or
|
|
108
|
+
* `platform:admin` (group owner / admin). `[]` reviews everyone.
|
|
109
|
+
*/
|
|
110
|
+
readonly bypass: readonly string[];
|
|
106
111
|
readonly whitelist: {
|
|
107
112
|
readonly userIds: readonly string[];
|
|
108
113
|
readonly conversationIds: readonly string[];
|