feat(feishu): add group message permission authorization

This commit is contained in:
xmanrui 2026-08-22 02:29:59 +08:00
parent 7b892c02f5
commit 7bf12628ce
17 changed files with 1581 additions and 258 deletions

View file

@ -14,6 +14,7 @@ export const FEISHU_ENDPOINTS = Object.freeze({
status: "connection.status",
beginProvisioning: "provision.begin",
beginCallbackRepair: "bot.callback-repair.begin",
beginGroupMessagePermission: "bot.group-message-permission.begin",
pollProvisioning: "provision.poll",
cancelProvisioning: "provision.cancel",
bindCredentials: "bot.bind-credentials",
@ -31,6 +32,7 @@ export const FEISHU_ENDPOINTS = Object.freeze({
export const FEISHU_REGISTRATION_OPERATIONS = Object.freeze({
PROVISION: "provision",
CALLBACK_REPAIR: "callback_repair",
GROUP_MESSAGE_PERMISSION: "group_message_permission",
});
const CONNECTION_STATES = new Set([
@ -82,9 +84,18 @@ function clamp(value, min, max, fallback) {
}
function normalizeRegistrationOperation(value) {
return value === FEISHU_REGISTRATION_OPERATIONS.CALLBACK_REPAIR
? FEISHU_REGISTRATION_OPERATIONS.CALLBACK_REPAIR
: FEISHU_REGISTRATION_OPERATIONS.PROVISION;
if (value === FEISHU_REGISTRATION_OPERATIONS.CALLBACK_REPAIR) {
return FEISHU_REGISTRATION_OPERATIONS.CALLBACK_REPAIR;
}
if (value === FEISHU_REGISTRATION_OPERATIONS.GROUP_MESSAGE_PERMISSION) {
return FEISHU_REGISTRATION_OPERATIONS.GROUP_MESSAGE_PERMISSION;
}
return FEISHU_REGISTRATION_OPERATIONS.PROVISION;
}
function isTargetedAppUpdate(operation) {
return operation === FEISHU_REGISTRATION_OPERATIONS.CALLBACK_REPAIR
|| operation === FEISHU_REGISTRATION_OPERATIONS.GROUP_MESSAGE_PERMISSION;
}
export function unwrapRpcResult(result) {
@ -117,8 +128,8 @@ export function normalizeProvisioning(value, now = Date.now()) {
const expireIn = clamp(source.expireIn, 1, 60 * 60, 5 * 60);
const operation = normalizeRegistrationOperation(source.operation);
const botId = optionalString(source.botId);
if (operation === FEISHU_REGISTRATION_OPERATIONS.CALLBACK_REPAIR && !botId) {
throw new Error("飞书服务返回的修复信息缺少 botId");
if (isTargetedAppUpdate(operation) && !botId) {
throw new Error("飞书服务返回的应用更新信息缺少 botId");
}
return {
attemptId,
@ -192,6 +203,7 @@ export function normalizeBotConnection(value, fallbackBotId) {
workspace: optionalString(value.workspace)?.slice(0, 4_096) ?? "",
agentPreset: normalizeAgentPresetId(value.agentPreset),
groupResponseMode: normalizeGroupResponseMode(value.groupResponseMode),
groupMessagePermissionGranted: value.groupMessagePermissionGranted === true,
bot: normalizeBot(value.bot),
health: normalizeHealth(value.health, connected),
error: normalizeError(value.error),