ForcePilot/backend/package/yuxi/channels/adapters/feishu/approval.py
Kris a6fa7245e5 feat(feishu): 完整实现飞书适配器核心模块
新增飞书机器人适配器全套功能,包括:
- 基础适配器入口与工具导出
- 消息格式化、卡片渲染、回复调度逻辑
- 会话ID生成、模型覆盖策略
- 消息发送缓存、顺序队列管理
- 飞书签名验证、加解密webhook请求
- 审批权限校验、机器人菜单事件处理
- 文档评论、钉消息、语音转码处理
- 静态/动态目录管理、子代理生命周期管理
- 各类工具集:聊天、云盘、文档、知识库API封装
2026-05-12 00:43:59 +08:00

42 lines
1.2 KiB
Python

from __future__ import annotations
import re
from dataclasses import dataclass
from typing import Any
from yuxi.utils.logging_config import logger
_APPROVER_ID_RE = re.compile(r"^ou_[a-f0-9]+$", re.IGNORECASE)
@dataclass
class FeishuApprovalAdapter:
approvers: list[str]
timeout_s: float = 300.0
def normalize_approver_id(self, raw_id: str) -> str | None:
cleaned = raw_id.strip()
if _APPROVER_ID_RE.match(cleaned):
return cleaned
if cleaned.startswith("on_"):
return cleaned
if cleaned.startswith("ou_"):
return cleaned
logger.debug("[FeishuApproval] Invalid approver ID format: %s", cleaned)
return None
def check_approval(self, open_id: str) -> bool:
for approver in self.approvers:
normalized = self.normalize_approver_id(approver)
if normalized and normalized == open_id:
return True
return False
@classmethod
def from_config(cls, config: dict[str, Any]) -> FeishuApprovalAdapter:
approval_cfg = config.get("approval", {}) or {}
return cls(
approvers=approval_cfg.get("approvers", []),
timeout_s=float(approval_cfg.get("timeout", 300)),
)