From 680417a0a2a995d12538e730584524a255e8e833 Mon Sep 17 00:00:00 2001 From: Developer Date: Tue, 9 Jun 2026 12:39:32 +0000 Subject: [PATCH] fix: remove rel=noopener from all session/instance links to enable tab reuse rel=noopener forces a fresh browsing context, breaking target name matching and window reference tracking across browsers. Changes: - use-instance-actions.ts: track opened tabs in Map, call .focus() on existing - session-card.tsx: all Open buttons now go through handleOpen callback - app-shell.tsx: sidebar session links use target='session-{id}' + noreferrer - workspace-instance-chips.tsx: remove noopener from chip links - instance-list.tsx: remove noopener from Open links - WorkspaceDetailPage.tsx: use named target + noreferrer Quality gates: tsc --noEmit pass, npm run build pass, 80/80 tests pass --- apps/web/src/components/app-shell.tsx | 4 +- .../features/session/session-card.tsx | 75 ++++++------------- .../features/tool/instance-list.tsx | 2 +- .../workspace/workspace-instance-chips.tsx | 2 +- apps/web/src/hooks/use-instance-actions.ts | 27 ++++--- apps/web/src/pages/WorkspaceDetailPage.tsx | 4 +- 6 files changed, 47 insertions(+), 67 deletions(-) diff --git a/apps/web/src/components/app-shell.tsx b/apps/web/src/components/app-shell.tsx index 4af70e2..283b017 100644 --- a/apps/web/src/components/app-shell.tsx +++ b/apps/web/src/components/app-shell.tsx @@ -50,8 +50,8 @@ const SessionItem = ({ session }: { session: Session }) => { return ( diff --git a/apps/web/src/components/features/session/session-card.tsx b/apps/web/src/components/features/session/session-card.tsx index 536f16f..68cfb25 100644 --- a/apps/web/src/components/features/session/session-card.tsx +++ b/apps/web/src/components/features/session/session-card.tsx @@ -58,11 +58,6 @@ export function SessionCard({ const isTerminalOnly = session.tool_type_interfaces?.includes("terminal") && !session.tool_type_interfaces?.includes("web"); - const openHref = session.url - ? session.url - : isTerminalOnly - ? `/instances/${session.id}/terminal` - : undefined; const hasTunnelError = !isTerminalOnly && tunnelHealth?.tunnel_status === "unreachable"; const hasAppError = @@ -138,13 +133,13 @@ export function SessionCard({ )} {session.url && (

- onOpen?.(session)} > {session.url} - +

)} {session.created_at && ( @@ -159,27 +154,15 @@ export function SessionCard({
{isActive && ( <> - {openHref ? ( - - - Open - - ) : ( - - )} + - )} + {!isTerminalOnly && onRecreateTunnel && (