import { frameSessionId, type FrameEvent, type FramePayload, type StoreState } from "./shared"; import { parseTool, parseToolCall } from "../../wsParse"; /** 工具帧处理组:tool_call.start / tool_call.end / tool_call.delta / * tool_execution.update + 遗留 tool_used。命中(含组内主动丢弃)返回 true, * 未命中返回 false 交给下一组。 * * 裁决 16.4.5:工具卡按帧的 `sessionId` 落在该会话的助手气泡上(其它会话的调用 * 卡不会跑到屏幕上的这一轮里)。 */ export function handleToolEvent(ev: FrameEvent, r: FramePayload, s: StoreState): boolean { switch (ev.type) { case "tool_call.start": case "tool_call.end": { const tool = parseToolCall(ev.data); if (tool) s.addTool(tool, frameSessionId(ev, r)); return true; } case "tool_call.delta": { // Argument fragments stream between start/end; the card is added at the // boundary so mid-stream reconnects do not drop it. return true; } case "tool_execution.update": { // Same card as tool_call.* — same routing. const tool = parseToolCall(ev.data); if (tool) s.addTool(tool, frameSessionId(ev, r)); return true; } case "tool_used": { // Legacy tool echo — same card as tool_call.*. const tool = parseTool(ev.data); if (tool) s.addTool(tool, frameSessionId(ev, r)); return true; } default: return false; } }