From 0979a860cbba54e9c55ed33389c7bab5906c2a96 Mon Sep 17 00:00:00 2001 From: Adam Higgins Date: Sat, 7 Nov 2026 09:49:08 +0000 Subject: [PATCH] fix(web): preserve composer history after cancelled composition --- .../ComposerPromptEditorTiptap.input.browser.test.tsx | 8 ++++---- apps/web/src/components/settings/SettingsPanels.tsx | 2 +- apps/web/src/composer-rich-text-doc.ts | 1 + 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/apps/web/src/components/ComposerPromptEditorTiptap.input.browser.test.tsx b/apps/web/src/components/ComposerPromptEditorTiptap.input.browser.test.tsx index 3bdeb374f809c..fc84ba78d37b8 100644 --- a/apps/web/src/components/ComposerPromptEditorTiptap.input.browser.test.tsx +++ b/apps/web/src/components/ComposerPromptEditorTiptap.input.browser.test.tsx @@ -353,11 +353,11 @@ it("reconciles provider skills and metadata without losing formatting, caret, or editor.commands.setTextSelection("run use $baby".length + 1); }); editor = await screen.update(value, true, [disabled, babysit]); - expect(editor.state.doc.textContent).toBe("run use now then $HOME"); + expect(editor.state.doc.textContent).toBe("run **use now** then $HOME"); const chip = serializeEditorDoc(editor.state.doc).runs.find((run) => run.kind === "token")!; expect(editor.state.selection.from).toBe(chip.pmPos + 1); editor = await screen.update(value, true, [disabled]); - expect.soft(editor.state.doc.textContent).toBe("run use $babysit now then $HOME"); + expect.soft(editor.state.doc.textContent).toBe("run **use $babysit now** then $HOME"); expect(serializeEditorDoc(editor.state.doc).value).toBe(value); await act(async () => { editor.commands.insertContent("X"); @@ -367,7 +367,7 @@ it("reconciles provider skills and metadata without losing formatting, caret, or editor.commands.undo(); }); expect(serializeEditorDoc(editor.state.doc).value).toBe(value); - expect(editor.state.doc.textContent).toBe("run use $babysit now then $HOME"); + expect(editor.state.doc.textContent).toBe("run **use $babysit now** then $HOME"); editor = await screen.update(value, true, [babysit]); await act(async () => { @@ -377,7 +377,7 @@ it("reconciles provider skills and metadata without losing formatting, caret, or await act(async () => { editor.commands.undo(); }); - expect(editor.state.doc.textContent).toBe("run use $babysit now then $HOME"); + expect(editor.state.doc.textContent).toBe("run **use $babysit now** then $HOME"); expect(serializeEditorDoc(editor.state.doc).value).toBe(value); editor = await screen.update(value, true, [ diff --git a/apps/web/src/components/settings/SettingsPanels.tsx b/apps/web/src/components/settings/SettingsPanels.tsx index 79f0c4c6fb251..43eac399f08a2 100644 --- a/apps/web/src/components/settings/SettingsPanels.tsx +++ b/apps/web/src/components/settings/SettingsPanels.tsx @@ -1971,7 +1971,7 @@ export function ThreadsSettingsPanel() { { + if (touchesMarkdownSource(props.state, props.range.from, props.range.to)) return null; const opener = props.range.from + Math.max(props.match[0].search(/\S/), 0); const code = props.state.schema.marks.code; if (code && props.state.doc.rangeHasMark(opener, opener + 1, code)) return null;