/** * eventMapper —— 把 {@link AgentStreamEvent} 映射成 ag-ui `BaseEvent` 的纯函数。 * * 这是 conversation bridge 的「无状态映射核心」:接收单个 agent 事件,产出 0..N 个 * ag-ui 事件(因为单条 `delta` 要靠外层累积器配齐 `TEXT_MESSAGE_START` / `CONTENT` / * `END` 三元组;此处只负责把一个 agent 事件翻译成对应的 ag-ui 内容事件,生命周期 * 配对由 {@link conversationBridge} 的有状态编排器负责)。 * * 设计为纯函数 + 不碰 IO / 定时器,以便在 appwrite-gateway、linkque-cli/agentdev * 等任意场景下复用,且可独立单测。 */ import { type BaseEvent } from '../../vendor/linkque-agent-conversation-contract/index.js'; import type { AgentStreamEvent } from '../../core/types.js'; /** message/toolCall 标识生成器:默认用 crypto.randomUUID,可注入便于单测。 */ export type IdGenerator = () => string; /** * 把单条 {@link AgentStreamEvent} 映射成一或多个 ag-ui `BaseEvent`。 * * 语义对照: * - `delta` → `TEXT_MESSAGE_CONTENT`(delta 片段)。`messageId` 由调用方在 * 累积器里维护;映射器只负责产出 content 事件,Start/End 的配对 * 交给编排器,因为「是否有文本」要跨多个事件才能判断。 * - `thinking` → `THINKING_TEXT_MESSAGE_CONTENT`(思考增量片段)。 * `thinkingId` 由调用方在累积器里维护(与文本的 `messageId` 区分, * 因为思考段与文本段各自独立配对);映射器只产出 content 事件, * Start/End 配对交给编排器。无 `thinkingId` 时不产出。 * - `tool_start` → `TOOL_CALL_START` + `TOOL_CALL_ARGS`(args 序列化为字符串)。 * - `tool_end` → `TOOL_CALL_END`。 * - `done` → 不产出事件(由编排器统一发 `RUN_FINISHED`),返回空数组。 * - `error` → 不产出 ag-ui 事件(由编排器转成 transport-error SSE)。 * * @param event 单条 agent 事件 * @param messageId 当前 assistant 消息 id(delta 事件用);可为空表示尚无活动消息 * @param thinkingId 当前思考段 id(thinking 事件用);可为空表示尚无活动思考段 * @returns ag-ui BaseEvent 数组(可能为空) */ export declare function mapAgentEventToBaseEvents(event: AgentStreamEvent, messageId?: string, thinkingId?: string): BaseEvent[];