diff --git a/frontend-web/src/pages/IframeChatPage.tsx b/frontend-web/src/pages/IframeChatPage.tsx index c365a176..602491ba 100644 --- a/frontend-web/src/pages/IframeChatPage.tsx +++ b/frontend-web/src/pages/IframeChatPage.tsx @@ -33,6 +33,15 @@ import { } from "./iframe-chat-submit"; type BrainyChatStatus = "started" | "finished"; +type BrainyChatInterruptMessage = { + source?: string; + type?: string; + payload?: { + reason?: string; + requestId?: string; + }; + requestId?: string; +}; function postBrainyChatStatus(status: BrainyChatStatus, requestId: string) { window.parent?.postMessage( @@ -206,10 +215,34 @@ export default function IframeChatPage() { [sendMessage, threadId], ); + const handleInterrupt = useCallback( + async (message: BrainyChatInterruptMessage) => { + const targetRequestId = message.payload?.requestId?.trim(); + if (targetRequestId) { + pendingRequestIdRef.current = targetRequestId; + } + + console.log("收到插件中断消息", { + reason: message.payload?.reason, + requestId: message.requestId, + targetRequestId, + }); + + await thread.stop(); + }, + [thread], + ); + useEffect(() => { - const handleMessage = (event: MessageEvent) => { + const handleMessage = ( + event: MessageEvent, + ) => { const data = event.data; if (data?.source !== "brainy-extension") return; + if (data?.type === "brainy:chat-interrupt") { + void handleInterrupt(data); + return; + } if (data?.type !== "brainy:chat-submit") return; const { submitText, files, iframeContext, additionalKwargs } = @@ -241,7 +274,7 @@ export default function IframeChatPage() { return () => { window.removeEventListener("message", handleMessage); }; - }, [handleSubmit]); + }, [handleInterrupt, handleSubmit]); const messageListPaddingBottom = showFollowups ? MESSAGE_LIST_DEFAULT_PADDING_BOTTOM +