@zhin.js/plugin-content-moderation 1.1.16 → 1.1.18

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 CHANGED
@@ -76,12 +76,14 @@ content-moderation:
76
76
  group: "your-group-number"
77
77
  ```
78
78
 
79
- 复用已配置的 AI 文本补全服务、Database Host 原子持久状态和当前 generation 的适配器。当前 ICQQ 实现审核文字及近期文字上下文;纯图片内容不作为本流程的处罚证据。未配置 AI、持久状态或适配器群管接口时不执行自动处罚。
79
+ 复用已配置的 AI 文本补全服务、Database Host 原子持久状态和当前 generation 的适配器。当前 ICQQ 实现审核文字及近期文字上下文;纯图片内容不作为本流程的处罚证据。未配置 AI、持久状态或适配器成员查询接口时不审核;禁言 / 踢人只经 Agent 群规执行。
80
80
 
81
81
  - 明确广告指未经请求的商业推广、交易或拉群引流。链接、技术分享、回应他人请求不能单独构成广告。
82
82
  - 辱骂需结合上下文确认针对他人的人身攻击;观点批评、引用、举报和不明确的玩笑不直接处罚。模型必须提供当前原文中的证据;词库命中不参与处罚计数。
83
- - 同一成员、同类违规按提醒 → 警告 → 禁言 10 分钟处理。只有上一条提示确认送达后新发送的消息才推进一级;30 分钟没有新违规重置。已执行禁言的这一轮不继续追加处罚。
84
- - 实际入群时间在 10 分钟内的明确广告可直接踢出。缺少入群时间、消息早于本次入群、审核期间超过窗口或成员重新入群,都不能使用此例外;执行前重新读取平台权限与成员信息。
83
+ - **判定后做什么交给群规(ADR 0039)**:本插件只判定广告 / 辱骂,提醒、警告、禁言、建议踢人由 Agent 的群规执行器按该群**已批准**的规则执行;禁言以规则批准作硬闸批准,仍过控制面、`ops_cooldown` 与审计。
84
+ - **迁移(行为收紧)**:`groupModeration` 名单里的群首次有消息时,按默认模板「提醒 → 警告 → 禁言 10 分钟,冷静期 30 分钟」为广告、辱骂各生成一条**待确认**规则,并在群里出预览卡;群主 / 管理员发 `/rule approve <短码>`(或在 Console 批准)后才恢复自动禁言。确认前、或未装 Agent 时,本插件只提醒 → 警告,不禁言、不踢人。已有任意状态的同类规则(包括被驳回 / 停用的)就不再生成,群主拒绝过的不反复打扰。
85
+ - 同一成员、同类违规在没有已批准规则时:提醒 → 警告,之后同一轮不再追加提示。只有上一条提示确认送达后新发送的消息才推进一级;30 分钟没有新违规重置。
86
+ - **新人发广告不再直接踢**:实际入群 10 分钟内的明确广告改为出一张踢人审批卡(每次人批,群主 / 管理员或 IM 审批人确认才踢,驳回或超时不踢)。缺少入群时间、消息早于本次入群、审核期间超过窗口或成员重新入群,都按普通违规处理。
85
87
  - 提醒或警告时,模型独立决定是否撤回这条违规原消息,并给出理由;不按处罚级别固定撤回。代码固定消息、群和账号,模型无法另选目标。对已明确评估的广告/辱骂,原词库动作不会再覆盖撤回决定;其他消息仍按原有词库配置处理。
86
88
  - 原群内通过 @ 对应成员简短说明规则和处理结果,不复述广告链接或辱骂。撤回失败不重试、不增加违规次数;通知未确认送达、处罚结果未知或进程在副作用中断时,保留持久执行预留,阻止重复处罚。该预留最多保留 30 分钟。
87
89
  - 普通 `group_kick` 工具仍逐次要求人工审批;确认信息展示本次群、成员和操作参数,并将执行参数固定为该次确认的快照。无人工审批渠道时拒绝,不扩大自动例外。
@@ -94,7 +96,7 @@ content-moderation:
94
96
 
95
97
  多人共用模型调用时,按各人原文估算 token 比例分摊用量,共享提示词和输出也按此比例归属;群 token 不重复累加,群请求只记一次。个人超额只排除本人并重建请求,群超额则不调用;估算分摊并非 provider 提供的精确个人用量。调用失败沿用输入用量预留,不自动重审整批。合批使用所配置模型的输出预算;结果截断时整批记录失败,不猜测结论。旧版或自定义 AI 服务未声明支持多人用量归属时,沿用逐条审核及原来的个人计量,避免静默漏记用量;不同 completion 资源的消息不会合入同一请求。
96
98
 
97
- 队列随插件资源与适配器生命周期取消,旧任务不能在热重载后继续处罚;不持久保存或重放未审任务。通知走 owner-scoped Outbound Host 和统一出站链路,不保留已经结束的原消息回复回调。规则提示使用原消息进入队列时的语言,等待审核期间切换语言不会改变该次通知;模型理由、证据和自定义模板保持原文。300 ms 仅为收集上限,排队、模型和平台调用会增加处置延迟;新人自动踢出的 10 分钟窗口不会因排队延长。
99
+ 队列随插件资源与适配器生命周期取消,旧任务不能在热重载后继续处罚;不持久保存或重放未审任务。通知走 owner-scoped Outbound Host 和统一出站链路,不保留已经结束的原消息回复回调。规则提示使用原消息进入队列时的语言,等待审核期间切换语言不会改变该次通知;模型理由、证据和自定义模板保持原文。300 ms 仅为收集上限,排队、模型和平台调用会增加处置延迟;新人踢人卡的 10 分钟窗口不会因排队延长。
98
100
 
99
101
  审核不携带工具,聊天内容作为不可信数据传入,调用计入现有用户/群配额。近期上下文在 generation 内有界保存(最多 50 条、12,000 字符);单条超出处理预算、缺少可靠时间、取消或审核失败时不处罚。这些限制属于处理能力边界,不是新的违规阈值。实际部署前应以本群样本验证模型对广告、引用、玩笑和正常分享的区分;单元测试不能证明模型判断准确。
100
102
 
@@ -38,10 +38,28 @@ export interface GroupModerationInput {
38
38
  readonly recall: () => Promise<void>;
39
39
  readonly audit: (event: Readonly<Record<string, unknown>>) => void;
40
40
  readonly onReview?: () => void;
41
+ /**
42
+ * 群规执行器(ADR 0039 §5,Agent host 提供)。判定后做什么交给它:`handled` 时本插件不再提醒或处罚;
43
+ * `no_rule`(该群还没确认规则)或未装 Agent 时,本插件只提醒 / 警告,不禁言、不踢人。
44
+ */
45
+ readonly rules?: (violation: GroupRuleHit) => Promise<'handled' | 'no_rule'>;
46
+ }
47
+ /** 交给群规执行器的一次命中(目标、群号由中间件绑定,模型够不着)。 */
48
+ export interface GroupRuleHit {
49
+ readonly category: Category;
50
+ readonly evidence: readonly string[];
51
+ /** 入群 10 分钟内发广告:执行器出踢人审批卡(每次人批),不再无人审批直接踢。 */
52
+ readonly newcomer: boolean;
53
+ readonly recall?: () => Promise<void>;
41
54
  }
42
55
  /** Generation-owned history only; enforcement state uses the existing atomic Database Host. */
43
56
  export declare class GroupModerator {
44
57
  #private;
58
+ /**
59
+ * ADR 0039 §5 migration: once per generation per configured group, ask the Agent host for the default
60
+ * pending rules (advertising / abuse). Failures are retried on a later message.
61
+ */
62
+ ensureRules(scope: string, ensure: () => Promise<void>): void;
45
63
  /** A full queue must still respect a review started by a previous generation. */
46
64
  ownsRecall(input: GroupModerationInput): Promise<boolean>;
47
65
  remember(scope: string, sender: string, text: string): {
@@ -1 +1 @@
1
- {"version":3,"file":"group-moderation.d.ts","sourceRoot":"","sources":["../src/group-moderation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"group-moderation.d.ts","sourceRoot":"","sources":["../src/group-moderation.ts"],"names":[],"mappings":"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"}
@@ -39,7 +39,19 @@ export function parseGroupReview(text, original, onInvalid) {
39
39
  /** Generation-owned history only; enforcement state uses the existing atomic Database Host. */
40
40
  export class GroupModerator {
41
41
  #history = new Map();
42
+ /** Groups whose default rules were already requested this generation (bounded by the configured group list). */
43
+ #rulesEnsured = new Set();
42
44
  #sequence = 0;
45
+ /**
46
+ * ADR 0039 §5 migration: once per generation per configured group, ask the Agent host for the default
47
+ * pending rules (advertising / abuse). Failures are retried on a later message.
48
+ */
49
+ ensureRules(scope, ensure) {
50
+ if (this.#rulesEnsured.has(scope))
51
+ return;
52
+ this.#rulesEnsured.add(scope);
53
+ void ensure().catch(() => this.#rulesEnsured.delete(scope));
54
+ }
43
55
  /** A full queue must still respect a review started by a previous generation. */
44
56
  async ownsRecall(input) {
45
57
  const window = await input.state.get(`group-moderation:seen:${digest(input.sender)}`);
@@ -64,7 +76,7 @@ export class GroupModerator {
64
76
  }
65
77
  async review(input, classify) {
66
78
  const { state, management } = input;
67
- if (!management.inspectGroupMember || !management.moderateGroupMember
79
+ if (!management.inspectGroupMember
68
80
  || !input.messageId || !Number.isSafeInteger(input.sentAt) || input.sentAt <= 0
69
81
  || input.sentAt > Date.now() || Date.now() - input.sentAt >= QUIET_MS
70
82
  || !input.text.trim() || input.text.length > 12_000)
@@ -154,28 +166,32 @@ export class GroupModerator {
154
166
  // Messages already sent before the last delivered notice cannot advance escalation.
155
167
  if (input.sentAt <= stage.notifiedAt)
156
168
  return;
157
- const count = Math.min(stage.count + 1, 3);
158
169
  input.audit({ event: 'group_review', category: review.category, messageId: input.messageId,
159
170
  evidence: review.evidence, recall: review.recall, recallReason: review.recallReason });
160
- if (!newcomer && stage.count >= 3) {
161
- await state.update(memberKey, (value) => value?.lease === token
162
- ? { ...value, [review.category]: { ...stage, lastViolationAt: input.sentAt } } : value, { ttlMs: QUIET_MS });
163
- return;
164
- }
165
171
  signal.throwIfAborted();
166
172
  // Persisted lease predates every side effect. Unknown outcomes retain it, preventing retries.
167
173
  effectStarted = true;
168
- if (newcomer) {
169
- await management.moderateGroupMember(input.group, input.sender, {
170
- type: 'kick', joinedAt: member.joinedAt, maxMembershipAgeMs: NEWCOMER_MS,
171
- }, signal);
174
+ // ADR 0039 §5: punishment belongs to the approved group rule. The enforcer owns its own ladder,
175
+ // mutes only under an approved rule, and turns a newcomer ad into a per-kick approval card.
176
+ if (input.rules) {
177
+ const outcome = await input.rules({ category: review.category, evidence: review.evidence, newcomer,
178
+ ...(review.recall ? { recall: input.recall } : {}) });
179
+ if (outcome === 'handled') {
180
+ completed = true;
181
+ return;
182
+ }
183
+ signal.throwIfAborted();
172
184
  }
173
- else if (count === 3) {
174
- await management.moderateGroupMember(input.group, input.sender, { type: 'mute', durationSeconds: 600 }, signal);
185
+ // No confirmed rule (or no Agent host): remind, then warn. Never mute or kick here.
186
+ if (stage.count >= 2) {
187
+ await state.update(memberKey, (value) => value?.lease === token
188
+ ? { ...value, [review.category]: { ...stage, lastViolationAt: input.sentAt } } : value, { ttlMs: QUIET_MS });
189
+ completed = true;
190
+ return;
175
191
  }
176
- signal.throwIfAborted();
192
+ const count = stage.count + 1;
177
193
  const rule = moderationMessages(input.locale, review.category);
178
- const action = moderationMessages(input.locale, newcomer ? 'kicked' : count === 3 ? 'muted' : count === 2 ? 'warning' : 'reminder');
194
+ const action = moderationMessages(input.locale, count === 2 ? 'warning' : 'reminder');
179
195
  await input.reply(moderationMessages(input.locale, 'notice', { action, rule }), input.sender);
180
196
  const notifiedAt = Date.now();
181
197
  // Commit the delivered stage and release together, before optional recall.
@@ -184,7 +200,7 @@ export class GroupModerator {
184
200
  completed = true;
185
201
  claimed = false;
186
202
  // Optional recall is independent of escalation and cannot undo a successfully delivered notice.
187
- if (!newcomer && count < 3 && review.recall && !signal.aborted) {
203
+ if (review.recall && !signal.aborted) {
188
204
  try {
189
205
  await input.recall();
190
206
  }
@@ -1 +1 @@
1
- {"version":3,"file":"group-moderation.js","sourceRoot":"","sources":["../src/group-moderation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"group-moderation.js","sourceRoot":"","sources":["../src/group-moderation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,QAAQ,GAAG,EAAE,GAAG,MAAM,CAAC;AAC7B,MAAM,WAAW,GAAG,EAAE,GAAG,MAAM,CAAC;AAchC,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;+XAG6V,CAAC;AAEhY,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;EAGjC,kBAAkB,EAAE,CAAC;AAEvB,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,QAAgB,EAC7D,SAAgE;IAEhE,MAAM,OAAO,GAAG,CAAC,MAA0C,EAAE,EAAE,GAAG,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3G,IAAI,KAA8B,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,oFAAoF;QACpF,MAAM,MAAM,GAAG,8CAA8C,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACtG,KAAK,GAAG,MAAiC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,OAAO,CAAC,cAAc,CAAC,CAAC;IAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,WAAW;QAAE,OAAO;IACxE,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,aAAa,IAAI,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC;WAC/D,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS;WACjC,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE;WACpE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;WAC7D,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAChJ,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAoB;QACrE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC;AAC7D,CAAC;AAwCD,+FAA+F;AAC/F,MAAM,OAAO,cAAc;IAChB,QAAQ,GAAG,IAAI,GAAG,EAA2D,CAAC;IACvF,gHAAgH;IACvG,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAC3C,SAAS,GAAG,CAAC,CAAC;IAEd;;;OAGG;IACH,WAAW,CAAC,KAAa,EAAE,MAA2B;QACpD,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO;QAC1C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9B,KAAK,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,iFAAiF;IACjF,KAAK,CAAC,UAAU,CAAC,KAA2B;QAC1C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,CAAa,yBAAyB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClG,MAAM,IAAI,GAAG,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAChF,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,UAAU,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3F,CAAC;IAED,QAAQ,CAAC,KAAa,EAAE,MAAc,EAAE,IAAY;QAClD,0EAA0E;QAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC;QACnG,MAAM,QAAQ,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC;QAClC,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,EAAE,GAAG,QAAQ,CAAC;YACpG,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACnE,OAAO,OAAO,CAAC,MAAM,GAAG,EAAE,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,MAAM;YAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QAChI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAClC,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAC5D,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,EAAE,GAAG,QAAQ,CAAC;aACtF,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAA2B,EAAE,QAA+D;QACvG,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;QACpC,IAAI,CAAC,UAAU,CAAC,kBAAkB;eAC7B,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;eAC5E,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,QAAQ;eAClE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM;YAAE,OAAO;QAC9D,MAAM,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC9E,+FAA+F;QAC/F,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACtG,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,2BAA2B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACpE,iGAAiG;QACjG,MAAM,UAAU,GAAG,yBAAyB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACnE,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAC7B,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,CAAC,cAAc,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAa,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE;gBACpE,MAAM,KAAK,GAAG,OAAO,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;gBACxD,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC;oBAAE,OAAO,KAAK,CAAC;gBACxG,MAAM,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;qBAC/G,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC/B,IAAI,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;gBAChC,OAAO,QAAQ,CAAC,MAAM,GAAG,GAAG;oBAAE,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,KAAK,EAAG,CAAC,EAAE,CAAC,CAAC;gBACpF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;YACjC,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACxB,MAAM,IAAI,GAAG,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;YAClE,IAAI,IAAI,EAAE,KAAK,KAAK,KAAK,EAAE,CAAC;gBAC1B,uFAAuF;gBACvF,IAAI,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,UAAU,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,SAAS,IAAI,CAAC,CAAC;oBAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACtG,OAAO;YACT,CAAC;YACD,cAAc,GAAG,IAAI,CAAC;YACtB,MAAM,CAAC,cAAc,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,kBAAkB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACtF,IAAI,CAAC,MAAM,CAAC,WAAW;gBAAE,OAAO;YAChC,MAAM,CAAC,cAAc,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC;gBACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,mBAAmB;gBACxD,MAAM,EAAE,iIAAiI;gBACzI,SAAS,EAAE;oBACT,EAAE,MAAM,EAAE,yBAAyB,EAAE,IAAI,EAAE,gBAAgB,EAAE;oBAC7D,EAAE,MAAM,EAAE,uBAAuB,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE;iBACtG;gBACD,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU;aACrD,CAAC,CAAC;YACH,MAAM,CAAC,cAAc,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;gBAC7E,KAAK,EAAE,sBAAsB,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM;aAClE,CAAC,CAAC,CAAC;YACJ,IAAI,CAAC,MAAM;gBAAE,OAAO;YACpB,gBAAgB,GAAG,IAAI,CAAC;YACxB,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAa,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK;gBACrF,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAC3H,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACvB,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC;gBAAE,OAAO;YACjE,MAAM,CAAC,cAAc,EAAE,CAAC;YACxB,gFAAgF;YAChF,sFAAsF;YACtF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,MAAM,CAAc,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;gBACnE,IAAI,KAAK,EAAE,KAAK,IAAI,GAAG,GAAG,KAAK,CAAC,OAAO,GAAG,QAAQ;oBAAE,OAAO,KAAK,CAAC;gBACjE,OAAO,EAAE,GAAG,CAAC,KAAK,IAAI,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;YACpE,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACxB,IAAI,OAAO,EAAE,KAAK,KAAK,KAAK,EAAE,CAAC;gBAC7B,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;gBAChF,OAAO;YACT,CAAC;YACD,OAAO,GAAG,IAAI,CAAC;YACf,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,eAAe,IAAI,QAAQ,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC5F,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,KAAK,aAAa,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS;mBAC9E,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,IAAI,WAAW;mBAChF,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,QAAQ,IAAI,WAAW,CAAC;YACjD,oFAAoF;YACpF,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,UAAU;gBAAE,OAAO;YAC7C,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS;gBACxF,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;YACzF,MAAM,CAAC,cAAc,EAAE,CAAC;YACxB,8FAA8F;YAC9F,aAAa,GAAG,IAAI,CAAC;YACrB,gGAAgG;YAChG,4FAA4F;YAC5F,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ;oBAChG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBACxD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC1B,SAAS,GAAG,IAAI,CAAC;oBACjB,OAAO;gBACT,CAAC;gBACD,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,CAAC;YACD,oFAAoF;YACpF,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;gBACrB,MAAM,KAAK,CAAC,MAAM,CAAc,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK;oBAC1E,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,eAAe,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EACxF,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACrB,SAAS,GAAG,IAAI,CAAC;gBACjB,OAAO;YACT,CAAC;YACD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YACtF,MAAM,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAC9F,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC9B,2EAA2E;YAC3E,MAAM,KAAK,CAAC,MAAM,CAAc,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK;gBAC1E,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAC5G,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACrB,SAAS,GAAG,IAAI,CAAC;YACjB,OAAO,GAAG,KAAK,CAAC;YAChB,gGAAgG;YAChG,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACrC,IAAI,CAAC;oBAAC,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;gBAAC,CAAC;gBAC7B,MAAM,CAAC;oBAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;gBAAC,CAAC;YACtF,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS;gBACxE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,WAAW;gBACzD,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,cAAc,EAAE,CAAC;gBACnB,IAAI,CAAC;oBACH,MAAM,KAAK,CAAC,MAAM,CAAa,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK;wBACtE,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK;4BACvD,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,gBAAgB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EACpG,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACvB,CAAC;gBAAC,MAAM,CAAC,CAAC,2EAA2E,CAAC,CAAC;YACzF,CAAC;YACD,IAAI,OAAO,IAAI,CAAC,CAAC,aAAa,IAAI,SAAS,CAAC,EAAE,CAAC;gBAC7C,IAAI,CAAC;oBACH,MAAM,KAAK,CAAC,MAAM,CAAc,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAC5G,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACzB,CAAC;gBAAC,MAAM,CAAC,CAAC,iFAAiF,CAAC,CAAC;YAC/F,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,SAAS,UAAU,KAAY,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACxF,SAAS,UAAU,KAAkB,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;AACxH,SAAS,MAAM,CAAC,KAAa,IAAY,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC"}
package/lib/messages.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const moderationMessages: (locale: import("zhin.js").Locale | undefined, key: "blocked" | "advertising" | "abuse" | "kicked" | "muted" | "warning" | "reminder" | "notice", values?: import("zhin.js").MessageValues) => string;
1
+ export declare const moderationMessages: (locale: import("zhin.js").Locale | undefined, key: "blocked" | "advertising" | "abuse" | "warning" | "reminder" | "notice", values?: import("zhin.js").MessageValues) => string;
2
2
  //# sourceMappingURL=messages.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,kBAAkB,uMAS7B,CAAC"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,kBAAkB,kLAO7B,CAAC"}
package/lib/messages.js CHANGED
@@ -3,8 +3,6 @@ export const moderationMessages = createMessages({
3
3
  blocked: { 'zh-CN': '消息含不当内容,已拦截。', en: 'This message contains inappropriate content and was blocked.' },
4
4
  advertising: { 'zh-CN': '请勿发布未经请求的广告或引流信息', en: 'Do not post unsolicited advertising or promotional invitations' },
5
5
  abuse: { 'zh-CN': '请勿针对他人进行人身攻击', en: 'Do not direct personal attacks at others' },
6
- kicked: { 'zh-CN': '入群 10 分钟内发布明确广告,已移出群聊', en: 'Removed from the group for posting clear advertising within 10 minutes of joining' },
7
- muted: { 'zh-CN': '已禁言 10 分钟', en: 'Muted for 10 minutes' },
8
6
  warning: { 'zh-CN': '警告', en: 'Warning' },
9
7
  reminder: { 'zh-CN': '提醒', en: 'Reminder' },
10
8
  notice: { 'zh-CN': '{action}。{rule}。', en: '{action}. {rule}.' },
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,CAAC,MAAM,kBAAkB,GAAG,cAAc,CAAC;IAC/C,OAAO,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,8DAA8D,EAAE;IACxG,WAAW,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAAE,EAAE,gEAAgE,EAAE;IAClH,KAAK,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,0CAA0C,EAAE;IAClF,MAAM,EAAE,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE,EAAE,mFAAmF,EAAE;IACrI,KAAK,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,sBAAsB,EAAE;IAC3D,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE;IACzC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE;IAC3C,MAAM,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAAE,EAAE,mBAAmB,EAAE;CACjE,CAAC,CAAC"}
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,CAAC,MAAM,kBAAkB,GAAG,cAAc,CAAC;IAC/C,OAAO,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,8DAA8D,EAAE;IACxG,WAAW,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAAE,EAAE,gEAAgE,EAAE;IAClH,KAAK,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,0CAA0C,EAAE;IAClF,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE;IACzC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE;IAC3C,MAAM,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAAE,EAAE,mBAAmB,EAAE;CACjE,CAAC,CAAC"}
@@ -2,6 +2,7 @@
2
2
  import { defineMiddleware } from 'zhin.js/middleware';
3
3
  import { aiCompletionToken, createDeliveryTarget, databaseHostToken, getLogger, hasResource, outboundHostToken, usageSubjectFromMessage } from 'zhin.js';
4
4
  import { adapterFeatureId } from 'zhin.js/adapter';
5
+ import { groupRuleViolationToken } from '@zhin.js/core/runtime';
5
6
  import { generationAdmissionSource } from 'zhin.js/plugin-runtime';
6
7
  import { resolveLocale } from 'zhin.js/i18n';
7
8
  import { buildScanContext, extractFromTextAndSegments, resolveModerationConfig, shouldBypassInbound, } from "../../lib/index.js";
@@ -122,6 +123,21 @@ async function enqueueGroupModeration(context, config, bypass) {
122
123
  const destination = createDeliveryTarget({ conversation });
123
124
  const scope = JSON.stringify(destination);
124
125
  const remembered = engine.groupModerator.remember(scope, message.sender?.id ?? '', text);
126
+ // ADR 0039 §5: punishment is the group rule's job. A configured group gets default pending rules once,
127
+ // and stays reminder / warning only until an owner or admin confirms them.
128
+ const rules = hasResource(context, groupRuleViolationToken)
129
+ ? context.use(groupRuleViolationToken) : undefined;
130
+ if (rules) {
131
+ engine.groupModerator.ensureRules(scope, async () => {
132
+ for (const trigger of ['advertising', 'abuse']) {
133
+ const outcome = await rules.ensureDefaultRule({ conversation, trigger });
134
+ if (outcome === 'unavailable')
135
+ throw new Error('Group rule storage unavailable');
136
+ if (outcome === 'created')
137
+ logger.info({ event: 'group_rule_migrated', trigger, endpoint: conversation.endpoint.id, group: conversation.id });
138
+ }
139
+ });
140
+ }
125
141
  if (!bypass && message.sender?.id && message.origin !== 'self'
126
142
  && hasResource(context, aiCompletionToken) && hasResource(context, databaseHostToken)
127
143
  && hasResource(context, outboundHostToken)) {
@@ -151,11 +167,18 @@ async function enqueueGroupModeration(context, config, bypass) {
151
167
  assertTarget();
152
168
  return endpoint.management.inspectGroupMember(group, member, operationSignal);
153
169
  } : undefined,
154
- moderateGroupMember: endpoint.management?.moderateGroupMember ? async (group, member, action, operationSignal) => {
155
- assertTarget();
156
- return endpoint.management.moderateGroupMember(group, member, action, operationSignal);
157
- } : undefined,
158
170
  },
171
+ ...(rules ? { rules: async (hit) => {
172
+ assertTarget();
173
+ return rules.report({
174
+ conversation, memberId: message.sender.id, trigger: hit.category, newcomer: hit.newcomer,
175
+ sentAt: Number(message.metadata?.platformSentAt), evidence: hit.evidence,
176
+ ...(message.sender?.name ? { memberName: message.sender.name } : {}),
177
+ ...(message.sender?.roles ? { memberRoles: message.sender.roles } : {}),
178
+ ...(messageId ? { messageId } : {}),
179
+ ...(hit.recall ? { recall: hit.recall } : {}),
180
+ });
181
+ } } : {}),
159
182
  onBehalfOf: usageSubjectFromMessage(message),
160
183
  reply: async (content, mention) => {
161
184
  assertTarget();
@@ -3,6 +3,7 @@ import type { Message } from '@zhin.js/core/runtime';
3
3
  import { aiCompletionToken, createDeliveryTarget, databaseHostToken, getLogger, hasResource,
4
4
  outboundHostToken, usageSubjectFromMessage } from 'zhin.js';
5
5
  import { adapterFeatureId, type AdapterIndex } from 'zhin.js/adapter';
6
+ import { groupRuleViolationToken, type GroupRuleViolationSink } from '@zhin.js/core/runtime';
6
7
  import { generationAdmissionSource } from 'zhin.js/plugin-runtime';
7
8
  import { resolveLocale } from 'zhin.js/i18n';
8
9
  import {
@@ -136,6 +137,19 @@ async function enqueueGroupModeration(
136
137
  const destination = createDeliveryTarget({ conversation });
137
138
  const scope = JSON.stringify(destination);
138
139
  const remembered = engine.groupModerator.remember(scope, message.sender?.id ?? '', text);
140
+ // ADR 0039 §5: punishment is the group rule's job. A configured group gets default pending rules once,
141
+ // and stays reminder / warning only until an owner or admin confirms them.
142
+ const rules: GroupRuleViolationSink | undefined = hasResource(context, groupRuleViolationToken)
143
+ ? context.use(groupRuleViolationToken) : undefined;
144
+ if (rules) {
145
+ engine.groupModerator.ensureRules(scope, async () => {
146
+ for (const trigger of ['advertising', 'abuse'] as const) {
147
+ const outcome = await rules.ensureDefaultRule({ conversation, trigger });
148
+ if (outcome === 'unavailable') throw new Error('Group rule storage unavailable');
149
+ if (outcome === 'created') logger.info({ event: 'group_rule_migrated', trigger, endpoint: conversation.endpoint.id, group: conversation.id });
150
+ }
151
+ });
152
+ }
139
153
  if (!bypass && message.sender?.id && message.origin !== 'self'
140
154
  && hasResource(context, aiCompletionToken) && hasResource(context, databaseHostToken)
141
155
  && hasResource(context, outboundHostToken)) {
@@ -163,10 +177,18 @@ async function enqueueGroupModeration(
163
177
  inspectGroupMember: endpoint.management?.inspectGroupMember ? async (group, member, operationSignal) => {
164
178
  assertTarget(); return endpoint.management!.inspectGroupMember!(group, member, operationSignal);
165
179
  } : undefined,
166
- moderateGroupMember: endpoint.management?.moderateGroupMember ? async (group, member, action, operationSignal) => {
167
- assertTarget(); return endpoint.management!.moderateGroupMember!(group, member, action, operationSignal);
168
- } : undefined,
169
180
  },
181
+ ...(rules ? { rules: async (hit) => {
182
+ assertTarget();
183
+ return rules.report({
184
+ conversation, memberId: message.sender!.id, trigger: hit.category, newcomer: hit.newcomer,
185
+ sentAt: Number(message.metadata?.platformSentAt), evidence: hit.evidence,
186
+ ...(message.sender?.name ? { memberName: message.sender.name } : {}),
187
+ ...(message.sender?.roles ? { memberRoles: message.sender.roles } : {}),
188
+ ...(messageId ? { messageId } : {}),
189
+ ...(hit.recall ? { recall: hit.recall } : {}),
190
+ });
191
+ } } : {}),
170
192
  onBehalfOf: usageSubjectFromMessage(message),
171
193
  reply: async (content, mention) => {
172
194
  assertTarget();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhin.js/plugin-content-moderation",
3
- "version": "1.1.16",
3
+ "version": "1.1.18",
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",
@@ -37,13 +37,13 @@
37
37
  },
38
38
  "license": "MIT",
39
39
  "dependencies": {
40
- "@zhin.js/core": "1.1.51",
40
+ "@zhin.js/core": "1.1.53",
41
41
  "@zhin.js/logger": "1.1.2"
42
42
  },
43
43
  "devDependencies": {
44
44
  "typescript": "^6.0.3",
45
45
  "vitest": "^4.1.10",
46
- "zhin.js": "1.1.16"
46
+ "zhin.js": "1.1.18"
47
47
  },
48
48
  "repository": {
49
49
  "type": "git",
@@ -73,7 +73,7 @@
73
73
  },
74
74
  "peerDependencies": {
75
75
  "@zhin.js/middleware": "^1.1.10",
76
- "zhin.js": "^1.1.16"
76
+ "zhin.js": "^1.1.18"
77
77
  },
78
78
  "peerDependenciesMeta": {
79
79
  "@zhin.js/middleware": {
package/schema.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "groupModeration": {
7
7
  "type": "array",
8
8
  "default": [],
9
- "description": "自动广告/辱骂审核的精确范围;未配置时关闭。需要 AI、原子持久状态和适配器群管支持。",
9
+ "description": "自动广告/辱骂审核的精确范围;未配置时关闭。需要 AI、原子持久状态和适配器群管支持。禁言 / 踢人交给 Agent 群规(ADR 0039),名单内的群会生成待确认的默认规则,确认前只提醒 / 警告。",
10
10
  "items": {
11
11
  "type": "object",
12
12
  "additionalProperties": false,
@@ -74,13 +74,39 @@ export interface GroupModerationInput {
74
74
  readonly recall: () => Promise<void>;
75
75
  readonly audit: (event: Readonly<Record<string, unknown>>) => void;
76
76
  readonly onReview?: () => void;
77
+ /**
78
+ * 群规执行器(ADR 0039 §5,Agent host 提供)。判定后做什么交给它:`handled` 时本插件不再提醒或处罚;
79
+ * `no_rule`(该群还没确认规则)或未装 Agent 时,本插件只提醒 / 警告,不禁言、不踢人。
80
+ */
81
+ readonly rules?: (violation: GroupRuleHit) => Promise<'handled' | 'no_rule'>;
82
+ }
83
+
84
+ /** 交给群规执行器的一次命中(目标、群号由中间件绑定,模型够不着)。 */
85
+ export interface GroupRuleHit {
86
+ readonly category: Category;
87
+ readonly evidence: readonly string[];
88
+ /** 入群 10 分钟内发广告:执行器出踢人审批卡(每次人批),不再无人审批直接踢。 */
89
+ readonly newcomer: boolean;
90
+ readonly recall?: () => Promise<void>;
77
91
  }
78
92
 
79
93
  /** Generation-owned history only; enforcement state uses the existing atomic Database Host. */
80
94
  export class GroupModerator {
81
95
  readonly #history = new Map<string, readonly (GroupContextEntry & { at: number })[]>();
96
+ /** Groups whose default rules were already requested this generation (bounded by the configured group list). */
97
+ readonly #rulesEnsured = new Set<string>();
82
98
  #sequence = 0;
83
99
 
100
+ /**
101
+ * ADR 0039 §5 migration: once per generation per configured group, ask the Agent host for the default
102
+ * pending rules (advertising / abuse). Failures are retried on a later message.
103
+ */
104
+ ensureRules(scope: string, ensure: () => Promise<void>): void {
105
+ if (this.#rulesEnsured.has(scope)) return;
106
+ this.#rulesEnsured.add(scope);
107
+ void ensure().catch(() => this.#rulesEnsured.delete(scope));
108
+ }
109
+
84
110
  /** A full queue must still respect a review started by a previous generation. */
85
111
  async ownsRecall(input: GroupModerationInput): Promise<boolean> {
86
112
  const window = await input.state.get<SeenWindow>(`group-moderation:seen:${digest(input.sender)}`);
@@ -107,7 +133,7 @@ export class GroupModerator {
107
133
 
108
134
  async review(input: GroupModerationInput, classify?: (signal: AbortSignal) => Promise<AiCompletionResult>): Promise<void> {
109
135
  const { state, management } = input;
110
- if (!management.inspectGroupMember || !management.moderateGroupMember
136
+ if (!management.inspectGroupMember
111
137
  || !input.messageId || !Number.isSafeInteger(input.sentAt) || input.sentAt <= 0
112
138
  || input.sentAt > Date.now() || Date.now() - input.sentAt >= QUIET_MS
113
139
  || !input.text.trim() || input.text.length > 12_000) return;
@@ -189,28 +215,33 @@ export class GroupModerator {
189
215
  && Date.now() - member.joinedAt <= NEWCOMER_MS;
190
216
  // Messages already sent before the last delivered notice cannot advance escalation.
191
217
  if (input.sentAt <= stage.notifiedAt) return;
192
- const count = Math.min(stage.count + 1, 3);
193
218
  input.audit({ event: 'group_review', category: review.category, messageId: input.messageId,
194
219
  evidence: review.evidence, recall: review.recall, recallReason: review.recallReason });
195
- if (!newcomer && stage.count >= 3) {
220
+ signal.throwIfAborted();
221
+ // Persisted lease predates every side effect. Unknown outcomes retain it, preventing retries.
222
+ effectStarted = true;
223
+ // ADR 0039 §5: punishment belongs to the approved group rule. The enforcer owns its own ladder,
224
+ // mutes only under an approved rule, and turns a newcomer ad into a per-kick approval card.
225
+ if (input.rules) {
226
+ const outcome = await input.rules({ category: review.category, evidence: review.evidence, newcomer,
227
+ ...(review.recall ? { recall: input.recall } : {}) });
228
+ if (outcome === 'handled') {
229
+ completed = true;
230
+ return;
231
+ }
232
+ signal.throwIfAborted();
233
+ }
234
+ // No confirmed rule (or no Agent host): remind, then warn. Never mute or kick here.
235
+ if (stage.count >= 2) {
196
236
  await state.update<MemberState>(memberKey, (value) => value?.lease === token
197
237
  ? { ...value, [review.category]: { ...stage, lastViolationAt: input.sentAt } } : value,
198
238
  { ttlMs: QUIET_MS });
239
+ completed = true;
199
240
  return;
200
241
  }
201
- signal.throwIfAborted();
202
- // Persisted lease predates every side effect. Unknown outcomes retain it, preventing retries.
203
- effectStarted = true;
204
- if (newcomer) {
205
- await management.moderateGroupMember(input.group, input.sender, {
206
- type: 'kick', joinedAt: member.joinedAt!, maxMembershipAgeMs: NEWCOMER_MS,
207
- }, signal);
208
- } else if (count === 3) {
209
- await management.moderateGroupMember(input.group, input.sender, { type: 'mute', durationSeconds: 600 }, signal);
210
- }
211
- signal.throwIfAborted();
242
+ const count = stage.count + 1;
212
243
  const rule = moderationMessages(input.locale, review.category);
213
- const action = moderationMessages(input.locale, newcomer ? 'kicked' : count === 3 ? 'muted' : count === 2 ? 'warning' : 'reminder');
244
+ const action = moderationMessages(input.locale, count === 2 ? 'warning' : 'reminder');
214
245
  await input.reply(moderationMessages(input.locale, 'notice', { action, rule }), input.sender);
215
246
  const notifiedAt = Date.now();
216
247
  // Commit the delivered stage and release together, before optional recall.
@@ -220,7 +251,7 @@ export class GroupModerator {
220
251
  completed = true;
221
252
  claimed = false;
222
253
  // Optional recall is independent of escalation and cannot undo a successfully delivered notice.
223
- if (!newcomer && count < 3 && review.recall && !signal.aborted) {
254
+ if (review.recall && !signal.aborted) {
224
255
  try { await input.recall(); }
225
256
  catch { input.audit({ event: 'group_recall_failed', messageId: input.messageId }); }
226
257
  }
package/src/messages.ts CHANGED
@@ -4,8 +4,6 @@ export const moderationMessages = createMessages({
4
4
  blocked: { 'zh-CN': '消息含不当内容,已拦截。', en: 'This message contains inappropriate content and was blocked.' },
5
5
  advertising: { 'zh-CN': '请勿发布未经请求的广告或引流信息', en: 'Do not post unsolicited advertising or promotional invitations' },
6
6
  abuse: { 'zh-CN': '请勿针对他人进行人身攻击', en: 'Do not direct personal attacks at others' },
7
- kicked: { 'zh-CN': '入群 10 分钟内发布明确广告,已移出群聊', en: 'Removed from the group for posting clear advertising within 10 minutes of joining' },
8
- muted: { 'zh-CN': '已禁言 10 分钟', en: 'Muted for 10 minutes' },
9
7
  warning: { 'zh-CN': '警告', en: 'Warning' },
10
8
  reminder: { 'zh-CN': '提醒', en: 'Reminder' },
11
9
  notice: { 'zh-CN': '{action}。{rule}。', en: '{action}. {rule}.' },