vibe64 0.1.26 → 0.1.28
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.
- package/dist/assets/{VRadioGroup-D6WRdUau.js → VRadioGroup-BuRMvs7d.js} +1 -1
- package/dist/assets/{VTabs-BGX5dGoS.js → VTabs-CQq9CAuT.js} +1 -1
- package/dist/assets/{VTextarea-CD6H_mtJ.js → VTextarea-Duvzvmjq.js} +1 -1
- package/dist/assets/{Vibe64AsyncModuleState-Cel3OePx.js → Vibe64AsyncModuleState-DuuzlJDp.js} +1 -1
- package/dist/assets/{Vibe64AuthSettingsButton-CMMeacsl.js → Vibe64AuthSettingsButton-CKOCL-kl.js} +1 -1
- package/dist/assets/{Vibe64DashboardShell-C2UhX2ke.js → Vibe64DashboardShell-DMT8aOp1.js} +1 -1
- package/dist/assets/{Vibe64DatabaseWorkspace-C43TE5-O.js → Vibe64DatabaseWorkspace-CqH0zfFZ.js} +1 -1
- package/dist/assets/{Vibe64OutputControls-BmzH2ASf.js → Vibe64OutputControls-DDILWOYb.js} +1 -1
- package/dist/assets/{Vibe64RepositoryWorkspace-CT9tkvHh.js → Vibe64RepositoryWorkspace-D11BZHtF.js} +1 -1
- package/dist/assets/Vibe64SessionFiles-BSoB7Xrs.js +1 -0
- package/dist/assets/{Vibe64SessionFiles-CH5PCxwg.css → Vibe64SessionFiles-DVux69YS.css} +1 -1
- package/dist/assets/{Vibe64SubsystemsView-DNx-pZp8.js → Vibe64SubsystemsView-tLlxmK3M.js} +1 -1
- package/dist/assets/{Vibe64SystemWorldView-UdNJZbqX.js → Vibe64SystemWorldView-8og8TPyL.js} +1 -1
- package/dist/assets/{_sessionId_-DZTmI19N.js → _sessionId_-Dts6gv4W.js} +1 -1
- package/dist/assets/{_sessionTool_-CugJWIK4.js → _sessionTool_-bHJUlHCW.js} +1 -1
- package/dist/assets/_slug_-B3fqw8Sl.js +12 -0
- package/dist/assets/_slug_-DfHqx2_b.css +1 -0
- package/dist/assets/{dashboard-D4NXqPY1.js → dashboard-CcD6GIaB.js} +1 -1
- package/dist/assets/{definitions-CyUCoqu-.js → definitions-ChGXm26a.js} +1 -1
- package/dist/assets/{error-kYKTA8fu.js → error-CStS-Kbt.js} +1 -1
- package/dist/assets/{index-hy7AAm-B.js → index-B262pg9q.js} +1 -1
- package/dist/assets/{index-DX6Rm6jZ.js → index-B_grpOta.js} +1 -1
- package/dist/assets/{index-Cpt19GIW.js → index-BtHA_DX9.js} +1 -1
- package/dist/assets/{index-SBc6H2In.js → index-C4KnwA0g.js} +4 -4
- package/dist/assets/{index-DeRx59Iq.js → index-CC7BFJAg.js} +1 -1
- package/dist/assets/{index-6Kv-7k0S.js → index-CKFrWxnr.js} +1 -1
- package/dist/assets/{index-BDe3NnFP.js → index-CPG-_bMW.js} +1 -1
- package/dist/assets/{index-CuEZOpKL.js → index-CV9pOpbQ.js} +1 -1
- package/dist/assets/{index-D4p1hWbM.js → index-DIQxSy1c.js} +1 -1
- package/dist/assets/{index-D5vnCntG.js → index-DVaJ8fEr.js} +1 -1
- package/dist/assets/{index-BGu7hfTb.js → index-DtGqjUin.js} +1 -1
- package/dist/assets/{index-Cca4WXur.js → index-YQALXwL4.js} +1 -1
- package/dist/assets/{placement-Nw6LF6xp.js → placement-Cyt3SnRe.js} +1 -1
- package/dist/assets/{studioGateApi-B2eiydiA.js → studioGateApi-BwBnOYBp.js} +1 -1
- package/dist/assets/{useArchivedVibe64Sessions-LeGda1Y9.js → useArchivedVibe64Sessions-_FKt1-qN.js} +1 -1
- package/dist/assets/{useVibe64ConversationLog-BPyKYbvH.js → useVibe64ConversationLog-BjnpqM9K.js} +1 -1
- package/dist/assets/{useVibe64ProjectScope-n5T5l2pY.js → useVibe64ProjectScope-DcDkjbLT.js} +1 -1
- package/dist/assets/{useVibe64SessionData-BToODuTg.js → useVibe64SessionData-BHLSmuPm.js} +1 -1
- package/dist/assets/{useVibe64SessionSelection-D1wXIWTm.js → useVibe64SessionSelection-G6KQKJxb.js} +1 -1
- package/dist/assets/{vibe64RepositoryRealtime-Xo7aIksE.js → vibe64RepositoryRealtime-C2WPn5do.js} +1 -1
- package/dist/assets/{vibe64SessionInfo-Dy_4bL3a.js → vibe64SessionInfo-8kuxgD5r.js} +1 -1
- package/dist/assets/{vibe64SessionPanelModel-5UED-6V-.js → vibe64SessionPanelModel-DDaXjAJ_.js} +1 -1
- package/dist/assets/{vibe64SessionRequestConfig-B7Llggdb.js → vibe64SessionRequestConfig-uGWcyQY6.js} +1 -1
- package/dist/assets/{vibe64SessionToolDefinitions-C4maKOfp.js → vibe64SessionToolDefinitions-D5CgOIqa.js} +1 -1
- package/dist/assets/{vueRefOrGetterValue-_KqAOFjr.js → vueRefOrGetterValue-CV9c3oBd.js} +1 -1
- package/dist/index.html +1 -1
- package/node_modules/@jskit-ai/connector-google-calendar/package.json +3 -3
- package/node_modules/@jskit-ai/connector-google-calendar/patterns/calendar-cli/example/package.json +4 -4
- package/node_modules/@jskit-ai/connectors-catalog/package.json +3 -3
- package/node_modules/@jskit-ai/connectors-catalog/test/dbt-semantic-layer.test.js +3 -0
- package/node_modules/@jskit-ai/connectors-catalog/test/google-ads.test.js +3 -0
- package/node_modules/@jskit-ai/connectors-catalog/test/salesforce.test.js +3 -0
- package/node_modules/@jskit-ai/connectors-catalog/test/xero.test.js +3 -0
- package/node_modules/@jskit-ai/connectors-core/package.json +4 -4
- package/node_modules/@jskit-ai/http-web/package.json +6 -6
- package/node_modules/@jskit-ai/kernel/package.json +1 -1
- package/node_modules/@jskit-ai/kernel/server/runtime/fastifyBootstrap.js +50 -10
- package/node_modules/@jskit-ai/kernel/server/runtime/fastifyBootstrap.test.js +38 -0
- package/node_modules/@jskit-ai/kernel/shared/support/normalize.js +8 -0
- package/node_modules/@jskit-ai/kernel/shared/support/normalize.test.js +10 -0
- package/node_modules/@jskit-ai/payments-core/package.json +1 -1
- package/node_modules/@jskit-ai/realtime/package.json +3 -3
- package/node_modules/@jskit-ai/realtime/patterns/realtime-application/example/package.json +2 -2
- package/node_modules/@jskit-ai/resource-core/package.json +2 -2
- package/node_modules/@jskit-ai/resource-crud-core/package.json +3 -3
- package/node_modules/@jskit-ai/shell-web/package.json +2 -2
- package/node_modules/@jskit-ai/uploads-runtime/package.json +2 -2
- package/node_modules/@local/current-app/package.json +1 -1
- package/node_modules/@local/main/package.json +2 -2
- package/node_modules/@local/studio-health/package.json +1 -1
- package/node_modules/@local/vibe64-accounts/package.json +3 -3
- package/node_modules/@local/vibe64-core/package.json +1 -1
- package/node_modules/@local/vibe64-database-tools/package.json +3 -3
- package/node_modules/@local/vibe64-project/package.json +1 -1
- package/node_modules/@local/vibe64-runtime/src/server/codexAppServerProvider.js +34 -0
- package/node_modules/@local/vibe64-sessions/package.json +1 -1
- package/node_modules/@local/vibe64-sessions/src/server/sessionRenewal.js +4 -1
- package/node_modules/@local/vibe64-source-editor/package.json +5 -5
- package/node_modules/@local/vibe64-system-graph/package.json +3 -3
- package/node_modules/@local/vibe64-terminals/package.json +2 -2
- package/node_modules/@local/vibe64-terminals/src/server/agent/providers/codexSessionAgentProvider.js +6 -0
- package/node_modules/@local/vibe64-terminals/src/server/agent/sessionAgentManager.js +16 -0
- package/node_modules/@local/vibe64-terminals/src/server/codexTerminal.js +180 -64
- package/node_modules/@local/vibe64-terminals/src/server/registerRoutes.js +12 -0
- package/node_modules/@local/vibe64-terminals/src/server/service.js +57 -16
- package/node_modules/@local/vibe64-terminals/src/server/sessionPromptHints.js +9 -1
- package/node_modules/@local/vibe64-terminals/src/server/sessionSaveCommitMessage.js +1 -1
- package/package.json +15 -15
- package/packages/current-app/package.json +1 -1
- package/packages/main/package.json +2 -2
- package/packages/studio-health/package.json +1 -1
- package/packages/vibe64-accounts/package.json +3 -3
- package/packages/vibe64-core/package.json +1 -1
- package/packages/vibe64-database-tools/package.json +3 -3
- package/packages/vibe64-project/package.json +1 -1
- package/packages/vibe64-runtime/src/server/codexAppServerProvider.js +34 -0
- package/packages/vibe64-sessions/package.json +1 -1
- package/packages/vibe64-sessions/src/server/sessionRenewal.js +4 -1
- package/packages/vibe64-source-editor/package.json +5 -5
- package/packages/vibe64-system-graph/package.json +3 -3
- package/packages/vibe64-terminals/package.json +2 -2
- package/packages/vibe64-terminals/src/server/agent/providers/codexSessionAgentProvider.js +6 -0
- package/packages/vibe64-terminals/src/server/agent/sessionAgentManager.js +16 -0
- package/packages/vibe64-terminals/src/server/codexTerminal.js +180 -64
- package/packages/vibe64-terminals/src/server/registerRoutes.js +12 -0
- package/packages/vibe64-terminals/src/server/service.js +57 -16
- package/packages/vibe64-terminals/src/server/sessionPromptHints.js +9 -1
- package/packages/vibe64-terminals/src/server/sessionSaveCommitMessage.js +1 -1
- package/dist/assets/Vibe64SessionFiles-BS5MW7Qz.js +0 -1
- package/dist/assets/_slug_-BzRzebKA.js +0 -12
- package/dist/assets/_slug_-Q7ibe3SE.css +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{H as watch,a as openBlock,b as createBlock,al as createSlots,y as renderList,w as withCtx,J as renderSlot,am as normalizeProps,an as guardReactiveProps,bh as Vibe64Terminal,r as createCommentVNode,P as usePaths,bm as useVibe64Terminal,bn as createWebSocketTerminalDriver,D as useEndpointResource,A as computed,E as useCommand,R as ROUTE_VISIBILITY_PUBLIC,Q as VIBE64_SURFACE_ID,M as useRealtimeEvent,C as onBeforeUnmount,B as ref,L as getHttpWebClient,eT as currentProjectSlugFromLocation,cE as stableLocalStorageKeyPart,aJ as vibe64ProjectScopedStorageKey,dJ as onBeforeMount,a6 as nextTick,aH as writeLocalStorageJson,aI as readLocalStorageJson,o as onMounted,_ as _export_sfc,au as inject,i as unref,c as createElementBlock,d as createBaseVNode,e as createVNode,bI as mdiChevronLeft,n as VBtn,$ as normalizeClass,cx as mdiDotsHorizontal,h as VIcon,bF as mdiChevronRight,dS as mdiChevronUp,a3 as withModifiers,be as mdiArrowLeft,O as VMenu,a$ as VList,F as Fragment,b0 as VListItem,N as mergeProps,eU as mdiRoutes,aC as withDirectives,em as vModelText,a8 as withKeys,bd as isRef,aj as mdiRefresh,cw as mdiContentCopy,V as VCard,a4 as VCardItem,eV as mdiAccountCircleOutline,br as VDivider,eW as mdiAccountOffOutline,I as VAlert,j as createTextVNode,t as toDisplayString,eX as mdiAccountSwitchOutline,dv as mdiOpenInNew,ak as mdiConsoleLine,eY as mdiPowerCycle,bq as mdiPlayCircleOutline,eZ as mdiDownloadOutline,ai as VChip,k as VCardText,q as mdiAlertCircleOutline,l as VCardActions,aY as Teleport,e_ as mdiWebClock,ad as resolveDynamicComponent,g as VCardTitle,a9 as VTextField,z as VSpacer,p as VDialog,e$ as VSnackbar}from"./index-SBc6H2In.js";import{v as vibe64OutputTerminalWebSocketUrl,V as VIBE64_RESOURCE_RECOVERY_KEY}from"./_slug_-BzRzebKA.js";import{V as Vibe64TemporaryAiFixAction}from"./vibe64RepositoryRealtime-Xo7aIksE.js";import{c as VIBE64_SESSIONS_API_SUFFIX,q as vibe64OutputRunPath,Z as vibe64OutputRunStopPath,_ as vibe64PreviewIdentityPath,V as VIBE64_SESSION_CHANGED_EVENT,v as vibe64SessionPath,$ as vibe64SessionPreviewStatePath,a0 as vibe64OutputsPath,a1 as vibe64OutputsQueryKey,a2 as vibe64OutputResultPath}from"./vibe64SessionRequestConfig-B7Llggdb.js";import{r as readRefOrGetterValue}from"./vueRefOrGetterValue-_KqAOFjr.js";import{a as vibe64SessionDebugLog,b as vibe64SessionDebugError,v as vibe64SessionSourcePath}from"./vibe64SessionPanelModel-5UED-6V-.js";import{i as isArchivedVibe64Session,b as vibe64SessionRevision}from"./vibe64SessionViewModel-C4e2otoM.js";import{v as vibe64RealtimeOriginPayload,b as vibe64RealtimePayloadFromCurrentTab}from"./vibe64BrowserTabOrigin-DDSCqr3B.js";import{u as useVibe64ProjectSlug}from"./useVibe64ProjectScope-n5T5l2pY.js";import"./Vibe64AuthSettingsButton-CMMeacsl.js";import"./studioGateApi-B2eiydiA.js";import"./vibe64AccountConnectionsDialog-Cd1-kEer.js";import"./VTabs-BGX5dGoS.js";import"./Vibe64AsyncModuleState-Cel3OePx.js";import"./vibe64ApiResponses-COQ3JIKv.js";import"./VTextarea-CD6H_mtJ.js";import"./Vibe64SessionFiles-BS5MW7Qz.js";import"./useVibe64ConversationLog-BPyKYbvH.js";import"./definitions-CyUCoqu-.js";import"./index-BYZl5lR4.js";import"./base-DDNBxAg7.js";import"./VRadioGroup-D6WRdUau.js";import"./vibe64SessionInfo-Dy_4bL3a.js";import"./Vibe64DashboardShell-C2UhX2ke.js";import"./placement-Nw6LF6xp.js";import"./vibe64SessionToolDefinitions-C4maKOfp.js";import"./useVibe64SessionData-BToODuTg.js";import"./useVibe64SessionSelection-D1wXIWTm.js";import"./route-block-D_Po64gA.js";const _sfc_main$1={__name:"Vibe64LongRunningTerminal",props:{commandPreview:{default:"",type:String},error:{default:"",type:String},errorTitle:{default:"Run output needs attention",type:String},fill:{default:false,type:Boolean},floatingStorageKey:{default:"",type:String},height:{default:"clamp(18rem, 48vh, 34rem)",type:String},open:{default:false,type:Boolean},presentation:{default:"floating",type:String},showCopy:{default:true,type:Boolean},showInterrupt:{default:true,type:Boolean},stage:{default:"",type:String},status:{default:"",type:String},subtitle:{default:"",type:String},surfaceClass:{default:"",type:[String,Array,Object]},surfaceStyle:{default:null,type:[String,Array,Object]},terminal:{required:true,type:Object},title:{default:"Run output",type:String}},emits:["copy","interrupt","retry","update:open"],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const forwardedSlots=["actions-after","actions-before","before-terminal","error-actions","footer","heading","overlay"];function hide(){emit("update:open",false)}watch(()=>props.open,open=>{var _a,_b;if(!open){(_b=(_a=props.terminal)==null?void 0:_a.closeTerminalSocket)==null?void 0:_b.call(_a)}});return(_ctx,_cache)=>{return __props.open?(openBlock(),createBlock(Vibe64Terminal,{key:0,collapsible:false,"command-preview":__props.commandPreview,"disconnect-when-hidden":true,error:__props.error,"error-title":__props.errorTitle,expanded:true,fill:__props.fill,"floating-storage-key":__props.floatingStorageKey,height:__props.height,"mobile-takeover":"",presentation:__props.presentation,"show-close":"","show-copy":__props.showCopy,"show-interrupt":__props.showInterrupt,stage:__props.stage,status:__props.status,subtitle:__props.subtitle,"surface-class":__props.surfaceClass,"surface-style":__props.surfaceStyle,terminal:__props.terminal,title:__props.title,visible:true,onClose:hide,onCopy:_cache[0]||(_cache[0]=$event=>_ctx.$emit("copy",$event)),onInterrupt:_cache[1]||(_cache[1]=$event=>_ctx.$emit("interrupt")),onRetry:_cache[2]||(_cache[2]=$event=>_ctx.$emit("retry"))},createSlots({_:2},[renderList(forwardedSlots,slotName=>{return{name:slotName,fn:withCtx(slotProps=>[renderSlot(_ctx.$slots,slotName,normalizeProps(guardReactiveProps(slotProps||{})))])}})]),1032,["command-preview","error","error-title","fill","floating-storage-key","height","presentation","show-copy","show-interrupt","stage","status","subtitle","surface-class","surface-style","terminal","title"])):createCommentVNode("",true)}}};function preferredPreviewTarget(outputTargets=[]){const targets=(Array.isArray(outputTargets)?outputTargets:[]).filter(target=>{var _a;return((_a=target==null?void 0:target.presentation)==null?void 0:_a.kind)==="web"});return targets.find(target=>(target==null?void 0:target.default)===true)||targets[0]||null}function managedPreviewTarget(outputTargets=[]){const availableTargets=(Array.isArray(outputTargets)?outputTargets:[]).filter(target=>(target==null?void 0:target.available)!==false);return preferredPreviewTarget(availableTargets)}const LAUNCH_BROWSER_WINDOW_FEATURES="popup,width=1400,height=900,left=80,top=60";const LAUNCH_PREVIEW_TOOLBAR_POSITIONS=Object.freeze(["left","center","right"]);const AUTO_START_ATTEMPT_COOLDOWN_MS=7e3;const AUTO_START_STABILITY_DELAY_MS=750;const LAUNCH_STATUS_RETRY_LIMIT=2;const LAUNCH_STATUS_RETRY_BASE_DELAY_MS=1e3;const LAUNCH_STATUS_RETRY_MAX_DELAY_MS=5e3;const LAUNCH_STATUS_IDLE_RECOVERY_INITIAL_DELAY_MS=1200;const LAUNCH_STATUS_IDLE_RECOVERY_INTERVAL_MS=3e3;const LAUNCH_STATUS_IDLE_RECOVERY_LIMIT=6;const TERMINAL_STOP_POLL_INTERVAL_MS=100;const TERMINAL_STOP_POLL_ATTEMPTS=50;const OUTPUTS_REALTIME_REASONS=new Set(["output-target-started","output-target-ready","output-target-closed","output-target-stopped","output-target-stale-cleared","output-results-ready","output-results-failed"]);function browserCanOpenTarget(target={}){return String(target.kind||"url")==="url"&&Boolean(String(target.href||"").trim())}function launchBrowserTargetName(session={},projectSlug=currentProjectSlugFromLocation()){const projectScope=String(projectSlug||"").trim()||String((session==null?void 0:session.sessionId)||(session==null?void 0:session.id)||"project").trim();return`vibe64-launch-${stableLocalStorageKeyPart(projectScope)}`}function launchTerminalStorageKey(session={},projectSlug=currentProjectSlugFromLocation()){return vibe64ProjectScopedStorageKey(`vibe64:floating-terminal:launch:${launchBrowserTargetName(session,projectSlug)}`,projectSlug)}function launchPreviewToolbarStorageKey(session={},projectSlug=currentProjectSlugFromLocation()){return vibe64ProjectScopedStorageKey(`vibe64:launch-preview-toolbar:${launchBrowserTargetName(session,projectSlug)}`,projectSlug)}function launchPreviewLocationStorageKey(session={},projectSlug=currentProjectSlugFromLocation()){return vibe64ProjectScopedStorageKey(`vibe64:launch-preview-location:${launchBrowserTargetName(session,projectSlug)}`,projectSlug)}function normalizeLaunchPreviewToolbarPosition(value=""){const normalized=String(value||"").trim();return LAUNCH_PREVIEW_TOOLBAR_POSITIONS.includes(normalized)?normalized:"center"}function nextLaunchPreviewToolbarPosition(currentPosition="center",direction=0){const currentIndex=LAUNCH_PREVIEW_TOOLBAR_POSITIONS.indexOf(normalizeLaunchPreviewToolbarPosition(currentPosition));const nextIndex=Math.min(LAUNCH_PREVIEW_TOOLBAR_POSITIONS.length-1,Math.max(0,currentIndex+Math.sign(Number(direction)||0)));return LAUNCH_PREVIEW_TOOLBAR_POSITIONS[nextIndex]||"center"}function openLaunchBrowserTarget(target={},session={},browserWindow=null,projectSlug=currentProjectSlugFromLocation()){if(!browserCanOpenTarget(target)){return null}const activeWindow=browserWindow||(typeof window!=="undefined"?window:null);if(!(activeWindow==null?void 0:activeWindow.open)){return null}const href=launchBrowserTargetHref(target,activeWindow);const openedWindow=activeWindow.open(href,launchBrowserTargetName(session,projectSlug),LAUNCH_BROWSER_WINDOW_FEATURES);if(!openedWindow){return null}try{openedWindow.opener=null}catch{}if(typeof openedWindow.focus==="function"){openedWindow.focus()}return openedWindow}function launchBrowserTargetHref(target={},browserWindow=null){var _a;const studioHref=String(((_a=browserWindow==null?void 0:browserWindow.location)==null?void 0:_a.href)||localPreviewBrowserHref()).trim();return resolveLaunchPreviewDestination([target],{studioHref}).displayHref}function outputTargetWorktreePath(session={}){return vibe64SessionSourcePath(session)}function launchControlsSessionCanRun(session={}){const metadata=(session==null?void 0:session.metadata)&&typeof session.metadata==="object"&&!Array.isArray(session.metadata)?session.metadata:{};return Boolean(String((session==null?void 0:session.sessionId)||"").trim()&&!isArchivedVibe64Session(session)&&!String(metadata.session_closing_reason||"").trim()&&outputTargetWorktreePath(session))}function launchControlsCanLoadTargets({displayed=true,session={},sourceOperationsSuspended=false}={}){return Boolean(displayed&&sourceOperationsSuspended!==true&&launchControlsSessionCanRun(session))}function launchControlScopeKey(projectSlug="",sessionId=""){return`${String(projectSlug||"").trim()}::${String(sessionId||"").trim()}`}function outputTargetsRealtimeShouldRefresh({localLaunchStarting=false,payload={}}={},sessionId=""){var _a;const normalizedSessionId=String(sessionId||"").trim();const changedSessionId=String(payload.sessionId||payload.entityId||"").trim();if(!normalizedSessionId||changedSessionId!==normalizedSessionId){return false}const reason=String(payload.reason||"").trim();if(reason==="output-target-started"&&(localLaunchStarting||vibe64RealtimePayloadFromCurrentTab(payload))){return false}return((_a=payload.clientRefresh)==null?void 0:_a.includeOutputs)===true||!reason||OUTPUTS_REALTIME_REASONS.has(reason)}function shouldScheduleLaunchAutoStart({autoStartKey="",externalBusy=false,key="",loading=false,operationBusy=false,sessionLaunchable=true,sessionId="",target=null,terminalDisplayed=true,terminalVisible=false}={}){return Boolean(sessionId&&sessionLaunchable&&target&&target.available!==false&&key&&!externalBusy&&!loading&&!terminalVisible&&!operationBusy&&terminalDisplayed&&autoStartKey!==key)}function autoStartOutputsLoading({outputTargetsLoading=false,outputTargetsSettled=false}={}){return Boolean(outputTargetsLoading||!outputTargetsSettled)}function launchStatusRetryDelay(attempt=0){const attemptNumber=Math.max(0,Number(attempt)||0);return Math.min(LAUNCH_STATUS_RETRY_MAX_DELAY_MS,LAUNCH_STATUS_RETRY_BASE_DELAY_MS*(attemptNumber+1))}function normalizeHttpStatus(value){const status=Number(value);return Number.isInteger(status)?status:null}function launchStatusShouldRetry(failureCount=0,error=null){if(Math.max(0,Number(failureCount)||0)>=LAUNCH_STATUS_RETRY_LIMIT){return false}if(launchStatusAgentWriteBusy(error)){return true}const status=normalizeHttpStatus((error==null?void 0:error.status)??(error==null?void 0:error.statusCode));return status==null||status===0||status===408||status===425||status===429||status>=500}function launchStatusErrorText({error=null,fallback="",path=""}={}){const fallbackText=String(fallback||"").trim();if(!error){return fallbackText}if(launchStatusAgentWriteBusy(error)){return""}const message=String((error==null?void 0:error.message)||fallbackText||"Request failed.").trim();const status=normalizeHttpStatus((error==null?void 0:error.status)??(error==null?void 0:error.statusCode));const code=String((error==null?void 0:error.code)||"").trim();const requestPath=String(path||(error==null?void 0:error.path)||(error==null?void 0:error.url)||"").trim();const details=[status===0?"network":status==null?"":`HTTP ${status}`,code,requestPath].filter(Boolean).join(", ");return details?`${message} (${details})`:message}function launchStatusAgentWriteBusy(error=null){var _a,_b,_c,_d;return String((error==null?void 0:error.code)||((_a=error==null?void 0:error.response)==null?void 0:_a.code)||((_d=(_c=(_b=error==null?void 0:error.response)==null?void 0:_b.errors)==null?void 0:_c[0])==null?void 0:_d.code)||"").trim()==="vibe64_agent_write_mode_busy"}function browserSessionStorage(){if(typeof window==="undefined"||!window.sessionStorage){return null}return window.sessionStorage}function launchAutoStartAttemptStorageKey(key=""){const normalized=String(key||"").trim();return normalized?`vibe64:launch-auto-start:${stableLocalStorageKeyPart(normalized)}`:""}function readLaunchAutoStartAttemptCooldown(key="",{now=Date.now(),storage=browserSessionStorage()}={}){const storageKey=launchAutoStartAttemptStorageKey(key);if(!storageKey||!storage){return 0}try{const record=JSON.parse(storage.getItem(storageKey)||"null");const startedAt=Number((record==null?void 0:record.startedAt)||0);if(String((record==null?void 0:record.key)||"")!==String(key||"")||!Number.isFinite(startedAt)||startedAt<=0){clearLaunchAutoStartAttempt(key,{storage});return 0}const remainingMs=AUTO_START_ATTEMPT_COOLDOWN_MS-(Number(now)-startedAt);if(remainingMs<=0){clearLaunchAutoStartAttempt(key,{storage});return 0}return remainingMs}catch{clearLaunchAutoStartAttempt(key,{storage});return 0}}function writeLaunchAutoStartAttempt(key="",{now=Date.now(),storage=browserSessionStorage()}={}){const storageKey=launchAutoStartAttemptStorageKey(key);if(!storageKey||!storage){return false}try{storage.setItem(storageKey,JSON.stringify({key:String(key||""),startedAt:Number(now)}));return true}catch{return false}}function clearLaunchAutoStartAttempt(key="",{storage=browserSessionStorage()}={}){const storageKey=launchAutoStartAttemptStorageKey(key);if(!storageKey||!storage){return}try{storage.removeItem(storageKey)}catch{}}function delay(milliseconds=0){return new Promise(resolve=>setTimeout(resolve,milliseconds))}function launchTerminalIsReady(metadata={}){return(metadata==null?void 0:metadata.launchReady)===true||(metadata==null?void 0:metadata.launchReady)==="true"}function launchPreviewRequiresProxy(metadata={}){return Boolean(String((metadata==null?void 0:metadata.previewAuth)||"").trim())}function terminalSessionMissingError(message=""){return/terminal session not found/iu.test(String(message||""))}function localPreviewBrowserHref(){var _a;if(typeof window==="undefined"){return""}return String(((_a=window.location)==null?void 0:_a.href)||"")}function resolveLaunchPreviewDestination(actions=[],{requirePreviewProxy=false,studioHref=localPreviewBrowserHref()}={}){const action=Array.isArray(actions)?actions.find(candidate=>browserCanOpenTarget(candidate))||null:null;const targetHref=String((action==null?void 0:action.href)||"").trim();const previewHref=String((action==null?void 0:action.previewHref)||"").trim();const displayHref=previewHref&&remoteStudioCannotEmbedLoopbackTarget(targetHref,studioHref)?sameSiteLoopbackPreviewUrl(previewHref,studioHref):sameSiteLoopbackPreviewUrl(targetHref,studioHref);const embedCandidate=previewHref||(requirePreviewProxy?"":targetHref);if(!embedCandidate){return{action,displayHref,embedHref:"",unavailableReason:requirePreviewProxy&&action?"Waiting for the hosted preview URL.":""}}if(remoteStudioCannotEmbedLoopbackTarget(embedCandidate,studioHref)){return{action,displayHref,embedHref:"",unavailableReason:"This preview URL is only reachable from the server. Restart the preview to create a hosted preview URL."}}if(browserWouldBlockEmbeddedPreview(embedCandidate,studioHref)){return{action,displayHref,embedHref:"",unavailableReason:"HTTP previews cannot be embedded from HTTPS Studio. Open the preview in a browser tab, or open Studio over HTTP for embedded preview."}}return{action,displayHref,embedHref:sameSiteLoopbackPreviewUrl(embedCandidate,studioHref),unavailableReason:""}}function normalizeLaunchPreview(preview={}){const source=preview&&typeof preview==="object"&&!Array.isArray(preview)?preview:{};const state=["idle","starting","ready","stale","stopped","failed","project_closed"].includes(source.state)?source.state:"idle";const fallbackMessage=state==="idle"?"Run an output target first.":state==="starting"?"Preparing preview.":state==="ready"?"Preview is ready.":state==="stale"?"Server-side app files changed after this preview started.":state==="project_closed"?"Project is closed.":"Preview could not be opened.";const recovery=source.recovery&&typeof source.recovery==="object"&&!Array.isArray(source.recovery)?source.recovery:null;return{canRestart:source.canRestart===true,canShowLog:source.canShowLog===true,canStart:source.canStart===true,href:String(source.href||"").trim(),message:String(source.message||fallbackMessage).trim()||fallbackMessage,reason:String(source.reason||"").trim(),recovery,state,targetHref:String(source.targetHref||"").trim(),terminalId:String(source.terminalId||"").trim()}}function plainObject(value){return value&&typeof value==="object"&&!Array.isArray(value)?value:{}}function launchPreviewFromStatus(status={}){const source=plainObject(status);const previewSource=plainObject(source.preview);const preview=normalizeLaunchPreview(previewSource);if(previewSource.state||preview.href||preview.targetHref){return preview}const previewTarget=plainObject(source.previewTarget);const openTarget=plainObject(source.openTarget);const href=String(previewTarget.href||openTarget.previewHref||"").trim();if(!href||previewTarget.available===false||openTarget.available===false){return preview}const activeTerminal=plainObject(source.activeTerminal);return normalizeLaunchPreview({canRestart:Boolean(activeTerminal.id||plainObject(source.lastOutputTarget).id),canShowLog:Boolean(activeTerminal.id),href,message:"Preview is ready.",state:"ready",targetHref:String(previewTarget.targetHref||openTarget.href||"").trim(),terminalId:String(activeTerminal.id||"").trim()})}function sameSiteLoopbackPreviewUrl(previewHref="",studioHref=""){const previewText=String(previewHref||"").trim();const studioText=String(studioHref||"").trim();if(!previewText||!studioText){return previewText}try{const previewUrl=new URL(previewText);const studioUrl=new URL(studioText);if(previewUrl.protocol!==studioUrl.protocol||!isLoopbackBrowserHost(previewUrl.hostname)||!isLoopbackBrowserHost(studioUrl.hostname)||previewUrl.hostname===studioUrl.hostname){return previewText}previewUrl.hostname=studioUrl.hostname;return previewUrl.toString()}catch{return previewText}}function remoteStudioCannotEmbedLoopbackTarget(previewHref="",studioHref=""){const previewText=String(previewHref||"").trim();const studioText=String(studioHref||"").trim();if(!previewText||!studioText){return false}try{const previewUrl=new URL(previewText);const studioUrl=new URL(studioText);return isLoopbackBrowserHost(previewUrl.hostname)&&!isLoopbackBrowserHost(studioUrl.hostname)}catch{return false}}function browserWouldBlockEmbeddedPreview(previewHref="",studioHref=""){const previewText=String(previewHref||"").trim();const studioText=String(studioHref||"").trim();if(!previewText||!studioText){return false}try{const previewUrl=new URL(previewText);const studioUrl=new URL(studioText);return studioUrl.protocol==="https:"&&previewUrl.protocol==="http:"&&!isLoopbackBrowserHost(previewUrl.hostname)}catch{return false}}function isLoopbackBrowserHost(hostname=""){const normalized=String(hostname||"").trim().toLowerCase();return normalized==="localhost"||normalized==="127.0.0.1"||normalized==="::1"||normalized==="[::1]"}function useVibe64OutputControls({autoStartManagedPreview=()=>false,autoStartTargetId=()=>"",busy=()=>false,embeddedPreview=()=>false,previewDisplayed=()=>true,session=null,sourceOperationsSuspended=()=>false,windowDisplayed=()=>true}={}){const paths=usePaths();const projectSlug=useVibe64ProjectSlug();const operationBusy=ref(false);const launchError=ref("");const refusedAdmissionId=ref("");const launchStarting=ref(false);const launchWaiting=ref(false);const terminalExpanded=ref(false);const autoStartKey=ref("");const autoStartCooldownVersion=ref(0);const launchStatusAttempt=ref(0);const launchStatusIdleRecoveryCount=ref(0);const launchStatusIdleRecoveryExhausted=computed(()=>launchStatusIdleRecoveryCount.value>=LAUNCH_STATUS_IDLE_RECOVERY_LIMIT);const outputTargetsSettledForAutoStart=ref(false);const sourceOperationsResumePending=ref(false);let attachedTerminalId="";let autoStartTimer=0;let autoStartCooldownTimer=0;let scheduledAutoStartKey="";let launchStatusAttemptLoading=false;let launchStatusAttemptScopeKey="";let launchStatusIdleRecoveryTimer=0;let launchStatusIdleRecoveryScopeKey="";const selectedSession=computed(()=>readRefOrGetterValue(session)||null);const sessionId=computed(()=>{var _a;return String(((_a=selectedSession.value)==null?void 0:_a.sessionId)||"")});const sessionRevision=computed(()=>vibe64SessionRevision(selectedSession.value));let outputTargetsRefreshSessionId=sessionId.value;let outputTargetsRefreshRevision=sessionRevision.value;const launchScopeKey=computed(()=>launchControlScopeKey(projectSlug.value,sessionId.value));const requestedAutoStartTargetId=computed(()=>String(readRefOrGetterValue(autoStartTargetId)||"").trim());const autoStartRequestKey=computed(()=>requestedAutoStartTargetId.value||(readRefOrGetterValue(autoStartManagedPreview)===true?"managed-preview":""));const terminalDisplayed=computed(()=>readRefOrGetterValue(windowDisplayed)!==false);const previewPaneDisplayed=computed(()=>readRefOrGetterValue(previewDisplayed)!==false);const launchSourceOperationsSuspended=computed(()=>readRefOrGetterValue(sourceOperationsSuspended)===true);const canLoadOutputs=computed(()=>launchControlsCanLoadTargets({displayed:terminalDisplayed.value,session:selectedSession.value||{},sourceOperationsSuspended:launchSourceOperationsSuspended.value}));const sessionsApiPath=computed(()=>paths.api(VIBE64_SESSIONS_API_SUFFIX,{surface:VIBE64_SURFACE_ID}));const outputTargetsPath=computed(()=>{return sessionId.value?vibe64OutputsPath(sessionsApiPath.value,sessionId.value):""});const terminalWindowStorageKey=computed(()=>launchTerminalStorageKey(selectedSession.value||{},projectSlug.value));const terminal=useVibe64Terminal({driver:createWebSocketTerminalDriver({webSocketUrl(terminalId){return vibe64OutputTerminalWebSocketUrl(sessionId.value,terminalId)}})});const{applyTerminalSession,closeTerminalSocket,connectTerminalSocket,disposeTerminalDisplay,disposeTerminalUi,resetTerminalDisplay,resetTerminalSessionState,sendCtrlC,terminalCommandPreview,terminalError,terminalExited,terminalExitCode,terminalMetadata,terminalOutput,terminalSessionId,terminalStarting,terminalStatus}=terminal;let disposed=false;const outputTargetsResource=useEndpointResource({enabled:canLoadOutputs,fallbackLoadError:"Outputs could not be loaded.",path:outputTargetsPath,queryOptions:{retry:launchStatusShouldRetry,retryDelay:launchStatusRetryDelay},queryKey:computed(()=>vibe64OutputsQueryKey(VIBE64_SURFACE_ID,ROUTE_VISIBILITY_PUBLIC,sessionId.value,projectSlug.value)),refreshOnPull:true,requestRecovery:false,realtime:null});const startTerminalCommand=useCommand({access:"never",apiSuffix:VIBE64_SESSIONS_API_SUFFIX,buildCommandOptions:(_payload,{context})=>({method:"POST",path:vibe64OutputRunPath(sessionsApiPath.value,context.sessionId)}),buildRawPayload:(_model,{context})=>({...vibe64RealtimeOriginPayload(),...context.forceRestart===true?{forceRestart:true}:{},outputTargetId:String(context.outputTargetId||"")}),fallbackRunError:"Output target could not be started.",messages:{error:"Output target could not be started."},onRunError(error){if(readRefOrGetterValue(embeddedPreview)){throw error}},ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:"vibe64.output-target.start",suppressSuccessMessage:true,surfaceId:VIBE64_SURFACE_ID,writeMethod:"POST"});const stopTerminalCommand=useCommand({access:"never",apiSuffix:VIBE64_SESSIONS_API_SUFFIX,buildCommandOptions:(_payload,{context})=>({method:"POST",path:vibe64OutputRunStopPath(sessionsApiPath.value,context.sessionId,context.terminalSessionId)}),fallbackRunError:"Output target could not be stopped.",messages:{error:"Output target could not be stopped."},ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:"vibe64.output-target.stop",suppressSuccessMessage:true,surfaceId:VIBE64_SURFACE_ID,writeMethod:"POST"});const closeTerminalCommand=useCommand({access:"never",apiSuffix:VIBE64_SESSIONS_API_SUFFIX,buildCommandOptions:(_payload,{context})=>({method:"DELETE",path:vibe64OutputRunPath(sessionsApiPath.value,context.sessionId,context.terminalSessionId)}),fallbackRunError:"Output target terminal could not close.",messages:{error:"Output target terminal could not close."},ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:"vibe64.output-target.close",suppressSuccessMessage:true,surfaceId:VIBE64_SURFACE_ID,writeMethod:"DELETE"});const selectPreviewIdentityCommand=useCommand({access:"never",apiSuffix:VIBE64_SESSIONS_API_SUFFIX,buildCommandOptions:(_payload,{context})=>({method:"POST",path:vibe64PreviewIdentityPath(sessionsApiPath.value,context.sessionId)}),buildRawPayload:(_model,{context})=>({...context.identityName?{identityName:context.identityName}:{},mode:context.mode}),fallbackRunError:"Preview identity could not be selected.",messages:{error:"Preview identity could not be selected."},ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:"vibe64.preview-identity.select",suppressSuccessMessage:true,surfaceId:VIBE64_SURFACE_ID,writeMethod:"POST"});const status=computed(()=>outputTargetsResource.data.value||{});const launchStatusLoadError=computed(()=>{var _a,_b;const error=((_b=(_a=outputTargetsResource.query)==null?void 0:_a.error)==null?void 0:_b.value)||null;return launchStatusErrorText({error,fallback:outputTargetsResource.loadError.value,path:outputTargetsPath.value})});const preview=computed(()=>launchPreviewFromStatus(status.value));const previewIdentity=computed(()=>{const value=status.value.previewIdentity;return value&&typeof value==="object"&&!Array.isArray(value)?value:{available:false,defaultMode:"guest",disabledReason:"",identities:[]}});const previewState=computed(()=>preview.value.state);const testApproval=computed(()=>{var _a;return["waiting","resuming"].includes((_a=status.value.testApproval)==null?void 0:_a.state)?status.value.testApproval:null});const resourceAdmissionId=computed(()=>["ready","starting"].includes(previewState.value)?"":refusedAdmissionId.value||String(status.value.resourceAdmissionId||""));const previewMessage=computed(()=>preview.value.message);const previewHref=computed(()=>preview.value.href);const previewTargetHref=computed(()=>preview.value.targetHref);const previewCanRestart=computed(()=>preview.value.canRestart);const previewCanShowLog=computed(()=>preview.value.canShowLog);const previewCanStart=computed(()=>preview.value.canStart);const previewRecovery=computed(()=>preview.value.recovery);const previewTarget=computed(()=>status.value.previewTarget&&typeof status.value.previewTarget==="object"&&!Array.isArray(status.value.previewTarget)?status.value.previewTarget:null);const outputTargets=computed(()=>{return Array.isArray(status.value.outputTargets)?status.value.outputTargets:[]});const outputRuns=computed(()=>{return Array.isArray(status.value.outputRuns)?status.value.outputRuns:[]});const outputResults=computed(()=>outputRuns.value.flatMap(run2=>(Array.isArray(run2==null?void 0:run2.results)?run2.results:[]).map(result=>({...result,href:vibe64OutputResultPath(sessionsApiPath.value,sessionId.value,result.id),outputTargetId:String(run2.outputTargetId||""),runId:String(run2.id||"")}))));const outputExecution=computed(()=>{const value=status.value.output;return value&&typeof value==="object"&&!Array.isArray(value)?value:{error:null,mode:"",presentationKind:"",state:"idle",targetId:""}});const autoStartTarget=computed(()=>{if(requestedAutoStartTargetId.value){return outputTargets.value.find(target=>{var _a;return target.id===requestedAutoStartTargetId.value&&((_a=target.presentation)==null?void 0:_a.kind)==="web"&&target.available!==false})||null}return autoStartRequestKey.value?managedPreviewTarget(outputTargets.value):null});const activeTerminal=computed(()=>{const terminalStatusValue=status.value.activeTerminal;return terminalStatusValue&&typeof terminalStatusValue==="object"&&!Array.isArray(terminalStatusValue)?terminalStatusValue:null});const activeOutputTargetId=computed(()=>{var _a,_b,_c;return String(terminalMetadata.value.outputTargetId||((_b=(_a=activeTerminal.value)==null?void 0:_a.metadata)==null?void 0:_b.outputTargetId)||((_c=status.value.lastOutputTarget)==null?void 0:_c.id)||"")});const activeOutputTarget=computed(()=>{return outputTargets.value.find(target=>target.id===activeOutputTargetId.value)||null});const launchActions=computed(()=>{var _a,_b,_c,_d,_e,_f;const actions=terminalMetadata.value.actions||((_b=(_a=activeTerminal.value)==null?void 0:_a.metadata)==null?void 0:_b.actions)||[];const targetHref=previewTargetHref.value||String(((_c=previewTarget.value)==null?void 0:_c.targetHref)||"").trim();const iframeHref=previewHref.value||String(((_d=previewTarget.value)==null?void 0:_d.href)||"").trim();const browserActions=Array.isArray(actions)?actions.filter(action=>browserCanOpenTarget(action)):[];if(browserActions.length<1&&iframeHref&&targetHref){return[{href:targetHref,kind:((_e=previewTarget.value)==null?void 0:_e.kind)||"url",label:((_f=previewTarget.value)==null?void 0:_f.label)||"Preview",previewHref:iframeHref}]}if(!iframeHref||!targetHref){return browserActions}return browserActions.map(action=>{if(String(action.href||"")!==targetHref){return action}return{...action,previewHref:iframeHref}})});const terminalLaunchReady=computed(()=>{var _a;return launchTerminalIsReady({...((_a=activeTerminal.value)==null?void 0:_a.metadata)||{},...terminalMetadata.value||{}})});const terminalPreviewRequiresProxy=computed(()=>{var _a;return launchPreviewRequiresProxy({...((_a=activeTerminal.value)==null?void 0:_a.metadata)||{},...terminalMetadata.value||{}})});const previewTargetDisabledReason=computed(()=>!["ready","stale"].includes(previewState.value)?previewMessage.value:"");const previewTargetRecovery=computed(()=>previewRecovery.value);const terminalIsRunning=computed(()=>{var _a;const statusValue=terminalStatus.value||((_a=activeTerminal.value)==null?void 0:_a.status)||"";return statusValue==="running"||statusValue==="closing"||terminalStarting.value});const terminalPreviewProxyPending=computed(()=>Boolean(terminalPreviewRequiresProxy.value&&terminalLaunchReady.value&&terminalIsRunning.value&&!previewHref.value));const terminalIndicatorState=computed(()=>{var _a,_b;if(terminalStatus.value==="exited"||((_a=activeTerminal.value)==null?void 0:_a.status)==="exited"){const exitCode=terminalExitCode.value??((_b=activeTerminal.value)==null?void 0:_b.exitCode);return exitCode&&exitCode!==0?"failed":"stopped"}if(terminalIsRunning.value){return terminalLaunchReady.value?"running":"starting"}return"stopped"});const terminalIndicatorLabel=computed(()=>{var _a,_b,_c;const presentationKind=((_b=(_a=activeOutputTarget.value)==null?void 0:_a.presentation)==null?void 0:_b.kind)||outputExecution.value.presentationKind;const finite=((_c=activeOutputTarget.value)==null?void 0:_c.mode)==="finite"||outputExecution.value.mode==="finite";if(terminalIndicatorState.value==="running"){return presentationKind==="web"?"Server is running":"Program is running"}if(terminalIndicatorState.value==="starting"){return finite?"Build is running":"Preparing output"}if(terminalIndicatorState.value==="failed"){return finite?"Build failed":"Program stopped with an error"}if(finite&&outputExecution.value.state==="succeeded"){return"Build completed"}return presentationKind==="web"?"Server is stopped":"Program is stopped"});const launchButtonsDisabled=computed(()=>Boolean(readRefOrGetterValue(busy)||operationBusy.value||terminalIsRunning.value));const outputTargetsLoadingForAutoStart=computed(()=>autoStartOutputsLoading({outputTargetsLoading:outputTargetsResource.isLoading.value,outputTargetsSettled:outputTargetsSettledForAutoStart.value}));const terminalCanStop=computed(()=>{var _a;return Boolean(terminalSessionId.value&&(terminalStatus.value||((_a=activeTerminal.value)==null?void 0:_a.status))==="running")});const terminalCanClose=computed(()=>{var _a;return Boolean(terminalSessionId.value&&!terminalIsRunning.value&&(terminalExited.value||((_a=activeTerminal.value)==null?void 0:_a.status)==="exited"))});const terminalCanRetry=computed(()=>Boolean(!terminalIsRunning.value&&activeOutputTargetId.value));const terminalCanRestart=computed(()=>Boolean(terminalCanStop.value&&activeOutputTargetId.value));const terminalCanCopyLog=computed(()=>Boolean(terminalOutput.value));const terminalVisible=computed(()=>Boolean(terminalSessionId.value||activeTerminal.value));const terminalDockVisible=computed(()=>Boolean(terminalDisplayed.value&&terminalVisible.value&&!terminalExpanded.value));const terminalWindowVisible=computed(()=>Boolean(terminalDisplayed.value&&terminalVisible.value&&terminalExpanded.value));const terminalTitle=computed(()=>{var _a;return((_a=activeOutputTarget.value)==null?void 0:_a.label)||"Run target"});const terminalSubtitle=computed(()=>{var _a,_b;if(terminalIsRunning.value){return""}if(terminalStatus.value==="exited"||((_a=activeTerminal.value)==null?void 0:_a.status)==="exited"){const exitCode=terminalExitCode.value??((_b=activeTerminal.value)==null?void 0:_b.exitCode);return exitCode===0?"Exited":`Exited with code ${exitCode}`}return activeOutputTargetId.value?"Ready":"No output target running."});const visible=computed(()=>Boolean((canLoadOutputs.value||terminalVisible.value)&&(outputTargets.value.length>0||outputTargetsResource.loadError.value||terminalVisible.value)));const launchStatusIdleRecoveryNeeded=computed(()=>Boolean(previewPaneDisplayed.value&&canLoadOutputs.value&&autoStartRequestKey.value&&!outputTargetsResource.isLoading.value&&!launchStatusLoadError.value&&!operationBusy.value&&!terminalVisible.value&&!autoStartTarget.value&&outputTargets.value.length<1&&previewState.value==="idle"));async function run(outputTarget={},{applyDefaultDisplay=true,autoStartAttemptKey="",forceRestart=false,ignoreExternalBusy=false}={}){var _a,_b;const currentSession=selectedSession.value||{};const externalBusy=readRefOrGetterValue(busy);const currentSessionId=sessionId.value;const startedScopeKey=launchScopeKey.value;if(!currentSessionId||!launchControlsCanLoadTargets({displayed:terminalDisplayed.value,session:currentSession,sourceOperationsSuspended:launchSourceOperationsSuspended.value})||!terminalDisplayed.value||operationBusy.value||!forceRestart&&terminalIsRunning.value||!forceRestart&&!ignoreExternalBusy&&externalBusy||outputTarget.available===false||!outputTarget.id){return false}if(applyDefaultDisplay){terminalExpanded.value=false}launchStarting.value=true;launchWaiting.value=false;launchError.value="";operationBusy.value=true;refusedAdmissionId.value="";const normalizedAutoStartAttemptKey=String(autoStartAttemptKey||"").trim();if(normalizedAutoStartAttemptKey){writeLaunchAutoStartAttempt(normalizedAutoStartAttemptKey)}try{const terminalSession=await startTerminalCommand.run({forceRestart,outputTargetId:outputTarget.id,sessionId:currentSessionId});if(disposed||startedScopeKey!==launchScopeKey.value||!launchControlsCanLoadTargets({displayed:terminalDisplayed.value,session:selectedSession.value||{},sourceOperationsSuspended:launchSourceOperationsSuspended.value})){return false}applyLaunchTerminalSession(terminalSession);void connectLaunchTerminal();void refresh({scopeKey:startedScopeKey});return true}catch(error){if(disposed||startedScopeKey!==launchScopeKey.value){return false}if(normalizedAutoStartAttemptKey){if(launchStatusAgentWriteBusy(error)){launchWaiting.value=previewState.value!=="ready";void refresh({scopeKey:startedScopeKey}).catch(()=>null);return false}autoStartKey.value=normalizedAutoStartAttemptKey}launchError.value=String((error==null?void 0:error.message)||startTerminalCommand.message||"Output target could not be started.").trim();refusedAdmissionId.value=String(((_b=(_a=error==null?void 0:error.details)==null?void 0:_a.admission)==null?void 0:_b.id)||"");return false}finally{launchStarting.value=false;operationBusy.value=false}}function applyLaunchTerminalSession(terminalSession={}){if(!terminalSession||terminalSession.ok===false||!terminalSession.id){return false}attachedTerminalId=terminalSession.id;applyTerminalSession(terminalSession,{fallbackStatus:"running"});return true}async function acceptResourceRetry(result={}){if(result.ok===false)return;refusedAdmissionId.value="";launchError.value="";if(applyLaunchTerminalSession(result))void connectLaunchTerminal();await refresh()}async function connectLaunchTerminal(){if(!terminalSessionId.value||!terminalDisplayed.value){return false}return connectTerminalSocket()}async function expandTerminal(){terminalExpanded.value=true;await connectLaunchTerminal()}function minimizeTerminal(){terminalExpanded.value=false;void connectLaunchTerminal()}async function refresh({scopeKey=launchScopeKey.value}={}){var _a;if(!canLoadOutputs.value){return null}const refreshScopeKey=String(scopeKey||"").trim();if(!refreshScopeKey){return null}return typeof((_a=outputTargetsResource.query)==null?void 0:_a.refetch)==="function"?outputTargetsResource.query.refetch({cancelRefetch:true}):outputTargetsResource.reload()}async function startNewlyConfiguredWorkspaceSetup(){var _a,_b;if(String(((_b=(_a=selectedSession.value)==null?void 0:_a.workspaceSetup)==null?void 0:_b.status)||"").trim()!=="unconfigured"||!sessionId.value){return false}try{const result=await getHttpWebClient().request(vibe64SessionPath(sessionsApiPath.value,sessionId.value,"/workspace-setup/retry"),{body:vibe64RealtimeOriginPayload(),method:"POST"});return(result==null?void 0:result.ok)!==false}catch(error){vibe64SessionDebugLog("client.launchPreview.workspaceSetup.start.error",{error:vibe64SessionDebugError(error),sessionId:sessionId.value});return false}}async function publishPreviewState(previewState2={}){const currentSessionId=sessionId.value;const currentProjectSlug=projectSlug.value;if(!currentSessionId||!currentProjectSlug||!String((previewState2==null?void 0:previewState2.route)||"").trim()){return false}try{const result=await getHttpWebClient().request(vibe64SessionPreviewStatePath(sessionsApiPath.value,currentSessionId),{body:vibe64RealtimeOriginPayload({projectSlug:currentProjectSlug,route:String((previewState2==null?void 0:previewState2.route)||"").trim(),title:String((previewState2==null?void 0:previewState2.title)||"").trim()}),method:"POST"});return(result==null?void 0:result.ok)!==false}catch(error){vibe64SessionDebugLog("client.launchPreview.state.publish.error",{error:vibe64SessionDebugError(error),route:String((previewState2==null?void 0:previewState2.route)||"").trim(),sessionId:currentSessionId});return false}}function requestPreviewIdentityGrant({identityName="",mode="identity"}={}){if(!sessionId.value||previewIdentity.value.available!==true){throw new Error(previewIdentity.value.disabledReason||"This preview does not support application identity switching.")}const normalizedIdentityName=String(identityName||"").trim();return selectPreviewIdentityCommand.run({...normalizedIdentityName?{identityName:normalizedIdentityName}:{},mode:String(mode||"identity").trim(),sessionId:sessionId.value})}watch(launchSourceOperationsSuspended,(suspended,wasSuspended)=>{if(suspended){sourceOperationsResumePending.value=true;return}if(wasSuspended!==true){return}const resumeScopeKey=launchScopeKey.value;void Promise.resolve(refresh({scopeKey:resumeScopeKey})).finally(()=>{if(!launchSourceOperationsSuspended.value&&launchScopeKey.value===resumeScopeKey){sourceOperationsResumePending.value=false}})},{flush:"sync",immediate:true});useRealtimeEvent({enabled:canLoadOutputs,event:VIBE64_SESSION_CHANGED_EVENT,matches:context=>outputTargetsRealtimeShouldRefresh({localLaunchStarting:launchStarting.value,payload:(context==null?void 0:context.payload)||{}},sessionId.value),onEvent:()=>refresh({scopeKey:launchScopeKey.value})});watch([sessionId,sessionRevision,canLoadOutputs,autoStartRequestKey,()=>outputTargetsResource.isLoading.value,launchStatusLoadError,terminalVisible,autoStartTarget,previewState],()=>{const currentSessionId=sessionId.value;const currentRevision=sessionRevision.value;if(currentSessionId!==outputTargetsRefreshSessionId||outputTargetsRefreshRevision===null){outputTargetsRefreshSessionId=currentSessionId;outputTargetsRefreshRevision=currentRevision;return}if(currentRevision===null||currentRevision<=outputTargetsRefreshRevision){return}if(terminalVisible.value||autoStartTarget.value||previewState.value!=="idle"){outputTargetsRefreshRevision=currentRevision;return}if(!canLoadOutputs.value||!autoStartRequestKey.value||outputTargetsResource.isLoading.value||launchStatusLoadError.value){return}outputTargetsRefreshRevision=currentRevision;void refresh({scopeKey:launchScopeKey.value})},{flush:"post"});function clearAutoStartTimer(){if(autoStartTimer&&typeof window!=="undefined"){window.clearTimeout(autoStartTimer)}autoStartTimer=0;scheduledAutoStartKey=""}function clearAutoStartCooldownTimer(){if(autoStartCooldownTimer&&typeof window!=="undefined"){window.clearTimeout(autoStartCooldownTimer)}autoStartCooldownTimer=0}function clearLaunchStatusIdleRecoveryTimer(){if(launchStatusIdleRecoveryTimer&&typeof window!=="undefined"){window.clearTimeout(launchStatusIdleRecoveryTimer)}launchStatusIdleRecoveryTimer=0}function resetLaunchStatusIdleRecovery(){clearLaunchStatusIdleRecoveryTimer();launchStatusIdleRecoveryCount.value=0;launchStatusIdleRecoveryScopeKey=launchScopeKey.value}function resetOutputsAutoStartSettlement(){outputTargetsSettledForAutoStart.value=false}function scheduleLaunchStatusIdleRecovery(){if(!launchStatusIdleRecoveryNeeded.value||typeof window==="undefined"){return}const scopeKey=launchScopeKey.value;if(!scopeKey){return}if(launchStatusIdleRecoveryScopeKey!==scopeKey){launchStatusIdleRecoveryScopeKey=scopeKey;launchStatusIdleRecoveryCount.value=0}if(launchStatusIdleRecoveryTimer){return}if(launchStatusIdleRecoveryExhausted.value){return}const delayMs=launchStatusIdleRecoveryCount.value===0?LAUNCH_STATUS_IDLE_RECOVERY_INITIAL_DELAY_MS:LAUNCH_STATUS_IDLE_RECOVERY_INTERVAL_MS;launchStatusIdleRecoveryTimer=window.setTimeout(()=>{launchStatusIdleRecoveryTimer=0;if(!launchStatusIdleRecoveryNeeded.value||scopeKey!==launchScopeKey.value){return}launchStatusIdleRecoveryCount.value+=1;void refresh({scopeKey}).catch(()=>null)},delayMs)}function scheduleAutoStartCooldownCheck(remainingMs=0){clearAutoStartCooldownTimer();if(typeof window==="undefined"){return}autoStartCooldownTimer=window.setTimeout(()=>{autoStartCooldownTimer=0;autoStartCooldownVersion.value+=1},Math.max(0,Number(remainingMs)||0)+50)}function clearStaleLaunchTerminal(){attachedTerminalId="";closeTerminalSocket();resetTerminalSessionState();resetTerminalDisplay()}async function stopTerminal(){if(!sessionId.value||!terminalCanStop.value&&!terminalSessionId.value){return false}operationBusy.value=true;try{const stopped=await stopTerminalCommand.run({sessionId:sessionId.value,terminalSessionId:terminalSessionId.value});applyLaunchTerminalSession(stopped);await refresh();await waitForStoppedTerminal();return true}catch{return false}finally{operationBusy.value=false}}async function waitForStoppedTerminal(){for(let attempt=0;attempt<TERMINAL_STOP_POLL_ATTEMPTS;attempt+=1){if(!terminalIsRunning.value){return true}await delay(TERMINAL_STOP_POLL_INTERVAL_MS);await refresh()}return false}async function restartTerminal(){if(!terminalCanRestart.value){return false}const target=activeOutputTarget.value||outputTargets.value.find(item=>item.id===activeOutputTargetId.value);if(!target){return false}return run(target,{applyDefaultDisplay:false,forceRestart:true})}async function retryTerminal(){if(!terminalCanRetry.value){return false}const target=activeOutputTarget.value||outputTargets.value.find(item=>item.id===activeOutputTargetId.value);return target?run(target,{applyDefaultDisplay:false}):false}async function closeTerminal(){if(!sessionId.value||!terminalCanClose.value){return false}operationBusy.value=true;try{await closeTerminalCommand.run({sessionId:sessionId.value,terminalSessionId:terminalSessionId.value});closeTerminalSocket();resetTerminalSessionState();resetTerminalDisplay();attachedTerminalId="";terminalExpanded.value=false;await refresh();return true}catch{return false}finally{operationBusy.value=false}}async function copyLog(){var _a;if(!terminalOutput.value||typeof navigator==="undefined"||!((_a=navigator.clipboard)==null?void 0:_a.writeText)){return false}await navigator.clipboard.writeText(terminalOutput.value);return true}function openAction(action={}){return openLaunchBrowserTarget(action,selectedSession.value,null,projectSlug.value)}watch(activeTerminal,nextTerminal=>{if(!(nextTerminal==null?void 0:nextTerminal.id)){clearStaleLaunchTerminal();return}if(nextTerminal.id!==attachedTerminalId){closeTerminalSocket();resetTerminalDisplay();attachedTerminalId=nextTerminal.id}applyTerminalSession(nextTerminal,{fallbackStatus:nextTerminal.status||"running"});void connectLaunchTerminal()},{immediate:true});watch([previewState,terminalIndicatorState,launchError],([state,indicator])=>{if(state==="ready"&&indicator==="running"){launchError.value="";refusedAdmissionId.value="";launchWaiting.value=false}});watch(terminalError,message=>{if(!terminalSessionMissingError(message)){return}clearStaleLaunchTerminal();void refresh()});watch(terminalDisplayed,displayed=>{if(displayed){void connectLaunchTerminal();return}clearAutoStartTimer();resetOutputsAutoStartSettlement();resetLaunchStatusIdleRecovery();closeTerminalSocket();disposeTerminalDisplay()});watch(launchScopeKey,()=>{attachedTerminalId="";autoStartKey.value="";launchError.value="";refusedAdmissionId.value="";launchWaiting.value=false;launchStatusAttempt.value=0;launchStatusAttemptLoading=false;launchStatusAttemptScopeKey=launchScopeKey.value;resetOutputsAutoStartSettlement();resetLaunchStatusIdleRecovery();clearAutoStartTimer();closeTerminalSocket();disposeTerminalDisplay();resetTerminalSessionState();resetTerminalDisplay();terminalExpanded.value=false});watch(canLoadOutputs,canLoad=>{if(canLoad){return}clearAutoStartTimer();resetOutputsAutoStartSettlement();resetLaunchStatusIdleRecovery()},{flush:"sync",immediate:true});watch(launchStatusIdleRecoveryNeeded,needed=>{if(needed){scheduleLaunchStatusIdleRecovery();return}clearLaunchStatusIdleRecoveryTimer();if(!outputTargetsResource.isLoading.value){launchStatusIdleRecoveryCount.value=0;launchStatusIdleRecoveryScopeKey=launchScopeKey.value}},{flush:"post",immediate:true});watch(()=>[launchScopeKey.value,canLoadOutputs.value?"loadable":"blocked",outputTargetsResource.isLoading.value?"loading":"ready"].join("|"),()=>{const scopeKey=launchScopeKey.value;if(!scopeKey||!canLoadOutputs.value){launchStatusAttempt.value=0;launchStatusAttemptScopeKey=scopeKey;launchStatusAttemptLoading=false;return}if(launchStatusAttemptScopeKey!==scopeKey){launchStatusAttempt.value=0;launchStatusAttemptScopeKey=scopeKey;launchStatusAttemptLoading=false}if(outputTargetsResource.isLoading.value&&!launchStatusAttemptLoading){launchStatusAttempt.value+=1;launchStatusAttemptLoading=true;return}if(!outputTargetsResource.isLoading.value){launchStatusAttemptLoading=false}},{flush:"sync",immediate:true});watch(()=>[projectSlug.value,sessionId.value,autoStartRequestKey.value,canLoadOutputs.value?"loadable":"blocked",outputTargetsResource.isLoading.value?"loading":"ready"].join("|"),()=>{const scopeKey=launchScopeKey.value;if(!scopeKey||!autoStartRequestKey.value||!canLoadOutputs.value){resetOutputsAutoStartSettlement();return}if(outputTargetsResource.isLoading.value){outputTargetsSettledForAutoStart.value=false;return}outputTargetsSettledForAutoStart.value=true},{flush:"post",immediate:true});watch(()=>{var _a;return[projectSlug.value,sessionId.value,autoStartRequestKey.value,outputTargetsLoadingForAutoStart.value?"loading":"ready",terminalVisible.value?"terminal-visible":"terminal-hidden",terminalDisplayed.value?"displayed":"hidden",canLoadOutputs.value?"loadable":"blocked",readRefOrGetterValue(busy)?"external-busy":"external-idle",operationBusy.value?"busy":"idle",resourceAdmissionId.value,((_a=autoStartTarget.value)==null?void 0:_a.id)||"",autoStartCooldownVersion.value].join("|")},()=>{const target=autoStartTarget.value;const key=`${launchScopeKey.value}:${(target==null?void 0:target.id)||""}`;if(resourceAdmissionId.value){clearAutoStartTimer();return}const ready=shouldScheduleLaunchAutoStart({autoStartKey:autoStartKey.value,externalBusy:readRefOrGetterValue(busy),key,loading:outputTargetsLoadingForAutoStart.value,operationBusy:operationBusy.value,sessionLaunchable:canLoadOutputs.value,sessionId:sessionId.value,target,terminalDisplayed:terminalDisplayed.value,terminalVisible:terminalVisible.value});if(scheduledAutoStartKey===key&&ready){return}clearAutoStartTimer();if(!ready){return}const cooldownMs=readLaunchAutoStartAttemptCooldown(key);if(cooldownMs>0){scheduleAutoStartCooldownCheck(cooldownMs);return}const start=()=>{autoStartTimer=0;scheduledAutoStartKey="";const currentTarget=autoStartTarget.value;const currentKey=`${launchScopeKey.value}:${(currentTarget==null?void 0:currentTarget.id)||""}`;if(!shouldScheduleLaunchAutoStart({autoStartKey:autoStartKey.value,externalBusy:readRefOrGetterValue(busy),key:currentKey,loading:outputTargetsLoadingForAutoStart.value,operationBusy:operationBusy.value,sessionLaunchable:canLoadOutputs.value,sessionId:sessionId.value,target:currentTarget,terminalDisplayed:terminalDisplayed.value,terminalVisible:terminalVisible.value})){return}const currentCooldownMs=readLaunchAutoStartAttemptCooldown(currentKey);if(currentCooldownMs>0){scheduleAutoStartCooldownCheck(currentCooldownMs);return}void Promise.resolve(run(currentTarget,{applyDefaultDisplay:false,autoStartAttemptKey:currentKey})).then(started=>{if(started){autoStartKey.value=currentKey;clearLaunchAutoStartAttempt(currentKey)}}).catch(()=>null)};scheduledAutoStartKey=key;if(typeof window==="undefined"||AUTO_START_STABILITY_DELAY_MS<=0){start();return}autoStartTimer=window.setTimeout(start,AUTO_START_STABILITY_DELAY_MS)},{flush:"post",immediate:true});onBeforeUnmount(()=>{disposed=true;clearAutoStartTimer();clearAutoStartCooldownTimer();clearLaunchStatusIdleRecoveryTimer();disposeTerminalUi()});return{activeOutputTarget,activeOutputTargetId,activeTerminal,closeTerminal,copyLog,expandTerminal,launchActions,launchButtonsDisabled,launchError,resourceAdmissionId,acceptResourceRetry,testApproval,launchStatusAttempt,launchStatusIdleRecoveryExhausted,launchStarting,launchWaiting,outputTargets,outputExecution,outputResults,outputRuns,loading:outputTargetsResource.isLoading,loadError:launchStatusLoadError,minimizeTerminal,openAction,operationBusy,previewCanRestart,previewCanShowLog,previewCanStart,previewHref,previewIdentity,previewMessage,previewState,previewTargetDisabledReason,previewTargetHref,previewTargetRecovery,terminalPreviewRequiresProxy,terminalPreviewProxyPending,publishPreviewState,requestPreviewIdentityGrant,refresh,restartTerminal,retryTerminal,run,sendCtrlC,stopTerminal,startNewlyConfiguredWorkspaceSetup,terminal,terminalCanClose,terminalCanCopyLog,terminalCanRestart,terminalCanRetry,terminalCanStop,terminalCommandPreview,terminalDisplayed,terminalDockVisible,terminalError,terminalExpanded,terminalExited,terminalExitCode,terminalIndicatorLabel,terminalIndicatorState,terminalIsRunning,terminalLaunchReady,terminalMetadata,terminalOutput,terminalSessionId,terminalStarting,terminalStatus,terminalSubtitle,terminalTitle,terminalVisible,terminalWindowStorageKey,terminalWindowVisible,visible}}const PREVIEW_BRIDGE_VERSION=5;const PREVIEW_BRIDGE_READY_MESSAGE_TYPE="vibe64:preview-bridge-ready";const PREVIEW_DIAGNOSTICS_REQUEST_MESSAGE_TYPE="vibe64:preview-diagnostics-request";const PREVIEW_DIAGNOSTICS_RESPONSE_MESSAGE_TYPE="vibe64:preview-diagnostics-response";const PREVIEW_IDENTITY_REQUEST_MESSAGE_TYPE="vibe64:preview-identity-request";const PREVIEW_IDENTITY_RESPONSE_MESSAGE_TYPE="vibe64:preview-identity-response";const PREVIEW_LOCATION_MESSAGE_TYPE="vibe64:preview-location";const PREVIEW_QUERY_MESSAGE_TYPE="vibe64:preview-query";const PREVIEW_RESOURCE_FAILURE_MESSAGE_TYPE="vibe64:preview-resource-failure";const PREVIEW_PROXY_TOKEN_QUERY_PARAM="vibe64_preview_token";const ROUTE_PARAM_PATTERN=/:([A-Za-z][A-Za-z0-9_]*)/gu;function previewRoutesForTarget(launchTarget={}){return Array.isArray(launchTarget==null?void 0:launchTarget.previewRoutes)?launchTarget.previewRoutes.filter(route=>(route==null?void 0:route.id)&&(route==null?void 0:route.pathTemplate)):[]}function previewRouteParams(route={}){const declared=new Map((Array.isArray(route.params)?route.params:[]).filter(param=>param==null?void 0:param.name).map(param=>[String(param.name),param]));return[...String(route.pathTemplate||"").matchAll(ROUTE_PARAM_PATTERN)].map(match=>String(match[1]||"").trim()).filter(Boolean).map(name=>declared.get(name)||{label:routeParamLabel(name),name,placeholder:name,required:true})}function previewRouteHasParams(route={}){return previewRouteParams(route).length>0}function previewRouteInitialFormValues(route={}){return Object.fromEntries(previewRouteParams(route).map(param=>[param.name,String(param.defaultValue||"").trim()]))}function previewRoutePath(route={},values={}){const pathTemplate=String(route.pathTemplate||"");const params=previewRouteParams(route);let missingParam="";const path=pathTemplate.replace(ROUTE_PARAM_PATTERN,(match,name)=>{const param=params.find(candidate=>candidate.name===name);const value=String((values==null?void 0:values[name])??(param==null?void 0:param.defaultValue)??"").trim();if(!value&&(param==null?void 0:param.required)!==false){missingParam||(missingParam=name);return match}return encodeURIComponent(value)});return{missingParam,ok:!missingParam&&path.startsWith("/"),path}}function routeParamLabel(name=""){return String(name||"").replace(/([a-z0-9])([A-Z])/gu,"$1 $2").replace(/[-_]+/gu," ").trim().replace(/\b\w/gu,letter=>letter.toUpperCase())}const PREVIEW_IDENTITY_TYPE_EMAIL="email";const PREVIEW_IDENTITY_TYPE_LOGIN="login";const PREVIEW_IDENTITY_TYPE_USER_ID="user-id";const PREVIEW_IDENTITY_TYPES=Object.freeze([PREVIEW_IDENTITY_TYPE_EMAIL,PREVIEW_IDENTITY_TYPE_LOGIN,PREVIEW_IDENTITY_TYPE_USER_ID]);const PREVIEW_DISPLAY_QUERY_PARAMS=Object.freeze([PREVIEW_PROXY_TOKEN_QUERY_PARAM]);const PREVIEW_DIAGNOSTICS_TIMEOUT_MS=3e3;const PREVIEW_IDENTITY_TIMEOUT_MS=1e4;const PREVIEW_RESOURCE_RETRY_DELAY_MS=250;const PREVIEW_RESOURCE_RETRY_LIMIT=1;function previewUrlWithoutDisplayParams(value=""){const text=String(value||"").trim();if(!text){return""}try{const url=new URL(text);for(const param of PREVIEW_DISPLAY_QUERY_PARAMS){url.searchParams.delete(param)}return url.toString()}catch{return stripPreviewDisplayQueryParams(text)}}function stripPreviewDisplayQueryParams(value=""){const text=String(value||"");const hashIndex=text.indexOf("#");const beforeHash=hashIndex>=0?text.slice(0,hashIndex):text;const hash=hashIndex>=0?text.slice(hashIndex):"";const queryIndex=beforeHash.indexOf("?");if(queryIndex<0){return text}const base=beforeHash.slice(0,queryIndex);const parts=beforeHash.slice(queryIndex+1).split("&").filter(part=>!PREVIEW_DISPLAY_QUERY_PARAMS.includes(queryParamName(part)));return`${base}${parts.length>0?`?${parts.join("&")}`:""}${hash}`}function queryParamName(part=""){const separatorIndex=String(part||"").indexOf("=");const rawName=separatorIndex<0?String(part||""):String(part||"").slice(0,separatorIndex);try{return decodeURIComponent(rawName.replace(/\+/gu," "))}catch{return rawName}}function normalizePreviewRoute(value=""){const text=String(value||"").trim();if(!text){return""}if(text.startsWith("/")){return text}if(text.startsWith("?")||text.startsWith("#")){return`/${text}`}return""}function previewRouteFromUrl(value=""){const text=previewUrlWithoutDisplayParams(value);if(!text){return""}const route=normalizePreviewRoute(text);if(route){return route}try{const url=new URL(text);return`${url.pathname||"/"}${url.search}${url.hash}`||"/"}catch{return""}}function previewUrlForRoute(route="",baseUrl=""){const normalizedRoute=normalizePreviewRoute(route);const baseText=previewUrlWithoutDisplayParams(baseUrl);if(!normalizedRoute||!baseText){return""}try{return new URL(normalizedRoute,baseText).toString()}catch{return""}}function previewAddressDisplayText(value="",{displayBaseUrl="",previewBaseUrl=""}={}){const displayUrl=previewUrlWithoutDisplayParams(value);if(!displayUrl){return""}try{const url=new URL(displayUrl);const sameAppOrigins=[displayBaseUrl,previewBaseUrl].map(baseUrl=>{try{return previewUrlWithoutDisplayParams(baseUrl)?new URL(previewUrlWithoutDisplayParams(baseUrl)).origin:""}catch{return""}}).filter(Boolean);if(sameAppOrigins.includes(url.origin)){return`${url.pathname||"/"}${url.search}${url.hash}`||"/"}}catch{return displayUrl}return displayUrl}function launchPreviewFrameUrl({baseUrl="",displayBaseUrl="",visitedUrl=""}={}){const baseText=String(baseUrl||"").trim();if(!baseText){return""}const routeSource=String(visitedUrl||displayBaseUrl||baseText).trim();try{const base=new URL(baseText);const route=new URL(routeSource,String(displayBaseUrl||baseText));const token=base.searchParams.get(PREVIEW_PROXY_TOKEN_QUERY_PARAM)||"";base.pathname=route.pathname;base.search=route.search;base.hash=route.hash;if(token){base.searchParams.set(PREVIEW_PROXY_TOKEN_QUERY_PARAM,token)}return base.toString()}catch{return baseText}}function previewFrameLifecycleIdentity({outputTargetId="",sessionId="",src="",terminalSessionId=""}={}){return previewLifecycleIdentity([String(sessionId||"").trim(),String(outputTargetId||"").trim(),String(terminalSessionId||"").trim()],src)}function previewIdentityLifecycleIdentity({outputTargetId="",previewBaseUrl="",projectSlug="",sessionId="",terminalSessionId=""}={}){return previewLifecycleIdentity([String(projectSlug||"").trim(),String(sessionId||"").trim(),String(outputTargetId||"").trim(),String(terminalSessionId||"").trim()],previewBaseUrl)}function previewLifecycleIdentity(parts=[],url=""){const canonicalUrl=previewUrlWithoutDisplayParams(url);return canonicalUrl?[...parts,canonicalUrl].join("\0"):""}function previewIdentityLabelText({busy=false,identity=null}={}){var _a;if(busy){return"Switching identity"}if(!identity){return"Identity not confirmed"}if(identity.mode==="guest"){return"Guest"}const selectorValue=String(((_a=identity.selector)==null?void 0:_a.value)||identity.email||identity.login||identity.userId||"").trim();const name=String(identity.name||identity.displayName||"").trim();return name&&name!==selectorValue?`${name} — ${selectorValue}`:name||selectorValue||"Selected app identity"}function previewIdentityTitleText({busy=false,error="",identity=null}={}){if(busy){return"Switching preview identity…"}const message=String(error||"").trim();return message?`Preview identity failed: ${message}`:`Previewing as ${previewIdentityLabelText({identity})}`}function normalizePreviewIdentitySelector(value={}){const source=value&&typeof value==="object"&&!Array.isArray(value)?value:{};const type=String(source.type||"").trim();const rawValue=String(source.value||"").trim();if(!PREVIEW_IDENTITY_TYPES.includes(type)||!rawValue){return null}const normalizedValue=type===PREVIEW_IDENTITY_TYPE_EMAIL?rawValue.toLowerCase():rawValue;if(type===PREVIEW_IDENTITY_TYPE_EMAIL&&(!normalizedValue.includes("@")||normalizedValue.length>320)||type!==PREVIEW_IDENTITY_TYPE_EMAIL&&normalizedValue.length>256){return null}return{type,value:normalizedValue}}function normalizeConfiguredPreviewIdentities(value=[]){if(!Array.isArray(value)){return[]}const identities=[];const names=new Set;for(const entry of value){const name=String((entry==null?void 0:entry.name)||"").trim().toLowerCase();const selector=normalizePreviewIdentitySelector({type:entry==null?void 0:entry.type,value:entry==null?void 0:entry.value});if(!name||names.has(name)||!selector){continue}names.add(name);identities.push({name,selector,type:selector.type,value:selector.value})}return identities}function previewIdentityTypeLabel(type=""){return{[PREVIEW_IDENTITY_TYPE_EMAIL]:"Email",[PREVIEW_IDENTITY_TYPE_LOGIN]:"Login name",[PREVIEW_IDENTITY_TYPE_USER_ID]:"User ID"}[String(type||"").trim()]||"User identifier"}function previewIdentityFromExchange(exchangeResult={},requestedIdentity={}){if(requestedIdentity.mode==="guest"){return{mode:"guest"}}const identity=(exchangeResult==null?void 0:exchangeResult.identity)&&typeof exchangeResult.identity==="object"?exchangeResult.identity:{};const selector=normalizePreviewIdentitySelector(identity.selector||requestedIdentity.selector);const email=String(identity.email||((selector==null?void 0:selector.type)===PREVIEW_IDENTITY_TYPE_EMAIL?selector.value:"")).trim().toLowerCase();const login=String(identity.login||((selector==null?void 0:selector.type)===PREVIEW_IDENTITY_TYPE_LOGIN?selector.value:"")).trim();const userId=String(identity.userId||((selector==null?void 0:selector.type)===PREVIEW_IDENTITY_TYPE_USER_ID?selector.value:"")).trim();const username=String(identity.username||"").trim();return{displayName:String(identity.displayName||username||requestedIdentity.displayName||requestedIdentity.name||(selector==null?void 0:selector.value)||"").trim(),email,login,mode:requestedIdentity.mode,name:String(requestedIdentity.name||"").trim(),selector,userId,username}}function isPreviewBridgeReadyMessage(value={}){return String((value==null?void 0:value.type)||"")===PREVIEW_BRIDGE_READY_MESSAGE_TYPE}function previewLoadingOverlayShouldShow({identityBusy=false,loadedFrameRequestId=0,previewFrameRequestId=0,previewUrl=""}={}){return Boolean(identityBusy||previewOpeningOverlayVisible({loadedFrameRequestId,previewFrameRequestId,previewUrl}))}function defaultPreviewIdentitySelection({capability=null}={}){const name=String((capability==null?void 0:capability.defaultIdentityName)||"").trim();return(capability==null?void 0:capability.defaultMode)==="identity"&&name?{identityName:name,mode:"identity"}:{mode:"guest"}}function createPreviewBridgeRequestRegistry(){const pendingRequests=new Map;let sequence=0;function take(requestId=""){var _a,_b;const pending=pendingRequests.get(requestId);if(!pending){return null}clearTimeout(pending.timeout);(_b=(_a=pending.signal)==null?void 0:_a.removeEventListener)==null?void 0:_b.call(_a,"abort",pending.abortHandler);pendingRequests.delete(requestId);return pending}function reject(requestId,error){const pending=take(requestId);pending==null?void 0:pending.reject(error);return Boolean(pending)}function rejectAll(message="The application preview changed."){for(const requestId of[...pendingRequests.keys()]){reject(requestId,new Error(message))}}function request({frameRequestId=0,message={},signal=null,targetWindow=null,timeoutMessage="The application preview did not respond in time.",timeoutMs=3e3}={}){if(!targetWindow||typeof targetWindow.postMessage!=="function"){return Promise.reject(new Error("The application preview is not ready."))}if(signal==null?void 0:signal.aborted){const error=new Error("Preview diagnostics collection was cancelled.");error.name="AbortError";return Promise.reject(error)}const requestId=[frameRequestId,Date.now(),++sequence].join(":");const response=new Promise((resolve2,rejectRequest)=>{var _a;const abortHandler=()=>{const error=new Error("Preview diagnostics collection was cancelled.");error.name="AbortError";reject(requestId,error)};const timeout=setTimeout(()=>{reject(requestId,new Error(timeoutMessage))},timeoutMs);pendingRequests.set(requestId,{abortHandler,reject:rejectRequest,resolve:resolve2,signal,timeout});(_a=signal==null?void 0:signal.addEventListener)==null?void 0:_a.call(signal,"abort",abortHandler,{once:true});if(signal==null?void 0:signal.aborted){abortHandler()}});try{targetWindow.postMessage({...message,requestId},"*")}catch(error){reject(requestId,error)}return response}function resolve(requestId,value){const pending=take(requestId);pending==null?void 0:pending.resolve(value);return Boolean(pending)}return Object.freeze({reject,rejectAll,request,resolve})}function previewUrlForDebug(value=""){return previewUrlWithoutDisplayParams(value)}function redactPreviewDebugDetails(value){if(typeof value==="string"){return value.includes(PREVIEW_PROXY_TOKEN_QUERY_PARAM)?previewUrlForDebug(value):value}if(Array.isArray(value)){return value.map(entry=>redactPreviewDebugDetails(entry))}if(!value||typeof value!=="object"){return value}return Object.fromEntries(Object.entries(value).map(([key,entry])=>[key,redactPreviewDebugDetails(entry)]))}function normalizePreviewAddressInput(value=""){const text=String(value||"").trim();if(!text){return""}if(/^[a-z][a-z\d+.-]*:/iu.test(text)||/^[/?#]/u.test(text)||text.startsWith("./")||text.startsWith("../")){return text}return`/${text}`}function launchPreviewAddressNavigationUrl({address="",currentUrl="",displayBaseUrl="",previewBaseUrl=""}={}){const previewBaseText=String(previewBaseUrl||"").trim();const displayBaseText=previewUrlWithoutDisplayParams(displayBaseUrl||previewBaseText);const currentText=previewUrlWithoutDisplayParams(currentUrl||displayBaseText);const input=normalizePreviewAddressInput(address);if(!input||!previewBaseText||!displayBaseText){return{displayUrl:"",error:"Preview URL is not available yet.",ok:false,previewUrl:""}}try{const previewBase=new URL(previewBaseText);const displayBase=new URL(displayBaseText);const target=new URL(input,currentText||displayBaseText);const allowedOrigins=new Set([displayBase.origin,previewBase.origin]);if(!allowedOrigins.has(target.origin)){return{displayUrl:"",error:"Preview URL must stay inside this app.",ok:false,previewUrl:""}}const previewTarget=target.origin===previewBase.origin?new URL(target):new URL(previewBase);const displayTarget=target.origin===displayBase.origin?new URL(target):new URL(displayBase);if(target.origin!==previewBase.origin){previewTarget.pathname=target.pathname;previewTarget.search=target.search;previewTarget.hash=target.hash}if(target.origin!==displayBase.origin){displayTarget.pathname=target.pathname;displayTarget.search=target.search;displayTarget.hash=target.hash}return{displayUrl:previewUrlWithoutDisplayParams(displayTarget.toString()),error:"",ok:true,previewUrl:launchPreviewFrameUrl({baseUrl:previewBaseText,displayBaseUrl:displayBaseText,visitedUrl:displayTarget.toString()})}}catch{return{displayUrl:"",error:"Preview URL is invalid.",ok:false,previewUrl:""}}}function useVibe64OutputControlsSurface(props){const{activeOutputTarget,expandTerminal,launchActions,launchButtonsDisabled,launchError,resourceAdmissionId,acceptResourceRetry,testApproval,launchStatusAttempt,launchStatusIdleRecoveryExhausted,launchStarting,launchWaiting,outputExecution,outputResults,outputRuns,outputTargets,loading,loadError,minimizeTerminal,openAction,operationBusy,previewCanRestart,previewCanShowLog,previewCanStart,previewIdentity:previewIdentityCapability,previewMessage,previewState,publishPreviewState,requestPreviewIdentityGrant,refresh:refreshOutputs,restartTerminal,retryTerminal,run,startNewlyConfiguredWorkspaceSetup,terminal,terminalCanRestart,terminalCanRetry,terminalCommandPreview,terminalDisplayed,terminalDockVisible,terminalError,terminalExpanded,terminalIndicatorLabel,terminalIndicatorState,terminalIsRunning,terminalPreviewRequiresProxy,terminalStatus,terminalSessionId,terminalSubtitle,terminalTitle,terminalVisible,terminalWindowVisible,terminalWindowStorageKey,visible}=useVibe64OutputControls({autoStartManagedPreview:()=>props.autoStartManagedPreview,autoStartTargetId:()=>props.autoStartTargetId,embeddedPreview:()=>props.embeddedPreview,previewDisplayed:()=>props.previewDisplayed,sourceOperationsSuspended:()=>props.sourceOperationsSuspended,windowDisplayed:()=>props.windowDisplayed,busy:()=>props.busy,session:()=>props.session});const runMenuDisabled=computed(()=>Boolean(launchButtonsDisabled.value||loading.value||outputTargets.value.length<1));const previewFrame=ref(null);const previewBridgeVersion=ref(0);const previewBridgeRequests=createPreviewBridgeRequestRegistry();const previewDiagnosticsBusy=ref(false);const previewIdentityBusy=ref(false);const previewIdentityCurrent=ref(null);const previewIdentityError=ref("");const previewIdentityRequested=ref(null);const previewResourceNoticeText=ref("");const previewResourceNoticeVisible=ref(false);let previewIdentityAutomaticAttempt="";let previewIdentityLifecycle="";let previewIdentityReloadRequestId=0;let previewResourceRetryCount=0;let previewResourceRetryLifecycle="";let previewResourceRetryTimer=null;const previewFrameRequest=ref({id:0,identity:"",src:""});const previewLoadedFrameRequestId=ref(0);const previewAddressDraft=ref("");const previewAddressError=ref("");const previewAddressFocused=ref(false);const previewHistory=ref([]);const previewRouteDialogVisible=ref(false);const previewRouteDialogError=ref("");const previewRouteFormValues=ref({});const previewRouteSelection=ref(null);const previewLogVisible=ref(false);const previewVisitedUrl=ref("");const previewToolbarExpanded=ref(false);const previewToolbarPosition=ref("center");const projectSlug=useVibe64ProjectSlug();const toolbarTeleportTarget=computed(()=>String(props.toolbarTeleportTarget||"").trim());const embeddedTerminalVisible=computed(()=>Boolean(props.embeddedPreview&&terminalDisplayed.value&&terminalExpanded.value));const terminalSurfaceVisible=computed(()=>Boolean(terminalDisplayed.value&&terminalVisible.value));const embeddedTerminalSurfaceVisible=computed(()=>Boolean(props.embeddedPreview&&terminalSurfaceVisible.value&&terminalExpanded.value));const requestedAutoStartTargetId=computed(()=>String(props.autoStartTargetId||"").trim());const embeddedAutoStartTarget=computed(()=>{if(!props.embeddedPreview||!requestedAutoStartTargetId.value){return null}return outputTargets.value.find(target=>{var _a;return target.id===requestedAutoStartTargetId.value&&((_a=target.presentation)==null?void 0:_a.kind)==="web"})||null});const embeddedStartTarget=computed(()=>{if(!props.embeddedPreview){return null}return embeddedAutoStartTarget.value||managedPreviewTarget(outputTargets.value)||preferredPreviewTarget(outputTargets.value)});const embeddedStartTargetUnavailableReason=computed(()=>{const target=embeddedStartTarget.value;return(target==null?void 0:target.available)===false?String(target.disabledReason||"Preview cannot start yet.").trim():""});const embeddedManualStartButtonVisible=computed(()=>Boolean(props.embeddedPreview&&embeddedStartTarget.value&&embeddedStartTarget.value.available!==false&&!terminalVisible.value));const embeddedManualStartButtonDisabled=computed(()=>Boolean(operationBusy.value||!embeddedStartTarget.value||embeddedStartTarget.value.available===false));const manualLaunchMenuVisible=computed(()=>Boolean(!terminalVisible.value&&outputTargets.value.length>0&&!(props.embeddedPreview&&embeddedStartTarget.value&&(requestedAutoStartTargetId.value||props.autoStartManagedPreview))));const previewToolbarStorageKey=computed(()=>props.embeddedPreview&&props.session?launchPreviewToolbarStorageKey(props.session,projectSlug.value):"");const previewLocationStorageKey=computed(()=>props.embeddedPreview&&props.session?launchPreviewLocationStorageKey(props.session,projectSlug.value):"");const previewContextTarget=computed(()=>embeddedAutoStartTarget.value||activeOutputTarget.value||embeddedStartTarget.value||null);const previewRoutes=computed(()=>previewRoutesForTarget(previewContextTarget.value));const previewRoutesAvailable=computed(()=>previewRoutes.value.length>0);const previewRouteDialogPath=computed(()=>{const route=previewRouteSelection.value;if(!route){return""}return previewRoutePath(route,previewRouteFormValues.value).path});const previewRouteDialogParams=computed(()=>previewRouteSelection.value?previewRouteParams(previewRouteSelection.value):[]);const previewDestination=computed(()=>resolveLaunchPreviewDestination(launchActions.value,{requirePreviewProxy:terminalPreviewRequiresProxy.value}));const previewBaseUrl=computed(()=>previewDestination.value.embedHref);const previewEmbedUnavailableReason=computed(()=>previewDestination.value.unavailableReason);const previewDisplayBaseUrl=computed(()=>previewDestination.value.displayHref);const previewDisplayedUrl=computed(()=>previewVisitedUrl.value||previewDisplayBaseUrl.value||previewBaseUrl.value);const previewDisplayedAddress=computed(()=>previewAddressDisplayText(previewDisplayedUrl.value,{displayBaseUrl:previewDisplayBaseUrl.value,previewBaseUrl:previewBaseUrl.value}));const previewBackAvailable=computed(()=>previewHistory.value.length>1);const previewPaneDisplayed=computed(()=>props.previewDisplayed!==false);const previewReadyForIframe=computed(()=>Boolean(["ready","stale"].includes(previewState.value)&&previewBaseUrl.value));const previewIdentityAvailable=computed(()=>{var _a;return Boolean(props.embeddedPreview&&((_a=previewIdentityCapability.value)==null?void 0:_a.available)===true)});const previewIdentityConfigured=computed(()=>{var _a;return normalizeConfiguredPreviewIdentities((_a=previewIdentityCapability.value)==null?void 0:_a.identities)});const previewIdentityLifecycleKey=computed(()=>{var _a,_b,_c,_d;return previewIdentityLifecycleIdentity({outputTargetId:((_a=activeOutputTarget.value)==null?void 0:_a.id)||((_c=(_b=terminal.value)==null?void 0:_b.metadata)==null?void 0:_c.outputTargetId),previewBaseUrl:previewBaseUrl.value,projectSlug:projectSlug.value,sessionId:(_d=props.session)==null?void 0:_d.sessionId,terminalSessionId:terminalSessionId.value})});const previewIdentityLabel=computed(()=>previewIdentityLabelText({busy:previewIdentityBusy.value,identity:previewIdentityCurrent.value}));const previewIdentityTitle=computed(()=>previewIdentityTitleText({busy:previewIdentityBusy.value,error:previewIdentityError.value,identity:previewIdentityCurrent.value}));const previewFrameRequestId=computed(()=>previewFrameRequest.value.id);const previewUrl=computed(()=>previewFrameRequest.value.src);const previewFrameLoaded=computed(()=>Boolean(previewUrl.value&&previewFrameRequestId.value>0&&previewLoadedFrameRequestId.value===previewFrameRequestId.value));const previewIdentitySelectionDisabled=computed(()=>Boolean(previewIdentityBusy.value||!previewFrameLoaded.value));const previewDiagnosticsAvailable=computed(()=>{var _a;return Boolean(previewFrameLoaded.value&&((_a=previewFrame.value)==null?void 0:_a.contentWindow)&&previewBridgeVersion.value>=PREVIEW_BRIDGE_VERSION)});const previewCheckAgainVisible=computed(()=>Boolean(props.embeddedPreview&&previewState.value==="idle"&&!previewUrl.value&&!terminalVisible.value&&embeddedStartTargetUnavailableReason.value&&!loadError.value));const previewStarting=computed(()=>Boolean(previewState.value==="starting"));const launchStatusText=computed(()=>launchPreviewStatusText({attempt:launchStatusAttempt.value,loadError:loadError.value,loading:loading.value}));const launchStatusDetailText=computed(()=>String(loadError.value||"").trim());const launchStatusChipVisible=computed(()=>Boolean(loadError.value||loading.value&&!previewUrl.value));const launchStatusRetryVisible=computed(()=>Boolean(loadError.value));const launchStatusChipText=computed(()=>{const attempt=launchStatusAttempt.value||1;if(loadError.value){return`Preview status failed (attempt ${attempt})`}if(loading.value){return`Checking preview (attempt ${attempt})`}return""});const launchStatusChipTitle=computed(()=>launchStatusText.value||launchStatusChipText.value);const previewLoadingOverlayVisible=computed(()=>previewLoadingOverlayShouldShow({identityBusy:previewIdentityBusy.value,loadedFrameRequestId:previewLoadedFrameRequestId.value,previewFrameRequestId:previewFrameRequestId.value,previewUrl:previewUrl.value}));const previewInFlightText=computed(()=>{if(previewIdentityBusy.value){const requested=previewIdentityRequested.value;return(requested==null?void 0:requested.mode)==="guest"?"Signing out of the preview…":`Opening preview as ${(requested==null?void 0:requested.name)||(requested==null?void 0:requested.identityName)||"the selected app identity"}…`}return launchPreviewInFlightText({activeOutputTarget:activeOutputTarget.value,embeddedStartTarget:embeddedStartTarget.value,launchStarting:launchStarting.value,launchWaiting:launchWaiting.value,launchStatusText:launchStatusText.value,loading:loading.value,operationBusy:operationBusy.value,previewDisplayedAddress:previewDisplayedAddress.value,previewEmbedUnavailableReason:previewEmbedUnavailableReason.value,previewLoadingOverlayVisible:previewLoadingOverlayVisible.value,previewUrl:previewUrl.value,terminalCanRestart:terminalCanRestart.value,terminalCanRetry:terminalCanRetry.value,terminalIsRunning:terminalIsRunning.value})});const previewIssue=computed(()=>launchPreviewIssue({launchError:launchError.value,message:previewMessage.value,state:previewState.value}));const previewIssueVisible=computed(()=>Boolean(props.embeddedPreview&&previewIssue.value));const previewNotice=computed(()=>launchPreviewNotice({launchError:launchError.value,message:previewMessage.value,state:previewState.value}));const embeddedTerminalFrameVisible=computed(()=>Boolean(embeddedTerminalVisible.value&&(!previewNotice.value||previewLogVisible.value)));const previewNoticeVisible=computed(()=>Boolean(props.embeddedPreview&&previewNotice.value&&!embeddedTerminalFrameVisible.value));const previewRecoveryVisible=computed(()=>{var _a;return Boolean(props.embeddedPreview&&previewNoticeVisible.value&&(((_a=embeddedStartTarget.value)==null?void 0:_a.available)!==false&&(previewCanRestart.value||previewCanStart.value)||terminalCanRestart.value||terminalCanRetry.value))});const previewRecoveryLabel=computed(()=>terminalCanRetry.value&&!previewCanRestart.value&&!previewCanStart.value&&!terminalCanRestart.value?"Retry preview":"Restart preview");const launchToolbarDockVisible=computed(()=>launchToolbarDockShouldShow({embeddedPreview:props.embeddedPreview,embeddedTerminalVisible:embeddedTerminalFrameVisible.value,previewIssueVisible:previewIssueVisible.value,terminalDockVisible:terminalDockVisible.value,terminalVisible:terminalVisible.value}));const previewToolbarRecoveryVisible=computed(()=>Boolean(props.embeddedPreview&&launchToolbarDockVisible.value&&(previewCanRestart.value||terminalCanRestart.value||terminalCanRetry.value)&&embeddedStartTarget.value));const previewTerminalRecoveryVisible=computed(()=>Boolean(props.embeddedPreview&&terminalVisible.value&&(previewCanRestart.value||terminalCanRestart.value||terminalCanRetry.value)&&embeddedStartTarget.value));const previewActivityVisible=computed(()=>Boolean(previewStarting.value||launchStarting.value||launchWaiting.value||terminalIsRunning.value||loading.value));const previewEmptyText=computed(()=>launchPreviewEmptyText({launchStatusText:launchStatusText.value,loading:loading.value,loadError:loadError.value,previewInFlightText:previewInFlightText.value,previewManualStartAvailable:embeddedManualStartButtonVisible.value,previewMessage:previewMessage.value,previewState:previewState.value,previewStartUnavailableReason:embeddedStartTargetUnavailableReason.value,launchStarting:launchStarting.value,outputTargetsUnavailable:launchStatusIdleRecoveryExhausted.value&&outputTargets.value.length<1,terminalIsRunning:terminalIsRunning.value}));function previewClientDebugEnabled(){var _a;if(typeof window==="undefined"){return false}try{return((_a=window.localStorage)==null?void 0:_a.getItem("vibe64:preview-debug"))==="1"||new URL(window.location.href).searchParams.has("vibe64_preview_debug")}catch{return false}}function previewDebugLog(event="",details={}){var _a,_b,_c;if(!previewClientDebugEnabled()){return}vibe64SessionDebugLog(`client.launchPreview.${event}`,redactPreviewDebugDetails({frameRequestId:previewFrameRequestId.value,frameSrc:String(((_b=(_a=previewFrame.value)==null?void 0:_a.getAttribute)==null?void 0:_b.call(_a,"src"))||""),loadedFrameRequestId:previewLoadedFrameRequestId.value,overlayVisible:previewLoadingOverlayVisible.value,previewBaseUrl:previewBaseUrl.value,previewDisplayBaseUrl:previewDisplayBaseUrl.value,previewState:previewState.value,previewUrl:previewUrl.value,projectSlug:projectSlug.value,sessionId:String(((_c=props.session)==null?void 0:_c.sessionId)||""),...details&&typeof details==="object"&&!Array.isArray(details)?details:{}}))}function resetPreviewBridge(reason=""){previewBridgeVersion.value=0;previewBridgeRequests.rejectAll("The application preview changed.");previewDiagnosticsBusy.value=false;previewDebugLog("bridge.reset",{reason})}function cancelPreviewResourceRetry(){if(previewResourceRetryTimer!==null){clearTimeout(previewResourceRetryTimer);previewResourceRetryTimer=null}}function resetPreviewResourceRecovery(lifecycle=""){cancelPreviewResourceRetry();previewResourceRetryCount=0;previewResourceRetryLifecycle=String(lifecycle||"");previewResourceNoticeText.value="";previewResourceNoticeVisible.value=false}function showPreviewResourceNotice(message=""){previewResourceNoticeText.value=String(message||"");previewResourceNoticeVisible.value=Boolean(previewResourceNoticeText.value)}function handlePreviewResourceFailure(message={}){const lifecycle=previewIdentityLifecycleKey.value;if(!lifecycle||!previewUrl.value){return false}if(previewResourceRetryLifecycle!==lifecycle){resetPreviewResourceRecovery(lifecycle)}if(previewResourceRetryTimer!==null){return false}const resourceKind=String((message==null?void 0:message.kind)||"resource").trim()||"resource";const resourceUrl=String((message==null?void 0:message.href)||"").trim();const willRetry=previewResourceRetryCount<PREVIEW_RESOURCE_RETRY_LIMIT;const notice=willRetry?"Preview could not load an application resource. Retrying automatically…":"Preview could not load an application resource after retrying. Use Reload preview to try again.";showPreviewResourceNotice(notice);console.error(`[Vibe64 preview] ${notice}`,{resourceKind,resourceUrl});previewDebugLog("resource.failed",{resourceKind,resourceUrl,retryCount:previewResourceRetryCount,willRetry});if(!willRetry){return false}previewResourceRetryCount+=1;const failedFrameRequestId=previewFrameRequestId.value;previewResourceRetryTimer=setTimeout(()=>{previewResourceRetryTimer=null;if(previewResourceRetryLifecycle!==previewIdentityLifecycleKey.value||failedFrameRequestId!==previewFrameRequestId.value){return}const reloaded=requestPreviewFrame({force:true,reason:"resource-load-retry"});if(!reloaded){const failureNotice="Preview could not be reloaded automatically. Use Reload preview to try again.";showPreviewResourceNotice(failureNotice);console.error(`[Vibe64 preview] ${failureNotice}`)}},PREVIEW_RESOURCE_RETRY_DELAY_MS);return true}function clearPreviewFrame(reason=""){resetPreviewBridge(reason||"frame-cleared");if(!previewFrameRequest.value.src){return false}previewFrameRequest.value={id:previewFrameRequest.value.id+1,identity:"",src:""};previewLoadedFrameRequestId.value=0;previewDebugLog("frame.cleared",{reason});return true}function requestPreviewFrame({force=false,reason="",src="",visitedUrl=previewVisitedUrl.value}={}){var _a,_b;if(!previewReadyForIframe.value){return false}const nextSrc=String(src||"").trim()||launchPreviewFrameUrl({baseUrl:previewBaseUrl.value,displayBaseUrl:previewDisplayBaseUrl.value,visitedUrl:visitedUrl||previewDisplayBaseUrl.value||previewBaseUrl.value});const nextIdentity=previewFrameLifecycleIdentity({outputTargetId:(_a=activeOutputTarget.value)==null?void 0:_a.id,sessionId:(_b=props.session)==null?void 0:_b.sessionId,src:nextSrc,terminalSessionId:terminalSessionId.value});if(!nextIdentity||!force&&nextIdentity===previewFrameRequest.value.identity){return false}resetPreviewBridge(reason||"frame-requested");previewFrameRequest.value={id:previewFrameRequest.value.id+1,identity:nextIdentity,src:nextSrc};if(previewIdentityReloadRequestId>0){previewIdentityReloadRequestId=previewFrameRequest.value.id}previewDebugLog("frame.requested",{force,reason,src:nextSrc});return true}async function reloadPreview(){resetPreviewResourceRecovery(previewIdentityLifecycleKey.value);const requestIdBeforeRefresh=previewFrameRequestId.value;await refreshOutputs();await nextTick();if(previewFrameRequestId.value!==requestIdBeforeRefresh){return true}return requestPreviewFrame({force:true,reason:"manual-reload"})}async function retryLaunchStatus(){await(startNewlyConfiguredWorkspaceSetup==null?void 0:startNewlyConfiguredWorkspaceSetup());await refreshOutputs()}function movePreviewToolbar(direction=0){previewToolbarPosition.value=nextLaunchPreviewToolbarPosition(previewToolbarPosition.value,direction);if(previewToolbarStorageKey.value){writeLocalStorageJson(previewToolbarStorageKey.value,previewToolbarPosition.value)}}function collapsePreviewToolbar(){previewToolbarExpanded.value=false}function expandPreviewToolbar(){previewToolbarExpanded.value=true}async function copyPreviewUrl(){var _a;if(!previewDisplayedAddress.value||typeof navigator==="undefined"||!((_a=navigator.clipboard)==null?void 0:_a.writeText)){return false}await navigator.clipboard.writeText(previewDisplayedAddress.value);return true}function resetPreviewAddressDraft(){previewAddressError.value="";previewAddressDraft.value=previewDisplayedAddress.value||""}function previewAddressFocus(){previewAddressFocused.value=true}function previewAddressBlur(){previewAddressFocused.value=false;if(!previewAddressError.value){previewAddressDraft.value=previewDisplayedAddress.value||""}}function resetPreviewHistory(url=""){const normalizedUrl=previewUrlWithoutDisplayParams(url);previewHistory.value=normalizedUrl?[normalizedUrl]:[]}function storedPreviewRoute(){const stored=readLocalStorageJson(previewLocationStorageKey.value,null);if(stored&&typeof stored==="object"&&!Array.isArray(stored)){return normalizePreviewRoute(stored.route||previewRouteFromUrl(stored.url||""))}return normalizePreviewRoute(stored||"")}function storedPreviewUrl(baseUrl=""){return previewUrlForRoute(storedPreviewRoute(),baseUrl)}function writePreviewLocation(url=""){const route=previewRouteFromUrl(url);if(!route||!previewLocationStorageKey.value){return}writeLocalStorageJson(previewLocationStorageKey.value,{route})}function recordPreviewHistory(url="",reason=""){const normalizedUrl=previewUrlWithoutDisplayParams(url);if(!normalizedUrl){return}const history=previewHistory.value.filter(Boolean);const currentUrl=history.at(-1)||"";if(currentUrl===normalizedUrl){return}const previousUrl=history.at(-2)||"";if(previousUrl===normalizedUrl){previewHistory.value=history.slice(0,-1);return}if(String(reason||"")==="replaceState"&&history.length>0){previewHistory.value=[...history.slice(0,-1),normalizedUrl];return}previewHistory.value=[...history,normalizedUrl].slice(-50)}function setPreviewVisitedUrl(url="",{reason=""}={}){const normalizedUrl=previewUrlWithoutDisplayParams(url);if(!normalizedUrl){return}previewVisitedUrl.value=normalizedUrl;writePreviewLocation(normalizedUrl);recordPreviewHistory(normalizedUrl,reason)}function navigatePreviewToDisplayUrl(displayUrl=""){const navigation=launchPreviewAddressNavigationUrl({address:displayUrl,currentUrl:previewDisplayedUrl.value,displayBaseUrl:previewDisplayBaseUrl.value,previewBaseUrl:previewBaseUrl.value});if(!navigation.ok){previewAddressError.value=navigation.error;return false}previewAddressError.value="";previewAddressDraft.value=previewAddressDisplayText(navigation.displayUrl,{displayBaseUrl:previewDisplayBaseUrl.value,previewBaseUrl:previewBaseUrl.value});setPreviewVisitedUrl(navigation.displayUrl,{reason:"address"});requestPreviewFrame({force:true,reason:"address",src:navigation.previewUrl,visitedUrl:navigation.displayUrl});previewDebugLog("address.navigate",{displayUrl:navigation.displayUrl,previewUrl:navigation.previewUrl});return true}function submitPreviewAddress(){return navigatePreviewToDisplayUrl(previewAddressDraft.value)}function openPreviewRoute(route={}){if(!(route==null?void 0:route.pathTemplate)){return false}if(!previewRouteHasParams(route)){return navigatePreviewToDisplayUrl(route.pathTemplate)}previewRouteSelection.value=route;previewRouteFormValues.value=previewRouteInitialFormValues(route);previewRouteDialogError.value="";previewRouteDialogVisible.value=true;return true}function submitPreviewRouteDialog(){const route=previewRouteSelection.value;if(!route){previewRouteDialogVisible.value=false;return false}const result=previewRoutePath(route,previewRouteFormValues.value);if(!result.ok){previewRouteDialogError.value=result.missingParam?`Enter ${result.missingParam}.`:"Preview route is invalid.";return false}const navigated=navigatePreviewToDisplayUrl(result.path);if(navigated){previewRouteDialogVisible.value=false}return navigated}function goPreviewBack(){if(!previewBackAvailable.value){return false}const previousUrl=previewHistory.value.at(-2)||"";if(previousUrl&&navigatePreviewToDisplayUrl(previousUrl)){return true}return false}function requestPreviewState(){var _a,_b;if(!previewPaneDisplayed.value||!((_a=previewFrame.value)==null?void 0:_a.contentWindow)||!previewUrl.value){if(previewUrl.value){previewDebugLog("query.skipped",{hasContentWindow:Boolean((_b=previewFrame.value)==null?void 0:_b.contentWindow),previewPaneDisplayed:previewPaneDisplayed.value})}return}previewDebugLog("query.post");previewFrame.value.contentWindow.postMessage({type:PREVIEW_QUERY_MESSAGE_TYPE},"*")}async function requestPreviewDiagnostics({signal=null}={}){var _a;if(previewDiagnosticsBusy.value){throw new Error("Preview diagnostics are already being collected.")}if(!previewDiagnosticsAvailable.value){throw new Error("Preview diagnostics are not available for the current app page.")}previewDiagnosticsBusy.value=true;try{return await previewBridgeRequests.request({frameRequestId:previewFrameRequestId.value,message:{type:PREVIEW_DIAGNOSTICS_REQUEST_MESSAGE_TYPE},signal,targetWindow:(_a=previewFrame.value)==null?void 0:_a.contentWindow,timeoutMessage:"The proxied app did not return its diagnostics in time.",timeoutMs:PREVIEW_DIAGNOSTICS_TIMEOUT_MS})}finally{previewDiagnosticsBusy.value=false}}function requestPreviewIdentityExchange(grant=""){var _a;if(!previewFrameLoaded.value){return Promise.reject(new Error("The application preview is not ready to switch identity."))}return previewBridgeRequests.request({frameRequestId:previewFrameRequestId.value,message:{grant:String(grant||""),type:PREVIEW_IDENTITY_REQUEST_MESSAGE_TYPE},targetWindow:(_a=previewFrame.value)==null?void 0:_a.contentWindow,timeoutMessage:"The application preview did not complete the identity exchange in time.",timeoutMs:PREVIEW_IDENTITY_TIMEOUT_MS})}function completePreviewIdentityTransition(){previewIdentityBusy.value=false;previewIdentityRequested.value=null;previewIdentityReloadRequestId=0}function resetPreviewIdentityState(){completePreviewIdentityTransition();previewIdentityCurrent.value=null;previewIdentityError.value=""}function reloadPreviewForIdentity(reason="identity-changed"){const requested=requestPreviewFrame({force:true,reason});if(!requested){completePreviewIdentityTransition();return false}previewIdentityReloadRequestId=previewFrameRequestId.value;return true}async function selectPreviewIdentity(selection={}){if(previewIdentitySelectionDisabled.value||!previewIdentityAvailable.value){return false}const mode=String(selection.mode||"identity").trim();const identityName=String(selection.identityName||"").trim().toLowerCase();const requested=mode==="identity"?{identityName,mode}:{mode:"guest"};previewIdentityBusy.value=true;previewIdentityError.value="";previewIdentityRequested.value=requested;try{const grantResult=await requestPreviewIdentityGrant(requested);const grant=String((grantResult==null?void 0:grantResult.grant)||"").trim();if(!grant||(grantResult==null?void 0:grantResult.ok)===false){throw new Error(String((grantResult==null?void 0:grantResult.error)||"Vibe64 could not authorize the preview identity exchange."))}const requestedIdentity=grantResult.requestedIdentity||requested;previewIdentityRequested.value=requestedIdentity;const exchangeResult=await requestPreviewIdentityExchange(grant);previewIdentityCurrent.value=previewIdentityFromExchange(exchangeResult,requestedIdentity);reloadPreviewForIdentity("identity-selected");return true}catch(error){const message=String((error==null?void 0:error.message)||error||"Preview identity exchange failed.");previewIdentityError.value=message;if((error==null?void 0:error.signedOut)===true){previewIdentityCurrent.value={mode:"guest"};previewIdentityRequested.value={mode:"guest"};reloadPreviewForIdentity("identity-exchange-signed-out")}else{completePreviewIdentityTransition()}return false}}function selectPreviewConfiguredIdentity(identity={}){const identityName=String((identity==null?void 0:identity.name)||"").trim();if(!identityName){return false}return selectPreviewIdentity({identityName,mode:"identity"})}function selectPreviewGuest(){return selectPreviewIdentity({mode:"guest"})}function beginDefaultPreviewIdentity(){const lifecycle=previewIdentityLifecycleKey.value;if(!lifecycle||!previewIdentityAvailable.value||previewIdentityAutomaticAttempt===lifecycle){return false}previewIdentityAutomaticAttempt=lifecycle;void selectPreviewIdentity(defaultPreviewIdentitySelection({capability:previewIdentityCapability.value}));return true}function markPreviewFrameReady(requestId,reason=""){var _a;const normalizedRequestId=Math.max(0,Number(requestId)||0);if(!normalizedRequestId||normalizedRequestId!==previewFrameRequestId.value||!((_a=previewFrame.value)==null?void 0:_a.contentWindow)){return false}if(previewLoadedFrameRequestId.value===normalizedRequestId){return false}previewLoadedFrameRequestId.value=normalizedRequestId;previewDebugLog("iframe.ready",{reason,requestId:normalizedRequestId});if(normalizedRequestId===previewIdentityReloadRequestId){completePreviewIdentityTransition();return true}beginDefaultPreviewIdentity();return true}function handlePreviewFrameLoad(event){var _a;const frame=(event==null?void 0:event.currentTarget)||null;const requestId=Number(((_a=frame==null?void 0:frame.dataset)==null?void 0:_a.previewFrameRequestId)||0);if(!requestId||frame!==previewFrame.value||requestId!==previewFrameRequestId.value){previewDebugLog("iframe.loadIgnored",{requestId});return}if(!previewFrameLoaded.value){resetPreviewBridge("iframe-loaded-without-bridge-ready");markPreviewFrameReady(requestId,"iframe-load")}previewDebugLog("iframe.loaded",{requestId});requestPreviewState()}async function forceStartEmbeddedPreview(){if(operationBusy.value){return false}if(!embeddedStartTarget.value||embeddedStartTarget.value.available===false){return false}return run(embeddedStartTarget.value,{applyDefaultDisplay:false,forceRestart:true})}async function recoverEmbeddedPreview(){if(operationBusy.value){return false}if(embeddedStartTarget.value&&embeddedStartTarget.value.available!==false&&(previewCanRestart.value||previewCanStart.value||terminalCanRestart.value||terminalCanRetry.value)){return forceStartEmbeddedPreview()}if(terminalCanRestart.value){return restartTerminal()}if(terminalCanRetry.value){return retryTerminal()}return false}async function recheckResourceAdmission({outputTargetId="",startIfStopped=false}={}){var _a,_b;if(operationBusy.value)return false;const project=projectSlug.value;const session=(_a=props.session)==null?void 0:_a.sessionId;operationBusy.value=true;try{await refreshOutputs();await nextTick()}finally{operationBusy.value=false}if(project!==projectSlug.value||session!==((_b=props.session)==null?void 0:_b.sessionId)||loadError.value)return false;if(terminalIsRunning.value||["ready","starting"].includes(previewState.value))return true;const target=outputTargets.value.find(item=>item.id===outputTargetId);return startIfStopped&&target?run(target,{applyDefaultDisplay:false}):false}function setTerminalExpanded(expanded){previewLogVisible.value=Boolean(expanded);if(expanded){void expandTerminal();return}minimizeTerminal()}function showLaunchLog(){collapsePreviewToolbar();previewLogVisible.value=true;void expandTerminal()}function previewMessageUrl(data={}){if(!data||typeof data!=="object"||data.type!==PREVIEW_LOCATION_MESSAGE_TYPE){return""}const href=String(data.href||data.url||"").trim();const baseUrl=String(previewDisplayBaseUrl.value||previewBaseUrl.value||"").trim();if(!href||!baseUrl){return""}try{const url=new URL(href,baseUrl);const baseOrigin=new URL(baseUrl).origin;if(url.origin===baseOrigin){return previewUrlWithoutDisplayParams(url.toString())}const mappedUrl=previewMessageTargetUrlToPreviewUrl(url);return mappedUrl?previewUrlWithoutDisplayParams(mappedUrl):""}catch{return""}}function previewMessageTargetUrlToPreviewUrl(targetUrl){const previewBase=String(previewBaseUrl.value||"").trim();if(!previewBase||!targetUrl){return""}const matchingAction=launchActions.value.find(action=>{try{return new URL(String((action==null?void 0:action.href)||"")).origin===targetUrl.origin&&String((action==null?void 0:action.previewHref)||"").trim()}catch{return false}});if(!matchingAction){return""}try{const previewUrl2=new URL(previewBase);previewUrl2.pathname=targetUrl.pathname;previewUrl2.search=targetUrl.search;previewUrl2.hash=targetUrl.hash;return previewUrl2.toString()}catch{return""}}function previewMessageOriginAllowed(event){const origins=[previewBaseUrl.value,previewDisplayBaseUrl.value].map(value=>{try{return value?new URL(value).origin:""}catch{return""}}).filter(Boolean);return origins.length<1||origins.includes(String((event==null?void 0:event.origin)||""))}function previewMessageType(value={}){return String((value==null?void 0:value.type)||"")}function isPreviewBridgeMessage(value={}){return[PREVIEW_BRIDGE_READY_MESSAGE_TYPE,PREVIEW_DIAGNOSTICS_RESPONSE_MESSAGE_TYPE,PREVIEW_IDENTITY_RESPONSE_MESSAGE_TYPE,PREVIEW_LOCATION_MESSAGE_TYPE,PREVIEW_RESOURCE_FAILURE_MESSAGE_TYPE].includes(previewMessageType(value))}function handlePreviewBridgeMessage(event){var _a,_b,_c,_d,_e,_f,_g,_h,_i,_j,_k,_l,_m,_n,_o;if(!isPreviewBridgeMessage(event==null?void 0:event.data)){return}if((event==null?void 0:event.source)!==((_a=previewFrame.value)==null?void 0:_a.contentWindow)){previewDebugLog("message.ignored",{messageType:previewMessageType(event==null?void 0:event.data),origin:String((event==null?void 0:event.origin)||""),reason:"source_mismatch"});return}if(!previewMessageOriginAllowed(event)){previewDebugLog("message.ignored",{messageType:previewMessageType(event==null?void 0:event.data),origin:String((event==null?void 0:event.origin)||""),reason:"origin_not_allowed"});return}const messageType=previewMessageType(event.data);const bridgeReady=isPreviewBridgeReadyMessage(event.data);if(bridgeReady&&previewFrameLoaded.value){resetPreviewBridge("bridge-document-ready")}previewBridgeVersion.value=Math.max(previewBridgeVersion.value,Math.max(0,Number((_b=event==null?void 0:event.data)==null?void 0:_b.version)||0));if(bridgeReady){markPreviewFrameReady(previewFrameRequestId.value,"bridge-ready");return}if(messageType===PREVIEW_RESOURCE_FAILURE_MESSAGE_TYPE){handlePreviewResourceFailure(event.data);return}if(messageType===PREVIEW_DIAGNOSTICS_RESPONSE_MESSAGE_TYPE){const requestId=String(((_c=event.data)==null?void 0:_c.requestId)||"");previewBridgeRequests.resolve(requestId,((_d=event.data)==null?void 0:_d.diagnostics)||{});return}if(messageType===PREVIEW_IDENTITY_RESPONSE_MESSAGE_TYPE){const requestId=String(((_e=event.data)==null?void 0:_e.requestId)||"");if(((_f=event.data)==null?void 0:_f.ok)===true){previewBridgeRequests.resolve(requestId,{identity:((_g=event.data)==null?void 0:_g.identity)||null})}else{previewBridgeRequests.reject(requestId,Object.assign(new Error(String(((_h=event.data)==null?void 0:_h.error)||"Preview identity exchange failed.")),{code:String(((_i=event.data)==null?void 0:_i.code)||"vibe64_preview_identity_exchange_failed"),signedOut:((_j=event.data)==null?void 0:_j.signedOut)===true}))}return}const frameUrl=previewMessageUrl(event.data);previewDebugLog("message.received",{frameUrl,href:String(((_k=event==null?void 0:event.data)==null?void 0:_k.href)||((_l=event==null?void 0:event.data)==null?void 0:_l.url)||""),messageType:previewMessageType(event==null?void 0:event.data),origin:String((event==null?void 0:event.origin)||""),reason:String(((_m=event==null?void 0:event.data)==null?void 0:_m.reason)||"")});if(frameUrl){setPreviewVisitedUrl(frameUrl,{reason:String(((_n=event==null?void 0:event.data)==null?void 0:_n.reason)||"")});void publishPreviewState({route:previewRouteFromUrl(frameUrl),title:String(((_o=event==null?void 0:event.data)==null?void 0:_o.title)||"")})}}watch(previewIdentityLifecycleKey,lifecycle=>{if(lifecycle===previewIdentityLifecycle){return}previewIdentityLifecycle=lifecycle;previewIdentityAutomaticAttempt="";resetPreviewResourceRecovery(lifecycle);resetPreviewIdentityState();previewBridgeRequests.rejectAll("The active application preview changed.");previewDiagnosticsBusy.value=false},{flush:"sync",immediate:true});watch(previewIdentityAvailable,available=>{if(available&&previewFrameLoaded.value){beginDefaultPreviewIdentity()}});watch(previewLocationStorageKey,(storageKey,previousStorageKey)=>{if(storageKey===previousStorageKey){return}previewVisitedUrl.value="";resetPreviewHistory("")},{flush:"sync",immediate:true});watch([previewReadyForIframe,previewBaseUrl,previewDisplayBaseUrl],([ready,baseUrl,displayBaseUrl],previous=[])=>{const previousDisplayBaseUrl=previous[2]||"";const normalizedDisplayBaseUrl=previewUrlWithoutDisplayParams(displayBaseUrl);if(normalizedDisplayBaseUrl&&(!previewVisitedUrl.value||normalizedDisplayBaseUrl!==previewUrlWithoutDisplayParams(previousDisplayBaseUrl))){const restoredUrl=storedPreviewUrl(normalizedDisplayBaseUrl);const route=previewRouteFromUrl(previewVisitedUrl.value||restoredUrl||normalizedDisplayBaseUrl);previewVisitedUrl.value=previewUrlForRoute(route,normalizedDisplayBaseUrl)||normalizedDisplayBaseUrl;resetPreviewHistory(previewVisitedUrl.value)}if(!ready||!baseUrl){return}requestPreviewFrame({reason:"preview-ready"})},{flush:"sync",immediate:true});watch(()=>{var _a;return String(((_a=props.session)==null?void 0:_a.sessionId)||"")},(sessionId,previousSessionId)=>{if(previousSessionId&&sessionId!==previousSessionId){clearPreviewFrame("session-changed")}},{flush:"sync"});watch(previewPaneDisplayed,displayed=>{if(!displayed){return}requestPreviewState()},{flush:"sync"});watch(previewDisplayedAddress,url=>{if(!previewAddressFocused.value){previewAddressDraft.value=url||""}},{immediate:true});watch(previewToolbarStorageKey,storageKey=>{previewToolbarExpanded.value=false;previewToolbarPosition.value=normalizeLaunchPreviewToolbarPosition(readLocalStorageJson(storageKey,"center"))},{immediate:true});onBeforeMount(()=>{window.addEventListener("message",handlePreviewBridgeMessage)});onBeforeUnmount(()=>{window.removeEventListener("message",handlePreviewBridgeMessage);cancelPreviewResourceRetry();previewBridgeRequests.rejectAll("The application preview closed.")});return{embeddedAutoStartTarget,embeddedManualStartButtonDisabled,embeddedManualStartButtonVisible,embeddedStartTarget,embeddedTerminalFrameVisible,embeddedTerminalSurfaceVisible,embeddedTerminalVisible,collapsePreviewToolbar,forceStartEmbeddedPreview,goPreviewBack,handlePreviewFrameLoad,expandPreviewToolbar,launchActions,launchButtonsDisabled,launchError,resourceAdmissionId,testApproval,acceptResourceRetry,launchStatusAttempt,launchStatusChipText,launchStatusChipTitle,launchStatusChipVisible,launchStatusDetailText,launchStatusRetryVisible,launchStatusText,outputExecution,outputResults,outputRuns,outputTargets,launchToolbarDockVisible,loading,loadError,manualLaunchMenuVisible,movePreviewToolbar,openAction,operationBusy,previewBaseUrl,previewAddressBlur,previewAddressDraft,previewAddressError,previewAddressFocus,previewBackAvailable,previewActivityVisible,previewCanRestart,previewCanShowLog,previewCanStart,previewCheckAgainVisible,previewDisplayedAddress,previewDisplayedUrl,previewDiagnosticsAvailable,previewDiagnosticsBusy,previewEmbedUnavailableReason,previewEmptyText,previewFrame,previewFrameLoaded,previewFrameRequestId,previewIdentityAvailable,previewIdentityBusy,previewIdentityConfigured,previewIdentityCurrent,previewIdentityError,previewIdentityLabel,previewIdentitySelectionDisabled,previewIdentityTitle,previewIdentityTypeLabel,previewIssue,previewIssueVisible,previewInFlightText,previewLoadingOverlayVisible,previewMessage,previewRouteDialogError,previewRouteDialogParams,previewRouteDialogPath,previewRouteDialogVisible,previewRouteFormValues,previewRouteSelection,previewRoutes,previewRoutesAvailable,previewNotice,previewNoticeVisible,previewRecoveryLabel,previewRecoveryVisible,previewResourceNoticeText,previewResourceNoticeVisible,previewState,previewTerminalRecoveryVisible,previewToolbarRecoveryVisible,previewStarting,previewToolbarExpanded,previewToolbarPosition,previewUrl,copyPreviewUrl,openPreviewRoute,recoverEmbeddedPreview,recheckResourceAdmission,reloadPreview,retryLaunchStatus,requestPreviewDiagnostics,resetPreviewAddressDraft,selectPreviewConfiguredIdentity,selectPreviewGuest,submitPreviewRouteDialog,submitPreviewAddress,restartTerminal,retryTerminal,run,runMenuDisabled,showLaunchLog,setTerminalExpanded,terminal,terminalCanRestart,terminalCanRetry,terminalCommandPreview,terminalDisplayed,terminalExpanded,terminalError,terminalIndicatorLabel,terminalIndicatorState,terminalStatus,terminalSubtitle,terminalTitle,terminalVisible,terminalWindowStorageKey,terminalWindowVisible,toolbarTeleportTarget,visible}}function launchPreviewEmptyText({launchStatusText="",launchStarting=false,loadError="",loading=false,outputTargetsUnavailable=false,previewInFlightText="",previewManualStartAvailable=false,previewMessage="",previewStartUnavailableReason="",previewState="idle",terminalIsRunning=false}={}){const message=String(previewMessage||"").trim();const inFlightText=String(previewInFlightText||"").trim();const startUnavailableReason=String(previewStartUnavailableReason||"").trim();if(["failed","project_closed","stopped"].includes(previewState)){return message||"Preview could not be opened."}if(inFlightText){return inFlightText}if(launchStarting||previewState==="starting"||terminalIsRunning){return"Preparing preview."}if(startUnavailableReason){return startUnavailableReason}if(previewManualStartAvailable){return"Preview is ready to start."}if(launchStatusText){return launchStatusText}if(loadError){return`Preview status request failed: ${String(loadError||"").trim()}`}if(loading){return"Checking preview status."}if(outputTargetsUnavailable){return"This project does not declare an application output."}return"Preview will appear here when it is ready."}function outputTargetLabel(outputTarget=null){const label=String((outputTarget==null?void 0:outputTarget.label)||(outputTarget==null?void 0:outputTarget.id)||"").trim();return label||"selected output target"}function launchPreviewInFlightText({activeOutputTarget=null,embeddedStartTarget=null,launchStarting=false,launchWaiting=false,launchStatusText="",loading=false,operationBusy=false,previewDisplayedAddress="",previewEmbedUnavailableReason="",previewLoadingOverlayVisible=false,previewUrl="",terminalCanRestart=false,terminalCanRetry=false,terminalIsRunning=false}={}){const embedUnavailableReason=String(previewEmbedUnavailableReason||"").trim();if(embedUnavailableReason){return embedUnavailableReason}const target=activeOutputTarget||embeddedStartTarget;const launchStatus=String(launchStatusText||"").trim();if(launchStarting){return`Starting preview: ${outputTargetLabel(embeddedStartTarget||activeOutputTarget)}.`}if(launchWaiting){return"Waiting for the assistant operation to finish. Preview will retry automatically."}if(operationBusy&&terminalCanRestart){return`Restarting preview: ${outputTargetLabel(target)}.`}if(operationBusy&&terminalCanRetry){return`Retrying preview: ${outputTargetLabel(target)}.`}if(operationBusy){return`Trying preview: ${outputTargetLabel(embeddedStartTarget||activeOutputTarget)}.`}if(terminalIsRunning&&!previewUrl){return`Waiting for preview URL from ${outputTargetLabel(target)}.`}if(previewLoadingOverlayVisible&&previewUrl){const address=String(previewDisplayedAddress||"").trim();const page=address?`: ${address}`:"";return`Loading preview page${page}. The server is ready; the browser is still loading the app.`}if(loading){return launchStatus||"Checking preview status."}return""}function launchPreviewStatusText({attempt=0,loadError="",loading=false}={}){const count=Math.max(1,Number(attempt)||1);const error=String(loadError||"").trim();if(error&&loading){return`Retrying preview status (attempt ${count}).`}if(error){return`Preview status request failed (attempt ${count}).`}if(loading){return`Checking preview status (attempt ${count}).`}return""}function previewOpeningOverlayVisible({loadedFrameRequestId=0,previewFrameRequestId=0,previewUrl=""}={}){const requestId=Math.max(0,Number(previewFrameRequestId)||0);return Boolean(String(previewUrl||"").trim()&&requestId>0&&requestId!==Math.max(0,Number(loadedFrameRequestId)||0))}function launchPreviewIssue({launchError="",message="",state="idle"}={}){if(state==="ready"){return null}const operationError=String(launchError||"").trim();const text=String(message||"").trim();if(operationError){return{message:operationError,title:"Preview could not be started"}}if(state==="stale"){return{message:text||"Server-side app files changed after this preview started. Restart preview to run the current code.",title:"Preview may be stale"}}if(state==="failed"){return{message:text||"Preview could not be opened.",title:"Preview could not be opened"}}if(state==="stopped"){return{message:text||"The preview process exited.",title:"Preview stopped"}}return null}function launchPreviewNotice({launchError="",message="",state="idle"}={}){const issue=launchPreviewIssue({launchError,message,state});if(state==="stale"&&!String(launchError||"").trim()){return null}if(issue){return issue}if(state==="project_closed"){return{message:String(message||"Project is closed.").trim(),title:"Project is closed"}}return null}function launchToolbarDockShouldShow({embeddedPreview=false,embeddedTerminalVisible=false,previewIssueVisible=false,terminalDockVisible=false,terminalVisible=false}={}){if(!embeddedPreview){return Boolean(terminalDockVisible)}if(previewIssueVisible){return true}return Boolean(terminalVisible||embeddedTerminalVisible)}const PREVIEW_CAPTURE_FRAME_TIMEOUT_MS=5e3;const PREVIEW_CAPTURE_MEDIA_OPTIONS=Object.freeze({audio:false,monitorTypeSurfaces:"exclude",preferCurrentTab:true,selfBrowserSurface:"include",surfaceSwitching:"exclude",video:{displaySurface:"browser"}});function positiveNumber(value){const number=Number(value);return Number.isFinite(number)&&number>0?number:0}function previewVisibleViewportRect(rect={},viewport={}){const viewportWidth=positiveNumber(viewport.width);const viewportHeight=positiveNumber(viewport.height);if(!viewportWidth||!viewportHeight){return null}const rectLeft=Number(rect.left)||0;const rectTop=Number(rect.top)||0;const rectRight=Number.isFinite(Number(rect.right))?Number(rect.right):rectLeft+positiveNumber(rect.width);const rectBottom=Number.isFinite(Number(rect.bottom))?Number(rect.bottom):rectTop+positiveNumber(rect.height);const left=Math.max(0,Math.min(viewportWidth,rectLeft));const top=Math.max(0,Math.min(viewportHeight,rectTop));const right=Math.max(0,Math.min(viewportWidth,rectRight));const bottom=Math.max(0,Math.min(viewportHeight,rectBottom));if(right<=left||bottom<=top){return null}return{bottom,height:bottom-top,left,right,top,viewportHeight,viewportWidth,width:right-left}}function previewCaptureCrop(visibleRect={},frame={}){const frameWidth=Math.floor(positiveNumber(frame.width));const frameHeight=Math.floor(positiveNumber(frame.height));const viewportWidth=positiveNumber(visibleRect.viewportWidth);const viewportHeight=positiveNumber(visibleRect.viewportHeight);if(!frameWidth||!frameHeight||!viewportWidth||!viewportHeight){return null}const scaleX=frameWidth/viewportWidth;const scaleY=frameHeight/viewportHeight;const sourceLeft=Math.max(0,Math.min(frameWidth,Math.floor(Number(visibleRect.left)*scaleX)));const sourceTop=Math.max(0,Math.min(frameHeight,Math.floor(Number(visibleRect.top)*scaleY)));const sourceRight=Math.max(sourceLeft,Math.min(frameWidth,Math.ceil(Number(visibleRect.right)*scaleX)));const sourceBottom=Math.max(sourceTop,Math.min(frameHeight,Math.ceil(Number(visibleRect.bottom)*scaleY)));const width=sourceRight-sourceLeft;const height=sourceBottom-sourceTop;return width>0&&height>0?{height,sourceLeft,sourceTop,width}:null}function previewCaptureFileName(date=new Date,sequence=1){const captureDate=date instanceof Date?date:new Date(date);const timestamp=captureDate.toISOString().replace(/[:.]/gu,"-");return`vibe64-preview-${timestamp}-${String(sequence).padStart(2,"0")}.png`}function previewCaptureError(message,code=""){const error=new Error(message);error.code=code;return error}function previewCaptureErrorMessage(error){if((error==null?void 0:error.name)==="NotAllowedError"){return"Preview capture was not allowed. Click the eye again and choose This Tab."}if((error==null?void 0:error.name)==="NotFoundError"){return"This browser could not find a tab that it can capture."}if((error==null?void 0:error.name)==="NotReadableError"){return"The browser could not read the shared tab. Stop another screen capture and try again."}return String((error==null?void 0:error.message)||error||"Preview capture failed.").trim()||"Preview capture failed."}function previewCaptureAvailable({canAttach=false,displayed=false,loaded=false,supported=false,visible=false}={}){return Boolean(canAttach&&displayed&&loaded&&supported&&visible)}function stopMediaStream(stream){var _a,_b;for(const track of((_a=stream==null?void 0:stream.getTracks)==null?void 0:_a.call(stream))||[]){(_b=track==null?void 0:track.stop)==null?void 0:_b.call(track)}}function waitForPreviewVideoFrame(video,{clearTimeoutFn=globalThis.clearTimeout,requestAnimationFrameFn=globalThis.requestAnimationFrame,setTimeoutFn=globalThis.setTimeout,timeoutMs=PREVIEW_CAPTURE_FRAME_TIMEOUT_MS}={}){return new Promise((resolve,reject)=>{let frameCallbackId=0;let settled=false;const finish=(error=null)=>{if(settled){return}settled=true;clearTimeoutFn(timeoutId);if(frameCallbackId&&typeof video.cancelVideoFrameCallback==="function"){video.cancelVideoFrameCallback(frameCallbackId)}if(error){reject(error);return}resolve()};const frameReady=()=>{if(!positiveNumber(video.videoWidth)||!positiveNumber(video.videoHeight)){finish(previewCaptureError("The shared tab did not provide an image frame.","frame_unavailable"));return}finish()};const timeoutId=setTimeoutFn(()=>{finish(previewCaptureError("The shared tab did not provide an image frame in time.","frame_timeout"))},timeoutMs);if(typeof video.requestVideoFrameCallback==="function"){frameCallbackId=video.requestVideoFrameCallback(frameReady);return}const requestFrame=typeof requestAnimationFrameFn==="function"?requestAnimationFrameFn:callback=>setTimeoutFn(callback,16);requestFrame(()=>requestFrame(frameReady))})}function previewCanvasBlob(canvas){return new Promise((resolve,reject)=>{canvas.toBlob(blob=>{if(!blob){reject(previewCaptureError("The preview image could not be encoded.","encode_failed"));return}resolve(blob)},"image/png")})}function createVibe64PreviewCaptureSession({clearTimeoutFn=globalThis.clearTimeout,documentObject=globalThis.document,fileConstructor=globalThis.File,mediaDevices=(_a=>(_a=globalThis.navigator)==null?void 0:_a.mediaDevices)(),now=()=>new Date,onEnded=()=>null,requestAnimationFrameFn=globalThis.requestAnimationFrame,setTimeoutFn=globalThis.setTimeout}={}){let captureGeneration=0;let captureSequence=0;let captureStream=null;let captureTrack=null;let captureVideo=null;function supported(){return Boolean((mediaDevices==null?void 0:mediaDevices.getDisplayMedia)&&(documentObject==null?void 0:documentObject.createElement)&&typeof fileConstructor==="function")}function release({stopTracks=false}={}){var _a2,_b;const stream=captureStream;if(captureTrack){(_a2=captureTrack.removeEventListener)==null?void 0:_a2.call(captureTrack,"ended",handleTrackEnded)}(_b=captureVideo==null?void 0:captureVideo.pause)==null?void 0:_b.call(captureVideo);if(captureVideo){captureVideo.srcObject=null}captureStream=null;captureTrack=null;captureVideo=null;if(stopTracks){stopMediaStream(stream)}}function handleTrackEnded(){captureGeneration+=1;release();onEnded()}async function ensureCaptureVideo(){var _a2,_b,_c;if((captureTrack==null?void 0:captureTrack.readyState)!=="ended"&&captureVideo){return captureVideo}release({stopTracks:true});if(!supported()){throw previewCaptureError("This browser cannot capture the visible preview.","unsupported")}const generation=captureGeneration;const stream=await mediaDevices.getDisplayMedia(PREVIEW_CAPTURE_MEDIA_OPTIONS);if(generation!==captureGeneration){stopMediaStream(stream);throw previewCaptureError("Preview capture was cancelled.","capture_cancelled")}const track=((_a2=stream==null?void 0:stream.getVideoTracks)==null?void 0:_a2.call(stream)[0])||null;const displaySurface=String(((_b=track==null?void 0:track.getSettings)==null?void 0:_b.call(track).displaySurface)||"");if(!track||track.readyState==="ended"){stopMediaStream(stream);throw previewCaptureError("The browser did not share a live tab.","track_unavailable")}if(displaySurface&&displaySurface!=="browser"){stopMediaStream(stream);throw previewCaptureError("Choose the current Vibe64 tab, not a window or screen.","wrong_surface")}const video=documentObject.createElement("video");video.autoplay=false;video.muted=true;video.playsInline=true;video.srcObject=stream;if("contentHint"in track){track.contentHint="detail"}captureStream=stream;captureTrack=track;captureVideo=video;(_c=track.addEventListener)==null?void 0:_c.call(track,"ended",handleTrackEnded);return video}async function capture(getVisibleRect){const generation=captureGeneration;const video=await ensureCaptureVideo();try{await video.play();await waitForPreviewVideoFrame(video,{clearTimeoutFn,requestAnimationFrameFn,setTimeoutFn});if(generation!==captureGeneration){throw previewCaptureError("Preview capture was cancelled.","capture_cancelled")}const visibleRect=typeof getVisibleRect==="function"?getVisibleRect():null;if(!visibleRect){throw previewCaptureError("The preview moved out of view before it could be captured.","preview_not_visible")}const crop=previewCaptureCrop(visibleRect,{height:video.videoHeight,width:video.videoWidth});if(!crop){throw previewCaptureError("The visible preview area could not be captured.","crop_unavailable")}const canvas=documentObject.createElement("canvas");canvas.height=crop.height;canvas.width=crop.width;const context=canvas.getContext("2d");if(!context){throw previewCaptureError("The browser could not create the preview image.","canvas_unavailable")}context.drawImage(video,crop.sourceLeft,crop.sourceTop,crop.width,crop.height,0,0,crop.width,crop.height);const blob=await previewCanvasBlob(canvas);captureSequence+=1;const capturedAt=now();return new fileConstructor([blob],previewCaptureFileName(capturedAt,captureSequence),{lastModified:capturedAt.getTime(),type:"image/png"})}finally{release({stopTracks:true})}}function stop(){captureGeneration+=1;release({stopTracks:true})}return{capture,stop,supported}}function useVibe64PreviewCapture({attachFile,captureSession=null,prepareFile=null,previewDisplayed,previewFrame,previewLoaded,scopeKey,windowObject=globalThis.window}={}){const busy=ref(false);const noticeColor=ref("success");const noticeText=ref("");const noticeVisible=ref(false);const visible=ref(false);const session=captureSession||createVibe64PreviewCaptureSession({onEnded:()=>{noticeColor.value="info";noticeText.value="Preview sharing ended. Click the eye to share this tab again.";noticeVisible.value=true}});let intersectionObserver=null;let mounted=false;function currentVisibleRect(){if(readRefOrGetterValue(previewDisplayed)!==true||readRefOrGetterValue(previewLoaded)!==true){return null}const frame=readRefOrGetterValue(previewFrame);if(!(frame==null?void 0:frame.getBoundingClientRect)||!windowObject){return null}return previewVisibleViewportRect(frame.getBoundingClientRect(),{height:windowObject.innerHeight,width:windowObject.innerWidth})}function refreshVisibility(){visible.value=Boolean(currentVisibleRect())}function disconnectObserver(){var _a;(_a=intersectionObserver==null?void 0:intersectionObserver.disconnect)==null?void 0:_a.call(intersectionObserver);intersectionObserver=null}function observeCurrentFrame(){disconnectObserver();const frame=readRefOrGetterValue(previewFrame);if(!frame){refreshVisibility();return}if(typeof(windowObject==null?void 0:windowObject.IntersectionObserver)==="function"){intersectionObserver=new windowObject.IntersectionObserver(refreshVisibility,{threshold:0});intersectionObserver.observe(frame)}refreshVisibility()}const supported=computed(()=>session.supported());const buttonVisible=computed(()=>previewCaptureAvailable({canAttach:typeof prepareFile==="function"||typeof attachFile==="function",displayed:readRefOrGetterValue(previewDisplayed)===true,loaded:readRefOrGetterValue(previewLoaded)===true,supported:supported.value,visible:visible.value}));async function capturePreview(){if(busy.value||!currentVisibleRect()||typeof prepareFile!=="function"&&typeof attachFile!=="function"){return false}busy.value=true;noticeVisible.value=false;try{const result=typeof prepareFile==="function"?await prepareFile({fileName:"Preview screenshot",produce:({signal}={})=>{var _a;const stopCapture=()=>session.stop();(_a=signal==null?void 0:signal.addEventListener)==null?void 0:_a.call(signal,"abort",stopCapture,{once:true});return session.capture(currentVisibleRect).finally(()=>{var _a2;(_a2=signal==null?void 0:signal.removeEventListener)==null?void 0:_a2.call(signal,"abort",stopCapture)})}}):await session.capture(currentVisibleRect).then(attachFile);const attached=Array.isArray(result)?result.length>0:Boolean(result);if(!attached){if(typeof prepareFile==="function"){return false}throw previewCaptureError("The preview image could not be attached to the current message.","attach_failed")}noticeText.value="";noticeVisible.value=false;return true}catch(error){if((error==null?void 0:error.code)==="capture_cancelled"){return false}noticeColor.value="error";noticeText.value=previewCaptureErrorMessage(error);noticeVisible.value=true;return false}finally{busy.value=false;refreshVisibility()}}watch(()=>readRefOrGetterValue(previewFrame),()=>{if(mounted){observeCurrentFrame()}},{flush:"post"});watch([()=>readRefOrGetterValue(previewDisplayed),()=>readRefOrGetterValue(previewLoaded)],refreshVisibility,{flush:"post"});watch(()=>readRefOrGetterValue(scopeKey),(nextKey,previousKey)=>{if(previousKey!==void 0&&nextKey!==previousKey){session.stop();noticeVisible.value=false}});onMounted(()=>{mounted=true;observeCurrentFrame()});onBeforeUnmount(()=>{mounted=false;disconnectObserver();session.stop()});return{busy,buttonVisible,capturePreview,noticeColor,noticeText,noticeVisible,refreshVisibility,supported,visible}}const PREVIEW_DIAGNOSTICS_MAX_TEXT_CHARACTERS=7e5;const PREVIEW_DIAGNOSTICS_MAX_VALUE_CHARACTERS=24e3;function clippedDiagnosticsValue(value,limit=PREVIEW_DIAGNOSTICS_MAX_VALUE_CHARACTERS){const text=String(value??"");return text.length>limit?`${text.slice(0,Math.max(0,limit-18))}… [truncated]`:text}function diagnosticsUrl(value=""){const text=clippedDiagnosticsValue(value,12e3);try{const url=new URL(text);url.searchParams.delete("vibe64_preview_token");return url.toString()}catch{return text}}function diagnosticsObject(value={}){return value&&typeof value==="object"&&!Array.isArray(value)?value:{}}function diagnosticsHeaders(value={}){return Object.fromEntries(Object.entries(diagnosticsObject(value)).slice(0,100).map(([name,headerValue])=>[clippedDiagnosticsValue(name,500),clippedDiagnosticsValue(headerValue,4e3)]))}function diagnosticsJson(value={}){return JSON.stringify(value,null,2)}function indentedDiagnosticsValue(value=""){const text=clippedDiagnosticsValue(value);return text?text.split("\n").map(line=>` ${line}`).join("\n"):" (empty)"}function previewConsoleEntryText(entry={}){const source=clippedDiagnosticsValue(entry.source||"console",80);const level=clippedDiagnosticsValue(entry.level||"log",40).toUpperCase();const timestamp=clippedDiagnosticsValue(entry.timestamp||"unknown time",80);return`[${timestamp}] [${level}] [${source}] ${clippedDiagnosticsValue(entry.text)}`}function previewNetworkEntryText(entry={}){const timestamp=clippedDiagnosticsValue(entry.timestamp||"unknown time",80);const kind=clippedDiagnosticsValue(entry.kind||"resource",80);const method=clippedDiagnosticsValue(entry.method||"GET",40).toUpperCase();const phase=clippedDiagnosticsValue(entry.phase||"complete",40);const status=Number(entry.status)||0;const statusText=clippedDiagnosticsValue(entry.statusText||"",500);const durationMs=Number.isFinite(Number(entry.durationMs))?Math.max(0,Number(entry.durationMs)):0;const details=[` Result: ${phase}${status?` · ${status}${statusText?` ${statusText}`:""}`:""}${durationMs?` · ${durationMs} ms`:""}`];const error=clippedDiagnosticsValue(entry.error||"");if(error){details.push(` Error:
|
|
1
|
+
import{H as watch,a as openBlock,b as createBlock,al as createSlots,y as renderList,w as withCtx,J as renderSlot,am as normalizeProps,an as guardReactiveProps,bh as Vibe64Terminal,r as createCommentVNode,P as usePaths,bm as useVibe64Terminal,bn as createWebSocketTerminalDriver,D as useEndpointResource,A as computed,E as useCommand,R as ROUTE_VISIBILITY_PUBLIC,Q as VIBE64_SURFACE_ID,M as useRealtimeEvent,C as onBeforeUnmount,B as ref,L as getHttpWebClient,eT as currentProjectSlugFromLocation,cE as stableLocalStorageKeyPart,aJ as vibe64ProjectScopedStorageKey,dJ as onBeforeMount,a6 as nextTick,aH as writeLocalStorageJson,aI as readLocalStorageJson,o as onMounted,_ as _export_sfc,au as inject,i as unref,c as createElementBlock,d as createBaseVNode,e as createVNode,bI as mdiChevronLeft,n as VBtn,$ as normalizeClass,cx as mdiDotsHorizontal,h as VIcon,bF as mdiChevronRight,dS as mdiChevronUp,a3 as withModifiers,be as mdiArrowLeft,O as VMenu,a$ as VList,F as Fragment,b0 as VListItem,N as mergeProps,eU as mdiRoutes,aC as withDirectives,em as vModelText,a8 as withKeys,bd as isRef,aj as mdiRefresh,cw as mdiContentCopy,V as VCard,a4 as VCardItem,eV as mdiAccountCircleOutline,br as VDivider,eW as mdiAccountOffOutline,I as VAlert,j as createTextVNode,t as toDisplayString,eX as mdiAccountSwitchOutline,dv as mdiOpenInNew,ak as mdiConsoleLine,eY as mdiPowerCycle,bq as mdiPlayCircleOutline,eZ as mdiDownloadOutline,ai as VChip,k as VCardText,q as mdiAlertCircleOutline,l as VCardActions,aY as Teleport,e_ as mdiWebClock,ad as resolveDynamicComponent,g as VCardTitle,a9 as VTextField,z as VSpacer,p as VDialog,e$ as VSnackbar}from"./index-C4KnwA0g.js";import{v as vibe64OutputTerminalWebSocketUrl,V as VIBE64_RESOURCE_RECOVERY_KEY}from"./_slug_-B3fqw8Sl.js";import{V as Vibe64TemporaryAiFixAction}from"./vibe64RepositoryRealtime-C2WPn5do.js";import{c as VIBE64_SESSIONS_API_SUFFIX,q as vibe64OutputRunPath,Z as vibe64OutputRunStopPath,_ as vibe64PreviewIdentityPath,V as VIBE64_SESSION_CHANGED_EVENT,v as vibe64SessionPath,$ as vibe64SessionPreviewStatePath,a0 as vibe64OutputsPath,a1 as vibe64OutputsQueryKey,a2 as vibe64OutputResultPath}from"./vibe64SessionRequestConfig-uGWcyQY6.js";import{r as readRefOrGetterValue}from"./vueRefOrGetterValue-CV9c3oBd.js";import{a as vibe64SessionDebugLog,b as vibe64SessionDebugError,v as vibe64SessionSourcePath}from"./vibe64SessionPanelModel-DDaXjAJ_.js";import{i as isArchivedVibe64Session,b as vibe64SessionRevision}from"./vibe64SessionViewModel-C4e2otoM.js";import{v as vibe64RealtimeOriginPayload,b as vibe64RealtimePayloadFromCurrentTab}from"./vibe64BrowserTabOrigin-DDSCqr3B.js";import{u as useVibe64ProjectSlug}from"./useVibe64ProjectScope-DcDkjbLT.js";import"./Vibe64AuthSettingsButton-CKOCL-kl.js";import"./studioGateApi-BwBnOYBp.js";import"./vibe64AccountConnectionsDialog-Cd1-kEer.js";import"./VTabs-CQq9CAuT.js";import"./Vibe64AsyncModuleState-DuuzlJDp.js";import"./vibe64ApiResponses-COQ3JIKv.js";import"./VTextarea-Duvzvmjq.js";import"./Vibe64SessionFiles-BSoB7Xrs.js";import"./useVibe64ConversationLog-BjnpqM9K.js";import"./definitions-ChGXm26a.js";import"./index-BYZl5lR4.js";import"./base-DDNBxAg7.js";import"./VRadioGroup-BuRMvs7d.js";import"./vibe64SessionInfo-8kuxgD5r.js";import"./Vibe64DashboardShell-DMT8aOp1.js";import"./placement-Cyt3SnRe.js";import"./vibe64SessionToolDefinitions-D5CgOIqa.js";import"./useVibe64SessionData-BHLSmuPm.js";import"./useVibe64SessionSelection-G6KQKJxb.js";import"./route-block-D_Po64gA.js";const _sfc_main$1={__name:"Vibe64LongRunningTerminal",props:{commandPreview:{default:"",type:String},error:{default:"",type:String},errorTitle:{default:"Run output needs attention",type:String},fill:{default:false,type:Boolean},floatingStorageKey:{default:"",type:String},height:{default:"clamp(18rem, 48vh, 34rem)",type:String},open:{default:false,type:Boolean},presentation:{default:"floating",type:String},showCopy:{default:true,type:Boolean},showInterrupt:{default:true,type:Boolean},stage:{default:"",type:String},status:{default:"",type:String},subtitle:{default:"",type:String},surfaceClass:{default:"",type:[String,Array,Object]},surfaceStyle:{default:null,type:[String,Array,Object]},terminal:{required:true,type:Object},title:{default:"Run output",type:String}},emits:["copy","interrupt","retry","update:open"],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const forwardedSlots=["actions-after","actions-before","before-terminal","error-actions","footer","heading","overlay"];function hide(){emit("update:open",false)}watch(()=>props.open,open=>{var _a,_b;if(!open){(_b=(_a=props.terminal)==null?void 0:_a.closeTerminalSocket)==null?void 0:_b.call(_a)}});return(_ctx,_cache)=>{return __props.open?(openBlock(),createBlock(Vibe64Terminal,{key:0,collapsible:false,"command-preview":__props.commandPreview,"disconnect-when-hidden":true,error:__props.error,"error-title":__props.errorTitle,expanded:true,fill:__props.fill,"floating-storage-key":__props.floatingStorageKey,height:__props.height,"mobile-takeover":"",presentation:__props.presentation,"show-close":"","show-copy":__props.showCopy,"show-interrupt":__props.showInterrupt,stage:__props.stage,status:__props.status,subtitle:__props.subtitle,"surface-class":__props.surfaceClass,"surface-style":__props.surfaceStyle,terminal:__props.terminal,title:__props.title,visible:true,onClose:hide,onCopy:_cache[0]||(_cache[0]=$event=>_ctx.$emit("copy",$event)),onInterrupt:_cache[1]||(_cache[1]=$event=>_ctx.$emit("interrupt")),onRetry:_cache[2]||(_cache[2]=$event=>_ctx.$emit("retry"))},createSlots({_:2},[renderList(forwardedSlots,slotName=>{return{name:slotName,fn:withCtx(slotProps=>[renderSlot(_ctx.$slots,slotName,normalizeProps(guardReactiveProps(slotProps||{})))])}})]),1032,["command-preview","error","error-title","fill","floating-storage-key","height","presentation","show-copy","show-interrupt","stage","status","subtitle","surface-class","surface-style","terminal","title"])):createCommentVNode("",true)}}};function preferredPreviewTarget(outputTargets=[]){const targets=(Array.isArray(outputTargets)?outputTargets:[]).filter(target=>{var _a;return((_a=target==null?void 0:target.presentation)==null?void 0:_a.kind)==="web"});return targets.find(target=>(target==null?void 0:target.default)===true)||targets[0]||null}function managedPreviewTarget(outputTargets=[]){const availableTargets=(Array.isArray(outputTargets)?outputTargets:[]).filter(target=>(target==null?void 0:target.available)!==false);return preferredPreviewTarget(availableTargets)}const LAUNCH_BROWSER_WINDOW_FEATURES="popup,width=1400,height=900,left=80,top=60";const LAUNCH_PREVIEW_TOOLBAR_POSITIONS=Object.freeze(["left","center","right"]);const AUTO_START_ATTEMPT_COOLDOWN_MS=7e3;const AUTO_START_STABILITY_DELAY_MS=750;const LAUNCH_STATUS_RETRY_LIMIT=2;const LAUNCH_STATUS_RETRY_BASE_DELAY_MS=1e3;const LAUNCH_STATUS_RETRY_MAX_DELAY_MS=5e3;const LAUNCH_STATUS_IDLE_RECOVERY_INITIAL_DELAY_MS=1200;const LAUNCH_STATUS_IDLE_RECOVERY_INTERVAL_MS=3e3;const LAUNCH_STATUS_IDLE_RECOVERY_LIMIT=6;const TERMINAL_STOP_POLL_INTERVAL_MS=100;const TERMINAL_STOP_POLL_ATTEMPTS=50;const OUTPUTS_REALTIME_REASONS=new Set(["output-target-started","output-target-ready","output-target-closed","output-target-stopped","output-target-stale-cleared","output-results-ready","output-results-failed"]);function browserCanOpenTarget(target={}){return String(target.kind||"url")==="url"&&Boolean(String(target.href||"").trim())}function launchBrowserTargetName(session={},projectSlug=currentProjectSlugFromLocation()){const projectScope=String(projectSlug||"").trim()||String((session==null?void 0:session.sessionId)||(session==null?void 0:session.id)||"project").trim();return`vibe64-launch-${stableLocalStorageKeyPart(projectScope)}`}function launchTerminalStorageKey(session={},projectSlug=currentProjectSlugFromLocation()){return vibe64ProjectScopedStorageKey(`vibe64:floating-terminal:launch:${launchBrowserTargetName(session,projectSlug)}`,projectSlug)}function launchPreviewToolbarStorageKey(session={},projectSlug=currentProjectSlugFromLocation()){return vibe64ProjectScopedStorageKey(`vibe64:launch-preview-toolbar:${launchBrowserTargetName(session,projectSlug)}`,projectSlug)}function launchPreviewLocationStorageKey(session={},projectSlug=currentProjectSlugFromLocation()){return vibe64ProjectScopedStorageKey(`vibe64:launch-preview-location:${launchBrowserTargetName(session,projectSlug)}`,projectSlug)}function normalizeLaunchPreviewToolbarPosition(value=""){const normalized=String(value||"").trim();return LAUNCH_PREVIEW_TOOLBAR_POSITIONS.includes(normalized)?normalized:"center"}function nextLaunchPreviewToolbarPosition(currentPosition="center",direction=0){const currentIndex=LAUNCH_PREVIEW_TOOLBAR_POSITIONS.indexOf(normalizeLaunchPreviewToolbarPosition(currentPosition));const nextIndex=Math.min(LAUNCH_PREVIEW_TOOLBAR_POSITIONS.length-1,Math.max(0,currentIndex+Math.sign(Number(direction)||0)));return LAUNCH_PREVIEW_TOOLBAR_POSITIONS[nextIndex]||"center"}function openLaunchBrowserTarget(target={},session={},browserWindow=null,projectSlug=currentProjectSlugFromLocation()){if(!browserCanOpenTarget(target)){return null}const activeWindow=browserWindow||(typeof window!=="undefined"?window:null);if(!(activeWindow==null?void 0:activeWindow.open)){return null}const href=launchBrowserTargetHref(target,activeWindow);const openedWindow=activeWindow.open(href,launchBrowserTargetName(session,projectSlug),LAUNCH_BROWSER_WINDOW_FEATURES);if(!openedWindow){return null}try{openedWindow.opener=null}catch{}if(typeof openedWindow.focus==="function"){openedWindow.focus()}return openedWindow}function launchBrowserTargetHref(target={},browserWindow=null){var _a;const studioHref=String(((_a=browserWindow==null?void 0:browserWindow.location)==null?void 0:_a.href)||localPreviewBrowserHref()).trim();return resolveLaunchPreviewDestination([target],{studioHref}).displayHref}function outputTargetWorktreePath(session={}){return vibe64SessionSourcePath(session)}function launchControlsSessionCanRun(session={}){const metadata=(session==null?void 0:session.metadata)&&typeof session.metadata==="object"&&!Array.isArray(session.metadata)?session.metadata:{};return Boolean(String((session==null?void 0:session.sessionId)||"").trim()&&!isArchivedVibe64Session(session)&&!String(metadata.session_closing_reason||"").trim()&&outputTargetWorktreePath(session))}function launchControlsCanLoadTargets({displayed=true,session={},sourceOperationsSuspended=false}={}){return Boolean(displayed&&sourceOperationsSuspended!==true&&launchControlsSessionCanRun(session))}function launchControlScopeKey(projectSlug="",sessionId=""){return`${String(projectSlug||"").trim()}::${String(sessionId||"").trim()}`}function outputTargetsRealtimeShouldRefresh({localLaunchStarting=false,payload={}}={},sessionId=""){var _a;const normalizedSessionId=String(sessionId||"").trim();const changedSessionId=String(payload.sessionId||payload.entityId||"").trim();if(!normalizedSessionId||changedSessionId!==normalizedSessionId){return false}const reason=String(payload.reason||"").trim();if(reason==="output-target-started"&&(localLaunchStarting||vibe64RealtimePayloadFromCurrentTab(payload))){return false}return((_a=payload.clientRefresh)==null?void 0:_a.includeOutputs)===true||!reason||OUTPUTS_REALTIME_REASONS.has(reason)}function shouldScheduleLaunchAutoStart({autoStartKey="",externalBusy=false,key="",loading=false,operationBusy=false,sessionLaunchable=true,sessionId="",target=null,terminalDisplayed=true,terminalVisible=false}={}){return Boolean(sessionId&&sessionLaunchable&&target&&target.available!==false&&key&&!externalBusy&&!loading&&!terminalVisible&&!operationBusy&&terminalDisplayed&&autoStartKey!==key)}function autoStartOutputsLoading({outputTargetsLoading=false,outputTargetsSettled=false}={}){return Boolean(outputTargetsLoading||!outputTargetsSettled)}function launchStatusRetryDelay(attempt=0){const attemptNumber=Math.max(0,Number(attempt)||0);return Math.min(LAUNCH_STATUS_RETRY_MAX_DELAY_MS,LAUNCH_STATUS_RETRY_BASE_DELAY_MS*(attemptNumber+1))}function normalizeHttpStatus(value){const status=Number(value);return Number.isInteger(status)?status:null}function launchStatusShouldRetry(failureCount=0,error=null){if(Math.max(0,Number(failureCount)||0)>=LAUNCH_STATUS_RETRY_LIMIT){return false}if(launchStatusAgentWriteBusy(error)){return true}const status=normalizeHttpStatus((error==null?void 0:error.status)??(error==null?void 0:error.statusCode));return status==null||status===0||status===408||status===425||status===429||status>=500}function launchStatusErrorText({error=null,fallback="",path=""}={}){const fallbackText=String(fallback||"").trim();if(!error){return fallbackText}if(launchStatusAgentWriteBusy(error)){return""}const message=String((error==null?void 0:error.message)||fallbackText||"Request failed.").trim();const status=normalizeHttpStatus((error==null?void 0:error.status)??(error==null?void 0:error.statusCode));const code=String((error==null?void 0:error.code)||"").trim();const requestPath=String(path||(error==null?void 0:error.path)||(error==null?void 0:error.url)||"").trim();const details=[status===0?"network":status==null?"":`HTTP ${status}`,code,requestPath].filter(Boolean).join(", ");return details?`${message} (${details})`:message}function launchStatusAgentWriteBusy(error=null){var _a,_b,_c,_d;return String((error==null?void 0:error.code)||((_a=error==null?void 0:error.response)==null?void 0:_a.code)||((_d=(_c=(_b=error==null?void 0:error.response)==null?void 0:_b.errors)==null?void 0:_c[0])==null?void 0:_d.code)||"").trim()==="vibe64_agent_write_mode_busy"}function browserSessionStorage(){if(typeof window==="undefined"||!window.sessionStorage){return null}return window.sessionStorage}function launchAutoStartAttemptStorageKey(key=""){const normalized=String(key||"").trim();return normalized?`vibe64:launch-auto-start:${stableLocalStorageKeyPart(normalized)}`:""}function readLaunchAutoStartAttemptCooldown(key="",{now=Date.now(),storage=browserSessionStorage()}={}){const storageKey=launchAutoStartAttemptStorageKey(key);if(!storageKey||!storage){return 0}try{const record=JSON.parse(storage.getItem(storageKey)||"null");const startedAt=Number((record==null?void 0:record.startedAt)||0);if(String((record==null?void 0:record.key)||"")!==String(key||"")||!Number.isFinite(startedAt)||startedAt<=0){clearLaunchAutoStartAttempt(key,{storage});return 0}const remainingMs=AUTO_START_ATTEMPT_COOLDOWN_MS-(Number(now)-startedAt);if(remainingMs<=0){clearLaunchAutoStartAttempt(key,{storage});return 0}return remainingMs}catch{clearLaunchAutoStartAttempt(key,{storage});return 0}}function writeLaunchAutoStartAttempt(key="",{now=Date.now(),storage=browserSessionStorage()}={}){const storageKey=launchAutoStartAttemptStorageKey(key);if(!storageKey||!storage){return false}try{storage.setItem(storageKey,JSON.stringify({key:String(key||""),startedAt:Number(now)}));return true}catch{return false}}function clearLaunchAutoStartAttempt(key="",{storage=browserSessionStorage()}={}){const storageKey=launchAutoStartAttemptStorageKey(key);if(!storageKey||!storage){return}try{storage.removeItem(storageKey)}catch{}}function delay(milliseconds=0){return new Promise(resolve=>setTimeout(resolve,milliseconds))}function launchTerminalIsReady(metadata={}){return(metadata==null?void 0:metadata.launchReady)===true||(metadata==null?void 0:metadata.launchReady)==="true"}function launchPreviewRequiresProxy(metadata={}){return Boolean(String((metadata==null?void 0:metadata.previewAuth)||"").trim())}function terminalSessionMissingError(message=""){return/terminal session not found/iu.test(String(message||""))}function localPreviewBrowserHref(){var _a;if(typeof window==="undefined"){return""}return String(((_a=window.location)==null?void 0:_a.href)||"")}function resolveLaunchPreviewDestination(actions=[],{requirePreviewProxy=false,studioHref=localPreviewBrowserHref()}={}){const action=Array.isArray(actions)?actions.find(candidate=>browserCanOpenTarget(candidate))||null:null;const targetHref=String((action==null?void 0:action.href)||"").trim();const previewHref=String((action==null?void 0:action.previewHref)||"").trim();const displayHref=previewHref&&remoteStudioCannotEmbedLoopbackTarget(targetHref,studioHref)?sameSiteLoopbackPreviewUrl(previewHref,studioHref):sameSiteLoopbackPreviewUrl(targetHref,studioHref);const embedCandidate=previewHref||(requirePreviewProxy?"":targetHref);if(!embedCandidate){return{action,displayHref,embedHref:"",unavailableReason:requirePreviewProxy&&action?"Waiting for the hosted preview URL.":""}}if(remoteStudioCannotEmbedLoopbackTarget(embedCandidate,studioHref)){return{action,displayHref,embedHref:"",unavailableReason:"This preview URL is only reachable from the server. Restart the preview to create a hosted preview URL."}}if(browserWouldBlockEmbeddedPreview(embedCandidate,studioHref)){return{action,displayHref,embedHref:"",unavailableReason:"HTTP previews cannot be embedded from HTTPS Studio. Open the preview in a browser tab, or open Studio over HTTP for embedded preview."}}return{action,displayHref,embedHref:sameSiteLoopbackPreviewUrl(embedCandidate,studioHref),unavailableReason:""}}function normalizeLaunchPreview(preview={}){const source=preview&&typeof preview==="object"&&!Array.isArray(preview)?preview:{};const state=["idle","starting","ready","stale","stopped","failed","project_closed"].includes(source.state)?source.state:"idle";const fallbackMessage=state==="idle"?"Run an output target first.":state==="starting"?"Preparing preview.":state==="ready"?"Preview is ready.":state==="stale"?"Server-side app files changed after this preview started.":state==="project_closed"?"Project is closed.":"Preview could not be opened.";const recovery=source.recovery&&typeof source.recovery==="object"&&!Array.isArray(source.recovery)?source.recovery:null;return{canRestart:source.canRestart===true,canShowLog:source.canShowLog===true,canStart:source.canStart===true,href:String(source.href||"").trim(),message:String(source.message||fallbackMessage).trim()||fallbackMessage,reason:String(source.reason||"").trim(),recovery,state,targetHref:String(source.targetHref||"").trim(),terminalId:String(source.terminalId||"").trim()}}function plainObject(value){return value&&typeof value==="object"&&!Array.isArray(value)?value:{}}function launchPreviewFromStatus(status={}){const source=plainObject(status);const previewSource=plainObject(source.preview);const preview=normalizeLaunchPreview(previewSource);if(previewSource.state||preview.href||preview.targetHref){return preview}const previewTarget=plainObject(source.previewTarget);const openTarget=plainObject(source.openTarget);const href=String(previewTarget.href||openTarget.previewHref||"").trim();if(!href||previewTarget.available===false||openTarget.available===false){return preview}const activeTerminal=plainObject(source.activeTerminal);return normalizeLaunchPreview({canRestart:Boolean(activeTerminal.id||plainObject(source.lastOutputTarget).id),canShowLog:Boolean(activeTerminal.id),href,message:"Preview is ready.",state:"ready",targetHref:String(previewTarget.targetHref||openTarget.href||"").trim(),terminalId:String(activeTerminal.id||"").trim()})}function sameSiteLoopbackPreviewUrl(previewHref="",studioHref=""){const previewText=String(previewHref||"").trim();const studioText=String(studioHref||"").trim();if(!previewText||!studioText){return previewText}try{const previewUrl=new URL(previewText);const studioUrl=new URL(studioText);if(previewUrl.protocol!==studioUrl.protocol||!isLoopbackBrowserHost(previewUrl.hostname)||!isLoopbackBrowserHost(studioUrl.hostname)||previewUrl.hostname===studioUrl.hostname){return previewText}previewUrl.hostname=studioUrl.hostname;return previewUrl.toString()}catch{return previewText}}function remoteStudioCannotEmbedLoopbackTarget(previewHref="",studioHref=""){const previewText=String(previewHref||"").trim();const studioText=String(studioHref||"").trim();if(!previewText||!studioText){return false}try{const previewUrl=new URL(previewText);const studioUrl=new URL(studioText);return isLoopbackBrowserHost(previewUrl.hostname)&&!isLoopbackBrowserHost(studioUrl.hostname)}catch{return false}}function browserWouldBlockEmbeddedPreview(previewHref="",studioHref=""){const previewText=String(previewHref||"").trim();const studioText=String(studioHref||"").trim();if(!previewText||!studioText){return false}try{const previewUrl=new URL(previewText);const studioUrl=new URL(studioText);return studioUrl.protocol==="https:"&&previewUrl.protocol==="http:"&&!isLoopbackBrowserHost(previewUrl.hostname)}catch{return false}}function isLoopbackBrowserHost(hostname=""){const normalized=String(hostname||"").trim().toLowerCase();return normalized==="localhost"||normalized==="127.0.0.1"||normalized==="::1"||normalized==="[::1]"}function useVibe64OutputControls({autoStartManagedPreview=()=>false,autoStartTargetId=()=>"",busy=()=>false,embeddedPreview=()=>false,previewDisplayed=()=>true,session=null,sourceOperationsSuspended=()=>false,windowDisplayed=()=>true}={}){const paths=usePaths();const projectSlug=useVibe64ProjectSlug();const operationBusy=ref(false);const launchError=ref("");const refusedAdmissionId=ref("");const launchStarting=ref(false);const launchWaiting=ref(false);const terminalExpanded=ref(false);const autoStartKey=ref("");const autoStartCooldownVersion=ref(0);const launchStatusAttempt=ref(0);const launchStatusIdleRecoveryCount=ref(0);const launchStatusIdleRecoveryExhausted=computed(()=>launchStatusIdleRecoveryCount.value>=LAUNCH_STATUS_IDLE_RECOVERY_LIMIT);const outputTargetsSettledForAutoStart=ref(false);const sourceOperationsResumePending=ref(false);let attachedTerminalId="";let autoStartTimer=0;let autoStartCooldownTimer=0;let scheduledAutoStartKey="";let launchStatusAttemptLoading=false;let launchStatusAttemptScopeKey="";let launchStatusIdleRecoveryTimer=0;let launchStatusIdleRecoveryScopeKey="";const selectedSession=computed(()=>readRefOrGetterValue(session)||null);const sessionId=computed(()=>{var _a;return String(((_a=selectedSession.value)==null?void 0:_a.sessionId)||"")});const sessionRevision=computed(()=>vibe64SessionRevision(selectedSession.value));let outputTargetsRefreshSessionId=sessionId.value;let outputTargetsRefreshRevision=sessionRevision.value;const launchScopeKey=computed(()=>launchControlScopeKey(projectSlug.value,sessionId.value));const requestedAutoStartTargetId=computed(()=>String(readRefOrGetterValue(autoStartTargetId)||"").trim());const autoStartRequestKey=computed(()=>requestedAutoStartTargetId.value||(readRefOrGetterValue(autoStartManagedPreview)===true?"managed-preview":""));const terminalDisplayed=computed(()=>readRefOrGetterValue(windowDisplayed)!==false);const previewPaneDisplayed=computed(()=>readRefOrGetterValue(previewDisplayed)!==false);const launchSourceOperationsSuspended=computed(()=>readRefOrGetterValue(sourceOperationsSuspended)===true);const canLoadOutputs=computed(()=>launchControlsCanLoadTargets({displayed:terminalDisplayed.value,session:selectedSession.value||{},sourceOperationsSuspended:launchSourceOperationsSuspended.value}));const sessionsApiPath=computed(()=>paths.api(VIBE64_SESSIONS_API_SUFFIX,{surface:VIBE64_SURFACE_ID}));const outputTargetsPath=computed(()=>{return sessionId.value?vibe64OutputsPath(sessionsApiPath.value,sessionId.value):""});const terminalWindowStorageKey=computed(()=>launchTerminalStorageKey(selectedSession.value||{},projectSlug.value));const terminal=useVibe64Terminal({driver:createWebSocketTerminalDriver({webSocketUrl(terminalId){return vibe64OutputTerminalWebSocketUrl(sessionId.value,terminalId)}})});const{applyTerminalSession,closeTerminalSocket,connectTerminalSocket,disposeTerminalDisplay,disposeTerminalUi,resetTerminalDisplay,resetTerminalSessionState,sendCtrlC,terminalCommandPreview,terminalError,terminalExited,terminalExitCode,terminalMetadata,terminalOutput,terminalSessionId,terminalStarting,terminalStatus}=terminal;let disposed=false;const outputTargetsResource=useEndpointResource({enabled:canLoadOutputs,fallbackLoadError:"Outputs could not be loaded.",path:outputTargetsPath,queryOptions:{retry:launchStatusShouldRetry,retryDelay:launchStatusRetryDelay},queryKey:computed(()=>vibe64OutputsQueryKey(VIBE64_SURFACE_ID,ROUTE_VISIBILITY_PUBLIC,sessionId.value,projectSlug.value)),refreshOnPull:true,requestRecovery:false,realtime:null});const startTerminalCommand=useCommand({access:"never",apiSuffix:VIBE64_SESSIONS_API_SUFFIX,buildCommandOptions:(_payload,{context})=>({method:"POST",path:vibe64OutputRunPath(sessionsApiPath.value,context.sessionId)}),buildRawPayload:(_model,{context})=>({...vibe64RealtimeOriginPayload(),...context.forceRestart===true?{forceRestart:true}:{},outputTargetId:String(context.outputTargetId||"")}),fallbackRunError:"Output target could not be started.",messages:{error:"Output target could not be started."},onRunError(error){if(readRefOrGetterValue(embeddedPreview)){throw error}},ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:"vibe64.output-target.start",suppressSuccessMessage:true,surfaceId:VIBE64_SURFACE_ID,writeMethod:"POST"});const stopTerminalCommand=useCommand({access:"never",apiSuffix:VIBE64_SESSIONS_API_SUFFIX,buildCommandOptions:(_payload,{context})=>({method:"POST",path:vibe64OutputRunStopPath(sessionsApiPath.value,context.sessionId,context.terminalSessionId)}),fallbackRunError:"Output target could not be stopped.",messages:{error:"Output target could not be stopped."},ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:"vibe64.output-target.stop",suppressSuccessMessage:true,surfaceId:VIBE64_SURFACE_ID,writeMethod:"POST"});const closeTerminalCommand=useCommand({access:"never",apiSuffix:VIBE64_SESSIONS_API_SUFFIX,buildCommandOptions:(_payload,{context})=>({method:"DELETE",path:vibe64OutputRunPath(sessionsApiPath.value,context.sessionId,context.terminalSessionId)}),fallbackRunError:"Output target terminal could not close.",messages:{error:"Output target terminal could not close."},ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:"vibe64.output-target.close",suppressSuccessMessage:true,surfaceId:VIBE64_SURFACE_ID,writeMethod:"DELETE"});const selectPreviewIdentityCommand=useCommand({access:"never",apiSuffix:VIBE64_SESSIONS_API_SUFFIX,buildCommandOptions:(_payload,{context})=>({method:"POST",path:vibe64PreviewIdentityPath(sessionsApiPath.value,context.sessionId)}),buildRawPayload:(_model,{context})=>({...context.identityName?{identityName:context.identityName}:{},mode:context.mode}),fallbackRunError:"Preview identity could not be selected.",messages:{error:"Preview identity could not be selected."},ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:"vibe64.preview-identity.select",suppressSuccessMessage:true,surfaceId:VIBE64_SURFACE_ID,writeMethod:"POST"});const status=computed(()=>outputTargetsResource.data.value||{});const launchStatusLoadError=computed(()=>{var _a,_b;const error=((_b=(_a=outputTargetsResource.query)==null?void 0:_a.error)==null?void 0:_b.value)||null;return launchStatusErrorText({error,fallback:outputTargetsResource.loadError.value,path:outputTargetsPath.value})});const preview=computed(()=>launchPreviewFromStatus(status.value));const previewIdentity=computed(()=>{const value=status.value.previewIdentity;return value&&typeof value==="object"&&!Array.isArray(value)?value:{available:false,defaultMode:"guest",disabledReason:"",identities:[]}});const previewState=computed(()=>preview.value.state);const testApproval=computed(()=>{var _a;return["waiting","resuming"].includes((_a=status.value.testApproval)==null?void 0:_a.state)?status.value.testApproval:null});const resourceAdmissionId=computed(()=>["ready","starting"].includes(previewState.value)?"":refusedAdmissionId.value||String(status.value.resourceAdmissionId||""));const previewMessage=computed(()=>preview.value.message);const previewHref=computed(()=>preview.value.href);const previewTargetHref=computed(()=>preview.value.targetHref);const previewCanRestart=computed(()=>preview.value.canRestart);const previewCanShowLog=computed(()=>preview.value.canShowLog);const previewCanStart=computed(()=>preview.value.canStart);const previewRecovery=computed(()=>preview.value.recovery);const previewTarget=computed(()=>status.value.previewTarget&&typeof status.value.previewTarget==="object"&&!Array.isArray(status.value.previewTarget)?status.value.previewTarget:null);const outputTargets=computed(()=>{return Array.isArray(status.value.outputTargets)?status.value.outputTargets:[]});const outputRuns=computed(()=>{return Array.isArray(status.value.outputRuns)?status.value.outputRuns:[]});const outputResults=computed(()=>outputRuns.value.flatMap(run2=>(Array.isArray(run2==null?void 0:run2.results)?run2.results:[]).map(result=>({...result,href:vibe64OutputResultPath(sessionsApiPath.value,sessionId.value,result.id),outputTargetId:String(run2.outputTargetId||""),runId:String(run2.id||"")}))));const outputExecution=computed(()=>{const value=status.value.output;return value&&typeof value==="object"&&!Array.isArray(value)?value:{error:null,mode:"",presentationKind:"",state:"idle",targetId:""}});const autoStartTarget=computed(()=>{if(requestedAutoStartTargetId.value){return outputTargets.value.find(target=>{var _a;return target.id===requestedAutoStartTargetId.value&&((_a=target.presentation)==null?void 0:_a.kind)==="web"&&target.available!==false})||null}return autoStartRequestKey.value?managedPreviewTarget(outputTargets.value):null});const activeTerminal=computed(()=>{const terminalStatusValue=status.value.activeTerminal;return terminalStatusValue&&typeof terminalStatusValue==="object"&&!Array.isArray(terminalStatusValue)?terminalStatusValue:null});const activeOutputTargetId=computed(()=>{var _a,_b,_c;return String(terminalMetadata.value.outputTargetId||((_b=(_a=activeTerminal.value)==null?void 0:_a.metadata)==null?void 0:_b.outputTargetId)||((_c=status.value.lastOutputTarget)==null?void 0:_c.id)||"")});const activeOutputTarget=computed(()=>{return outputTargets.value.find(target=>target.id===activeOutputTargetId.value)||null});const launchActions=computed(()=>{var _a,_b,_c,_d,_e,_f;const actions=terminalMetadata.value.actions||((_b=(_a=activeTerminal.value)==null?void 0:_a.metadata)==null?void 0:_b.actions)||[];const targetHref=previewTargetHref.value||String(((_c=previewTarget.value)==null?void 0:_c.targetHref)||"").trim();const iframeHref=previewHref.value||String(((_d=previewTarget.value)==null?void 0:_d.href)||"").trim();const browserActions=Array.isArray(actions)?actions.filter(action=>browserCanOpenTarget(action)):[];if(browserActions.length<1&&iframeHref&&targetHref){return[{href:targetHref,kind:((_e=previewTarget.value)==null?void 0:_e.kind)||"url",label:((_f=previewTarget.value)==null?void 0:_f.label)||"Preview",previewHref:iframeHref}]}if(!iframeHref||!targetHref){return browserActions}return browserActions.map(action=>{if(String(action.href||"")!==targetHref){return action}return{...action,previewHref:iframeHref}})});const terminalLaunchReady=computed(()=>{var _a;return launchTerminalIsReady({...((_a=activeTerminal.value)==null?void 0:_a.metadata)||{},...terminalMetadata.value||{}})});const terminalPreviewRequiresProxy=computed(()=>{var _a;return launchPreviewRequiresProxy({...((_a=activeTerminal.value)==null?void 0:_a.metadata)||{},...terminalMetadata.value||{}})});const previewTargetDisabledReason=computed(()=>!["ready","stale"].includes(previewState.value)?previewMessage.value:"");const previewTargetRecovery=computed(()=>previewRecovery.value);const terminalIsRunning=computed(()=>{var _a;const statusValue=terminalStatus.value||((_a=activeTerminal.value)==null?void 0:_a.status)||"";return statusValue==="running"||statusValue==="closing"||terminalStarting.value});const terminalPreviewProxyPending=computed(()=>Boolean(terminalPreviewRequiresProxy.value&&terminalLaunchReady.value&&terminalIsRunning.value&&!previewHref.value));const terminalIndicatorState=computed(()=>{var _a,_b;if(terminalStatus.value==="exited"||((_a=activeTerminal.value)==null?void 0:_a.status)==="exited"){const exitCode=terminalExitCode.value??((_b=activeTerminal.value)==null?void 0:_b.exitCode);return exitCode&&exitCode!==0?"failed":"stopped"}if(terminalIsRunning.value){return terminalLaunchReady.value?"running":"starting"}return"stopped"});const terminalIndicatorLabel=computed(()=>{var _a,_b,_c;const presentationKind=((_b=(_a=activeOutputTarget.value)==null?void 0:_a.presentation)==null?void 0:_b.kind)||outputExecution.value.presentationKind;const finite=((_c=activeOutputTarget.value)==null?void 0:_c.mode)==="finite"||outputExecution.value.mode==="finite";if(terminalIndicatorState.value==="running"){return presentationKind==="web"?"Server is running":"Program is running"}if(terminalIndicatorState.value==="starting"){return finite?"Build is running":"Preparing output"}if(terminalIndicatorState.value==="failed"){return finite?"Build failed":"Program stopped with an error"}if(finite&&outputExecution.value.state==="succeeded"){return"Build completed"}return presentationKind==="web"?"Server is stopped":"Program is stopped"});const launchButtonsDisabled=computed(()=>Boolean(readRefOrGetterValue(busy)||operationBusy.value||terminalIsRunning.value));const outputTargetsLoadingForAutoStart=computed(()=>autoStartOutputsLoading({outputTargetsLoading:outputTargetsResource.isLoading.value,outputTargetsSettled:outputTargetsSettledForAutoStart.value}));const terminalCanStop=computed(()=>{var _a;return Boolean(terminalSessionId.value&&(terminalStatus.value||((_a=activeTerminal.value)==null?void 0:_a.status))==="running")});const terminalCanClose=computed(()=>{var _a;return Boolean(terminalSessionId.value&&!terminalIsRunning.value&&(terminalExited.value||((_a=activeTerminal.value)==null?void 0:_a.status)==="exited"))});const terminalCanRetry=computed(()=>Boolean(!terminalIsRunning.value&&activeOutputTargetId.value));const terminalCanRestart=computed(()=>Boolean(terminalCanStop.value&&activeOutputTargetId.value));const terminalCanCopyLog=computed(()=>Boolean(terminalOutput.value));const terminalVisible=computed(()=>Boolean(terminalSessionId.value||activeTerminal.value));const terminalDockVisible=computed(()=>Boolean(terminalDisplayed.value&&terminalVisible.value&&!terminalExpanded.value));const terminalWindowVisible=computed(()=>Boolean(terminalDisplayed.value&&terminalVisible.value&&terminalExpanded.value));const terminalTitle=computed(()=>{var _a;return((_a=activeOutputTarget.value)==null?void 0:_a.label)||"Run target"});const terminalSubtitle=computed(()=>{var _a,_b;if(terminalIsRunning.value){return""}if(terminalStatus.value==="exited"||((_a=activeTerminal.value)==null?void 0:_a.status)==="exited"){const exitCode=terminalExitCode.value??((_b=activeTerminal.value)==null?void 0:_b.exitCode);return exitCode===0?"Exited":`Exited with code ${exitCode}`}return activeOutputTargetId.value?"Ready":"No output target running."});const visible=computed(()=>Boolean((canLoadOutputs.value||terminalVisible.value)&&(outputTargets.value.length>0||outputTargetsResource.loadError.value||terminalVisible.value)));const launchStatusIdleRecoveryNeeded=computed(()=>Boolean(previewPaneDisplayed.value&&canLoadOutputs.value&&autoStartRequestKey.value&&!outputTargetsResource.isLoading.value&&!launchStatusLoadError.value&&!operationBusy.value&&!terminalVisible.value&&!autoStartTarget.value&&outputTargets.value.length<1&&previewState.value==="idle"));async function run(outputTarget={},{applyDefaultDisplay=true,autoStartAttemptKey="",forceRestart=false,ignoreExternalBusy=false}={}){var _a,_b;const currentSession=selectedSession.value||{};const externalBusy=readRefOrGetterValue(busy);const currentSessionId=sessionId.value;const startedScopeKey=launchScopeKey.value;if(!currentSessionId||!launchControlsCanLoadTargets({displayed:terminalDisplayed.value,session:currentSession,sourceOperationsSuspended:launchSourceOperationsSuspended.value})||!terminalDisplayed.value||operationBusy.value||!forceRestart&&terminalIsRunning.value||!forceRestart&&!ignoreExternalBusy&&externalBusy||outputTarget.available===false||!outputTarget.id){return false}if(applyDefaultDisplay){terminalExpanded.value=false}launchStarting.value=true;launchWaiting.value=false;launchError.value="";operationBusy.value=true;refusedAdmissionId.value="";const normalizedAutoStartAttemptKey=String(autoStartAttemptKey||"").trim();if(normalizedAutoStartAttemptKey){writeLaunchAutoStartAttempt(normalizedAutoStartAttemptKey)}try{const terminalSession=await startTerminalCommand.run({forceRestart,outputTargetId:outputTarget.id,sessionId:currentSessionId});if(disposed||startedScopeKey!==launchScopeKey.value||!launchControlsCanLoadTargets({displayed:terminalDisplayed.value,session:selectedSession.value||{},sourceOperationsSuspended:launchSourceOperationsSuspended.value})){return false}applyLaunchTerminalSession(terminalSession);void connectLaunchTerminal();void refresh({scopeKey:startedScopeKey});return true}catch(error){if(disposed||startedScopeKey!==launchScopeKey.value){return false}if(normalizedAutoStartAttemptKey){if(launchStatusAgentWriteBusy(error)){launchWaiting.value=previewState.value!=="ready";void refresh({scopeKey:startedScopeKey}).catch(()=>null);return false}autoStartKey.value=normalizedAutoStartAttemptKey}launchError.value=String((error==null?void 0:error.message)||startTerminalCommand.message||"Output target could not be started.").trim();refusedAdmissionId.value=String(((_b=(_a=error==null?void 0:error.details)==null?void 0:_a.admission)==null?void 0:_b.id)||"");return false}finally{launchStarting.value=false;operationBusy.value=false}}function applyLaunchTerminalSession(terminalSession={}){if(!terminalSession||terminalSession.ok===false||!terminalSession.id){return false}attachedTerminalId=terminalSession.id;applyTerminalSession(terminalSession,{fallbackStatus:"running"});return true}async function acceptResourceRetry(result={}){if(result.ok===false)return;refusedAdmissionId.value="";launchError.value="";if(applyLaunchTerminalSession(result))void connectLaunchTerminal();await refresh()}async function connectLaunchTerminal(){if(!terminalSessionId.value||!terminalDisplayed.value){return false}return connectTerminalSocket()}async function expandTerminal(){terminalExpanded.value=true;await connectLaunchTerminal()}function minimizeTerminal(){terminalExpanded.value=false;void connectLaunchTerminal()}async function refresh({scopeKey=launchScopeKey.value}={}){var _a;if(!canLoadOutputs.value){return null}const refreshScopeKey=String(scopeKey||"").trim();if(!refreshScopeKey){return null}return typeof((_a=outputTargetsResource.query)==null?void 0:_a.refetch)==="function"?outputTargetsResource.query.refetch({cancelRefetch:true}):outputTargetsResource.reload()}async function startNewlyConfiguredWorkspaceSetup(){var _a,_b;if(String(((_b=(_a=selectedSession.value)==null?void 0:_a.workspaceSetup)==null?void 0:_b.status)||"").trim()!=="unconfigured"||!sessionId.value){return false}try{const result=await getHttpWebClient().request(vibe64SessionPath(sessionsApiPath.value,sessionId.value,"/workspace-setup/retry"),{body:vibe64RealtimeOriginPayload(),method:"POST"});return(result==null?void 0:result.ok)!==false}catch(error){vibe64SessionDebugLog("client.launchPreview.workspaceSetup.start.error",{error:vibe64SessionDebugError(error),sessionId:sessionId.value});return false}}async function publishPreviewState(previewState2={}){const currentSessionId=sessionId.value;const currentProjectSlug=projectSlug.value;if(!currentSessionId||!currentProjectSlug||!String((previewState2==null?void 0:previewState2.route)||"").trim()){return false}try{const result=await getHttpWebClient().request(vibe64SessionPreviewStatePath(sessionsApiPath.value,currentSessionId),{body:vibe64RealtimeOriginPayload({projectSlug:currentProjectSlug,route:String((previewState2==null?void 0:previewState2.route)||"").trim(),title:String((previewState2==null?void 0:previewState2.title)||"").trim()}),method:"POST"});return(result==null?void 0:result.ok)!==false}catch(error){vibe64SessionDebugLog("client.launchPreview.state.publish.error",{error:vibe64SessionDebugError(error),route:String((previewState2==null?void 0:previewState2.route)||"").trim(),sessionId:currentSessionId});return false}}function requestPreviewIdentityGrant({identityName="",mode="identity"}={}){if(!sessionId.value||previewIdentity.value.available!==true){throw new Error(previewIdentity.value.disabledReason||"This preview does not support application identity switching.")}const normalizedIdentityName=String(identityName||"").trim();return selectPreviewIdentityCommand.run({...normalizedIdentityName?{identityName:normalizedIdentityName}:{},mode:String(mode||"identity").trim(),sessionId:sessionId.value})}watch(launchSourceOperationsSuspended,(suspended,wasSuspended)=>{if(suspended){sourceOperationsResumePending.value=true;return}if(wasSuspended!==true){return}const resumeScopeKey=launchScopeKey.value;void Promise.resolve(refresh({scopeKey:resumeScopeKey})).finally(()=>{if(!launchSourceOperationsSuspended.value&&launchScopeKey.value===resumeScopeKey){sourceOperationsResumePending.value=false}})},{flush:"sync",immediate:true});useRealtimeEvent({enabled:canLoadOutputs,event:VIBE64_SESSION_CHANGED_EVENT,matches:context=>outputTargetsRealtimeShouldRefresh({localLaunchStarting:launchStarting.value,payload:(context==null?void 0:context.payload)||{}},sessionId.value),onEvent:()=>refresh({scopeKey:launchScopeKey.value})});watch([sessionId,sessionRevision,canLoadOutputs,autoStartRequestKey,()=>outputTargetsResource.isLoading.value,launchStatusLoadError,terminalVisible,autoStartTarget,previewState],()=>{const currentSessionId=sessionId.value;const currentRevision=sessionRevision.value;if(currentSessionId!==outputTargetsRefreshSessionId||outputTargetsRefreshRevision===null){outputTargetsRefreshSessionId=currentSessionId;outputTargetsRefreshRevision=currentRevision;return}if(currentRevision===null||currentRevision<=outputTargetsRefreshRevision){return}if(terminalVisible.value||autoStartTarget.value||previewState.value!=="idle"){outputTargetsRefreshRevision=currentRevision;return}if(!canLoadOutputs.value||!autoStartRequestKey.value||outputTargetsResource.isLoading.value||launchStatusLoadError.value){return}outputTargetsRefreshRevision=currentRevision;void refresh({scopeKey:launchScopeKey.value})},{flush:"post"});function clearAutoStartTimer(){if(autoStartTimer&&typeof window!=="undefined"){window.clearTimeout(autoStartTimer)}autoStartTimer=0;scheduledAutoStartKey=""}function clearAutoStartCooldownTimer(){if(autoStartCooldownTimer&&typeof window!=="undefined"){window.clearTimeout(autoStartCooldownTimer)}autoStartCooldownTimer=0}function clearLaunchStatusIdleRecoveryTimer(){if(launchStatusIdleRecoveryTimer&&typeof window!=="undefined"){window.clearTimeout(launchStatusIdleRecoveryTimer)}launchStatusIdleRecoveryTimer=0}function resetLaunchStatusIdleRecovery(){clearLaunchStatusIdleRecoveryTimer();launchStatusIdleRecoveryCount.value=0;launchStatusIdleRecoveryScopeKey=launchScopeKey.value}function resetOutputsAutoStartSettlement(){outputTargetsSettledForAutoStart.value=false}function scheduleLaunchStatusIdleRecovery(){if(!launchStatusIdleRecoveryNeeded.value||typeof window==="undefined"){return}const scopeKey=launchScopeKey.value;if(!scopeKey){return}if(launchStatusIdleRecoveryScopeKey!==scopeKey){launchStatusIdleRecoveryScopeKey=scopeKey;launchStatusIdleRecoveryCount.value=0}if(launchStatusIdleRecoveryTimer){return}if(launchStatusIdleRecoveryExhausted.value){return}const delayMs=launchStatusIdleRecoveryCount.value===0?LAUNCH_STATUS_IDLE_RECOVERY_INITIAL_DELAY_MS:LAUNCH_STATUS_IDLE_RECOVERY_INTERVAL_MS;launchStatusIdleRecoveryTimer=window.setTimeout(()=>{launchStatusIdleRecoveryTimer=0;if(!launchStatusIdleRecoveryNeeded.value||scopeKey!==launchScopeKey.value){return}launchStatusIdleRecoveryCount.value+=1;void refresh({scopeKey}).catch(()=>null)},delayMs)}function scheduleAutoStartCooldownCheck(remainingMs=0){clearAutoStartCooldownTimer();if(typeof window==="undefined"){return}autoStartCooldownTimer=window.setTimeout(()=>{autoStartCooldownTimer=0;autoStartCooldownVersion.value+=1},Math.max(0,Number(remainingMs)||0)+50)}function clearStaleLaunchTerminal(){attachedTerminalId="";closeTerminalSocket();resetTerminalSessionState();resetTerminalDisplay()}async function stopTerminal(){if(!sessionId.value||!terminalCanStop.value&&!terminalSessionId.value){return false}operationBusy.value=true;try{const stopped=await stopTerminalCommand.run({sessionId:sessionId.value,terminalSessionId:terminalSessionId.value});applyLaunchTerminalSession(stopped);await refresh();await waitForStoppedTerminal();return true}catch{return false}finally{operationBusy.value=false}}async function waitForStoppedTerminal(){for(let attempt=0;attempt<TERMINAL_STOP_POLL_ATTEMPTS;attempt+=1){if(!terminalIsRunning.value){return true}await delay(TERMINAL_STOP_POLL_INTERVAL_MS);await refresh()}return false}async function restartTerminal(){if(!terminalCanRestart.value){return false}const target=activeOutputTarget.value||outputTargets.value.find(item=>item.id===activeOutputTargetId.value);if(!target){return false}return run(target,{applyDefaultDisplay:false,forceRestart:true})}async function retryTerminal(){if(!terminalCanRetry.value){return false}const target=activeOutputTarget.value||outputTargets.value.find(item=>item.id===activeOutputTargetId.value);return target?run(target,{applyDefaultDisplay:false}):false}async function closeTerminal(){if(!sessionId.value||!terminalCanClose.value){return false}operationBusy.value=true;try{await closeTerminalCommand.run({sessionId:sessionId.value,terminalSessionId:terminalSessionId.value});closeTerminalSocket();resetTerminalSessionState();resetTerminalDisplay();attachedTerminalId="";terminalExpanded.value=false;await refresh();return true}catch{return false}finally{operationBusy.value=false}}async function copyLog(){var _a;if(!terminalOutput.value||typeof navigator==="undefined"||!((_a=navigator.clipboard)==null?void 0:_a.writeText)){return false}await navigator.clipboard.writeText(terminalOutput.value);return true}function openAction(action={}){return openLaunchBrowserTarget(action,selectedSession.value,null,projectSlug.value)}watch(activeTerminal,nextTerminal=>{if(!(nextTerminal==null?void 0:nextTerminal.id)){clearStaleLaunchTerminal();return}if(nextTerminal.id!==attachedTerminalId){closeTerminalSocket();resetTerminalDisplay();attachedTerminalId=nextTerminal.id}applyTerminalSession(nextTerminal,{fallbackStatus:nextTerminal.status||"running"});void connectLaunchTerminal()},{immediate:true});watch([previewState,terminalIndicatorState,launchError],([state,indicator])=>{if(state==="ready"&&indicator==="running"){launchError.value="";refusedAdmissionId.value="";launchWaiting.value=false}});watch(terminalError,message=>{if(!terminalSessionMissingError(message)){return}clearStaleLaunchTerminal();void refresh()});watch(terminalDisplayed,displayed=>{if(displayed){void connectLaunchTerminal();return}clearAutoStartTimer();resetOutputsAutoStartSettlement();resetLaunchStatusIdleRecovery();closeTerminalSocket();disposeTerminalDisplay()});watch(launchScopeKey,()=>{attachedTerminalId="";autoStartKey.value="";launchError.value="";refusedAdmissionId.value="";launchWaiting.value=false;launchStatusAttempt.value=0;launchStatusAttemptLoading=false;launchStatusAttemptScopeKey=launchScopeKey.value;resetOutputsAutoStartSettlement();resetLaunchStatusIdleRecovery();clearAutoStartTimer();closeTerminalSocket();disposeTerminalDisplay();resetTerminalSessionState();resetTerminalDisplay();terminalExpanded.value=false});watch(canLoadOutputs,canLoad=>{if(canLoad){return}clearAutoStartTimer();resetOutputsAutoStartSettlement();resetLaunchStatusIdleRecovery()},{flush:"sync",immediate:true});watch(launchStatusIdleRecoveryNeeded,needed=>{if(needed){scheduleLaunchStatusIdleRecovery();return}clearLaunchStatusIdleRecoveryTimer();if(!outputTargetsResource.isLoading.value){launchStatusIdleRecoveryCount.value=0;launchStatusIdleRecoveryScopeKey=launchScopeKey.value}},{flush:"post",immediate:true});watch(()=>[launchScopeKey.value,canLoadOutputs.value?"loadable":"blocked",outputTargetsResource.isLoading.value?"loading":"ready"].join("|"),()=>{const scopeKey=launchScopeKey.value;if(!scopeKey||!canLoadOutputs.value){launchStatusAttempt.value=0;launchStatusAttemptScopeKey=scopeKey;launchStatusAttemptLoading=false;return}if(launchStatusAttemptScopeKey!==scopeKey){launchStatusAttempt.value=0;launchStatusAttemptScopeKey=scopeKey;launchStatusAttemptLoading=false}if(outputTargetsResource.isLoading.value&&!launchStatusAttemptLoading){launchStatusAttempt.value+=1;launchStatusAttemptLoading=true;return}if(!outputTargetsResource.isLoading.value){launchStatusAttemptLoading=false}},{flush:"sync",immediate:true});watch(()=>[projectSlug.value,sessionId.value,autoStartRequestKey.value,canLoadOutputs.value?"loadable":"blocked",outputTargetsResource.isLoading.value?"loading":"ready"].join("|"),()=>{const scopeKey=launchScopeKey.value;if(!scopeKey||!autoStartRequestKey.value||!canLoadOutputs.value){resetOutputsAutoStartSettlement();return}if(outputTargetsResource.isLoading.value){outputTargetsSettledForAutoStart.value=false;return}outputTargetsSettledForAutoStart.value=true},{flush:"post",immediate:true});watch(()=>{var _a;return[projectSlug.value,sessionId.value,autoStartRequestKey.value,outputTargetsLoadingForAutoStart.value?"loading":"ready",terminalVisible.value?"terminal-visible":"terminal-hidden",terminalDisplayed.value?"displayed":"hidden",canLoadOutputs.value?"loadable":"blocked",readRefOrGetterValue(busy)?"external-busy":"external-idle",operationBusy.value?"busy":"idle",resourceAdmissionId.value,((_a=autoStartTarget.value)==null?void 0:_a.id)||"",autoStartCooldownVersion.value].join("|")},()=>{const target=autoStartTarget.value;const key=`${launchScopeKey.value}:${(target==null?void 0:target.id)||""}`;if(resourceAdmissionId.value){clearAutoStartTimer();return}const ready=shouldScheduleLaunchAutoStart({autoStartKey:autoStartKey.value,externalBusy:readRefOrGetterValue(busy),key,loading:outputTargetsLoadingForAutoStart.value,operationBusy:operationBusy.value,sessionLaunchable:canLoadOutputs.value,sessionId:sessionId.value,target,terminalDisplayed:terminalDisplayed.value,terminalVisible:terminalVisible.value});if(scheduledAutoStartKey===key&&ready){return}clearAutoStartTimer();if(!ready){return}const cooldownMs=readLaunchAutoStartAttemptCooldown(key);if(cooldownMs>0){scheduleAutoStartCooldownCheck(cooldownMs);return}const start=()=>{autoStartTimer=0;scheduledAutoStartKey="";const currentTarget=autoStartTarget.value;const currentKey=`${launchScopeKey.value}:${(currentTarget==null?void 0:currentTarget.id)||""}`;if(!shouldScheduleLaunchAutoStart({autoStartKey:autoStartKey.value,externalBusy:readRefOrGetterValue(busy),key:currentKey,loading:outputTargetsLoadingForAutoStart.value,operationBusy:operationBusy.value,sessionLaunchable:canLoadOutputs.value,sessionId:sessionId.value,target:currentTarget,terminalDisplayed:terminalDisplayed.value,terminalVisible:terminalVisible.value})){return}const currentCooldownMs=readLaunchAutoStartAttemptCooldown(currentKey);if(currentCooldownMs>0){scheduleAutoStartCooldownCheck(currentCooldownMs);return}void Promise.resolve(run(currentTarget,{applyDefaultDisplay:false,autoStartAttemptKey:currentKey})).then(started=>{if(started){autoStartKey.value=currentKey;clearLaunchAutoStartAttempt(currentKey)}}).catch(()=>null)};scheduledAutoStartKey=key;if(typeof window==="undefined"||AUTO_START_STABILITY_DELAY_MS<=0){start();return}autoStartTimer=window.setTimeout(start,AUTO_START_STABILITY_DELAY_MS)},{flush:"post",immediate:true});onBeforeUnmount(()=>{disposed=true;clearAutoStartTimer();clearAutoStartCooldownTimer();clearLaunchStatusIdleRecoveryTimer();disposeTerminalUi()});return{activeOutputTarget,activeOutputTargetId,activeTerminal,closeTerminal,copyLog,expandTerminal,launchActions,launchButtonsDisabled,launchError,resourceAdmissionId,acceptResourceRetry,testApproval,launchStatusAttempt,launchStatusIdleRecoveryExhausted,launchStarting,launchWaiting,outputTargets,outputExecution,outputResults,outputRuns,loading:outputTargetsResource.isLoading,loadError:launchStatusLoadError,minimizeTerminal,openAction,operationBusy,previewCanRestart,previewCanShowLog,previewCanStart,previewHref,previewIdentity,previewMessage,previewState,previewTargetDisabledReason,previewTargetHref,previewTargetRecovery,terminalPreviewRequiresProxy,terminalPreviewProxyPending,publishPreviewState,requestPreviewIdentityGrant,refresh,restartTerminal,retryTerminal,run,sendCtrlC,stopTerminal,startNewlyConfiguredWorkspaceSetup,terminal,terminalCanClose,terminalCanCopyLog,terminalCanRestart,terminalCanRetry,terminalCanStop,terminalCommandPreview,terminalDisplayed,terminalDockVisible,terminalError,terminalExpanded,terminalExited,terminalExitCode,terminalIndicatorLabel,terminalIndicatorState,terminalIsRunning,terminalLaunchReady,terminalMetadata,terminalOutput,terminalSessionId,terminalStarting,terminalStatus,terminalSubtitle,terminalTitle,terminalVisible,terminalWindowStorageKey,terminalWindowVisible,visible}}const PREVIEW_BRIDGE_VERSION=5;const PREVIEW_BRIDGE_READY_MESSAGE_TYPE="vibe64:preview-bridge-ready";const PREVIEW_DIAGNOSTICS_REQUEST_MESSAGE_TYPE="vibe64:preview-diagnostics-request";const PREVIEW_DIAGNOSTICS_RESPONSE_MESSAGE_TYPE="vibe64:preview-diagnostics-response";const PREVIEW_IDENTITY_REQUEST_MESSAGE_TYPE="vibe64:preview-identity-request";const PREVIEW_IDENTITY_RESPONSE_MESSAGE_TYPE="vibe64:preview-identity-response";const PREVIEW_LOCATION_MESSAGE_TYPE="vibe64:preview-location";const PREVIEW_QUERY_MESSAGE_TYPE="vibe64:preview-query";const PREVIEW_RESOURCE_FAILURE_MESSAGE_TYPE="vibe64:preview-resource-failure";const PREVIEW_PROXY_TOKEN_QUERY_PARAM="vibe64_preview_token";const ROUTE_PARAM_PATTERN=/:([A-Za-z][A-Za-z0-9_]*)/gu;function previewRoutesForTarget(launchTarget={}){return Array.isArray(launchTarget==null?void 0:launchTarget.previewRoutes)?launchTarget.previewRoutes.filter(route=>(route==null?void 0:route.id)&&(route==null?void 0:route.pathTemplate)):[]}function previewRouteParams(route={}){const declared=new Map((Array.isArray(route.params)?route.params:[]).filter(param=>param==null?void 0:param.name).map(param=>[String(param.name),param]));return[...String(route.pathTemplate||"").matchAll(ROUTE_PARAM_PATTERN)].map(match=>String(match[1]||"").trim()).filter(Boolean).map(name=>declared.get(name)||{label:routeParamLabel(name),name,placeholder:name,required:true})}function previewRouteHasParams(route={}){return previewRouteParams(route).length>0}function previewRouteInitialFormValues(route={}){return Object.fromEntries(previewRouteParams(route).map(param=>[param.name,String(param.defaultValue||"").trim()]))}function previewRoutePath(route={},values={}){const pathTemplate=String(route.pathTemplate||"");const params=previewRouteParams(route);let missingParam="";const path=pathTemplate.replace(ROUTE_PARAM_PATTERN,(match,name)=>{const param=params.find(candidate=>candidate.name===name);const value=String((values==null?void 0:values[name])??(param==null?void 0:param.defaultValue)??"").trim();if(!value&&(param==null?void 0:param.required)!==false){missingParam||(missingParam=name);return match}return encodeURIComponent(value)});return{missingParam,ok:!missingParam&&path.startsWith("/"),path}}function routeParamLabel(name=""){return String(name||"").replace(/([a-z0-9])([A-Z])/gu,"$1 $2").replace(/[-_]+/gu," ").trim().replace(/\b\w/gu,letter=>letter.toUpperCase())}const PREVIEW_IDENTITY_TYPE_EMAIL="email";const PREVIEW_IDENTITY_TYPE_LOGIN="login";const PREVIEW_IDENTITY_TYPE_USER_ID="user-id";const PREVIEW_IDENTITY_TYPES=Object.freeze([PREVIEW_IDENTITY_TYPE_EMAIL,PREVIEW_IDENTITY_TYPE_LOGIN,PREVIEW_IDENTITY_TYPE_USER_ID]);const PREVIEW_DISPLAY_QUERY_PARAMS=Object.freeze([PREVIEW_PROXY_TOKEN_QUERY_PARAM]);const PREVIEW_DIAGNOSTICS_TIMEOUT_MS=3e3;const PREVIEW_IDENTITY_TIMEOUT_MS=1e4;const PREVIEW_RESOURCE_RETRY_DELAY_MS=250;const PREVIEW_RESOURCE_RETRY_LIMIT=1;function previewUrlWithoutDisplayParams(value=""){const text=String(value||"").trim();if(!text){return""}try{const url=new URL(text);for(const param of PREVIEW_DISPLAY_QUERY_PARAMS){url.searchParams.delete(param)}return url.toString()}catch{return stripPreviewDisplayQueryParams(text)}}function stripPreviewDisplayQueryParams(value=""){const text=String(value||"");const hashIndex=text.indexOf("#");const beforeHash=hashIndex>=0?text.slice(0,hashIndex):text;const hash=hashIndex>=0?text.slice(hashIndex):"";const queryIndex=beforeHash.indexOf("?");if(queryIndex<0){return text}const base=beforeHash.slice(0,queryIndex);const parts=beforeHash.slice(queryIndex+1).split("&").filter(part=>!PREVIEW_DISPLAY_QUERY_PARAMS.includes(queryParamName(part)));return`${base}${parts.length>0?`?${parts.join("&")}`:""}${hash}`}function queryParamName(part=""){const separatorIndex=String(part||"").indexOf("=");const rawName=separatorIndex<0?String(part||""):String(part||"").slice(0,separatorIndex);try{return decodeURIComponent(rawName.replace(/\+/gu," "))}catch{return rawName}}function normalizePreviewRoute(value=""){const text=String(value||"").trim();if(!text){return""}if(text.startsWith("/")){return text}if(text.startsWith("?")||text.startsWith("#")){return`/${text}`}return""}function previewRouteFromUrl(value=""){const text=previewUrlWithoutDisplayParams(value);if(!text){return""}const route=normalizePreviewRoute(text);if(route){return route}try{const url=new URL(text);return`${url.pathname||"/"}${url.search}${url.hash}`||"/"}catch{return""}}function previewUrlForRoute(route="",baseUrl=""){const normalizedRoute=normalizePreviewRoute(route);const baseText=previewUrlWithoutDisplayParams(baseUrl);if(!normalizedRoute||!baseText){return""}try{return new URL(normalizedRoute,baseText).toString()}catch{return""}}function previewAddressDisplayText(value="",{displayBaseUrl="",previewBaseUrl=""}={}){const displayUrl=previewUrlWithoutDisplayParams(value);if(!displayUrl){return""}try{const url=new URL(displayUrl);const sameAppOrigins=[displayBaseUrl,previewBaseUrl].map(baseUrl=>{try{return previewUrlWithoutDisplayParams(baseUrl)?new URL(previewUrlWithoutDisplayParams(baseUrl)).origin:""}catch{return""}}).filter(Boolean);if(sameAppOrigins.includes(url.origin)){return`${url.pathname||"/"}${url.search}${url.hash}`||"/"}}catch{return displayUrl}return displayUrl}function launchPreviewFrameUrl({baseUrl="",displayBaseUrl="",visitedUrl=""}={}){const baseText=String(baseUrl||"").trim();if(!baseText){return""}const routeSource=String(visitedUrl||displayBaseUrl||baseText).trim();try{const base=new URL(baseText);const route=new URL(routeSource,String(displayBaseUrl||baseText));const token=base.searchParams.get(PREVIEW_PROXY_TOKEN_QUERY_PARAM)||"";base.pathname=route.pathname;base.search=route.search;base.hash=route.hash;if(token){base.searchParams.set(PREVIEW_PROXY_TOKEN_QUERY_PARAM,token)}return base.toString()}catch{return baseText}}function previewFrameLifecycleIdentity({outputTargetId="",sessionId="",src="",terminalSessionId=""}={}){return previewLifecycleIdentity([String(sessionId||"").trim(),String(outputTargetId||"").trim(),String(terminalSessionId||"").trim()],src)}function previewIdentityLifecycleIdentity({outputTargetId="",previewBaseUrl="",projectSlug="",sessionId="",terminalSessionId=""}={}){return previewLifecycleIdentity([String(projectSlug||"").trim(),String(sessionId||"").trim(),String(outputTargetId||"").trim(),String(terminalSessionId||"").trim()],previewBaseUrl)}function previewLifecycleIdentity(parts=[],url=""){const canonicalUrl=previewUrlWithoutDisplayParams(url);return canonicalUrl?[...parts,canonicalUrl].join("\0"):""}function previewIdentityLabelText({busy=false,identity=null}={}){var _a;if(busy){return"Switching identity"}if(!identity){return"Identity not confirmed"}if(identity.mode==="guest"){return"Guest"}const selectorValue=String(((_a=identity.selector)==null?void 0:_a.value)||identity.email||identity.login||identity.userId||"").trim();const name=String(identity.name||identity.displayName||"").trim();return name&&name!==selectorValue?`${name} — ${selectorValue}`:name||selectorValue||"Selected app identity"}function previewIdentityTitleText({busy=false,error="",identity=null}={}){if(busy){return"Switching preview identity…"}const message=String(error||"").trim();return message?`Preview identity failed: ${message}`:`Previewing as ${previewIdentityLabelText({identity})}`}function normalizePreviewIdentitySelector(value={}){const source=value&&typeof value==="object"&&!Array.isArray(value)?value:{};const type=String(source.type||"").trim();const rawValue=String(source.value||"").trim();if(!PREVIEW_IDENTITY_TYPES.includes(type)||!rawValue){return null}const normalizedValue=type===PREVIEW_IDENTITY_TYPE_EMAIL?rawValue.toLowerCase():rawValue;if(type===PREVIEW_IDENTITY_TYPE_EMAIL&&(!normalizedValue.includes("@")||normalizedValue.length>320)||type!==PREVIEW_IDENTITY_TYPE_EMAIL&&normalizedValue.length>256){return null}return{type,value:normalizedValue}}function normalizeConfiguredPreviewIdentities(value=[]){if(!Array.isArray(value)){return[]}const identities=[];const names=new Set;for(const entry of value){const name=String((entry==null?void 0:entry.name)||"").trim().toLowerCase();const selector=normalizePreviewIdentitySelector({type:entry==null?void 0:entry.type,value:entry==null?void 0:entry.value});if(!name||names.has(name)||!selector){continue}names.add(name);identities.push({name,selector,type:selector.type,value:selector.value})}return identities}function previewIdentityTypeLabel(type=""){return{[PREVIEW_IDENTITY_TYPE_EMAIL]:"Email",[PREVIEW_IDENTITY_TYPE_LOGIN]:"Login name",[PREVIEW_IDENTITY_TYPE_USER_ID]:"User ID"}[String(type||"").trim()]||"User identifier"}function previewIdentityFromExchange(exchangeResult={},requestedIdentity={}){if(requestedIdentity.mode==="guest"){return{mode:"guest"}}const identity=(exchangeResult==null?void 0:exchangeResult.identity)&&typeof exchangeResult.identity==="object"?exchangeResult.identity:{};const selector=normalizePreviewIdentitySelector(identity.selector||requestedIdentity.selector);const email=String(identity.email||((selector==null?void 0:selector.type)===PREVIEW_IDENTITY_TYPE_EMAIL?selector.value:"")).trim().toLowerCase();const login=String(identity.login||((selector==null?void 0:selector.type)===PREVIEW_IDENTITY_TYPE_LOGIN?selector.value:"")).trim();const userId=String(identity.userId||((selector==null?void 0:selector.type)===PREVIEW_IDENTITY_TYPE_USER_ID?selector.value:"")).trim();const username=String(identity.username||"").trim();return{displayName:String(identity.displayName||username||requestedIdentity.displayName||requestedIdentity.name||(selector==null?void 0:selector.value)||"").trim(),email,login,mode:requestedIdentity.mode,name:String(requestedIdentity.name||"").trim(),selector,userId,username}}function isPreviewBridgeReadyMessage(value={}){return String((value==null?void 0:value.type)||"")===PREVIEW_BRIDGE_READY_MESSAGE_TYPE}function previewLoadingOverlayShouldShow({identityBusy=false,loadedFrameRequestId=0,previewFrameRequestId=0,previewUrl=""}={}){return Boolean(identityBusy||previewOpeningOverlayVisible({loadedFrameRequestId,previewFrameRequestId,previewUrl}))}function defaultPreviewIdentitySelection({capability=null}={}){const name=String((capability==null?void 0:capability.defaultIdentityName)||"").trim();return(capability==null?void 0:capability.defaultMode)==="identity"&&name?{identityName:name,mode:"identity"}:{mode:"guest"}}function createPreviewBridgeRequestRegistry(){const pendingRequests=new Map;let sequence=0;function take(requestId=""){var _a,_b;const pending=pendingRequests.get(requestId);if(!pending){return null}clearTimeout(pending.timeout);(_b=(_a=pending.signal)==null?void 0:_a.removeEventListener)==null?void 0:_b.call(_a,"abort",pending.abortHandler);pendingRequests.delete(requestId);return pending}function reject(requestId,error){const pending=take(requestId);pending==null?void 0:pending.reject(error);return Boolean(pending)}function rejectAll(message="The application preview changed."){for(const requestId of[...pendingRequests.keys()]){reject(requestId,new Error(message))}}function request({frameRequestId=0,message={},signal=null,targetWindow=null,timeoutMessage="The application preview did not respond in time.",timeoutMs=3e3}={}){if(!targetWindow||typeof targetWindow.postMessage!=="function"){return Promise.reject(new Error("The application preview is not ready."))}if(signal==null?void 0:signal.aborted){const error=new Error("Preview diagnostics collection was cancelled.");error.name="AbortError";return Promise.reject(error)}const requestId=[frameRequestId,Date.now(),++sequence].join(":");const response=new Promise((resolve2,rejectRequest)=>{var _a;const abortHandler=()=>{const error=new Error("Preview diagnostics collection was cancelled.");error.name="AbortError";reject(requestId,error)};const timeout=setTimeout(()=>{reject(requestId,new Error(timeoutMessage))},timeoutMs);pendingRequests.set(requestId,{abortHandler,reject:rejectRequest,resolve:resolve2,signal,timeout});(_a=signal==null?void 0:signal.addEventListener)==null?void 0:_a.call(signal,"abort",abortHandler,{once:true});if(signal==null?void 0:signal.aborted){abortHandler()}});try{targetWindow.postMessage({...message,requestId},"*")}catch(error){reject(requestId,error)}return response}function resolve(requestId,value){const pending=take(requestId);pending==null?void 0:pending.resolve(value);return Boolean(pending)}return Object.freeze({reject,rejectAll,request,resolve})}function previewUrlForDebug(value=""){return previewUrlWithoutDisplayParams(value)}function redactPreviewDebugDetails(value){if(typeof value==="string"){return value.includes(PREVIEW_PROXY_TOKEN_QUERY_PARAM)?previewUrlForDebug(value):value}if(Array.isArray(value)){return value.map(entry=>redactPreviewDebugDetails(entry))}if(!value||typeof value!=="object"){return value}return Object.fromEntries(Object.entries(value).map(([key,entry])=>[key,redactPreviewDebugDetails(entry)]))}function normalizePreviewAddressInput(value=""){const text=String(value||"").trim();if(!text){return""}if(/^[a-z][a-z\d+.-]*:/iu.test(text)||/^[/?#]/u.test(text)||text.startsWith("./")||text.startsWith("../")){return text}return`/${text}`}function launchPreviewAddressNavigationUrl({address="",currentUrl="",displayBaseUrl="",previewBaseUrl=""}={}){const previewBaseText=String(previewBaseUrl||"").trim();const displayBaseText=previewUrlWithoutDisplayParams(displayBaseUrl||previewBaseText);const currentText=previewUrlWithoutDisplayParams(currentUrl||displayBaseText);const input=normalizePreviewAddressInput(address);if(!input||!previewBaseText||!displayBaseText){return{displayUrl:"",error:"Preview URL is not available yet.",ok:false,previewUrl:""}}try{const previewBase=new URL(previewBaseText);const displayBase=new URL(displayBaseText);const target=new URL(input,currentText||displayBaseText);const allowedOrigins=new Set([displayBase.origin,previewBase.origin]);if(!allowedOrigins.has(target.origin)){return{displayUrl:"",error:"Preview URL must stay inside this app.",ok:false,previewUrl:""}}const previewTarget=target.origin===previewBase.origin?new URL(target):new URL(previewBase);const displayTarget=target.origin===displayBase.origin?new URL(target):new URL(displayBase);if(target.origin!==previewBase.origin){previewTarget.pathname=target.pathname;previewTarget.search=target.search;previewTarget.hash=target.hash}if(target.origin!==displayBase.origin){displayTarget.pathname=target.pathname;displayTarget.search=target.search;displayTarget.hash=target.hash}return{displayUrl:previewUrlWithoutDisplayParams(displayTarget.toString()),error:"",ok:true,previewUrl:launchPreviewFrameUrl({baseUrl:previewBaseText,displayBaseUrl:displayBaseText,visitedUrl:displayTarget.toString()})}}catch{return{displayUrl:"",error:"Preview URL is invalid.",ok:false,previewUrl:""}}}function useVibe64OutputControlsSurface(props){const{activeOutputTarget,expandTerminal,launchActions,launchButtonsDisabled,launchError,resourceAdmissionId,acceptResourceRetry,testApproval,launchStatusAttempt,launchStatusIdleRecoveryExhausted,launchStarting,launchWaiting,outputExecution,outputResults,outputRuns,outputTargets,loading,loadError,minimizeTerminal,openAction,operationBusy,previewCanRestart,previewCanShowLog,previewCanStart,previewIdentity:previewIdentityCapability,previewMessage,previewState,publishPreviewState,requestPreviewIdentityGrant,refresh:refreshOutputs,restartTerminal,retryTerminal,run,startNewlyConfiguredWorkspaceSetup,terminal,terminalCanRestart,terminalCanRetry,terminalCommandPreview,terminalDisplayed,terminalDockVisible,terminalError,terminalExpanded,terminalIndicatorLabel,terminalIndicatorState,terminalIsRunning,terminalPreviewRequiresProxy,terminalStatus,terminalSessionId,terminalSubtitle,terminalTitle,terminalVisible,terminalWindowVisible,terminalWindowStorageKey,visible}=useVibe64OutputControls({autoStartManagedPreview:()=>props.autoStartManagedPreview,autoStartTargetId:()=>props.autoStartTargetId,embeddedPreview:()=>props.embeddedPreview,previewDisplayed:()=>props.previewDisplayed,sourceOperationsSuspended:()=>props.sourceOperationsSuspended,windowDisplayed:()=>props.windowDisplayed,busy:()=>props.busy,session:()=>props.session});const runMenuDisabled=computed(()=>Boolean(launchButtonsDisabled.value||loading.value||outputTargets.value.length<1));const previewFrame=ref(null);const previewBridgeVersion=ref(0);const previewBridgeRequests=createPreviewBridgeRequestRegistry();const previewDiagnosticsBusy=ref(false);const previewIdentityBusy=ref(false);const previewIdentityCurrent=ref(null);const previewIdentityError=ref("");const previewIdentityRequested=ref(null);const previewResourceNoticeText=ref("");const previewResourceNoticeVisible=ref(false);let previewIdentityAutomaticAttempt="";let previewIdentityLifecycle="";let previewIdentityReloadRequestId=0;let previewResourceRetryCount=0;let previewResourceRetryLifecycle="";let previewResourceRetryTimer=null;const previewFrameRequest=ref({id:0,identity:"",src:""});const previewLoadedFrameRequestId=ref(0);const previewAddressDraft=ref("");const previewAddressError=ref("");const previewAddressFocused=ref(false);const previewHistory=ref([]);const previewRouteDialogVisible=ref(false);const previewRouteDialogError=ref("");const previewRouteFormValues=ref({});const previewRouteSelection=ref(null);const previewLogVisible=ref(false);const previewVisitedUrl=ref("");const previewToolbarExpanded=ref(false);const previewToolbarPosition=ref("center");const projectSlug=useVibe64ProjectSlug();const toolbarTeleportTarget=computed(()=>String(props.toolbarTeleportTarget||"").trim());const embeddedTerminalVisible=computed(()=>Boolean(props.embeddedPreview&&terminalDisplayed.value&&terminalExpanded.value));const terminalSurfaceVisible=computed(()=>Boolean(terminalDisplayed.value&&terminalVisible.value));const embeddedTerminalSurfaceVisible=computed(()=>Boolean(props.embeddedPreview&&terminalSurfaceVisible.value&&terminalExpanded.value));const requestedAutoStartTargetId=computed(()=>String(props.autoStartTargetId||"").trim());const embeddedAutoStartTarget=computed(()=>{if(!props.embeddedPreview||!requestedAutoStartTargetId.value){return null}return outputTargets.value.find(target=>{var _a;return target.id===requestedAutoStartTargetId.value&&((_a=target.presentation)==null?void 0:_a.kind)==="web"})||null});const embeddedStartTarget=computed(()=>{if(!props.embeddedPreview){return null}return embeddedAutoStartTarget.value||managedPreviewTarget(outputTargets.value)||preferredPreviewTarget(outputTargets.value)});const embeddedStartTargetUnavailableReason=computed(()=>{const target=embeddedStartTarget.value;return(target==null?void 0:target.available)===false?String(target.disabledReason||"Preview cannot start yet.").trim():""});const embeddedManualStartButtonVisible=computed(()=>Boolean(props.embeddedPreview&&embeddedStartTarget.value&&embeddedStartTarget.value.available!==false&&!terminalVisible.value));const embeddedManualStartButtonDisabled=computed(()=>Boolean(operationBusy.value||!embeddedStartTarget.value||embeddedStartTarget.value.available===false));const manualLaunchMenuVisible=computed(()=>Boolean(!terminalVisible.value&&outputTargets.value.length>0&&!(props.embeddedPreview&&embeddedStartTarget.value&&(requestedAutoStartTargetId.value||props.autoStartManagedPreview))));const previewToolbarStorageKey=computed(()=>props.embeddedPreview&&props.session?launchPreviewToolbarStorageKey(props.session,projectSlug.value):"");const previewLocationStorageKey=computed(()=>props.embeddedPreview&&props.session?launchPreviewLocationStorageKey(props.session,projectSlug.value):"");const previewContextTarget=computed(()=>embeddedAutoStartTarget.value||activeOutputTarget.value||embeddedStartTarget.value||null);const previewRoutes=computed(()=>previewRoutesForTarget(previewContextTarget.value));const previewRoutesAvailable=computed(()=>previewRoutes.value.length>0);const previewRouteDialogPath=computed(()=>{const route=previewRouteSelection.value;if(!route){return""}return previewRoutePath(route,previewRouteFormValues.value).path});const previewRouteDialogParams=computed(()=>previewRouteSelection.value?previewRouteParams(previewRouteSelection.value):[]);const previewDestination=computed(()=>resolveLaunchPreviewDestination(launchActions.value,{requirePreviewProxy:terminalPreviewRequiresProxy.value}));const previewBaseUrl=computed(()=>previewDestination.value.embedHref);const previewEmbedUnavailableReason=computed(()=>previewDestination.value.unavailableReason);const previewDisplayBaseUrl=computed(()=>previewDestination.value.displayHref);const previewDisplayedUrl=computed(()=>previewVisitedUrl.value||previewDisplayBaseUrl.value||previewBaseUrl.value);const previewDisplayedAddress=computed(()=>previewAddressDisplayText(previewDisplayedUrl.value,{displayBaseUrl:previewDisplayBaseUrl.value,previewBaseUrl:previewBaseUrl.value}));const previewBackAvailable=computed(()=>previewHistory.value.length>1);const previewPaneDisplayed=computed(()=>props.previewDisplayed!==false);const previewReadyForIframe=computed(()=>Boolean(["ready","stale"].includes(previewState.value)&&previewBaseUrl.value));const previewIdentityAvailable=computed(()=>{var _a;return Boolean(props.embeddedPreview&&((_a=previewIdentityCapability.value)==null?void 0:_a.available)===true)});const previewIdentityConfigured=computed(()=>{var _a;return normalizeConfiguredPreviewIdentities((_a=previewIdentityCapability.value)==null?void 0:_a.identities)});const previewIdentityLifecycleKey=computed(()=>{var _a,_b,_c,_d;return previewIdentityLifecycleIdentity({outputTargetId:((_a=activeOutputTarget.value)==null?void 0:_a.id)||((_c=(_b=terminal.value)==null?void 0:_b.metadata)==null?void 0:_c.outputTargetId),previewBaseUrl:previewBaseUrl.value,projectSlug:projectSlug.value,sessionId:(_d=props.session)==null?void 0:_d.sessionId,terminalSessionId:terminalSessionId.value})});const previewIdentityLabel=computed(()=>previewIdentityLabelText({busy:previewIdentityBusy.value,identity:previewIdentityCurrent.value}));const previewIdentityTitle=computed(()=>previewIdentityTitleText({busy:previewIdentityBusy.value,error:previewIdentityError.value,identity:previewIdentityCurrent.value}));const previewFrameRequestId=computed(()=>previewFrameRequest.value.id);const previewUrl=computed(()=>previewFrameRequest.value.src);const previewFrameLoaded=computed(()=>Boolean(previewUrl.value&&previewFrameRequestId.value>0&&previewLoadedFrameRequestId.value===previewFrameRequestId.value));const previewIdentitySelectionDisabled=computed(()=>Boolean(previewIdentityBusy.value||!previewFrameLoaded.value));const previewDiagnosticsAvailable=computed(()=>{var _a;return Boolean(previewFrameLoaded.value&&((_a=previewFrame.value)==null?void 0:_a.contentWindow)&&previewBridgeVersion.value>=PREVIEW_BRIDGE_VERSION)});const previewCheckAgainVisible=computed(()=>Boolean(props.embeddedPreview&&previewState.value==="idle"&&!previewUrl.value&&!terminalVisible.value&&embeddedStartTargetUnavailableReason.value&&!loadError.value));const previewStarting=computed(()=>Boolean(previewState.value==="starting"));const launchStatusText=computed(()=>launchPreviewStatusText({attempt:launchStatusAttempt.value,loadError:loadError.value,loading:loading.value}));const launchStatusDetailText=computed(()=>String(loadError.value||"").trim());const launchStatusChipVisible=computed(()=>Boolean(loadError.value||loading.value&&!previewUrl.value));const launchStatusRetryVisible=computed(()=>Boolean(loadError.value));const launchStatusChipText=computed(()=>{const attempt=launchStatusAttempt.value||1;if(loadError.value){return`Preview status failed (attempt ${attempt})`}if(loading.value){return`Checking preview (attempt ${attempt})`}return""});const launchStatusChipTitle=computed(()=>launchStatusText.value||launchStatusChipText.value);const previewLoadingOverlayVisible=computed(()=>previewLoadingOverlayShouldShow({identityBusy:previewIdentityBusy.value,loadedFrameRequestId:previewLoadedFrameRequestId.value,previewFrameRequestId:previewFrameRequestId.value,previewUrl:previewUrl.value}));const previewInFlightText=computed(()=>{if(previewIdentityBusy.value){const requested=previewIdentityRequested.value;return(requested==null?void 0:requested.mode)==="guest"?"Signing out of the preview…":`Opening preview as ${(requested==null?void 0:requested.name)||(requested==null?void 0:requested.identityName)||"the selected app identity"}…`}return launchPreviewInFlightText({activeOutputTarget:activeOutputTarget.value,embeddedStartTarget:embeddedStartTarget.value,launchStarting:launchStarting.value,launchWaiting:launchWaiting.value,launchStatusText:launchStatusText.value,loading:loading.value,operationBusy:operationBusy.value,previewDisplayedAddress:previewDisplayedAddress.value,previewEmbedUnavailableReason:previewEmbedUnavailableReason.value,previewLoadingOverlayVisible:previewLoadingOverlayVisible.value,previewUrl:previewUrl.value,terminalCanRestart:terminalCanRestart.value,terminalCanRetry:terminalCanRetry.value,terminalIsRunning:terminalIsRunning.value})});const previewIssue=computed(()=>launchPreviewIssue({launchError:launchError.value,message:previewMessage.value,state:previewState.value}));const previewIssueVisible=computed(()=>Boolean(props.embeddedPreview&&previewIssue.value));const previewNotice=computed(()=>launchPreviewNotice({launchError:launchError.value,message:previewMessage.value,state:previewState.value}));const embeddedTerminalFrameVisible=computed(()=>Boolean(embeddedTerminalVisible.value&&(!previewNotice.value||previewLogVisible.value)));const previewNoticeVisible=computed(()=>Boolean(props.embeddedPreview&&previewNotice.value&&!embeddedTerminalFrameVisible.value));const previewRecoveryVisible=computed(()=>{var _a;return Boolean(props.embeddedPreview&&previewNoticeVisible.value&&(((_a=embeddedStartTarget.value)==null?void 0:_a.available)!==false&&(previewCanRestart.value||previewCanStart.value)||terminalCanRestart.value||terminalCanRetry.value))});const previewRecoveryLabel=computed(()=>terminalCanRetry.value&&!previewCanRestart.value&&!previewCanStart.value&&!terminalCanRestart.value?"Retry preview":"Restart preview");const launchToolbarDockVisible=computed(()=>launchToolbarDockShouldShow({embeddedPreview:props.embeddedPreview,embeddedTerminalVisible:embeddedTerminalFrameVisible.value,previewIssueVisible:previewIssueVisible.value,terminalDockVisible:terminalDockVisible.value,terminalVisible:terminalVisible.value}));const previewToolbarRecoveryVisible=computed(()=>Boolean(props.embeddedPreview&&launchToolbarDockVisible.value&&(previewCanRestart.value||terminalCanRestart.value||terminalCanRetry.value)&&embeddedStartTarget.value));const previewTerminalRecoveryVisible=computed(()=>Boolean(props.embeddedPreview&&terminalVisible.value&&(previewCanRestart.value||terminalCanRestart.value||terminalCanRetry.value)&&embeddedStartTarget.value));const previewActivityVisible=computed(()=>Boolean(previewStarting.value||launchStarting.value||launchWaiting.value||terminalIsRunning.value||loading.value));const previewEmptyText=computed(()=>launchPreviewEmptyText({launchStatusText:launchStatusText.value,loading:loading.value,loadError:loadError.value,previewInFlightText:previewInFlightText.value,previewManualStartAvailable:embeddedManualStartButtonVisible.value,previewMessage:previewMessage.value,previewState:previewState.value,previewStartUnavailableReason:embeddedStartTargetUnavailableReason.value,launchStarting:launchStarting.value,outputTargetsUnavailable:launchStatusIdleRecoveryExhausted.value&&outputTargets.value.length<1,terminalIsRunning:terminalIsRunning.value}));function previewClientDebugEnabled(){var _a;if(typeof window==="undefined"){return false}try{return((_a=window.localStorage)==null?void 0:_a.getItem("vibe64:preview-debug"))==="1"||new URL(window.location.href).searchParams.has("vibe64_preview_debug")}catch{return false}}function previewDebugLog(event="",details={}){var _a,_b,_c;if(!previewClientDebugEnabled()){return}vibe64SessionDebugLog(`client.launchPreview.${event}`,redactPreviewDebugDetails({frameRequestId:previewFrameRequestId.value,frameSrc:String(((_b=(_a=previewFrame.value)==null?void 0:_a.getAttribute)==null?void 0:_b.call(_a,"src"))||""),loadedFrameRequestId:previewLoadedFrameRequestId.value,overlayVisible:previewLoadingOverlayVisible.value,previewBaseUrl:previewBaseUrl.value,previewDisplayBaseUrl:previewDisplayBaseUrl.value,previewState:previewState.value,previewUrl:previewUrl.value,projectSlug:projectSlug.value,sessionId:String(((_c=props.session)==null?void 0:_c.sessionId)||""),...details&&typeof details==="object"&&!Array.isArray(details)?details:{}}))}function resetPreviewBridge(reason=""){previewBridgeVersion.value=0;previewBridgeRequests.rejectAll("The application preview changed.");previewDiagnosticsBusy.value=false;previewDebugLog("bridge.reset",{reason})}function cancelPreviewResourceRetry(){if(previewResourceRetryTimer!==null){clearTimeout(previewResourceRetryTimer);previewResourceRetryTimer=null}}function resetPreviewResourceRecovery(lifecycle=""){cancelPreviewResourceRetry();previewResourceRetryCount=0;previewResourceRetryLifecycle=String(lifecycle||"");previewResourceNoticeText.value="";previewResourceNoticeVisible.value=false}function showPreviewResourceNotice(message=""){previewResourceNoticeText.value=String(message||"");previewResourceNoticeVisible.value=Boolean(previewResourceNoticeText.value)}function handlePreviewResourceFailure(message={}){const lifecycle=previewIdentityLifecycleKey.value;if(!lifecycle||!previewUrl.value){return false}if(previewResourceRetryLifecycle!==lifecycle){resetPreviewResourceRecovery(lifecycle)}if(previewResourceRetryTimer!==null){return false}const resourceKind=String((message==null?void 0:message.kind)||"resource").trim()||"resource";const resourceUrl=String((message==null?void 0:message.href)||"").trim();const willRetry=previewResourceRetryCount<PREVIEW_RESOURCE_RETRY_LIMIT;const notice=willRetry?"Preview could not load an application resource. Retrying automatically…":"Preview could not load an application resource after retrying. Use Reload preview to try again.";showPreviewResourceNotice(notice);console.error(`[Vibe64 preview] ${notice}`,{resourceKind,resourceUrl});previewDebugLog("resource.failed",{resourceKind,resourceUrl,retryCount:previewResourceRetryCount,willRetry});if(!willRetry){return false}previewResourceRetryCount+=1;const failedFrameRequestId=previewFrameRequestId.value;previewResourceRetryTimer=setTimeout(()=>{previewResourceRetryTimer=null;if(previewResourceRetryLifecycle!==previewIdentityLifecycleKey.value||failedFrameRequestId!==previewFrameRequestId.value){return}const reloaded=requestPreviewFrame({force:true,reason:"resource-load-retry"});if(!reloaded){const failureNotice="Preview could not be reloaded automatically. Use Reload preview to try again.";showPreviewResourceNotice(failureNotice);console.error(`[Vibe64 preview] ${failureNotice}`)}},PREVIEW_RESOURCE_RETRY_DELAY_MS);return true}function clearPreviewFrame(reason=""){resetPreviewBridge(reason||"frame-cleared");if(!previewFrameRequest.value.src){return false}previewFrameRequest.value={id:previewFrameRequest.value.id+1,identity:"",src:""};previewLoadedFrameRequestId.value=0;previewDebugLog("frame.cleared",{reason});return true}function requestPreviewFrame({force=false,reason="",src="",visitedUrl=previewVisitedUrl.value}={}){var _a,_b;if(!previewReadyForIframe.value){return false}const nextSrc=String(src||"").trim()||launchPreviewFrameUrl({baseUrl:previewBaseUrl.value,displayBaseUrl:previewDisplayBaseUrl.value,visitedUrl:visitedUrl||previewDisplayBaseUrl.value||previewBaseUrl.value});const nextIdentity=previewFrameLifecycleIdentity({outputTargetId:(_a=activeOutputTarget.value)==null?void 0:_a.id,sessionId:(_b=props.session)==null?void 0:_b.sessionId,src:nextSrc,terminalSessionId:terminalSessionId.value});if(!nextIdentity||!force&&nextIdentity===previewFrameRequest.value.identity){return false}resetPreviewBridge(reason||"frame-requested");previewFrameRequest.value={id:previewFrameRequest.value.id+1,identity:nextIdentity,src:nextSrc};if(previewIdentityReloadRequestId>0){previewIdentityReloadRequestId=previewFrameRequest.value.id}previewDebugLog("frame.requested",{force,reason,src:nextSrc});return true}async function reloadPreview(){resetPreviewResourceRecovery(previewIdentityLifecycleKey.value);const requestIdBeforeRefresh=previewFrameRequestId.value;await refreshOutputs();await nextTick();if(previewFrameRequestId.value!==requestIdBeforeRefresh){return true}return requestPreviewFrame({force:true,reason:"manual-reload"})}async function retryLaunchStatus(){await(startNewlyConfiguredWorkspaceSetup==null?void 0:startNewlyConfiguredWorkspaceSetup());await refreshOutputs()}function movePreviewToolbar(direction=0){previewToolbarPosition.value=nextLaunchPreviewToolbarPosition(previewToolbarPosition.value,direction);if(previewToolbarStorageKey.value){writeLocalStorageJson(previewToolbarStorageKey.value,previewToolbarPosition.value)}}function collapsePreviewToolbar(){previewToolbarExpanded.value=false}function expandPreviewToolbar(){previewToolbarExpanded.value=true}async function copyPreviewUrl(){var _a;if(!previewDisplayedAddress.value||typeof navigator==="undefined"||!((_a=navigator.clipboard)==null?void 0:_a.writeText)){return false}await navigator.clipboard.writeText(previewDisplayedAddress.value);return true}function resetPreviewAddressDraft(){previewAddressError.value="";previewAddressDraft.value=previewDisplayedAddress.value||""}function previewAddressFocus(){previewAddressFocused.value=true}function previewAddressBlur(){previewAddressFocused.value=false;if(!previewAddressError.value){previewAddressDraft.value=previewDisplayedAddress.value||""}}function resetPreviewHistory(url=""){const normalizedUrl=previewUrlWithoutDisplayParams(url);previewHistory.value=normalizedUrl?[normalizedUrl]:[]}function storedPreviewRoute(){const stored=readLocalStorageJson(previewLocationStorageKey.value,null);if(stored&&typeof stored==="object"&&!Array.isArray(stored)){return normalizePreviewRoute(stored.route||previewRouteFromUrl(stored.url||""))}return normalizePreviewRoute(stored||"")}function storedPreviewUrl(baseUrl=""){return previewUrlForRoute(storedPreviewRoute(),baseUrl)}function writePreviewLocation(url=""){const route=previewRouteFromUrl(url);if(!route||!previewLocationStorageKey.value){return}writeLocalStorageJson(previewLocationStorageKey.value,{route})}function recordPreviewHistory(url="",reason=""){const normalizedUrl=previewUrlWithoutDisplayParams(url);if(!normalizedUrl){return}const history=previewHistory.value.filter(Boolean);const currentUrl=history.at(-1)||"";if(currentUrl===normalizedUrl){return}const previousUrl=history.at(-2)||"";if(previousUrl===normalizedUrl){previewHistory.value=history.slice(0,-1);return}if(String(reason||"")==="replaceState"&&history.length>0){previewHistory.value=[...history.slice(0,-1),normalizedUrl];return}previewHistory.value=[...history,normalizedUrl].slice(-50)}function setPreviewVisitedUrl(url="",{reason=""}={}){const normalizedUrl=previewUrlWithoutDisplayParams(url);if(!normalizedUrl){return}previewVisitedUrl.value=normalizedUrl;writePreviewLocation(normalizedUrl);recordPreviewHistory(normalizedUrl,reason)}function navigatePreviewToDisplayUrl(displayUrl=""){const navigation=launchPreviewAddressNavigationUrl({address:displayUrl,currentUrl:previewDisplayedUrl.value,displayBaseUrl:previewDisplayBaseUrl.value,previewBaseUrl:previewBaseUrl.value});if(!navigation.ok){previewAddressError.value=navigation.error;return false}previewAddressError.value="";previewAddressDraft.value=previewAddressDisplayText(navigation.displayUrl,{displayBaseUrl:previewDisplayBaseUrl.value,previewBaseUrl:previewBaseUrl.value});setPreviewVisitedUrl(navigation.displayUrl,{reason:"address"});requestPreviewFrame({force:true,reason:"address",src:navigation.previewUrl,visitedUrl:navigation.displayUrl});previewDebugLog("address.navigate",{displayUrl:navigation.displayUrl,previewUrl:navigation.previewUrl});return true}function submitPreviewAddress(){return navigatePreviewToDisplayUrl(previewAddressDraft.value)}function openPreviewRoute(route={}){if(!(route==null?void 0:route.pathTemplate)){return false}if(!previewRouteHasParams(route)){return navigatePreviewToDisplayUrl(route.pathTemplate)}previewRouteSelection.value=route;previewRouteFormValues.value=previewRouteInitialFormValues(route);previewRouteDialogError.value="";previewRouteDialogVisible.value=true;return true}function submitPreviewRouteDialog(){const route=previewRouteSelection.value;if(!route){previewRouteDialogVisible.value=false;return false}const result=previewRoutePath(route,previewRouteFormValues.value);if(!result.ok){previewRouteDialogError.value=result.missingParam?`Enter ${result.missingParam}.`:"Preview route is invalid.";return false}const navigated=navigatePreviewToDisplayUrl(result.path);if(navigated){previewRouteDialogVisible.value=false}return navigated}function goPreviewBack(){if(!previewBackAvailable.value){return false}const previousUrl=previewHistory.value.at(-2)||"";if(previousUrl&&navigatePreviewToDisplayUrl(previousUrl)){return true}return false}function requestPreviewState(){var _a,_b;if(!previewPaneDisplayed.value||!((_a=previewFrame.value)==null?void 0:_a.contentWindow)||!previewUrl.value){if(previewUrl.value){previewDebugLog("query.skipped",{hasContentWindow:Boolean((_b=previewFrame.value)==null?void 0:_b.contentWindow),previewPaneDisplayed:previewPaneDisplayed.value})}return}previewDebugLog("query.post");previewFrame.value.contentWindow.postMessage({type:PREVIEW_QUERY_MESSAGE_TYPE},"*")}async function requestPreviewDiagnostics({signal=null}={}){var _a;if(previewDiagnosticsBusy.value){throw new Error("Preview diagnostics are already being collected.")}if(!previewDiagnosticsAvailable.value){throw new Error("Preview diagnostics are not available for the current app page.")}previewDiagnosticsBusy.value=true;try{return await previewBridgeRequests.request({frameRequestId:previewFrameRequestId.value,message:{type:PREVIEW_DIAGNOSTICS_REQUEST_MESSAGE_TYPE},signal,targetWindow:(_a=previewFrame.value)==null?void 0:_a.contentWindow,timeoutMessage:"The proxied app did not return its diagnostics in time.",timeoutMs:PREVIEW_DIAGNOSTICS_TIMEOUT_MS})}finally{previewDiagnosticsBusy.value=false}}function requestPreviewIdentityExchange(grant=""){var _a;if(!previewFrameLoaded.value){return Promise.reject(new Error("The application preview is not ready to switch identity."))}return previewBridgeRequests.request({frameRequestId:previewFrameRequestId.value,message:{grant:String(grant||""),type:PREVIEW_IDENTITY_REQUEST_MESSAGE_TYPE},targetWindow:(_a=previewFrame.value)==null?void 0:_a.contentWindow,timeoutMessage:"The application preview did not complete the identity exchange in time.",timeoutMs:PREVIEW_IDENTITY_TIMEOUT_MS})}function completePreviewIdentityTransition(){previewIdentityBusy.value=false;previewIdentityRequested.value=null;previewIdentityReloadRequestId=0}function resetPreviewIdentityState(){completePreviewIdentityTransition();previewIdentityCurrent.value=null;previewIdentityError.value=""}function reloadPreviewForIdentity(reason="identity-changed"){const requested=requestPreviewFrame({force:true,reason});if(!requested){completePreviewIdentityTransition();return false}previewIdentityReloadRequestId=previewFrameRequestId.value;return true}async function selectPreviewIdentity(selection={}){if(previewIdentitySelectionDisabled.value||!previewIdentityAvailable.value){return false}const mode=String(selection.mode||"identity").trim();const identityName=String(selection.identityName||"").trim().toLowerCase();const requested=mode==="identity"?{identityName,mode}:{mode:"guest"};previewIdentityBusy.value=true;previewIdentityError.value="";previewIdentityRequested.value=requested;try{const grantResult=await requestPreviewIdentityGrant(requested);const grant=String((grantResult==null?void 0:grantResult.grant)||"").trim();if(!grant||(grantResult==null?void 0:grantResult.ok)===false){throw new Error(String((grantResult==null?void 0:grantResult.error)||"Vibe64 could not authorize the preview identity exchange."))}const requestedIdentity=grantResult.requestedIdentity||requested;previewIdentityRequested.value=requestedIdentity;const exchangeResult=await requestPreviewIdentityExchange(grant);previewIdentityCurrent.value=previewIdentityFromExchange(exchangeResult,requestedIdentity);reloadPreviewForIdentity("identity-selected");return true}catch(error){const message=String((error==null?void 0:error.message)||error||"Preview identity exchange failed.");previewIdentityError.value=message;if((error==null?void 0:error.signedOut)===true){previewIdentityCurrent.value={mode:"guest"};previewIdentityRequested.value={mode:"guest"};reloadPreviewForIdentity("identity-exchange-signed-out")}else{completePreviewIdentityTransition()}return false}}function selectPreviewConfiguredIdentity(identity={}){const identityName=String((identity==null?void 0:identity.name)||"").trim();if(!identityName){return false}return selectPreviewIdentity({identityName,mode:"identity"})}function selectPreviewGuest(){return selectPreviewIdentity({mode:"guest"})}function beginDefaultPreviewIdentity(){const lifecycle=previewIdentityLifecycleKey.value;if(!lifecycle||!previewIdentityAvailable.value||previewIdentityAutomaticAttempt===lifecycle){return false}previewIdentityAutomaticAttempt=lifecycle;void selectPreviewIdentity(defaultPreviewIdentitySelection({capability:previewIdentityCapability.value}));return true}function markPreviewFrameReady(requestId,reason=""){var _a;const normalizedRequestId=Math.max(0,Number(requestId)||0);if(!normalizedRequestId||normalizedRequestId!==previewFrameRequestId.value||!((_a=previewFrame.value)==null?void 0:_a.contentWindow)){return false}if(previewLoadedFrameRequestId.value===normalizedRequestId){return false}previewLoadedFrameRequestId.value=normalizedRequestId;previewDebugLog("iframe.ready",{reason,requestId:normalizedRequestId});if(normalizedRequestId===previewIdentityReloadRequestId){completePreviewIdentityTransition();return true}beginDefaultPreviewIdentity();return true}function handlePreviewFrameLoad(event){var _a;const frame=(event==null?void 0:event.currentTarget)||null;const requestId=Number(((_a=frame==null?void 0:frame.dataset)==null?void 0:_a.previewFrameRequestId)||0);if(!requestId||frame!==previewFrame.value||requestId!==previewFrameRequestId.value){previewDebugLog("iframe.loadIgnored",{requestId});return}if(!previewFrameLoaded.value){resetPreviewBridge("iframe-loaded-without-bridge-ready");markPreviewFrameReady(requestId,"iframe-load")}previewDebugLog("iframe.loaded",{requestId});requestPreviewState()}async function forceStartEmbeddedPreview(){if(operationBusy.value){return false}if(!embeddedStartTarget.value||embeddedStartTarget.value.available===false){return false}return run(embeddedStartTarget.value,{applyDefaultDisplay:false,forceRestart:true})}async function recoverEmbeddedPreview(){if(operationBusy.value){return false}if(embeddedStartTarget.value&&embeddedStartTarget.value.available!==false&&(previewCanRestart.value||previewCanStart.value||terminalCanRestart.value||terminalCanRetry.value)){return forceStartEmbeddedPreview()}if(terminalCanRestart.value){return restartTerminal()}if(terminalCanRetry.value){return retryTerminal()}return false}async function recheckResourceAdmission({outputTargetId="",startIfStopped=false}={}){var _a,_b;if(operationBusy.value)return false;const project=projectSlug.value;const session=(_a=props.session)==null?void 0:_a.sessionId;operationBusy.value=true;try{await refreshOutputs();await nextTick()}finally{operationBusy.value=false}if(project!==projectSlug.value||session!==((_b=props.session)==null?void 0:_b.sessionId)||loadError.value)return false;if(terminalIsRunning.value||["ready","starting"].includes(previewState.value))return true;const target=outputTargets.value.find(item=>item.id===outputTargetId);return startIfStopped&&target?run(target,{applyDefaultDisplay:false}):false}function setTerminalExpanded(expanded){previewLogVisible.value=Boolean(expanded);if(expanded){void expandTerminal();return}minimizeTerminal()}function showLaunchLog(){collapsePreviewToolbar();previewLogVisible.value=true;void expandTerminal()}function previewMessageUrl(data={}){if(!data||typeof data!=="object"||data.type!==PREVIEW_LOCATION_MESSAGE_TYPE){return""}const href=String(data.href||data.url||"").trim();const baseUrl=String(previewDisplayBaseUrl.value||previewBaseUrl.value||"").trim();if(!href||!baseUrl){return""}try{const url=new URL(href,baseUrl);const baseOrigin=new URL(baseUrl).origin;if(url.origin===baseOrigin){return previewUrlWithoutDisplayParams(url.toString())}const mappedUrl=previewMessageTargetUrlToPreviewUrl(url);return mappedUrl?previewUrlWithoutDisplayParams(mappedUrl):""}catch{return""}}function previewMessageTargetUrlToPreviewUrl(targetUrl){const previewBase=String(previewBaseUrl.value||"").trim();if(!previewBase||!targetUrl){return""}const matchingAction=launchActions.value.find(action=>{try{return new URL(String((action==null?void 0:action.href)||"")).origin===targetUrl.origin&&String((action==null?void 0:action.previewHref)||"").trim()}catch{return false}});if(!matchingAction){return""}try{const previewUrl2=new URL(previewBase);previewUrl2.pathname=targetUrl.pathname;previewUrl2.search=targetUrl.search;previewUrl2.hash=targetUrl.hash;return previewUrl2.toString()}catch{return""}}function previewMessageOriginAllowed(event){const origins=[previewBaseUrl.value,previewDisplayBaseUrl.value].map(value=>{try{return value?new URL(value).origin:""}catch{return""}}).filter(Boolean);return origins.length<1||origins.includes(String((event==null?void 0:event.origin)||""))}function previewMessageType(value={}){return String((value==null?void 0:value.type)||"")}function isPreviewBridgeMessage(value={}){return[PREVIEW_BRIDGE_READY_MESSAGE_TYPE,PREVIEW_DIAGNOSTICS_RESPONSE_MESSAGE_TYPE,PREVIEW_IDENTITY_RESPONSE_MESSAGE_TYPE,PREVIEW_LOCATION_MESSAGE_TYPE,PREVIEW_RESOURCE_FAILURE_MESSAGE_TYPE].includes(previewMessageType(value))}function handlePreviewBridgeMessage(event){var _a,_b,_c,_d,_e,_f,_g,_h,_i,_j,_k,_l,_m,_n,_o;if(!isPreviewBridgeMessage(event==null?void 0:event.data)){return}if((event==null?void 0:event.source)!==((_a=previewFrame.value)==null?void 0:_a.contentWindow)){previewDebugLog("message.ignored",{messageType:previewMessageType(event==null?void 0:event.data),origin:String((event==null?void 0:event.origin)||""),reason:"source_mismatch"});return}if(!previewMessageOriginAllowed(event)){previewDebugLog("message.ignored",{messageType:previewMessageType(event==null?void 0:event.data),origin:String((event==null?void 0:event.origin)||""),reason:"origin_not_allowed"});return}const messageType=previewMessageType(event.data);const bridgeReady=isPreviewBridgeReadyMessage(event.data);if(bridgeReady&&previewFrameLoaded.value){resetPreviewBridge("bridge-document-ready")}previewBridgeVersion.value=Math.max(previewBridgeVersion.value,Math.max(0,Number((_b=event==null?void 0:event.data)==null?void 0:_b.version)||0));if(bridgeReady){markPreviewFrameReady(previewFrameRequestId.value,"bridge-ready");return}if(messageType===PREVIEW_RESOURCE_FAILURE_MESSAGE_TYPE){handlePreviewResourceFailure(event.data);return}if(messageType===PREVIEW_DIAGNOSTICS_RESPONSE_MESSAGE_TYPE){const requestId=String(((_c=event.data)==null?void 0:_c.requestId)||"");previewBridgeRequests.resolve(requestId,((_d=event.data)==null?void 0:_d.diagnostics)||{});return}if(messageType===PREVIEW_IDENTITY_RESPONSE_MESSAGE_TYPE){const requestId=String(((_e=event.data)==null?void 0:_e.requestId)||"");if(((_f=event.data)==null?void 0:_f.ok)===true){previewBridgeRequests.resolve(requestId,{identity:((_g=event.data)==null?void 0:_g.identity)||null})}else{previewBridgeRequests.reject(requestId,Object.assign(new Error(String(((_h=event.data)==null?void 0:_h.error)||"Preview identity exchange failed.")),{code:String(((_i=event.data)==null?void 0:_i.code)||"vibe64_preview_identity_exchange_failed"),signedOut:((_j=event.data)==null?void 0:_j.signedOut)===true}))}return}const frameUrl=previewMessageUrl(event.data);previewDebugLog("message.received",{frameUrl,href:String(((_k=event==null?void 0:event.data)==null?void 0:_k.href)||((_l=event==null?void 0:event.data)==null?void 0:_l.url)||""),messageType:previewMessageType(event==null?void 0:event.data),origin:String((event==null?void 0:event.origin)||""),reason:String(((_m=event==null?void 0:event.data)==null?void 0:_m.reason)||"")});if(frameUrl){setPreviewVisitedUrl(frameUrl,{reason:String(((_n=event==null?void 0:event.data)==null?void 0:_n.reason)||"")});void publishPreviewState({route:previewRouteFromUrl(frameUrl),title:String(((_o=event==null?void 0:event.data)==null?void 0:_o.title)||"")})}}watch(previewIdentityLifecycleKey,lifecycle=>{if(lifecycle===previewIdentityLifecycle){return}previewIdentityLifecycle=lifecycle;previewIdentityAutomaticAttempt="";resetPreviewResourceRecovery(lifecycle);resetPreviewIdentityState();previewBridgeRequests.rejectAll("The active application preview changed.");previewDiagnosticsBusy.value=false},{flush:"sync",immediate:true});watch(previewIdentityAvailable,available=>{if(available&&previewFrameLoaded.value){beginDefaultPreviewIdentity()}});watch(previewLocationStorageKey,(storageKey,previousStorageKey)=>{if(storageKey===previousStorageKey){return}previewVisitedUrl.value="";resetPreviewHistory("")},{flush:"sync",immediate:true});watch([previewReadyForIframe,previewBaseUrl,previewDisplayBaseUrl],([ready,baseUrl,displayBaseUrl],previous=[])=>{const previousDisplayBaseUrl=previous[2]||"";const normalizedDisplayBaseUrl=previewUrlWithoutDisplayParams(displayBaseUrl);if(normalizedDisplayBaseUrl&&(!previewVisitedUrl.value||normalizedDisplayBaseUrl!==previewUrlWithoutDisplayParams(previousDisplayBaseUrl))){const restoredUrl=storedPreviewUrl(normalizedDisplayBaseUrl);const route=previewRouteFromUrl(previewVisitedUrl.value||restoredUrl||normalizedDisplayBaseUrl);previewVisitedUrl.value=previewUrlForRoute(route,normalizedDisplayBaseUrl)||normalizedDisplayBaseUrl;resetPreviewHistory(previewVisitedUrl.value)}if(!ready||!baseUrl){return}requestPreviewFrame({reason:"preview-ready"})},{flush:"sync",immediate:true});watch(()=>{var _a;return String(((_a=props.session)==null?void 0:_a.sessionId)||"")},(sessionId,previousSessionId)=>{if(previousSessionId&&sessionId!==previousSessionId){clearPreviewFrame("session-changed")}},{flush:"sync"});watch(previewPaneDisplayed,displayed=>{if(!displayed){return}requestPreviewState()},{flush:"sync"});watch(previewDisplayedAddress,url=>{if(!previewAddressFocused.value){previewAddressDraft.value=url||""}},{immediate:true});watch(previewToolbarStorageKey,storageKey=>{previewToolbarExpanded.value=false;previewToolbarPosition.value=normalizeLaunchPreviewToolbarPosition(readLocalStorageJson(storageKey,"center"))},{immediate:true});onBeforeMount(()=>{window.addEventListener("message",handlePreviewBridgeMessage)});onBeforeUnmount(()=>{window.removeEventListener("message",handlePreviewBridgeMessage);cancelPreviewResourceRetry();previewBridgeRequests.rejectAll("The application preview closed.")});return{embeddedAutoStartTarget,embeddedManualStartButtonDisabled,embeddedManualStartButtonVisible,embeddedStartTarget,embeddedTerminalFrameVisible,embeddedTerminalSurfaceVisible,embeddedTerminalVisible,collapsePreviewToolbar,forceStartEmbeddedPreview,goPreviewBack,handlePreviewFrameLoad,expandPreviewToolbar,launchActions,launchButtonsDisabled,launchError,resourceAdmissionId,testApproval,acceptResourceRetry,launchStatusAttempt,launchStatusChipText,launchStatusChipTitle,launchStatusChipVisible,launchStatusDetailText,launchStatusRetryVisible,launchStatusText,outputExecution,outputResults,outputRuns,outputTargets,launchToolbarDockVisible,loading,loadError,manualLaunchMenuVisible,movePreviewToolbar,openAction,operationBusy,previewBaseUrl,previewAddressBlur,previewAddressDraft,previewAddressError,previewAddressFocus,previewBackAvailable,previewActivityVisible,previewCanRestart,previewCanShowLog,previewCanStart,previewCheckAgainVisible,previewDisplayedAddress,previewDisplayedUrl,previewDiagnosticsAvailable,previewDiagnosticsBusy,previewEmbedUnavailableReason,previewEmptyText,previewFrame,previewFrameLoaded,previewFrameRequestId,previewIdentityAvailable,previewIdentityBusy,previewIdentityConfigured,previewIdentityCurrent,previewIdentityError,previewIdentityLabel,previewIdentitySelectionDisabled,previewIdentityTitle,previewIdentityTypeLabel,previewIssue,previewIssueVisible,previewInFlightText,previewLoadingOverlayVisible,previewMessage,previewRouteDialogError,previewRouteDialogParams,previewRouteDialogPath,previewRouteDialogVisible,previewRouteFormValues,previewRouteSelection,previewRoutes,previewRoutesAvailable,previewNotice,previewNoticeVisible,previewRecoveryLabel,previewRecoveryVisible,previewResourceNoticeText,previewResourceNoticeVisible,previewState,previewTerminalRecoveryVisible,previewToolbarRecoveryVisible,previewStarting,previewToolbarExpanded,previewToolbarPosition,previewUrl,copyPreviewUrl,openPreviewRoute,recoverEmbeddedPreview,recheckResourceAdmission,reloadPreview,retryLaunchStatus,requestPreviewDiagnostics,resetPreviewAddressDraft,selectPreviewConfiguredIdentity,selectPreviewGuest,submitPreviewRouteDialog,submitPreviewAddress,restartTerminal,retryTerminal,run,runMenuDisabled,showLaunchLog,setTerminalExpanded,terminal,terminalCanRestart,terminalCanRetry,terminalCommandPreview,terminalDisplayed,terminalExpanded,terminalError,terminalIndicatorLabel,terminalIndicatorState,terminalStatus,terminalSubtitle,terminalTitle,terminalVisible,terminalWindowStorageKey,terminalWindowVisible,toolbarTeleportTarget,visible}}function launchPreviewEmptyText({launchStatusText="",launchStarting=false,loadError="",loading=false,outputTargetsUnavailable=false,previewInFlightText="",previewManualStartAvailable=false,previewMessage="",previewStartUnavailableReason="",previewState="idle",terminalIsRunning=false}={}){const message=String(previewMessage||"").trim();const inFlightText=String(previewInFlightText||"").trim();const startUnavailableReason=String(previewStartUnavailableReason||"").trim();if(["failed","project_closed","stopped"].includes(previewState)){return message||"Preview could not be opened."}if(inFlightText){return inFlightText}if(launchStarting||previewState==="starting"||terminalIsRunning){return"Preparing preview."}if(startUnavailableReason){return startUnavailableReason}if(previewManualStartAvailable){return"Preview is ready to start."}if(launchStatusText){return launchStatusText}if(loadError){return`Preview status request failed: ${String(loadError||"").trim()}`}if(loading){return"Checking preview status."}if(outputTargetsUnavailable){return"This project does not declare an application output."}return"Preview will appear here when it is ready."}function outputTargetLabel(outputTarget=null){const label=String((outputTarget==null?void 0:outputTarget.label)||(outputTarget==null?void 0:outputTarget.id)||"").trim();return label||"selected output target"}function launchPreviewInFlightText({activeOutputTarget=null,embeddedStartTarget=null,launchStarting=false,launchWaiting=false,launchStatusText="",loading=false,operationBusy=false,previewDisplayedAddress="",previewEmbedUnavailableReason="",previewLoadingOverlayVisible=false,previewUrl="",terminalCanRestart=false,terminalCanRetry=false,terminalIsRunning=false}={}){const embedUnavailableReason=String(previewEmbedUnavailableReason||"").trim();if(embedUnavailableReason){return embedUnavailableReason}const target=activeOutputTarget||embeddedStartTarget;const launchStatus=String(launchStatusText||"").trim();if(launchStarting){return`Starting preview: ${outputTargetLabel(embeddedStartTarget||activeOutputTarget)}.`}if(launchWaiting){return"Waiting for the assistant operation to finish. Preview will retry automatically."}if(operationBusy&&terminalCanRestart){return`Restarting preview: ${outputTargetLabel(target)}.`}if(operationBusy&&terminalCanRetry){return`Retrying preview: ${outputTargetLabel(target)}.`}if(operationBusy){return`Trying preview: ${outputTargetLabel(embeddedStartTarget||activeOutputTarget)}.`}if(terminalIsRunning&&!previewUrl){return`Waiting for preview URL from ${outputTargetLabel(target)}.`}if(previewLoadingOverlayVisible&&previewUrl){const address=String(previewDisplayedAddress||"").trim();const page=address?`: ${address}`:"";return`Loading preview page${page}. The server is ready; the browser is still loading the app.`}if(loading){return launchStatus||"Checking preview status."}return""}function launchPreviewStatusText({attempt=0,loadError="",loading=false}={}){const count=Math.max(1,Number(attempt)||1);const error=String(loadError||"").trim();if(error&&loading){return`Retrying preview status (attempt ${count}).`}if(error){return`Preview status request failed (attempt ${count}).`}if(loading){return`Checking preview status (attempt ${count}).`}return""}function previewOpeningOverlayVisible({loadedFrameRequestId=0,previewFrameRequestId=0,previewUrl=""}={}){const requestId=Math.max(0,Number(previewFrameRequestId)||0);return Boolean(String(previewUrl||"").trim()&&requestId>0&&requestId!==Math.max(0,Number(loadedFrameRequestId)||0))}function launchPreviewIssue({launchError="",message="",state="idle"}={}){if(state==="ready"){return null}const operationError=String(launchError||"").trim();const text=String(message||"").trim();if(operationError){return{message:operationError,title:"Preview could not be started"}}if(state==="stale"){return{message:text||"Server-side app files changed after this preview started. Restart preview to run the current code.",title:"Preview may be stale"}}if(state==="failed"){return{message:text||"Preview could not be opened.",title:"Preview could not be opened"}}if(state==="stopped"){return{message:text||"The preview process exited.",title:"Preview stopped"}}return null}function launchPreviewNotice({launchError="",message="",state="idle"}={}){const issue=launchPreviewIssue({launchError,message,state});if(state==="stale"&&!String(launchError||"").trim()){return null}if(issue){return issue}if(state==="project_closed"){return{message:String(message||"Project is closed.").trim(),title:"Project is closed"}}return null}function launchToolbarDockShouldShow({embeddedPreview=false,embeddedTerminalVisible=false,previewIssueVisible=false,terminalDockVisible=false,terminalVisible=false}={}){if(!embeddedPreview){return Boolean(terminalDockVisible)}if(previewIssueVisible){return true}return Boolean(terminalVisible||embeddedTerminalVisible)}const PREVIEW_CAPTURE_FRAME_TIMEOUT_MS=5e3;const PREVIEW_CAPTURE_MEDIA_OPTIONS=Object.freeze({audio:false,monitorTypeSurfaces:"exclude",preferCurrentTab:true,selfBrowserSurface:"include",surfaceSwitching:"exclude",video:{displaySurface:"browser"}});function positiveNumber(value){const number=Number(value);return Number.isFinite(number)&&number>0?number:0}function previewVisibleViewportRect(rect={},viewport={}){const viewportWidth=positiveNumber(viewport.width);const viewportHeight=positiveNumber(viewport.height);if(!viewportWidth||!viewportHeight){return null}const rectLeft=Number(rect.left)||0;const rectTop=Number(rect.top)||0;const rectRight=Number.isFinite(Number(rect.right))?Number(rect.right):rectLeft+positiveNumber(rect.width);const rectBottom=Number.isFinite(Number(rect.bottom))?Number(rect.bottom):rectTop+positiveNumber(rect.height);const left=Math.max(0,Math.min(viewportWidth,rectLeft));const top=Math.max(0,Math.min(viewportHeight,rectTop));const right=Math.max(0,Math.min(viewportWidth,rectRight));const bottom=Math.max(0,Math.min(viewportHeight,rectBottom));if(right<=left||bottom<=top){return null}return{bottom,height:bottom-top,left,right,top,viewportHeight,viewportWidth,width:right-left}}function previewCaptureCrop(visibleRect={},frame={}){const frameWidth=Math.floor(positiveNumber(frame.width));const frameHeight=Math.floor(positiveNumber(frame.height));const viewportWidth=positiveNumber(visibleRect.viewportWidth);const viewportHeight=positiveNumber(visibleRect.viewportHeight);if(!frameWidth||!frameHeight||!viewportWidth||!viewportHeight){return null}const scaleX=frameWidth/viewportWidth;const scaleY=frameHeight/viewportHeight;const sourceLeft=Math.max(0,Math.min(frameWidth,Math.floor(Number(visibleRect.left)*scaleX)));const sourceTop=Math.max(0,Math.min(frameHeight,Math.floor(Number(visibleRect.top)*scaleY)));const sourceRight=Math.max(sourceLeft,Math.min(frameWidth,Math.ceil(Number(visibleRect.right)*scaleX)));const sourceBottom=Math.max(sourceTop,Math.min(frameHeight,Math.ceil(Number(visibleRect.bottom)*scaleY)));const width=sourceRight-sourceLeft;const height=sourceBottom-sourceTop;return width>0&&height>0?{height,sourceLeft,sourceTop,width}:null}function previewCaptureFileName(date=new Date,sequence=1){const captureDate=date instanceof Date?date:new Date(date);const timestamp=captureDate.toISOString().replace(/[:.]/gu,"-");return`vibe64-preview-${timestamp}-${String(sequence).padStart(2,"0")}.png`}function previewCaptureError(message,code=""){const error=new Error(message);error.code=code;return error}function previewCaptureErrorMessage(error){if((error==null?void 0:error.name)==="NotAllowedError"){return"Preview capture was not allowed. Click the eye again and choose This Tab."}if((error==null?void 0:error.name)==="NotFoundError"){return"This browser could not find a tab that it can capture."}if((error==null?void 0:error.name)==="NotReadableError"){return"The browser could not read the shared tab. Stop another screen capture and try again."}return String((error==null?void 0:error.message)||error||"Preview capture failed.").trim()||"Preview capture failed."}function previewCaptureAvailable({canAttach=false,displayed=false,loaded=false,supported=false,visible=false}={}){return Boolean(canAttach&&displayed&&loaded&&supported&&visible)}function stopMediaStream(stream){var _a,_b;for(const track of((_a=stream==null?void 0:stream.getTracks)==null?void 0:_a.call(stream))||[]){(_b=track==null?void 0:track.stop)==null?void 0:_b.call(track)}}function waitForPreviewVideoFrame(video,{clearTimeoutFn=globalThis.clearTimeout,requestAnimationFrameFn=globalThis.requestAnimationFrame,setTimeoutFn=globalThis.setTimeout,timeoutMs=PREVIEW_CAPTURE_FRAME_TIMEOUT_MS}={}){return new Promise((resolve,reject)=>{let frameCallbackId=0;let settled=false;const finish=(error=null)=>{if(settled){return}settled=true;clearTimeoutFn(timeoutId);if(frameCallbackId&&typeof video.cancelVideoFrameCallback==="function"){video.cancelVideoFrameCallback(frameCallbackId)}if(error){reject(error);return}resolve()};const frameReady=()=>{if(!positiveNumber(video.videoWidth)||!positiveNumber(video.videoHeight)){finish(previewCaptureError("The shared tab did not provide an image frame.","frame_unavailable"));return}finish()};const timeoutId=setTimeoutFn(()=>{finish(previewCaptureError("The shared tab did not provide an image frame in time.","frame_timeout"))},timeoutMs);if(typeof video.requestVideoFrameCallback==="function"){frameCallbackId=video.requestVideoFrameCallback(frameReady);return}const requestFrame=typeof requestAnimationFrameFn==="function"?requestAnimationFrameFn:callback=>setTimeoutFn(callback,16);requestFrame(()=>requestFrame(frameReady))})}function previewCanvasBlob(canvas){return new Promise((resolve,reject)=>{canvas.toBlob(blob=>{if(!blob){reject(previewCaptureError("The preview image could not be encoded.","encode_failed"));return}resolve(blob)},"image/png")})}function createVibe64PreviewCaptureSession({clearTimeoutFn=globalThis.clearTimeout,documentObject=globalThis.document,fileConstructor=globalThis.File,mediaDevices=(_a=>(_a=globalThis.navigator)==null?void 0:_a.mediaDevices)(),now=()=>new Date,onEnded=()=>null,requestAnimationFrameFn=globalThis.requestAnimationFrame,setTimeoutFn=globalThis.setTimeout}={}){let captureGeneration=0;let captureSequence=0;let captureStream=null;let captureTrack=null;let captureVideo=null;function supported(){return Boolean((mediaDevices==null?void 0:mediaDevices.getDisplayMedia)&&(documentObject==null?void 0:documentObject.createElement)&&typeof fileConstructor==="function")}function release({stopTracks=false}={}){var _a2,_b;const stream=captureStream;if(captureTrack){(_a2=captureTrack.removeEventListener)==null?void 0:_a2.call(captureTrack,"ended",handleTrackEnded)}(_b=captureVideo==null?void 0:captureVideo.pause)==null?void 0:_b.call(captureVideo);if(captureVideo){captureVideo.srcObject=null}captureStream=null;captureTrack=null;captureVideo=null;if(stopTracks){stopMediaStream(stream)}}function handleTrackEnded(){captureGeneration+=1;release();onEnded()}async function ensureCaptureVideo(){var _a2,_b,_c;if((captureTrack==null?void 0:captureTrack.readyState)!=="ended"&&captureVideo){return captureVideo}release({stopTracks:true});if(!supported()){throw previewCaptureError("This browser cannot capture the visible preview.","unsupported")}const generation=captureGeneration;const stream=await mediaDevices.getDisplayMedia(PREVIEW_CAPTURE_MEDIA_OPTIONS);if(generation!==captureGeneration){stopMediaStream(stream);throw previewCaptureError("Preview capture was cancelled.","capture_cancelled")}const track=((_a2=stream==null?void 0:stream.getVideoTracks)==null?void 0:_a2.call(stream)[0])||null;const displaySurface=String(((_b=track==null?void 0:track.getSettings)==null?void 0:_b.call(track).displaySurface)||"");if(!track||track.readyState==="ended"){stopMediaStream(stream);throw previewCaptureError("The browser did not share a live tab.","track_unavailable")}if(displaySurface&&displaySurface!=="browser"){stopMediaStream(stream);throw previewCaptureError("Choose the current Vibe64 tab, not a window or screen.","wrong_surface")}const video=documentObject.createElement("video");video.autoplay=false;video.muted=true;video.playsInline=true;video.srcObject=stream;if("contentHint"in track){track.contentHint="detail"}captureStream=stream;captureTrack=track;captureVideo=video;(_c=track.addEventListener)==null?void 0:_c.call(track,"ended",handleTrackEnded);return video}async function capture(getVisibleRect){const generation=captureGeneration;const video=await ensureCaptureVideo();try{await video.play();await waitForPreviewVideoFrame(video,{clearTimeoutFn,requestAnimationFrameFn,setTimeoutFn});if(generation!==captureGeneration){throw previewCaptureError("Preview capture was cancelled.","capture_cancelled")}const visibleRect=typeof getVisibleRect==="function"?getVisibleRect():null;if(!visibleRect){throw previewCaptureError("The preview moved out of view before it could be captured.","preview_not_visible")}const crop=previewCaptureCrop(visibleRect,{height:video.videoHeight,width:video.videoWidth});if(!crop){throw previewCaptureError("The visible preview area could not be captured.","crop_unavailable")}const canvas=documentObject.createElement("canvas");canvas.height=crop.height;canvas.width=crop.width;const context=canvas.getContext("2d");if(!context){throw previewCaptureError("The browser could not create the preview image.","canvas_unavailable")}context.drawImage(video,crop.sourceLeft,crop.sourceTop,crop.width,crop.height,0,0,crop.width,crop.height);const blob=await previewCanvasBlob(canvas);captureSequence+=1;const capturedAt=now();return new fileConstructor([blob],previewCaptureFileName(capturedAt,captureSequence),{lastModified:capturedAt.getTime(),type:"image/png"})}finally{release({stopTracks:true})}}function stop(){captureGeneration+=1;release({stopTracks:true})}return{capture,stop,supported}}function useVibe64PreviewCapture({attachFile,captureSession=null,prepareFile=null,previewDisplayed,previewFrame,previewLoaded,scopeKey,windowObject=globalThis.window}={}){const busy=ref(false);const noticeColor=ref("success");const noticeText=ref("");const noticeVisible=ref(false);const visible=ref(false);const session=captureSession||createVibe64PreviewCaptureSession({onEnded:()=>{noticeColor.value="info";noticeText.value="Preview sharing ended. Click the eye to share this tab again.";noticeVisible.value=true}});let intersectionObserver=null;let mounted=false;function currentVisibleRect(){if(readRefOrGetterValue(previewDisplayed)!==true||readRefOrGetterValue(previewLoaded)!==true){return null}const frame=readRefOrGetterValue(previewFrame);if(!(frame==null?void 0:frame.getBoundingClientRect)||!windowObject){return null}return previewVisibleViewportRect(frame.getBoundingClientRect(),{height:windowObject.innerHeight,width:windowObject.innerWidth})}function refreshVisibility(){visible.value=Boolean(currentVisibleRect())}function disconnectObserver(){var _a;(_a=intersectionObserver==null?void 0:intersectionObserver.disconnect)==null?void 0:_a.call(intersectionObserver);intersectionObserver=null}function observeCurrentFrame(){disconnectObserver();const frame=readRefOrGetterValue(previewFrame);if(!frame){refreshVisibility();return}if(typeof(windowObject==null?void 0:windowObject.IntersectionObserver)==="function"){intersectionObserver=new windowObject.IntersectionObserver(refreshVisibility,{threshold:0});intersectionObserver.observe(frame)}refreshVisibility()}const supported=computed(()=>session.supported());const buttonVisible=computed(()=>previewCaptureAvailable({canAttach:typeof prepareFile==="function"||typeof attachFile==="function",displayed:readRefOrGetterValue(previewDisplayed)===true,loaded:readRefOrGetterValue(previewLoaded)===true,supported:supported.value,visible:visible.value}));async function capturePreview(){if(busy.value||!currentVisibleRect()||typeof prepareFile!=="function"&&typeof attachFile!=="function"){return false}busy.value=true;noticeVisible.value=false;try{const result=typeof prepareFile==="function"?await prepareFile({fileName:"Preview screenshot",produce:({signal}={})=>{var _a;const stopCapture=()=>session.stop();(_a=signal==null?void 0:signal.addEventListener)==null?void 0:_a.call(signal,"abort",stopCapture,{once:true});return session.capture(currentVisibleRect).finally(()=>{var _a2;(_a2=signal==null?void 0:signal.removeEventListener)==null?void 0:_a2.call(signal,"abort",stopCapture)})}}):await session.capture(currentVisibleRect).then(attachFile);const attached=Array.isArray(result)?result.length>0:Boolean(result);if(!attached){if(typeof prepareFile==="function"){return false}throw previewCaptureError("The preview image could not be attached to the current message.","attach_failed")}noticeText.value="";noticeVisible.value=false;return true}catch(error){if((error==null?void 0:error.code)==="capture_cancelled"){return false}noticeColor.value="error";noticeText.value=previewCaptureErrorMessage(error);noticeVisible.value=true;return false}finally{busy.value=false;refreshVisibility()}}watch(()=>readRefOrGetterValue(previewFrame),()=>{if(mounted){observeCurrentFrame()}},{flush:"post"});watch([()=>readRefOrGetterValue(previewDisplayed),()=>readRefOrGetterValue(previewLoaded)],refreshVisibility,{flush:"post"});watch(()=>readRefOrGetterValue(scopeKey),(nextKey,previousKey)=>{if(previousKey!==void 0&&nextKey!==previousKey){session.stop();noticeVisible.value=false}});onMounted(()=>{mounted=true;observeCurrentFrame()});onBeforeUnmount(()=>{mounted=false;disconnectObserver();session.stop()});return{busy,buttonVisible,capturePreview,noticeColor,noticeText,noticeVisible,refreshVisibility,supported,visible}}const PREVIEW_DIAGNOSTICS_MAX_TEXT_CHARACTERS=7e5;const PREVIEW_DIAGNOSTICS_MAX_VALUE_CHARACTERS=24e3;function clippedDiagnosticsValue(value,limit=PREVIEW_DIAGNOSTICS_MAX_VALUE_CHARACTERS){const text=String(value??"");return text.length>limit?`${text.slice(0,Math.max(0,limit-18))}… [truncated]`:text}function diagnosticsUrl(value=""){const text=clippedDiagnosticsValue(value,12e3);try{const url=new URL(text);url.searchParams.delete("vibe64_preview_token");return url.toString()}catch{return text}}function diagnosticsObject(value={}){return value&&typeof value==="object"&&!Array.isArray(value)?value:{}}function diagnosticsHeaders(value={}){return Object.fromEntries(Object.entries(diagnosticsObject(value)).slice(0,100).map(([name,headerValue])=>[clippedDiagnosticsValue(name,500),clippedDiagnosticsValue(headerValue,4e3)]))}function diagnosticsJson(value={}){return JSON.stringify(value,null,2)}function indentedDiagnosticsValue(value=""){const text=clippedDiagnosticsValue(value);return text?text.split("\n").map(line=>` ${line}`).join("\n"):" (empty)"}function previewConsoleEntryText(entry={}){const source=clippedDiagnosticsValue(entry.source||"console",80);const level=clippedDiagnosticsValue(entry.level||"log",40).toUpperCase();const timestamp=clippedDiagnosticsValue(entry.timestamp||"unknown time",80);return`[${timestamp}] [${level}] [${source}] ${clippedDiagnosticsValue(entry.text)}`}function previewNetworkEntryText(entry={}){const timestamp=clippedDiagnosticsValue(entry.timestamp||"unknown time",80);const kind=clippedDiagnosticsValue(entry.kind||"resource",80);const method=clippedDiagnosticsValue(entry.method||"GET",40).toUpperCase();const phase=clippedDiagnosticsValue(entry.phase||"complete",40);const status=Number(entry.status)||0;const statusText=clippedDiagnosticsValue(entry.statusText||"",500);const durationMs=Number.isFinite(Number(entry.durationMs))?Math.max(0,Number(entry.durationMs)):0;const details=[` Result: ${phase}${status?` · ${status}${statusText?` ${statusText}`:""}`:""}${durationMs?` · ${durationMs} ms`:""}`];const error=clippedDiagnosticsValue(entry.error||"");if(error){details.push(` Error:
|
|
2
2
|
${indentedDiagnosticsValue(error)}`)}const requestHeaders=diagnosticsHeaders(entry.requestHeaders);if(Object.keys(requestHeaders).length>0){details.push(` Request headers:
|
|
3
3
|
${indentedDiagnosticsValue(diagnosticsJson(requestHeaders))}`)}if(entry.requestBody!==void 0&&String(entry.requestBody||"")){details.push(` Request body:
|
|
4
4
|
${indentedDiagnosticsValue(entry.requestBody)}`)}const responseHeaders=diagnosticsHeaders(entry.responseHeaders);if(Object.keys(responseHeaders).length>0){details.push(` Response headers:
|