UNPKG

autosnippet

Version:

Extract code patterns into a knowledge base for AI coding assistants

92 lines (91 loc) 2.72 kB
/** * LarkTransport — 飞书消息传输层 * * 职责: 将飞书 SDK 的原始消息格式转换为统一 AgentMessage, * 并把 Agent 的回复写回飞书。 * * 架构位置: * 飞书 WS Event → LarkTransport.receive(rawEvent) * → 解析文本/附件 → AgentMessage.fromLark(...) * → IntentClassifier.classify(text) * → 路由到 Bot Agent (服务端) 或 IDE Agent (VSCode) * → 回复通过 replyFn/sendFn 写回飞书 * * 与 remote.js 的关系: * remote.js 仍然管理飞书 WS 连接和 HTTP 端点, * LarkTransport 处理消息语义层 (NL 理解、Agent 路由、回复格式化)。 * * @module LarkTransport */ import type { AgentRuntime } from '#agent/AgentRuntime.js'; interface AgentFactory { createLark(opts: RuntimeOverrides): AgentRuntime; createRemoteExec(opts: RuntimeOverrides): AgentRuntime; getAiProviderInfo(): { name: string; model?: string; }; } interface RuntimeOverrides { lang?: string; onProgress?: (event: ProgressEvent) => void; } interface ProgressEvent { type: string; tool?: string; [key: string]: unknown; } interface LarkTransportConfig { agentFactory: AgentFactory; replyFn: (messageId: string, text: string) => Promise<void>; sendFn: (text: string) => Promise<undefined | boolean>; sendImageFn?: (caption: string) => Promise<{ success: boolean; message: string; }>; getStatusFn?: () => Promise<string>; enqueueIdeFn?: (command: string, meta: Record<string, unknown>) => Promise<{ id: string; }>; isUserAllowed?: (userId: string) => boolean; aiProvider?: import('#external/ai/AiProvider.js').AiProvider; projectRoot?: string; } /** Raw Lark im.message.receive_v1 event data */ interface LarkRawEvent { message?: LarkRawMessage; event?: { message?: LarkRawMessage; sender?: LarkRawSender; }; sender?: LarkRawSender; } interface LarkRawMessage { message_id?: string; chat_id?: string; message_type?: string; content?: string; } interface LarkRawSender { sender_id?: { user_id?: string; open_id?: string; }; } export declare class LarkTransport { #private; /** 对话历史最大轮数 */ static MAX_HISTORY: number; /** 去重 TTL (5 分钟) */ static DEDUP_TTL: number; constructor(config: LarkTransportConfig); /** * 接收原始飞书消息事件 * * 这是唯一入口 — 替代了 remote.js 中的 handleLarkMessage() * * @param data 飞书 im.message.receive_v1 事件数据 */ receive(data: LarkRawEvent): Promise<void>; } export default LarkTransport;