diff --git a/apps/web/src/components/chat/ChatComposer.tsx b/apps/web/src/components/chat/ChatComposer.tsx index f87ddab1371ff..b613b8c9a5bc1 100644 --- a/apps/web/src/components/chat/ChatComposer.tsx +++ b/apps/web/src/components/chat/ChatComposer.tsx @@ -3178,6 +3178,7 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps) const importContextRecords = ( records: ReadonlyArray, sourceEnvironmentId: EnvironmentId | null, + threadDraftTarget = attachmentDraftTarget, ): ReadonlyMap => { const rewritten = new Map(); const dependentAttachmentLocalIds = new Map(); @@ -3232,7 +3233,11 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps) : existing ? (uploadedContextRecordFromDraft(existing) ?? undefined) : undefined; - if (existingRecord && isSameComposerContextPayload(existingRecord, record)) { + if ( + existingRecord && + isSameComposerContextPayload(existingRecord, record) && + (record.kind !== "thread" || threadDraftTarget === attachmentDraftTarget) + ) { if (record.kind === "preview-annotation" && record.screenshotContextId) { skippedDependentAttachmentIds.add(record.screenshotContextId); } @@ -3279,7 +3284,7 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps) case "thread": { // The agent can only read threads on its own server; a pasted foreign one is dropped. if (record.environmentId !== environmentId) break; - addComposerDraftThreadContexts(attachmentDraftTarget, [record], { + addComposerDraftThreadContexts(threadDraftTarget, [record], { appendReference: false, }); rewritten.set(record.contextId, record.contextId); @@ -4344,7 +4349,7 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps) } const rewrittenContextIds = entry.records - ? importContextRecords(entry.records, null) + ? importContextRecords(entry.records, null, composerDraftTarget) : new Map(); const restoredPrompt = replaceComposerContextReferences(entry.prompt, (reference) => { const contextId = rewrittenContextIds.get(reference.contextId); @@ -4597,6 +4602,7 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps) const images = [...composerImagesRef.current]; const files = [...composerFilesRef.current]; const stashedRecords: ComposerContextRecord[] = [ + ...composerThreadContexts, ...composerTerminalContextsRef.current.map(terminalContextRecord), ...composerReviewComments.map(reviewCommentContextRecord), ...composerPreviewAnnotations.map((annotation) => @@ -4702,6 +4708,7 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps) promptRef.current = ""; clearComposerDraftPromptAndImages(stashTarget); clearComposerDraftTerminalContexts(stashTarget); + setComposerDraftThreadContexts(stashTarget, []); for (const comment of composerReviewComments) { removeComposerDraftReviewComment(stashTarget, comment.id); }