diff --git a/web/src/components/structured/StructuredPane.test.tsx b/web/src/components/structured/StructuredPane.test.tsx index 575b5aa..3d95390 100644 --- a/web/src/components/structured/StructuredPane.test.tsx +++ b/web/src/components/structured/StructuredPane.test.tsx @@ -323,6 +323,26 @@ describe("prompt and cancel", () => { await waitFor(() => expect(sendStructuredPrompt).toHaveBeenCalledWith("s1", "next up")); }); + it("concatenates multiple queued messages into a single prompt", async () => { + const { socket } = mount(); + snapshot(socket, [], busy); + const input = document.querySelector(".structured-input")!; + const form = document.querySelector("form.structured-composer")!; + + fireEvent.change(input, { target: { value: "first" } }); + fireEvent.submit(form); + fireEvent.change(input, { target: { value: "second" } }); + fireEvent.submit(form); + + expect(sendStructuredPrompt).not.toHaveBeenCalled(); + const queued = document.querySelectorAll(".st-row-queued"); + expect(queued).toHaveLength(2); + + socket.emit({ type: "reduced_state", state: idle }); + await waitFor(() => expect(sendStructuredPrompt).toHaveBeenCalledWith("s1", "first\n\nsecond")); + expect(sendStructuredPrompt).toHaveBeenCalledTimes(1); + }); + it("hands a failed send's draft back to the operator", async () => { vi.mocked(sendStructuredPrompt).mockRejectedValueOnce(new Error("boom")); const { socket } = mount(); diff --git a/web/src/components/structured/StructuredPane.tsx b/web/src/components/structured/StructuredPane.tsx index 31f8a3e..1c4b0ab 100644 --- a/web/src/components/structured/StructuredPane.tsx +++ b/web/src/components/structured/StructuredPane.tsx @@ -251,14 +251,16 @@ export const StructuredPane = forwardRef { if (active || promptPending.current || queue.length === 0) return; - const [next, ...rest] = queue; - setQueue(rest); - dispatchPrompt(next.text, next.attachments); + const text = queue.map((q) => q.text).join("\n\n"); + const files = queue.flatMap((q) => q.attachments); + setQueue([]); + dispatchPrompt(text, files); }, [active, queue, dispatchPrompt]); const submit = (text: string, files: File[]) => {