import { FILL_PREVIEW_VIEWPORT, type PreviewAutomationOperation, type PreviewAutomationOpenInput, type PreviewSessionSnapshot, type PreviewViewportSetting,} from "@t3tools/contracts";/** * Viewport an agent-opened tab falls back to when the user has no configured * browser default. Agents screenshot and assert against what they open, so a * brand-new tab left in fill mode would be sized by whatever the panel happens * to be — deterministic beats incidental here. */export const DEFAULT_PREVIEW_AUTOMATION_VIEWPORT = { _tag: "freeform", width: 1280, height: 800,} as const satisfies PreviewViewportSetting;/** * An explicit `open`/`show` is the agent deliberately surfacing or suppressing * its work, so it outranks the preference; the setting only decides what * happens when the agent said nothing either way. */export function shouldOpenPreviewMiniPlayer( input: PreviewAutomationOpenInput, autoShowFloatingPreview = true,): boolean { return input.open ?? input.show ?? autoShowFloatingPreview;}export function shouldAutoShowPreviewForAutomationUse(input: { readonly operation: PreviewAutomationOperation; readonly autoShowFloatingPreview: boolean; readonly presentationSuppressed: boolean;}): boolean { return ( input.operation !== "open" && input.autoShowFloatingPreview && !input.presentationSuppressed );}export function explicitlySuppressesPreviewMiniPlayer(input: PreviewAutomationOpenInput): boolean { return (input.open ?? input.show) === false;}export function previewAutomationOpenNeedsOverlay( input: PreviewAutomationOpenInput, snapshot: PreviewSessionSnapshot,): boolean { return input.url !== undefined || snapshot.navStatus._tag !== "Idle";}/** * Whether a freshly opened automation tab still needs a viewport applied. * * A configured browser default is sent with `preview.open`, so the snapshot * already carries it and nothing is needed here. Fill means the user has no * stated preference, which is where the agent fallback applies. */export function previewAutomationDefaultViewport( reusedExistingTab: boolean, snapshot: PreviewSessionSnapshot,): PreviewViewportSetting | null { const viewport = snapshot.viewport ?? FILL_PREVIEW_VIEWPORT; return !reusedExistingTab && viewport._tag === "fill" ? DEFAULT_PREVIEW_AUTOMATION_VIEWPORT : null;}
import {
FILL_PREVIEW_VIEWPORT,
type PreviewAutomationOperation,
type PreviewAutomationOpenInput,
type PreviewSessionSnapshot,
type PreviewViewportSetting,
} from "@t3tools/contracts";
/**
* Viewport an agent-opened tab falls back to when the user has no configured
* browser default. Agents screenshot and assert against what they open, so a
* brand-new tab left in fill mode would be sized by whatever the panel happens
* to be — deterministic beats incidental here.
*/
export const DEFAULT_PREVIEW_AUTOMATION_VIEWPORT = {
_tag: "freeform",
width: 1280,
height: 800,
} as const satisfies PreviewViewportSetting;
/**
* An explicit `open`/`show` is the agent deliberately surfacing or suppressing
* its work, so it outranks the preference; the setting only decides what
* happens when the agent said nothing either way.
*/
export function shouldOpenPreviewMiniPlayer(
input: PreviewAutomationOpenInput,
autoShowFloatingPreview = true,
): boolean {
return input.open ?? input.show ?? autoShowFloatingPreview;
}
export function shouldAutoShowPreviewForAutomationUse(input: {
readonly operation: PreviewAutomationOperation;
readonly autoShowFloatingPreview: boolean;
readonly presentationSuppressed: boolean;
}): boolean {
return (
input.operation !== "open" && input.autoShowFloatingPreview && !input.presentationSuppressed
);
}
export function explicitlySuppressesPreviewMiniPlayer(input: PreviewAutomationOpenInput): boolean {
return (input.open ?? input.show) === false;
}
export function previewAutomationOpenNeedsOverlay(
input: PreviewAutomationOpenInput,
snapshot: PreviewSessionSnapshot,
): boolean {
return input.url !== undefined || snapshot.navStatus._tag !== "Idle";
}
/**
* Whether a freshly opened automation tab still needs a viewport applied.
*
* A configured browser default is sent with `preview.open`, so the snapshot
* already carries it and nothing is needed here. Fill means the user has no
* stated preference, which is where the agent fallback applies.
*/
export function previewAutomationDefaultViewport(
reusedExistingTab: boolean,
snapshot: PreviewSessionSnapshot,
): PreviewViewportSetting | null {
const viewport = snapshot.viewport ?? FILL_PREVIEW_VIEWPORT;
return !reusedExistingTab && viewport._tag === "fill"
? DEFAULT_PREVIEW_AUTOMATION_VIEWPORT
: null;
}