From f2b9c6d33c57f03fa3ecbdd7a405d3456535a216 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 13 Oct 2026 15:09:45 +0200 Subject: [PATCH] count in-process preview pages in the ai evals active-preview resolver (#11725) * fix: count in-process preview pages in the ai evals active-preview resolver Co-Authored-By: Claude Opus 5.5 * refactor: share the page-slot predicate between the session and eval resolvers Co-Authored-By: Claude Opus 5.5 --------- Co-authored-by: Claude Opus 5.5 --- .../adapters/frontend/core/global/evalPreviewTabs.ts | 6 +++--- .../src/lib/components/sessions/previewRouter.ts | 12 ++++++++++++ .../lib/components/sessions/sessionRuntime.svelte.ts | 11 ++--------- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/ai_evals/adapters/frontend/core/global/evalPreviewTabs.ts b/ai_evals/adapters/frontend/core/global/evalPreviewTabs.ts index f32bf1e22e..b6af04e6ec 100644 --- a/ai_evals/adapters/frontend/core/global/evalPreviewTabs.ts +++ b/ai_evals/adapters/frontend/core/global/evalPreviewTabs.ts @@ -17,6 +17,7 @@ import { previewLocationLabel, promptSafe, resolvePreviewTab, + slotShowsPage, } from "../../../../../frontend/src/lib/components/sessions/previewRouter"; import type { ArtifactVersionTarget } from "../../../../../frontend/src/lib/components/sessions/previewRouter"; import type { SessionTarget } from "../../../../../frontend/src/lib/components/sessions/sessionState.svelte"; @@ -136,9 +137,8 @@ export function createEvalPreviewPanel(input: { activePreview: () => { const tab = owner.displayedTab; if (!tab) return undefined; - // Artifact and editor tabs are not iframes: they carry no page location, and an - // artifact's pinned version reaches the chat only through get_preview_status. - if (resolvePreviewTab(tab.url).kind !== "iframe") return undefined; + // An artifact's pinned version reaches the chat only through get_preview_status. + if (!slotShowsPage(resolvePreviewTab(tab.url).kind)) return undefined; return previewLocationContext(whereIs(tab)); }, dispose: () => { diff --git a/frontend/src/lib/components/sessions/previewRouter.ts b/frontend/src/lib/components/sessions/previewRouter.ts index 637d6a6052..4d9a678859 100644 --- a/frontend/src/lib/components/sessions/previewRouter.ts +++ b/frontend/src/lib/components/sessions/previewRouter.ts @@ -613,6 +613,18 @@ export type PreviewSlot = | { kind: 'run'; jobId: string; workspace?: string } | { kind: 'iframe' } +/** Whether a tab on this slot shows a page, framed or mounted in process, and so has a + * location to stamp as the chat's ACTIVE PREVIEW. Editors register as the ACTIVE EDITOR. */ +export function slotShowsPage(kind: PreviewSlot['kind']): boolean { + return ( + kind === 'iframe' || + kind === 'pageitem' || + kind === 'pagelist' || + kind === 'run' || + kind === 'viewer' + ) +} + export function resolvePreviewTab(url: string): PreviewSlot { const artifact = parseArtifactRoute(url) if (artifact) return { kind: 'artifact', id: artifact.id, version: artifact.version } diff --git a/frontend/src/lib/components/sessions/sessionRuntime.svelte.ts b/frontend/src/lib/components/sessions/sessionRuntime.svelte.ts index 8d242912dc..b97073ba9c 100644 --- a/frontend/src/lib/components/sessions/sessionRuntime.svelte.ts +++ b/frontend/src/lib/components/sessions/sessionRuntime.svelte.ts @@ -72,6 +72,7 @@ import { promptSafe, parseRunFormRoute, resolvePreviewTab, + slotShowsPage, type PreviewSlot } from './previewRouter' import { normalizePipelineFolder } from '$lib/utils/pipelineFolder' @@ -466,15 +467,7 @@ function createRuntime(session: Session): SessionRuntime { // point those at a page the user cannot see. const tab = owner?.displayedTab if (!tab) return undefined - const slotKind = resolvePreviewTab(tab.url).kind - if ( - slotKind !== 'iframe' && - slotKind !== 'pageitem' && - slotKind !== 'pagelist' && - slotKind !== 'run' && - slotKind !== 'viewer' - ) - return undefined + if (!slotShowsPage(resolvePreviewTab(tab.url).kind)) return undefined return previewLocationContext(whereIs(tab)) } // Pre-flight: materialise the (still-transient) session, then commit