@zhin.js/plugin-content-moderation 1.1.20 → 1.1.22
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 +9 -0
- package/lib/console.d.ts +29 -0
- package/lib/console.d.ts.map +1 -0
- package/lib/console.js +123 -0
- package/lib/console.js.map +1 -0
- package/lib/engine.d.ts +13 -1
- package/lib/engine.d.ts.map +1 -1
- package/lib/engine.js +33 -0
- package/lib/engine.js.map +1 -1
- package/lib/group-review-queue.d.ts +1 -0
- package/lib/group-review-queue.d.ts.map +1 -1
- package/lib/group-review-queue.js +7 -0
- package/lib/group-review-queue.js.map +1 -1
- package/lib/index.d.ts +2 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/package.json +42 -6
- package/pages/index/index.js +86 -0
- package/pages/index/index.ts +91 -0
- package/plugin.js +3 -1
- package/skills/content-moderation/SKILL.md +27 -0
- package/skills/content-moderation/tools/moderation_check/index.js +42 -0
- package/skills/content-moderation/tools/moderation_check/index.ts +46 -0
- package/skills/content-moderation/tools/moderation_status/index.js +27 -0
- package/skills/content-moderation/tools/moderation_status/index.ts +29 -0
- package/src/console.ts +182 -0
- package/src/engine.ts +43 -0
- package/src/group-review-queue.ts +8 -0
- package/src/index.ts +10 -0
package/README.md
CHANGED
|
@@ -207,6 +207,15 @@ actions:
|
|
|
207
207
|
|
|
208
208
|
|
|
209
209
|
|
|
210
|
+
## AI Skill、Tools 与 Console 页面
|
|
211
|
+
|
|
212
|
+
- **AI Skill (`skills/content-moderation/SKILL.md`)**:按需披露只读诊断工具:
|
|
213
|
+
- `moderation_check`:对样本文本执行无副作用的策略干跑检测,返回 `severity`、命中词与处置动作(不写入 `groupReviewQueue`)。
|
|
214
|
+
- `moderation_status`:查看当前引擎启用状态、敏感度等级、激活的审核源与待审群消息数。
|
|
215
|
+
- **Console 页面 (`pages/index/index.ts` & `src/console.ts`)**:
|
|
216
|
+
- 权限:`content-moderation:read`。
|
|
217
|
+
- 展示引擎状态、敏感度、审核源列表、白名单数量与待审队列计数,并提供 `checkText` 在线干跑检测动作。
|
|
218
|
+
|
|
210
219
|
## 许可
|
|
211
220
|
|
|
212
221
|
MIT
|
package/lib/console.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type PluginConsoleRpc } from 'zhin.js';
|
|
2
|
+
import type { ModerationEngine } from './engine.js';
|
|
3
|
+
export declare const MODERATION_CONSOLE_PAGE = "index";
|
|
4
|
+
export declare const MODERATION_READ_PERMISSION = "content-moderation:read";
|
|
5
|
+
export interface ModerationProviderStatusRow {
|
|
6
|
+
readonly id: string;
|
|
7
|
+
readonly type: string;
|
|
8
|
+
readonly enabled: boolean;
|
|
9
|
+
readonly onError: string;
|
|
10
|
+
}
|
|
11
|
+
export interface ModerationConsoleStatus {
|
|
12
|
+
readonly enabled: boolean;
|
|
13
|
+
readonly sensitivity: string;
|
|
14
|
+
readonly providersCount: number;
|
|
15
|
+
readonly whitelistCount: number;
|
|
16
|
+
readonly pendingReviewsCount: number;
|
|
17
|
+
readonly providers: readonly ModerationProviderStatusRow[];
|
|
18
|
+
}
|
|
19
|
+
export interface ModerationCheckTextResult {
|
|
20
|
+
readonly passed: boolean;
|
|
21
|
+
readonly decision: 'allow' | 'flag' | 'block';
|
|
22
|
+
readonly severity: string;
|
|
23
|
+
readonly actions: readonly string[];
|
|
24
|
+
readonly categories: readonly string[];
|
|
25
|
+
readonly matchesCount: number;
|
|
26
|
+
readonly message: string;
|
|
27
|
+
}
|
|
28
|
+
export declare function createModerationConsoleRpc(defaultEngine?: ModerationEngine): PluginConsoleRpc;
|
|
29
|
+
//# sourceMappingURL=console.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../src/console.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,gBAAgB,EAKtB,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,eAAO,MAAM,uBAAuB,UAAU,CAAC;AAC/C,eAAO,MAAM,0BAA0B,4BAA4B,CAAC;AAEpE,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,SAAS,2BAA2B,EAAE,CAAC;CAC5D;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAC9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AA6FD,wBAAgB,0BAA0B,CACxC,aAAa,CAAC,EAAE,gBAAgB,GAC/B,gBAAgB,CA8ClB"}
|
package/lib/console.js
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { definePluginConsoleRpc, PluginConsoleRpcError, } from 'zhin.js';
|
|
2
|
+
import { moderationEngineToken } from './runtime.js';
|
|
3
|
+
export const MODERATION_CONSOLE_PAGE = 'index';
|
|
4
|
+
export const MODERATION_READ_PERMISSION = 'content-moderation:read';
|
|
5
|
+
function resolveEngine(call, fallbackEngine) {
|
|
6
|
+
const runtimeWithUse = call.runtime;
|
|
7
|
+
if (typeof runtimeWithUse?.use === 'function') {
|
|
8
|
+
try {
|
|
9
|
+
const resolved = runtimeWithUse.use(moderationEngineToken);
|
|
10
|
+
if (resolved)
|
|
11
|
+
return resolved;
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
// Fall back to the plugin setup engine when call.runtime.use is unavailable.
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
if (fallbackEngine)
|
|
18
|
+
return fallbackEngine;
|
|
19
|
+
throw new PluginConsoleRpcError('unavailable', 'Content moderation engine is unavailable');
|
|
20
|
+
}
|
|
21
|
+
function buildProviderRows(engine) {
|
|
22
|
+
const configSources = engine.config?.sources ?? [];
|
|
23
|
+
if (configSources.length > 0) {
|
|
24
|
+
return configSources.map((source) => ({
|
|
25
|
+
id: source.id,
|
|
26
|
+
type: source.type,
|
|
27
|
+
enabled: source.enabled,
|
|
28
|
+
onError: source.onError,
|
|
29
|
+
}));
|
|
30
|
+
}
|
|
31
|
+
const activeProviders = engine.providers ?? [];
|
|
32
|
+
return activeProviders.map((provider) => ({
|
|
33
|
+
id: provider.id,
|
|
34
|
+
type: 'custom',
|
|
35
|
+
enabled: true,
|
|
36
|
+
onError: engine.config?.onError ?? 'open',
|
|
37
|
+
}));
|
|
38
|
+
}
|
|
39
|
+
async function handleCheckText(input, call, defaultEngine) {
|
|
40
|
+
const rawText = input.text;
|
|
41
|
+
if (typeof rawText !== 'string' || !rawText.trim()) {
|
|
42
|
+
throw new PluginConsoleRpcError('invalid_input', 'Sample text is required');
|
|
43
|
+
}
|
|
44
|
+
const text = rawText.trim();
|
|
45
|
+
const engine = resolveEngine(call, defaultEngine);
|
|
46
|
+
const evaluation = typeof engine.moderate === 'function'
|
|
47
|
+
? await engine.moderate({ text, direction: 'inbound' })
|
|
48
|
+
: await engine.scan({
|
|
49
|
+
text,
|
|
50
|
+
images: [],
|
|
51
|
+
direction: 'inbound',
|
|
52
|
+
context: {
|
|
53
|
+
adapter: 'console',
|
|
54
|
+
endpoint: 'dry-run',
|
|
55
|
+
conversationKind: 'private',
|
|
56
|
+
conversationId: 'dry-run',
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
const severity = evaluation.severity;
|
|
60
|
+
const actions = ('actions' in evaluation && Array.isArray(evaluation.actions))
|
|
61
|
+
? evaluation.actions
|
|
62
|
+
: (engine.config?.actions?.[severity] ?? []);
|
|
63
|
+
const passed = severity === 'pass';
|
|
64
|
+
const decision = passed
|
|
65
|
+
? 'allow'
|
|
66
|
+
: (actions.includes('drop') || actions.includes('recall') ? 'block' : 'flag');
|
|
67
|
+
const categories = (evaluation.sources ?? [])
|
|
68
|
+
.filter((source) => source.severity !== 'pass')
|
|
69
|
+
.map((source) => `${source.sourceId}:${source.severity}`);
|
|
70
|
+
const matchesCount = evaluation.matches?.length ?? 0;
|
|
71
|
+
return {
|
|
72
|
+
passed,
|
|
73
|
+
decision,
|
|
74
|
+
severity,
|
|
75
|
+
actions: [...actions],
|
|
76
|
+
categories,
|
|
77
|
+
matchesCount,
|
|
78
|
+
message: passed
|
|
79
|
+
? 'Passed moderation check (allow)'
|
|
80
|
+
: `Moderation decision: ${decision} (severity: ${severity}, matches: ${matchesCount})`,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
export function createModerationConsoleRpc(defaultEngine) {
|
|
84
|
+
const checkMethod = {
|
|
85
|
+
page: MODERATION_CONSOLE_PAGE,
|
|
86
|
+
requiredPermissions: [MODERATION_READ_PERMISSION],
|
|
87
|
+
handler: (input, call) => handleCheckText(input, call, defaultEngine),
|
|
88
|
+
};
|
|
89
|
+
const rpc = definePluginConsoleRpc({
|
|
90
|
+
status: {
|
|
91
|
+
page: MODERATION_CONSOLE_PAGE,
|
|
92
|
+
requiredPermissions: [MODERATION_READ_PERMISSION],
|
|
93
|
+
handler(_input, call) {
|
|
94
|
+
const engine = resolveEngine(call, defaultEngine);
|
|
95
|
+
const config = engine.config;
|
|
96
|
+
const providers = buildProviderRows(engine);
|
|
97
|
+
const whitelistCount = (config?.inbound?.whitelist?.userIds?.length ?? 0) +
|
|
98
|
+
(config?.inbound?.whitelist?.conversationIds?.length ?? 0);
|
|
99
|
+
const pendingReviewsCount = engine.pendingReviewsCount ?? engine.groupReviewQueue?.pendingCount ?? 0;
|
|
100
|
+
return {
|
|
101
|
+
enabled: Boolean(config?.enabled ?? true),
|
|
102
|
+
sensitivity: engine.sensitivity ?? (config?.onError === 'closed' ? 'strict' : 'medium'),
|
|
103
|
+
providersCount: providers.length,
|
|
104
|
+
whitelistCount,
|
|
105
|
+
pendingReviewsCount,
|
|
106
|
+
providers: providers,
|
|
107
|
+
};
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
actions: {
|
|
111
|
+
'check-text': checkMethod,
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
// Alias `checkText` on get/has while keeping `methods.keys()` strictly kebab-case.
|
|
115
|
+
const methods = rpc.methods;
|
|
116
|
+
const origGet = methods.get.bind(methods);
|
|
117
|
+
const origHas = methods.has.bind(methods);
|
|
118
|
+
const normalizeKey = (key) => (key === 'checkText' ? 'check-text' : key);
|
|
119
|
+
methods.get = (key) => origGet(normalizeKey(key));
|
|
120
|
+
methods.has = (key) => origHas(normalizeKey(key));
|
|
121
|
+
return rpc;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=console.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console.js","sourceRoot":"","sources":["../src/console.ts"],"names":[],"mappings":"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"}
|
package/lib/engine.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { GroupReviewQueue } from './group-review-queue.js';
|
|
|
5
5
|
import { generationAdmissionSource } from 'zhin.js/plugin-runtime';
|
|
6
6
|
import type { Locale } from 'zhin.js/i18n';
|
|
7
7
|
import type { ModerationProvider } from './providers/types.js';
|
|
8
|
-
import { type Action, type Direction, type MergedResult, type ModerationConfig, type ProviderResult, type ScanInput, type Severity } from './types.js';
|
|
8
|
+
import { type Action, type Direction, type ExtractedImage, type MergedResult, type ModerationConfig, type ProviderResult, type ScanContext, type ScanInput, type Severity } from './types.js';
|
|
9
9
|
export interface ApplyHooks {
|
|
10
10
|
readonly reply?: (content: string) => Promise<void>;
|
|
11
11
|
readonly recall?: () => Promise<boolean>;
|
|
@@ -30,6 +30,18 @@ export declare class ModerationEngine {
|
|
|
30
30
|
readonly fetch?: typeof fetch;
|
|
31
31
|
});
|
|
32
32
|
get config(): ModerationConfig;
|
|
33
|
+
get providers(): readonly ModerationProvider[];
|
|
34
|
+
get sensitivity(): string;
|
|
35
|
+
get pendingReviewsCount(): number;
|
|
36
|
+
moderate(input: {
|
|
37
|
+
readonly text: string;
|
|
38
|
+
readonly direction?: Direction;
|
|
39
|
+
readonly images?: readonly ExtractedImage[];
|
|
40
|
+
readonly context?: Partial<ScanContext>;
|
|
41
|
+
}): Promise<MergedResult & {
|
|
42
|
+
readonly passed: boolean;
|
|
43
|
+
readonly actions: readonly Action[];
|
|
44
|
+
}>;
|
|
33
45
|
configure(raw: unknown): void;
|
|
34
46
|
/** Test helper: inject providers without going through config sources. */
|
|
35
47
|
setProvidersForTest(providers: readonly ModerationProvider[]): void;
|
package/lib/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAExE,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGnE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,QAAQ,EACd,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACrD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;CACrC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;CACpC;AAED,qBAAa,gBAAgB;;IAC3B,QAAQ,CAAC,cAAc,iBAAwB;IAC/C,QAAQ,CAAC,gBAAgB,mBAA6C;IACtE,IAAI,CAAC,yBAAyB,CAAC,gDAA+D;gBAOlF,OAAO,GAAE;QACnB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;KAC1B;IAMN,IAAI,MAAM,IAAI,gBAAgB,CAE7B;IAED,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAQ7B,0EAA0E;IAC1E,mBAAmB,CAAC,SAAS,EAAE,SAAS,kBAAkB,EAAE,GAAG,IAAI;IAI7D,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC;IA4B7C,KAAK,CAAC,OAAO,EAAE;QACnB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;QAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;QACrC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;QAC9B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;QAC3B,+FAA+F;QAC/F,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KACrD,GAAG,OAAO,CAAC,WAAW,CAAC;CAkFzB;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,YAAY,CAmB7E"}
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
package/lib/engine.js
CHANGED
|
@@ -25,6 +25,39 @@ export class ModerationEngine {
|
|
|
25
25
|
get config() {
|
|
26
26
|
return this.#config;
|
|
27
27
|
}
|
|
28
|
+
get providers() {
|
|
29
|
+
return this.#providers;
|
|
30
|
+
}
|
|
31
|
+
get sensitivity() {
|
|
32
|
+
const local = this.#config.sources.find((source) => source.type === 'local');
|
|
33
|
+
if (local && local.type === 'local')
|
|
34
|
+
return local.defaultSeverity;
|
|
35
|
+
return this.#config.onError === 'closed' ? 'strict' : 'medium';
|
|
36
|
+
}
|
|
37
|
+
get pendingReviewsCount() {
|
|
38
|
+
return this.groupReviewQueue.pendingCount;
|
|
39
|
+
}
|
|
40
|
+
async moderate(input) {
|
|
41
|
+
const direction = input.direction ?? 'inbound';
|
|
42
|
+
const merged = await this.scan({
|
|
43
|
+
text: input.text,
|
|
44
|
+
images: input.images ?? [],
|
|
45
|
+
direction,
|
|
46
|
+
context: {
|
|
47
|
+
adapter: input.context?.adapter ?? 'console',
|
|
48
|
+
endpoint: input.context?.endpoint ?? 'dry-run',
|
|
49
|
+
conversationKind: input.context?.conversationKind ?? 'private',
|
|
50
|
+
conversationId: input.context?.conversationId ?? 'dry-run',
|
|
51
|
+
...(input.context?.sender !== undefined ? { sender: input.context.sender } : {}),
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
const actions = this.#config.actions[merged.severity] ?? [];
|
|
55
|
+
return Object.freeze({
|
|
56
|
+
...merged,
|
|
57
|
+
passed: merged.severity === 'pass',
|
|
58
|
+
actions: Object.freeze([...actions]),
|
|
59
|
+
});
|
|
60
|
+
}
|
|
28
61
|
configure(raw) {
|
|
29
62
|
this.#config = resolveModerationConfig(raw);
|
|
30
63
|
this.#providers = createProviders(this.#config, {
|
package/lib/engine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAe,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,YAAY,EAAyB,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EACL,WAAW,
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ export declare class GroupReviewQueue {
|
|
|
16
16
|
#private;
|
|
17
17
|
get [generationAdmissionSource](): import("zhin.js").GenerationAdmissionGate[];
|
|
18
18
|
constructor(moderator: GroupModerator);
|
|
19
|
+
get pendingCount(): number;
|
|
19
20
|
/** Bind detached review work to its actual Adapter owner, not a replaceable generation gate. */
|
|
20
21
|
captureSource(input: GroupReviewSourceInput): CapturedGroupReviewSource;
|
|
21
22
|
/** Existing cancellation policy, applied only to the actual committed replacement set. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group-review-queue.d.ts","sourceRoot":"","sources":["../src/group-review-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,yBAAyB,EAAE,KAAK,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACjH,OAAO,KAAK,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AASlF,iFAAiF;AACjF,UAAU,sBAAsB;IAC9B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,oFAAoF;IACpF,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAC9B;AACD,UAAU,yBAAyB;IACjC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,8EAA8E;IAC9E,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,qGAAqG;AACrG,qBAAa,gBAAgB;;IAS3B,IAAI,CAAC,yBAAyB,CAAC,gDAA2B;gBAE9C,SAAS,EAAE,cAAc;IAIrC,gGAAgG;IAChG,aAAa,CAAC,KAAK,EAAE,sBAAsB,GAAG,yBAAyB;IAMvE,0FAA0F;IAC1F,qBAAqB,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,GAAG,IAAI;IAMxD,IAAI,IAAI,IAAI;IAWZ,gGAAgG;IAC1F,OAAO,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC;CAgGhF"}
|
|
1
|
+
{"version":3,"file":"group-review-queue.d.ts","sourceRoot":"","sources":["../src/group-review-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,yBAAyB,EAAE,KAAK,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACjH,OAAO,KAAK,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AASlF,iFAAiF;AACjF,UAAU,sBAAsB;IAC9B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,oFAAoF;IACpF,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAC9B;AACD,UAAU,yBAAyB;IACjC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,8EAA8E;IAC9E,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,qGAAqG;AACrG,qBAAa,gBAAgB;;IAS3B,IAAI,CAAC,yBAAyB,CAAC,gDAA2B;gBAE9C,SAAS,EAAE,cAAc;IAIrC,IAAI,YAAY,IAAI,MAAM,CAMzB;IAED,gGAAgG;IAChG,aAAa,CAAC,KAAK,EAAE,sBAAsB,GAAG,yBAAyB;IAMvE,0FAA0F;IAC1F,qBAAqB,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,GAAG,IAAI;IAMxD,IAAI,IAAI,IAAI;IAWZ,gGAAgG;IAC1F,OAAO,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC;CAgGhF"}
|
|
@@ -17,6 +17,13 @@ export class GroupReviewQueue {
|
|
|
17
17
|
constructor(moderator) {
|
|
18
18
|
this.#moderator = moderator;
|
|
19
19
|
}
|
|
20
|
+
get pendingCount() {
|
|
21
|
+
let total = 0;
|
|
22
|
+
for (const scene of this.#scenes.values()) {
|
|
23
|
+
total += scene.pending.length;
|
|
24
|
+
}
|
|
25
|
+
return total;
|
|
26
|
+
}
|
|
20
27
|
/** Bind detached review work to its actual Adapter owner, not a replaceable generation gate. */
|
|
21
28
|
captureSource(input) {
|
|
22
29
|
const source = { owner: input.owner, abort: new AbortController() };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group-review-queue.js","sourceRoot":"","sources":["../src/group-review-queue.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"group-review-queue.js","sourceRoot":"","sources":["../src/group-review-queue.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
CHANGED
|
@@ -11,4 +11,6 @@ export { BUILTIN_LEXICON, mergeLexiconEntries } from './providers/builtin-lexico
|
|
|
11
11
|
export type { LexiconEntry, LexiconSeverity } from './providers/builtin-lexicon.js';
|
|
12
12
|
export { HttpModerationProvider, parseHttpResult, isPublicHttpUrl } from './providers/http.js';
|
|
13
13
|
export { createProviders } from './providers/registry.js';
|
|
14
|
+
export { createModerationConsoleRpc, MODERATION_CONSOLE_PAGE, MODERATION_READ_PERMISSION, } from './console.js';
|
|
15
|
+
export type { ModerationCheckTextResult, ModerationConsoleStatus, ModerationProviderStatusRow, } from './console.js';
|
|
14
16
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,UAAU,EACV,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,gBAAgB,EAChB,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EACV,QAAQ,EACR,MAAM,EACN,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,SAAS,EACT,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,kBAAkB,EAClB,aAAa,EACb,aAAa,GACd,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACtF,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACpF,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,UAAU,EACV,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,gBAAgB,EAChB,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EACV,QAAQ,EACR,MAAM,EACN,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,SAAS,EACT,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,kBAAkB,EAClB,aAAa,EACb,aAAa,GACd,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACtF,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACpF,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,yBAAyB,EACzB,uBAAuB,EACvB,2BAA2B,GAC5B,MAAM,cAAc,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -9,4 +9,5 @@ export { LocalLexiconProvider, findMatches, findGradedMatches, loadWords, loadLe
|
|
|
9
9
|
export { BUILTIN_LEXICON, mergeLexiconEntries } from './providers/builtin-lexicon.js';
|
|
10
10
|
export { HttpModerationProvider, parseHttpResult, isPublicHttpUrl } from './providers/http.js';
|
|
11
11
|
export { createProviders } from './providers/registry.js';
|
|
12
|
+
export { createModerationConsoleRpc, MODERATION_CONSOLE_PAGE, MODERATION_READ_PERMISSION, } from './console.js';
|
|
12
13
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,UAAU,EACV,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,gBAAgB,EAChB,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAYrD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,kBAAkB,EAClB,aAAa,EACb,aAAa,GACd,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAEtF,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,UAAU,EACV,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,gBAAgB,EAChB,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAYrD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,kBAAkB,EAClB,aAAa,EACb,aAAa,GACd,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAEtF,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,cAAc,CAAC"}
|
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.22",
|
|
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",
|
|
@@ -16,6 +16,8 @@
|
|
|
16
16
|
"plugin.js",
|
|
17
17
|
"schema.json",
|
|
18
18
|
"middlewares",
|
|
19
|
+
"pages",
|
|
20
|
+
"skills",
|
|
19
21
|
"src",
|
|
20
22
|
"lib",
|
|
21
23
|
"README.md"
|
|
@@ -37,13 +39,19 @@
|
|
|
37
39
|
},
|
|
38
40
|
"license": "MIT",
|
|
39
41
|
"dependencies": {
|
|
40
|
-
"@zhin.js/
|
|
41
|
-
"@zhin.js/
|
|
42
|
+
"@zhin.js/client": "1.1.25",
|
|
43
|
+
"@zhin.js/console-contract": "1.1.3",
|
|
44
|
+
"@zhin.js/core": "1.1.57",
|
|
45
|
+
"@zhin.js/logger": "1.1.2",
|
|
46
|
+
"@zhin.js/page": "1.1.15",
|
|
47
|
+
"@zhin.js/skill": "1.1.14",
|
|
48
|
+
"@zhin.js/tool": "1.1.16"
|
|
42
49
|
},
|
|
43
50
|
"devDependencies": {
|
|
44
51
|
"typescript": "^6.0.3",
|
|
45
52
|
"vitest": "^4.1.10",
|
|
46
|
-
"
|
|
53
|
+
"zod": "^4.4.3",
|
|
54
|
+
"zhin.js": "1.1.22"
|
|
47
55
|
},
|
|
48
56
|
"repository": {
|
|
49
57
|
"type": "git",
|
|
@@ -67,17 +75,45 @@
|
|
|
67
75
|
{
|
|
68
76
|
"package": "@zhin.js/middleware",
|
|
69
77
|
"api": "^1.0.0"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"package": "@zhin.js/tool",
|
|
81
|
+
"api": "^1.1.0"
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"package": "@zhin.js/skill",
|
|
85
|
+
"api": "^1.0.0"
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"package": "@zhin.js/page",
|
|
89
|
+
"api": "^1.0.0"
|
|
70
90
|
}
|
|
71
91
|
],
|
|
72
92
|
"plugins": []
|
|
73
93
|
},
|
|
74
94
|
"peerDependencies": {
|
|
75
|
-
"
|
|
76
|
-
"zhin.js": "^1.1.
|
|
95
|
+
"zod": "^4.0.0",
|
|
96
|
+
"@zhin.js/middleware": "^1.1.14",
|
|
97
|
+
"@zhin.js/page": "^1.1.15",
|
|
98
|
+
"@zhin.js/skill": "^1.1.14",
|
|
99
|
+
"@zhin.js/tool": "^1.1.16",
|
|
100
|
+
"zhin.js": "^1.1.22"
|
|
77
101
|
},
|
|
78
102
|
"peerDependenciesMeta": {
|
|
79
103
|
"@zhin.js/middleware": {
|
|
80
104
|
"optional": true
|
|
105
|
+
},
|
|
106
|
+
"@zhin.js/page": {
|
|
107
|
+
"optional": true
|
|
108
|
+
},
|
|
109
|
+
"@zhin.js/skill": {
|
|
110
|
+
"optional": true
|
|
111
|
+
},
|
|
112
|
+
"@zhin.js/tool": {
|
|
113
|
+
"optional": true
|
|
114
|
+
},
|
|
115
|
+
"zod": {
|
|
116
|
+
"optional": true
|
|
81
117
|
}
|
|
82
118
|
},
|
|
83
119
|
"scripts": {
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// Generated by build-plugin-runtime-entries.mjs. Do not edit.
|
|
2
|
+
import { definePage } from '@zhin.js/console-contract';
|
|
3
|
+
import { createDeclarativePage } from '@zhin.js/client';
|
|
4
|
+
export const meta = definePage({
|
|
5
|
+
title: '内容审核',
|
|
6
|
+
titleI18n: { en: 'Content Moderation' },
|
|
7
|
+
icon: 'ShieldAlert',
|
|
8
|
+
order: 55,
|
|
9
|
+
requiredPermissions: ['content-moderation:read'],
|
|
10
|
+
});
|
|
11
|
+
export default createDeclarativePage({
|
|
12
|
+
title: { zh: '内容审核', en: 'Content Moderation' },
|
|
13
|
+
description: {
|
|
14
|
+
zh: '多源内容安全扫描引擎状态、提供方列表与在线干跑检测',
|
|
15
|
+
en: 'Multi-source content moderation engine status, providers, and dry-run check',
|
|
16
|
+
},
|
|
17
|
+
stats: [
|
|
18
|
+
{
|
|
19
|
+
key: 'enabled',
|
|
20
|
+
label: { zh: '引擎状态', en: 'Engine Status' },
|
|
21
|
+
value: (data) => (data.enabled ? 'Enabled' : 'Disabled'),
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
key: 'sensitivity',
|
|
25
|
+
label: { zh: '敏感度等级', en: 'Sensitivity' },
|
|
26
|
+
value: 'sensitivity',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
key: 'providersCount',
|
|
30
|
+
label: { zh: '审核源数量', en: 'Providers' },
|
|
31
|
+
value: 'providersCount',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
key: 'whitelistCount',
|
|
35
|
+
label: { zh: '白名单条目', en: 'Whitelist Entries' },
|
|
36
|
+
value: 'whitelistCount',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
key: 'pendingReviewsCount',
|
|
40
|
+
label: { zh: '待审群消息', en: 'Pending Reviews' },
|
|
41
|
+
value: 'pendingReviewsCount',
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
actions: [
|
|
45
|
+
{
|
|
46
|
+
name: 'check-text',
|
|
47
|
+
label: { zh: '检测文本', en: 'Check Text' },
|
|
48
|
+
description: {
|
|
49
|
+
zh: '执行一次不产生副作用的策略干跑检测',
|
|
50
|
+
en: 'Run a dry-run moderation check against active rules',
|
|
51
|
+
},
|
|
52
|
+
fields: [
|
|
53
|
+
{
|
|
54
|
+
key: 'text',
|
|
55
|
+
label: { zh: '测试文本', en: 'Sample text' },
|
|
56
|
+
required: true,
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
sections: [
|
|
62
|
+
{
|
|
63
|
+
id: 'overview',
|
|
64
|
+
title: { zh: '配置概览', en: 'Configuration Overview' },
|
|
65
|
+
entries: (data) => [
|
|
66
|
+
{ label: 'Enabled', value: data.enabled ? 'Yes' : 'No' },
|
|
67
|
+
{ label: 'Sensitivity', value: data.sensitivity },
|
|
68
|
+
{ label: 'Providers Count', value: String(data.providersCount) },
|
|
69
|
+
{ label: 'Whitelist Count', value: String(data.whitelistCount) },
|
|
70
|
+
{ label: 'Pending Reviews', value: String(data.pendingReviewsCount) },
|
|
71
|
+
],
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
id: 'providers',
|
|
75
|
+
title: { zh: '审核提供方', en: 'Moderation Providers' },
|
|
76
|
+
emptyText: { zh: '未配置额外审核源', en: 'No moderation providers configured' },
|
|
77
|
+
items: 'providers',
|
|
78
|
+
columns: [
|
|
79
|
+
{ key: 'id', label: { zh: '源 ID', en: 'Source ID' } },
|
|
80
|
+
{ key: 'type', label: { zh: '类型', en: 'Type' } },
|
|
81
|
+
{ key: 'enabled', label: { zh: '启用', en: 'Enabled' } },
|
|
82
|
+
{ key: 'onError', label: { zh: '故障策略', en: 'On Error' } },
|
|
83
|
+
],
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
});
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { definePage } from '@zhin.js/console-contract';
|
|
2
|
+
import { createDeclarativePage } from '@zhin.js/client';
|
|
3
|
+
import type {
|
|
4
|
+
ModerationConsoleStatus,
|
|
5
|
+
ModerationProviderStatusRow,
|
|
6
|
+
} from '../../src/console.js';
|
|
7
|
+
|
|
8
|
+
export const meta = definePage({
|
|
9
|
+
title: '内容审核',
|
|
10
|
+
titleI18n: { en: 'Content Moderation' },
|
|
11
|
+
icon: 'ShieldAlert',
|
|
12
|
+
order: 55,
|
|
13
|
+
requiredPermissions: ['content-moderation:read'],
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
export default createDeclarativePage<ModerationConsoleStatus>({
|
|
17
|
+
title: { zh: '内容审核', en: 'Content Moderation' },
|
|
18
|
+
description: {
|
|
19
|
+
zh: '多源内容安全扫描引擎状态、提供方列表与在线干跑检测',
|
|
20
|
+
en: 'Multi-source content moderation engine status, providers, and dry-run check',
|
|
21
|
+
},
|
|
22
|
+
stats: [
|
|
23
|
+
{
|
|
24
|
+
key: 'enabled',
|
|
25
|
+
label: { zh: '引擎状态', en: 'Engine Status' },
|
|
26
|
+
value: (data) => (data.enabled ? 'Enabled' : 'Disabled'),
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
key: 'sensitivity',
|
|
30
|
+
label: { zh: '敏感度等级', en: 'Sensitivity' },
|
|
31
|
+
value: 'sensitivity',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
key: 'providersCount',
|
|
35
|
+
label: { zh: '审核源数量', en: 'Providers' },
|
|
36
|
+
value: 'providersCount',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
key: 'whitelistCount',
|
|
40
|
+
label: { zh: '白名单条目', en: 'Whitelist Entries' },
|
|
41
|
+
value: 'whitelistCount',
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
key: 'pendingReviewsCount',
|
|
45
|
+
label: { zh: '待审群消息', en: 'Pending Reviews' },
|
|
46
|
+
value: 'pendingReviewsCount',
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
actions: [
|
|
50
|
+
{
|
|
51
|
+
name: 'check-text',
|
|
52
|
+
label: { zh: '检测文本', en: 'Check Text' },
|
|
53
|
+
description: {
|
|
54
|
+
zh: '执行一次不产生副作用的策略干跑检测',
|
|
55
|
+
en: 'Run a dry-run moderation check against active rules',
|
|
56
|
+
},
|
|
57
|
+
fields: [
|
|
58
|
+
{
|
|
59
|
+
key: 'text',
|
|
60
|
+
label: { zh: '测试文本', en: 'Sample text' },
|
|
61
|
+
required: true,
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
sections: [
|
|
67
|
+
{
|
|
68
|
+
id: 'overview',
|
|
69
|
+
title: { zh: '配置概览', en: 'Configuration Overview' },
|
|
70
|
+
entries: (data) => [
|
|
71
|
+
{ label: 'Enabled', value: data.enabled ? 'Yes' : 'No' },
|
|
72
|
+
{ label: 'Sensitivity', value: data.sensitivity },
|
|
73
|
+
{ label: 'Providers Count', value: String(data.providersCount) },
|
|
74
|
+
{ label: 'Whitelist Count', value: String(data.whitelistCount) },
|
|
75
|
+
{ label: 'Pending Reviews', value: String(data.pendingReviewsCount) },
|
|
76
|
+
],
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
id: 'providers',
|
|
80
|
+
title: { zh: '审核提供方', en: 'Moderation Providers' },
|
|
81
|
+
emptyText: { zh: '未配置额外审核源', en: 'No moderation providers configured' },
|
|
82
|
+
items: 'providers',
|
|
83
|
+
columns: [
|
|
84
|
+
{ key: 'id', label: { zh: '源 ID', en: 'Source ID' } },
|
|
85
|
+
{ key: 'type', label: { zh: '类型', en: 'Type' } },
|
|
86
|
+
{ key: 'enabled', label: { zh: '启用', en: 'Enabled' } },
|
|
87
|
+
{ key: 'onError', label: { zh: '故障策略', en: 'On Error' } },
|
|
88
|
+
] satisfies readonly { key: keyof ModerationProviderStatusRow & string; label: { zh: string; en: string } }[],
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
});
|
package/plugin.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Generated by build-plugin-runtime-entries.mjs. Do not edit.
|
|
2
|
-
import { definePlugin } from 'zhin.js';
|
|
2
|
+
import { definePlugin, pluginConsoleRpcToken } from 'zhin.js';
|
|
3
|
+
import { createModerationConsoleRpc } from "./lib/console.js";
|
|
3
4
|
import { ModerationEngine } from "./lib/engine.js";
|
|
4
5
|
import { moderationEngineToken } from "./lib/runtime.js";
|
|
5
6
|
export default definePlugin({
|
|
@@ -14,6 +15,7 @@ export default definePlugin({
|
|
|
14
15
|
const engine = new ModerationEngine();
|
|
15
16
|
engine.configure(context.config.get());
|
|
16
17
|
context.resources.provide(moderationEngineToken, engine);
|
|
18
|
+
context.resources.provide(pluginConsoleRpcToken, createModerationConsoleRpc(engine));
|
|
17
19
|
context.events.on('hmr.resume', ({ details }) => {
|
|
18
20
|
if (details.outcome !== 'committed')
|
|
19
21
|
return;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: content-moderation
|
|
3
|
+
description: Check text against content moderation policies and inspect moderation engine status.
|
|
4
|
+
keywords:
|
|
5
|
+
- 审核
|
|
6
|
+
- 内容安全
|
|
7
|
+
- 敏感词
|
|
8
|
+
- moderation
|
|
9
|
+
- safety
|
|
10
|
+
tags:
|
|
11
|
+
- moderation
|
|
12
|
+
- security
|
|
13
|
+
tools:
|
|
14
|
+
- moderation_check
|
|
15
|
+
- moderation_status
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# Content Moderation Skill
|
|
19
|
+
|
|
20
|
+
Provides read-only content safety diagnostics and moderation engine inspection.
|
|
21
|
+
|
|
22
|
+
## Tools
|
|
23
|
+
|
|
24
|
+
| Tool | Purpose |
|
|
25
|
+
|------|---------|
|
|
26
|
+
| `moderation_check` | Dry-run text against active content moderation policies and report severity, matched rules, and actions. |
|
|
27
|
+
| `moderation_status` | Inspect current moderation engine configuration, active providers, sensitivity, and pending review queue count. |
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// Generated by build-plugin-runtime-entries.mjs. Do not edit.
|
|
2
|
+
import { defineAgentTool } from '@zhin.js/tool';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { moderationEngineToken } from "../../../../lib/runtime.js";
|
|
5
|
+
const inputSchema = z.object({
|
|
6
|
+
text: z.string().min(1).max(2000).describe('Text to evaluate against content moderation policies'),
|
|
7
|
+
});
|
|
8
|
+
export default defineAgentTool({
|
|
9
|
+
description: 'Evaluate sample text against content moderation policies without mutating state',
|
|
10
|
+
inputSchema,
|
|
11
|
+
readOnly: true,
|
|
12
|
+
requiresApproval: 'never',
|
|
13
|
+
async execute({ text }, context) {
|
|
14
|
+
const engine = context.use(moderationEngineToken);
|
|
15
|
+
const result = typeof engine.moderate === 'function'
|
|
16
|
+
? await engine.moderate({ text, direction: 'inbound' })
|
|
17
|
+
: await engine.scan({
|
|
18
|
+
text,
|
|
19
|
+
images: [],
|
|
20
|
+
direction: 'inbound',
|
|
21
|
+
context: {
|
|
22
|
+
adapter: 'agent',
|
|
23
|
+
endpoint: 'tool',
|
|
24
|
+
conversationKind: 'private',
|
|
25
|
+
conversationId: 'moderation-check',
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
const passed = result.passed ?? result.severity === 'pass';
|
|
29
|
+
const actions = result.actions ?? engine.config?.actions?.[result.severity] ?? [];
|
|
30
|
+
if (passed) {
|
|
31
|
+
return `Moderation check passed (severity: ${result.severity}, actions: ${actions.join(', ') || 'allow'}). No rules matched.`;
|
|
32
|
+
}
|
|
33
|
+
const matchedWords = (result.matches ?? [])
|
|
34
|
+
.map((match) => text.slice(match.start, match.end))
|
|
35
|
+
.filter(Boolean);
|
|
36
|
+
const matchesDetail = matchedWords.length > 0
|
|
37
|
+
? `matched: ${matchedWords.join(', ')}`
|
|
38
|
+
: `matches: ${result.matches?.length ?? 0}`;
|
|
39
|
+
const reasonSuffix = result.reason ? ` (${result.reason})` : '';
|
|
40
|
+
return `Moderation check flagged (severity: ${result.severity}, ${matchesDetail}, actions: ${actions.join(', ') || 'none'})${reasonSuffix}.`;
|
|
41
|
+
},
|
|
42
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { defineAgentTool } from '@zhin.js/tool';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { moderationEngineToken } from '../../../../src/runtime.js';
|
|
4
|
+
import type { Action, MergedResult } from '../../../../src/types.js';
|
|
5
|
+
|
|
6
|
+
const inputSchema = z.object({
|
|
7
|
+
text: z.string().min(1).max(2000).describe('Text to evaluate against content moderation policies'),
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
export default defineAgentTool({
|
|
11
|
+
description: 'Evaluate sample text against content moderation policies without mutating state',
|
|
12
|
+
inputSchema,
|
|
13
|
+
readOnly: true,
|
|
14
|
+
requiresApproval: 'never',
|
|
15
|
+
async execute({ text }, context) {
|
|
16
|
+
const engine = context.use(moderationEngineToken);
|
|
17
|
+
const result: MergedResult & { readonly passed?: boolean; readonly actions?: readonly Action[] } =
|
|
18
|
+
typeof engine.moderate === 'function'
|
|
19
|
+
? await engine.moderate({ text, direction: 'inbound' })
|
|
20
|
+
: await engine.scan({
|
|
21
|
+
text,
|
|
22
|
+
images: [],
|
|
23
|
+
direction: 'inbound',
|
|
24
|
+
context: {
|
|
25
|
+
adapter: 'agent',
|
|
26
|
+
endpoint: 'tool',
|
|
27
|
+
conversationKind: 'private',
|
|
28
|
+
conversationId: 'moderation-check',
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
const passed = result.passed ?? result.severity === 'pass';
|
|
33
|
+
const actions = result.actions ?? engine.config?.actions?.[result.severity] ?? [];
|
|
34
|
+
if (passed) {
|
|
35
|
+
return `Moderation check passed (severity: ${result.severity}, actions: ${actions.join(', ') || 'allow'}). No rules matched.`;
|
|
36
|
+
}
|
|
37
|
+
const matchedWords = (result.matches ?? [])
|
|
38
|
+
.map((match) => text.slice(match.start, match.end))
|
|
39
|
+
.filter(Boolean);
|
|
40
|
+
const matchesDetail = matchedWords.length > 0
|
|
41
|
+
? `matched: ${matchedWords.join(', ')}`
|
|
42
|
+
: `matches: ${result.matches?.length ?? 0}`;
|
|
43
|
+
const reasonSuffix = result.reason ? ` (${result.reason})` : '';
|
|
44
|
+
return `Moderation check flagged (severity: ${result.severity}, ${matchesDetail}, actions: ${actions.join(', ') || 'none'})${reasonSuffix}.`;
|
|
45
|
+
},
|
|
46
|
+
});
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Generated by build-plugin-runtime-entries.mjs. Do not edit.
|
|
2
|
+
import { defineAgentTool } from '@zhin.js/tool';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { moderationEngineToken } from "../../../../lib/runtime.js";
|
|
5
|
+
const inputSchema = z.object({});
|
|
6
|
+
export default defineAgentTool({
|
|
7
|
+
description: 'Inspect content moderation engine status, active providers, sensitivity, and pending review count',
|
|
8
|
+
inputSchema,
|
|
9
|
+
readOnly: true,
|
|
10
|
+
requiresApproval: 'never',
|
|
11
|
+
async execute(_input, context) {
|
|
12
|
+
const engine = context.use(moderationEngineToken);
|
|
13
|
+
const config = engine.config;
|
|
14
|
+
const enabled = Boolean(config?.enabled ?? true);
|
|
15
|
+
const sensitivity = engine.sensitivity ?? (config?.onError === 'closed' ? 'strict' : 'medium');
|
|
16
|
+
const providers = engine.providers?.map((p) => p.id)
|
|
17
|
+
?? config?.sources?.filter((s) => s.enabled).map((s) => s.id)
|
|
18
|
+
?? [];
|
|
19
|
+
const pendingReviews = engine.pendingReviewsCount ?? engine.groupReviewQueue?.pendingCount ?? 0;
|
|
20
|
+
return [
|
|
21
|
+
`Moderation status: ${enabled ? 'enabled' : 'disabled'}`,
|
|
22
|
+
`Sensitivity: ${sensitivity}`,
|
|
23
|
+
`Providers (${providers.length}): ${providers.length > 0 ? providers.join(', ') : 'none'}`,
|
|
24
|
+
`Pending group reviews: ${pendingReviews}`,
|
|
25
|
+
].join('\n');
|
|
26
|
+
},
|
|
27
|
+
});
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { defineAgentTool } from '@zhin.js/tool';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { moderationEngineToken } from '../../../../src/runtime.js';
|
|
4
|
+
|
|
5
|
+
const inputSchema = z.object({});
|
|
6
|
+
|
|
7
|
+
export default defineAgentTool({
|
|
8
|
+
description: 'Inspect content moderation engine status, active providers, sensitivity, and pending review count',
|
|
9
|
+
inputSchema,
|
|
10
|
+
readOnly: true,
|
|
11
|
+
requiresApproval: 'never',
|
|
12
|
+
async execute(_input, context) {
|
|
13
|
+
const engine = context.use(moderationEngineToken);
|
|
14
|
+
const config = engine.config;
|
|
15
|
+
const enabled = Boolean(config?.enabled ?? true);
|
|
16
|
+
const sensitivity = engine.sensitivity ?? (config?.onError === 'closed' ? 'strict' : 'medium');
|
|
17
|
+
const providers = engine.providers?.map((p) => p.id)
|
|
18
|
+
?? config?.sources?.filter((s) => s.enabled).map((s) => s.id)
|
|
19
|
+
?? [];
|
|
20
|
+
const pendingReviews = engine.pendingReviewsCount ?? engine.groupReviewQueue?.pendingCount ?? 0;
|
|
21
|
+
|
|
22
|
+
return [
|
|
23
|
+
`Moderation status: ${enabled ? 'enabled' : 'disabled'}`,
|
|
24
|
+
`Sensitivity: ${sensitivity}`,
|
|
25
|
+
`Providers (${providers.length}): ${providers.length > 0 ? providers.join(', ') : 'none'}`,
|
|
26
|
+
`Pending group reviews: ${pendingReviews}`,
|
|
27
|
+
].join('\n');
|
|
28
|
+
},
|
|
29
|
+
});
|
package/src/console.ts
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import {
|
|
2
|
+
definePluginConsoleRpc,
|
|
3
|
+
PluginConsoleRpcError,
|
|
4
|
+
type NormalizedPluginConsoleRpcMethod,
|
|
5
|
+
type PluginConsoleRpc,
|
|
6
|
+
type PluginConsoleRpcCall,
|
|
7
|
+
type PluginConsoleRpcInput,
|
|
8
|
+
type PluginConsoleRpcJson,
|
|
9
|
+
type Token,
|
|
10
|
+
} from 'zhin.js';
|
|
11
|
+
import type { ModerationEngine } from './engine.js';
|
|
12
|
+
import { moderationEngineToken } from './runtime.js';
|
|
13
|
+
|
|
14
|
+
export const MODERATION_CONSOLE_PAGE = 'index';
|
|
15
|
+
export const MODERATION_READ_PERMISSION = 'content-moderation:read';
|
|
16
|
+
|
|
17
|
+
export interface ModerationProviderStatusRow {
|
|
18
|
+
readonly id: string;
|
|
19
|
+
readonly type: string;
|
|
20
|
+
readonly enabled: boolean;
|
|
21
|
+
readonly onError: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface ModerationConsoleStatus {
|
|
25
|
+
readonly enabled: boolean;
|
|
26
|
+
readonly sensitivity: string;
|
|
27
|
+
readonly providersCount: number;
|
|
28
|
+
readonly whitelistCount: number;
|
|
29
|
+
readonly pendingReviewsCount: number;
|
|
30
|
+
readonly providers: readonly ModerationProviderStatusRow[];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface ModerationCheckTextResult {
|
|
34
|
+
readonly passed: boolean;
|
|
35
|
+
readonly decision: 'allow' | 'flag' | 'block';
|
|
36
|
+
readonly severity: string;
|
|
37
|
+
readonly actions: readonly string[];
|
|
38
|
+
readonly categories: readonly string[];
|
|
39
|
+
readonly matchesCount: number;
|
|
40
|
+
readonly message: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
type RuntimeWithUse = {
|
|
44
|
+
use?: <T>(token: Token<T>) => T;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
function resolveEngine(
|
|
48
|
+
call: PluginConsoleRpcCall,
|
|
49
|
+
fallbackEngine?: ModerationEngine,
|
|
50
|
+
): ModerationEngine {
|
|
51
|
+
const runtimeWithUse = call.runtime as RuntimeWithUse | undefined;
|
|
52
|
+
if (typeof runtimeWithUse?.use === 'function') {
|
|
53
|
+
try {
|
|
54
|
+
const resolved = runtimeWithUse.use(moderationEngineToken);
|
|
55
|
+
if (resolved) return resolved;
|
|
56
|
+
} catch {
|
|
57
|
+
// Fall back to the plugin setup engine when call.runtime.use is unavailable.
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (fallbackEngine) return fallbackEngine;
|
|
61
|
+
throw new PluginConsoleRpcError('unavailable', 'Content moderation engine is unavailable');
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function buildProviderRows(engine: ModerationEngine): ModerationProviderStatusRow[] {
|
|
65
|
+
const configSources = engine.config?.sources ?? [];
|
|
66
|
+
if (configSources.length > 0) {
|
|
67
|
+
return configSources.map((source) => ({
|
|
68
|
+
id: source.id,
|
|
69
|
+
type: source.type,
|
|
70
|
+
enabled: source.enabled,
|
|
71
|
+
onError: source.onError,
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
const activeProviders = engine.providers ?? [];
|
|
75
|
+
return activeProviders.map((provider) => ({
|
|
76
|
+
id: provider.id,
|
|
77
|
+
type: 'custom',
|
|
78
|
+
enabled: true,
|
|
79
|
+
onError: engine.config?.onError ?? 'open',
|
|
80
|
+
}));
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async function handleCheckText(
|
|
84
|
+
input: PluginConsoleRpcInput,
|
|
85
|
+
call: PluginConsoleRpcCall,
|
|
86
|
+
defaultEngine?: ModerationEngine,
|
|
87
|
+
): Promise<PluginConsoleRpcJson> {
|
|
88
|
+
const rawText = input.text;
|
|
89
|
+
if (typeof rawText !== 'string' || !rawText.trim()) {
|
|
90
|
+
throw new PluginConsoleRpcError('invalid_input', 'Sample text is required');
|
|
91
|
+
}
|
|
92
|
+
const text = rawText.trim();
|
|
93
|
+
const engine = resolveEngine(call, defaultEngine);
|
|
94
|
+
const evaluation = typeof engine.moderate === 'function'
|
|
95
|
+
? await engine.moderate({ text, direction: 'inbound' })
|
|
96
|
+
: await engine.scan({
|
|
97
|
+
text,
|
|
98
|
+
images: [],
|
|
99
|
+
direction: 'inbound',
|
|
100
|
+
context: {
|
|
101
|
+
adapter: 'console',
|
|
102
|
+
endpoint: 'dry-run',
|
|
103
|
+
conversationKind: 'private',
|
|
104
|
+
conversationId: 'dry-run',
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
const severity = evaluation.severity;
|
|
109
|
+
const actions = ('actions' in evaluation && Array.isArray(evaluation.actions))
|
|
110
|
+
? evaluation.actions
|
|
111
|
+
: (engine.config?.actions?.[severity] ?? []);
|
|
112
|
+
const passed = severity === 'pass';
|
|
113
|
+
const decision: ModerationCheckTextResult['decision'] = passed
|
|
114
|
+
? 'allow'
|
|
115
|
+
: (actions.includes('drop') || actions.includes('recall') ? 'block' : 'flag');
|
|
116
|
+
const categories = (evaluation.sources ?? [])
|
|
117
|
+
.filter((source) => source.severity !== 'pass')
|
|
118
|
+
.map((source) => `${source.sourceId}:${source.severity}`);
|
|
119
|
+
const matchesCount = evaluation.matches?.length ?? 0;
|
|
120
|
+
|
|
121
|
+
return {
|
|
122
|
+
passed,
|
|
123
|
+
decision,
|
|
124
|
+
severity,
|
|
125
|
+
actions: [...actions],
|
|
126
|
+
categories,
|
|
127
|
+
matchesCount,
|
|
128
|
+
message: passed
|
|
129
|
+
? 'Passed moderation check (allow)'
|
|
130
|
+
: `Moderation decision: ${decision} (severity: ${severity}, matches: ${matchesCount})`,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export function createModerationConsoleRpc(
|
|
135
|
+
defaultEngine?: ModerationEngine,
|
|
136
|
+
): PluginConsoleRpc {
|
|
137
|
+
const checkMethod = {
|
|
138
|
+
page: MODERATION_CONSOLE_PAGE,
|
|
139
|
+
requiredPermissions: [MODERATION_READ_PERMISSION],
|
|
140
|
+
handler: (input: PluginConsoleRpcInput, call: PluginConsoleRpcCall) =>
|
|
141
|
+
handleCheckText(input, call, defaultEngine),
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
const rpc = definePluginConsoleRpc({
|
|
145
|
+
status: {
|
|
146
|
+
page: MODERATION_CONSOLE_PAGE,
|
|
147
|
+
requiredPermissions: [MODERATION_READ_PERMISSION],
|
|
148
|
+
handler(_input, call): PluginConsoleRpcJson {
|
|
149
|
+
const engine = resolveEngine(call, defaultEngine);
|
|
150
|
+
const config = engine.config;
|
|
151
|
+
const providers = buildProviderRows(engine);
|
|
152
|
+
const whitelistCount =
|
|
153
|
+
(config?.inbound?.whitelist?.userIds?.length ?? 0) +
|
|
154
|
+
(config?.inbound?.whitelist?.conversationIds?.length ?? 0);
|
|
155
|
+
const pendingReviewsCount =
|
|
156
|
+
engine.pendingReviewsCount ?? engine.groupReviewQueue?.pendingCount ?? 0;
|
|
157
|
+
|
|
158
|
+
return {
|
|
159
|
+
enabled: Boolean(config?.enabled ?? true),
|
|
160
|
+
sensitivity: engine.sensitivity ?? (config?.onError === 'closed' ? 'strict' : 'medium'),
|
|
161
|
+
providersCount: providers.length,
|
|
162
|
+
whitelistCount,
|
|
163
|
+
pendingReviewsCount,
|
|
164
|
+
providers: providers as unknown as PluginConsoleRpcJson,
|
|
165
|
+
};
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
actions: {
|
|
169
|
+
'check-text': checkMethod,
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
// Alias `checkText` on get/has while keeping `methods.keys()` strictly kebab-case.
|
|
174
|
+
const methods = rpc.methods as Map<string, NormalizedPluginConsoleRpcMethod>;
|
|
175
|
+
const origGet = methods.get.bind(methods);
|
|
176
|
+
const origHas = methods.has.bind(methods);
|
|
177
|
+
const normalizeKey = (key: string): string => (key === 'checkText' ? 'check-text' : key);
|
|
178
|
+
methods.get = (key: string) => origGet(normalizeKey(key));
|
|
179
|
+
methods.has = (key: string) => origHas(normalizeKey(key));
|
|
180
|
+
|
|
181
|
+
return rpc;
|
|
182
|
+
}
|
package/src/engine.ts
CHANGED
|
@@ -13,9 +13,11 @@ import {
|
|
|
13
13
|
maxSeverity,
|
|
14
14
|
type Action,
|
|
15
15
|
type Direction,
|
|
16
|
+
type ExtractedImage,
|
|
16
17
|
type MergedResult,
|
|
17
18
|
type ModerationConfig,
|
|
18
19
|
type ProviderResult,
|
|
20
|
+
type ScanContext,
|
|
19
21
|
type ScanInput,
|
|
20
22
|
type Severity,
|
|
21
23
|
} from './types.js';
|
|
@@ -59,6 +61,47 @@ export class ModerationEngine {
|
|
|
59
61
|
return this.#config;
|
|
60
62
|
}
|
|
61
63
|
|
|
64
|
+
get providers(): readonly ModerationProvider[] {
|
|
65
|
+
return this.#providers;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
get sensitivity(): string {
|
|
69
|
+
const local = this.#config.sources.find((source) => source.type === 'local');
|
|
70
|
+
if (local && local.type === 'local') return local.defaultSeverity;
|
|
71
|
+
return this.#config.onError === 'closed' ? 'strict' : 'medium';
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
get pendingReviewsCount(): number {
|
|
75
|
+
return this.groupReviewQueue.pendingCount;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
async moderate(input: {
|
|
79
|
+
readonly text: string;
|
|
80
|
+
readonly direction?: Direction;
|
|
81
|
+
readonly images?: readonly ExtractedImage[];
|
|
82
|
+
readonly context?: Partial<ScanContext>;
|
|
83
|
+
}): Promise<MergedResult & { readonly passed: boolean; readonly actions: readonly Action[] }> {
|
|
84
|
+
const direction = input.direction ?? 'inbound';
|
|
85
|
+
const merged = await this.scan({
|
|
86
|
+
text: input.text,
|
|
87
|
+
images: input.images ?? [],
|
|
88
|
+
direction,
|
|
89
|
+
context: {
|
|
90
|
+
adapter: input.context?.adapter ?? 'console',
|
|
91
|
+
endpoint: input.context?.endpoint ?? 'dry-run',
|
|
92
|
+
conversationKind: input.context?.conversationKind ?? 'private',
|
|
93
|
+
conversationId: input.context?.conversationId ?? 'dry-run',
|
|
94
|
+
...(input.context?.sender !== undefined ? { sender: input.context.sender } : {}),
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
const actions = this.#config.actions[merged.severity] ?? [];
|
|
98
|
+
return Object.freeze({
|
|
99
|
+
...merged,
|
|
100
|
+
passed: merged.severity === 'pass',
|
|
101
|
+
actions: Object.freeze([...actions]),
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
|
|
62
105
|
configure(raw: unknown): void {
|
|
63
106
|
this.#config = resolveModerationConfig(raw);
|
|
64
107
|
this.#providers = createProviders(this.#config, {
|
|
@@ -36,6 +36,14 @@ export class GroupReviewQueue {
|
|
|
36
36
|
this.#moderator = moderator;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
+
get pendingCount(): number {
|
|
40
|
+
let total = 0;
|
|
41
|
+
for (const scene of this.#scenes.values()) {
|
|
42
|
+
total += scene.pending.length;
|
|
43
|
+
}
|
|
44
|
+
return total;
|
|
45
|
+
}
|
|
46
|
+
|
|
39
47
|
/** Bind detached review work to its actual Adapter owner, not a replaceable generation gate. */
|
|
40
48
|
captureSource(input: GroupReviewSourceInput): CapturedGroupReviewSource {
|
|
41
49
|
const source = { owner: input.owner, abort: new AbortController() };
|
package/src/index.ts
CHANGED
|
@@ -46,3 +46,13 @@ export { BUILTIN_LEXICON, mergeLexiconEntries } from './providers/builtin-lexico
|
|
|
46
46
|
export type { LexiconEntry, LexiconSeverity } from './providers/builtin-lexicon.js';
|
|
47
47
|
export { HttpModerationProvider, parseHttpResult, isPublicHttpUrl } from './providers/http.js';
|
|
48
48
|
export { createProviders } from './providers/registry.js';
|
|
49
|
+
export {
|
|
50
|
+
createModerationConsoleRpc,
|
|
51
|
+
MODERATION_CONSOLE_PAGE,
|
|
52
|
+
MODERATION_READ_PERMISSION,
|
|
53
|
+
} from './console.js';
|
|
54
|
+
export type {
|
|
55
|
+
ModerationCheckTextResult,
|
|
56
|
+
ModerationConsoleStatus,
|
|
57
|
+
ModerationProviderStatusRow,
|
|
58
|
+
} from './console.js';
|