From f6a0ead2acbaa55a3c3922895e13b06a9588e8c3 Mon Sep 17 00:00:00 2001 From: Oleksandr Zabolotnyi Date: Wed, 2 Sep 2026 16:08:54 +0200 Subject: [PATCH] fix(web,mobile): replace native title tooltips, fix stale interaction-mode test Replaces the native `title` attribute with the Tooltip/TooltipTrigger/ TooltipPopup components in the workspace-scope-mismatch warning, the quiet board-badge list, and the thread provider icon label, satisfying the no-native-title-tooltip lint rule (4 CI lint errors). Updates legacy-plan-mode.test.ts's fallback-mode assertions from "default" to "build": DEFAULT_PROVIDER_INTERACTION_MODE was changed from "default" to "build" without updating this test, so 3 of its 4 cases asserted the wrong literal despite their titles already saying "build mode". Co-Authored-By: Claude Sonnet 5 --- .../features/threads/legacy-plan-mode.test.ts | 6 +-- .../src/components/chat/MessagesTimeline.tsx | 18 ++++++--- .../components/chat/ThreadProviderIcons.tsx | 39 +++++++++++-------- apps/web/src/workspaceScopeWarningUi.tsx | 27 +++++++------ 4 files changed, 52 insertions(+), 38 deletions(-) diff --git a/apps/mobile/src/features/threads/legacy-plan-mode.test.ts b/apps/mobile/src/features/threads/legacy-plan-mode.test.ts index e556318855ff..5bcbb5d9947e 100644 --- a/apps/mobile/src/features/threads/legacy-plan-mode.test.ts +++ b/apps/mobile/src/features/threads/legacy-plan-mode.test.ts @@ -22,7 +22,7 @@ describe("resolvePendingTaskInteractionMode", () => { draftInteractionMode: "plan", queuedInteractionMode: "plan", }), - ).toBe("default"); + ).toBe("build"); }); it("keeps a fresh draft in build mode while the preference is loading", () => { @@ -33,7 +33,7 @@ describe("resolvePendingTaskInteractionMode", () => { draftInteractionMode: "plan", queuedInteractionMode: undefined, }), - ).toBe("default"); + ).toBe("build"); }); it("honors the draft's mode when the plan preference is enabled", () => { @@ -52,6 +52,6 @@ describe("resolvePendingTaskInteractionMode", () => { draftInteractionMode: undefined, queuedInteractionMode: "plan", }), - ).toBe("default"); + ).toBe("build"); }); }); diff --git a/apps/web/src/components/chat/MessagesTimeline.tsx b/apps/web/src/components/chat/MessagesTimeline.tsx index c8da4fb77074..325e29bee2e5 100644 --- a/apps/web/src/components/chat/MessagesTimeline.tsx +++ b/apps/web/src/components/chat/MessagesTimeline.tsx @@ -1037,12 +1037,18 @@ function BoardTurnBadges({ turnId }: { turnId: TurnId | null | undefined }) { const titles = items.map((item) => item.title).join("\n"); return (
- - {formatQuietBoardLabel(items.length)} - + + + } + > + {formatQuietBoardLabel(items.length)} + + + {titles} + +
); } diff --git a/apps/web/src/components/chat/ThreadProviderIcons.tsx b/apps/web/src/components/chat/ThreadProviderIcons.tsx index ef62d50a0943..4a6ee34dd8f7 100644 --- a/apps/web/src/components/chat/ThreadProviderIcons.tsx +++ b/apps/web/src/components/chat/ThreadProviderIcons.tsx @@ -8,6 +8,7 @@ import { import { ProviderInstanceIcon } from "./ProviderInstanceIcon"; import { PROVIDER_ICON_BY_PROVIDER } from "./providerIconUtils"; +import { Tooltip, TooltipPopup, TooltipTrigger } from "~/components/ui/tooltip"; import { cn } from "~/lib/utils"; const INNER_KIND_TO_DRIVER: Record = { @@ -83,22 +84,26 @@ export const ThreadProviderIcons = memo(function ThreadProviderIcons(props: { : props.displayName; return ( - - - {InnerIcon ? ( - - ) : null} - + + + } + > + + {InnerIcon ? ( + + ) : null} + + {title} + ); }); diff --git a/apps/web/src/workspaceScopeWarningUi.tsx b/apps/web/src/workspaceScopeWarningUi.tsx index 9edec210d2d5..07de0769995e 100644 --- a/apps/web/src/workspaceScopeWarningUi.tsx +++ b/apps/web/src/workspaceScopeWarningUi.tsx @@ -2,6 +2,7 @@ import { isProviderDriverKind, type ProviderDriverKind } from "@t3tools/contract import { BotIcon } from "lucide-react"; import { cn } from "~/lib/utils"; +import { Tooltip, TooltipPopup, TooltipTrigger } from "~/components/ui/tooltip"; import { ProviderInstanceIcon } from "./components/chat/ProviderInstanceIcon"; import { formatWorktreePathForDisplay } from "./worktreeCleanup"; @@ -86,19 +87,21 @@ export function WorkspaceScopeWarningRow(props: {

{props.label}

Thread
-
- {threadLabel} -
+ + } + > + {threadLabel} + + {props.mismatch.threadWorktree} +
Agent
-
- {usedLabel} -
+ + }> + {usedLabel} + + {props.mismatch.usedPath} +