autosnippet
Version:
Extract code patterns into a knowledge base for AI coding assistants
92 lines (91 loc) • 2.72 kB
TypeScript
/**
* 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;