laplus 0.1.8 → 0.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"PreviewPanel-bm1g8_On.js","names":["__iconNode","__iconNode","__iconNode","__iconNode","c","_c","cva","VariantProps","React","cn","Input","InputProps","Textarea","TextareaProps","InputGroup","t0","$","className","props","t1","t2","inputGroupAddonVariants","defaultVariants","align","variants","InputGroupAddon","undefined","t3","_temp","e","target","HTMLElement","isInteractive","closest","preventDefault","parent","currentTarget","parentElement","input","querySelector","focus","InputGroupText","InputGroupInput","InputGroupTextarea","ArrowLeft","ArrowRight","Camera","ExternalLink","MousePointerClick","PictureInPicture2","RotateCw","FormEvent","KeyboardEvent","ReactNode","useEffect","useRef","useState","Button","InputGroup","InputGroupAddon","InputGroupInput","Tooltip","TooltipPopup","TooltipTrigger","cn","Props","url","displayUrl","loading","loadProgress","canGoBack","canGoForward","refreshDisabled","inputDisabled","focusUrlNonce","onBack","onForward","onRefresh","onSubmit","onOpenInBrowser","onCapture","record","captureDisabled","recording","onPictureInPicture","pictureInPicture","pictureInPictureDisabled","onPickElement","pickActive","pickDisabled","pickDisabledReason","trailingActions","NOOP","PreviewChromeRow","t0","$","_c","inputRef","draft","setDraft","inputFocused","setInputFocused","t1","t2","node","current","focus","t3","event","preventDefault","next","trim","length","blur","submit","t4","t5","t6","t7","Symbol","for","t8","t9","t10","t11","t12","t13","t14","t15","t16","t17","t18","t19","t20","t21","t22","t23","t24","t25","t26","t27","t28","t29","t30","t31","t32","event_0","target","value","t33","queueMicrotask","select","t34","t35","event_1","key","t36","t37","t38","t39","t40","t41","t42","event_2","shiftKey","t43","t44","t45","width","boxShadow","t46","PreviewUrlPresentationInput","url","environmentLabel","environmentHttpBaseUrl","formatPreviewUrl","input","URL","environmentUrl","origin","pathname","startsWith","encodedFileName","split","at","fileName","decodeURIComponent","protocol","host","cn","BrowserMockup","t0","$","_c","className","t1","t2","Symbol","for","t3","t4","BrowserMockup","PreviewableServer","Props","server","onOpen","PreviewLocalServerCard","t0","$","_c","t1","describeServer","subtitle","t2","Symbol","for","t3","t4","host","port","t5","t6","listening","t7","processName","source","PulsingDot","DimDot","DiscoveredLocalServer","isLoopbackHost","useMemo","EnvironmentId","resolveDiscoveredServerUrl","useDiscoveredPorts","PreviewableServer","source","listening","UseDiscoveredLocalServersInput","environmentId","configuredUrls","ReadonlyArray","recentlySeenUrls","useDiscoveredLocalServers","input","$","_c","scannerSnapshot","t0","t1","server","url","mergeServers","scanner","map","seen","Map","parsed","parseLocalUrl","key","canonicalKey","host","port","has","set","processName","pid","terminal","existing","get","Array","from","values","toSorted","a","b","sourceOrder","Record","configured","recent","toLowerCase","raw","URL","protocol","hostname","Number","parseInt","isFinite","href","EnvironmentId","Globe","RadioTower","Empty","EmptyDescription","EmptyMedia","EmptyTitle","PreviewLocalServerCard","useDiscoveredLocalServers","Props","environmentId","configuredUrls","ReadonlyArray","recentlySeenUrls","onOpenUrl","url","PreviewEmptyState","t0","$","_c","t1","servers","length","t2","Symbol","for","t3","t4","server","host","port","map","t5","t6","c","_c","DesktopPreviewColorScheme","Minus","MoreVertical","Plus","PlusIcon","RotateCcw","Button","Menu","MenuItem","MenuPopup","MenuRadioGroup","MenuRadioItem","MenuSeparator","MenuSub","MenuSubPopup","MenuSubTrigger","MenuTrigger","Tooltip","TooltipPopup","TooltipTrigger","previewBridge","COLOR_SCHEME_OPTIONS","ReadonlyArray","value","label","Props","tabId","hasWebContents","zoomFactor","colorScheme","deviceToolbarVisible","onToggleDeviceToolbar","nativePictureInPicture","onNativePictureInPicture","PreviewMoreMenu","t0","$","tabDisabled","t1","op","catch","_temp","callTab","t2","Math","round","zoomLabel","t3","Symbol","for","t4","hardReload","t5","t6","openDevTools","t7","t8","t9","t10","t11","t12","t13","setColorScheme","_temp2","t14","map","_temp3","t15","t16","t17","t18","t19","zoomOut","t20","t21","t22","t23","zoomIn","t24","t25","t26","resetZoom","t27","t28","t29","t30","_temp4","t31","t32","t33","_temp6","_temp8","t34","clearCache","_temp7","clearCookies","_temp5","event","preventDefault","option","PREVIEW_ERROR_CODE_MESSAGES","describePreviewError","description","friendly","length","useState","Button","describePreviewError","Props","url","code","description","onReload","PreviewUnreachable","t0","$","_c","showDetails","setShowDetails","t1","safeHost","host","t2","friendly","t3","length","Math","abs","errorLabel","t4","t5","Symbol","for","t6","t7","t8","t9","t10","_temp","t11","t12","t13","t14","t15","t16","value","ErrorIcon","className","URL","revealInFileExplorerLabel","platform","normalized","toLowerCase","includes","useEffect","useRef","useState","TICK_INTERVAL_MS","FADE_OUT_DELAY_MS","SEED_PERCENT","ASYMPTOTE_PERCENT","APPROACH_FACTOR","MIN_INCREMENT","useLoadingProgress","loading","progress","setProgress","progressRef","current","timer","window","setTimeout","clearTimeout","value","interval","setInterval","remaining","increment","Math","max","min","clearInterval","c","_c","useAtomValue","parseScopedThreadKey","scopedThreadKey","ScopedThreadRef","Schema","AsyncResult","Atom","applyPreviewServerEvent","readThreadPreviewState","reconcilePreviewServerSessions","previewEnvironment","PreviewSessionThreadKeyParseError","TaggedErrorClass","threadKey","String","message","previewSessionSyncAtom","family","threadRef","sessionsAtom","list","environmentId","input","threadId","eventsAtom","events","make","get","disposed","eventsVersion","reconcileSessions","result","Type","isSuccess","value","applyLatestEvent","currentEpoch","serverEpoch","refresh","addFinalizer","initialEvent","once","subscribe","queueMicrotask","pipe","setIdleTTL","withLabel","usePreviewSession","$","t0","useEffect","useRef","useState","cn","HIDE_AFTER_MS","ZOOM_EPSILON","Props","zoomFactor","ZoomIndicator","t0","$","_c","visible","setVisible","lastFactorRef","timerRef","t1","t2","Math","abs","current","window","clearTimeout","setTimeout","t3","round","percent","t4","t5","t6","t7","BrowserController","agentBrowserCursorOpacity","active","controller","c","_c","DesktopPreviewPointerEvent","MousePointer2","useEffect","useState","useBrowserPointerStore","useBrowserSurfaceStore","agentBrowserCursorOpacity","BrowserController","CURSOR_ACTIVE_MS","AgentBrowserCursor","props","$","tabId","zoomFactor","controller","t0","state","byTabId","event","t1","state_0","content","t2","sequence","AgentBrowserCursorEvent","active","setActive","Symbol","for","timeout","window","setTimeout","clearTimeout","t3","x","scale","scrollLeft","y","scrollTop","t4","opacity","transform","t5","phase","t6","t7","scopedThreadKey","squashAtomCommandFailure","FILL_PREVIEW_VIEWPORT","PreviewViewportSetting","ScopedThreadRef","normalizePreviewUrl","useCallback","useEffect","useRef","useState","useComposerDraftStore","previewAnnotationScreenshotFile","ensureLocalApi","rememberPreviewUrl","updatePreviewServerSnapshot","useThreadPreviewState","resolveDiscoveredServerUrl","useEnvironment","useEnvironmentHttpBaseUrl","previewEnvironment","useAtomCommand","selectThreadPreviewMiniPlayer","usePreviewMiniPlayerStore","useRightPanelStore","previewBridge","subscribePreviewAction","openPreviewSession","PreviewChromeRow","formatPreviewUrl","PreviewEmptyState","PreviewMoreMenu","commitBrowserViewportChange","subscribeBrowserViewportChange","resolveResponsiveBrowserViewportSize","previewRuntimeTabId","PreviewUnreachable","revealInFileExplorerLabel","shouldShowPreviewEmptyState","BrowserSurfaceSlot","useBrowserSurfaceStore","useLoadingProgress","usePreviewSession","ZoomIndicator","AgentBrowserCursor","findActiveBrowserRecordingRuntimeTabId","startBrowserRecording","stopBrowserRecording","useActiveBrowserRecordingTabIds","stackedThreadToast","toastManager","Props","threadRef","tabId","configuredUrls","ReadonlyArray","visible","localApi","window","PreviewView","requestedTabId","focusUrlNonce","setFocusUrlNonce","undefined","pickActive","setPickActive","activeRecordingTabIds","pickActiveRef","isMountedRef","previewState","miniPlayer","state","byThreadKey","addPreviewAnnotation","store","addImage","environment","environmentId","environmentHttpBaseUrl","open","resize","current","activeTabId","runtimeTabId","serverEpoch","recordingRuntimeTabId","has","snapshot","sessions","desktopOverlay","desktopByTabId","navStatus","_tag","const","url","loading","canGoBack","canGoForward","refreshDisabled","isUnreachable","showEmptyState","controller","loadProgress","displayUrl","environmentLabel","label","viewport","panelRect","byTabId","rect","navigateToResolvedUrl","resolvedUrl","navigate","openPreview","handleSubmitUrl","next","handleOpenServerUrl","handleRefresh","refresh","handleZoomIn","zoomIn","handleZoomOut","zoomOut","handleResetZoom","resetZoom","handleViewportChange","nextViewport","result","input","threadId","error","add","type","title","description","Error","message","value","handleToggleDeviceToolbar","catch","responsiveSize","zoomFactor","width","height","handleBack","goBack","handleForward","goForward","handleOpenInBrowser","shell","openExternal","handlePictureInPicture","getState","close","handleNativePictureInPicture","operation","pictureInPicture","handleCapture","record","bridge","then","artifact","pathCopied","toastId","ReturnType","copyPath","navigator","clipboard","writeText","update","actionProps","revealAction","path","updateRecordingToast","setTimeout","children","platform","onClick","revealArtifact","data","secondaryActionProps","disabled","secondaryActionVariant","captureScreenshot","imageCopied","updateScreenshotToast","copyImage","additionalActions","id","props","copyArtifactToClipboard","handlePickElement","cancelPickElement","previouslyFocused","document","activeElement","HTMLElement","annotation","pickElement","screenshotFile","screenshot","name","mimeType","sizeBytes","size","previewUrl","dataUrl","file","isConnected","focus","preventScroll","action","hasWebContents","colorScheme","recentlySeenUrls","code","c","_c","ScopedThreadRef","isPreviewSupportedInRuntime","PreviewPanelShell","PreviewPanelMode","PreviewView","Props","mode","threadRef","tabId","configuredUrls","ReadonlyArray","visible","PreviewPanel","t0","$","t1","Symbol","for","t2","undefined","t3"],"sources":["../../../../node_modules/.pnpm/lucide-react@0.564.0_react@19.2.6/node_modules/lucide-react/dist/esm/icons/camera.js","../../../../node_modules/.pnpm/lucide-react@0.564.0_react@19.2.6/node_modules/lucide-react/dist/esm/icons/ellipsis-vertical.js","../../../../node_modules/.pnpm/lucide-react@0.564.0_react@19.2.6/node_modules/lucide-react/dist/esm/icons/external-link.js","../../../../node_modules/.pnpm/lucide-react@0.564.0_react@19.2.6/node_modules/lucide-react/dist/esm/icons/mouse-pointer-2.js","../../../../node_modules/.pnpm/lucide-react@0.564.0_react@19.2.6/node_modules/lucide-react/dist/esm/icons/radio-tower.js","../../src/components/ui/input-group.tsx","../../src/components/preview/PreviewChromeRow.tsx","../../src/components/preview/previewUrlPresentation.ts","../../src/components/preview/BrowserMockup.tsx","../../src/components/preview/PreviewLocalServerCard.tsx","../../src/components/preview/useDiscoveredLocalServers.ts","../../src/components/preview/PreviewEmptyState.tsx","../../src/components/preview/PreviewMoreMenu.tsx","../../src/components/preview/errorCodeMessages.ts","../../src/components/preview/PreviewUnreachable.tsx","../../src/components/preview/fileExplorerLabel.ts","../../src/components/preview/useLoadingProgress.ts","../../src/components/preview/usePreviewSession.ts","../../src/components/preview/ZoomIndicator.tsx","../../src/components/preview/agentBrowserCursorLogic.ts","../../src/components/preview/AgentBrowserCursor.tsx","../../src/components/preview/PreviewView.tsx","../../src/components/preview/PreviewPanel.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z\",\n key: \"18u6gg\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"13\", r: \"3\", key: \"1vg3eu\" }]\n];\nconst Camera = createLucideIcon(\"camera\", __iconNode);\n\nexport { __iconNode, Camera as default };\n//# sourceMappingURL=camera.js.map\n","/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"1\", key: \"41hilf\" }],\n [\"circle\", { cx: \"12\", cy: \"5\", r: \"1\", key: \"gxeob9\" }],\n [\"circle\", { cx: \"12\", cy: \"19\", r: \"1\", key: \"lyex9k\" }]\n];\nconst EllipsisVertical = createLucideIcon(\"ellipsis-vertical\", __iconNode);\n\nexport { __iconNode, EllipsisVertical as default };\n//# sourceMappingURL=ellipsis-vertical.js.map\n","/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M15 3h6v6\", key: \"1q9fwt\" }],\n [\"path\", { d: \"M10 14 21 3\", key: \"gplh6r\" }],\n [\"path\", { d: \"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\", key: \"a6xqqp\" }]\n];\nconst ExternalLink = createLucideIcon(\"external-link\", __iconNode);\n\nexport { __iconNode, ExternalLink as default };\n//# sourceMappingURL=external-link.js.map\n","/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z\",\n key: \"edeuup\"\n }\n ]\n];\nconst MousePointer2 = createLucideIcon(\"mouse-pointer-2\", __iconNode);\n\nexport { __iconNode, MousePointer2 as default };\n//# sourceMappingURL=mouse-pointer-2.js.map\n","/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M4.9 16.1C1 12.2 1 5.8 4.9 1.9\", key: \"s0qx1y\" }],\n [\"path\", { d: \"M7.8 4.7a6.14 6.14 0 0 0-.8 7.5\", key: \"1idnkw\" }],\n [\"circle\", { cx: \"12\", cy: \"9\", r: \"2\", key: \"1092wv\" }],\n [\"path\", { d: \"M16.2 4.8c2 2 2.26 5.11.8 7.47\", key: \"ojru2q\" }],\n [\"path\", { d: \"M19.1 1.9a9.96 9.96 0 0 1 0 14.1\", key: \"rhi7fg\" }],\n [\"path\", { d: \"M9.5 18h5\", key: \"mfy3pd\" }],\n [\"path\", { d: \"m8 22 4-11 4 11\", key: \"25yftu\" }]\n];\nconst RadioTower = createLucideIcon(\"radio-tower\", __iconNode);\n\nexport { __iconNode, RadioTower as default };\n//# sourceMappingURL=radio-tower.js.map\n","\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\n\nimport { cn } from \"~/lib/utils\";\nimport { Input, type InputProps } from \"~/components/ui/input\";\nimport { Textarea, type TextareaProps } from \"~/components/ui/textarea\";\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\n \"relative inline-flex w-full min-w-0 items-center rounded-lg border border-input bg-background not-dark:bg-clip-padding text-base text-foreground shadow-xs/5 ring-ring/24 transition-shadow before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-has-[input:disabled,textarea:disabled]:not-has-[input:focus-visible,textarea:focus-visible]:not-has-[input[aria-invalid],textarea[aria-invalid]]:before:shadow-[0_1px_--theme(--color-black/4%)] has-[input:focus-visible,textarea:focus-visible]:has-[input[aria-invalid],textarea[aria-invalid]]:border-destructive/64 has-[input:focus-visible,textarea:focus-visible]:has-[input[aria-invalid],textarea[aria-invalid]]:ring-destructive/16 has-[textarea]:h-auto has-data-[align=block-end]:h-auto has-data-[align=block-start]:h-auto has-data-[align=block-end]:flex-col has-data-[align=block-start]:flex-col has-[input:focus-visible,textarea:focus-visible]:border-ring has-[input[aria-invalid],textarea[aria-invalid]]:border-destructive/36 has-autofill:bg-foreground/4 has-[input:disabled,textarea:disabled]:opacity-64 has-[input:disabled,textarea:disabled,input:focus-visible,textarea:focus-visible,input[aria-invalid],textarea[aria-invalid]]:shadow-none has-[input:focus-visible,textarea:focus-visible]:ring-[3px] sm:text-sm dark:bg-input/32 dark:has-autofill:bg-foreground/8 dark:has-[input[aria-invalid],textarea[aria-invalid]]:ring-destructive/24 dark:not-has-[input:disabled,textarea:disabled]:not-has-[input:focus-visible,textarea:focus-visible]:not-has-[input[aria-invalid],textarea[aria-invalid]]:before:shadow-[0_-1px_--theme(--color-white/6%)] has-data-[align=inline-start]:**:[[data-size=sm]_input]:ps-1.5 has-data-[align=inline-end]:**:[[data-size=sm]_input]:pe-1.5 *:[[data-slot=input-control],[data-slot=textarea-control]]:contents *:[[data-slot=input-control],[data-slot=textarea-control]]:before:hidden has-[[data-align=block-start],[data-align=block-end]]:**:[input]:h-auto has-data-[align=inline-start]:**:[input]:ps-2 has-data-[align=inline-end]:**:[input]:pe-2 has-data-[align=block-end]:**:[input]:pt-1.5 has-data-[align=block-start]:**:[input]:pb-1.5 **:[textarea]:min-h-20.5 **:[textarea]:resize-none **:[textarea]:py-[calc(--spacing(3)-1px)] **:[textarea]:max-sm:min-h-23.5 **:[textarea_button]:rounded-[calc(var(--radius-md)-1px)]\",\n className,\n )}\n data-slot=\"input-group\"\n role=\"group\"\n {...props}\n />\n );\n}\n\nconst inputGroupAddonVariants = cva(\n \"[&_svg]:-mx-0.5 flex h-auto cursor-text select-none items-center justify-center gap-2 leading-none [&>kbd]:rounded-[calc(var(--radius)-5px)] in-[[data-slot=input-group]:has([data-slot=input-control],[data-slot=textarea-control])]:[&_svg:not([class*='size-'])]:size-4.5 sm:in-[[data-slot=input-group]:has([data-slot=input-control],[data-slot=textarea-control])]:[&_svg:not([class*='size-'])]:size-4 not-has-[button]:**:[svg:not([class*='opacity-'])]:opacity-80\",\n {\n defaultVariants: {\n align: \"inline-start\",\n },\n variants: {\n align: {\n \"block-end\":\n \"order-last w-full justify-start px-[calc(--spacing(3)-1px)] pb-[calc(--spacing(3)-1px)] [.border-t]:pt-[calc(--spacing(3)-1px)] [[data-size=sm]+&]:px-[calc(--spacing(2.5)-1px)]\",\n \"block-start\":\n \"order-first w-full justify-start px-[calc(--spacing(3)-1px)] pt-[calc(--spacing(3)-1px)] [.border-b]:pb-[calc(--spacing(3)-1px)] [[data-size=sm]+&]:px-[calc(--spacing(2.5)-1px)]\",\n \"inline-end\":\n \"has-[>:last-child[data-slot=badge]]:-me-1.5 has-[>button]:-me-2 order-last pe-[calc(--spacing(3)-1px)] has-[>kbd:last-child]:me-[-0.35rem] [[data-size=sm]+&]:pe-[calc(--spacing(2.5)-1px)]\",\n \"inline-start\":\n \"has-[>:last-child[data-slot=badge]]:-ms-1.5 has-[>button]:-ms-2 order-first ps-[calc(--spacing(3)-1px)] has-[>kbd:last-child]:ms-[-0.35rem] [[data-size=sm]+&]:ps-[calc(--spacing(2.5)-1px)]\",\n },\n },\n },\n);\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n className={cn(inputGroupAddonVariants({ align }), className)}\n data-align={align}\n data-slot=\"input-group-addon\"\n onMouseDown={(e) => {\n const target = e.target as HTMLElement;\n const isInteractive = target.closest(\n \"button, a, input, select, textarea, [role='button'], [role='combobox'], [role='listbox'], [data-slot='select-trigger']\",\n );\n if (isInteractive) return;\n e.preventDefault();\n const parent = e.currentTarget.parentElement;\n const input = parent?.querySelector<HTMLInputElement | HTMLTextAreaElement>(\n \"input, textarea\",\n );\n if (input && !parent?.querySelector(\"input:focus, textarea:focus\")) {\n input.focus();\n }\n }}\n {...props}\n />\n );\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"[&_svg]:-mx-0.5 line-clamp-1 flex items-center gap-2 text-muted-foreground leading-none in-[[data-slot=input-group]:has([data-slot=input-control],[data-slot=textarea-control])]:[&_svg:not([class*='size-'])]:size-4.5 sm:in-[[data-slot=input-group]:has([data-slot=input-control],[data-slot=textarea-control])]:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupInput({ className, ...props }: InputProps) {\n return <Input className={className} unstyled {...props} />;\n}\n\nfunction InputGroupTextarea({ className, ...props }: TextareaProps) {\n return <Textarea className={className} unstyled {...props} />;\n}\n\nexport { InputGroup, InputGroupAddon, InputGroupText, InputGroupInput, InputGroupTextarea };\n","import {\n ArrowLeft,\n ArrowRight,\n Camera,\n ExternalLink,\n MousePointerClick,\n PictureInPicture2,\n RotateCw,\n} from \"lucide-react\";\nimport {\n type FormEvent,\n type KeyboardEvent,\n type ReactNode,\n useEffect,\n useRef,\n useState,\n} from \"react\";\n\nimport { Button } from \"~/components/ui/button\";\nimport { InputGroup, InputGroupAddon, InputGroupInput } from \"~/components/ui/input-group\";\nimport { Tooltip, TooltipPopup, TooltipTrigger } from \"~/components/ui/tooltip\";\nimport { cn } from \"~/lib/utils\";\n\ninterface Props {\n url: string;\n displayUrl?: string | undefined;\n loading: boolean;\n loadProgress: number;\n canGoBack: boolean;\n canGoForward: boolean;\n refreshDisabled: boolean;\n inputDisabled?: boolean | undefined;\n /** Bumping this value re-focuses and selects the URL input. */\n focusUrlNonce?: number | undefined;\n onBack: () => void;\n onForward: () => void;\n onRefresh: () => void;\n onSubmit: (url: string) => void;\n /** When provided, renders an \"Open in browser\" affordance to the right. */\n onOpenInBrowser?: (() => void) | undefined;\n onCapture?: ((record: boolean) => void) | undefined;\n captureDisabled?: boolean | undefined;\n recording?: boolean | undefined;\n onPictureInPicture?: (() => void) | undefined;\n pictureInPicture?: boolean | undefined;\n pictureInPictureDisabled?: boolean | undefined;\n /**\n * When provided, renders an annotation-mode toggle button to the right of\n * the URL input. Pressed while annotation mode is active (button shows in `pressed`\n * state). Disabled in `pickDisabled` mode.\n */\n onPickElement?: (() => void) | undefined;\n pickActive?: boolean | undefined;\n pickDisabled?: boolean | undefined;\n /** Optional reason string surfaced in the disabled tooltip. */\n pickDisabledReason?: string | undefined;\n /**\n * Trailing slot rendered after the URL input. Used by the preview view\n * to mount the three-dot menu (hard reload, devtools, zoom, clear data).\n */\n trailingActions?: ReactNode;\n}\n\nconst NOOP = () => {};\n\nexport function PreviewChromeRow({\n url,\n displayUrl,\n loading,\n loadProgress,\n canGoBack,\n canGoForward,\n refreshDisabled,\n inputDisabled,\n focusUrlNonce,\n onBack,\n onForward,\n onRefresh,\n onSubmit,\n onOpenInBrowser,\n onCapture,\n captureDisabled,\n recording,\n onPictureInPicture,\n pictureInPicture,\n pictureInPictureDisabled,\n onPickElement,\n pickActive,\n pickDisabled,\n pickDisabledReason,\n trailingActions,\n}: Props) {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const [draft, setDraft] = useState(url);\n const [inputFocused, setInputFocused] = useState(false);\n\n useEffect(() => {\n if (focusUrlNonce == null) return;\n const node = inputRef.current;\n if (!node) return;\n node.focus();\n }, [focusUrlNonce]);\n\n const submit = (event?: FormEvent | KeyboardEvent) => {\n event?.preventDefault();\n const next = draft.trim();\n if (next.length === 0) return;\n onSubmit(next);\n inputRef.current?.blur();\n };\n\n return (\n <div className=\"relative\">\n <form onSubmit={submit} className=\"surface-subheader gap-1 px-2\" data-surface-subheader>\n <div className=\"flex items-center gap-0.5\" role=\"group\" aria-label=\"Navigation\">\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={canGoBack ? onBack : NOOP}\n disabled={!canGoBack}\n aria-label=\"Back\"\n type=\"button\"\n />\n }\n >\n <ArrowLeft />\n </TooltipTrigger>\n <TooltipPopup>Back</TooltipPopup>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={canGoForward ? onForward : NOOP}\n disabled={!canGoForward}\n aria-label=\"Forward\"\n type=\"button\"\n />\n }\n >\n <ArrowRight />\n </TooltipTrigger>\n <TooltipPopup>Forward</TooltipPopup>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={refreshDisabled ? NOOP : onRefresh}\n disabled={refreshDisabled}\n aria-label={loading ? \"Stop\" : \"Refresh\"}\n type=\"button\"\n />\n }\n >\n <RotateCw className={cn(loading && \"animate-spin\")} />\n </TooltipTrigger>\n <TooltipPopup>{loading ? \"Loading…\" : \"Refresh\"}</TooltipPopup>\n </Tooltip>\n </div>\n\n <InputGroup className=\"group/address h-7 flex-1 rounded-md border-transparent bg-transparent shadow-none before:shadow-none hover:bg-muted/40 focus-within:bg-background\">\n <Tooltip>\n <TooltipTrigger\n render={\n <InputGroupInput\n ref={inputRef}\n value={inputFocused ? draft : (displayUrl ?? url)}\n className={cn(\n onOpenInBrowser &&\n !inputFocused &&\n \"group-hover/address:pe-7 transition-[padding]\",\n )}\n onChange={(event) => setDraft(event.target.value)}\n onFocus={() => {\n setDraft(url);\n setInputFocused(true);\n queueMicrotask(() => inputRef.current?.select());\n }}\n onBlur={() => {\n setInputFocused(false);\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") submit(event);\n if (event.key === \"Escape\") {\n event.preventDefault();\n setDraft(url);\n inputRef.current?.blur();\n }\n }}\n placeholder=\"Search or enter URL\"\n spellCheck={false}\n disabled={inputDisabled}\n data-preview-url-input\n size=\"sm\"\n />\n }\n />\n {!inputFocused && displayUrl ? <TooltipPopup>{url}</TooltipPopup> : null}\n </Tooltip>\n {onOpenInBrowser && !inputFocused ? (\n <InputGroupAddon\n align=\"inline-end\"\n className=\"pointer-events-none absolute inset-y-0 right-0 opacity-0 transition-opacity group-hover/address:pointer-events-auto group-hover/address:opacity-100\"\n >\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={onOpenInBrowser}\n aria-label=\"Open in system browser\"\n type=\"button\"\n />\n }\n >\n <ExternalLink />\n </TooltipTrigger>\n <TooltipPopup>Open in system browser</TooltipPopup>\n </Tooltip>\n </InputGroupAddon>\n ) : null}\n </InputGroup>\n\n {onPickElement ? (\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n variant={pickActive ? \"secondary\" : \"ghost\"}\n size=\"icon-xs\"\n onClick={onPickElement}\n disabled={pickDisabled}\n aria-label={pickActive ? \"Cancel annotation\" : \"Annotate preview\"}\n aria-pressed={pickActive ? \"true\" : \"false\"}\n type=\"button\"\n />\n }\n >\n <MousePointerClick className={cn(pickActive && \"text-primary\")} />\n </TooltipTrigger>\n <TooltipPopup>\n {pickDisabled && pickDisabledReason\n ? pickDisabledReason\n : pickActive\n ? \"Cancel annotation (Esc)\"\n : \"Annotate elements, regions, and drawings\"}\n </TooltipPopup>\n </Tooltip>\n ) : null}\n {onCapture ? (\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n variant={recording ? \"secondary\" : \"ghost\"}\n size=\"icon-xs\"\n onClick={(event) => onCapture(event.shiftKey)}\n aria-label={recording ? \"Stop recording\" : \"Capture screenshot\"}\n type=\"button\"\n className=\"relative\"\n disabled={captureDisabled}\n />\n }\n >\n <Camera className={cn(recording && \"text-destructive\")} />\n {recording ? (\n <span className=\"absolute right-0.5 top-0.5 size-1.5 animate-status-pulse rounded-full bg-destructive\" />\n ) : null}\n </TooltipTrigger>\n <TooltipPopup>\n {recording ? \"Stop recording\" : \"Screenshot · Shift-click to record\"}\n </TooltipPopup>\n </Tooltip>\n ) : null}\n {onPictureInPicture ? (\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n variant={pictureInPicture ? \"secondary\" : \"ghost\"}\n size=\"icon-xs\"\n onClick={onPictureInPicture}\n aria-label={\n pictureInPicture ? \"Close floating preview\" : \"Float preview over chat\"\n }\n aria-pressed={pictureInPicture ? \"true\" : \"false\"}\n type=\"button\"\n disabled={pictureInPictureDisabled}\n />\n }\n >\n <PictureInPicture2 className={cn(pictureInPicture && \"text-primary\")} />\n </TooltipTrigger>\n <TooltipPopup>\n {pictureInPicture ? \"Close floating preview\" : \"Float preview over chat\"}\n </TooltipPopup>\n </Tooltip>\n ) : null}\n {trailingActions}\n </form>\n {loadProgress > 0 ? (\n <div\n aria-hidden\n className=\"pointer-events-none absolute bottom-0 left-0 z-10 h-0.5 rounded-r-full bg-primary transition-all duration-150 ease-out\"\n style={{\n width: `${loadProgress}%`,\n boxShadow: \"0 0 6px 1px var(--color-ring)\",\n }}\n />\n ) : null}\n </div>\n );\n}\n","interface PreviewUrlPresentationInput {\n readonly url: string;\n readonly environmentLabel: string;\n readonly environmentHttpBaseUrl: string;\n}\n\nexport function formatPreviewUrl(input: PreviewUrlPresentationInput): string | null {\n try {\n const url = new URL(input.url);\n const environmentUrl = new URL(input.environmentHttpBaseUrl);\n if (url.origin === environmentUrl.origin && url.pathname.startsWith(\"/api/assets/\")) {\n const encodedFileName = url.pathname.split(\"/\").at(-1);\n if (!encodedFileName) {\n return null;\n }\n const fileName = decodeURIComponent(encodedFileName);\n if (!fileName || fileName === \".\" || fileName === \"..\") {\n return null;\n }\n return `${input.environmentLabel} · ${fileName}`;\n }\n\n return url.protocol === \"http:\" || url.protocol === \"https:\" ? url.host : null;\n } catch {\n return null;\n }\n}\n","import { cn } from \"~/lib/utils\";\n\n/** Browser-window thumbnail glyph for the \"Local\" recommendation cards. */\nexport function BrowserMockup({ className }: { className?: string }) {\n return (\n <div\n aria-hidden\n className={cn(\n \"relative flex flex-col gap-0.5 overflow-hidden rounded-[5px] border border-border/60 bg-card p-1 shadow-xs/5\",\n className,\n )}\n >\n <div className=\"flex gap-[2px]\">\n <span className=\"size-[3px] rounded-full bg-destructive/80\" />\n <span className=\"size-[3px] rounded-full bg-warning/80\" />\n <span className=\"size-[3px] rounded-full bg-success/80\" />\n </div>\n <div className=\"mt-[1px] flex flex-1 flex-col gap-[2px]\">\n <span className=\"h-[2px] w-full rounded-full bg-muted-foreground/30\" />\n <span className=\"h-[2px] w-3/5 rounded-full bg-muted-foreground/20\" />\n </div>\n </div>\n );\n}\n","import { BrowserMockup } from \"./BrowserMockup\";\nimport type { PreviewableServer } from \"./useDiscoveredLocalServers\";\n\ninterface Props {\n server: PreviewableServer;\n onOpen: () => void;\n}\n\nexport function PreviewLocalServerCard({ server, onOpen }: Props) {\n const subtitle = describeServer(server);\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className=\"group flex w-full items-center gap-3 px-3 py-3 text-left hover:bg-accent/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\"\n >\n <BrowserMockup className=\"size-7 shrink-0\" />\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate text-sm font-medium text-foreground\">{subtitle}</span>\n <span className=\"truncate text-xs text-muted-foreground\">\n {server.host}:{server.port}\n </span>\n </div>\n {server.listening ? <PulsingDot /> : <DimDot />}\n </button>\n );\n}\n\nfunction describeServer(server: PreviewableServer): string {\n if (server.processName) return server.processName;\n if (server.listening) return \"Listening\";\n if (server.source === \"configured\") return \"Configured\";\n return \"Recently seen\";\n}\n\nfunction PulsingDot() {\n return (\n <span aria-label=\"Listening\" className=\"relative inline-flex size-2 shrink-0\">\n <span className=\"absolute inset-0 animate-status-ping rounded-full bg-success opacity-60\" />\n <span className=\"relative inline-flex size-2 rounded-full bg-success\" />\n </span>\n );\n}\n\nfunction DimDot() {\n return (\n <span\n aria-label=\"Not currently listening\"\n className=\"size-2 shrink-0 rounded-full bg-muted-foreground/40\"\n />\n );\n}\n","import type { DiscoveredLocalServer } from \"@t3tools/contracts\";\nimport { isLoopbackHost } from \"@t3tools/shared/preview\";\nimport { useMemo } from \"react\";\n\nimport type { EnvironmentId } from \"@t3tools/contracts\";\nimport { resolveDiscoveredServerUrl } from \"~/browser/browserTargetResolver\";\nimport { useDiscoveredPorts } from \"~/portDiscoveryState\";\n\nexport interface PreviewableServer extends DiscoveredLocalServer {\n source: \"scanner\" | \"configured\" | \"recent\";\n /**\n * True when the port scanner currently sees this server listening. A\n * `configured` entry can also be `listening` when the scan enriched it.\n */\n listening: boolean;\n}\n\ninterface UseDiscoveredLocalServersInput {\n environmentId: EnvironmentId;\n configuredUrls?: ReadonlyArray<string> | undefined;\n recentlySeenUrls?: ReadonlyArray<string> | undefined;\n}\n\n/**\n * Merge the environment-level port snapshot with configured / recently-seen\n * URLs and return a stable sorted list.\n */\nexport function useDiscoveredLocalServers(\n input: UseDiscoveredLocalServersInput,\n): ReadonlyArray<PreviewableServer> {\n const scannerSnapshot = useDiscoveredPorts(input.environmentId);\n\n return useMemo(\n () =>\n mergeServers({\n scanner: scannerSnapshot.map((server) => ({\n ...server,\n url: resolveDiscoveredServerUrl(input.environmentId, server.url),\n })),\n configuredUrls: input.configuredUrls ?? [],\n recentlySeenUrls: input.recentlySeenUrls ?? [],\n }),\n [input.environmentId, scannerSnapshot, input.configuredUrls, input.recentlySeenUrls],\n );\n}\n\nexport function mergeServers(input: {\n scanner: ReadonlyArray<DiscoveredLocalServer>;\n configuredUrls: ReadonlyArray<string>;\n recentlySeenUrls: ReadonlyArray<string>;\n}): ReadonlyArray<PreviewableServer> {\n const seen = new Map<string, PreviewableServer>();\n\n for (const url of input.configuredUrls) {\n const parsed = parseLocalUrl(url);\n if (!parsed) continue;\n const key = canonicalKey(parsed.host, parsed.port);\n if (seen.has(key)) continue;\n seen.set(key, {\n host: parsed.host,\n port: parsed.port,\n url: parsed.url,\n processName: null,\n pid: null,\n terminal: null,\n source: \"configured\",\n listening: false,\n });\n }\n\n for (const server of input.scanner) {\n const key = canonicalKey(server.host, server.port);\n const existing = seen.get(key);\n if (existing) {\n // Enrich a configured entry with live process metadata; flip\n // `listening` so it pulses green like a scanner-discovered entry.\n seen.set(key, {\n ...existing,\n processName: server.processName ?? existing.processName,\n pid: server.pid ?? existing.pid,\n terminal: server.terminal ?? existing.terminal,\n listening: true,\n });\n continue;\n }\n seen.set(key, { ...server, source: \"scanner\", listening: true });\n }\n\n for (const url of input.recentlySeenUrls) {\n const parsed = parseLocalUrl(url);\n if (!parsed) continue;\n const key = canonicalKey(parsed.host, parsed.port);\n if (seen.has(key)) continue;\n seen.set(key, {\n host: parsed.host,\n port: parsed.port,\n url: parsed.url,\n processName: null,\n pid: null,\n terminal: null,\n source: \"recent\",\n listening: false,\n });\n }\n\n return Array.from(seen.values()).toSorted((a, b) => {\n const sourceOrder: Record<PreviewableServer[\"source\"], number> = {\n configured: 0,\n scanner: 1,\n recent: 2,\n };\n if (sourceOrder[a.source] !== sourceOrder[b.source]) {\n return sourceOrder[a.source] - sourceOrder[b.source];\n }\n return a.port - b.port;\n });\n}\n\nfunction canonicalKey(host: string, port: number): string {\n return `${host.toLowerCase()}:${port}`;\n}\n\nfunction parseLocalUrl(raw: string): { host: string; port: number; url: string } | null {\n try {\n const parsed = new URL(raw);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") return null;\n if (!isLoopbackHost(parsed.hostname)) return null;\n const port = parsed.port\n ? Number.parseInt(parsed.port, 10)\n : parsed.protocol === \"http:\"\n ? 80\n : 443;\n if (!Number.isFinite(port) || port <= 0) return null;\n return { host: parsed.hostname, port, url: parsed.href };\n } catch {\n return null;\n }\n}\n","import type { EnvironmentId } from \"@t3tools/contracts\";\nimport { Globe, RadioTower } from \"lucide-react\";\n\nimport { Empty, EmptyDescription, EmptyMedia, EmptyTitle } from \"~/components/ui/empty\";\n\nimport { PreviewLocalServerCard } from \"./PreviewLocalServerCard\";\nimport { useDiscoveredLocalServers } from \"./useDiscoveredLocalServers\";\n\ninterface Props {\n environmentId: EnvironmentId;\n configuredUrls?: ReadonlyArray<string> | undefined;\n recentlySeenUrls?: ReadonlyArray<string> | undefined;\n onOpenUrl: (url: string) => void;\n}\n\nexport function PreviewEmptyState({\n environmentId,\n configuredUrls,\n recentlySeenUrls,\n onOpenUrl,\n}: Props) {\n const servers = useDiscoveredLocalServers({\n environmentId,\n configuredUrls,\n recentlySeenUrls,\n });\n\n if (servers.length === 0) {\n return (\n <Empty>\n <EmptyMedia variant=\"icon\">\n <Globe className=\"size-4.5 text-muted-foreground\" />\n </EmptyMedia>\n <EmptyTitle>No preview yet</EmptyTitle>\n <EmptyDescription>\n Type a URL above, or run a dev script. Listening localhost ports will show up here\n automatically.\n </EmptyDescription>\n </Empty>\n );\n }\n\n return (\n <div className=\"flex h-full min-h-0 overflow-y-auto px-5 py-8\">\n <div className=\"m-auto flex w-full max-w-xl flex-col gap-3\">\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <RadioTower className=\"size-4 shrink-0\" />\n <h2 className=\"font-medium\">Local servers</h2>\n </div>\n <div className=\"flex flex-col divide-y divide-border/60 overflow-hidden rounded-xl border border-border/70 bg-background\">\n {servers.map((server) => (\n <PreviewLocalServerCard\n key={`${server.host}:${server.port}`}\n server={server}\n onOpen={() => onOpenUrl(server.url)}\n />\n ))}\n </div>\n <p className=\"px-1 text-xs text-muted-foreground\">\n Select a listening port to open it in this browser tab.\n </p>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport type { DesktopPreviewColorScheme } from \"@t3tools/contracts\";\nimport { Minus, MoreVertical, Plus as PlusIcon, RotateCcw } from \"lucide-react\";\n\nimport { Button } from \"~/components/ui/button\";\nimport {\n Menu,\n MenuItem,\n MenuPopup,\n MenuRadioGroup,\n MenuRadioItem,\n MenuSeparator,\n MenuSub,\n MenuSubPopup,\n MenuSubTrigger,\n MenuTrigger,\n} from \"~/components/ui/menu\";\nimport { Tooltip, TooltipPopup, TooltipTrigger } from \"~/components/ui/tooltip\";\n\nimport { previewBridge } from \"./previewBridge\";\n\nconst COLOR_SCHEME_OPTIONS: ReadonlyArray<{\n value: DesktopPreviewColorScheme;\n label: string;\n}> = [\n { value: \"system\", label: \"System\" },\n { value: \"light\", label: \"Light\" },\n { value: \"dark\", label: \"Dark\" },\n];\n\ninterface Props {\n /** Active preview tab id. Tab-targeting actions are disabled without it. */\n tabId: string | null;\n /**\n * True only after the desktop bridge has registered a `webContentsId` for\n * the active tab. Tab-targeting actions throw on the desktop side until\n * then; we disable those items so the menu doesn't fire silent no-ops.\n */\n hasWebContents: boolean;\n /** Current zoom factor as a number (1.0 = 100%). */\n zoomFactor: number;\n /** Emulated `prefers-color-scheme` for the guest page. */\n colorScheme: DesktopPreviewColorScheme;\n /** Fixed viewport modes expose the device toolbar and resize rails. */\n deviceToolbarVisible: boolean;\n /** Switches between fill-panel mode and a fixed responsive viewport. */\n onToggleDeviceToolbar: () => void;\n /** Whether the separate native always-on-top preview window is open. */\n nativePictureInPicture: boolean;\n /** Toggles the optional native always-on-top preview window. */\n onNativePictureInPicture: () => void;\n}\n\n/**\n * Three-dot menu in the chrome row. Wires Hard reload, DevTools, zoom\n * controls, and storage-clearing actions. Only mounted by `PreviewView`\n * when the desktop bridge is present, so we can call it unconditionally.\n */\nexport function PreviewMoreMenu({\n tabId,\n hasWebContents,\n zoomFactor,\n colorScheme,\n deviceToolbarVisible,\n onToggleDeviceToolbar,\n nativePictureInPicture,\n onNativePictureInPicture,\n}: Props) {\n if (!previewBridge) return null;\n const bridge = previewBridge;\n const tabDisabled = !tabId || !hasWebContents;\n const callTab = (op: (tabId: string) => Promise<void>) => () => {\n if (!tabId) return;\n void op(tabId).catch(() => undefined);\n };\n\n const zoomLabel = `${Math.round(zoomFactor * 100)}%`;\n return (\n <Menu>\n <Tooltip>\n <TooltipTrigger\n render={\n <MenuTrigger\n render={\n <Button variant=\"ghost\" size=\"icon-xs\" type=\"button\" aria-label=\"Preview menu\" />\n }\n />\n }\n >\n <MoreVertical />\n </TooltipTrigger>\n <TooltipPopup>More</TooltipPopup>\n </Tooltip>\n <MenuPopup align=\"end\" sideOffset={6} className=\"min-w-56\">\n <MenuItem onClick={callTab(bridge.hardReload)} disabled={tabDisabled}>\n Hard reload\n </MenuItem>\n <MenuItem onClick={callTab(bridge.openDevTools)} disabled={tabDisabled}>\n Open DevTools\n </MenuItem>\n <MenuItem onClick={onNativePictureInPicture} disabled={tabDisabled}>\n {nativePictureInPicture\n ? \"Close separate preview window\"\n : \"Open separate preview window\"}\n </MenuItem>\n <MenuItem onClick={onToggleDeviceToolbar} disabled={tabDisabled}>\n {deviceToolbarVisible ? \"Hide device toolbar\" : \"Show device toolbar\"}\n </MenuItem>\n <MenuSub>\n <MenuSubTrigger disabled={tabDisabled}>Appearance</MenuSubTrigger>\n <MenuSubPopup className=\"min-w-32\">\n <MenuRadioGroup\n value={colorScheme}\n onValueChange={(value) => {\n if (!tabId) return;\n void bridge\n .setColorScheme(tabId, value as DesktopPreviewColorScheme)\n .catch(() => undefined);\n }}\n >\n {COLOR_SCHEME_OPTIONS.map((option) => (\n <MenuRadioItem key={option.value} value={option.value}>\n {option.label}\n </MenuRadioItem>\n ))}\n </MenuRadioGroup>\n </MenuSubPopup>\n </MenuSub>\n <MenuSeparator />\n {/*\n Zoom row: label + inline control cluster. `closeOnClick=false`\n keeps the menu open while the user clicks the +/− buttons.\n */}\n <MenuItem\n closeOnClick={false}\n onClick={(event: React.MouseEvent) => event.preventDefault()}\n className=\"justify-between\"\n disabled={tabDisabled}\n >\n <span>Zoom</span>\n <span className=\"flex items-center gap-1\">\n <Button\n variant=\"outline\"\n size=\"icon-xs\"\n type=\"button\"\n onClick={callTab(bridge.zoomOut)}\n aria-label=\"Zoom out\"\n disabled={tabDisabled}\n >\n <Minus />\n </Button>\n <span className=\"min-w-12 text-center text-xs tabular-nums text-muted-foreground\">\n {zoomLabel}\n </span>\n <Button\n variant=\"outline\"\n size=\"icon-xs\"\n type=\"button\"\n onClick={callTab(bridge.zoomIn)}\n aria-label=\"Zoom in\"\n disabled={tabDisabled}\n >\n <PlusIcon />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon-xs\"\n type=\"button\"\n onClick={callTab(bridge.resetZoom)}\n aria-label=\"Reset zoom\"\n disabled={tabDisabled}\n >\n <RotateCcw />\n </Button>\n </span>\n </MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => void bridge.clearCookies().catch(() => undefined)}>\n Clear cookies\n </MenuItem>\n <MenuItem onClick={() => void bridge.clearCache().catch(() => undefined)}>\n Clear cache\n </MenuItem>\n </MenuPopup>\n </Menu>\n );\n}\n","import { PREVIEW_ERROR_CODE_MESSAGES } from \"./previewConstants\";\n\n/**\n * Resolve a friendly description for a Chromium / network error. Falls back\n * to the description string passed in when it isn't in our table.\n */\nexport function describePreviewError(description: string): string {\n const friendly = PREVIEW_ERROR_CODE_MESSAGES[description];\n if (friendly) return friendly;\n if (description.length > 0) return description;\n return \"Network error\";\n}\n","import { useState } from \"react\";\n\nimport { Button } from \"~/components/ui/button\";\n\nimport { describePreviewError } from \"./errorCodeMessages\";\n\ninterface Props {\n url: string;\n /** Chromium net error code, e.g. -105. */\n code: number;\n /** Stringified Chromium error, e.g. \"ERR_NAME_NOT_RESOLVED\". */\n description: string;\n onReload: () => void;\n}\n\n/** Theme-aware tailwind port of Chromium's \"This site can't be reached\" page. */\nexport function PreviewUnreachable({ url, code, description, onReload }: Props) {\n const [showDetails, setShowDetails] = useState(false);\n const host = safeHost(url) ?? url;\n const friendly = describePreviewError(description);\n const errorLabel = description.length > 0 ? description : `ERR_${Math.abs(code) || \"FAILED\"}`;\n\n return (\n <div className=\"relative flex h-full min-h-0 w-full overflow-y-auto bg-background\">\n <div className=\"mx-auto flex w-full max-w-xl flex-1 flex-col px-8 py-12 sm:py-16\">\n <ErrorIcon className=\"mb-6 size-12 text-muted-foreground/70\" />\n <h1 className=\"mb-3 text-2xl font-semibold leading-tight text-foreground\">\n This site can&rsquo;t be reached\n </h1>\n <p className=\"text-sm leading-relaxed text-muted-foreground\">\n <span className=\"font-semibold text-foreground\">{host}</span>: {friendly}.\n </p>\n\n {showDetails ? (\n <div className=\"mt-6 rounded-lg border border-border bg-muted/40 p-4 text-sm\">\n <p className=\"mb-2 font-medium text-foreground\">Try:</p>\n <ul className=\"list-disc space-y-1 pl-5 text-muted-foreground\">\n <li>Checking your connection</li>\n <li>Confirming the dev server is running</li>\n <li>Checking the proxy and the firewall</li>\n </ul>\n </div>\n ) : null}\n\n <div className=\"mt-8 text-xs uppercase tracking-wide text-muted-foreground/70\">\n {errorLabel}\n </div>\n\n <div className=\"mt-auto flex items-center gap-2 pt-8\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setShowDetails((value) => !value)}\n >\n {showDetails ? \"Hide details\" : \"Details\"}\n </Button>\n <div className=\"flex-1\" />\n <Button type=\"button\" size=\"sm\" onClick={onReload}>\n Reload\n </Button>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ErrorIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 64 64\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n className={className}\n >\n <path d=\"M16 12 L48 12 L48 52 L16 52 Z\" />\n <path d=\"M22 22 L42 22 M22 30 L36 30 M22 38 L40 38\" strokeLinecap=\"round\" />\n <path d=\"M52 8 L12 56\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nfunction safeHost(url: string): string | null {\n try {\n return new URL(url).host;\n } catch {\n return null;\n }\n}\n","export function revealInFileExplorerLabel(platform: string): string {\n const normalized = platform.toLowerCase();\n if (normalized.includes(\"mac\")) return \"Reveal in Finder\";\n if (normalized.includes(\"win\")) return \"Reveal in File Explorer\";\n return \"Reveal in Files\";\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nconst TICK_INTERVAL_MS = 120;\nconst FADE_OUT_DELAY_MS = 220;\nconst SEED_PERCENT = 4;\nconst ASYMPTOTE_PERCENT = 90;\nconst APPROACH_FACTOR = 0.08;\nconst MIN_INCREMENT = 0.5;\n\n/**\n * Indeterminate progress simulator for the preview chrome's loading bar.\n * Animates 0 → 90% asymptotically while `loading` is true, snaps to 100%\n * on release, then resets after a short pause.\n *\n * Uses a ref to thread the latest progress through interval ticks without\n * needing `loading` to retrigger the effect, which sidesteps the stale-\n * closure pitfalls of reading `progress` directly.\n */\nexport function useLoadingProgress(loading: boolean): number {\n const [progress, setProgress] = useState(0);\n const progressRef = useRef(0);\n progressRef.current = progress;\n\n useEffect(() => {\n if (!loading) {\n if (progressRef.current === 0) return;\n setProgress(100);\n const timer = window.setTimeout(() => setProgress(0), FADE_OUT_DELAY_MS);\n return () => window.clearTimeout(timer);\n }\n\n setProgress((value) => (value > 0 && value < 95 ? value : SEED_PERCENT));\n const interval = window.setInterval(() => {\n const current = progressRef.current;\n if (current >= ASYMPTOTE_PERCENT) return;\n const remaining = ASYMPTOTE_PERCENT - current;\n const increment = Math.max(MIN_INCREMENT, remaining * APPROACH_FACTOR);\n setProgress(Math.min(ASYMPTOTE_PERCENT, current + increment));\n }, TICK_INTERVAL_MS);\n\n return () => window.clearInterval(interval);\n }, [loading]);\n\n return progress;\n}\n","\"use client\";\n\nimport { useAtomValue } from \"@effect/atom-react\";\nimport { parseScopedThreadKey, scopedThreadKey } from \"@t3tools/client-runtime/environment\";\nimport type { ScopedThreadRef } from \"@t3tools/contracts\";\nimport * as Schema from \"effect/Schema\";\nimport { AsyncResult, Atom } from \"effect/unstable/reactivity\";\n\nimport {\n applyPreviewServerEvent,\n readThreadPreviewState,\n reconcilePreviewServerSessions,\n} from \"~/previewStateStore\";\nimport { previewEnvironment } from \"~/state/preview\";\n\nclass PreviewSessionThreadKeyParseError extends Schema.TaggedErrorClass<PreviewSessionThreadKeyParseError>()(\n \"PreviewSessionThreadKeyParseError\",\n { threadKey: Schema.String },\n) {\n override get message(): string {\n return `Invalid scoped preview thread key: ${this.threadKey}`;\n }\n}\n\nconst previewSessionSyncAtom = Atom.family((threadKey: string) => {\n const threadRef = parseScopedThreadKey(threadKey);\n if (threadRef === null) {\n throw new PreviewSessionThreadKeyParseError({ threadKey });\n }\n\n const sessionsAtom = previewEnvironment.list({\n environmentId: threadRef.environmentId,\n input: { threadId: threadRef.threadId },\n });\n const eventsAtom = previewEnvironment.events({\n environmentId: threadRef.environmentId,\n input: {},\n });\n\n return Atom.make((get) => {\n let disposed = false;\n let eventsVersion = 0;\n\n const reconcileSessions = (result: Atom.Type<typeof sessionsAtom>) => {\n if (!AsyncResult.isSuccess(result)) return;\n reconcilePreviewServerSessions(threadRef, result.value);\n };\n\n const applyLatestEvent = (result: Atom.Type<typeof eventsAtom>) => {\n if (!AsyncResult.isSuccess(result) || result.value.threadId !== threadRef.threadId) return;\n const currentEpoch = readThreadPreviewState(threadRef).serverEpoch;\n if (currentEpoch !== null && currentEpoch !== result.value.serverEpoch) {\n get.refresh(sessionsAtom);\n return;\n }\n applyPreviewServerEvent(threadRef, result.value);\n };\n\n get.addFinalizer(() => {\n disposed = true;\n });\n const initialEvent = get.once(eventsAtom);\n get.subscribe(sessionsAtom, (result) => {\n reconcileSessions(result);\n });\n get.subscribe(eventsAtom, (result) => {\n eventsVersion += 1;\n applyLatestEvent(result);\n });\n queueMicrotask(() => {\n if (disposed) return;\n // The cached list can predate an automation-created tab. Keep the local\n // snapshot visible until an authoritative refresh arrives instead of\n // reconciling against a stale empty result when the panel first mounts.\n get.refresh(sessionsAtom);\n if (eventsVersion === 0) applyLatestEvent(initialEvent);\n });\n }).pipe(Atom.setIdleTTL(1_000), Atom.withLabel(`preview:session-sync:${threadKey}`));\n});\n\nexport function usePreviewSession(threadRef: ScopedThreadRef): void {\n useAtomValue(previewSessionSyncAtom(scopedThreadKey(threadRef)));\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nimport { cn } from \"~/lib/utils\";\n\nconst HIDE_AFTER_MS = 1500;\nconst ZOOM_EPSILON = 0.001;\n\ninterface Props {\n /** Current zoom factor (1.0 = 100%); changes drive the transient indicator. */\n zoomFactor: number;\n}\n\n/**\n * Floating \"X%\" pill that surfaces in the top-right of the webview area\n * whenever the zoom factor changes, then fades out after a short pause.\n *\n * Suppressed for the first render's value so we don't flash 100% on mount.\n */\nexport function ZoomIndicator({ zoomFactor }: Props) {\n const [visible, setVisible] = useState(false);\n const lastFactorRef = useRef(zoomFactor);\n const timerRef = useRef<number | null>(null);\n\n useEffect(() => {\n if (Math.abs(lastFactorRef.current - zoomFactor) < ZOOM_EPSILON) return;\n lastFactorRef.current = zoomFactor;\n setVisible(true);\n if (timerRef.current !== null) window.clearTimeout(timerRef.current);\n timerRef.current = window.setTimeout(() => {\n setVisible(false);\n timerRef.current = null;\n }, HIDE_AFTER_MS);\n return () => {\n if (timerRef.current !== null) {\n window.clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n };\n }, [zoomFactor]);\n\n const percent = `${Math.round(zoomFactor * 100)}%`;\n\n return (\n <div\n aria-hidden={!visible}\n className={cn(\n \"pointer-events-none absolute top-3 right-3 z-20 select-none rounded-full border border-border/70 bg-popover/95 px-2.5 py-1 text-xs font-medium text-foreground shadow-md/10 backdrop-blur transition-all duration-200 ease-out\",\n visible ? \"opacity-100 translate-y-0\" : \"opacity-0 -translate-y-1\",\n )}\n >\n {percent}\n </div>\n );\n}\n","export type BrowserController = \"human\" | \"agent\" | \"none\";\n\nexport function agentBrowserCursorOpacity(active: boolean, controller: BrowserController): number {\n if (active) return 1;\n return controller === \"human\" ? 0.18 : 0.35;\n}\n","\"use client\";\n\nimport type { DesktopPreviewPointerEvent } from \"@t3tools/contracts\";\nimport { MousePointer2 } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\n\nimport { useBrowserPointerStore } from \"~/browser/browserPointerStore\";\nimport { useBrowserSurfaceStore } from \"~/browser/browserSurfaceStore\";\n\nimport { agentBrowserCursorOpacity, type BrowserController } from \"./agentBrowserCursorLogic\";\n\nconst CURSOR_ACTIVE_MS = 700;\n\nexport function AgentBrowserCursor(props: {\n readonly tabId: string;\n readonly zoomFactor: number;\n readonly controller: BrowserController;\n}) {\n const { tabId, zoomFactor, controller } = props;\n const event = useBrowserPointerStore((state) => state.byTabId[tabId] ?? null);\n const content = useBrowserSurfaceStore((state) => state.byTabId[tabId]?.content ?? null);\n\n if (!event) return null;\n\n return (\n <AgentBrowserCursorEvent\n key={event.sequence}\n event={event}\n content={content}\n zoomFactor={zoomFactor}\n controller={controller}\n />\n );\n}\n\nfunction AgentBrowserCursorEvent(props: {\n readonly event: DesktopPreviewPointerEvent;\n readonly content: {\n readonly x: number;\n readonly y: number;\n readonly scale: number;\n readonly scrollLeft: number;\n readonly scrollTop: number;\n } | null;\n readonly zoomFactor: number;\n readonly controller: BrowserController;\n}) {\n const { event, content, zoomFactor, controller } = props;\n const [active, setActive] = useState(true);\n\n useEffect(() => {\n const timeout = window.setTimeout(() => setActive(false), CURSOR_ACTIVE_MS);\n return () => window.clearTimeout(timeout);\n }, []);\n\n return (\n <div\n className=\"pointer-events-none absolute left-0 top-0 z-40 transition-[transform,opacity] duration-150 ease-out motion-reduce:transition-none\"\n style={{\n opacity: agentBrowserCursorOpacity(active, controller),\n transform: `translate3d(${event.x * zoomFactor * (content?.scale ?? 1) + (content?.x ?? 0) - (content?.scrollLeft ?? 0)}px, ${event.y * zoomFactor * (content?.scale ?? 1) + (content?.y ?? 0) - (content?.scrollTop ?? 0)}px, 0)`,\n }}\n aria-hidden=\"true\"\n data-agent-browser-cursor\n >\n {event.phase === \"click\" ? (\n <span\n key={event.sequence}\n className=\"absolute left-0.5 top-0.5 size-4 animate-status-ping rounded-full bg-primary/25 motion-reduce:animate-none\"\n />\n ) : null}\n <MousePointer2\n className=\"relative size-5 -translate-x-0.5 -translate-y-0.5 fill-background text-primary drop-shadow-sm\"\n strokeWidth={2}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { scopedThreadKey } from \"@t3tools/client-runtime/environment\";\nimport { squashAtomCommandFailure } from \"@t3tools/client-runtime/state/runtime\";\nimport {\n FILL_PREVIEW_VIEWPORT,\n type PreviewViewportSetting,\n type ScopedThreadRef,\n} from \"@t3tools/contracts\";\nimport { normalizePreviewUrl } from \"@t3tools/shared/preview\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { useComposerDraftStore } from \"~/composerDraftStore\";\nimport { previewAnnotationScreenshotFile } from \"~/lib/previewAnnotation\";\nimport { ensureLocalApi } from \"~/localApi\";\nimport {\n rememberPreviewUrl,\n updatePreviewServerSnapshot,\n useThreadPreviewState,\n} from \"~/previewStateStore\";\nimport { resolveDiscoveredServerUrl } from \"~/browser/browserTargetResolver\";\nimport { useEnvironment, useEnvironmentHttpBaseUrl } from \"~/state/environments\";\nimport { previewEnvironment } from \"~/state/preview\";\nimport { useAtomCommand } from \"~/state/use-atom-command\";\nimport { selectThreadPreviewMiniPlayer, usePreviewMiniPlayerStore } from \"~/previewMiniPlayerStore\";\nimport { useRightPanelStore } from \"~/rightPanelStore\";\n\nimport { previewBridge } from \"./previewBridge\";\nimport { subscribePreviewAction } from \"./previewActionBus\";\nimport { openPreviewSession } from \"./openPreviewSession\";\nimport { PreviewChromeRow } from \"./PreviewChromeRow\";\nimport { formatPreviewUrl } from \"./previewUrlPresentation\";\nimport { PreviewEmptyState } from \"./PreviewEmptyState\";\nimport { PreviewMoreMenu } from \"./PreviewMoreMenu\";\nimport {\n commitBrowserViewportChange,\n subscribeBrowserViewportChange,\n} from \"~/browser/browserViewportActions\";\nimport { resolveResponsiveBrowserViewportSize } from \"~/browser/browserViewportLayout\";\nimport { previewRuntimeTabId } from \"~/browser/previewRuntimeTabId\";\nimport { PreviewUnreachable } from \"./PreviewUnreachable\";\nimport { revealInFileExplorerLabel } from \"./fileExplorerLabel\";\nimport { shouldShowPreviewEmptyState } from \"./previewEmptyStateLogic\";\nimport { BrowserSurfaceSlot } from \"~/browser/BrowserSurfaceSlot\";\nimport { useBrowserSurfaceStore } from \"~/browser/browserSurfaceStore\";\nimport { useLoadingProgress } from \"./useLoadingProgress\";\nimport { usePreviewSession } from \"./usePreviewSession\";\nimport { ZoomIndicator } from \"./ZoomIndicator\";\nimport { AgentBrowserCursor } from \"./AgentBrowserCursor\";\nimport {\n findActiveBrowserRecordingRuntimeTabId,\n startBrowserRecording,\n stopBrowserRecording,\n useActiveBrowserRecordingTabIds,\n} from \"~/browser/browserRecording\";\nimport { stackedThreadToast, toastManager } from \"~/components/ui/toast\";\n\ninterface Props {\n threadRef: ScopedThreadRef;\n tabId?: string | null;\n configuredUrls?: ReadonlyArray<string> | undefined;\n visible: boolean;\n}\n\nconst localApi = typeof window === \"undefined\" ? null : ensureLocalApi();\n\n/**\n * Single-tab preview surface: chrome row on top, one webview below, empty\n * state when no session exists for the thread.\n */\nexport function PreviewView({ threadRef, tabId: requestedTabId, configuredUrls, visible }: Props) {\n const [focusUrlNonce, setFocusUrlNonce] = useState<number | undefined>(undefined);\n const [pickActive, setPickActive] = useState(false);\n const activeRecordingTabIds = useActiveBrowserRecordingTabIds();\n const pickActiveRef = useRef(false);\n const isMountedRef = useRef(true);\n const previewState = useThreadPreviewState(threadRef);\n const miniPlayer = usePreviewMiniPlayerStore((state) =>\n selectThreadPreviewMiniPlayer(state.byThreadKey, threadRef),\n );\n const addPreviewAnnotation = useComposerDraftStore((store) => store.addPreviewAnnotation);\n const addImage = useComposerDraftStore((store) => store.addImage);\n const environment = useEnvironment(threadRef.environmentId);\n const environmentHttpBaseUrl = useEnvironmentHttpBaseUrl(threadRef.environmentId);\n const open = useAtomCommand(previewEnvironment.open);\n const resize = useAtomCommand(previewEnvironment.resize, \"preview viewport resize\");\n\n usePreviewSession(threadRef);\n\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n const tabId = requestedTabId ?? previewState.activeTabId;\n const runtimeTabId = tabId\n ? previewRuntimeTabId(threadRef, previewState.serverEpoch, tabId)\n : null;\n const recordingRuntimeTabId =\n tabId && runtimeTabId\n ? activeRecordingTabIds.has(runtimeTabId)\n ? runtimeTabId\n : findActiveBrowserRecordingRuntimeTabId(threadRef, tabId)\n : null;\n const snapshot = tabId ? (previewState.sessions[tabId] ?? null) : null;\n const desktopOverlay = tabId ? (previewState.desktopByTabId[tabId] ?? null) : null;\n const navStatus = snapshot?.navStatus ?? { _tag: \"Idle\" as const };\n const url = navStatus._tag === \"Idle\" ? \"\" : navStatus.url;\n const loading = desktopOverlay?.loading ?? navStatus._tag === \"Loading\";\n const canGoBack = desktopOverlay?.canGoBack ?? snapshot?.canGoBack ?? false;\n const canGoForward = desktopOverlay?.canGoForward ?? snapshot?.canGoForward ?? false;\n const refreshDisabled = navStatus._tag === \"Idle\";\n const isUnreachable = navStatus._tag === \"LoadFailed\";\n const showEmptyState = shouldShowPreviewEmptyState(snapshot);\n const controller = desktopOverlay?.controller ?? \"none\";\n const loadProgress = useLoadingProgress(loading);\n const displayUrl =\n url && environment && environmentHttpBaseUrl\n ? (formatPreviewUrl({\n url,\n environmentLabel: environment.label,\n environmentHttpBaseUrl,\n }) ?? undefined)\n : undefined;\n const viewport = snapshot?.viewport ?? FILL_PREVIEW_VIEWPORT;\n const panelRect = useBrowserSurfaceStore((state) =>\n runtimeTabId ? (state.byTabId[runtimeTabId]?.rect ?? null) : null,\n );\n\n const navigateToResolvedUrl = useCallback(\n async (resolvedUrl: string) => {\n if (runtimeTabId && previewBridge) {\n // Drive the webview imperatively; `usePreviewBridge` mirrors the\n // resolved URL back to the server so other clients stay in sync.\n await previewBridge.navigate(runtimeTabId, resolvedUrl);\n rememberPreviewUrl(threadRef, resolvedUrl);\n } else {\n await openPreviewSession({\n openPreview: open,\n threadRef,\n url: resolvedUrl,\n });\n }\n },\n [open, runtimeTabId, threadRef],\n );\n\n const handleSubmitUrl = useCallback(\n async (next: string) => {\n try {\n await navigateToResolvedUrl(normalizePreviewUrl(next));\n } catch {\n // Server-side `failed` event renders the unreachable view.\n }\n },\n [navigateToResolvedUrl],\n );\n\n const handleOpenServerUrl = useCallback(\n async (next: string) => {\n try {\n await navigateToResolvedUrl(resolveDiscoveredServerUrl(threadRef.environmentId, next));\n } catch {\n // Server-side `failed` event renders the unreachable view.\n }\n },\n [navigateToResolvedUrl, threadRef.environmentId],\n );\n\n const handleRefresh = useCallback(() => {\n if (previewBridge && runtimeTabId) void previewBridge.refresh(runtimeTabId);\n }, [runtimeTabId]);\n\n const handleZoomIn = useCallback(() => {\n if (previewBridge && runtimeTabId) void previewBridge.zoomIn(runtimeTabId);\n }, [runtimeTabId]);\n\n const handleZoomOut = useCallback(() => {\n if (previewBridge && runtimeTabId) void previewBridge.zoomOut(runtimeTabId);\n }, [runtimeTabId]);\n\n const handleResetZoom = useCallback(() => {\n if (previewBridge && runtimeTabId) void previewBridge.resetZoom(runtimeTabId);\n }, [runtimeTabId]);\n\n const handleViewportChange = useCallback(\n async (nextViewport: PreviewViewportSetting) => {\n if (!tabId) return;\n const result = await resize({\n environmentId: threadRef.environmentId,\n input: {\n threadId: threadRef.threadId,\n tabId,\n viewport: nextViewport,\n },\n });\n if (result._tag === \"Failure\") {\n const error = squashAtomCommandFailure(result);\n toastManager.add({\n type: \"error\",\n title: \"Unable to resize browser viewport\",\n description: error instanceof Error ? error.message : \"An error occurred.\",\n });\n throw error;\n }\n updatePreviewServerSnapshot(threadRef, result.value);\n },\n [resize, tabId, threadRef],\n );\n\n const handleToggleDeviceToolbar = () => {\n if (!runtimeTabId) return;\n if (viewport._tag !== \"fill\") {\n void commitBrowserViewportChange(runtimeTabId, FILL_PREVIEW_VIEWPORT).catch(() => undefined);\n return;\n }\n\n const responsiveSize = panelRect\n ? resolveResponsiveBrowserViewportSize(panelRect, desktopOverlay?.zoomFactor)\n : { width: 1024, height: 768 };\n void commitBrowserViewportChange(runtimeTabId, { _tag: \"freeform\", ...responsiveSize }).catch(\n () => undefined,\n );\n };\n\n useEffect(() => {\n if (!runtimeTabId) return;\n return subscribeBrowserViewportChange(runtimeTabId, handleViewportChange);\n }, [handleViewportChange, runtimeTabId]);\n\n const handleBack = useCallback(() => {\n if (previewBridge && runtimeTabId) void previewBridge.goBack(runtimeTabId);\n }, [runtimeTabId]);\n\n const handleForward = useCallback(() => {\n if (previewBridge && runtimeTabId) void previewBridge.goForward(runtimeTabId);\n }, [runtimeTabId]);\n\n const handleOpenInBrowser = useCallback(() => {\n if (!localApi || !url) return;\n void localApi.shell.openExternal(url).catch(() => undefined);\n }, [url]);\n\n const handlePictureInPicture = useCallback(() => {\n if (!tabId) return;\n if (miniPlayer?.tabId === tabId) {\n usePreviewMiniPlayerStore.getState().close(threadRef);\n return;\n }\n usePreviewMiniPlayerStore.getState().open(threadRef, tabId);\n useRightPanelStore.getState().close(threadRef);\n }, [miniPlayer?.tabId, tabId, threadRef]);\n\n const handleNativePictureInPicture = useCallback(() => {\n if (!previewBridge || !runtimeTabId) return;\n const operation = desktopOverlay?.pictureInPicture\n ? previewBridge.pictureInPicture.close\n : previewBridge.pictureInPicture.open;\n void operation(runtimeTabId).catch((error) => {\n toastManager.add({\n type: \"error\",\n title: \"Unable to update popped-out preview\",\n description: error instanceof Error ? error.message : \"An error occurred.\",\n });\n });\n }, [desktopOverlay?.pictureInPicture, runtimeTabId]);\n\n const handleCapture = useCallback(\n (record: boolean) => {\n if (!previewBridge || !runtimeTabId || !tabId) return;\n const bridge = previewBridge;\n if (recordingRuntimeTabId) {\n void stopBrowserRecording(recordingRuntimeTabId).then(\n (artifact) => {\n if (!artifact) return;\n let pathCopied = false;\n let toastId: ReturnType<typeof toastManager.add>;\n\n const copyPath = () => {\n if (!navigator.clipboard?.writeText) {\n toastManager.update(\n toastId,\n stackedThreadToast({\n type: \"error\",\n title: \"Unable to copy recording path\",\n description: \"Clipboard API unavailable.\",\n actionProps: revealAction,\n }),\n );\n return;\n }\n\n void navigator.clipboard.writeText(artifact.path).then(\n () => {\n pathCopied = true;\n updateRecordingToast();\n window.setTimeout(() => {\n pathCopied = false;\n updateRecordingToast();\n }, 2_000);\n },\n (error) => {\n toastManager.update(\n toastId,\n stackedThreadToast({\n type: \"error\",\n title: \"Unable to copy recording path\",\n description: error instanceof Error ? error.message : \"An error occurred.\",\n actionProps: revealAction,\n }),\n );\n },\n );\n };\n\n const revealAction = {\n children: revealInFileExplorerLabel(navigator.platform),\n onClick: () => void bridge.revealArtifact(artifact.path),\n };\n const updateRecordingToast = () => {\n toastManager.update(\n toastId,\n stackedThreadToast({\n type: \"success\",\n title: \"Recording saved\",\n actionProps: revealAction,\n data: {\n secondaryActionProps: {\n children: pathCopied ? \"Copied!\" : \"Copy path\",\n disabled: pathCopied,\n onClick: copyPath,\n },\n secondaryActionVariant: \"outline\",\n },\n }),\n );\n };\n\n toastId = toastManager.add(\n stackedThreadToast({\n type: \"success\",\n title: \"Recording saved\",\n actionProps: revealAction,\n data: {\n secondaryActionProps: {\n children: \"Copy path\",\n onClick: copyPath,\n },\n secondaryActionVariant: \"outline\",\n },\n }),\n );\n },\n (error) => {\n toastManager.add({\n type: \"error\",\n title: \"Unable to stop recording\",\n description: error instanceof Error ? error.message : \"An error occurred.\",\n });\n },\n );\n return;\n }\n if (record) {\n void startBrowserRecording(runtimeTabId, threadRef, tabId).catch((error) => {\n toastManager.add({\n type: \"error\",\n title: \"Unable to start recording\",\n description: error instanceof Error ? error.message : \"An error occurred.\",\n });\n });\n return;\n }\n void bridge.captureScreenshot(runtimeTabId).then(\n (artifact) => {\n const revealAction = {\n children: revealInFileExplorerLabel(navigator.platform),\n onClick: () => void bridge.revealArtifact(artifact.path),\n };\n let pathCopied = false;\n let imageCopied = false;\n let toastId: ReturnType<typeof toastManager.add>;\n\n const updateScreenshotToast = (\n type: \"success\" | \"error\" = \"success\",\n title = \"Screenshot saved\",\n description?: string,\n ) => {\n toastManager.update(\n toastId,\n stackedThreadToast({\n type,\n title,\n description,\n actionProps: {\n children: imageCopied ? \"Copied!\" : \"Copy image\",\n disabled: imageCopied,\n onClick: copyImage,\n },\n data: {\n additionalActions: [\n {\n id: \"copy-path\",\n props: {\n children: pathCopied ? \"Copied!\" : \"Copy path\",\n disabled: pathCopied,\n onClick: copyPath,\n },\n },\n ],\n secondaryActionProps: {\n ...revealAction,\n },\n secondaryActionVariant: \"outline\",\n },\n }),\n );\n };\n\n const copyPath = () => {\n if (!navigator.clipboard?.writeText) {\n updateScreenshotToast(\n \"error\",\n \"Unable to copy screenshot path\",\n \"Clipboard API unavailable.\",\n );\n return;\n }\n\n void navigator.clipboard.writeText(artifact.path).then(\n () => {\n pathCopied = true;\n updateScreenshotToast();\n window.setTimeout(() => {\n pathCopied = false;\n updateScreenshotToast();\n }, 2_000);\n },\n (error) => {\n updateScreenshotToast(\n \"error\",\n \"Unable to copy screenshot path\",\n error instanceof Error ? error.message : \"An error occurred.\",\n );\n },\n );\n };\n\n const copyImage = () => {\n void bridge.copyArtifactToClipboard(artifact.path).then(\n () => {\n imageCopied = true;\n updateScreenshotToast();\n window.setTimeout(() => {\n imageCopied = false;\n updateScreenshotToast();\n }, 2_000);\n },\n (error) => {\n updateScreenshotToast(\n \"error\",\n \"Unable to copy screenshot\",\n error instanceof Error ? error.message : \"An error occurred.\",\n );\n },\n );\n };\n\n toastId = toastManager.add(\n stackedThreadToast({\n type: \"success\",\n title: \"Screenshot saved\",\n actionProps: {\n children: \"Copy image\",\n onClick: copyImage,\n },\n data: {\n additionalActions: [\n {\n id: \"copy-path\",\n props: {\n children: \"Copy path\",\n onClick: copyPath,\n },\n },\n ],\n secondaryActionProps: {\n ...revealAction,\n },\n secondaryActionVariant: \"outline\",\n },\n }),\n );\n },\n (error) => {\n toastManager.add({\n type: \"error\",\n title: \"Unable to capture screenshot\",\n description: error instanceof Error ? error.message : \"An error occurred.\",\n });\n },\n );\n },\n [recordingRuntimeTabId, runtimeTabId, tabId, threadRef],\n );\n\n const handlePickElement = useCallback(() => {\n if (!previewBridge || !runtimeTabId) return;\n if (pickActiveRef.current) {\n void previewBridge.cancelPickElement(runtimeTabId).catch(() => undefined);\n return;\n }\n // Snapshot whatever the user was focused on (typically the chat\n // composer textarea or the chrome-row pick button) BEFORE main steals\n // focus into the guest webContents. We restore it when the pick\n // resolves so the user's typing context isn't lost — otherwise after\n // every pick they'd have to click back into the textarea.\n const previouslyFocused =\n typeof document !== \"undefined\" ? (document.activeElement as HTMLElement | null) : null;\n pickActiveRef.current = true;\n setPickActive(true);\n void (async () => {\n try {\n const annotation = await previewBridge.pickElement(runtimeTabId);\n if (!annotation) return;\n addPreviewAnnotation(threadRef, annotation);\n const screenshotFile = await previewAnnotationScreenshotFile(annotation);\n if (screenshotFile && annotation.screenshot) {\n addImage(threadRef, {\n type: \"image\",\n id: annotation.id,\n name: screenshotFile.name,\n mimeType: screenshotFile.type,\n sizeBytes: screenshotFile.size,\n previewUrl: annotation.screenshot.dataUrl,\n file: screenshotFile,\n });\n }\n } catch {\n // Picker failed (e.g. webview navigated). Treat as silent cancel.\n } finally {\n pickActiveRef.current = false;\n // Avoid `setState on unmounted component` if the panel/thread closed\n // while the pick was in flight.\n if (isMountedRef.current) setPickActive(false);\n // Best-effort: restore focus to whatever the user had before the\n // pick stole it into the guest webContents. Skip if the previously-\n // focused element was unmounted or is no longer focusable.\n if (\n previouslyFocused &&\n previouslyFocused.isConnected &&\n typeof previouslyFocused.focus === \"function\"\n ) {\n try {\n previouslyFocused.focus({ preventScroll: true });\n } catch {\n // Some elements throw on .focus() (detached iframes, etc.).\n }\n }\n }\n })();\n }, [addImage, addPreviewAnnotation, runtimeTabId, threadRef]);\n\n // If the active tab changes mid-pick (close, thread switch, hot restart),\n // tell main to tear down the in-flight session AND reset our local toggle\n // state so the button doesn't get stuck pressed against a stale tab id.\n useEffect(() => {\n return () => {\n if (!pickActiveRef.current) return;\n pickActiveRef.current = false;\n if (previewBridge && runtimeTabId) {\n void previewBridge.cancelPickElement(runtimeTabId).catch(() => undefined);\n }\n if (isMountedRef.current) setPickActive(false);\n };\n }, [runtimeTabId]);\n\n // Subscribe only while visible; `toggle-panel` is owned by ChatView's\n // URL-aware handler regardless of whether the panel is currently mounted.\n useEffect(() => {\n if (!visible) return;\n return subscribePreviewAction((action) => {\n switch (action) {\n case \"refresh\":\n handleRefresh();\n return;\n case \"focus-url\":\n setFocusUrlNonce((value) => (value ?? 0) + 1);\n return;\n case \"zoom-in\":\n handleZoomIn();\n return;\n case \"zoom-out\":\n handleZoomOut();\n return;\n case \"reset-zoom\":\n handleResetZoom();\n return;\n case \"toggle-panel\":\n return;\n }\n });\n }, [handleRefresh, handleResetZoom, handleZoomIn, handleZoomOut, visible]);\n\n return (\n <div\n className=\"flex min-h-0 flex-1 flex-col bg-background\"\n data-thread-key={scopedThreadKey(threadRef)}\n >\n <PreviewChromeRow\n url={url}\n displayUrl={displayUrl}\n loading={loading}\n loadProgress={loadProgress}\n canGoBack={canGoBack}\n canGoForward={canGoForward}\n refreshDisabled={refreshDisabled}\n focusUrlNonce={focusUrlNonce}\n onBack={handleBack}\n onForward={handleForward}\n onRefresh={handleRefresh}\n onSubmit={(next) => void handleSubmitUrl(next)}\n onOpenInBrowser={tabId ? handleOpenInBrowser : undefined}\n onCapture={previewBridge && tabId ? handleCapture : undefined}\n captureDisabled={!desktopOverlay || isUnreachable}\n recording={recordingRuntimeTabId !== null}\n onPictureInPicture={previewBridge && tabId ? handlePictureInPicture : undefined}\n pictureInPicture={miniPlayer?.tabId === tabId}\n pictureInPictureDisabled={!desktopOverlay?.hasWebContents || isUnreachable}\n onPickElement={previewBridge && tabId ? handlePickElement : undefined}\n pickActive={pickActive}\n // Disable when there's no tab (nothing to pick on) OR the page\n // failed to load (a React overlay covers the webview, so the\n // user wouldn't be able to actually click anything underneath).\n pickDisabled={!tabId || isUnreachable}\n pickDisabledReason={\n isUnreachable ? \"Page didn't load — pick unavailable until the page renders\" : undefined\n }\n trailingActions={\n previewBridge ? (\n <PreviewMoreMenu\n tabId={runtimeTabId}\n hasWebContents={desktopOverlay?.hasWebContents ?? false}\n zoomFactor={desktopOverlay?.zoomFactor ?? 1}\n colorScheme={desktopOverlay?.colorScheme ?? \"system\"}\n deviceToolbarVisible={viewport._tag !== \"fill\"}\n onToggleDeviceToolbar={handleToggleDeviceToolbar}\n nativePictureInPicture={desktopOverlay?.pictureInPicture ?? false}\n onNativePictureInPicture={handleNativePictureInPicture}\n />\n ) : null\n }\n />\n\n <div className=\"relative min-h-0 flex-1 overflow-hidden\">\n {runtimeTabId && snapshot && !showEmptyState ? (\n <BrowserSurfaceSlot\n key={runtimeTabId}\n tabId={runtimeTabId}\n visible={visible && !isUnreachable}\n className=\"absolute inset-0 h-full w-full\"\n />\n ) : null}\n {showEmptyState ? (\n <PreviewEmptyState\n environmentId={threadRef.environmentId}\n configuredUrls={configuredUrls}\n recentlySeenUrls={previewState.recentlySeenUrls}\n onOpenUrl={(next) => void handleOpenServerUrl(next)}\n />\n ) : null}\n {snapshot && desktopOverlay ? (\n <ZoomIndicator zoomFactor={desktopOverlay.zoomFactor} />\n ) : null}\n {runtimeTabId && desktopOverlay && !showEmptyState && !isUnreachable ? (\n <AgentBrowserCursor\n tabId={runtimeTabId}\n zoomFactor={desktopOverlay.zoomFactor}\n controller={controller}\n />\n ) : null}\n {controller !== \"none\" ? (\n <div className=\"pointer-events-none absolute left-3 top-3 z-40 rounded-full border border-border/70 bg-background/90 px-2.5 py-1 text-[11px] font-medium shadow-sm backdrop-blur\">\n {controller === \"agent\" ? \"Agent controlling browser\" : \"Human control\"}\n </div>\n ) : null}\n {navStatus._tag === \"LoadFailed\" ? (\n <div className=\"absolute inset-0 z-10 bg-background\">\n <PreviewUnreachable\n url={navStatus.url}\n code={navStatus.code}\n description={navStatus.description}\n onReload={handleRefresh}\n />\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport type { ScopedThreadRef } from \"@t3tools/contracts\";\n\nimport { isPreviewSupportedInRuntime } from \"~/previewStateStore\";\n\nimport { PreviewPanelShell, type PreviewPanelMode } from \"./PreviewPanelShell\";\nimport { PreviewView } from \"./PreviewView\";\n\ninterface Props {\n mode: PreviewPanelMode;\n threadRef: ScopedThreadRef;\n tabId?: string | null;\n configuredUrls?: ReadonlyArray<string> | undefined;\n visible: boolean;\n}\n\nexport function PreviewPanel({ mode, threadRef, tabId, configuredUrls, visible }: Props) {\n if (!isPreviewSupportedInRuntime()) {\n return (\n <PreviewPanelShell mode={mode}>\n <div className=\"flex min-h-0 flex-1 flex-col items-center justify-center gap-3 p-8 text-center\">\n <p className=\"max-w-sm text-sm text-muted-foreground\">\n Preview is only available in the laplus desktop app.\n </p>\n </div>\n </PreviewPanelShell>\n );\n }\n\n return (\n <PreviewPanelShell mode={mode}>\n <PreviewView\n threadRef={threadRef}\n {...(tabId !== undefined ? { tabId } : {})}\n configuredUrls={configuredUrls}\n visible={visible}\n />\n </PreviewPanelShell>\n );\n}\n"],"x_google_ignoreList":[0,1,2,3,4],"mappings":"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"}
1
+ {"version":3,"file":"PreviewPanel-BnwuSdta.js","names":["__iconNode","__iconNode","__iconNode","__iconNode","c","_c","cva","VariantProps","React","cn","Input","InputProps","Textarea","TextareaProps","InputGroup","t0","$","className","props","t1","t2","inputGroupAddonVariants","defaultVariants","align","variants","InputGroupAddon","undefined","t3","_temp","e","target","HTMLElement","isInteractive","closest","preventDefault","parent","currentTarget","parentElement","input","querySelector","focus","InputGroupText","InputGroupInput","InputGroupTextarea","ArrowLeft","ArrowRight","Camera","ExternalLink","MousePointerClick","PictureInPicture2","RotateCw","FormEvent","KeyboardEvent","ReactNode","useEffect","useRef","useState","Button","InputGroup","InputGroupAddon","InputGroupInput","Tooltip","TooltipPopup","TooltipTrigger","cn","Props","url","displayUrl","loading","loadProgress","canGoBack","canGoForward","refreshDisabled","inputDisabled","focusUrlNonce","onBack","onForward","onRefresh","onSubmit","onOpenInBrowser","onCapture","record","captureDisabled","recording","onPictureInPicture","pictureInPicture","pictureInPictureDisabled","onPickElement","pickActive","pickDisabled","pickDisabledReason","trailingActions","NOOP","PreviewChromeRow","t0","$","_c","inputRef","draft","setDraft","inputFocused","setInputFocused","t1","t2","node","current","focus","t3","event","preventDefault","next","trim","length","blur","submit","t4","t5","t6","t7","Symbol","for","t8","t9","t10","t11","t12","t13","t14","t15","t16","t17","t18","t19","t20","t21","t22","t23","t24","t25","t26","t27","t28","t29","t30","t31","t32","event_0","target","value","t33","queueMicrotask","select","t34","t35","event_1","key","t36","t37","t38","t39","t40","t41","t42","event_2","shiftKey","t43","t44","t45","width","boxShadow","t46","PreviewUrlPresentationInput","url","environmentLabel","environmentHttpBaseUrl","formatPreviewUrl","input","URL","environmentUrl","origin","pathname","startsWith","encodedFileName","split","at","fileName","decodeURIComponent","protocol","host","cn","BrowserMockup","t0","$","_c","className","t1","t2","Symbol","for","t3","t4","BrowserMockup","PreviewableServer","Props","server","onOpen","PreviewLocalServerCard","t0","$","_c","t1","describeServer","subtitle","t2","Symbol","for","t3","t4","host","port","t5","t6","listening","t7","processName","source","PulsingDot","DimDot","DiscoveredLocalServer","isLoopbackHost","useMemo","EnvironmentId","resolveDiscoveredServerUrl","useDiscoveredPorts","PreviewableServer","source","listening","UseDiscoveredLocalServersInput","environmentId","configuredUrls","ReadonlyArray","recentlySeenUrls","useDiscoveredLocalServers","input","$","_c","scannerSnapshot","t0","t1","server","url","mergeServers","scanner","map","seen","Map","parsed","parseLocalUrl","key","canonicalKey","host","port","has","set","processName","pid","terminal","existing","get","Array","from","values","toSorted","a","b","sourceOrder","Record","configured","recent","toLowerCase","raw","URL","protocol","hostname","Number","parseInt","isFinite","href","EnvironmentId","Globe","RadioTower","Empty","EmptyDescription","EmptyMedia","EmptyTitle","PreviewLocalServerCard","useDiscoveredLocalServers","Props","environmentId","configuredUrls","ReadonlyArray","recentlySeenUrls","onOpenUrl","url","PreviewEmptyState","t0","$","_c","t1","servers","length","t2","Symbol","for","t3","t4","server","host","port","map","t5","t6","c","_c","DesktopPreviewColorScheme","Minus","MoreVertical","Plus","PlusIcon","RotateCcw","Button","Menu","MenuItem","MenuPopup","MenuRadioGroup","MenuRadioItem","MenuSeparator","MenuSub","MenuSubPopup","MenuSubTrigger","MenuTrigger","Tooltip","TooltipPopup","TooltipTrigger","previewBridge","COLOR_SCHEME_OPTIONS","ReadonlyArray","value","label","Props","tabId","hasWebContents","zoomFactor","colorScheme","deviceToolbarVisible","onToggleDeviceToolbar","nativePictureInPicture","onNativePictureInPicture","PreviewMoreMenu","t0","$","tabDisabled","t1","op","catch","_temp","callTab","t2","Math","round","zoomLabel","t3","Symbol","for","t4","hardReload","t5","t6","openDevTools","t7","t8","t9","t10","t11","t12","t13","setColorScheme","_temp2","t14","map","_temp3","t15","t16","t17","t18","t19","zoomOut","t20","t21","t22","t23","zoomIn","t24","t25","t26","resetZoom","t27","t28","t29","t30","_temp4","t31","t32","t33","_temp6","_temp8","t34","clearCache","_temp7","clearCookies","_temp5","event","preventDefault","option","PREVIEW_ERROR_CODE_MESSAGES","describePreviewError","description","friendly","length","useState","Button","describePreviewError","Props","url","code","description","onReload","PreviewUnreachable","t0","$","_c","showDetails","setShowDetails","t1","safeHost","host","t2","friendly","t3","length","Math","abs","errorLabel","t4","t5","Symbol","for","t6","t7","t8","t9","t10","_temp","t11","t12","t13","t14","t15","t16","value","ErrorIcon","className","URL","revealInFileExplorerLabel","platform","normalized","toLowerCase","includes","useEffect","useRef","useState","TICK_INTERVAL_MS","FADE_OUT_DELAY_MS","SEED_PERCENT","ASYMPTOTE_PERCENT","APPROACH_FACTOR","MIN_INCREMENT","useLoadingProgress","loading","progress","setProgress","progressRef","current","timer","window","setTimeout","clearTimeout","value","interval","setInterval","remaining","increment","Math","max","min","clearInterval","c","_c","useAtomValue","parseScopedThreadKey","scopedThreadKey","ScopedThreadRef","Schema","AsyncResult","Atom","applyPreviewServerEvent","readThreadPreviewState","reconcilePreviewServerSessions","previewEnvironment","PreviewSessionThreadKeyParseError","TaggedErrorClass","threadKey","String","message","previewSessionSyncAtom","family","threadRef","sessionsAtom","list","environmentId","input","threadId","eventsAtom","events","make","get","disposed","eventsVersion","reconcileSessions","result","Type","isSuccess","value","applyLatestEvent","currentEpoch","serverEpoch","refresh","addFinalizer","initialEvent","once","subscribe","queueMicrotask","pipe","setIdleTTL","withLabel","usePreviewSession","$","t0","useEffect","useRef","useState","cn","HIDE_AFTER_MS","ZOOM_EPSILON","Props","zoomFactor","ZoomIndicator","t0","$","_c","visible","setVisible","lastFactorRef","timerRef","t1","t2","Math","abs","current","window","clearTimeout","setTimeout","t3","round","percent","t4","t5","t6","t7","BrowserController","agentBrowserCursorOpacity","active","controller","c","_c","DesktopPreviewPointerEvent","MousePointer2","useEffect","useState","useBrowserPointerStore","useBrowserSurfaceStore","agentBrowserCursorOpacity","BrowserController","CURSOR_ACTIVE_MS","AgentBrowserCursor","props","$","tabId","zoomFactor","controller","t0","state","byTabId","event","t1","state_0","content","t2","sequence","AgentBrowserCursorEvent","active","setActive","Symbol","for","timeout","window","setTimeout","clearTimeout","t3","x","scale","scrollLeft","y","scrollTop","t4","opacity","transform","t5","phase","t6","t7","scopedThreadKey","squashAtomCommandFailure","FILL_PREVIEW_VIEWPORT","PreviewViewportSetting","ScopedThreadRef","normalizePreviewUrl","useCallback","useEffect","useRef","useState","useComposerDraftStore","previewAnnotationScreenshotFile","ensureLocalApi","rememberPreviewUrl","updatePreviewServerSnapshot","useThreadPreviewState","resolveDiscoveredServerUrl","useEnvironment","useEnvironmentHttpBaseUrl","previewEnvironment","useAtomCommand","selectThreadPreviewMiniPlayer","usePreviewMiniPlayerStore","useRightPanelStore","previewBridge","subscribePreviewAction","openPreviewSession","PreviewChromeRow","formatPreviewUrl","PreviewEmptyState","PreviewMoreMenu","commitBrowserViewportChange","subscribeBrowserViewportChange","resolveResponsiveBrowserViewportSize","previewRuntimeTabId","PreviewUnreachable","revealInFileExplorerLabel","shouldShowPreviewEmptyState","BrowserSurfaceSlot","useBrowserSurfaceStore","useLoadingProgress","usePreviewSession","ZoomIndicator","AgentBrowserCursor","findActiveBrowserRecordingRuntimeTabId","startBrowserRecording","stopBrowserRecording","useActiveBrowserRecordingTabIds","stackedThreadToast","toastManager","Props","threadRef","tabId","configuredUrls","ReadonlyArray","visible","localApi","window","PreviewView","requestedTabId","focusUrlNonce","setFocusUrlNonce","undefined","pickActive","setPickActive","activeRecordingTabIds","pickActiveRef","isMountedRef","previewState","miniPlayer","state","byThreadKey","addPreviewAnnotation","store","addImage","environment","environmentId","environmentHttpBaseUrl","open","resize","current","activeTabId","runtimeTabId","serverEpoch","recordingRuntimeTabId","has","snapshot","sessions","desktopOverlay","desktopByTabId","navStatus","_tag","const","url","loading","canGoBack","canGoForward","refreshDisabled","isUnreachable","showEmptyState","controller","loadProgress","displayUrl","environmentLabel","label","viewport","panelRect","byTabId","rect","navigateToResolvedUrl","resolvedUrl","navigate","openPreview","handleSubmitUrl","next","handleOpenServerUrl","handleRefresh","refresh","handleZoomIn","zoomIn","handleZoomOut","zoomOut","handleResetZoom","resetZoom","handleViewportChange","nextViewport","result","input","threadId","error","add","type","title","description","Error","message","value","handleToggleDeviceToolbar","catch","responsiveSize","zoomFactor","width","height","handleBack","goBack","handleForward","goForward","handleOpenInBrowser","shell","openExternal","handlePictureInPicture","getState","close","handleNativePictureInPicture","operation","pictureInPicture","handleCapture","record","bridge","then","artifact","pathCopied","toastId","ReturnType","copyPath","navigator","clipboard","writeText","update","actionProps","revealAction","path","updateRecordingToast","setTimeout","children","platform","onClick","revealArtifact","data","secondaryActionProps","disabled","secondaryActionVariant","captureScreenshot","imageCopied","updateScreenshotToast","copyImage","additionalActions","id","props","copyArtifactToClipboard","handlePickElement","cancelPickElement","previouslyFocused","document","activeElement","HTMLElement","annotation","pickElement","screenshotFile","screenshot","name","mimeType","sizeBytes","size","previewUrl","dataUrl","file","isConnected","focus","preventScroll","action","hasWebContents","colorScheme","recentlySeenUrls","code","c","_c","ScopedThreadRef","isPreviewSupportedInRuntime","PreviewPanelShell","PreviewPanelMode","PreviewView","Props","mode","threadRef","tabId","configuredUrls","ReadonlyArray","visible","PreviewPanel","t0","$","t1","Symbol","for","t2","undefined","t3"],"sources":["../../../../node_modules/.pnpm/lucide-react@0.564.0_react@19.2.6/node_modules/lucide-react/dist/esm/icons/camera.js","../../../../node_modules/.pnpm/lucide-react@0.564.0_react@19.2.6/node_modules/lucide-react/dist/esm/icons/ellipsis-vertical.js","../../../../node_modules/.pnpm/lucide-react@0.564.0_react@19.2.6/node_modules/lucide-react/dist/esm/icons/external-link.js","../../../../node_modules/.pnpm/lucide-react@0.564.0_react@19.2.6/node_modules/lucide-react/dist/esm/icons/mouse-pointer-2.js","../../../../node_modules/.pnpm/lucide-react@0.564.0_react@19.2.6/node_modules/lucide-react/dist/esm/icons/radio-tower.js","../../src/components/ui/input-group.tsx","../../src/components/preview/PreviewChromeRow.tsx","../../src/components/preview/previewUrlPresentation.ts","../../src/components/preview/BrowserMockup.tsx","../../src/components/preview/PreviewLocalServerCard.tsx","../../src/components/preview/useDiscoveredLocalServers.ts","../../src/components/preview/PreviewEmptyState.tsx","../../src/components/preview/PreviewMoreMenu.tsx","../../src/components/preview/errorCodeMessages.ts","../../src/components/preview/PreviewUnreachable.tsx","../../src/components/preview/fileExplorerLabel.ts","../../src/components/preview/useLoadingProgress.ts","../../src/components/preview/usePreviewSession.ts","../../src/components/preview/ZoomIndicator.tsx","../../src/components/preview/agentBrowserCursorLogic.ts","../../src/components/preview/AgentBrowserCursor.tsx","../../src/components/preview/PreviewView.tsx","../../src/components/preview/PreviewPanel.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z\",\n key: \"18u6gg\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"13\", r: \"3\", key: \"1vg3eu\" }]\n];\nconst Camera = createLucideIcon(\"camera\", __iconNode);\n\nexport { __iconNode, Camera as default };\n//# sourceMappingURL=camera.js.map\n","/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"1\", key: \"41hilf\" }],\n [\"circle\", { cx: \"12\", cy: \"5\", r: \"1\", key: \"gxeob9\" }],\n [\"circle\", { cx: \"12\", cy: \"19\", r: \"1\", key: \"lyex9k\" }]\n];\nconst EllipsisVertical = createLucideIcon(\"ellipsis-vertical\", __iconNode);\n\nexport { __iconNode, EllipsisVertical as default };\n//# sourceMappingURL=ellipsis-vertical.js.map\n","/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M15 3h6v6\", key: \"1q9fwt\" }],\n [\"path\", { d: \"M10 14 21 3\", key: \"gplh6r\" }],\n [\"path\", { d: \"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\", key: \"a6xqqp\" }]\n];\nconst ExternalLink = createLucideIcon(\"external-link\", __iconNode);\n\nexport { __iconNode, ExternalLink as default };\n//# sourceMappingURL=external-link.js.map\n","/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z\",\n key: \"edeuup\"\n }\n ]\n];\nconst MousePointer2 = createLucideIcon(\"mouse-pointer-2\", __iconNode);\n\nexport { __iconNode, MousePointer2 as default };\n//# sourceMappingURL=mouse-pointer-2.js.map\n","/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M4.9 16.1C1 12.2 1 5.8 4.9 1.9\", key: \"s0qx1y\" }],\n [\"path\", { d: \"M7.8 4.7a6.14 6.14 0 0 0-.8 7.5\", key: \"1idnkw\" }],\n [\"circle\", { cx: \"12\", cy: \"9\", r: \"2\", key: \"1092wv\" }],\n [\"path\", { d: \"M16.2 4.8c2 2 2.26 5.11.8 7.47\", key: \"ojru2q\" }],\n [\"path\", { d: \"M19.1 1.9a9.96 9.96 0 0 1 0 14.1\", key: \"rhi7fg\" }],\n [\"path\", { d: \"M9.5 18h5\", key: \"mfy3pd\" }],\n [\"path\", { d: \"m8 22 4-11 4 11\", key: \"25yftu\" }]\n];\nconst RadioTower = createLucideIcon(\"radio-tower\", __iconNode);\n\nexport { __iconNode, RadioTower as default };\n//# sourceMappingURL=radio-tower.js.map\n","\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\n\nimport { cn } from \"~/lib/utils\";\nimport { Input, type InputProps } from \"~/components/ui/input\";\nimport { Textarea, type TextareaProps } from \"~/components/ui/textarea\";\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\n \"relative inline-flex w-full min-w-0 items-center rounded-lg border border-input bg-background not-dark:bg-clip-padding text-base text-foreground shadow-xs/5 ring-ring/24 transition-shadow before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-has-[input:disabled,textarea:disabled]:not-has-[input:focus-visible,textarea:focus-visible]:not-has-[input[aria-invalid],textarea[aria-invalid]]:before:shadow-[0_1px_--theme(--color-black/4%)] has-[input:focus-visible,textarea:focus-visible]:has-[input[aria-invalid],textarea[aria-invalid]]:border-destructive/64 has-[input:focus-visible,textarea:focus-visible]:has-[input[aria-invalid],textarea[aria-invalid]]:ring-destructive/16 has-[textarea]:h-auto has-data-[align=block-end]:h-auto has-data-[align=block-start]:h-auto has-data-[align=block-end]:flex-col has-data-[align=block-start]:flex-col has-[input:focus-visible,textarea:focus-visible]:border-ring has-[input[aria-invalid],textarea[aria-invalid]]:border-destructive/36 has-autofill:bg-foreground/4 has-[input:disabled,textarea:disabled]:opacity-64 has-[input:disabled,textarea:disabled,input:focus-visible,textarea:focus-visible,input[aria-invalid],textarea[aria-invalid]]:shadow-none has-[input:focus-visible,textarea:focus-visible]:ring-[3px] sm:text-sm dark:bg-input/32 dark:has-autofill:bg-foreground/8 dark:has-[input[aria-invalid],textarea[aria-invalid]]:ring-destructive/24 dark:not-has-[input:disabled,textarea:disabled]:not-has-[input:focus-visible,textarea:focus-visible]:not-has-[input[aria-invalid],textarea[aria-invalid]]:before:shadow-[0_-1px_--theme(--color-white/6%)] has-data-[align=inline-start]:**:[[data-size=sm]_input]:ps-1.5 has-data-[align=inline-end]:**:[[data-size=sm]_input]:pe-1.5 *:[[data-slot=input-control],[data-slot=textarea-control]]:contents *:[[data-slot=input-control],[data-slot=textarea-control]]:before:hidden has-[[data-align=block-start],[data-align=block-end]]:**:[input]:h-auto has-data-[align=inline-start]:**:[input]:ps-2 has-data-[align=inline-end]:**:[input]:pe-2 has-data-[align=block-end]:**:[input]:pt-1.5 has-data-[align=block-start]:**:[input]:pb-1.5 **:[textarea]:min-h-20.5 **:[textarea]:resize-none **:[textarea]:py-[calc(--spacing(3)-1px)] **:[textarea]:max-sm:min-h-23.5 **:[textarea_button]:rounded-[calc(var(--radius-md)-1px)]\",\n className,\n )}\n data-slot=\"input-group\"\n role=\"group\"\n {...props}\n />\n );\n}\n\nconst inputGroupAddonVariants = cva(\n \"[&_svg]:-mx-0.5 flex h-auto cursor-text select-none items-center justify-center gap-2 leading-none [&>kbd]:rounded-[calc(var(--radius)-5px)] in-[[data-slot=input-group]:has([data-slot=input-control],[data-slot=textarea-control])]:[&_svg:not([class*='size-'])]:size-4.5 sm:in-[[data-slot=input-group]:has([data-slot=input-control],[data-slot=textarea-control])]:[&_svg:not([class*='size-'])]:size-4 not-has-[button]:**:[svg:not([class*='opacity-'])]:opacity-80\",\n {\n defaultVariants: {\n align: \"inline-start\",\n },\n variants: {\n align: {\n \"block-end\":\n \"order-last w-full justify-start px-[calc(--spacing(3)-1px)] pb-[calc(--spacing(3)-1px)] [.border-t]:pt-[calc(--spacing(3)-1px)] [[data-size=sm]+&]:px-[calc(--spacing(2.5)-1px)]\",\n \"block-start\":\n \"order-first w-full justify-start px-[calc(--spacing(3)-1px)] pt-[calc(--spacing(3)-1px)] [.border-b]:pb-[calc(--spacing(3)-1px)] [[data-size=sm]+&]:px-[calc(--spacing(2.5)-1px)]\",\n \"inline-end\":\n \"has-[>:last-child[data-slot=badge]]:-me-1.5 has-[>button]:-me-2 order-last pe-[calc(--spacing(3)-1px)] has-[>kbd:last-child]:me-[-0.35rem] [[data-size=sm]+&]:pe-[calc(--spacing(2.5)-1px)]\",\n \"inline-start\":\n \"has-[>:last-child[data-slot=badge]]:-ms-1.5 has-[>button]:-ms-2 order-first ps-[calc(--spacing(3)-1px)] has-[>kbd:last-child]:ms-[-0.35rem] [[data-size=sm]+&]:ps-[calc(--spacing(2.5)-1px)]\",\n },\n },\n },\n);\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n className={cn(inputGroupAddonVariants({ align }), className)}\n data-align={align}\n data-slot=\"input-group-addon\"\n onMouseDown={(e) => {\n const target = e.target as HTMLElement;\n const isInteractive = target.closest(\n \"button, a, input, select, textarea, [role='button'], [role='combobox'], [role='listbox'], [data-slot='select-trigger']\",\n );\n if (isInteractive) return;\n e.preventDefault();\n const parent = e.currentTarget.parentElement;\n const input = parent?.querySelector<HTMLInputElement | HTMLTextAreaElement>(\n \"input, textarea\",\n );\n if (input && !parent?.querySelector(\"input:focus, textarea:focus\")) {\n input.focus();\n }\n }}\n {...props}\n />\n );\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"[&_svg]:-mx-0.5 line-clamp-1 flex items-center gap-2 text-muted-foreground leading-none in-[[data-slot=input-group]:has([data-slot=input-control],[data-slot=textarea-control])]:[&_svg:not([class*='size-'])]:size-4.5 sm:in-[[data-slot=input-group]:has([data-slot=input-control],[data-slot=textarea-control])]:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupInput({ className, ...props }: InputProps) {\n return <Input className={className} unstyled {...props} />;\n}\n\nfunction InputGroupTextarea({ className, ...props }: TextareaProps) {\n return <Textarea className={className} unstyled {...props} />;\n}\n\nexport { InputGroup, InputGroupAddon, InputGroupText, InputGroupInput, InputGroupTextarea };\n","import {\n ArrowLeft,\n ArrowRight,\n Camera,\n ExternalLink,\n MousePointerClick,\n PictureInPicture2,\n RotateCw,\n} from \"lucide-react\";\nimport {\n type FormEvent,\n type KeyboardEvent,\n type ReactNode,\n useEffect,\n useRef,\n useState,\n} from \"react\";\n\nimport { Button } from \"~/components/ui/button\";\nimport { InputGroup, InputGroupAddon, InputGroupInput } from \"~/components/ui/input-group\";\nimport { Tooltip, TooltipPopup, TooltipTrigger } from \"~/components/ui/tooltip\";\nimport { cn } from \"~/lib/utils\";\n\ninterface Props {\n url: string;\n displayUrl?: string | undefined;\n loading: boolean;\n loadProgress: number;\n canGoBack: boolean;\n canGoForward: boolean;\n refreshDisabled: boolean;\n inputDisabled?: boolean | undefined;\n /** Bumping this value re-focuses and selects the URL input. */\n focusUrlNonce?: number | undefined;\n onBack: () => void;\n onForward: () => void;\n onRefresh: () => void;\n onSubmit: (url: string) => void;\n /** When provided, renders an \"Open in browser\" affordance to the right. */\n onOpenInBrowser?: (() => void) | undefined;\n onCapture?: ((record: boolean) => void) | undefined;\n captureDisabled?: boolean | undefined;\n recording?: boolean | undefined;\n onPictureInPicture?: (() => void) | undefined;\n pictureInPicture?: boolean | undefined;\n pictureInPictureDisabled?: boolean | undefined;\n /**\n * When provided, renders an annotation-mode toggle button to the right of\n * the URL input. Pressed while annotation mode is active (button shows in `pressed`\n * state). Disabled in `pickDisabled` mode.\n */\n onPickElement?: (() => void) | undefined;\n pickActive?: boolean | undefined;\n pickDisabled?: boolean | undefined;\n /** Optional reason string surfaced in the disabled tooltip. */\n pickDisabledReason?: string | undefined;\n /**\n * Trailing slot rendered after the URL input. Used by the preview view\n * to mount the three-dot menu (hard reload, devtools, zoom, clear data).\n */\n trailingActions?: ReactNode;\n}\n\nconst NOOP = () => {};\n\nexport function PreviewChromeRow({\n url,\n displayUrl,\n loading,\n loadProgress,\n canGoBack,\n canGoForward,\n refreshDisabled,\n inputDisabled,\n focusUrlNonce,\n onBack,\n onForward,\n onRefresh,\n onSubmit,\n onOpenInBrowser,\n onCapture,\n captureDisabled,\n recording,\n onPictureInPicture,\n pictureInPicture,\n pictureInPictureDisabled,\n onPickElement,\n pickActive,\n pickDisabled,\n pickDisabledReason,\n trailingActions,\n}: Props) {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const [draft, setDraft] = useState(url);\n const [inputFocused, setInputFocused] = useState(false);\n\n useEffect(() => {\n if (focusUrlNonce == null) return;\n const node = inputRef.current;\n if (!node) return;\n node.focus();\n }, [focusUrlNonce]);\n\n const submit = (event?: FormEvent | KeyboardEvent) => {\n event?.preventDefault();\n const next = draft.trim();\n if (next.length === 0) return;\n onSubmit(next);\n inputRef.current?.blur();\n };\n\n return (\n <div className=\"relative\">\n <form onSubmit={submit} className=\"surface-subheader gap-1 px-2\" data-surface-subheader>\n <div className=\"flex items-center gap-0.5\" role=\"group\" aria-label=\"Navigation\">\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={canGoBack ? onBack : NOOP}\n disabled={!canGoBack}\n aria-label=\"Back\"\n type=\"button\"\n />\n }\n >\n <ArrowLeft />\n </TooltipTrigger>\n <TooltipPopup>Back</TooltipPopup>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={canGoForward ? onForward : NOOP}\n disabled={!canGoForward}\n aria-label=\"Forward\"\n type=\"button\"\n />\n }\n >\n <ArrowRight />\n </TooltipTrigger>\n <TooltipPopup>Forward</TooltipPopup>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={refreshDisabled ? NOOP : onRefresh}\n disabled={refreshDisabled}\n aria-label={loading ? \"Stop\" : \"Refresh\"}\n type=\"button\"\n />\n }\n >\n <RotateCw className={cn(loading && \"animate-spin\")} />\n </TooltipTrigger>\n <TooltipPopup>{loading ? \"Loading…\" : \"Refresh\"}</TooltipPopup>\n </Tooltip>\n </div>\n\n <InputGroup className=\"group/address h-7 flex-1 rounded-md border-transparent bg-transparent shadow-none before:shadow-none hover:bg-muted/40 focus-within:bg-background\">\n <Tooltip>\n <TooltipTrigger\n render={\n <InputGroupInput\n ref={inputRef}\n value={inputFocused ? draft : (displayUrl ?? url)}\n className={cn(\n onOpenInBrowser &&\n !inputFocused &&\n \"group-hover/address:pe-7 transition-[padding]\",\n )}\n onChange={(event) => setDraft(event.target.value)}\n onFocus={() => {\n setDraft(url);\n setInputFocused(true);\n queueMicrotask(() => inputRef.current?.select());\n }}\n onBlur={() => {\n setInputFocused(false);\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") submit(event);\n if (event.key === \"Escape\") {\n event.preventDefault();\n setDraft(url);\n inputRef.current?.blur();\n }\n }}\n placeholder=\"Search or enter URL\"\n spellCheck={false}\n disabled={inputDisabled}\n data-preview-url-input\n size=\"sm\"\n />\n }\n />\n {!inputFocused && displayUrl ? <TooltipPopup>{url}</TooltipPopup> : null}\n </Tooltip>\n {onOpenInBrowser && !inputFocused ? (\n <InputGroupAddon\n align=\"inline-end\"\n className=\"pointer-events-none absolute inset-y-0 right-0 opacity-0 transition-opacity group-hover/address:pointer-events-auto group-hover/address:opacity-100\"\n >\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={onOpenInBrowser}\n aria-label=\"Open in system browser\"\n type=\"button\"\n />\n }\n >\n <ExternalLink />\n </TooltipTrigger>\n <TooltipPopup>Open in system browser</TooltipPopup>\n </Tooltip>\n </InputGroupAddon>\n ) : null}\n </InputGroup>\n\n {onPickElement ? (\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n variant={pickActive ? \"secondary\" : \"ghost\"}\n size=\"icon-xs\"\n onClick={onPickElement}\n disabled={pickDisabled}\n aria-label={pickActive ? \"Cancel annotation\" : \"Annotate preview\"}\n aria-pressed={pickActive ? \"true\" : \"false\"}\n type=\"button\"\n />\n }\n >\n <MousePointerClick className={cn(pickActive && \"text-primary\")} />\n </TooltipTrigger>\n <TooltipPopup>\n {pickDisabled && pickDisabledReason\n ? pickDisabledReason\n : pickActive\n ? \"Cancel annotation (Esc)\"\n : \"Annotate elements, regions, and drawings\"}\n </TooltipPopup>\n </Tooltip>\n ) : null}\n {onCapture ? (\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n variant={recording ? \"secondary\" : \"ghost\"}\n size=\"icon-xs\"\n onClick={(event) => onCapture(event.shiftKey)}\n aria-label={recording ? \"Stop recording\" : \"Capture screenshot\"}\n type=\"button\"\n className=\"relative\"\n disabled={captureDisabled}\n />\n }\n >\n <Camera className={cn(recording && \"text-destructive\")} />\n {recording ? (\n <span className=\"absolute right-0.5 top-0.5 size-1.5 animate-status-pulse rounded-full bg-destructive\" />\n ) : null}\n </TooltipTrigger>\n <TooltipPopup>\n {recording ? \"Stop recording\" : \"Screenshot · Shift-click to record\"}\n </TooltipPopup>\n </Tooltip>\n ) : null}\n {onPictureInPicture ? (\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n variant={pictureInPicture ? \"secondary\" : \"ghost\"}\n size=\"icon-xs\"\n onClick={onPictureInPicture}\n aria-label={\n pictureInPicture ? \"Close floating preview\" : \"Float preview over chat\"\n }\n aria-pressed={pictureInPicture ? \"true\" : \"false\"}\n type=\"button\"\n disabled={pictureInPictureDisabled}\n />\n }\n >\n <PictureInPicture2 className={cn(pictureInPicture && \"text-primary\")} />\n </TooltipTrigger>\n <TooltipPopup>\n {pictureInPicture ? \"Close floating preview\" : \"Float preview over chat\"}\n </TooltipPopup>\n </Tooltip>\n ) : null}\n {trailingActions}\n </form>\n {loadProgress > 0 ? (\n <div\n aria-hidden\n className=\"pointer-events-none absolute bottom-0 left-0 z-10 h-0.5 rounded-r-full bg-primary transition-all duration-150 ease-out\"\n style={{\n width: `${loadProgress}%`,\n boxShadow: \"0 0 6px 1px var(--color-ring)\",\n }}\n />\n ) : null}\n </div>\n );\n}\n","interface PreviewUrlPresentationInput {\n readonly url: string;\n readonly environmentLabel: string;\n readonly environmentHttpBaseUrl: string;\n}\n\nexport function formatPreviewUrl(input: PreviewUrlPresentationInput): string | null {\n try {\n const url = new URL(input.url);\n const environmentUrl = new URL(input.environmentHttpBaseUrl);\n if (url.origin === environmentUrl.origin && url.pathname.startsWith(\"/api/assets/\")) {\n const encodedFileName = url.pathname.split(\"/\").at(-1);\n if (!encodedFileName) {\n return null;\n }\n const fileName = decodeURIComponent(encodedFileName);\n if (!fileName || fileName === \".\" || fileName === \"..\") {\n return null;\n }\n return `${input.environmentLabel} · ${fileName}`;\n }\n\n return url.protocol === \"http:\" || url.protocol === \"https:\" ? url.host : null;\n } catch {\n return null;\n }\n}\n","import { cn } from \"~/lib/utils\";\n\n/** Browser-window thumbnail glyph for the \"Local\" recommendation cards. */\nexport function BrowserMockup({ className }: { className?: string }) {\n return (\n <div\n aria-hidden\n className={cn(\n \"relative flex flex-col gap-0.5 overflow-hidden rounded-[5px] border border-border/60 bg-card p-1 shadow-xs/5\",\n className,\n )}\n >\n <div className=\"flex gap-[2px]\">\n <span className=\"size-[3px] rounded-full bg-destructive/80\" />\n <span className=\"size-[3px] rounded-full bg-warning/80\" />\n <span className=\"size-[3px] rounded-full bg-success/80\" />\n </div>\n <div className=\"mt-[1px] flex flex-1 flex-col gap-[2px]\">\n <span className=\"h-[2px] w-full rounded-full bg-muted-foreground/30\" />\n <span className=\"h-[2px] w-3/5 rounded-full bg-muted-foreground/20\" />\n </div>\n </div>\n );\n}\n","import { BrowserMockup } from \"./BrowserMockup\";\nimport type { PreviewableServer } from \"./useDiscoveredLocalServers\";\n\ninterface Props {\n server: PreviewableServer;\n onOpen: () => void;\n}\n\nexport function PreviewLocalServerCard({ server, onOpen }: Props) {\n const subtitle = describeServer(server);\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className=\"group flex w-full items-center gap-3 px-3 py-3 text-left hover:bg-accent/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\"\n >\n <BrowserMockup className=\"size-7 shrink-0\" />\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate text-sm font-medium text-foreground\">{subtitle}</span>\n <span className=\"truncate text-xs text-muted-foreground\">\n {server.host}:{server.port}\n </span>\n </div>\n {server.listening ? <PulsingDot /> : <DimDot />}\n </button>\n );\n}\n\nfunction describeServer(server: PreviewableServer): string {\n if (server.processName) return server.processName;\n if (server.listening) return \"Listening\";\n if (server.source === \"configured\") return \"Configured\";\n return \"Recently seen\";\n}\n\nfunction PulsingDot() {\n return (\n <span aria-label=\"Listening\" className=\"relative inline-flex size-2 shrink-0\">\n <span className=\"absolute inset-0 animate-status-ping rounded-full bg-success opacity-60\" />\n <span className=\"relative inline-flex size-2 rounded-full bg-success\" />\n </span>\n );\n}\n\nfunction DimDot() {\n return (\n <span\n aria-label=\"Not currently listening\"\n className=\"size-2 shrink-0 rounded-full bg-muted-foreground/40\"\n />\n );\n}\n","import type { DiscoveredLocalServer } from \"@t3tools/contracts\";\nimport { isLoopbackHost } from \"@t3tools/shared/preview\";\nimport { useMemo } from \"react\";\n\nimport type { EnvironmentId } from \"@t3tools/contracts\";\nimport { resolveDiscoveredServerUrl } from \"~/browser/browserTargetResolver\";\nimport { useDiscoveredPorts } from \"~/portDiscoveryState\";\n\nexport interface PreviewableServer extends DiscoveredLocalServer {\n source: \"scanner\" | \"configured\" | \"recent\";\n /**\n * True when the port scanner currently sees this server listening. A\n * `configured` entry can also be `listening` when the scan enriched it.\n */\n listening: boolean;\n}\n\ninterface UseDiscoveredLocalServersInput {\n environmentId: EnvironmentId;\n configuredUrls?: ReadonlyArray<string> | undefined;\n recentlySeenUrls?: ReadonlyArray<string> | undefined;\n}\n\n/**\n * Merge the environment-level port snapshot with configured / recently-seen\n * URLs and return a stable sorted list.\n */\nexport function useDiscoveredLocalServers(\n input: UseDiscoveredLocalServersInput,\n): ReadonlyArray<PreviewableServer> {\n const scannerSnapshot = useDiscoveredPorts(input.environmentId);\n\n return useMemo(\n () =>\n mergeServers({\n scanner: scannerSnapshot.map((server) => ({\n ...server,\n url: resolveDiscoveredServerUrl(input.environmentId, server.url),\n })),\n configuredUrls: input.configuredUrls ?? [],\n recentlySeenUrls: input.recentlySeenUrls ?? [],\n }),\n [input.environmentId, scannerSnapshot, input.configuredUrls, input.recentlySeenUrls],\n );\n}\n\nexport function mergeServers(input: {\n scanner: ReadonlyArray<DiscoveredLocalServer>;\n configuredUrls: ReadonlyArray<string>;\n recentlySeenUrls: ReadonlyArray<string>;\n}): ReadonlyArray<PreviewableServer> {\n const seen = new Map<string, PreviewableServer>();\n\n for (const url of input.configuredUrls) {\n const parsed = parseLocalUrl(url);\n if (!parsed) continue;\n const key = canonicalKey(parsed.host, parsed.port);\n if (seen.has(key)) continue;\n seen.set(key, {\n host: parsed.host,\n port: parsed.port,\n url: parsed.url,\n processName: null,\n pid: null,\n terminal: null,\n source: \"configured\",\n listening: false,\n });\n }\n\n for (const server of input.scanner) {\n const key = canonicalKey(server.host, server.port);\n const existing = seen.get(key);\n if (existing) {\n // Enrich a configured entry with live process metadata; flip\n // `listening` so it pulses green like a scanner-discovered entry.\n seen.set(key, {\n ...existing,\n processName: server.processName ?? existing.processName,\n pid: server.pid ?? existing.pid,\n terminal: server.terminal ?? existing.terminal,\n listening: true,\n });\n continue;\n }\n seen.set(key, { ...server, source: \"scanner\", listening: true });\n }\n\n for (const url of input.recentlySeenUrls) {\n const parsed = parseLocalUrl(url);\n if (!parsed) continue;\n const key = canonicalKey(parsed.host, parsed.port);\n if (seen.has(key)) continue;\n seen.set(key, {\n host: parsed.host,\n port: parsed.port,\n url: parsed.url,\n processName: null,\n pid: null,\n terminal: null,\n source: \"recent\",\n listening: false,\n });\n }\n\n return Array.from(seen.values()).toSorted((a, b) => {\n const sourceOrder: Record<PreviewableServer[\"source\"], number> = {\n configured: 0,\n scanner: 1,\n recent: 2,\n };\n if (sourceOrder[a.source] !== sourceOrder[b.source]) {\n return sourceOrder[a.source] - sourceOrder[b.source];\n }\n return a.port - b.port;\n });\n}\n\nfunction canonicalKey(host: string, port: number): string {\n return `${host.toLowerCase()}:${port}`;\n}\n\nfunction parseLocalUrl(raw: string): { host: string; port: number; url: string } | null {\n try {\n const parsed = new URL(raw);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") return null;\n if (!isLoopbackHost(parsed.hostname)) return null;\n const port = parsed.port\n ? Number.parseInt(parsed.port, 10)\n : parsed.protocol === \"http:\"\n ? 80\n : 443;\n if (!Number.isFinite(port) || port <= 0) return null;\n return { host: parsed.hostname, port, url: parsed.href };\n } catch {\n return null;\n }\n}\n","import type { EnvironmentId } from \"@t3tools/contracts\";\nimport { Globe, RadioTower } from \"lucide-react\";\n\nimport { Empty, EmptyDescription, EmptyMedia, EmptyTitle } from \"~/components/ui/empty\";\n\nimport { PreviewLocalServerCard } from \"./PreviewLocalServerCard\";\nimport { useDiscoveredLocalServers } from \"./useDiscoveredLocalServers\";\n\ninterface Props {\n environmentId: EnvironmentId;\n configuredUrls?: ReadonlyArray<string> | undefined;\n recentlySeenUrls?: ReadonlyArray<string> | undefined;\n onOpenUrl: (url: string) => void;\n}\n\nexport function PreviewEmptyState({\n environmentId,\n configuredUrls,\n recentlySeenUrls,\n onOpenUrl,\n}: Props) {\n const servers = useDiscoveredLocalServers({\n environmentId,\n configuredUrls,\n recentlySeenUrls,\n });\n\n if (servers.length === 0) {\n return (\n <Empty>\n <EmptyMedia variant=\"icon\">\n <Globe className=\"size-4.5 text-muted-foreground\" />\n </EmptyMedia>\n <EmptyTitle>No preview yet</EmptyTitle>\n <EmptyDescription>\n Type a URL above, or run a dev script. Listening localhost ports will show up here\n automatically.\n </EmptyDescription>\n </Empty>\n );\n }\n\n return (\n <div className=\"flex h-full min-h-0 overflow-y-auto px-5 py-8\">\n <div className=\"m-auto flex w-full max-w-xl flex-col gap-3\">\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <RadioTower className=\"size-4 shrink-0\" />\n <h2 className=\"font-medium\">Local servers</h2>\n </div>\n <div className=\"flex flex-col divide-y divide-border/60 overflow-hidden rounded-xl border border-border/70 bg-background\">\n {servers.map((server) => (\n <PreviewLocalServerCard\n key={`${server.host}:${server.port}`}\n server={server}\n onOpen={() => onOpenUrl(server.url)}\n />\n ))}\n </div>\n <p className=\"px-1 text-xs text-muted-foreground\">\n Select a listening port to open it in this browser tab.\n </p>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport type { DesktopPreviewColorScheme } from \"@t3tools/contracts\";\nimport { Minus, MoreVertical, Plus as PlusIcon, RotateCcw } from \"lucide-react\";\n\nimport { Button } from \"~/components/ui/button\";\nimport {\n Menu,\n MenuItem,\n MenuPopup,\n MenuRadioGroup,\n MenuRadioItem,\n MenuSeparator,\n MenuSub,\n MenuSubPopup,\n MenuSubTrigger,\n MenuTrigger,\n} from \"~/components/ui/menu\";\nimport { Tooltip, TooltipPopup, TooltipTrigger } from \"~/components/ui/tooltip\";\n\nimport { previewBridge } from \"./previewBridge\";\n\nconst COLOR_SCHEME_OPTIONS: ReadonlyArray<{\n value: DesktopPreviewColorScheme;\n label: string;\n}> = [\n { value: \"system\", label: \"System\" },\n { value: \"light\", label: \"Light\" },\n { value: \"dark\", label: \"Dark\" },\n];\n\ninterface Props {\n /** Active preview tab id. Tab-targeting actions are disabled without it. */\n tabId: string | null;\n /**\n * True only after the desktop bridge has registered a `webContentsId` for\n * the active tab. Tab-targeting actions throw on the desktop side until\n * then; we disable those items so the menu doesn't fire silent no-ops.\n */\n hasWebContents: boolean;\n /** Current zoom factor as a number (1.0 = 100%). */\n zoomFactor: number;\n /** Emulated `prefers-color-scheme` for the guest page. */\n colorScheme: DesktopPreviewColorScheme;\n /** Fixed viewport modes expose the device toolbar and resize rails. */\n deviceToolbarVisible: boolean;\n /** Switches between fill-panel mode and a fixed responsive viewport. */\n onToggleDeviceToolbar: () => void;\n /** Whether the separate native always-on-top preview window is open. */\n nativePictureInPicture: boolean;\n /** Toggles the optional native always-on-top preview window. */\n onNativePictureInPicture: () => void;\n}\n\n/**\n * Three-dot menu in the chrome row. Wires Hard reload, DevTools, zoom\n * controls, and storage-clearing actions. Only mounted by `PreviewView`\n * when the desktop bridge is present, so we can call it unconditionally.\n */\nexport function PreviewMoreMenu({\n tabId,\n hasWebContents,\n zoomFactor,\n colorScheme,\n deviceToolbarVisible,\n onToggleDeviceToolbar,\n nativePictureInPicture,\n onNativePictureInPicture,\n}: Props) {\n if (!previewBridge) return null;\n const bridge = previewBridge;\n const tabDisabled = !tabId || !hasWebContents;\n const callTab = (op: (tabId: string) => Promise<void>) => () => {\n if (!tabId) return;\n void op(tabId).catch(() => undefined);\n };\n\n const zoomLabel = `${Math.round(zoomFactor * 100)}%`;\n return (\n <Menu>\n <Tooltip>\n <TooltipTrigger\n render={\n <MenuTrigger\n render={\n <Button variant=\"ghost\" size=\"icon-xs\" type=\"button\" aria-label=\"Preview menu\" />\n }\n />\n }\n >\n <MoreVertical />\n </TooltipTrigger>\n <TooltipPopup>More</TooltipPopup>\n </Tooltip>\n <MenuPopup align=\"end\" sideOffset={6} className=\"min-w-56\">\n <MenuItem onClick={callTab(bridge.hardReload)} disabled={tabDisabled}>\n Hard reload\n </MenuItem>\n <MenuItem onClick={callTab(bridge.openDevTools)} disabled={tabDisabled}>\n Open DevTools\n </MenuItem>\n <MenuItem onClick={onNativePictureInPicture} disabled={tabDisabled}>\n {nativePictureInPicture\n ? \"Close separate preview window\"\n : \"Open separate preview window\"}\n </MenuItem>\n <MenuItem onClick={onToggleDeviceToolbar} disabled={tabDisabled}>\n {deviceToolbarVisible ? \"Hide device toolbar\" : \"Show device toolbar\"}\n </MenuItem>\n <MenuSub>\n <MenuSubTrigger disabled={tabDisabled}>Appearance</MenuSubTrigger>\n <MenuSubPopup className=\"min-w-32\">\n <MenuRadioGroup\n value={colorScheme}\n onValueChange={(value) => {\n if (!tabId) return;\n void bridge\n .setColorScheme(tabId, value as DesktopPreviewColorScheme)\n .catch(() => undefined);\n }}\n >\n {COLOR_SCHEME_OPTIONS.map((option) => (\n <MenuRadioItem key={option.value} value={option.value}>\n {option.label}\n </MenuRadioItem>\n ))}\n </MenuRadioGroup>\n </MenuSubPopup>\n </MenuSub>\n <MenuSeparator />\n {/*\n Zoom row: label + inline control cluster. `closeOnClick=false`\n keeps the menu open while the user clicks the +/− buttons.\n */}\n <MenuItem\n closeOnClick={false}\n onClick={(event: React.MouseEvent) => event.preventDefault()}\n className=\"justify-between\"\n disabled={tabDisabled}\n >\n <span>Zoom</span>\n <span className=\"flex items-center gap-1\">\n <Button\n variant=\"outline\"\n size=\"icon-xs\"\n type=\"button\"\n onClick={callTab(bridge.zoomOut)}\n aria-label=\"Zoom out\"\n disabled={tabDisabled}\n >\n <Minus />\n </Button>\n <span className=\"min-w-12 text-center text-xs tabular-nums text-muted-foreground\">\n {zoomLabel}\n </span>\n <Button\n variant=\"outline\"\n size=\"icon-xs\"\n type=\"button\"\n onClick={callTab(bridge.zoomIn)}\n aria-label=\"Zoom in\"\n disabled={tabDisabled}\n >\n <PlusIcon />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon-xs\"\n type=\"button\"\n onClick={callTab(bridge.resetZoom)}\n aria-label=\"Reset zoom\"\n disabled={tabDisabled}\n >\n <RotateCcw />\n </Button>\n </span>\n </MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => void bridge.clearCookies().catch(() => undefined)}>\n Clear cookies\n </MenuItem>\n <MenuItem onClick={() => void bridge.clearCache().catch(() => undefined)}>\n Clear cache\n </MenuItem>\n </MenuPopup>\n </Menu>\n );\n}\n","import { PREVIEW_ERROR_CODE_MESSAGES } from \"./previewConstants\";\n\n/**\n * Resolve a friendly description for a Chromium / network error. Falls back\n * to the description string passed in when it isn't in our table.\n */\nexport function describePreviewError(description: string): string {\n const friendly = PREVIEW_ERROR_CODE_MESSAGES[description];\n if (friendly) return friendly;\n if (description.length > 0) return description;\n return \"Network error\";\n}\n","import { useState } from \"react\";\n\nimport { Button } from \"~/components/ui/button\";\n\nimport { describePreviewError } from \"./errorCodeMessages\";\n\ninterface Props {\n url: string;\n /** Chromium net error code, e.g. -105. */\n code: number;\n /** Stringified Chromium error, e.g. \"ERR_NAME_NOT_RESOLVED\". */\n description: string;\n onReload: () => void;\n}\n\n/** Theme-aware tailwind port of Chromium's \"This site can't be reached\" page. */\nexport function PreviewUnreachable({ url, code, description, onReload }: Props) {\n const [showDetails, setShowDetails] = useState(false);\n const host = safeHost(url) ?? url;\n const friendly = describePreviewError(description);\n const errorLabel = description.length > 0 ? description : `ERR_${Math.abs(code) || \"FAILED\"}`;\n\n return (\n <div className=\"relative flex h-full min-h-0 w-full overflow-y-auto bg-background\">\n <div className=\"mx-auto flex w-full max-w-xl flex-1 flex-col px-8 py-12 sm:py-16\">\n <ErrorIcon className=\"mb-6 size-12 text-muted-foreground/70\" />\n <h1 className=\"mb-3 text-2xl font-semibold leading-tight text-foreground\">\n This site can&rsquo;t be reached\n </h1>\n <p className=\"text-sm leading-relaxed text-muted-foreground\">\n <span className=\"font-semibold text-foreground\">{host}</span>: {friendly}.\n </p>\n\n {showDetails ? (\n <div className=\"mt-6 rounded-lg border border-border bg-muted/40 p-4 text-sm\">\n <p className=\"mb-2 font-medium text-foreground\">Try:</p>\n <ul className=\"list-disc space-y-1 pl-5 text-muted-foreground\">\n <li>Checking your connection</li>\n <li>Confirming the dev server is running</li>\n <li>Checking the proxy and the firewall</li>\n </ul>\n </div>\n ) : null}\n\n <div className=\"mt-8 text-xs uppercase tracking-wide text-muted-foreground/70\">\n {errorLabel}\n </div>\n\n <div className=\"mt-auto flex items-center gap-2 pt-8\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setShowDetails((value) => !value)}\n >\n {showDetails ? \"Hide details\" : \"Details\"}\n </Button>\n <div className=\"flex-1\" />\n <Button type=\"button\" size=\"sm\" onClick={onReload}>\n Reload\n </Button>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ErrorIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 64 64\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n className={className}\n >\n <path d=\"M16 12 L48 12 L48 52 L16 52 Z\" />\n <path d=\"M22 22 L42 22 M22 30 L36 30 M22 38 L40 38\" strokeLinecap=\"round\" />\n <path d=\"M52 8 L12 56\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nfunction safeHost(url: string): string | null {\n try {\n return new URL(url).host;\n } catch {\n return null;\n }\n}\n","export function revealInFileExplorerLabel(platform: string): string {\n const normalized = platform.toLowerCase();\n if (normalized.includes(\"mac\")) return \"Reveal in Finder\";\n if (normalized.includes(\"win\")) return \"Reveal in File Explorer\";\n return \"Reveal in Files\";\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nconst TICK_INTERVAL_MS = 120;\nconst FADE_OUT_DELAY_MS = 220;\nconst SEED_PERCENT = 4;\nconst ASYMPTOTE_PERCENT = 90;\nconst APPROACH_FACTOR = 0.08;\nconst MIN_INCREMENT = 0.5;\n\n/**\n * Indeterminate progress simulator for the preview chrome's loading bar.\n * Animates 0 → 90% asymptotically while `loading` is true, snaps to 100%\n * on release, then resets after a short pause.\n *\n * Uses a ref to thread the latest progress through interval ticks without\n * needing `loading` to retrigger the effect, which sidesteps the stale-\n * closure pitfalls of reading `progress` directly.\n */\nexport function useLoadingProgress(loading: boolean): number {\n const [progress, setProgress] = useState(0);\n const progressRef = useRef(0);\n progressRef.current = progress;\n\n useEffect(() => {\n if (!loading) {\n if (progressRef.current === 0) return;\n setProgress(100);\n const timer = window.setTimeout(() => setProgress(0), FADE_OUT_DELAY_MS);\n return () => window.clearTimeout(timer);\n }\n\n setProgress((value) => (value > 0 && value < 95 ? value : SEED_PERCENT));\n const interval = window.setInterval(() => {\n const current = progressRef.current;\n if (current >= ASYMPTOTE_PERCENT) return;\n const remaining = ASYMPTOTE_PERCENT - current;\n const increment = Math.max(MIN_INCREMENT, remaining * APPROACH_FACTOR);\n setProgress(Math.min(ASYMPTOTE_PERCENT, current + increment));\n }, TICK_INTERVAL_MS);\n\n return () => window.clearInterval(interval);\n }, [loading]);\n\n return progress;\n}\n","\"use client\";\n\nimport { useAtomValue } from \"@effect/atom-react\";\nimport { parseScopedThreadKey, scopedThreadKey } from \"@t3tools/client-runtime/environment\";\nimport type { ScopedThreadRef } from \"@t3tools/contracts\";\nimport * as Schema from \"effect/Schema\";\nimport { AsyncResult, Atom } from \"effect/unstable/reactivity\";\n\nimport {\n applyPreviewServerEvent,\n readThreadPreviewState,\n reconcilePreviewServerSessions,\n} from \"~/previewStateStore\";\nimport { previewEnvironment } from \"~/state/preview\";\n\nclass PreviewSessionThreadKeyParseError extends Schema.TaggedErrorClass<PreviewSessionThreadKeyParseError>()(\n \"PreviewSessionThreadKeyParseError\",\n { threadKey: Schema.String },\n) {\n override get message(): string {\n return `Invalid scoped preview thread key: ${this.threadKey}`;\n }\n}\n\nconst previewSessionSyncAtom = Atom.family((threadKey: string) => {\n const threadRef = parseScopedThreadKey(threadKey);\n if (threadRef === null) {\n throw new PreviewSessionThreadKeyParseError({ threadKey });\n }\n\n const sessionsAtom = previewEnvironment.list({\n environmentId: threadRef.environmentId,\n input: { threadId: threadRef.threadId },\n });\n const eventsAtom = previewEnvironment.events({\n environmentId: threadRef.environmentId,\n input: {},\n });\n\n return Atom.make((get) => {\n let disposed = false;\n let eventsVersion = 0;\n\n const reconcileSessions = (result: Atom.Type<typeof sessionsAtom>) => {\n if (!AsyncResult.isSuccess(result)) return;\n reconcilePreviewServerSessions(threadRef, result.value);\n };\n\n const applyLatestEvent = (result: Atom.Type<typeof eventsAtom>) => {\n if (!AsyncResult.isSuccess(result) || result.value.threadId !== threadRef.threadId) return;\n const currentEpoch = readThreadPreviewState(threadRef).serverEpoch;\n if (currentEpoch !== null && currentEpoch !== result.value.serverEpoch) {\n get.refresh(sessionsAtom);\n return;\n }\n applyPreviewServerEvent(threadRef, result.value);\n };\n\n get.addFinalizer(() => {\n disposed = true;\n });\n const initialEvent = get.once(eventsAtom);\n get.subscribe(sessionsAtom, (result) => {\n reconcileSessions(result);\n });\n get.subscribe(eventsAtom, (result) => {\n eventsVersion += 1;\n applyLatestEvent(result);\n });\n queueMicrotask(() => {\n if (disposed) return;\n // The cached list can predate an automation-created tab. Keep the local\n // snapshot visible until an authoritative refresh arrives instead of\n // reconciling against a stale empty result when the panel first mounts.\n get.refresh(sessionsAtom);\n if (eventsVersion === 0) applyLatestEvent(initialEvent);\n });\n }).pipe(Atom.setIdleTTL(1_000), Atom.withLabel(`preview:session-sync:${threadKey}`));\n});\n\nexport function usePreviewSession(threadRef: ScopedThreadRef): void {\n useAtomValue(previewSessionSyncAtom(scopedThreadKey(threadRef)));\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nimport { cn } from \"~/lib/utils\";\n\nconst HIDE_AFTER_MS = 1500;\nconst ZOOM_EPSILON = 0.001;\n\ninterface Props {\n /** Current zoom factor (1.0 = 100%); changes drive the transient indicator. */\n zoomFactor: number;\n}\n\n/**\n * Floating \"X%\" pill that surfaces in the top-right of the webview area\n * whenever the zoom factor changes, then fades out after a short pause.\n *\n * Suppressed for the first render's value so we don't flash 100% on mount.\n */\nexport function ZoomIndicator({ zoomFactor }: Props) {\n const [visible, setVisible] = useState(false);\n const lastFactorRef = useRef(zoomFactor);\n const timerRef = useRef<number | null>(null);\n\n useEffect(() => {\n if (Math.abs(lastFactorRef.current - zoomFactor) < ZOOM_EPSILON) return;\n lastFactorRef.current = zoomFactor;\n setVisible(true);\n if (timerRef.current !== null) window.clearTimeout(timerRef.current);\n timerRef.current = window.setTimeout(() => {\n setVisible(false);\n timerRef.current = null;\n }, HIDE_AFTER_MS);\n return () => {\n if (timerRef.current !== null) {\n window.clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n };\n }, [zoomFactor]);\n\n const percent = `${Math.round(zoomFactor * 100)}%`;\n\n return (\n <div\n aria-hidden={!visible}\n className={cn(\n \"pointer-events-none absolute top-3 right-3 z-20 select-none rounded-full border border-border/70 bg-popover/95 px-2.5 py-1 text-xs font-medium text-foreground shadow-md/10 backdrop-blur transition-all duration-200 ease-out\",\n visible ? \"opacity-100 translate-y-0\" : \"opacity-0 -translate-y-1\",\n )}\n >\n {percent}\n </div>\n );\n}\n","export type BrowserController = \"human\" | \"agent\" | \"none\";\n\nexport function agentBrowserCursorOpacity(active: boolean, controller: BrowserController): number {\n if (active) return 1;\n return controller === \"human\" ? 0.18 : 0.35;\n}\n","\"use client\";\n\nimport type { DesktopPreviewPointerEvent } from \"@t3tools/contracts\";\nimport { MousePointer2 } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\n\nimport { useBrowserPointerStore } from \"~/browser/browserPointerStore\";\nimport { useBrowserSurfaceStore } from \"~/browser/browserSurfaceStore\";\n\nimport { agentBrowserCursorOpacity, type BrowserController } from \"./agentBrowserCursorLogic\";\n\nconst CURSOR_ACTIVE_MS = 700;\n\nexport function AgentBrowserCursor(props: {\n readonly tabId: string;\n readonly zoomFactor: number;\n readonly controller: BrowserController;\n}) {\n const { tabId, zoomFactor, controller } = props;\n const event = useBrowserPointerStore((state) => state.byTabId[tabId] ?? null);\n const content = useBrowserSurfaceStore((state) => state.byTabId[tabId]?.content ?? null);\n\n if (!event) return null;\n\n return (\n <AgentBrowserCursorEvent\n key={event.sequence}\n event={event}\n content={content}\n zoomFactor={zoomFactor}\n controller={controller}\n />\n );\n}\n\nfunction AgentBrowserCursorEvent(props: {\n readonly event: DesktopPreviewPointerEvent;\n readonly content: {\n readonly x: number;\n readonly y: number;\n readonly scale: number;\n readonly scrollLeft: number;\n readonly scrollTop: number;\n } | null;\n readonly zoomFactor: number;\n readonly controller: BrowserController;\n}) {\n const { event, content, zoomFactor, controller } = props;\n const [active, setActive] = useState(true);\n\n useEffect(() => {\n const timeout = window.setTimeout(() => setActive(false), CURSOR_ACTIVE_MS);\n return () => window.clearTimeout(timeout);\n }, []);\n\n return (\n <div\n className=\"pointer-events-none absolute left-0 top-0 z-40 transition-[transform,opacity] duration-150 ease-out motion-reduce:transition-none\"\n style={{\n opacity: agentBrowserCursorOpacity(active, controller),\n transform: `translate3d(${event.x * zoomFactor * (content?.scale ?? 1) + (content?.x ?? 0) - (content?.scrollLeft ?? 0)}px, ${event.y * zoomFactor * (content?.scale ?? 1) + (content?.y ?? 0) - (content?.scrollTop ?? 0)}px, 0)`,\n }}\n aria-hidden=\"true\"\n data-agent-browser-cursor\n >\n {event.phase === \"click\" ? (\n <span\n key={event.sequence}\n className=\"absolute left-0.5 top-0.5 size-4 animate-status-ping rounded-full bg-primary/25 motion-reduce:animate-none\"\n />\n ) : null}\n <MousePointer2\n className=\"relative size-5 -translate-x-0.5 -translate-y-0.5 fill-background text-primary drop-shadow-sm\"\n strokeWidth={2}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { scopedThreadKey } from \"@t3tools/client-runtime/environment\";\nimport { squashAtomCommandFailure } from \"@t3tools/client-runtime/state/runtime\";\nimport {\n FILL_PREVIEW_VIEWPORT,\n type PreviewViewportSetting,\n type ScopedThreadRef,\n} from \"@t3tools/contracts\";\nimport { normalizePreviewUrl } from \"@t3tools/shared/preview\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { useComposerDraftStore } from \"~/composerDraftStore\";\nimport { previewAnnotationScreenshotFile } from \"~/lib/previewAnnotation\";\nimport { ensureLocalApi } from \"~/localApi\";\nimport {\n rememberPreviewUrl,\n updatePreviewServerSnapshot,\n useThreadPreviewState,\n} from \"~/previewStateStore\";\nimport { resolveDiscoveredServerUrl } from \"~/browser/browserTargetResolver\";\nimport { useEnvironment, useEnvironmentHttpBaseUrl } from \"~/state/environments\";\nimport { previewEnvironment } from \"~/state/preview\";\nimport { useAtomCommand } from \"~/state/use-atom-command\";\nimport { selectThreadPreviewMiniPlayer, usePreviewMiniPlayerStore } from \"~/previewMiniPlayerStore\";\nimport { useRightPanelStore } from \"~/rightPanelStore\";\n\nimport { previewBridge } from \"./previewBridge\";\nimport { subscribePreviewAction } from \"./previewActionBus\";\nimport { openPreviewSession } from \"./openPreviewSession\";\nimport { PreviewChromeRow } from \"./PreviewChromeRow\";\nimport { formatPreviewUrl } from \"./previewUrlPresentation\";\nimport { PreviewEmptyState } from \"./PreviewEmptyState\";\nimport { PreviewMoreMenu } from \"./PreviewMoreMenu\";\nimport {\n commitBrowserViewportChange,\n subscribeBrowserViewportChange,\n} from \"~/browser/browserViewportActions\";\nimport { resolveResponsiveBrowserViewportSize } from \"~/browser/browserViewportLayout\";\nimport { previewRuntimeTabId } from \"~/browser/previewRuntimeTabId\";\nimport { PreviewUnreachable } from \"./PreviewUnreachable\";\nimport { revealInFileExplorerLabel } from \"./fileExplorerLabel\";\nimport { shouldShowPreviewEmptyState } from \"./previewEmptyStateLogic\";\nimport { BrowserSurfaceSlot } from \"~/browser/BrowserSurfaceSlot\";\nimport { useBrowserSurfaceStore } from \"~/browser/browserSurfaceStore\";\nimport { useLoadingProgress } from \"./useLoadingProgress\";\nimport { usePreviewSession } from \"./usePreviewSession\";\nimport { ZoomIndicator } from \"./ZoomIndicator\";\nimport { AgentBrowserCursor } from \"./AgentBrowserCursor\";\nimport {\n findActiveBrowserRecordingRuntimeTabId,\n startBrowserRecording,\n stopBrowserRecording,\n useActiveBrowserRecordingTabIds,\n} from \"~/browser/browserRecording\";\nimport { stackedThreadToast, toastManager } from \"~/components/ui/toast\";\n\ninterface Props {\n threadRef: ScopedThreadRef;\n tabId?: string | null;\n configuredUrls?: ReadonlyArray<string> | undefined;\n visible: boolean;\n}\n\nconst localApi = typeof window === \"undefined\" ? null : ensureLocalApi();\n\n/**\n * Single-tab preview surface: chrome row on top, one webview below, empty\n * state when no session exists for the thread.\n */\nexport function PreviewView({ threadRef, tabId: requestedTabId, configuredUrls, visible }: Props) {\n const [focusUrlNonce, setFocusUrlNonce] = useState<number | undefined>(undefined);\n const [pickActive, setPickActive] = useState(false);\n const activeRecordingTabIds = useActiveBrowserRecordingTabIds();\n const pickActiveRef = useRef(false);\n const isMountedRef = useRef(true);\n const previewState = useThreadPreviewState(threadRef);\n const miniPlayer = usePreviewMiniPlayerStore((state) =>\n selectThreadPreviewMiniPlayer(state.byThreadKey, threadRef),\n );\n const addPreviewAnnotation = useComposerDraftStore((store) => store.addPreviewAnnotation);\n const addImage = useComposerDraftStore((store) => store.addImage);\n const environment = useEnvironment(threadRef.environmentId);\n const environmentHttpBaseUrl = useEnvironmentHttpBaseUrl(threadRef.environmentId);\n const open = useAtomCommand(previewEnvironment.open);\n const resize = useAtomCommand(previewEnvironment.resize, \"preview viewport resize\");\n\n usePreviewSession(threadRef);\n\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n const tabId = requestedTabId ?? previewState.activeTabId;\n const runtimeTabId = tabId\n ? previewRuntimeTabId(threadRef, previewState.serverEpoch, tabId)\n : null;\n const recordingRuntimeTabId =\n tabId && runtimeTabId\n ? activeRecordingTabIds.has(runtimeTabId)\n ? runtimeTabId\n : findActiveBrowserRecordingRuntimeTabId(threadRef, tabId)\n : null;\n const snapshot = tabId ? (previewState.sessions[tabId] ?? null) : null;\n const desktopOverlay = tabId ? (previewState.desktopByTabId[tabId] ?? null) : null;\n const navStatus = snapshot?.navStatus ?? { _tag: \"Idle\" as const };\n const url = navStatus._tag === \"Idle\" ? \"\" : navStatus.url;\n const loading = desktopOverlay?.loading ?? navStatus._tag === \"Loading\";\n const canGoBack = desktopOverlay?.canGoBack ?? snapshot?.canGoBack ?? false;\n const canGoForward = desktopOverlay?.canGoForward ?? snapshot?.canGoForward ?? false;\n const refreshDisabled = navStatus._tag === \"Idle\";\n const isUnreachable = navStatus._tag === \"LoadFailed\";\n const showEmptyState = shouldShowPreviewEmptyState(snapshot);\n const controller = desktopOverlay?.controller ?? \"none\";\n const loadProgress = useLoadingProgress(loading);\n const displayUrl =\n url && environment && environmentHttpBaseUrl\n ? (formatPreviewUrl({\n url,\n environmentLabel: environment.label,\n environmentHttpBaseUrl,\n }) ?? undefined)\n : undefined;\n const viewport = snapshot?.viewport ?? FILL_PREVIEW_VIEWPORT;\n const panelRect = useBrowserSurfaceStore((state) =>\n runtimeTabId ? (state.byTabId[runtimeTabId]?.rect ?? null) : null,\n );\n\n const navigateToResolvedUrl = useCallback(\n async (resolvedUrl: string) => {\n if (runtimeTabId && previewBridge) {\n // Drive the webview imperatively; `usePreviewBridge` mirrors the\n // resolved URL back to the server so other clients stay in sync.\n await previewBridge.navigate(runtimeTabId, resolvedUrl);\n rememberPreviewUrl(threadRef, resolvedUrl);\n } else {\n await openPreviewSession({\n openPreview: open,\n threadRef,\n url: resolvedUrl,\n });\n }\n },\n [open, runtimeTabId, threadRef],\n );\n\n const handleSubmitUrl = useCallback(\n async (next: string) => {\n try {\n await navigateToResolvedUrl(normalizePreviewUrl(next));\n } catch {\n // Server-side `failed` event renders the unreachable view.\n }\n },\n [navigateToResolvedUrl],\n );\n\n const handleOpenServerUrl = useCallback(\n async (next: string) => {\n try {\n await navigateToResolvedUrl(resolveDiscoveredServerUrl(threadRef.environmentId, next));\n } catch {\n // Server-side `failed` event renders the unreachable view.\n }\n },\n [navigateToResolvedUrl, threadRef.environmentId],\n );\n\n const handleRefresh = useCallback(() => {\n if (previewBridge && runtimeTabId) void previewBridge.refresh(runtimeTabId);\n }, [runtimeTabId]);\n\n const handleZoomIn = useCallback(() => {\n if (previewBridge && runtimeTabId) void previewBridge.zoomIn(runtimeTabId);\n }, [runtimeTabId]);\n\n const handleZoomOut = useCallback(() => {\n if (previewBridge && runtimeTabId) void previewBridge.zoomOut(runtimeTabId);\n }, [runtimeTabId]);\n\n const handleResetZoom = useCallback(() => {\n if (previewBridge && runtimeTabId) void previewBridge.resetZoom(runtimeTabId);\n }, [runtimeTabId]);\n\n const handleViewportChange = useCallback(\n async (nextViewport: PreviewViewportSetting) => {\n if (!tabId) return;\n const result = await resize({\n environmentId: threadRef.environmentId,\n input: {\n threadId: threadRef.threadId,\n tabId,\n viewport: nextViewport,\n },\n });\n if (result._tag === \"Failure\") {\n const error = squashAtomCommandFailure(result);\n toastManager.add({\n type: \"error\",\n title: \"Unable to resize browser viewport\",\n description: error instanceof Error ? error.message : \"An error occurred.\",\n });\n throw error;\n }\n updatePreviewServerSnapshot(threadRef, result.value);\n },\n [resize, tabId, threadRef],\n );\n\n const handleToggleDeviceToolbar = () => {\n if (!runtimeTabId) return;\n if (viewport._tag !== \"fill\") {\n void commitBrowserViewportChange(runtimeTabId, FILL_PREVIEW_VIEWPORT).catch(() => undefined);\n return;\n }\n\n const responsiveSize = panelRect\n ? resolveResponsiveBrowserViewportSize(panelRect, desktopOverlay?.zoomFactor)\n : { width: 1024, height: 768 };\n void commitBrowserViewportChange(runtimeTabId, { _tag: \"freeform\", ...responsiveSize }).catch(\n () => undefined,\n );\n };\n\n useEffect(() => {\n if (!runtimeTabId) return;\n return subscribeBrowserViewportChange(runtimeTabId, handleViewportChange);\n }, [handleViewportChange, runtimeTabId]);\n\n const handleBack = useCallback(() => {\n if (previewBridge && runtimeTabId) void previewBridge.goBack(runtimeTabId);\n }, [runtimeTabId]);\n\n const handleForward = useCallback(() => {\n if (previewBridge && runtimeTabId) void previewBridge.goForward(runtimeTabId);\n }, [runtimeTabId]);\n\n const handleOpenInBrowser = useCallback(() => {\n if (!localApi || !url) return;\n void localApi.shell.openExternal(url).catch(() => undefined);\n }, [url]);\n\n const handlePictureInPicture = useCallback(() => {\n if (!tabId) return;\n if (miniPlayer?.tabId === tabId) {\n usePreviewMiniPlayerStore.getState().close(threadRef);\n return;\n }\n usePreviewMiniPlayerStore.getState().open(threadRef, tabId);\n useRightPanelStore.getState().close(threadRef);\n }, [miniPlayer?.tabId, tabId, threadRef]);\n\n const handleNativePictureInPicture = useCallback(() => {\n if (!previewBridge || !runtimeTabId) return;\n const operation = desktopOverlay?.pictureInPicture\n ? previewBridge.pictureInPicture.close\n : previewBridge.pictureInPicture.open;\n void operation(runtimeTabId).catch((error) => {\n toastManager.add({\n type: \"error\",\n title: \"Unable to update popped-out preview\",\n description: error instanceof Error ? error.message : \"An error occurred.\",\n });\n });\n }, [desktopOverlay?.pictureInPicture, runtimeTabId]);\n\n const handleCapture = useCallback(\n (record: boolean) => {\n if (!previewBridge || !runtimeTabId || !tabId) return;\n const bridge = previewBridge;\n if (recordingRuntimeTabId) {\n void stopBrowserRecording(recordingRuntimeTabId).then(\n (artifact) => {\n if (!artifact) return;\n let pathCopied = false;\n let toastId: ReturnType<typeof toastManager.add>;\n\n const copyPath = () => {\n if (!navigator.clipboard?.writeText) {\n toastManager.update(\n toastId,\n stackedThreadToast({\n type: \"error\",\n title: \"Unable to copy recording path\",\n description: \"Clipboard API unavailable.\",\n actionProps: revealAction,\n }),\n );\n return;\n }\n\n void navigator.clipboard.writeText(artifact.path).then(\n () => {\n pathCopied = true;\n updateRecordingToast();\n window.setTimeout(() => {\n pathCopied = false;\n updateRecordingToast();\n }, 2_000);\n },\n (error) => {\n toastManager.update(\n toastId,\n stackedThreadToast({\n type: \"error\",\n title: \"Unable to copy recording path\",\n description: error instanceof Error ? error.message : \"An error occurred.\",\n actionProps: revealAction,\n }),\n );\n },\n );\n };\n\n const revealAction = {\n children: revealInFileExplorerLabel(navigator.platform),\n onClick: () => void bridge.revealArtifact(artifact.path),\n };\n const updateRecordingToast = () => {\n toastManager.update(\n toastId,\n stackedThreadToast({\n type: \"success\",\n title: \"Recording saved\",\n actionProps: revealAction,\n data: {\n secondaryActionProps: {\n children: pathCopied ? \"Copied!\" : \"Copy path\",\n disabled: pathCopied,\n onClick: copyPath,\n },\n secondaryActionVariant: \"outline\",\n },\n }),\n );\n };\n\n toastId = toastManager.add(\n stackedThreadToast({\n type: \"success\",\n title: \"Recording saved\",\n actionProps: revealAction,\n data: {\n secondaryActionProps: {\n children: \"Copy path\",\n onClick: copyPath,\n },\n secondaryActionVariant: \"outline\",\n },\n }),\n );\n },\n (error) => {\n toastManager.add({\n type: \"error\",\n title: \"Unable to stop recording\",\n description: error instanceof Error ? error.message : \"An error occurred.\",\n });\n },\n );\n return;\n }\n if (record) {\n void startBrowserRecording(runtimeTabId, threadRef, tabId).catch((error) => {\n toastManager.add({\n type: \"error\",\n title: \"Unable to start recording\",\n description: error instanceof Error ? error.message : \"An error occurred.\",\n });\n });\n return;\n }\n void bridge.captureScreenshot(runtimeTabId).then(\n (artifact) => {\n const revealAction = {\n children: revealInFileExplorerLabel(navigator.platform),\n onClick: () => void bridge.revealArtifact(artifact.path),\n };\n let pathCopied = false;\n let imageCopied = false;\n let toastId: ReturnType<typeof toastManager.add>;\n\n const updateScreenshotToast = (\n type: \"success\" | \"error\" = \"success\",\n title = \"Screenshot saved\",\n description?: string,\n ) => {\n toastManager.update(\n toastId,\n stackedThreadToast({\n type,\n title,\n description,\n actionProps: {\n children: imageCopied ? \"Copied!\" : \"Copy image\",\n disabled: imageCopied,\n onClick: copyImage,\n },\n data: {\n additionalActions: [\n {\n id: \"copy-path\",\n props: {\n children: pathCopied ? \"Copied!\" : \"Copy path\",\n disabled: pathCopied,\n onClick: copyPath,\n },\n },\n ],\n secondaryActionProps: {\n ...revealAction,\n },\n secondaryActionVariant: \"outline\",\n },\n }),\n );\n };\n\n const copyPath = () => {\n if (!navigator.clipboard?.writeText) {\n updateScreenshotToast(\n \"error\",\n \"Unable to copy screenshot path\",\n \"Clipboard API unavailable.\",\n );\n return;\n }\n\n void navigator.clipboard.writeText(artifact.path).then(\n () => {\n pathCopied = true;\n updateScreenshotToast();\n window.setTimeout(() => {\n pathCopied = false;\n updateScreenshotToast();\n }, 2_000);\n },\n (error) => {\n updateScreenshotToast(\n \"error\",\n \"Unable to copy screenshot path\",\n error instanceof Error ? error.message : \"An error occurred.\",\n );\n },\n );\n };\n\n const copyImage = () => {\n void bridge.copyArtifactToClipboard(artifact.path).then(\n () => {\n imageCopied = true;\n updateScreenshotToast();\n window.setTimeout(() => {\n imageCopied = false;\n updateScreenshotToast();\n }, 2_000);\n },\n (error) => {\n updateScreenshotToast(\n \"error\",\n \"Unable to copy screenshot\",\n error instanceof Error ? error.message : \"An error occurred.\",\n );\n },\n );\n };\n\n toastId = toastManager.add(\n stackedThreadToast({\n type: \"success\",\n title: \"Screenshot saved\",\n actionProps: {\n children: \"Copy image\",\n onClick: copyImage,\n },\n data: {\n additionalActions: [\n {\n id: \"copy-path\",\n props: {\n children: \"Copy path\",\n onClick: copyPath,\n },\n },\n ],\n secondaryActionProps: {\n ...revealAction,\n },\n secondaryActionVariant: \"outline\",\n },\n }),\n );\n },\n (error) => {\n toastManager.add({\n type: \"error\",\n title: \"Unable to capture screenshot\",\n description: error instanceof Error ? error.message : \"An error occurred.\",\n });\n },\n );\n },\n [recordingRuntimeTabId, runtimeTabId, tabId, threadRef],\n );\n\n const handlePickElement = useCallback(() => {\n if (!previewBridge || !runtimeTabId) return;\n if (pickActiveRef.current) {\n void previewBridge.cancelPickElement(runtimeTabId).catch(() => undefined);\n return;\n }\n // Snapshot whatever the user was focused on (typically the chat\n // composer textarea or the chrome-row pick button) BEFORE main steals\n // focus into the guest webContents. We restore it when the pick\n // resolves so the user's typing context isn't lost — otherwise after\n // every pick they'd have to click back into the textarea.\n const previouslyFocused =\n typeof document !== \"undefined\" ? (document.activeElement as HTMLElement | null) : null;\n pickActiveRef.current = true;\n setPickActive(true);\n void (async () => {\n try {\n const annotation = await previewBridge.pickElement(runtimeTabId);\n if (!annotation) return;\n addPreviewAnnotation(threadRef, annotation);\n const screenshotFile = await previewAnnotationScreenshotFile(annotation);\n if (screenshotFile && annotation.screenshot) {\n addImage(threadRef, {\n type: \"image\",\n id: annotation.id,\n name: screenshotFile.name,\n mimeType: screenshotFile.type,\n sizeBytes: screenshotFile.size,\n previewUrl: annotation.screenshot.dataUrl,\n file: screenshotFile,\n });\n }\n } catch {\n // Picker failed (e.g. webview navigated). Treat as silent cancel.\n } finally {\n pickActiveRef.current = false;\n // Avoid `setState on unmounted component` if the panel/thread closed\n // while the pick was in flight.\n if (isMountedRef.current) setPickActive(false);\n // Best-effort: restore focus to whatever the user had before the\n // pick stole it into the guest webContents. Skip if the previously-\n // focused element was unmounted or is no longer focusable.\n if (\n previouslyFocused &&\n previouslyFocused.isConnected &&\n typeof previouslyFocused.focus === \"function\"\n ) {\n try {\n previouslyFocused.focus({ preventScroll: true });\n } catch {\n // Some elements throw on .focus() (detached iframes, etc.).\n }\n }\n }\n })();\n }, [addImage, addPreviewAnnotation, runtimeTabId, threadRef]);\n\n // If the active tab changes mid-pick (close, thread switch, hot restart),\n // tell main to tear down the in-flight session AND reset our local toggle\n // state so the button doesn't get stuck pressed against a stale tab id.\n useEffect(() => {\n return () => {\n if (!pickActiveRef.current) return;\n pickActiveRef.current = false;\n if (previewBridge && runtimeTabId) {\n void previewBridge.cancelPickElement(runtimeTabId).catch(() => undefined);\n }\n if (isMountedRef.current) setPickActive(false);\n };\n }, [runtimeTabId]);\n\n // Subscribe only while visible; `toggle-panel` is owned by ChatView's\n // URL-aware handler regardless of whether the panel is currently mounted.\n useEffect(() => {\n if (!visible) return;\n return subscribePreviewAction((action) => {\n switch (action) {\n case \"refresh\":\n handleRefresh();\n return;\n case \"focus-url\":\n setFocusUrlNonce((value) => (value ?? 0) + 1);\n return;\n case \"zoom-in\":\n handleZoomIn();\n return;\n case \"zoom-out\":\n handleZoomOut();\n return;\n case \"reset-zoom\":\n handleResetZoom();\n return;\n case \"toggle-panel\":\n return;\n }\n });\n }, [handleRefresh, handleResetZoom, handleZoomIn, handleZoomOut, visible]);\n\n return (\n <div\n className=\"flex min-h-0 flex-1 flex-col bg-background\"\n data-thread-key={scopedThreadKey(threadRef)}\n >\n <PreviewChromeRow\n url={url}\n displayUrl={displayUrl}\n loading={loading}\n loadProgress={loadProgress}\n canGoBack={canGoBack}\n canGoForward={canGoForward}\n refreshDisabled={refreshDisabled}\n focusUrlNonce={focusUrlNonce}\n onBack={handleBack}\n onForward={handleForward}\n onRefresh={handleRefresh}\n onSubmit={(next) => void handleSubmitUrl(next)}\n onOpenInBrowser={tabId ? handleOpenInBrowser : undefined}\n onCapture={previewBridge && tabId ? handleCapture : undefined}\n captureDisabled={!desktopOverlay || isUnreachable}\n recording={recordingRuntimeTabId !== null}\n onPictureInPicture={previewBridge && tabId ? handlePictureInPicture : undefined}\n pictureInPicture={miniPlayer?.tabId === tabId}\n pictureInPictureDisabled={!desktopOverlay?.hasWebContents || isUnreachable}\n onPickElement={previewBridge && tabId ? handlePickElement : undefined}\n pickActive={pickActive}\n // Disable when there's no tab (nothing to pick on) OR the page\n // failed to load (a React overlay covers the webview, so the\n // user wouldn't be able to actually click anything underneath).\n pickDisabled={!tabId || isUnreachable}\n pickDisabledReason={\n isUnreachable ? \"Page didn't load — pick unavailable until the page renders\" : undefined\n }\n trailingActions={\n previewBridge ? (\n <PreviewMoreMenu\n tabId={runtimeTabId}\n hasWebContents={desktopOverlay?.hasWebContents ?? false}\n zoomFactor={desktopOverlay?.zoomFactor ?? 1}\n colorScheme={desktopOverlay?.colorScheme ?? \"system\"}\n deviceToolbarVisible={viewport._tag !== \"fill\"}\n onToggleDeviceToolbar={handleToggleDeviceToolbar}\n nativePictureInPicture={desktopOverlay?.pictureInPicture ?? false}\n onNativePictureInPicture={handleNativePictureInPicture}\n />\n ) : null\n }\n />\n\n <div className=\"relative min-h-0 flex-1 overflow-hidden\">\n {runtimeTabId && snapshot && !showEmptyState ? (\n <BrowserSurfaceSlot\n key={runtimeTabId}\n tabId={runtimeTabId}\n visible={visible && !isUnreachable}\n className=\"absolute inset-0 h-full w-full\"\n />\n ) : null}\n {showEmptyState ? (\n <PreviewEmptyState\n environmentId={threadRef.environmentId}\n configuredUrls={configuredUrls}\n recentlySeenUrls={previewState.recentlySeenUrls}\n onOpenUrl={(next) => void handleOpenServerUrl(next)}\n />\n ) : null}\n {snapshot && desktopOverlay ? (\n <ZoomIndicator zoomFactor={desktopOverlay.zoomFactor} />\n ) : null}\n {runtimeTabId && desktopOverlay && !showEmptyState && !isUnreachable ? (\n <AgentBrowserCursor\n tabId={runtimeTabId}\n zoomFactor={desktopOverlay.zoomFactor}\n controller={controller}\n />\n ) : null}\n {controller !== \"none\" ? (\n <div className=\"pointer-events-none absolute left-3 top-3 z-40 rounded-full border border-border/70 bg-background/90 px-2.5 py-1 text-[11px] font-medium shadow-sm backdrop-blur\">\n {controller === \"agent\" ? \"Agent controlling browser\" : \"Human control\"}\n </div>\n ) : null}\n {navStatus._tag === \"LoadFailed\" ? (\n <div className=\"absolute inset-0 z-10 bg-background\">\n <PreviewUnreachable\n url={navStatus.url}\n code={navStatus.code}\n description={navStatus.description}\n onReload={handleRefresh}\n />\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport type { ScopedThreadRef } from \"@t3tools/contracts\";\n\nimport { isPreviewSupportedInRuntime } from \"~/previewStateStore\";\n\nimport { PreviewPanelShell, type PreviewPanelMode } from \"./PreviewPanelShell\";\nimport { PreviewView } from \"./PreviewView\";\n\ninterface Props {\n mode: PreviewPanelMode;\n threadRef: ScopedThreadRef;\n tabId?: string | null;\n configuredUrls?: ReadonlyArray<string> | undefined;\n visible: boolean;\n}\n\nexport function PreviewPanel({ mode, threadRef, tabId, configuredUrls, visible }: Props) {\n if (!isPreviewSupportedInRuntime()) {\n return (\n <PreviewPanelShell mode={mode}>\n <div className=\"flex min-h-0 flex-1 flex-col items-center justify-center gap-3 p-8 text-center\">\n <p className=\"max-w-sm text-sm text-muted-foreground\">\n Preview is only available in the laplus desktop app.\n </p>\n </div>\n </PreviewPanelShell>\n );\n }\n\n return (\n <PreviewPanelShell mode={mode}>\n <PreviewView\n threadRef={threadRef}\n {...(tabId !== undefined ? { tabId } : {})}\n configuredUrls={configuredUrls}\n visible={visible}\n />\n </PreviewPanelShell>\n );\n}\n"],"x_google_ignoreList":[0,1,2,3,4],"mappings":"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"}