From 4894711396ae2c8b2fef87234be0716f2f11a37f Mon Sep 17 00:00:00 2001 From: 0x1355 <0x1355@gmail.com> Date: Thu, 19 Mar 2026 09:44:40 +0100 Subject: [PATCH] feat: add Ghostwriter "Start over" reset with confirmation dialog (#289) --- orchestrator/src/client/api/client.ts | 12 +++++ .../components/ghostwriter/Composer.tsx | 18 ++++++- .../ghostwriter/GhostwriterPanel.tsx | 51 +++++++++++++++++++ .../src/server/api/routes/ghostwriter.ts | 15 ++++++ .../src/server/repositories/ghostwriter.ts | 20 ++++++++ .../src/server/services/ghostwriter.ts | 33 ++++++++++++ 6 files changed, 148 insertions(+), 1 deletion(-) diff --git a/orchestrator/src/client/api/client.ts b/orchestrator/src/client/api/client.ts index 21c5220..fd81062 100644 --- a/orchestrator/src/client/api/client.ts +++ b/orchestrator/src/client/api/client.ts @@ -671,6 +671,18 @@ export async function cancelJobChatRun( ); } +export async function resetJobGhostwriterConversation( + jobId: string, +): Promise<{ deletedMessages: number; deletedRuns: number }> { + return fetchApi<{ deletedMessages: number; deletedRuns: number }>( + `/jobs/${jobId}/chat/reset`, + { + method: "POST", + body: JSON.stringify({}), + }, + ); +} + export async function cancelJobGhostwriterRun( jobId: string, runId: string, diff --git a/orchestrator/src/client/components/ghostwriter/Composer.tsx b/orchestrator/src/client/components/ghostwriter/Composer.tsx index 9f1ecaa..f5cf0d1 100644 --- a/orchestrator/src/client/components/ghostwriter/Composer.tsx +++ b/orchestrator/src/client/components/ghostwriter/Composer.tsx @@ -1,5 +1,5 @@ import { getMetaShortcutLabel, isMetaKeyPressed } from "@client/lib/meta-key"; -import { RefreshCcw, Send, Square } from "lucide-react"; +import { Eraser, RefreshCcw, Send, Square } from "lucide-react"; import type React from "react"; import { useState } from "react"; import { Button } from "@/components/ui/button"; @@ -9,18 +9,22 @@ type ComposerProps = { disabled?: boolean; isStreaming: boolean; canRegenerate: boolean; + canReset: boolean; onRegenerate: () => Promise; onStop: () => Promise; onSend: (content: string) => Promise; + onReset: () => void; }; export const Composer: React.FC = ({ disabled, isStreaming, canRegenerate, + canReset, onRegenerate, onStop, onSend, + onReset, }) => { const [value, setValue] = useState(""); @@ -51,6 +55,18 @@ export const Composer: React.FC = ({ {getMetaShortcutLabel("Enter")} to send
+ + {isStreaming ? (