feat: reuse existing tabs when opening sessions instead of always creating new ones

Use named window targets (session-{id}, instance-{id}) instead of _blank:
- use-instance-actions.ts: window.open(..., 'session-{id}') for programmatic opens
- session-card.tsx: <a target='session-{id}'> for direct link opens (mobile + desktop)
- workspace-instance-chips.tsx: <a target='instance-{id}'> for chip links
- instance-list.tsx: <a target='instance-{id}'> for instance open links

Browser behavior: if a tab with that target name exists, it navigates/focuses
that tab instead of opening a new one.

Quality gates: tsc --noEmit pass, npm run build pass, 80/80 tests pass
This commit is contained in:
Developer
2026-06-09 11:01:40 +00:00
parent 152f87a254
commit 486f3cbc44
5 changed files with 136 additions and 102 deletions
+4 -3
View File
@@ -35,15 +35,16 @@ export function useInstanceActions(
const [dirtyDeleteFiles, setDirtyDeleteFiles] = useState<string[]>([]);
const handleOpen = useCallback((session: Session) => {
const tabName = `session-${session.id}`;
if (session.url) {
window.open(session.url, "_blank", "noopener,noreferrer");
window.open(session.url, tabName, "noopener,noreferrer");
return;
}
if (session.tool_type_interfaces?.includes("terminal")) {
window.open(`/instances/${session.id}/terminal`, "_blank", "noopener,noreferrer");
window.open(`/instances/${session.id}/terminal`, tabName, "noopener,noreferrer");
return;
}
window.open(`/projects/${session.project_id}`, "_blank", "noopener,noreferrer");
window.open(`/projects/${session.project_id}`, tabName, "noopener,noreferrer");
}, []);
const handleStart = useCallback(