From 069e8759d120ddd82b86ec71644b619e12bf0e30 Mon Sep 17 00:00:00 2001 From: diddletime Date: Tue, 27 Oct 2026 16:39:11 +0000 Subject: [PATCH 1/3] fix(web): keep goal controls beside the composer --- apps/web/src/components/ChatView.tsx | 9 ++++----- apps/web/src/components/chat/ThreadActivityBanners.tsx | 1 - apps/web/src/components/chat/ThreadNow.tsx | 5 +---- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/apps/web/src/components/ChatView.tsx b/apps/web/src/components/ChatView.tsx index 19726720b1427..6cb2abab165bc 100644 --- a/apps/web/src/components/ChatView.tsx +++ b/apps/web/src/components/ChatView.tsx @@ -2488,6 +2488,7 @@ export default function ChatView(props: ChatViewProps) { }) : null; const composerBannerItems = (() => { + const goalItems = goalNow === null ? [] : [{ ...goalNow, variant: "default" }]; const limitRecoveryItems = limitRecoveryBanner === null ? [] : [limitRecoveryBanner]; const usageLimitsItems = usageLimitsBanner === null ? [] : [usageLimitsBanner]; const projectCloneItems = projectCloneBannerItem === null ? [] : [projectCloneBannerItem]; @@ -2498,6 +2499,7 @@ export default function ChatView(props: ChatViewProps) { ...usageLimitsItems, ...projectCloneItems, ...systemComposerBannerItems, + ...goalItems, ]; } return [ @@ -2506,6 +2508,7 @@ export default function ChatView(props: ChatViewProps) { ...usageLimitsItems, ...projectCloneItems, ...systemComposerBannerItems, + ...goalItems, branchMismatchBannerItem({ mismatchKey: activeBranchMismatchKey, mismatch: localCheckoutBranchMismatch, @@ -2917,10 +2920,7 @@ export default function ChatView(props: ChatViewProps) { const onExpandTimelineImageStable = useStableCallback(onExpandTimelineImage); const shownThreadSyncPhase = activeEnvironmentUnavailable ? null : delayedThreadSyncPhase; const hasThreadNow = - childInputNow !== null || - backgroundWorkNow !== null || - goalNow !== null || - shownThreadSyncPhase !== null; + childInputNow !== null || backgroundWorkNow !== null || shownThreadSyncPhase !== null; const queuedRunCount = serverProjection ? getUserQueuedThreadRuns(serverProjection).length : 0; // The queue control is mounted for every server thread but joins the footer only while it shows // something, by its own rule: an optimistic message stops counting once the server has it. @@ -2962,7 +2962,6 @@ export default function ChatView(props: ChatViewProps) { attention={childInputNow} work={backgroundWorkNow} syncPhase={shownThreadSyncPhase} - goal={goalNow} /> {threadStatusLine} {pendingGuestMessageCount > 0 && isServerThread && activeThread ? ( diff --git a/apps/web/src/components/chat/ThreadActivityBanners.tsx b/apps/web/src/components/chat/ThreadActivityBanners.tsx index e132587a75951..3df992de190ef 100644 --- a/apps/web/src/components/chat/ThreadActivityBanners.tsx +++ b/apps/web/src/components/chat/ThreadActivityBanners.tsx @@ -54,7 +54,6 @@ export function childInputNowItem(input: { }; } -/** The thread's goal, for the end of the timeline. */ export function goalNowItem(input: { readonly threadId: ThreadId; readonly goal: OrchestrationV2ProviderGoal; diff --git a/apps/web/src/components/chat/ThreadNow.tsx b/apps/web/src/components/chat/ThreadNow.tsx index 6ff4469397f7b..f396e2b925e37 100644 --- a/apps/web/src/components/chat/ThreadNow.tsx +++ b/apps/web/src/components/chat/ThreadNow.tsx @@ -79,26 +79,23 @@ function ThreadSyncLine({ phase }: { readonly phase: ThreadSyncPhase }) { /** * What the thread is doing now, at the end of the timeline: what needs you, background work, - * the sync status while messages load, then the goal. + * and the sync status while messages load. */ export function ThreadNow({ attention, work, syncPhase, - goal, }: { /** Something that needs you elsewhere, such as a subagent's question. */ readonly attention: ThreadNowItem | null; readonly work: ThreadNowItem | null; readonly syncPhase: ThreadSyncPhase | null; - readonly goal: ThreadNowItem | null; }): ReactNode { return ( <> {attention ? : null} {work ? : null} {syncPhase ? : null} - {goal ? : null} ); } From 96355a1b92dd78ff4fc3aaeed43a76320f2cc1ed Mon Sep 17 00:00:00 2001 From: maria-rcks Date: Fri, 30 Oct 2026 01:43:09 +0000 Subject: [PATCH 2/3] fix(web): keep goal row visible with composer requests --- apps/web/src/components/ChatView.tsx | 10 ++++++---- apps/web/src/components/chat/ThreadActivityBanners.tsx | 1 + apps/web/src/components/chat/ThreadNow.tsx | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/apps/web/src/components/ChatView.tsx b/apps/web/src/components/ChatView.tsx index 1063bf0619295..ca76c869ac1e6 100644 --- a/apps/web/src/components/ChatView.tsx +++ b/apps/web/src/components/ChatView.tsx @@ -354,7 +354,7 @@ import { ChatTerminalDrawers } from "./chat/ChatTerminalDrawers"; import { ChatRightPanel } from "./chat/ChatRightPanel"; import { useDraftEnvironmentRouting } from "./chat/useDraftEnvironmentRouting"; import { branchMismatchBannerItem } from "./chat/ThreadActivityBanners"; -import { ThreadNow } from "./chat/ThreadNow"; +import { ThreadNow, ThreadNowLine } from "./chat/ThreadNow"; import type { ThreadStructure } from "@t3tools/client-runtime/state/shell"; import { useDelayedStatus } from "../hooks/useDelayedStatus"; import { useTimelineFollow } from "./chat/useTimelineFollow"; @@ -2515,7 +2515,6 @@ export default function ChatView(props: ChatViewProps) { }) : null; const composerBannerItems = (() => { - const goalItems = goalNow === null ? [] : [{ ...goalNow, variant: "default" as const }]; const fallbackSelection = draftFallback?.selection; const defaultSelection = draftDefaultModelSelection ?? @@ -2572,7 +2571,6 @@ export default function ChatView(props: ChatViewProps) { ...usageLimitsItems, ...projectCloneItems, ...systemComposerBannerItems, - ...goalItems, ]; } return [ @@ -2582,7 +2580,6 @@ export default function ChatView(props: ChatViewProps) { ...usageLimitsItems, ...projectCloneItems, ...systemComposerBannerItems, - ...goalItems, branchMismatchBannerItem({ mismatchKey: activeBranchMismatchKey, mismatch: localCheckoutBranchMismatch, @@ -3447,6 +3444,11 @@ export default function ChatView(props: ChatViewProps) { aria-busy={queuedRunEdit.isSaving} >
+ {goalNow ? ( +
+ +
+ ) : null} {showProviderSubagentBar ? ( Date: Fri, 30 Oct 2026 02:08:41 +0000 Subject: [PATCH 3/3] fix(web): preserve goal surface beside approval drawers --- apps/web/src/components/ChatView.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/web/src/components/ChatView.tsx b/apps/web/src/components/ChatView.tsx index ca76c869ac1e6..3563ab086beff 100644 --- a/apps/web/src/components/ChatView.tsx +++ b/apps/web/src/components/ChatView.tsx @@ -3445,9 +3445,11 @@ export default function ChatView(props: ChatViewProps) { >
{goalNow ? ( -
- -
+ +
+ +
+
) : null} {showProviderSubagentBar ? (