@zhin.js/core 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -9
- package/lib/adapter.d.ts +20 -18
- package/lib/adapter.d.ts.map +1 -1
- package/lib/adapter.js +64 -60
- package/lib/adapter.js.map +1 -1
- package/lib/agent-prompt.d.ts +3 -3
- package/lib/agent-prompt.d.ts.map +1 -1
- package/lib/built/adapter-process.d.ts +5 -4
- package/lib/built/adapter-process.d.ts.map +1 -1
- package/lib/built/adapter-process.js +6 -5
- package/lib/built/adapter-process.js.map +1 -1
- package/lib/built/agent-preset.d.ts +1 -1
- package/lib/built/agent-preset.d.ts.map +1 -1
- package/lib/built/agent-preset.js +1 -1
- package/lib/built/agent-preset.js.map +1 -1
- package/lib/built/ai-trigger.d.ts +13 -13
- package/lib/built/ai-trigger.d.ts.map +1 -1
- package/lib/built/ai-trigger.js +37 -49
- package/lib/built/ai-trigger.js.map +1 -1
- package/lib/built/authorization.d.ts +11 -0
- package/lib/built/authorization.d.ts.map +1 -0
- package/lib/built/authorization.js +53 -0
- package/lib/built/authorization.js.map +1 -0
- package/lib/built/common-adapter-tools.d.ts +21 -14
- package/lib/built/common-adapter-tools.d.ts.map +1 -1
- package/lib/built/common-adapter-tools.js +58 -41
- package/lib/built/common-adapter-tools.js.map +1 -1
- package/lib/built/connect-endpoint-instance.d.ts +18 -0
- package/lib/built/connect-endpoint-instance.d.ts.map +1 -0
- package/lib/built/connect-endpoint-instance.js +41 -0
- package/lib/built/connect-endpoint-instance.js.map +1 -0
- package/lib/built/database.d.ts +4 -0
- package/lib/built/database.d.ts.map +1 -1
- package/lib/built/database.js +8 -0
- package/lib/built/database.js.map +1 -1
- package/lib/built/dispatcher.d.ts.map +1 -1
- package/lib/built/dispatcher.js +3 -0
- package/lib/built/dispatcher.js.map +1 -1
- package/lib/built/endpoint-lifecycle.d.ts +28 -0
- package/lib/built/endpoint-lifecycle.d.ts.map +1 -0
- package/lib/built/endpoint-lifecycle.js +36 -0
- package/lib/built/endpoint-lifecycle.js.map +1 -0
- package/lib/built/inbound-pipeline.d.ts +38 -0
- package/lib/built/inbound-pipeline.d.ts.map +1 -0
- package/lib/built/inbound-pipeline.js +65 -0
- package/lib/built/inbound-pipeline.js.map +1 -0
- package/lib/built/login-assist.d.ts +4 -4
- package/lib/built/login-assist.d.ts.map +1 -1
- package/lib/built/login-assist.js +5 -5
- package/lib/built/login-assist.js.map +1 -1
- package/lib/built/message-enrich.d.ts +40 -0
- package/lib/built/message-enrich.d.ts.map +1 -0
- package/lib/built/message-enrich.js +84 -0
- package/lib/built/message-enrich.js.map +1 -0
- package/lib/built/message-filter.d.ts +4 -4
- package/lib/built/message-filter.d.ts.map +1 -1
- package/lib/built/message-filter.js +4 -4
- package/lib/built/message-filter.js.map +1 -1
- package/lib/built/permission.d.ts +3 -2
- package/lib/built/permission.d.ts.map +1 -1
- package/lib/built/permission.js +38 -45
- package/lib/built/permission.js.map +1 -1
- package/lib/built/permit-check.d.ts +8 -0
- package/lib/built/permit-check.d.ts.map +1 -0
- package/lib/built/permit-check.js +36 -0
- package/lib/built/permit-check.js.map +1 -0
- package/lib/built/permit-parse.d.ts +17 -0
- package/lib/built/permit-parse.d.ts.map +1 -0
- package/lib/built/permit-parse.js +33 -0
- package/lib/built/permit-parse.js.map +1 -0
- package/lib/built/platform-permit.d.ts +21 -0
- package/lib/built/platform-permit.d.ts.map +1 -0
- package/lib/built/platform-permit.js +67 -0
- package/lib/built/platform-permit.js.map +1 -0
- package/lib/built/prepend-quote-context.d.ts +2 -2
- package/lib/built/prepend-quote-context.d.ts.map +1 -1
- package/lib/built/prepend-quote-context.js +11 -11
- package/lib/built/prepend-quote-context.js.map +1 -1
- package/lib/built/queue-im-field-contract.d.ts +1 -1
- package/lib/built/queue-im-field-contract.d.ts.map +1 -1
- package/lib/built/queue-im-field-contract.js +3 -3
- package/lib/built/queue-im-field-contract.js.map +1 -1
- package/lib/built/roles.d.ts +4 -4
- package/lib/built/roles.d.ts.map +1 -1
- package/lib/built/roles.js +4 -4
- package/lib/built/roles.js.map +1 -1
- package/lib/built/tool.d.ts +12 -12
- package/lib/built/tool.d.ts.map +1 -1
- package/lib/built/tool.js +38 -22
- package/lib/built/tool.js.map +1 -1
- package/lib/command.d.ts.map +1 -1
- package/lib/command.js +11 -2
- package/lib/command.js.map +1 -1
- package/lib/component.js +1 -1
- package/lib/component.js.map +1 -1
- package/lib/endpoint-capabilities.d.ts +45 -0
- package/lib/endpoint-capabilities.d.ts.map +1 -0
- package/lib/endpoint-capabilities.js +56 -0
- package/lib/endpoint-capabilities.js.map +1 -0
- package/lib/endpoint.d.ts +15 -0
- package/lib/endpoint.d.ts.map +1 -0
- package/lib/endpoint.js +2 -0
- package/lib/endpoint.js.map +1 -0
- package/lib/errors.d.ts +2 -2
- package/lib/errors.d.ts.map +1 -1
- package/lib/errors.js +4 -4
- package/lib/errors.js.map +1 -1
- package/lib/index.d.ts +12 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +9 -3
- package/lib/index.js.map +1 -1
- package/lib/message.d.ts +3 -3
- package/lib/message.d.ts.map +1 -1
- package/lib/notice.d.ts +4 -3
- package/lib/notice.d.ts.map +1 -1
- package/lib/notice.js.map +1 -1
- package/lib/plugin-context.d.ts +19 -0
- package/lib/plugin-context.d.ts.map +1 -0
- package/lib/plugin-context.js +51 -0
- package/lib/plugin-context.js.map +1 -0
- package/lib/plugin.d.ts +7 -10
- package/lib/plugin.d.ts.map +1 -1
- package/lib/plugin.js +27 -50
- package/lib/plugin.js.map +1 -1
- package/lib/prompt.d.ts.map +1 -1
- package/lib/prompt.js +8 -4
- package/lib/prompt.js.map +1 -1
- package/lib/request.d.ts +3 -3
- package/lib/request.d.ts.map +1 -1
- package/lib/tool-zod.d.ts +3 -2
- package/lib/tool-zod.d.ts.map +1 -1
- package/lib/tool-zod.js +3 -3
- package/lib/tool-zod.js.map +1 -1
- package/lib/types.d.ts +19 -59
- package/lib/types.d.ts.map +1 -1
- package/lib/utils.d.ts.map +1 -1
- package/lib/utils.js +2 -1
- package/lib/utils.js.map +1 -1
- package/package.json +6 -6
- package/lib/bot.d.ts +0 -38
- package/lib/bot.d.ts.map +0 -1
- package/lib/bot.js +0 -2
- package/lib/bot.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-trigger.d.ts","sourceRoot":"","sources":["../../src/built/ai-trigger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EAEV,MAAM,aAAa,CAAC;AAMrB,OAAO,EACL,KAAK,UAAU,EAEhB,MAAM,YAAY,CAAC;AAMpB;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,oBAAoB;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAEpB,0BAA0B;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,sBAAsB;IACtB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,gBAAgB;IAChB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAEpB,0BAA0B;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B,wBAAwB;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,gBAAgB;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,aAAa;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB,4BAA4B;IAC5B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB,6CAA6C;IAC7C,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,2CAA2C;AAC3C,MAAM,WAAW,gBAAgB;IAC/B,
|
|
1
|
+
{"version":3,"file":"ai-trigger.d.ts","sourceRoot":"","sources":["../../src/built/ai-trigger.ts"],"names":[],"mappings":"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"}
|
package/lib/built/ai-trigger.js
CHANGED
|
@@ -31,8 +31,8 @@ export const DEFAULT_AI_TRIGGER_CONFIG = {
|
|
|
31
31
|
// ============================================================================
|
|
32
32
|
// 工具函数
|
|
33
33
|
// ============================================================================
|
|
34
|
-
function normalizeAtIds(
|
|
35
|
-
const ids =
|
|
34
|
+
function normalizeAtIds(endpointAtIds) {
|
|
35
|
+
const ids = endpointAtIds?.length ? endpointAtIds : [];
|
|
36
36
|
return [...new Set(ids.map((id) => String(id)).filter(Boolean))];
|
|
37
37
|
}
|
|
38
38
|
function segmentAtUserId(seg) {
|
|
@@ -43,33 +43,33 @@ function segmentAtUserId(seg) {
|
|
|
43
43
|
const raw = record.user_id ?? record.qq ?? record.id;
|
|
44
44
|
return raw == null ? '' : String(raw);
|
|
45
45
|
}
|
|
46
|
-
function
|
|
46
|
+
function isAtSegmentForEndpoint(seg, endpointIds) {
|
|
47
47
|
if (seg.type !== 'at' && seg.type !== 'mention')
|
|
48
48
|
return false;
|
|
49
49
|
const uid = segmentAtUserId(seg);
|
|
50
|
-
return uid !== '' &&
|
|
50
|
+
return uid !== '' && endpointIds.includes(uid);
|
|
51
51
|
}
|
|
52
|
-
function
|
|
53
|
-
for (const id of
|
|
52
|
+
function textMentionsEndpoint(text, endpointIds) {
|
|
53
|
+
for (const id of endpointIds) {
|
|
54
54
|
const re = new RegExp(`@${id.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}(?:\\s|$|[\\u200b\\uFEFF])`);
|
|
55
55
|
if (re.test(text))
|
|
56
56
|
return true;
|
|
57
57
|
}
|
|
58
58
|
return false;
|
|
59
59
|
}
|
|
60
|
-
function
|
|
60
|
+
function stripTextAtEndpoint(text, endpointIds) {
|
|
61
61
|
let result = text;
|
|
62
|
-
for (const id of
|
|
62
|
+
for (const id of endpointIds) {
|
|
63
63
|
const re = new RegExp(`@${id.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}(?:\\s|[\\u200b\\uFEFF])?`, 'g');
|
|
64
64
|
result = result.replace(re, '');
|
|
65
65
|
}
|
|
66
66
|
return result;
|
|
67
67
|
}
|
|
68
68
|
/**
|
|
69
|
-
* 收集用于 @ 匹配的
|
|
69
|
+
* 收集用于 @ 匹配的 Endpoint 标识符
|
|
70
70
|
*/
|
|
71
|
-
export function
|
|
72
|
-
const ids = new Set([String(message.$
|
|
71
|
+
export function collectEndpointAtIds(message, extraIds) {
|
|
72
|
+
const ids = new Set([String(message.$endpoint)]);
|
|
73
73
|
for (const id of extraIds ?? []) {
|
|
74
74
|
if (id)
|
|
75
75
|
ids.add(String(id));
|
|
@@ -77,15 +77,15 @@ export function collectBotAtIds(message, extraIds) {
|
|
|
77
77
|
return [...ids];
|
|
78
78
|
}
|
|
79
79
|
/**
|
|
80
|
-
* 检查消息是否 @
|
|
80
|
+
* 检查消息是否 @ 了 Endpoint
|
|
81
81
|
*/
|
|
82
|
-
export function
|
|
83
|
-
const
|
|
84
|
-
if (message.$content.some((seg) =>
|
|
82
|
+
export function isAtEndpoint(message, endpointAtIds) {
|
|
83
|
+
const endpointIds = normalizeAtIds(endpointAtIds?.length ? endpointAtIds : collectEndpointAtIds(message));
|
|
84
|
+
if (message.$content.some((seg) => isAtSegmentForEndpoint(seg, endpointIds))) {
|
|
85
85
|
return true;
|
|
86
86
|
}
|
|
87
87
|
for (const seg of message.$content) {
|
|
88
|
-
if (seg.type === 'text' && seg.data?.text &&
|
|
88
|
+
if (seg.type === 'text' && seg.data?.text && textMentionsEndpoint(seg.data.text, endpointIds)) {
|
|
89
89
|
return true;
|
|
90
90
|
}
|
|
91
91
|
}
|
|
@@ -118,23 +118,23 @@ export function parseRichMediaContent(content) {
|
|
|
118
118
|
}
|
|
119
119
|
}
|
|
120
120
|
/**
|
|
121
|
-
* 移除 @
|
|
121
|
+
* 移除 @ Endpoint 的部分
|
|
122
122
|
*/
|
|
123
|
-
export function
|
|
124
|
-
const
|
|
123
|
+
export function removeAtEndpoint(message, endpointAtIds) {
|
|
124
|
+
const endpointIds = normalizeAtIds(endpointAtIds?.length ? endpointAtIds : collectEndpointAtIds(message));
|
|
125
125
|
return message.$content
|
|
126
|
-
.filter((seg) => !
|
|
126
|
+
.filter((seg) => !isAtSegmentForEndpoint(seg, endpointIds))
|
|
127
127
|
.map((seg) => {
|
|
128
128
|
if (seg.type !== 'text' || !seg.data?.text)
|
|
129
129
|
return seg;
|
|
130
|
-
const stripped =
|
|
130
|
+
const stripped = stripTextAtEndpoint(seg.data.text, endpointIds).trim();
|
|
131
131
|
if (!stripped)
|
|
132
132
|
return null;
|
|
133
133
|
return { ...seg, data: { ...seg.data, text: stripped } };
|
|
134
134
|
})
|
|
135
135
|
.filter((seg) => seg != null);
|
|
136
136
|
}
|
|
137
|
-
function
|
|
137
|
+
function normalizeEndpointIdList(input) {
|
|
138
138
|
if (Array.isArray(input))
|
|
139
139
|
return input.map((v) => String(v)).filter(Boolean);
|
|
140
140
|
if (typeof input === 'string') {
|
|
@@ -142,15 +142,15 @@ function normalizeBotIdList(input) {
|
|
|
142
142
|
}
|
|
143
143
|
return [];
|
|
144
144
|
}
|
|
145
|
-
function
|
|
146
|
-
if (!
|
|
145
|
+
function collectEndpointTrustedIds(endpointConfig) {
|
|
146
|
+
if (!endpointConfig)
|
|
147
147
|
return [];
|
|
148
|
-
return
|
|
148
|
+
return normalizeEndpointIdList(endpointConfig.trusted);
|
|
149
149
|
}
|
|
150
150
|
/**
|
|
151
|
-
* 解析发送者角色集合(IM 群角色 + trigger +
|
|
151
|
+
* 解析发送者角色集合(IM 群角色 + trigger + endpoints[].$config)
|
|
152
152
|
*/
|
|
153
|
-
export function resolveSenderRoles(message, config,
|
|
153
|
+
export function resolveSenderRoles(message, config, endpointConfig) {
|
|
154
154
|
const scope = message.$channel?.type || 'private';
|
|
155
155
|
// process 适配器(stdin/本机 CLI):操作者即宿主用户,恒为 master
|
|
156
156
|
if (message.$adapter === 'process') {
|
|
@@ -160,36 +160,24 @@ export function resolveSenderRoles(message, config, botConfig) {
|
|
|
160
160
|
};
|
|
161
161
|
}
|
|
162
162
|
const senderId = String(message.$sender.id);
|
|
163
|
-
const senderPermissions = message.$sender.permissions || [];
|
|
164
163
|
const roles = [];
|
|
165
164
|
const masters = config.masters || [];
|
|
166
165
|
const globalTrusted = config.trusted || [];
|
|
167
|
-
const cfg =
|
|
168
|
-
const
|
|
169
|
-
const
|
|
170
|
-
if (masters.includes(senderId) || (
|
|
166
|
+
const cfg = endpointConfig;
|
|
167
|
+
const endpointMaster = cfg?.master != null ? String(cfg.master) : undefined;
|
|
168
|
+
const endpointTrustedIds = collectEndpointTrustedIds(cfg);
|
|
169
|
+
if (masters.includes(senderId) || (endpointMaster != null && senderId === endpointMaster)) {
|
|
171
170
|
roles.push('master');
|
|
172
171
|
}
|
|
173
|
-
else if (globalTrusted.includes(senderId) ||
|
|
172
|
+
else if (globalTrusted.includes(senderId) || endpointTrustedIds.includes(senderId)) {
|
|
174
173
|
roles.push('trusted');
|
|
175
174
|
}
|
|
176
|
-
const isGroupOwner = senderPermissions.includes('owner')
|
|
177
|
-
|| senderPermissions.includes('group_owner')
|
|
178
|
-
|| message.$sender?.role === 'owner';
|
|
179
|
-
const isGroupAdmin = isGroupOwner
|
|
180
|
-
|| senderPermissions.includes('admin')
|
|
181
|
-
|| senderPermissions.includes('group_admin')
|
|
182
|
-
|| message.$sender?.role === 'admin';
|
|
183
|
-
if (isGroupOwner)
|
|
184
|
-
roles.push('group_owner');
|
|
185
|
-
else if (isGroupAdmin)
|
|
186
|
-
roles.push('group_admin');
|
|
187
175
|
return {
|
|
188
176
|
scope,
|
|
189
177
|
roles: normalizeSenderRoles(roles),
|
|
190
178
|
};
|
|
191
179
|
}
|
|
192
|
-
/** 从 IM 消息生成 sessionId(platform:
|
|
180
|
+
/** 从 IM 消息生成 sessionId(platform:endpointId:type:sceneId) */
|
|
193
181
|
export function resolveIMSessionIdFromMessage(message) {
|
|
194
182
|
const scope = (message.$channel?.type || 'private');
|
|
195
183
|
const sceneId = scope === 'private'
|
|
@@ -197,7 +185,7 @@ export function resolveIMSessionIdFromMessage(message) {
|
|
|
197
185
|
: String(message.$channel?.id || message.$sender.id);
|
|
198
186
|
return resolveIMSessionId({
|
|
199
187
|
platform: message.$adapter,
|
|
200
|
-
|
|
188
|
+
endpointId: message.$endpoint,
|
|
201
189
|
scope,
|
|
202
190
|
sceneId,
|
|
203
191
|
});
|
|
@@ -207,7 +195,7 @@ export function resolveIMSessionIdFromMessage(message) {
|
|
|
207
195
|
*/
|
|
208
196
|
export function shouldTriggerAI(message, config, options) {
|
|
209
197
|
const fullConfig = { ...DEFAULT_AI_TRIGGER_CONFIG, ...config };
|
|
210
|
-
const
|
|
198
|
+
const endpointAtIds = collectEndpointAtIds(message, options?.endpointAtIds);
|
|
211
199
|
if (!fullConfig.enabled) {
|
|
212
200
|
return { triggered: false, content: '' };
|
|
213
201
|
}
|
|
@@ -229,8 +217,8 @@ export function shouldTriggerAI(message, config, options) {
|
|
|
229
217
|
}
|
|
230
218
|
}
|
|
231
219
|
// 2. 检查 @ 触发(群/频道主路径;仅 @ 无正文时也触发,由 Agent 处理空输入)
|
|
232
|
-
if (fullConfig.respondToAt &&
|
|
233
|
-
const content =
|
|
220
|
+
if (fullConfig.respondToAt && isAtEndpoint(message, endpointAtIds)) {
|
|
221
|
+
const content = removeAtEndpoint(message, endpointAtIds);
|
|
234
222
|
return {
|
|
235
223
|
triggered: true,
|
|
236
224
|
content: content.length ? segment.toString(content).trim() : '',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-trigger.js","sourceRoot":"","sources":["../../src/built/ai-trigger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EACL,kBAAkB,GAEnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAEL,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAmEpB,+EAA+E;AAC/E,OAAO;AACP,+EAA+E;AAE/E,MAAM,CAAC,MAAM,yBAAyB,GAA8B;IAClE,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC;IAC7B,WAAW,EAAE,IAAI;IACjB,gBAAgB,EAAE,IAAI;IACtB,QAAQ,EAAE,EAAE;IACZ,cAAc,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IAC/B,OAAO,EAAE,KAAK;IACd,eAAe,EAAE,EAAE;IACnB,aAAa,EAAE,oBAAoB;IACnC,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,EAAE;IACX,qBAAqB,EAAE,IAAI;CAC5B,CAAC;AAEF,+EAA+E;AAC/E,OAAO;AACP,+EAA+E;AAE/E,SAAS,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"ai-trigger.js","sourceRoot":"","sources":["../../src/built/ai-trigger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 授权重算 — ConfigFeature + Message 为单一真相源($sender.isMaster/isTrusted 为 enrich 快照)
|
|
3
|
+
*/
|
|
4
|
+
import type { Plugin } from '../plugin.js';
|
|
5
|
+
import type { Message } from '../message.js';
|
|
6
|
+
import { type SenderRolesResult } from './ai-trigger.js';
|
|
7
|
+
/**
|
|
8
|
+
* 从 ConfigFeature + Message 重算发送者角色(含群角色与 master/trusted)
|
|
9
|
+
*/
|
|
10
|
+
export declare function resolveSubjectRoles(plugin: Plugin, message: Message<any>): SenderRolesResult;
|
|
11
|
+
//# sourceMappingURL=authorization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authorization.d.ts","sourceRoot":"","sources":["../../src/built/authorization.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AAsEzB;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAI5F"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { mergeAITriggerConfig, resolveSenderRoles, } from './ai-trigger.js';
|
|
2
|
+
import { formatCompact, Logger } from '@zhin.js/logger';
|
|
3
|
+
const logger = new Logger(null, 'Authorization');
|
|
4
|
+
function findEndpointEntryFromConfig(config, adapter, endpointId) {
|
|
5
|
+
const endpoints = config.endpoints;
|
|
6
|
+
if (!Array.isArray(endpoints))
|
|
7
|
+
return undefined;
|
|
8
|
+
return endpoints.find((b) => b.context === adapter && String(b.name) === endpointId);
|
|
9
|
+
}
|
|
10
|
+
function readTriggerConfig(plugin) {
|
|
11
|
+
const root = plugin.root ?? plugin;
|
|
12
|
+
try {
|
|
13
|
+
const ai = root.inject('ai');
|
|
14
|
+
if (ai?.getTriggerConfig)
|
|
15
|
+
return ai.getTriggerConfig();
|
|
16
|
+
}
|
|
17
|
+
catch (e) {
|
|
18
|
+
logger.debug(formatCompact({ auth: 'trigger_config_fallback', reason: 'ai_not_ready' }));
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const configSvc = root.inject('config');
|
|
22
|
+
const primary = configSvc?.getPrimary?.();
|
|
23
|
+
return primary?.ai?.trigger ?? {};
|
|
24
|
+
}
|
|
25
|
+
catch (e) {
|
|
26
|
+
logger.debug(formatCompact({ auth: 'trigger_config_read_error' }));
|
|
27
|
+
return {};
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function readEndpointConfig(plugin, message) {
|
|
31
|
+
const root = plugin.root ?? plugin;
|
|
32
|
+
try {
|
|
33
|
+
const configSvc = root.inject('config');
|
|
34
|
+
const primary = configSvc?.getPrimary?.();
|
|
35
|
+
if (!primary)
|
|
36
|
+
return undefined;
|
|
37
|
+
const entry = findEndpointEntryFromConfig(primary, String(message.$adapter), String(message.$endpoint));
|
|
38
|
+
return entry;
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
logger.debug(formatCompact({ auth: 'endpoint_config_read_error' }));
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 从 ConfigFeature + Message 重算发送者角色(含群角色与 master/trusted)
|
|
47
|
+
*/
|
|
48
|
+
export function resolveSubjectRoles(plugin, message) {
|
|
49
|
+
const triggerConfig = mergeAITriggerConfig(readTriggerConfig(plugin));
|
|
50
|
+
const endpointConfig = readEndpointConfig(plugin, message);
|
|
51
|
+
return resolveSenderRoles(message, triggerConfig, endpointConfig);
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=authorization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authorization.js","sourceRoot":"","sources":["../../src/built/authorization.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,oBAAoB,EACpB,kBAAkB,GAGnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;AAejD,SAAS,2BAA2B,CAClC,MAAqB,EACrB,OAAe,EACf,UAAkB;IAElB,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAChD,OAAO,SAAS,CAAC,IAAI,CACnB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,UAAU,CAC9D,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAc;IACvC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAA6D,CAAC;QACzF,IAAI,EAAE,EAAE,gBAAgB;YAAE,OAAO,EAAE,CAAC,gBAAgB,EAAE,CAAC;IACzD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAEzB,CAAC;QACd,MAAM,OAAO,GAAG,SAAS,EAAE,UAAU,EAAE,EAA+B,CAAC;QACvE,OAAO,OAAO,EAAE,EAAE,EAAE,OAAO,IAAI,EAAE,CAAC;IACpC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE,CAAC,CAAC,CAAC;QACnE,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAc,EAAE,OAAqB;IAC/D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAEzB,CAAC;QACd,MAAM,OAAO,GAAG,SAAS,EAAE,UAAU,EAAE,EAA+B,CAAC;QACvE,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QAC/B,MAAM,KAAK,GAAG,2BAA2B,CACvC,OAAO,EACP,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EACxB,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAC1B,CAAC;QACF,OAAO,KAA4C,CAAC;IACtD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC,CAAC,CAAC;QACpE,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAc,EAAE,OAAqB;IACvE,MAAM,aAAa,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;IACtE,MAAM,cAAc,GAAG,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3D,OAAO,kBAAkB,CAAC,OAAO,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -12,29 +12,29 @@
|
|
|
12
12
|
* tools.forEach(t => this.addTool(t));
|
|
13
13
|
* // 另:包内 skills/<name>/SKILL.md 供 Agent 发现
|
|
14
14
|
*/
|
|
15
|
-
import type { Tool
|
|
15
|
+
import type { Tool } from '../types.js';
|
|
16
16
|
/**
|
|
17
17
|
* 群管理能力接口。
|
|
18
18
|
* Adapter 基类通过此接口声明方法签名,子类选择性覆写。
|
|
19
19
|
*/
|
|
20
20
|
export interface IGroupManagement {
|
|
21
|
-
kickMember?(
|
|
22
|
-
muteMember?(
|
|
23
|
-
setMemberNickname?(
|
|
24
|
-
setAdmin?(
|
|
25
|
-
listMembers?(
|
|
26
|
-
banMember?(
|
|
27
|
-
unbanMember?(
|
|
28
|
-
setGroupName?(
|
|
29
|
-
muteAll?(
|
|
30
|
-
getGroupInfo?(
|
|
21
|
+
kickMember?(endpointId: string, sceneId: string, userId: string): Promise<any>;
|
|
22
|
+
muteMember?(endpointId: string, sceneId: string, userId: string, duration?: number): Promise<any>;
|
|
23
|
+
setMemberNickname?(endpointId: string, sceneId: string, userId: string, nickname: string): Promise<any>;
|
|
24
|
+
setAdmin?(endpointId: string, sceneId: string, userId: string, enable?: boolean): Promise<any>;
|
|
25
|
+
listMembers?(endpointId: string, sceneId: string): Promise<any>;
|
|
26
|
+
banMember?(endpointId: string, sceneId: string, userId: string, reason?: string): Promise<any>;
|
|
27
|
+
unbanMember?(endpointId: string, sceneId: string, userId: string): Promise<any>;
|
|
28
|
+
setGroupName?(endpointId: string, sceneId: string, name: string): Promise<any>;
|
|
29
|
+
muteAll?(endpointId: string, sceneId: string, enable?: boolean): Promise<any>;
|
|
30
|
+
getGroupInfo?(endpointId: string, sceneId: string): Promise<any>;
|
|
31
31
|
}
|
|
32
32
|
export interface GroupMethodSpec {
|
|
33
33
|
method: keyof IGroupManagement;
|
|
34
34
|
toolSuffix: string;
|
|
35
35
|
description: string;
|
|
36
36
|
keywords: string[];
|
|
37
|
-
|
|
37
|
+
permit?: string;
|
|
38
38
|
extraParams: Record<string, {
|
|
39
39
|
type: string;
|
|
40
40
|
description: string;
|
|
@@ -49,7 +49,14 @@ export declare const GROUP_MANAGEMENT_SKILL_KEYWORDS: string[];
|
|
|
49
49
|
export interface GroupManagementToolFactory<T> {
|
|
50
50
|
(spec: GroupMethodSpec, prefix: string, execute: (args: Record<string, any>) => Promise<any>): T;
|
|
51
51
|
}
|
|
52
|
-
export declare function
|
|
52
|
+
export declare function defaultQqGroupPermitResolver(adapterPrefix: string): (logicalPerm: string) => string;
|
|
53
|
+
export interface CreateGroupManagementToolsOptions {
|
|
54
|
+
/** 将 GROUP_METHOD_SPECS 逻辑 perm(group_admin/group_owner)映射为 platform(...) 字符串 */
|
|
55
|
+
permitResolver?: (logicalPerm: string) => string | undefined;
|
|
56
|
+
/** 是否注册默认 QQ 系 group checker(默认 true) */
|
|
57
|
+
registerChecker?: boolean;
|
|
58
|
+
}
|
|
59
|
+
export declare function createGroupManagementTools(adapter: IGroupManagement, prefix: string, options?: CreateGroupManagementToolsOptions): Tool[];
|
|
53
60
|
export declare function createGroupManagementToolsRaw<T>(adapter: IGroupManagement, prefix: string, factory: GroupManagementToolFactory<T>): T[];
|
|
54
|
-
export declare function buildMethodArgs(method: keyof IGroupManagement,
|
|
61
|
+
export declare function buildMethodArgs(method: keyof IGroupManagement, endpointId: string, sceneId: string, rest: Record<string, any>): any[];
|
|
55
62
|
//# sourceMappingURL=common-adapter-tools.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common-adapter-tools.d.ts","sourceRoot":"","sources":["../../src/built/common-adapter-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"common-adapter-tools.d.ts","sourceRoot":"","sources":["../../src/built/common-adapter-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,13 +12,14 @@
|
|
|
12
12
|
* tools.forEach(t => this.addTool(t));
|
|
13
13
|
* // 另:包内 skills/<name>/SKILL.md 供 Agent 发现
|
|
14
14
|
*/
|
|
15
|
+
import { registerDefaultGroupPlatformPermitChecker } from './platform-permit.js';
|
|
15
16
|
export const GROUP_METHOD_SPECS = [
|
|
16
17
|
{
|
|
17
18
|
method: 'kickMember',
|
|
18
19
|
toolSuffix: 'kick_member',
|
|
19
20
|
description: '将成员踢出群/服务器。适用于严重违规、广告号等需要移除的场景。踢出后该成员将无法再进入群聊(部分平台可重新邀请)。如果只需要用户名而没有 user_id,请先调用 list_members 查询',
|
|
20
21
|
keywords: ['踢', 'kick', '移除', '踢出'],
|
|
21
|
-
|
|
22
|
+
permit: 'group_admin',
|
|
22
23
|
extraParams: {
|
|
23
24
|
user_id: { type: 'string', description: '目标用户 ID(如果只有昵称,先用 list_members 查询获取)' },
|
|
24
25
|
},
|
|
@@ -29,7 +30,7 @@ export const GROUP_METHOD_SPECS = [
|
|
|
29
30
|
toolSuffix: 'mute_member',
|
|
30
31
|
description: '禁言或解除禁言群成员。适用于违规发言、刷屏、骚扰他人等需要临时限制发言的场景。duration 单位为秒,传 0 表示解除禁言。默认禁言 10 分钟(600秒)。如果只有昵称而没有 user_id,请先调用 list_members 查询',
|
|
31
32
|
keywords: ['禁言', 'mute', '静音', '解除禁言', '解禁', '闭嘴'],
|
|
32
|
-
|
|
33
|
+
permit: 'group_admin',
|
|
33
34
|
extraParams: {
|
|
34
35
|
user_id: { type: 'string', description: '目标用户 ID(如果只有昵称,先用 list_members 查询获取)' },
|
|
35
36
|
duration: { type: 'number', description: '禁言时长(秒),0=解除禁言,默认600(10分钟)。常用值:60=1分钟, 600=10分钟, 3600=1小时, 86400=1天', default: 600 },
|
|
@@ -41,7 +42,7 @@ export const GROUP_METHOD_SPECS = [
|
|
|
41
42
|
toolSuffix: 'set_nickname',
|
|
42
43
|
description: '设置群成员的群昵称/名片。仅修改群内显示名称,不影响用户的全局昵称。如果只有昵称而没有 user_id,请先调用 list_members 查询',
|
|
43
44
|
keywords: ['昵称', '名片', 'nickname', 'card', '改名片'],
|
|
44
|
-
|
|
45
|
+
permit: 'group_admin',
|
|
45
46
|
extraParams: {
|
|
46
47
|
user_id: { type: 'string', description: '目标用户 ID(如果只有昵称,先用 list_members 查询获取)' },
|
|
47
48
|
nickname: { type: 'string', description: '新的群昵称/名片' },
|
|
@@ -53,7 +54,7 @@ export const GROUP_METHOD_SPECS = [
|
|
|
53
54
|
toolSuffix: 'set_admin',
|
|
54
55
|
description: '设置或取消群管理员。注意:此操作需要群主权限,普通管理员无法执行。enable=true 为设置管理员,enable=false 为取消管理员。如果只有昵称而没有 user_id,请先调用 list_members 查询',
|
|
55
56
|
keywords: ['管理员', 'admin', '设置管理', '取消管理', '提升管理', '撤销管理'],
|
|
56
|
-
|
|
57
|
+
permit: 'group_owner',
|
|
57
58
|
extraParams: {
|
|
58
59
|
user_id: { type: 'string', description: '目标用户 ID(如果只有昵称,先用 list_members 查询获取)' },
|
|
59
60
|
enable: { type: 'boolean', description: 'true=设置为管理员,false=取消管理员身份', default: true },
|
|
@@ -73,7 +74,7 @@ export const GROUP_METHOD_SPECS = [
|
|
|
73
74
|
toolSuffix: 'ban_member',
|
|
74
75
|
description: '永久封禁成员(拉入黑名单)。与踢人(kick)不同,封禁后该成员无法再加入群聊。适用于恶意用户、严重违规等需要永久禁止的场景。如果只有昵称而没有 user_id,请先调用 list_members 查询',
|
|
75
76
|
keywords: ['封禁', 'ban', '拉黑', '黑名单'],
|
|
76
|
-
|
|
77
|
+
permit: 'group_admin',
|
|
77
78
|
extraParams: {
|
|
78
79
|
user_id: { type: 'string', description: '目标用户 ID(如果只有昵称,先用 list_members 查询获取)' },
|
|
79
80
|
reason: { type: 'string', description: '封禁原因(将记录在封禁日志中)' },
|
|
@@ -85,7 +86,7 @@ export const GROUP_METHOD_SPECS = [
|
|
|
85
86
|
toolSuffix: 'unban_member',
|
|
86
87
|
description: '解除封禁,将成员从黑名单中移除。解除后该成员可以重新加入群聊。如果只有昵称而没有 user_id,请先调用 list_members 查询',
|
|
87
88
|
keywords: ['解封', 'unban', '解除封禁', '移出黑名单'],
|
|
88
|
-
|
|
89
|
+
permit: 'group_admin',
|
|
89
90
|
extraParams: {
|
|
90
91
|
user_id: { type: 'string', description: '目标用户 ID(如果只有昵称,先用 list_members 查询获取)' },
|
|
91
92
|
},
|
|
@@ -96,7 +97,7 @@ export const GROUP_METHOD_SPECS = [
|
|
|
96
97
|
toolSuffix: 'set_group_name',
|
|
97
98
|
description: '修改群/服务器名称。修改后所有成员立即可见新群名',
|
|
98
99
|
keywords: ['群名', '改名', 'group name', '修改群名'],
|
|
99
|
-
|
|
100
|
+
permit: 'group_admin',
|
|
100
101
|
extraParams: {
|
|
101
102
|
name: { type: 'string', description: '新群名称' },
|
|
102
103
|
},
|
|
@@ -107,7 +108,7 @@ export const GROUP_METHOD_SPECS = [
|
|
|
107
108
|
toolSuffix: 'mute_all',
|
|
108
109
|
description: '开启或关闭全员禁言。开启后除管理员外所有成员都无法发言。适用于紧急维护、重要通知、聊天秩序混乱等场景。enable=true 开启,enable=false 解除',
|
|
109
110
|
keywords: ['全员禁言', 'mute all', '全体禁言', '全体解禁'],
|
|
110
|
-
|
|
111
|
+
permit: 'group_admin',
|
|
111
112
|
extraParams: {
|
|
112
113
|
enable: { type: 'boolean', description: 'true=开启全员禁言,false=解除全员禁言', default: true },
|
|
113
114
|
},
|
|
@@ -129,26 +130,42 @@ export const GROUP_MANAGEMENT_SKILL_KEYWORDS = [
|
|
|
129
130
|
'群管理', '踢人', '禁言', '封禁', '管理员', '群名',
|
|
130
131
|
'成员', 'kick', 'mute', 'ban', 'admin', 'members',
|
|
131
132
|
];
|
|
132
|
-
export function
|
|
133
|
-
return
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
133
|
+
export function defaultQqGroupPermitResolver(adapterPrefix) {
|
|
134
|
+
return (logicalPerm) => `platform(${adapterPrefix},${logicalPerm})`;
|
|
135
|
+
}
|
|
136
|
+
function resolveSpecPermit(specPerm, prefix, permitResolver) {
|
|
137
|
+
if (!specPerm)
|
|
138
|
+
return undefined;
|
|
139
|
+
const resolved = permitResolver(specPerm);
|
|
140
|
+
return resolved ? [resolved] : undefined;
|
|
141
|
+
}
|
|
142
|
+
export function createGroupManagementTools(adapter, prefix, options = {}) {
|
|
143
|
+
const permitResolver = options.permitResolver ?? defaultQqGroupPermitResolver(prefix);
|
|
144
|
+
if (options.registerChecker !== false) {
|
|
145
|
+
registerDefaultGroupPlatformPermitChecker(prefix);
|
|
146
|
+
}
|
|
147
|
+
return createGroupManagementToolsRaw(adapter, prefix, (spec, prefix, execute) => {
|
|
148
|
+
const specPermissions = resolveSpecPermit(spec.permit, prefix, permitResolver);
|
|
149
|
+
return {
|
|
150
|
+
name: `${prefix}_${spec.toolSuffix}`,
|
|
151
|
+
description: `${spec.description} (${prefix})`,
|
|
152
|
+
parameters: {
|
|
153
|
+
type: 'object',
|
|
154
|
+
properties: {
|
|
155
|
+
endpoint_id: { type: 'string', description: 'Endpoint ID', contextKey: 'endpointId' },
|
|
156
|
+
scene_id: { type: 'string', description: '群/服务器 ID', contextKey: 'sceneId' },
|
|
157
|
+
...Object.fromEntries(Object.entries(spec.extraParams)),
|
|
158
|
+
},
|
|
159
|
+
required: ['endpoint_id', 'scene_id', ...(spec.extraRequired ?? [])],
|
|
142
160
|
},
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
}));
|
|
161
|
+
execute,
|
|
162
|
+
tags: ['group', 'management', prefix],
|
|
163
|
+
keywords: spec.keywords,
|
|
164
|
+
...(specPermissions ? { permissions: specPermissions } : {}),
|
|
165
|
+
scopes: ['group', 'channel'],
|
|
166
|
+
preExecutable: spec.preExecutable,
|
|
167
|
+
};
|
|
168
|
+
});
|
|
152
169
|
}
|
|
153
170
|
export function createGroupManagementToolsRaw(adapter, prefix, factory) {
|
|
154
171
|
const tools = [];
|
|
@@ -158,8 +175,8 @@ export function createGroupManagementToolsRaw(adapter, prefix, factory) {
|
|
|
158
175
|
continue;
|
|
159
176
|
const boundFn = fn.bind(adapter);
|
|
160
177
|
const execute = async (args) => {
|
|
161
|
-
const {
|
|
162
|
-
const methodArgs = buildMethodArgs(spec.method,
|
|
178
|
+
const { endpoint_id, scene_id, ...rest } = args;
|
|
179
|
+
const methodArgs = buildMethodArgs(spec.method, endpoint_id, scene_id, rest);
|
|
163
180
|
return boundFn.apply(adapter, methodArgs);
|
|
164
181
|
};
|
|
165
182
|
tools.push(factory(spec, prefix, execute));
|
|
@@ -169,19 +186,19 @@ export function createGroupManagementToolsRaw(adapter, prefix, factory) {
|
|
|
169
186
|
// ============================================================================
|
|
170
187
|
// 参数映射(method → 有序参数列表)
|
|
171
188
|
// ============================================================================
|
|
172
|
-
export function buildMethodArgs(method,
|
|
189
|
+
export function buildMethodArgs(method, endpointId, sceneId, rest) {
|
|
173
190
|
switch (method) {
|
|
174
|
-
case 'kickMember': return [
|
|
175
|
-
case 'muteMember': return [
|
|
176
|
-
case 'setMemberNickname': return [
|
|
177
|
-
case 'setAdmin': return [
|
|
178
|
-
case 'listMembers': return [
|
|
179
|
-
case 'banMember': return [
|
|
180
|
-
case 'unbanMember': return [
|
|
181
|
-
case 'setGroupName': return [
|
|
182
|
-
case 'muteAll': return [
|
|
183
|
-
case 'getGroupInfo': return [
|
|
184
|
-
default: return [
|
|
191
|
+
case 'kickMember': return [endpointId, sceneId, rest.user_id];
|
|
192
|
+
case 'muteMember': return [endpointId, sceneId, rest.user_id, rest.duration ?? 600];
|
|
193
|
+
case 'setMemberNickname': return [endpointId, sceneId, rest.user_id, rest.nickname];
|
|
194
|
+
case 'setAdmin': return [endpointId, sceneId, rest.user_id, rest.enable ?? true];
|
|
195
|
+
case 'listMembers': return [endpointId, sceneId];
|
|
196
|
+
case 'banMember': return [endpointId, sceneId, rest.user_id, rest.reason];
|
|
197
|
+
case 'unbanMember': return [endpointId, sceneId, rest.user_id];
|
|
198
|
+
case 'setGroupName': return [endpointId, sceneId, rest.name];
|
|
199
|
+
case 'muteAll': return [endpointId, sceneId, rest.enable ?? true];
|
|
200
|
+
case 'getGroupInfo': return [endpointId, sceneId];
|
|
201
|
+
default: return [endpointId, sceneId, ...Object.values(rest)];
|
|
185
202
|
}
|
|
186
203
|
}
|
|
187
204
|
//# sourceMappingURL=common-adapter-tools.js.map
|