vibe64 0.1.42 → 0.1.44

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.
Files changed (42) hide show
  1. package/bin/run.js +133 -133
  2. package/bin/upgrade-state.js +287 -286
  3. package/dist/assets/{GithubBrowserTabs-YvIe2BdE.js → GithubBrowserTabs-CxeMBH6W.js} +1 -1
  4. package/dist/assets/{Vibe64AuthSettingsButton-DLdfT68V.js → Vibe64AuthSettingsButton-BuAidNAq.js} +1 -1
  5. package/dist/assets/{Vibe64DashboardShell-DMPz6fIx.js → Vibe64DashboardShell-uWi4NB4y.js} +1 -1
  6. package/dist/assets/{Vibe64DatabaseWorkspace-BCEIOlSg.js → Vibe64DatabaseWorkspace-CCpDbiGK.js} +1 -1
  7. package/dist/assets/{Vibe64OutputControls-DMoqL0VD.js → Vibe64OutputControls-ttqEP46v.js} +1 -1
  8. package/dist/assets/{Vibe64RepositoryWorkspace-BdwRwbxp.js → Vibe64RepositoryWorkspace-Bq37tlM9.js} +1 -1
  9. package/dist/assets/{Vibe64SessionFiles-ChJWUOqm.js → Vibe64SessionFiles-BhNCbnUP.js} +1 -1
  10. package/dist/assets/{_sessionId_-Bw0KfJeR.js → _sessionId_-wrEZX5JX.js} +1 -1
  11. package/dist/assets/{_slug_-q9prK_gX.js → _slug_-pVQuRCsN.js} +4 -4
  12. package/dist/assets/{access-C05Nkq6r.js → access-CwTmMeFU.js} +1 -1
  13. package/dist/assets/{app-D1CGY9Xm.js → app-BSNXOpH-.js} +1 -1
  14. package/dist/assets/{changes-D17XpgGz.js → changes-BHk1r-xi.js} +1 -1
  15. package/dist/assets/{dashboard-BXXgeQ0Q.js → dashboard-CtPZicHO.js} +1 -1
  16. package/dist/assets/{definitions-SNvFDEFS.js → definitions-Cfy1CWRi.js} +1 -1
  17. package/dist/assets/{env-sXAQqKWk.js → env-vkfe7Ud2.js} +1 -1
  18. package/dist/assets/{history-N1iRZaab.js → history-lzQXJSu7.js} +1 -1
  19. package/dist/assets/{index-Mxalhei8.js → index-BnZ5igE0.js} +5 -5
  20. package/dist/assets/{integrations-BmwFvHgZ.js → integrations-CefYdMOC.js} +1 -1
  21. package/dist/assets/{issues-BbiG7dCV.js → issues-CiGWy5Cv.js} +1 -1
  22. package/dist/assets/{learning-CUCuuoHM.js → learning-BfyUAtaJ.js} +1 -1
  23. package/dist/assets/{placement-CQy46H3H.js → placement-BxRjNrZ1.js} +1 -1
  24. package/dist/assets/{publish-4r_4K5IY.js → publish-W5aA6JkR.js} +1 -1
  25. package/dist/assets/{pull-requests-DY9jg3cE.js → pull-requests-BrtOgprU.js} +1 -1
  26. package/dist/assets/{repository-DhXdoMP6.js → repository-BsSO4tkZ.js} +1 -1
  27. package/dist/assets/{settings-Cj4u-76p.js → settings-Ck7lEre8.js} +1 -1
  28. package/dist/assets/{useArchivedVibe64Sessions-BXNg8oES.js → useArchivedVibe64Sessions-DBSnMGIY.js} +1 -1
  29. package/dist/assets/{useVibe64ConversationLog-C1xjhFtS.js → useVibe64ConversationLog-DQUm75XZ.js} +1 -1
  30. package/dist/assets/{useVibe64SessionData-CnDOFFHb.js → useVibe64SessionData-t_rs_q6g.js} +1 -1
  31. package/dist/assets/{useVibe64SessionSelection-J87nJ9p5.js → useVibe64SessionSelection-gAUaIEs7.js} +1 -1
  32. package/dist/assets/{vibe64SessionFocus-DlN8NwcE.js → vibe64SessionFocus-BZFoISVS.js} +1 -1
  33. package/dist/index.html +1 -1
  34. package/docs/colleague-usage/ai-model-setups.md +2 -1
  35. package/docs/colleague-usage/coding-agent-goal-pause.md +1 -1
  36. package/docs/colleague-usage/colleague.md +2 -2
  37. package/docs/colleague-usage/dashboard-navigation.md +4 -3
  38. package/docs/colleague-usage/publishing.md +2 -1
  39. package/node_modules/@local/vibe64-genesis/src/server/index.js +122 -125
  40. package/node_modules/@local/vibe64-genesis/src/server/promptContext.js +10 -13
  41. package/package.json +1 -1
  42. package/server.bundle.mjs +19535 -19510
@@ -1,4 +1,4 @@
1
- import{$n as normalizeProps,D as createVNode,E as createTextVNode,Ht as watch,J as inject,On as unref,Yt as withDirectives,Zn as normalizeClass,_ as createBaseVNode,b as createElementBlock,bt as renderList,ct as onMounted,et as mergeProps,g as computed,it as onBeforeUnmount,mt as openBlock,o as Fragment,qt as withCtx,rt as onBeforeMount,tr as toDisplayString,tt as nextTick,u as Teleport,un as isRef,v as createBlock,vn as ref,w as createSlots,wt as resolveDynamicComponent,xt as renderSlot,y as createCommentVNode,z as guardReactiveProps}from"./runtime-core.esm-bundler-DGXg_mpN.js";import{h as VIcon,ir as vModelText,or as withKeys,sr as withModifiers}from"./ripple-EFNA8EBu.js";import{T as ROUTE_VISIBILITY_PUBLIC,t as useEndpointResource}from"./useEndpointResource-Ds8EDBZ2.js";import{s as vibe64ProjectScopedStorageKey,t as currentProjectSlugFromLocation,u as getHttpWebClient}from"./vibe64ProjectScope.local-B06ABkhI.js";import{n as VList,s as VListItem,t as VMenu}from"./VMenu-CDcBLYWR.js";import{t as VChip}from"./VChip-VVdtjfq-.js";import{t as VTextField}from"./VTextField-C0b_0cSa.js";import{Dr as mdiStop,H as mdiChevronLeft,Hn as mdiPauseCircleOutline,Jn as mdiPlayCircleOutline,Rn as mdiOpenInNew,S as mdiArrowLeft,Tt as mdiDownloadOutline,U as mdiChevronRight,W as mdiChevronUp,Xn as mdiPowerCycle,Yr as mdiWebClock,ct as mdiConsoleLine,f as mdiAlertCircleOutline,it as mdiCogOutline,lr as mdiRoutes,n as mdiAccountCircleOutline,nr as mdiRefresh,s as mdiAccountOffOutline,u as mdiAccountSwitchOutline,ut as mdiContentCopy,xt as mdiDotsHorizontal}from"./mdi-Bt90Ns76.js";import{t as VBtn}from"./VBtn-BhVEwXLX.js";import{t as VAlert}from"./VAlert-gwuhYlYb.js";import{t as VCheckbox}from"./VCheckbox-DyCGSN0H.js";import{t as VDivider}from"./VDivider-Dq25WsKu.js";import{t as VDialog}from"./VDialog-CQDhjRiV.js";import{a as VCardSubtitle,i as VCardTitle,n as VCardText,o as VCardActions,r as VCardItem,t as VCard}from"./VCard-C3Hx769y.js";import{t as VSpacer}from"./VSpacer-CgWOWvBh.js";import{t as _plugin_vue_export_helper_default}from"./_plugin-vue_export-helper-DNW4j-dv.js";import{i as VIBE64_RESOURCE_RECOVERY_KEY,r as vibe64OutputTerminalWebSocketUrl}from"./_slug_-q9prK_gX.js";import{n as useRealtimeEvent}from"./useRealtimeEvent-DrOiU8lJ.js";import{a as Vibe64Terminal_default,n as createWebSocketTerminalDriver,t as useVibe64Terminal}from"./useVibe64Terminal-I7Sf6xMW.js";import{t as usePaths}from"./usePaths-Db88-HOm.js";import{t as useCommand}from"./useCommand-nWFczmJy.js";import{n as stableLocalStorageKeyPart,r as writeLocalStorageJson,t as readLocalStorageJson}from"./browserLocalStorage-B4C7rHrs.js";import{t as useVibe64ProjectSlug}from"./useVibe64ProjectScope-B5ogg6jd.js";import{n as vibe64RealtimeOriginPayload,r as vibe64RealtimePayloadFromCurrentTab}from"./vibe64BrowserTabOrigin-SF9E31vi.js";import{D as VIBE64_SESSIONS_API_SUFFIX,G as vibe64OutputsQueryKey,H as vibe64OutputRunPath,K as vibe64PreviewIdentityPath,O as VIBE64_SESSION_CHANGED_EVENT,U as vibe64OutputRunStopPath,V as vibe64OutputResultPath,W as vibe64OutputsPath,Yt as VSnackbar,b as readRefOrGetterValue,et as vibe64SessionPath,nn as usePageActivity,tt as vibe64SessionPreviewStatePath,v as useVibe64Learning}from"./index-Mxalhei8.js";import{t as Vibe64TemporaryAiFixAction_default}from"./Vibe64TemporaryAiFixAction-CIePbdW8.js";import{a as vibe64SessionDebugError,c as vibe64SessionSourcePath,o as vibe64SessionDebugLog}from"./vibe64SessionPanelModel-DDorOuiL.js";import{o as vibe64SessionRevision,t as isArchivedVibe64Session}from"./vibe64SessionViewModel-DR4tOlGM.js";var _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=>{if(!open)props.terminal?.closeTerminalSocket?.()});return(_ctx,_cache)=>{return __props.open?(openBlock(),createBlock(Vibe64Terminal_default,{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)}}};var PREVIEW_BRIDGE_READY_MESSAGE_TYPE=`vibe64:preview-bridge-ready`;var PREVIEW_DIAGNOSTICS_REQUEST_MESSAGE_TYPE=`vibe64:preview-diagnostics-request`;var PREVIEW_DIAGNOSTICS_RESPONSE_MESSAGE_TYPE=`vibe64:preview-diagnostics-response`;var PREVIEW_IDENTITY_REQUEST_MESSAGE_TYPE=`vibe64:preview-identity-request`;var PREVIEW_IDENTITY_RESPONSE_MESSAGE_TYPE=`vibe64:preview-identity-response`;var PREVIEW_LOCATION_MESSAGE_TYPE=`vibe64:preview-location`;var PREVIEW_QUERY_MESSAGE_TYPE=`vibe64:preview-query`;var PREVIEW_RESOURCE_FAILURE_MESSAGE_TYPE=`vibe64:preview-resource-failure`;var PREVIEW_PROXY_TOKEN_QUERY_PARAM=`vibe64_preview_token`;function previewDiagnosticUrl(value){try{const url=new URL(String(value||``));return[`http:`,`https:`].includes(url.protocol)?`${url.origin}${url.pathname}`.slice(0,2048):``}catch{return``}}function preferredPreviewTarget(outputTargets=[]){const targets=(Array.isArray(outputTargets)?outputTargets:[]).filter(target=>target?.presentation?.kind===`web`);return targets.find(target=>target?.default===true)||targets[0]||null}function managedPreviewTarget(outputTargets=[]){return preferredPreviewTarget((Array.isArray(outputTargets)?outputTargets:[]).filter(target=>target?.available!==false))}var LAUNCH_BROWSER_WINDOW_FEATURES=`popup,width=1400,height=900,left=80,top=60`;var LAUNCH_PREVIEW_TOOLBAR_POSITIONS=Object.freeze([`left`,`center`,`right`]);var AUTO_START_ATTEMPT_COOLDOWN_MS=7e3;var AUTO_START_STABILITY_DELAY_MS=750;var LAUNCH_STATUS_RETRY_LIMIT=2;var LAUNCH_STATUS_RETRY_BASE_DELAY_MS=1e3;var LAUNCH_STATUS_RETRY_MAX_DELAY_MS=5e3;var LAUNCH_STATUS_IDLE_RECOVERY_INITIAL_DELAY_MS=1200;var LAUNCH_STATUS_IDLE_RECOVERY_INTERVAL_MS=3e3;var LAUNCH_STATUS_IDLE_RECOVERY_LIMIT=6;var TERMINAL_STOP_POLL_INTERVAL_MS=100;var TERMINAL_STOP_POLL_ATTEMPTS=50;var OUTPUTS_REALTIME_REASONS=new Set([`preview-test-state-changed`,`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?.sessionId||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?.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){const studioHref=String(browserWindow?.location?.href||localPreviewBrowserHref()).trim();return resolveLaunchPreviewDestination([target],{studioHref}).displayHref}function outputTargetWorktreePath(session={}){return vibe64SessionSourcePath(session)}function launchControlsSessionCanRun(session={}){const metadata=session?.metadata&&typeof session.metadata===`object`&&!Array.isArray(session.metadata)?session.metadata:{};return Boolean(String(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=``){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 payload.clientRefresh?.includeOutputs===true||!reason||OUTPUTS_REALTIME_REASONS.has(reason)}function shouldScheduleLaunchAutoStart({autoStartKey=``,externalBusy=false,key=``,loading=false,operationBusy=false,sessionLaunchable=true,sessionId=``,stoppedIntent=false,target=null,terminalDisplayed=true,terminalVisible=false}={}){return Boolean(sessionId&&sessionLaunchable&&!stoppedIntent&&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)>=2)return false;if(launchStatusAgentWriteBusy(error))return true;const status=normalizeHttpStatus(error?.status??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?.message||fallbackText||`Request failed.`).trim();const status=normalizeHttpStatus(error?.status??error?.statusCode);const code=String(error?.code||``).trim();const requestPath=String(path||error?.path||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){const code=String(error?.code||error?.response?.code||error?.response?.errors?.[0]?.code||``).trim();return code===`vibe64_agent_write_mode_busy`||code===`VIBE64_TRAINING_PREPARATION_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?.startedAt||0);if(String(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?.launchReady===true||metadata?.launchReady===`true`}function launchPreviewRequiresProxy(metadata={}){return Boolean(String(metadata?.previewAuth||``).trim())}function terminalSessionMissingError(message=``){return/terminal session not found/iu.test(String(message||``))}function localPreviewBrowserHref(){if(typeof window===`undefined`)return``;return String(window.location?.href||``)}function resolveLaunchPreviewDestination(actions=[],{requirePreviewProxy=false,studioHref=localPreviewBrowserHref()}={}){const action=Array.isArray(actions)?actions.find(candidate=>browserCanOpenTarget(candidate))||null:null;const targetHref=String(action?.href||``).trim();const previewHref=String(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,stoppedIntent:source.stoppedIntent===true,targetHref:String(source.targetHref||``).trim(),terminalId:String(source.terminalId||``).trim()}}function plainObject(value){return value&&typeof value===`object`&&!Array.isArray(value)?value:{}}function launchPreviewTestNotice(status={},activeTarget=null){const state=status.previewTestRun?.state;if([`cleanup_required`,`restore_failed`].includes(state))return{error:true,title:`Preview recovery required`,message:`Tests finished, but Preview has not been restored. Ask the coding agent to recover it before using the app.`};if(state===`restoring`)return{title:`Restoring your app`,message:`Browser tests have finished. Vibe64 is restoring the previous Preview.`};if(activeTarget?.dataMode===`test`)return{title:`Test Preview`,message:`Using this app’s test configuration. Test data may be reset.`};if(state)return{title:`Browser tests in progress`,message:`The coding agent temporarily controls this Preview for automated checks.`};return null}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);return new URL(studioText).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(()=>String(selectedSession.value?.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 workspacePreparing=computed(()=>selectedSession.value?.workspaceSetup?.status===`running`);const launchSourceOperationsSuspended=computed(()=>readRefOrGetterValue(sourceOperationsSuspended)===true||workspacePreparing.value);const canLoadOutputs=computed(()=>launchControlsCanLoadTargets({displayed:terminalDisplayed.value,session:selectedSession.value||{},sourceOperationsSuspended:launchSourceOperationsSuspended.value}));const sessionsApiPath=computed(()=>paths.api(VIBE64_SESSIONS_API_SUFFIX,{surface:`app`}));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(`app`,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.automatic===true?{automatic:true}:{},...context.forceRestart===true?{forceRestart:true}:{},...context.outputParameters===void 0?{}:{outputParameters:context.outputParameters},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:`app`,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:`app`,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:`app`,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:`app`,writeMethod:`POST`});const status=computed(()=>outputTargetsResource.data.value||{});const outputTargetsLoaded=computed(()=>status.value.ok!==false&&Array.isArray(status.value.outputTargets));const launchStatusLoadError=computed(()=>{if(workspacePreparing.value)return``;const setup=selectedSession.value?.workspaceSetup;if([`failed`,`ambiguous`].includes(setup?.status))return setup.diagnostic||`Workspace preparation failed. Expand Preparing workspace to inspect the failure and retry setup.`;if(outputTargetsResource.isLoading.value)return``;return launchStatusErrorText({error:outputTargetsResource.query?.error?.value||null,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 previewStoppedIntent=computed(()=>preview.value.stoppedIntent);const testApproval=computed(()=>[`waiting`,`resuming`].includes(status.value.testApproval?.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(run=>(Array.isArray(run?.results)?run.results:[]).map(result=>({...result,href:vibe64OutputResultPath(sessionsApiPath.value,sessionId.value,result.id),outputTargetId:String(run.outputTargetId||``),runId:String(run.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=>target.id===requestedAutoStartTargetId.value&&target.presentation?.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(()=>String(terminalMetadata.value.outputTargetId||activeTerminal.value?.metadata?.outputTargetId||status.value.lastOutputTarget?.id||``));const activeOutputTarget=computed(()=>{return outputTargets.value.find(target=>target.id===activeOutputTargetId.value)||null});const previewTestNotice=computed(()=>launchPreviewTestNotice(status.value,activeOutputTarget.value));const launchActions=computed(()=>{const actions=terminalMetadata.value.actions||activeTerminal.value?.metadata?.actions||[];const targetHref=previewTargetHref.value||String(previewTarget.value?.targetHref||``).trim();const iframeHref=previewHref.value||String(previewTarget.value?.href||``).trim();const browserActions=Array.isArray(actions)?actions.filter(action=>browserCanOpenTarget(action)):[];if(browserActions.length<1&&iframeHref&&targetHref)return[{href:targetHref,kind:previewTarget.value?.kind||`url`,label:previewTarget.value?.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(()=>launchTerminalIsReady({...activeTerminal.value?.metadata||{},...terminalMetadata.value||{}}));const terminalPreviewRequiresProxy=computed(()=>launchPreviewRequiresProxy({...activeTerminal.value?.metadata||{},...terminalMetadata.value||{}}));const previewTargetDisabledReason=computed(()=>![`ready`,`stale`].includes(previewState.value)?previewMessage.value:``);const previewTargetRecovery=computed(()=>previewRecovery.value);const terminalIsRunning=computed(()=>{const statusValue=terminalStatus.value||activeTerminal.value?.status||``;return statusValue===`running`||statusValue===`closing`||terminalStarting.value});const terminalPreviewProxyPending=computed(()=>Boolean(terminalPreviewRequiresProxy.value&&terminalLaunchReady.value&&terminalIsRunning.value&&!previewHref.value));const terminalIndicatorState=computed(()=>{if(terminalStatus.value===`exited`||activeTerminal.value?.status===`exited`){const exitCode=terminalExitCode.value??activeTerminal.value?.exitCode;return exitCode&&exitCode!==0?`failed`:`stopped`}if(terminalIsRunning.value)return terminalLaunchReady.value?`running`:`starting`;return`stopped`});const terminalIndicatorLabel=computed(()=>{const presentationKind=activeOutputTarget.value?.presentation?.kind||outputExecution.value.presentationKind;const finite=activeOutputTarget.value?.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(workspacePreparing.value||readRefOrGetterValue(busy)||operationBusy.value||terminalIsRunning.value));const outputTargetsLoadingForAutoStart=computed(()=>autoStartOutputsLoading({outputTargetsLoading:outputTargetsResource.isLoading.value,outputTargetsSettled:outputTargetsSettledForAutoStart.value}));const terminalCanStop=computed(()=>{return Boolean(terminalSessionId.value&&(terminalStatus.value||activeTerminal.value?.status)===`running`)});const terminalCanClose=computed(()=>Boolean(terminalSessionId.value&&!terminalIsRunning.value&&(terminalExited.value||activeTerminal.value?.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(()=>activeOutputTarget.value?.label||`Run target`);const terminalSubtitle=computed(()=>{if(terminalIsRunning.value)return``;if(terminalStatus.value===`exited`||activeTerminal.value?.status===`exited`){const exitCode=terminalExitCode.value??activeTerminal.value?.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`));function parameterStorageKey(target){return vibe64ProjectScopedStorageKey(`vibe64.output-parameters.${target.id}`,projectSlug.value)}function parametersRemembered(target){return readLocalStorageJson(parameterStorageKey(target),null)!==null}function rememberParameters(target,values,remember){writeLocalStorageJson(parameterStorageKey(target),remember?values:null)}function parametersForTarget(target){const metadata=terminalMetadata.value.outputTargetId===target.id?terminalMetadata.value:activeTerminal.value?.metadata;const saved=status.value.lastOutputTarget;const values=(metadata?.outputTargetId===target.id?metadata.outputParameters:null)||(saved?.id===target.id?saved.outputParameters:null)||readLocalStorageJson(parameterStorageKey(target),{})||{};return Object.fromEntries((target.parameters||[]).map(parameter=>[parameter.id,typeof values[parameter.id]===`string`?values[parameter.id]:parameter.default]))}async function run(outputTarget={},{applyDefaultDisplay=true,autoStartAttemptKey=``,forceRestart=false,ignoreExternalBusy=false,outputParameters}={}){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 parameters=outputTarget.parameters?.length?outputParameters||parametersForTarget(outputTarget):void 0;const missing=outputTarget.parameters?.find(parameter=>parameter.required&&!parameters[parameter.id]?.trim());if(missing)throw new Error(`${missing.label} is required. Open Preview options to set it.`);const terminalSession=await startTerminalCommand.run({automatic:Boolean(normalizedAutoStartAttemptKey),forceRestart,...parameters?{outputParameters:parameters}:{},outputTargetId:outputTarget.id,sessionId:currentSessionId});if(disposed||startedScopeKey!==launchScopeKey.value||!launchControlsCanLoadTargets({displayed:terminalDisplayed.value,session:selectedSession.value||{},sourceOperationsSuspended:launchSourceOperationsSuspended.value}))return false;applyLaunchTerminalSession(terminalSession);connectLaunchTerminal();refresh({scopeKey:startedScopeKey});return true}catch(error){if(disposed||startedScopeKey!==launchScopeKey.value)return false;if(normalizedAutoStartAttemptKey){if(launchStatusAgentWriteBusy(error)){launchWaiting.value=previewState.value!==`ready`;refresh({scopeKey:startedScopeKey}).catch(()=>null);return false}autoStartKey.value=normalizedAutoStartAttemptKey}launchError.value=String(error?.message||startTerminalCommand.message||`Output target could not be started.`).trim();refusedAdmissionId.value=String(error?.details?.admission?.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))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;connectLaunchTerminal()}async function refresh({scopeKey=launchScopeKey.value}={}){if(!canLoadOutputs.value)return null;if(!String(scopeKey||``).trim())return null;return typeof outputTargetsResource.query?.refetch===`function`?outputTargetsResource.query.refetch({cancelRefetch:true}):outputTargetsResource.reload()}async function startNewlyConfiguredWorkspaceSetup(){if(String(selectedSession.value?.workspaceSetup?.status||``).trim()!==`unconfigured`||!sessionId.value)return false;try{return(await getHttpWebClient().request(vibe64SessionPath(sessionsApiPath.value,sessionId.value,`/workspace-setup/retry`),{body:vibe64RealtimeOriginPayload(),method:`POST`}))?.ok!==false}catch(error){vibe64SessionDebugLog(`client.launchPreview.workspaceSetup.start.error`,{error:vibe64SessionDebugError(error),sessionId:sessionId.value});return false}}async function publishPreviewDiagnostic(record){if(!sessionId.value||!projectSlug.value)return false;try{return(await getHttpWebClient().request(vibe64SessionPath(sessionsApiPath.value,sessionId.value,`/preview-diagnostics`),{method:`POST`,body:{...record,enabled:true,frameUrl:previewDiagnosticUrl(record.frameUrl),resourceUrl:previewDiagnosticUrl(record.resourceUrl)}}))?.recorded===true}catch{return false}}async function publishPreviewState(previewState={}){const currentSessionId=sessionId.value;const currentProjectSlug=projectSlug.value;if(!currentSessionId||!currentProjectSlug||!String(previewState?.route||``).trim())return false;try{return(await getHttpWebClient().request(vibe64SessionPreviewStatePath(sessionsApiPath.value,currentSessionId),{body:vibe64RealtimeOriginPayload({projectSlug:currentProjectSlug,route:String(previewState?.route||``).trim(),title:String(previewState?.title||``).trim()}),method:`POST`}))?.ok!==false}catch(error){vibe64SessionDebugLog(`client.launchPreview.state.publish.error`,{error:vibe64SessionDebugError(error),route:String(previewState?.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;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?.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;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;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{applyLaunchTerminalSession(await stopTerminalCommand.run({sessionId:sessionId.value,terminalSessionId:terminalSessionId.value}));await refresh();return await waitForStoppedTerminal()}catch(error){launchError.value=String(error?.message||`Preview could not be stopped.`);await refresh();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(){if(!terminalOutput.value||typeof navigator===`undefined`||!navigator.clipboard?.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?.id){clearStaleLaunchTerminal();return}if(nextTerminal.id!==attachedTerminalId){closeTerminalSocket();resetTerminalDisplay();attachedTerminalId=nextTerminal.id}applyTerminalSession(nextTerminal,{fallbackStatus:nextTerminal.status||`running`});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();refresh()});watch(terminalDisplayed,displayed=>{if(displayed){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,previewStoppedIntent.value?`stopped`:`startable`,canLoadOutputs.value?`loadable`:`blocked`,outputTargetsResource.isLoading.value?`loading`:`ready`].join(`|`),()=>{if(!launchScopeKey.value||!autoStartRequestKey.value||!canLoadOutputs.value||previewStoppedIntent.value){resetOutputsAutoStartSettlement();return}if(outputTargetsResource.isLoading.value){outputTargetsSettledForAutoStart.value=false;return}outputTargetsSettledForAutoStart.value=true},{flush:`post`,immediate:true});watch(()=>[projectSlug.value,sessionId.value,autoStartRequestKey.value,previewStoppedIntent.value?`stopped`:`startable`,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,autoStartTarget.value?.id||``,autoStartCooldownVersion.value].join(`|`),()=>{const target=autoStartTarget.value;const key=`${launchScopeKey.value}:${target?.id||``}`;if(resourceAdmissionId.value){clearAutoStartTimer();return}if(previewStoppedIntent.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,stoppedIntent:previewStoppedIntent.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;if(previewStoppedIntent.value)return;const currentKey=`${launchScopeKey.value}:${currentTarget?.id||``}`;if(!shouldScheduleLaunchAutoStart({autoStartKey:autoStartKey.value,externalBusy:readRefOrGetterValue(busy),key:currentKey,loading:outputTargetsLoadingForAutoStart.value,operationBusy:operationBusy.value,sessionLaunchable:canLoadOutputs.value,sessionId:sessionId.value,stoppedIntent:previewStoppedIntent.value,target:currentTarget,terminalDisplayed:terminalDisplayed.value,terminalVisible:terminalVisible.value}))return;const currentCooldownMs=readLaunchAutoStartAttemptCooldown(currentKey);if(currentCooldownMs>0){scheduleAutoStartCooldownCheck(currentCooldownMs);return}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`||false){start();return}autoStartTimer=window.setTimeout(start,750)},{flush:`post`,immediate:true});onBeforeUnmount(()=>{disposed=true;clearAutoStartTimer();clearAutoStartCooldownTimer();clearLaunchStatusIdleRecoveryTimer();disposeTerminalUi()});return{activeOutputTarget,previewTestNotice,activeOutputTargetId,activeTerminal,closeTerminal,copyLog,expandTerminal,launchActions,launchButtonsDisabled,launchError,resourceAdmissionId,acceptResourceRetry,testApproval,launchStatusAttempt,launchStatusIdleRecoveryExhausted,launchStarting,launchWaiting:computed(()=>workspacePreparing.value||launchWaiting.value),workspacePreparing,outputTargets,outputTargetsLoaded,outputExecution,outputResults,outputRuns,loading:outputTargetsResource.isLoading,loadError:launchStatusLoadError,minimizeTerminal,openAction,operationBusy,previewCanRestart,previewCanShowLog,previewCanStart,previewHref,previewIdentity,previewMessage,previewState,previewStoppedIntent,previewTargetDisabledReason,previewTargetHref,previewTargetRecovery,terminalPreviewRequiresProxy,terminalPreviewProxyPending,publishPreviewState,publishPreviewDiagnostic,requestPreviewIdentityGrant,refresh,restartTerminal,retryTerminal,parametersForTarget,parametersRemembered,rememberParameters,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}}var ROUTE_PARAM_PATTERN=/:([A-Za-z][A-Za-z0-9_]*)/gu;function previewRoutesForTarget(launchTarget={}){return Array.isArray(launchTarget?.previewRoutes)?launchTarget.previewRoutes.filter(route=>route?.id&&route?.pathTemplate):[]}function previewRouteParams(route={}){const declared=new Map((Array.isArray(route.params)?route.params:[]).filter(param=>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?.[name]??param?.defaultValue??``).trim();if(!value&&param?.required!==false){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())}var PREVIEW_CAPTURE_FRAME_TIMEOUT_MS=5e3;var 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){return`vibe64-preview-${(date instanceof Date?date:new Date(date)).toISOString().replace(/[:.]/gu,`-`)}-${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?.name===`NotAllowedError`)return`Preview capture was not allowed. Click the eye again and choose This Tab.`;if(error?.name===`NotFoundError`)return`This browser could not find a tab that it can capture.`;if(error?.name===`NotReadableError`)return`The browser could not read the shared tab. Stop another screen capture and try again.`;return String(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){for(const track of stream?.getTracks?.()||[])track?.stop?.()}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=globalThis.navigator?.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?.getDisplayMedia&&documentObject?.createElement&&typeof fileConstructor===`function`)}function release({stopTracks=false}={}){const stream=captureStream;if(captureTrack)captureTrack.removeEventListener?.(`ended`,handleTrackEnded);captureVideo?.pause?.();if(captureVideo)captureVideo.srcObject=null;captureStream=null;captureTrack=null;captureVideo=null;if(stopTracks)stopMediaStream(stream)}function handleTrackEnded(){captureGeneration+=1;release();onEnded()}async function ensureCaptureVideo(){if(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=stream?.getVideoTracks?.()[0]||null;const displaySurface=String(track?.getSettings?.().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;track.addEventListener?.(`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?.getBoundingClientRect||!windowObject)return null;return previewVisibleViewportRect(frame.getBoundingClientRect(),{height:windowObject.innerHeight,width:windowObject.innerWidth})}function refreshVisibility(){visible.value=Boolean(currentVisibleRect())}function disconnectObserver(){intersectionObserver?.disconnect?.();intersectionObserver=null}function observeCurrentFrame(){disconnectObserver();const frame=readRefOrGetterValue(previewFrame);if(!frame){refreshVisibility();return}if(typeof 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}={})=>{const stopCapture=()=>session.stop();signal?.addEventListener?.(`abort`,stopCapture,{once:true});return session.capture(currentVisibleRect).finally(()=>{signal?.removeEventListener?.(`abort`,stopCapture)})}}):await session.capture(currentVisibleRect).then(attachFile);if(!(Array.isArray(result)?result.length>0:Boolean(result))){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?.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}}var PREVIEW_IDENTITY_TYPE_EMAIL=`email`;var PREVIEW_IDENTITY_TYPE_LOGIN=`login`;var PREVIEW_IDENTITY_TYPE_USER_ID=`user-id`;var PREVIEW_IDENTITY_TYPES=Object.freeze([PREVIEW_IDENTITY_TYPE_EMAIL,PREVIEW_IDENTITY_TYPE_LOGIN,PREVIEW_IDENTITY_TYPE_USER_ID]);var PREVIEW_DISPLAY_QUERY_PARAMS=Object.freeze([PREVIEW_PROXY_TOKEN_QUERY_PARAM]);var PREVIEW_DIAGNOSTICS_TIMEOUT_MS=3e3;var PREVIEW_IDENTITY_TIMEOUT_MS=1e4;var PREVIEW_RESOURCE_RETRY_DELAY_MS=250;var 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);if([displayBaseUrl,previewBaseUrl].map(baseUrl=>{try{return previewUrlWithoutDisplayParams(baseUrl)?new URL(previewUrlWithoutDisplayParams(baseUrl)).origin:``}catch{return``}}).filter(Boolean).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(`vibe64_preview_token`)||``;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}={}){if(busy)return`Switching identity`;if(!identity)return`Identity not confirmed`;if(identity.mode===`guest`)return`Guest`;const selectorValue=String(identity.selector?.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?.name||``).trim().toLowerCase();const selector=normalizePreviewIdentitySelector({type:entry?.type,value: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?.identity&&typeof exchangeResult.identity===`object`?exchangeResult.identity:{};const selector=normalizePreviewIdentitySelector(identity.selector||requestedIdentity.selector);const email=String(identity.email||(selector?.type===PREVIEW_IDENTITY_TYPE_EMAIL?selector.value:``)).trim().toLowerCase();const login=String(identity.login||(selector?.type===PREVIEW_IDENTITY_TYPE_LOGIN?selector.value:``)).trim();const userId=String(identity.userId||(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?.value||``).trim(),email,login,mode:requestedIdentity.mode,name:String(requestedIdentity.name||``).trim(),selector,userId,username}}function isPreviewBridgeReadyMessage(value={}){return String(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?.defaultIdentityName||``).trim();return capability?.defaultMode===`identity`&&name?{identityName:name,mode:`identity`}:{mode:`guest`}}function createPreviewBridgeRequestRegistry(){const pendingRequests=new Map;let sequence=0;function take(requestId=``){const pending=pendingRequests.get(requestId);if(!pending)return null;clearTimeout(pending.timeout);pending.signal?.removeEventListener?.(`abort`,pending.abortHandler);pendingRequests.delete(requestId);return pending}function reject(requestId,error){const pending=take(requestId);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?.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((resolve,rejectRequest)=>{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,signal,timeout});signal?.addEventListener?.(`abort`,abortHandler,{once:true});if(signal?.aborted)abortHandler()});try{targetWindow.postMessage({...message,requestId},`*`)}catch(error){reject(requestId,error)}return response}function resolve(requestId,value){const pending=take(requestId);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(`vibe64_preview_token`)?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);if(!new Set([displayBase.origin,previewBase.origin]).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,previewTestNotice,expandTerminal,launchActions,launchButtonsDisabled,launchError,resourceAdmissionId,acceptResourceRetry,testApproval,launchStatusAttempt,launchStarting,launchWaiting,workspacePreparing,outputExecution,outputResults,outputRuns,outputTargets,outputTargetsLoaded,loading,loadError,minimizeTerminal,openAction,operationBusy,previewCanRestart,previewCanShowLog,previewCanStart,previewIdentity:previewIdentityCapability,previewMessage,previewState,previewStoppedIntent,publishPreviewState,publishPreviewDiagnostic,requestPreviewIdentityGrant,refresh:refreshOutputs,restartTerminal,retryTerminal,parametersForTarget,parametersRemembered,rememberParameters,run,startNewlyConfiguredWorkspaceSetup,stopTerminal,terminal,terminalCanStop,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 learning=useVibe64Learning();const reportActivity=usePageActivity();let orientation=null;const previewSuspended=ref(false);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 previewIdentityResumeSelection=null;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=>target.id===requestedAutoStartTargetId.value&&target.presentation?.kind===`web`)||null});const embeddedStartTarget=computed(()=>{if(!props.embeddedPreview)return null;return embeddedAutoStartTarget.value||managedPreviewTarget(outputTargets.value)||preferredPreviewTarget(outputTargets.value)});const outputSetupTarget=computed(()=>embeddedStartTarget.value||outputTargets.value.find(target=>target.default)||outputTargets.value[0]||null);const outputSetupUnavailableReason=computed(()=>{const target=outputSetupTarget.value;return 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 outputOptionsTarget=computed(()=>activeOutputTarget.value||previewContextTarget.value);const outputOptionsAvailable=computed(()=>Boolean(outputOptionsTarget.value?.parameters?.length));const outputOptionsVisible=ref(false);const outputOptionsSelection=ref(null);const outputOptionsValues=ref({});const outputOptionsRemember=ref(false);const outputOptionsSubmitted=ref(false);const outputOptionsError=ref(``);const outputOptionsErrors=computed(()=>Object.fromEntries((outputOptionsSelection.value?.parameters||[]).map(parameter=>{const value=outputOptionsValues.value[parameter.id]||``;const error=parameter.required&&!value.trim()?`${parameter.label} is required.`:value.length>4096||/[\0\r\n]/u.test(value)?`Enter one line of text, at most 4096 characters.`:``;return[parameter.id,outputOptionsSubmitted.value?error:``]})));const outputOptionsAction=ref(`Run`);function openOutputOptions(target=outputOptionsTarget.value){if(!target?.parameters?.length||operationBusy.value)return;outputOptionsAction.value=terminalIsRunning.value?`Save and restart`:`Run`;outputOptionsSelection.value=target;outputOptionsValues.value=parametersForTarget(target);outputOptionsRemember.value=parametersRemembered(target);outputOptionsSubmitted.value=false;outputOptionsError.value=``;outputOptionsVisible.value=true}function resetOutputOptions(){outputOptionsValues.value=Object.fromEntries(outputOptionsSelection.value.parameters.map(parameter=>[parameter.id,parameter.default]))}async function submitOutputOptions(){if(operationBusy.value)return;outputOptionsSubmitted.value=true;if(Object.values(outputOptionsErrors.value).some(Boolean))return;const target=outputOptionsSelection.value;const values={...outputOptionsValues.value};const remember=outputOptionsRemember.value;outputOptionsError.value=``;const started=await run(target,{forceRestart:terminalIsRunning.value,outputParameters:values});if(outputOptionsSelection.value!==target||!outputOptionsVisible.value)return;if(started){rememberParameters(target,values,remember);outputOptionsVisible.value=false}else outputOptionsError.value=launchError.value||`The target could not be started. Try again.`}function runWithOptions(target){return target.parameters?.length?openOutputOptions(target):run(target)}watch(()=>JSON.stringify([projectSlug.value,props.session?.sessionId,outputTargets.value.map(({id,parameters})=>[id,parameters])]),()=>{outputOptionsVisible.value=false;outputOptionsSelection.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(()=>Boolean(props.embeddedPreview&&previewIdentityCapability.value?.available===true));const previewIdentityConfigured=computed(()=>normalizeConfiguredPreviewIdentities(previewIdentityCapability.value?.identities));const previewIdentityLifecycleKey=computed(()=>previewIdentityLifecycleIdentity({outputTargetId:activeOutputTarget.value?.id||terminal.value?.metadata?.outputTargetId,previewBaseUrl:previewBaseUrl.value,projectSlug:projectSlug.value,sessionId:props.session?.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 previewRestartPending=ref(false);let previewRestartAttempted=false;const previewWorkNotice=computed(()=>previewRestartPending.value?`Server will be restarted soon`:props.busy||props.sourceOperationsSuspended?`Work in progress`:``);watch([()=>props.session?.sessionId,()=>props.busy,()=>props.sourceOperationsSuspended,previewState,previewStoppedIntent,operationBusy,terminalCanRestart,terminalCanRetry,previewCanRestart,previewTestNotice,resourceAdmissionId,testApproval],async([sessionId,busy,suspended,state],previous=[])=>{if(sessionId!==previous[0]||state===`ready`){previewRestartAttempted=false;previewRestartPending.value=false}if(busy&&!previous[1])previewRestartAttempted=false;if(previewStoppedIntent.value||resourceAdmissionId.value||testApproval.value||previewTestNotice.value){previewRestartPending.value=false;return}if(!props.embeddedPreview||![`stale`,`failed`].includes(state)||!(terminalCanRestart.value||terminalCanRetry.value||previewCanRestart.value)||previewRestartAttempted)return;previewRestartPending.value=true;if(busy||suspended||operationBusy.value)return;previewRestartAttempted=true;const project=projectSlug.value;try{await refreshOutputs();await nextTick();if(project!==projectSlug.value||sessionId!==props.session?.sessionId||loadError.value||props.busy||props.sourceOperationsSuspended||operationBusy.value||previewStoppedIntent.value||resourceAdmissionId.value||testApproval.value||previewTestNotice.value||![`stale`,`failed`].includes(previewState.value)||!(terminalCanRestart.value||terminalCanRetry.value||previewCanRestart.value))return;await recoverEmbeddedPreview()}finally{if(props.session?.sessionId===sessionId)previewRestartPending.value=false}});const previewFrameLoaded=computed(()=>Boolean(previewUrl.value&&previewFrameRequestId.value>0&&previewLoadedFrameRequestId.value===previewFrameRequestId.value));const previewIdentitySelectionDisabled=computed(()=>Boolean(previewIdentityBusy.value||!previewFrameLoaded.value));const previewDiagnosticsAvailable=computed(()=>Boolean(previewFrameLoaded.value&&previewFrame.value?.contentWindow&&previewBridgeVersion.value>=7));const previewCheckAgainVisible=computed(()=>Boolean(props.embeddedPreview&&previewState.value===`idle`&&!previewUrl.value&&!terminalVisible.value&&outputSetupUnavailableReason.value&&!loadError.value));const previewBrowserControlsVisible=computed(()=>Boolean(previewSuspended.value||loading.value||loadError.value||previewUrl.value||outputTargets.value.some(target=>target.presentation?.kind===`web`)));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?.mode===`guest`?`Signing out of the preview…`:`Opening preview as ${requested?.name||requested?.identityName||`the selected app identity`}…`}return launchPreviewInFlightText({workspacePreparing:workspacePreparing?.value===true,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&&!previewRestartPending.value&&!embeddedTerminalFrameVisible.value));const previewRecoveryVisible=computed(()=>Boolean(props.embeddedPreview&&previewNoticeVisible.value&&(embeddedStartTarget.value?.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:outputSetupUnavailableReason.value,launchStarting:launchStarting.value,outputTargetsUnavailable:outputTargetsLoaded.value&&outputTargets.value.length<1,nonWebOutputsAvailable:outputTargets.value.length>0&&!embeddedStartTarget.value,terminalIsRunning:terminalIsRunning.value}));function previewClientDebugEnabled(){if(typeof window===`undefined`)return false;try{return window.localStorage?.getItem(`vibe64:preview-debug`)===`1`||new URL(window.location.href).searchParams.has(`vibe64_preview_debug`)}catch{return false}}function previewDebugLog(event=``,details={}){if(!previewClientDebugEnabled())return;if([`resource.failed`,`resource.retry`,`resource.retry.skipped`,`resource.retry.unavailable`,`frame.requested`,`iframe.loaded`,`iframe.ready`].includes(event))publishPreviewDiagnostic?.({event,timestamp:new Date().toISOString(),frameUrl:previewUrl.value,frameRequestId:previewFrameRequestId.value,resourceUrl:details.resourceUrl||``,resourceKind:details.resourceKind||`resource`,retryCount:details.retryCount??previewResourceRetryCount,willRetry:details.willRetry===true});vibe64SessionDebugLog(`client.launchPreview.${event}`,redactPreviewDebugDetails({frameRequestId:previewFrameRequestId.value,frameSrc:String(previewFrame.value?.getAttribute?.(`src`)||``),loadedFrameRequestId:previewLoadedFrameRequestId.value,overlayVisible:previewLoadingOverlayVisible.value,previewBaseUrl:previewBaseUrl.value,previewDisplayBaseUrl:previewDisplayBaseUrl.value,previewState:previewState.value,previewUrl:previewUrl.value,projectSlug:projectSlug.value,sessionId:String(props.session?.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 orientationUuid(value){return typeof value===`string`&&/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/u.test(value)}function orientationFields(value,fields){return value&&typeof value===`object`&&!Array.isArray(value)&&Object.keys(value).sort().join(`,`)===fields.slice().sort().join(`,`)}function learningOwner(){const owner=unref(learning);return typeof owner?.beginExercise===`function`&&typeof owner.finishExercise===`function`?owner:null}function orientationFrameCurrent(channel){return orientation===channel&&previewFrame.value===channel.frame&&previewFrame.value?.contentWindow===channel.window&&previewFrameRequestId.value===channel.frameRequestId&&props.session?.sessionId===channel.sessionId&&terminalSessionId.value===channel.terminalSessionId&&projectSlug.value===channel.projectSlug&&Boolean(previewUrl.value)}function previewFrameVisible(frame){return Boolean(frame)&&previewFrameLoaded.value&&previewPaneDisplayed.value&&props.windowDisplayed!==false&&document.visibilityState===`visible`&&Boolean(previewVisibleViewportRect(frame.getBoundingClientRect(),{width:window.innerWidth,height:window.innerHeight}))}function orientationFrameVisible(channel){return orientationFrameCurrent(channel)&&previewFrameVisible(channel.frame)}function retireOrientationInteraction(channel=orientation){if(channel)channel.pending=null}function closeOrientation(){retireOrientationInteraction();orientation?.port?.close();orientation=null}function orientationInteractionCurrent(channel,pending){return channel.pending===pending&&orientationFrameVisible(channel)&&learningOwner()===pending.owner&&pending.owner.exerciseCurrent(pending.ticket)}function handleOrientationPacket(channel,input){if(!orientationFrameCurrent(channel))return;const common=[`type`,`protocolVersion`,`playerInstanceId`,`instanceId`];if(input?.protocolVersion!==1||input.playerInstanceId!==channel.playerInstanceId||input.instanceId!==channel.instanceId){retireOrientationInteraction(channel);return}if(input.type===`ready`&&orientationFields(input,common)){channel.ready=true;return}if(!channel.ready||!orientationFrameVisible(channel)){retireOrientationInteraction(channel);return}if(input.type===`button`&&orientationFields(input,[...common,`interactionId`])&&orientationUuid(input.interactionId)){retireOrientationInteraction(channel);reportActivity(`app-pressed`,{projectSlug:channel.projectSlug,sessionId:channel.sessionId});const owner=learningOwner();const ticket=owner?.beginExercise(channel.projectSlug);if(ticket)channel.pending={owner,ticket,interactionId:input.interactionId,phase:`button`};return}const pending=channel.pending;if(!pending||input.interactionId!==pending.interactionId)return;if(!orientationInteractionCurrent(channel,pending)){retireOrientationInteraction(channel);return}if(input.type===`request`&&pending.phase===`button`&&input.method===`POST`&&input.path===`/api/greeting`&&orientationFields(input,[...common,`interactionId`,`method`,`path`])){pending.phase=`request`;return}if(input.type===`response-displayed`&&pending.phase===`request`&&orientationUuid(input.requestId)&&input.message===`Hello from the server!`&&orientationFields(input,[...common,`interactionId`,`requestId`,`message`])){retireOrientationInteraction(channel);pending.owner.finishExercise(pending.ticket,{sessionId:channel.sessionId,instanceId:channel.instanceId,interactionId:pending.interactionId,requestId:input.requestId});return}retireOrientationInteraction(channel)}function connectOrientation(){const channel=orientation;if(!channel||channel.port||!orientationFrameCurrent(channel)||!previewFrameLoaded.value)return;const ports=new MessageChannel;channel.port=ports.port1;channel.port.onmessage=event=>handleOrientationPacket(channel,event.data);channel.port.onmessageerror=()=>retireOrientationInteraction(channel);channel.port.start();try{channel.window.postMessage({type:`orientation-init`,protocolVersion:1,playerInstanceId:channel.playerInstanceId},channel.origin,[ports.port2])}catch{ports.port2.close();closeOrientation()}}function handleOrientationAvailable(event){const owner=learningOwner();if(!owner||!orientationFields(event.data,[`type`,`protocolVersion`,`instanceId`])||event.data.protocolVersion!==1||!orientationUuid(event.data.instanceId)||event.ports?.length||!props.embeddedPreview||!previewFrameRequestId.value||!previewUrl.value||!projectSlug.value||!props.session?.sessionId||!terminalSessionId.value)return;owner.prepareExercise?.(projectSlug.value);if(orientation&&orientationFrameCurrent(orientation)&&orientation.instanceId===event.data.instanceId)return;closeOrientation();orientation={frame:previewFrame.value,window:event.source,origin:event.origin,frameRequestId:previewFrameRequestId.value,projectSlug:projectSlug.value,sessionId:props.session.sessionId,terminalSessionId:terminalSessionId.value,instanceId:event.data.instanceId,playerInstanceId:crypto.randomUUID(),ready:false,port:null,pending:null};connectOrientation()}function invalidateHiddenOrientation(){if(orientation?.pending&&!orientationInteractionCurrent(orientation,orientation.pending))retireOrientationInteraction()}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);const resourceKind=String(message?.kind||`resource`).trim()||`resource`;const resourceUrl=String(message?.href||``).trim();const willRetry=previewResourceRetryCount<PREVIEW_RESOURCE_RETRY_LIMIT;previewDebugLog(`resource.failed`,{resourceKind,resourceUrl,retryCount:previewResourceRetryCount,willRetry});if(message.recover===false||previewResourceRetryTimer!==null)return false;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});if(!willRetry)return false;previewResourceRetryCount+=1;const failedFrameRequestId=previewFrameRequestId.value;previewResourceRetryTimer=setTimeout(()=>{previewResourceRetryTimer=null;if(previewResourceRetryLifecycle!==previewIdentityLifecycleKey.value||failedFrameRequestId!==previewFrameRequestId.value){previewDebugLog(`resource.retry.skipped`);return}previewDebugLog(`resource.retry`);if(!requestPreviewFrame({force:true,reason:`resource-load-retry`})){previewDebugLog(`resource.retry.unavailable`);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=``){closeOrientation();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}={}){if(previewSuspended.value||!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:activeOutputTarget.value?.id,sessionId:props.session?.sessionId,src:nextSrc,terminalSessionId:terminalSessionId.value});if(!nextIdentity||!force&&nextIdentity===previewFrameRequest.value.identity)return false;closeOrientation();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}function suspendPreview(){previewIdentityResumeSelection=previewIdentityRequested.value;previewSuspended.value=true;resetPreviewResourceRecovery(previewIdentityLifecycleKey.value);clearPreviewFrame(`suspended`);completePreviewIdentityTransition()}async function resumePreview(){const frameRequestId=previewFrameRequestId.value;const project=projectSlug.value;const sessionId=props.session?.sessionId;await refreshOutputs();await nextTick();if(project!==projectSlug.value||sessionId!==props.session?.sessionId||frameRequestId!==previewFrameRequestId.value||!previewSuspended.value)return false;previewSuspended.value=false;if(previewIdentityResumeSelection)previewIdentityAutomaticAttempt=``;return requestPreviewFrame({force:true,reason:`resumed`})}async function reloadPreview(){if(previewSuspended.value)return false;resetPreviewResourceRecovery(previewIdentityLifecycleKey.value);const requestIdBeforeRefresh=previewFrameRequestId.value;await refreshOutputs();await nextTick();const reloaded=previewFrameRequestId.value!==requestIdBeforeRefresh||await requestPreviewFrame({force:true,reason:`manual-reload`});if(reloaded)reportActivity(`preview-reloaded`,{projectSlug:projectSlug.value,sessionId:props.session?.sessionId});return reloaded}async function retryLaunchStatus(){await 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(){if(!previewDisplayedAddress.value||typeof navigator===`undefined`||!navigator.clipboard?.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);if((history.at(-1)||``)===normalizedUrl)return;if((history.at(-2)||``)===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?.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(){if(!previewPaneDisplayed.value||!previewFrame.value?.contentWindow||!previewUrl.value){if(previewUrl.value)previewDebugLog(`query.skipped`,{hasContentWindow:Boolean(previewFrame.value?.contentWindow),previewPaneDisplayed:previewPaneDisplayed.value});return}previewDebugLog(`query.post`);previewFrame.value.contentWindow.postMessage({type:PREVIEW_QUERY_MESSAGE_TYPE},`*`)}async function requestPreviewDiagnostics({signal=null}={}){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:previewFrame.value?.contentWindow,timeoutMessage:`The proxied app did not return its diagnostics in time.`,timeoutMs:PREVIEW_DIAGNOSTICS_TIMEOUT_MS})}finally{previewDiagnosticsBusy.value=false}}function requestPreviewIdentityExchange(grant=``){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:previewFrame.value?.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`){if(!requestPreviewFrame({force:true,reason})){completePreviewIdentityTransition();return false}previewIdentityReloadRequestId=previewFrameRequestId.value;return true}async function selectPreviewIdentity(selection={}){if(previewIdentitySelectionDisabled.value||!previewIdentityAvailable.value)return false;const frameRequestId=previewFrameRequestId.value;const current=()=>!previewSuspended.value&&frameRequestId===previewFrameRequestId.value;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;let pendingSelection=previewIdentityRequested.value;function retireSelection(){if(previewIdentityRequested.value===pendingSelection)completePreviewIdentityTransition();return false}try{const grantResult=await requestPreviewIdentityGrant(requested);if(!current())return retireSelection();const grant=String(grantResult?.grant||``).trim();if(!grant||grantResult?.ok===false)throw new Error(String(grantResult?.error||`Vibe64 could not authorize the preview identity exchange.`));const requestedIdentity=grantResult.requestedIdentity||requested;previewIdentityRequested.value=requestedIdentity;pendingSelection=previewIdentityRequested.value;const exchangeResult=await requestPreviewIdentityExchange(grant);if(!current())return retireSelection();previewIdentityCurrent.value=previewIdentityFromExchange(exchangeResult,requestedIdentity);reloadPreviewForIdentity(`identity-selected`);return true}catch(error){if(!current())return retireSelection();const message=String(error?.message||error||`Preview identity exchange failed.`);previewIdentityError.value=message;if(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?.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;const selection=previewIdentityResumeSelection||defaultPreviewIdentitySelection({capability:previewIdentityCapability.value});previewIdentityResumeSelection=null;selectPreviewIdentity(selection);return true}function markPreviewFrameReady(requestId,reason=``){const normalizedRequestId=Math.max(0,Number(requestId)||0);if(!normalizedRequestId||normalizedRequestId!==previewFrameRequestId.value||!previewFrame.value?.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){const frame=event?.currentTarget||null;const requestId=Number(frame?.dataset?.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}={}){if(operationBusy.value)return false;const project=projectSlug.value;const session=props.session?.sessionId;operationBusy.value=true;try{await refreshOutputs();await nextTick()}finally{operationBusy.value=false}if(project!==projectSlug.value||session!==props.session?.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){expandTerminal();return}minimizeTerminal()}function showLaunchLog(){collapsePreviewToolbar();previewLogVisible.value=true;expandTerminal()}function previewMessageUrl(data={}){if(!data||typeof data!==`object`||data.type!==`vibe64:preview-location`)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``;if(!launchActions.value.find(action=>{try{return new URL(String(action?.href||``)).origin===targetUrl.origin&&String(action?.previewHref||``).trim()}catch{return false}}))return``;try{const previewUrl=new URL(previewBase);previewUrl.pathname=targetUrl.pathname;previewUrl.search=targetUrl.search;previewUrl.hash=targetUrl.hash;return previewUrl.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?.origin||``))}function previewMessageType(value={}){return String(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){if(previewSuspended.value)return;const orientationAvailable=event?.data?.type===`orientation-available`;if(!orientationAvailable&&!isPreviewBridgeMessage(event?.data))return;if(event?.source!==previewFrame.value?.contentWindow){previewDebugLog(`message.ignored`,{messageType:previewMessageType(event?.data),origin:String(event?.origin||``),reason:`source_mismatch`});return}if(!previewMessageOriginAllowed(event)){previewDebugLog(`message.ignored`,{messageType:previewMessageType(event?.data),origin:String(event?.origin||``),reason:`origin_not_allowed`});return}if(orientationAvailable){handleOrientationAvailable(event);return}const messageType=previewMessageType(event.data);const bridgeReady=isPreviewBridgeReadyMessage(event.data);if(bridgeReady&&previewFrameLoaded.value){closeOrientation();resetPreviewBridge(`bridge-document-ready`)}previewBridgeVersion.value=Math.max(previewBridgeVersion.value,Math.max(0,Number(event?.data?.version)||0));if(bridgeReady){markPreviewFrameReady(previewFrameRequestId.value,`bridge-ready`);return}if(messageType===`vibe64:preview-resource-failure`){handlePreviewResourceFailure(event.data);return}if(messageType===`vibe64:preview-diagnostics-response`){const requestId=String(event.data?.requestId||``);previewBridgeRequests.resolve(requestId,event.data?.diagnostics||{});return}if(messageType===`vibe64:preview-identity-response`){const requestId=String(event.data?.requestId||``);if(event.data?.ok===true)previewBridgeRequests.resolve(requestId,{identity:event.data?.identity||null});else previewBridgeRequests.reject(requestId,Object.assign(new Error(String(event.data?.error||`Preview identity exchange failed.`)),{code:String(event.data?.code||`vibe64_preview_identity_exchange_failed`),signedOut:event.data?.signedOut===true}));return}const frameUrl=previewMessageUrl(event.data);previewDebugLog(`message.received`,{frameUrl,href:String(event?.data?.href||event?.data?.url||``),messageType:previewMessageType(event?.data),origin:String(event?.origin||``),reason:String(event?.data?.reason||``)});if(frameUrl){setPreviewVisitedUrl(frameUrl,{reason:String(event?.data?.reason||``)});publishPreviewState({route:previewRouteFromUrl(frameUrl),title:String(event?.data?.title||``)})}}watch(previewIdentityLifecycleKey,lifecycle=>{if(lifecycle===previewIdentityLifecycle)return;closeOrientation();previewIdentityLifecycle=lifecycle;previewIdentityAutomaticAttempt=``;previewIdentityResumeSelection=null;resetPreviewResourceRecovery(lifecycle);resetPreviewIdentityState();previewBridgeRequests.rejectAll(`The active application preview changed.`);previewDiagnosticsBusy.value=false},{flush:`sync`,immediate:true});watch([previewFrameLoaded,previewFrame],()=>{if(orientation&&!orientationFrameCurrent(orientation))closeOrientation();else connectOrientation()},{flush:`sync`});watch([previewPaneDisplayed,()=>props.windowDisplayed,()=>learningOwner()?.exerciseStep(projectSlug.value)],invalidateHiddenOrientation,{flush:`sync`});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(previewState,state=>{if(outputTargetsLoaded.value&&[`failed`,`idle`,`project_closed`,`stopped`].includes(state))clearPreviewFrame(`preview-not-running`)},{flush:`sync`});watch([projectSlug,()=>String(props.session?.sessionId||``)],()=>{previewSuspended.value=false;cancelPreviewResourceRetry();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);document.addEventListener(`visibilitychange`,invalidateHiddenOrientation)});onBeforeUnmount(()=>{window.removeEventListener(`message`,handlePreviewBridgeMessage);document.removeEventListener(`visibilitychange`,invalidateHiddenOrientation);closeOrientation();cancelPreviewResourceRetry();previewBridgeRequests.rejectAll(`The application preview closed.`)});return{outputOptionsAction,previewWorkNotice,previewTestNotice,outputOptionsAvailable,outputOptionsError,outputOptionsErrors,outputOptionsRemember,outputOptionsSelection,outputOptionsValues,outputOptionsVisible,openOutputOptions,resetOutputOptions,runWithOptions,submitOutputOptions,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,previewBrowserControlsVisible,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,previewSuspended,suspendPreview,resumePreview,retryLaunchStatus,requestPreviewDiagnostics,resetPreviewAddressDraft,selectPreviewConfiguredIdentity,selectPreviewGuest,submitPreviewRouteDialog,submitPreviewAddress,restartTerminal,retryTerminal,runMenuDisabled,showLaunchLog,stopTerminal,setTerminalExpanded,terminal,terminalCanStop,terminalCanRestart,terminalCanRetry,terminalCommandPreview,terminalDisplayed,terminalExpanded,terminalError,terminalIndicatorLabel,terminalIndicatorState,terminalIsRunning,terminalStatus,terminalSubtitle,terminalTitle,terminalVisible,terminalWindowStorageKey,terminalWindowVisible,toolbarTeleportTarget,visible}}function launchPreviewEmptyText({launchStatusText=``,launchStarting=false,loadError=``,loading=false,outputTargetsUnavailable=false,nonWebOutputsAvailable=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 not running. Start it to see the app.`;if(launchStatusText)return launchStatusText;if(loadError)return`Preview status request failed: ${String(loadError||``).trim()}`;if(loading)return`Checking preview status.`;if(outputTargetsUnavailable)return`No runnable output is declared. You can continue working in the conversation.`;if(nonWebOutputsAvailable)return`This project has no web preview. Use Run to choose an output; terminal output and downloads appear here.`;return`Preview will appear here when it is ready.`}function outputTargetLabel(outputTarget=null){return String(outputTarget?.label||outputTarget?.id||``).trim()||`selected output target`}function launchPreviewInFlightText({workspacePreparing=false,activeOutputTarget=null,embeddedStartTarget=null,launchStarting=false,launchWaiting=false,launchStatusText=``,loading=false,operationBusy=false,previewDisplayedAddress=``,previewEmbedUnavailableReason=``,previewLoadingOverlayVisible=false,previewUrl=``,terminalCanRestart=false,terminalCanRetry=false,terminalIsRunning=false}={}){if(workspacePreparing)return`Preparing workspace before Preview can start. Expand Preparing workspace to see progress. Preview will retry automatically when setup finishes.`;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 current workspace 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();return`Loading preview page${address?`: ${address}`:``}. 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)}var PREVIEW_DIAGNOSTICS_MAX_TEXT_CHARACTERS=7e5;var 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(`
1
+ import{$n as normalizeProps,D as createVNode,E as createTextVNode,Ht as watch,J as inject,On as unref,Yt as withDirectives,Zn as normalizeClass,_ as createBaseVNode,b as createElementBlock,bt as renderList,ct as onMounted,et as mergeProps,g as computed,it as onBeforeUnmount,mt as openBlock,o as Fragment,qt as withCtx,rt as onBeforeMount,tr as toDisplayString,tt as nextTick,u as Teleport,un as isRef,v as createBlock,vn as ref,w as createSlots,wt as resolveDynamicComponent,xt as renderSlot,y as createCommentVNode,z as guardReactiveProps}from"./runtime-core.esm-bundler-DGXg_mpN.js";import{h as VIcon,ir as vModelText,or as withKeys,sr as withModifiers}from"./ripple-EFNA8EBu.js";import{T as ROUTE_VISIBILITY_PUBLIC,t as useEndpointResource}from"./useEndpointResource-Ds8EDBZ2.js";import{s as vibe64ProjectScopedStorageKey,t as currentProjectSlugFromLocation,u as getHttpWebClient}from"./vibe64ProjectScope.local-B06ABkhI.js";import{n as VList,s as VListItem,t as VMenu}from"./VMenu-CDcBLYWR.js";import{t as VChip}from"./VChip-VVdtjfq-.js";import{t as VTextField}from"./VTextField-C0b_0cSa.js";import{Dr as mdiStop,H as mdiChevronLeft,Hn as mdiPauseCircleOutline,Jn as mdiPlayCircleOutline,Rn as mdiOpenInNew,S as mdiArrowLeft,Tt as mdiDownloadOutline,U as mdiChevronRight,W as mdiChevronUp,Xn as mdiPowerCycle,Yr as mdiWebClock,ct as mdiConsoleLine,f as mdiAlertCircleOutline,it as mdiCogOutline,lr as mdiRoutes,n as mdiAccountCircleOutline,nr as mdiRefresh,s as mdiAccountOffOutline,u as mdiAccountSwitchOutline,ut as mdiContentCopy,xt as mdiDotsHorizontal}from"./mdi-Bt90Ns76.js";import{t as VBtn}from"./VBtn-BhVEwXLX.js";import{t as VAlert}from"./VAlert-gwuhYlYb.js";import{t as VCheckbox}from"./VCheckbox-DyCGSN0H.js";import{t as VDivider}from"./VDivider-Dq25WsKu.js";import{t as VDialog}from"./VDialog-CQDhjRiV.js";import{a as VCardSubtitle,i as VCardTitle,n as VCardText,o as VCardActions,r as VCardItem,t as VCard}from"./VCard-C3Hx769y.js";import{t as VSpacer}from"./VSpacer-CgWOWvBh.js";import{t as _plugin_vue_export_helper_default}from"./_plugin-vue_export-helper-DNW4j-dv.js";import{i as VIBE64_RESOURCE_RECOVERY_KEY,r as vibe64OutputTerminalWebSocketUrl}from"./_slug_-pVQuRCsN.js";import{n as useRealtimeEvent}from"./useRealtimeEvent-DrOiU8lJ.js";import{a as Vibe64Terminal_default,n as createWebSocketTerminalDriver,t as useVibe64Terminal}from"./useVibe64Terminal-I7Sf6xMW.js";import{t as usePaths}from"./usePaths-Db88-HOm.js";import{t as useCommand}from"./useCommand-nWFczmJy.js";import{n as stableLocalStorageKeyPart,r as writeLocalStorageJson,t as readLocalStorageJson}from"./browserLocalStorage-B4C7rHrs.js";import{t as useVibe64ProjectSlug}from"./useVibe64ProjectScope-B5ogg6jd.js";import{n as vibe64RealtimeOriginPayload,r as vibe64RealtimePayloadFromCurrentTab}from"./vibe64BrowserTabOrigin-SF9E31vi.js";import{D as VIBE64_SESSIONS_API_SUFFIX,G as vibe64OutputsQueryKey,H as vibe64OutputRunPath,K as vibe64PreviewIdentityPath,O as VIBE64_SESSION_CHANGED_EVENT,U as vibe64OutputRunStopPath,V as vibe64OutputResultPath,W as vibe64OutputsPath,Yt as VSnackbar,b as readRefOrGetterValue,et as vibe64SessionPath,nn as usePageActivity,tt as vibe64SessionPreviewStatePath,v as useVibe64Learning}from"./index-BnZ5igE0.js";import{t as Vibe64TemporaryAiFixAction_default}from"./Vibe64TemporaryAiFixAction-CIePbdW8.js";import{a as vibe64SessionDebugError,c as vibe64SessionSourcePath,o as vibe64SessionDebugLog}from"./vibe64SessionPanelModel-DDorOuiL.js";import{o as vibe64SessionRevision,t as isArchivedVibe64Session}from"./vibe64SessionViewModel-DR4tOlGM.js";var _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=>{if(!open)props.terminal?.closeTerminalSocket?.()});return(_ctx,_cache)=>{return __props.open?(openBlock(),createBlock(Vibe64Terminal_default,{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)}}};var PREVIEW_BRIDGE_READY_MESSAGE_TYPE=`vibe64:preview-bridge-ready`;var PREVIEW_DIAGNOSTICS_REQUEST_MESSAGE_TYPE=`vibe64:preview-diagnostics-request`;var PREVIEW_DIAGNOSTICS_RESPONSE_MESSAGE_TYPE=`vibe64:preview-diagnostics-response`;var PREVIEW_IDENTITY_REQUEST_MESSAGE_TYPE=`vibe64:preview-identity-request`;var PREVIEW_IDENTITY_RESPONSE_MESSAGE_TYPE=`vibe64:preview-identity-response`;var PREVIEW_LOCATION_MESSAGE_TYPE=`vibe64:preview-location`;var PREVIEW_QUERY_MESSAGE_TYPE=`vibe64:preview-query`;var PREVIEW_RESOURCE_FAILURE_MESSAGE_TYPE=`vibe64:preview-resource-failure`;var PREVIEW_PROXY_TOKEN_QUERY_PARAM=`vibe64_preview_token`;function previewDiagnosticUrl(value){try{const url=new URL(String(value||``));return[`http:`,`https:`].includes(url.protocol)?`${url.origin}${url.pathname}`.slice(0,2048):``}catch{return``}}function preferredPreviewTarget(outputTargets=[]){const targets=(Array.isArray(outputTargets)?outputTargets:[]).filter(target=>target?.presentation?.kind===`web`);return targets.find(target=>target?.default===true)||targets[0]||null}function managedPreviewTarget(outputTargets=[]){return preferredPreviewTarget((Array.isArray(outputTargets)?outputTargets:[]).filter(target=>target?.available!==false))}var LAUNCH_BROWSER_WINDOW_FEATURES=`popup,width=1400,height=900,left=80,top=60`;var LAUNCH_PREVIEW_TOOLBAR_POSITIONS=Object.freeze([`left`,`center`,`right`]);var AUTO_START_ATTEMPT_COOLDOWN_MS=7e3;var AUTO_START_STABILITY_DELAY_MS=750;var LAUNCH_STATUS_RETRY_LIMIT=2;var LAUNCH_STATUS_RETRY_BASE_DELAY_MS=1e3;var LAUNCH_STATUS_RETRY_MAX_DELAY_MS=5e3;var LAUNCH_STATUS_IDLE_RECOVERY_INITIAL_DELAY_MS=1200;var LAUNCH_STATUS_IDLE_RECOVERY_INTERVAL_MS=3e3;var LAUNCH_STATUS_IDLE_RECOVERY_LIMIT=6;var TERMINAL_STOP_POLL_INTERVAL_MS=100;var TERMINAL_STOP_POLL_ATTEMPTS=50;var OUTPUTS_REALTIME_REASONS=new Set([`preview-test-state-changed`,`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?.sessionId||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?.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){const studioHref=String(browserWindow?.location?.href||localPreviewBrowserHref()).trim();return resolveLaunchPreviewDestination([target],{studioHref}).displayHref}function outputTargetWorktreePath(session={}){return vibe64SessionSourcePath(session)}function launchControlsSessionCanRun(session={}){const metadata=session?.metadata&&typeof session.metadata===`object`&&!Array.isArray(session.metadata)?session.metadata:{};return Boolean(String(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=``){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 payload.clientRefresh?.includeOutputs===true||!reason||OUTPUTS_REALTIME_REASONS.has(reason)}function shouldScheduleLaunchAutoStart({autoStartKey=``,externalBusy=false,key=``,loading=false,operationBusy=false,sessionLaunchable=true,sessionId=``,stoppedIntent=false,target=null,terminalDisplayed=true,terminalVisible=false}={}){return Boolean(sessionId&&sessionLaunchable&&!stoppedIntent&&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)>=2)return false;if(launchStatusAgentWriteBusy(error))return true;const status=normalizeHttpStatus(error?.status??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?.message||fallbackText||`Request failed.`).trim();const status=normalizeHttpStatus(error?.status??error?.statusCode);const code=String(error?.code||``).trim();const requestPath=String(path||error?.path||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){const code=String(error?.code||error?.response?.code||error?.response?.errors?.[0]?.code||``).trim();return code===`vibe64_agent_write_mode_busy`||code===`VIBE64_TRAINING_PREPARATION_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?.startedAt||0);if(String(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?.launchReady===true||metadata?.launchReady===`true`}function launchPreviewRequiresProxy(metadata={}){return Boolean(String(metadata?.previewAuth||``).trim())}function terminalSessionMissingError(message=``){return/terminal session not found/iu.test(String(message||``))}function localPreviewBrowserHref(){if(typeof window===`undefined`)return``;return String(window.location?.href||``)}function resolveLaunchPreviewDestination(actions=[],{requirePreviewProxy=false,studioHref=localPreviewBrowserHref()}={}){const action=Array.isArray(actions)?actions.find(candidate=>browserCanOpenTarget(candidate))||null:null;const targetHref=String(action?.href||``).trim();const previewHref=String(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,stoppedIntent:source.stoppedIntent===true,targetHref:String(source.targetHref||``).trim(),terminalId:String(source.terminalId||``).trim()}}function plainObject(value){return value&&typeof value===`object`&&!Array.isArray(value)?value:{}}function launchPreviewTestNotice(status={},activeTarget=null){const state=status.previewTestRun?.state;if([`cleanup_required`,`restore_failed`].includes(state))return{error:true,title:`Preview recovery required`,message:`Tests finished, but Preview has not been restored. Ask the coding agent to recover it before using the app.`};if(state===`restoring`)return{title:`Restoring your app`,message:`Browser tests have finished. Vibe64 is restoring the previous Preview.`};if(activeTarget?.dataMode===`test`)return{title:`Test Preview`,message:`Using this app’s test configuration. Test data may be reset.`};if(state)return{title:`Browser tests in progress`,message:`The coding agent temporarily controls this Preview for automated checks.`};return null}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);return new URL(studioText).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(()=>String(selectedSession.value?.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 workspacePreparing=computed(()=>selectedSession.value?.workspaceSetup?.status===`running`);const launchSourceOperationsSuspended=computed(()=>readRefOrGetterValue(sourceOperationsSuspended)===true||workspacePreparing.value);const canLoadOutputs=computed(()=>launchControlsCanLoadTargets({displayed:terminalDisplayed.value,session:selectedSession.value||{},sourceOperationsSuspended:launchSourceOperationsSuspended.value}));const sessionsApiPath=computed(()=>paths.api(VIBE64_SESSIONS_API_SUFFIX,{surface:`app`}));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(`app`,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.automatic===true?{automatic:true}:{},...context.forceRestart===true?{forceRestart:true}:{},...context.outputParameters===void 0?{}:{outputParameters:context.outputParameters},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:`app`,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:`app`,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:`app`,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:`app`,writeMethod:`POST`});const status=computed(()=>outputTargetsResource.data.value||{});const outputTargetsLoaded=computed(()=>status.value.ok!==false&&Array.isArray(status.value.outputTargets));const launchStatusLoadError=computed(()=>{if(workspacePreparing.value)return``;const setup=selectedSession.value?.workspaceSetup;if([`failed`,`ambiguous`].includes(setup?.status))return setup.diagnostic||`Workspace preparation failed. Expand Preparing workspace to inspect the failure and retry setup.`;if(outputTargetsResource.isLoading.value)return``;return launchStatusErrorText({error:outputTargetsResource.query?.error?.value||null,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 previewStoppedIntent=computed(()=>preview.value.stoppedIntent);const testApproval=computed(()=>[`waiting`,`resuming`].includes(status.value.testApproval?.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(run=>(Array.isArray(run?.results)?run.results:[]).map(result=>({...result,href:vibe64OutputResultPath(sessionsApiPath.value,sessionId.value,result.id),outputTargetId:String(run.outputTargetId||``),runId:String(run.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=>target.id===requestedAutoStartTargetId.value&&target.presentation?.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(()=>String(terminalMetadata.value.outputTargetId||activeTerminal.value?.metadata?.outputTargetId||status.value.lastOutputTarget?.id||``));const activeOutputTarget=computed(()=>{return outputTargets.value.find(target=>target.id===activeOutputTargetId.value)||null});const previewTestNotice=computed(()=>launchPreviewTestNotice(status.value,activeOutputTarget.value));const launchActions=computed(()=>{const actions=terminalMetadata.value.actions||activeTerminal.value?.metadata?.actions||[];const targetHref=previewTargetHref.value||String(previewTarget.value?.targetHref||``).trim();const iframeHref=previewHref.value||String(previewTarget.value?.href||``).trim();const browserActions=Array.isArray(actions)?actions.filter(action=>browserCanOpenTarget(action)):[];if(browserActions.length<1&&iframeHref&&targetHref)return[{href:targetHref,kind:previewTarget.value?.kind||`url`,label:previewTarget.value?.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(()=>launchTerminalIsReady({...activeTerminal.value?.metadata||{},...terminalMetadata.value||{}}));const terminalPreviewRequiresProxy=computed(()=>launchPreviewRequiresProxy({...activeTerminal.value?.metadata||{},...terminalMetadata.value||{}}));const previewTargetDisabledReason=computed(()=>![`ready`,`stale`].includes(previewState.value)?previewMessage.value:``);const previewTargetRecovery=computed(()=>previewRecovery.value);const terminalIsRunning=computed(()=>{const statusValue=terminalStatus.value||activeTerminal.value?.status||``;return statusValue===`running`||statusValue===`closing`||terminalStarting.value});const terminalPreviewProxyPending=computed(()=>Boolean(terminalPreviewRequiresProxy.value&&terminalLaunchReady.value&&terminalIsRunning.value&&!previewHref.value));const terminalIndicatorState=computed(()=>{if(terminalStatus.value===`exited`||activeTerminal.value?.status===`exited`){const exitCode=terminalExitCode.value??activeTerminal.value?.exitCode;return exitCode&&exitCode!==0?`failed`:`stopped`}if(terminalIsRunning.value)return terminalLaunchReady.value?`running`:`starting`;return`stopped`});const terminalIndicatorLabel=computed(()=>{const presentationKind=activeOutputTarget.value?.presentation?.kind||outputExecution.value.presentationKind;const finite=activeOutputTarget.value?.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(workspacePreparing.value||readRefOrGetterValue(busy)||operationBusy.value||terminalIsRunning.value));const outputTargetsLoadingForAutoStart=computed(()=>autoStartOutputsLoading({outputTargetsLoading:outputTargetsResource.isLoading.value,outputTargetsSettled:outputTargetsSettledForAutoStart.value}));const terminalCanStop=computed(()=>{return Boolean(terminalSessionId.value&&(terminalStatus.value||activeTerminal.value?.status)===`running`)});const terminalCanClose=computed(()=>Boolean(terminalSessionId.value&&!terminalIsRunning.value&&(terminalExited.value||activeTerminal.value?.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(()=>activeOutputTarget.value?.label||`Run target`);const terminalSubtitle=computed(()=>{if(terminalIsRunning.value)return``;if(terminalStatus.value===`exited`||activeTerminal.value?.status===`exited`){const exitCode=terminalExitCode.value??activeTerminal.value?.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`));function parameterStorageKey(target){return vibe64ProjectScopedStorageKey(`vibe64.output-parameters.${target.id}`,projectSlug.value)}function parametersRemembered(target){return readLocalStorageJson(parameterStorageKey(target),null)!==null}function rememberParameters(target,values,remember){writeLocalStorageJson(parameterStorageKey(target),remember?values:null)}function parametersForTarget(target){const metadata=terminalMetadata.value.outputTargetId===target.id?terminalMetadata.value:activeTerminal.value?.metadata;const saved=status.value.lastOutputTarget;const values=(metadata?.outputTargetId===target.id?metadata.outputParameters:null)||(saved?.id===target.id?saved.outputParameters:null)||readLocalStorageJson(parameterStorageKey(target),{})||{};return Object.fromEntries((target.parameters||[]).map(parameter=>[parameter.id,typeof values[parameter.id]===`string`?values[parameter.id]:parameter.default]))}async function run(outputTarget={},{applyDefaultDisplay=true,autoStartAttemptKey=``,forceRestart=false,ignoreExternalBusy=false,outputParameters}={}){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 parameters=outputTarget.parameters?.length?outputParameters||parametersForTarget(outputTarget):void 0;const missing=outputTarget.parameters?.find(parameter=>parameter.required&&!parameters[parameter.id]?.trim());if(missing)throw new Error(`${missing.label} is required. Open Preview options to set it.`);const terminalSession=await startTerminalCommand.run({automatic:Boolean(normalizedAutoStartAttemptKey),forceRestart,...parameters?{outputParameters:parameters}:{},outputTargetId:outputTarget.id,sessionId:currentSessionId});if(disposed||startedScopeKey!==launchScopeKey.value||!launchControlsCanLoadTargets({displayed:terminalDisplayed.value,session:selectedSession.value||{},sourceOperationsSuspended:launchSourceOperationsSuspended.value}))return false;applyLaunchTerminalSession(terminalSession);connectLaunchTerminal();refresh({scopeKey:startedScopeKey});return true}catch(error){if(disposed||startedScopeKey!==launchScopeKey.value)return false;if(normalizedAutoStartAttemptKey){if(launchStatusAgentWriteBusy(error)){launchWaiting.value=previewState.value!==`ready`;refresh({scopeKey:startedScopeKey}).catch(()=>null);return false}autoStartKey.value=normalizedAutoStartAttemptKey}launchError.value=String(error?.message||startTerminalCommand.message||`Output target could not be started.`).trim();refusedAdmissionId.value=String(error?.details?.admission?.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))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;connectLaunchTerminal()}async function refresh({scopeKey=launchScopeKey.value}={}){if(!canLoadOutputs.value)return null;if(!String(scopeKey||``).trim())return null;return typeof outputTargetsResource.query?.refetch===`function`?outputTargetsResource.query.refetch({cancelRefetch:true}):outputTargetsResource.reload()}async function startNewlyConfiguredWorkspaceSetup(){if(String(selectedSession.value?.workspaceSetup?.status||``).trim()!==`unconfigured`||!sessionId.value)return false;try{return(await getHttpWebClient().request(vibe64SessionPath(sessionsApiPath.value,sessionId.value,`/workspace-setup/retry`),{body:vibe64RealtimeOriginPayload(),method:`POST`}))?.ok!==false}catch(error){vibe64SessionDebugLog(`client.launchPreview.workspaceSetup.start.error`,{error:vibe64SessionDebugError(error),sessionId:sessionId.value});return false}}async function publishPreviewDiagnostic(record){if(!sessionId.value||!projectSlug.value)return false;try{return(await getHttpWebClient().request(vibe64SessionPath(sessionsApiPath.value,sessionId.value,`/preview-diagnostics`),{method:`POST`,body:{...record,enabled:true,frameUrl:previewDiagnosticUrl(record.frameUrl),resourceUrl:previewDiagnosticUrl(record.resourceUrl)}}))?.recorded===true}catch{return false}}async function publishPreviewState(previewState={}){const currentSessionId=sessionId.value;const currentProjectSlug=projectSlug.value;if(!currentSessionId||!currentProjectSlug||!String(previewState?.route||``).trim())return false;try{return(await getHttpWebClient().request(vibe64SessionPreviewStatePath(sessionsApiPath.value,currentSessionId),{body:vibe64RealtimeOriginPayload({projectSlug:currentProjectSlug,route:String(previewState?.route||``).trim(),title:String(previewState?.title||``).trim()}),method:`POST`}))?.ok!==false}catch(error){vibe64SessionDebugLog(`client.launchPreview.state.publish.error`,{error:vibe64SessionDebugError(error),route:String(previewState?.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;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?.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;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;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{applyLaunchTerminalSession(await stopTerminalCommand.run({sessionId:sessionId.value,terminalSessionId:terminalSessionId.value}));await refresh();return await waitForStoppedTerminal()}catch(error){launchError.value=String(error?.message||`Preview could not be stopped.`);await refresh();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(){if(!terminalOutput.value||typeof navigator===`undefined`||!navigator.clipboard?.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?.id){clearStaleLaunchTerminal();return}if(nextTerminal.id!==attachedTerminalId){closeTerminalSocket();resetTerminalDisplay();attachedTerminalId=nextTerminal.id}applyTerminalSession(nextTerminal,{fallbackStatus:nextTerminal.status||`running`});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();refresh()});watch(terminalDisplayed,displayed=>{if(displayed){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,previewStoppedIntent.value?`stopped`:`startable`,canLoadOutputs.value?`loadable`:`blocked`,outputTargetsResource.isLoading.value?`loading`:`ready`].join(`|`),()=>{if(!launchScopeKey.value||!autoStartRequestKey.value||!canLoadOutputs.value||previewStoppedIntent.value){resetOutputsAutoStartSettlement();return}if(outputTargetsResource.isLoading.value){outputTargetsSettledForAutoStart.value=false;return}outputTargetsSettledForAutoStart.value=true},{flush:`post`,immediate:true});watch(()=>[projectSlug.value,sessionId.value,autoStartRequestKey.value,previewStoppedIntent.value?`stopped`:`startable`,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,autoStartTarget.value?.id||``,autoStartCooldownVersion.value].join(`|`),()=>{const target=autoStartTarget.value;const key=`${launchScopeKey.value}:${target?.id||``}`;if(resourceAdmissionId.value){clearAutoStartTimer();return}if(previewStoppedIntent.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,stoppedIntent:previewStoppedIntent.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;if(previewStoppedIntent.value)return;const currentKey=`${launchScopeKey.value}:${currentTarget?.id||``}`;if(!shouldScheduleLaunchAutoStart({autoStartKey:autoStartKey.value,externalBusy:readRefOrGetterValue(busy),key:currentKey,loading:outputTargetsLoadingForAutoStart.value,operationBusy:operationBusy.value,sessionLaunchable:canLoadOutputs.value,sessionId:sessionId.value,stoppedIntent:previewStoppedIntent.value,target:currentTarget,terminalDisplayed:terminalDisplayed.value,terminalVisible:terminalVisible.value}))return;const currentCooldownMs=readLaunchAutoStartAttemptCooldown(currentKey);if(currentCooldownMs>0){scheduleAutoStartCooldownCheck(currentCooldownMs);return}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`||false){start();return}autoStartTimer=window.setTimeout(start,750)},{flush:`post`,immediate:true});onBeforeUnmount(()=>{disposed=true;clearAutoStartTimer();clearAutoStartCooldownTimer();clearLaunchStatusIdleRecoveryTimer();disposeTerminalUi()});return{activeOutputTarget,previewTestNotice,activeOutputTargetId,activeTerminal,closeTerminal,copyLog,expandTerminal,launchActions,launchButtonsDisabled,launchError,resourceAdmissionId,acceptResourceRetry,testApproval,launchStatusAttempt,launchStatusIdleRecoveryExhausted,launchStarting,launchWaiting:computed(()=>workspacePreparing.value||launchWaiting.value),workspacePreparing,outputTargets,outputTargetsLoaded,outputExecution,outputResults,outputRuns,loading:outputTargetsResource.isLoading,loadError:launchStatusLoadError,minimizeTerminal,openAction,operationBusy,previewCanRestart,previewCanShowLog,previewCanStart,previewHref,previewIdentity,previewMessage,previewState,previewStoppedIntent,previewTargetDisabledReason,previewTargetHref,previewTargetRecovery,terminalPreviewRequiresProxy,terminalPreviewProxyPending,publishPreviewState,publishPreviewDiagnostic,requestPreviewIdentityGrant,refresh,restartTerminal,retryTerminal,parametersForTarget,parametersRemembered,rememberParameters,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}}var ROUTE_PARAM_PATTERN=/:([A-Za-z][A-Za-z0-9_]*)/gu;function previewRoutesForTarget(launchTarget={}){return Array.isArray(launchTarget?.previewRoutes)?launchTarget.previewRoutes.filter(route=>route?.id&&route?.pathTemplate):[]}function previewRouteParams(route={}){const declared=new Map((Array.isArray(route.params)?route.params:[]).filter(param=>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?.[name]??param?.defaultValue??``).trim();if(!value&&param?.required!==false){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())}var PREVIEW_CAPTURE_FRAME_TIMEOUT_MS=5e3;var 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){return`vibe64-preview-${(date instanceof Date?date:new Date(date)).toISOString().replace(/[:.]/gu,`-`)}-${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?.name===`NotAllowedError`)return`Preview capture was not allowed. Click the eye again and choose This Tab.`;if(error?.name===`NotFoundError`)return`This browser could not find a tab that it can capture.`;if(error?.name===`NotReadableError`)return`The browser could not read the shared tab. Stop another screen capture and try again.`;return String(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){for(const track of stream?.getTracks?.()||[])track?.stop?.()}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=globalThis.navigator?.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?.getDisplayMedia&&documentObject?.createElement&&typeof fileConstructor===`function`)}function release({stopTracks=false}={}){const stream=captureStream;if(captureTrack)captureTrack.removeEventListener?.(`ended`,handleTrackEnded);captureVideo?.pause?.();if(captureVideo)captureVideo.srcObject=null;captureStream=null;captureTrack=null;captureVideo=null;if(stopTracks)stopMediaStream(stream)}function handleTrackEnded(){captureGeneration+=1;release();onEnded()}async function ensureCaptureVideo(){if(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=stream?.getVideoTracks?.()[0]||null;const displaySurface=String(track?.getSettings?.().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;track.addEventListener?.(`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?.getBoundingClientRect||!windowObject)return null;return previewVisibleViewportRect(frame.getBoundingClientRect(),{height:windowObject.innerHeight,width:windowObject.innerWidth})}function refreshVisibility(){visible.value=Boolean(currentVisibleRect())}function disconnectObserver(){intersectionObserver?.disconnect?.();intersectionObserver=null}function observeCurrentFrame(){disconnectObserver();const frame=readRefOrGetterValue(previewFrame);if(!frame){refreshVisibility();return}if(typeof 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}={})=>{const stopCapture=()=>session.stop();signal?.addEventListener?.(`abort`,stopCapture,{once:true});return session.capture(currentVisibleRect).finally(()=>{signal?.removeEventListener?.(`abort`,stopCapture)})}}):await session.capture(currentVisibleRect).then(attachFile);if(!(Array.isArray(result)?result.length>0:Boolean(result))){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?.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}}var PREVIEW_IDENTITY_TYPE_EMAIL=`email`;var PREVIEW_IDENTITY_TYPE_LOGIN=`login`;var PREVIEW_IDENTITY_TYPE_USER_ID=`user-id`;var PREVIEW_IDENTITY_TYPES=Object.freeze([PREVIEW_IDENTITY_TYPE_EMAIL,PREVIEW_IDENTITY_TYPE_LOGIN,PREVIEW_IDENTITY_TYPE_USER_ID]);var PREVIEW_DISPLAY_QUERY_PARAMS=Object.freeze([PREVIEW_PROXY_TOKEN_QUERY_PARAM]);var PREVIEW_DIAGNOSTICS_TIMEOUT_MS=3e3;var PREVIEW_IDENTITY_TIMEOUT_MS=1e4;var PREVIEW_RESOURCE_RETRY_DELAY_MS=250;var 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);if([displayBaseUrl,previewBaseUrl].map(baseUrl=>{try{return previewUrlWithoutDisplayParams(baseUrl)?new URL(previewUrlWithoutDisplayParams(baseUrl)).origin:``}catch{return``}}).filter(Boolean).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(`vibe64_preview_token`)||``;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}={}){if(busy)return`Switching identity`;if(!identity)return`Identity not confirmed`;if(identity.mode===`guest`)return`Guest`;const selectorValue=String(identity.selector?.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?.name||``).trim().toLowerCase();const selector=normalizePreviewIdentitySelector({type:entry?.type,value: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?.identity&&typeof exchangeResult.identity===`object`?exchangeResult.identity:{};const selector=normalizePreviewIdentitySelector(identity.selector||requestedIdentity.selector);const email=String(identity.email||(selector?.type===PREVIEW_IDENTITY_TYPE_EMAIL?selector.value:``)).trim().toLowerCase();const login=String(identity.login||(selector?.type===PREVIEW_IDENTITY_TYPE_LOGIN?selector.value:``)).trim();const userId=String(identity.userId||(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?.value||``).trim(),email,login,mode:requestedIdentity.mode,name:String(requestedIdentity.name||``).trim(),selector,userId,username}}function isPreviewBridgeReadyMessage(value={}){return String(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?.defaultIdentityName||``).trim();return capability?.defaultMode===`identity`&&name?{identityName:name,mode:`identity`}:{mode:`guest`}}function createPreviewBridgeRequestRegistry(){const pendingRequests=new Map;let sequence=0;function take(requestId=``){const pending=pendingRequests.get(requestId);if(!pending)return null;clearTimeout(pending.timeout);pending.signal?.removeEventListener?.(`abort`,pending.abortHandler);pendingRequests.delete(requestId);return pending}function reject(requestId,error){const pending=take(requestId);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?.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((resolve,rejectRequest)=>{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,signal,timeout});signal?.addEventListener?.(`abort`,abortHandler,{once:true});if(signal?.aborted)abortHandler()});try{targetWindow.postMessage({...message,requestId},`*`)}catch(error){reject(requestId,error)}return response}function resolve(requestId,value){const pending=take(requestId);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(`vibe64_preview_token`)?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);if(!new Set([displayBase.origin,previewBase.origin]).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,previewTestNotice,expandTerminal,launchActions,launchButtonsDisabled,launchError,resourceAdmissionId,acceptResourceRetry,testApproval,launchStatusAttempt,launchStarting,launchWaiting,workspacePreparing,outputExecution,outputResults,outputRuns,outputTargets,outputTargetsLoaded,loading,loadError,minimizeTerminal,openAction,operationBusy,previewCanRestart,previewCanShowLog,previewCanStart,previewIdentity:previewIdentityCapability,previewMessage,previewState,previewStoppedIntent,publishPreviewState,publishPreviewDiagnostic,requestPreviewIdentityGrant,refresh:refreshOutputs,restartTerminal,retryTerminal,parametersForTarget,parametersRemembered,rememberParameters,run,startNewlyConfiguredWorkspaceSetup,stopTerminal,terminal,terminalCanStop,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 learning=useVibe64Learning();const reportActivity=usePageActivity();let orientation=null;const previewSuspended=ref(false);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 previewIdentityResumeSelection=null;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=>target.id===requestedAutoStartTargetId.value&&target.presentation?.kind===`web`)||null});const embeddedStartTarget=computed(()=>{if(!props.embeddedPreview)return null;return embeddedAutoStartTarget.value||managedPreviewTarget(outputTargets.value)||preferredPreviewTarget(outputTargets.value)});const outputSetupTarget=computed(()=>embeddedStartTarget.value||outputTargets.value.find(target=>target.default)||outputTargets.value[0]||null);const outputSetupUnavailableReason=computed(()=>{const target=outputSetupTarget.value;return 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 outputOptionsTarget=computed(()=>activeOutputTarget.value||previewContextTarget.value);const outputOptionsAvailable=computed(()=>Boolean(outputOptionsTarget.value?.parameters?.length));const outputOptionsVisible=ref(false);const outputOptionsSelection=ref(null);const outputOptionsValues=ref({});const outputOptionsRemember=ref(false);const outputOptionsSubmitted=ref(false);const outputOptionsError=ref(``);const outputOptionsErrors=computed(()=>Object.fromEntries((outputOptionsSelection.value?.parameters||[]).map(parameter=>{const value=outputOptionsValues.value[parameter.id]||``;const error=parameter.required&&!value.trim()?`${parameter.label} is required.`:value.length>4096||/[\0\r\n]/u.test(value)?`Enter one line of text, at most 4096 characters.`:``;return[parameter.id,outputOptionsSubmitted.value?error:``]})));const outputOptionsAction=ref(`Run`);function openOutputOptions(target=outputOptionsTarget.value){if(!target?.parameters?.length||operationBusy.value)return;outputOptionsAction.value=terminalIsRunning.value?`Save and restart`:`Run`;outputOptionsSelection.value=target;outputOptionsValues.value=parametersForTarget(target);outputOptionsRemember.value=parametersRemembered(target);outputOptionsSubmitted.value=false;outputOptionsError.value=``;outputOptionsVisible.value=true}function resetOutputOptions(){outputOptionsValues.value=Object.fromEntries(outputOptionsSelection.value.parameters.map(parameter=>[parameter.id,parameter.default]))}async function submitOutputOptions(){if(operationBusy.value)return;outputOptionsSubmitted.value=true;if(Object.values(outputOptionsErrors.value).some(Boolean))return;const target=outputOptionsSelection.value;const values={...outputOptionsValues.value};const remember=outputOptionsRemember.value;outputOptionsError.value=``;const started=await run(target,{forceRestart:terminalIsRunning.value,outputParameters:values});if(outputOptionsSelection.value!==target||!outputOptionsVisible.value)return;if(started){rememberParameters(target,values,remember);outputOptionsVisible.value=false}else outputOptionsError.value=launchError.value||`The target could not be started. Try again.`}function runWithOptions(target){return target.parameters?.length?openOutputOptions(target):run(target)}watch(()=>JSON.stringify([projectSlug.value,props.session?.sessionId,outputTargets.value.map(({id,parameters})=>[id,parameters])]),()=>{outputOptionsVisible.value=false;outputOptionsSelection.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(()=>Boolean(props.embeddedPreview&&previewIdentityCapability.value?.available===true));const previewIdentityConfigured=computed(()=>normalizeConfiguredPreviewIdentities(previewIdentityCapability.value?.identities));const previewIdentityLifecycleKey=computed(()=>previewIdentityLifecycleIdentity({outputTargetId:activeOutputTarget.value?.id||terminal.value?.metadata?.outputTargetId,previewBaseUrl:previewBaseUrl.value,projectSlug:projectSlug.value,sessionId:props.session?.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 previewRestartPending=ref(false);let previewRestartAttempted=false;const previewWorkNotice=computed(()=>previewRestartPending.value?`Server will be restarted soon`:props.busy||props.sourceOperationsSuspended?`Work in progress`:``);watch([()=>props.session?.sessionId,()=>props.busy,()=>props.sourceOperationsSuspended,previewState,previewStoppedIntent,operationBusy,terminalCanRestart,terminalCanRetry,previewCanRestart,previewTestNotice,resourceAdmissionId,testApproval],async([sessionId,busy,suspended,state],previous=[])=>{if(sessionId!==previous[0]||state===`ready`){previewRestartAttempted=false;previewRestartPending.value=false}if(busy&&!previous[1])previewRestartAttempted=false;if(previewStoppedIntent.value||resourceAdmissionId.value||testApproval.value||previewTestNotice.value){previewRestartPending.value=false;return}if(!props.embeddedPreview||![`stale`,`failed`].includes(state)||!(terminalCanRestart.value||terminalCanRetry.value||previewCanRestart.value)||previewRestartAttempted)return;previewRestartPending.value=true;if(busy||suspended||operationBusy.value)return;previewRestartAttempted=true;const project=projectSlug.value;try{await refreshOutputs();await nextTick();if(project!==projectSlug.value||sessionId!==props.session?.sessionId||loadError.value||props.busy||props.sourceOperationsSuspended||operationBusy.value||previewStoppedIntent.value||resourceAdmissionId.value||testApproval.value||previewTestNotice.value||![`stale`,`failed`].includes(previewState.value)||!(terminalCanRestart.value||terminalCanRetry.value||previewCanRestart.value))return;await recoverEmbeddedPreview()}finally{if(props.session?.sessionId===sessionId)previewRestartPending.value=false}});const previewFrameLoaded=computed(()=>Boolean(previewUrl.value&&previewFrameRequestId.value>0&&previewLoadedFrameRequestId.value===previewFrameRequestId.value));const previewIdentitySelectionDisabled=computed(()=>Boolean(previewIdentityBusy.value||!previewFrameLoaded.value));const previewDiagnosticsAvailable=computed(()=>Boolean(previewFrameLoaded.value&&previewFrame.value?.contentWindow&&previewBridgeVersion.value>=7));const previewCheckAgainVisible=computed(()=>Boolean(props.embeddedPreview&&previewState.value===`idle`&&!previewUrl.value&&!terminalVisible.value&&outputSetupUnavailableReason.value&&!loadError.value));const previewBrowserControlsVisible=computed(()=>Boolean(previewSuspended.value||loading.value||loadError.value||previewUrl.value||outputTargets.value.some(target=>target.presentation?.kind===`web`)));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?.mode===`guest`?`Signing out of the preview…`:`Opening preview as ${requested?.name||requested?.identityName||`the selected app identity`}…`}return launchPreviewInFlightText({workspacePreparing:workspacePreparing?.value===true,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&&!previewRestartPending.value&&!embeddedTerminalFrameVisible.value));const previewRecoveryVisible=computed(()=>Boolean(props.embeddedPreview&&previewNoticeVisible.value&&(embeddedStartTarget.value?.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:outputSetupUnavailableReason.value,launchStarting:launchStarting.value,outputTargetsUnavailable:outputTargetsLoaded.value&&outputTargets.value.length<1,nonWebOutputsAvailable:outputTargets.value.length>0&&!embeddedStartTarget.value,terminalIsRunning:terminalIsRunning.value}));function previewClientDebugEnabled(){if(typeof window===`undefined`)return false;try{return window.localStorage?.getItem(`vibe64:preview-debug`)===`1`||new URL(window.location.href).searchParams.has(`vibe64_preview_debug`)}catch{return false}}function previewDebugLog(event=``,details={}){if(!previewClientDebugEnabled())return;if([`resource.failed`,`resource.retry`,`resource.retry.skipped`,`resource.retry.unavailable`,`frame.requested`,`iframe.loaded`,`iframe.ready`].includes(event))publishPreviewDiagnostic?.({event,timestamp:new Date().toISOString(),frameUrl:previewUrl.value,frameRequestId:previewFrameRequestId.value,resourceUrl:details.resourceUrl||``,resourceKind:details.resourceKind||`resource`,retryCount:details.retryCount??previewResourceRetryCount,willRetry:details.willRetry===true});vibe64SessionDebugLog(`client.launchPreview.${event}`,redactPreviewDebugDetails({frameRequestId:previewFrameRequestId.value,frameSrc:String(previewFrame.value?.getAttribute?.(`src`)||``),loadedFrameRequestId:previewLoadedFrameRequestId.value,overlayVisible:previewLoadingOverlayVisible.value,previewBaseUrl:previewBaseUrl.value,previewDisplayBaseUrl:previewDisplayBaseUrl.value,previewState:previewState.value,previewUrl:previewUrl.value,projectSlug:projectSlug.value,sessionId:String(props.session?.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 orientationUuid(value){return typeof value===`string`&&/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/u.test(value)}function orientationFields(value,fields){return value&&typeof value===`object`&&!Array.isArray(value)&&Object.keys(value).sort().join(`,`)===fields.slice().sort().join(`,`)}function learningOwner(){const owner=unref(learning);return typeof owner?.beginExercise===`function`&&typeof owner.finishExercise===`function`?owner:null}function orientationFrameCurrent(channel){return orientation===channel&&previewFrame.value===channel.frame&&previewFrame.value?.contentWindow===channel.window&&previewFrameRequestId.value===channel.frameRequestId&&props.session?.sessionId===channel.sessionId&&terminalSessionId.value===channel.terminalSessionId&&projectSlug.value===channel.projectSlug&&Boolean(previewUrl.value)}function previewFrameVisible(frame){return Boolean(frame)&&previewFrameLoaded.value&&previewPaneDisplayed.value&&props.windowDisplayed!==false&&document.visibilityState===`visible`&&Boolean(previewVisibleViewportRect(frame.getBoundingClientRect(),{width:window.innerWidth,height:window.innerHeight}))}function orientationFrameVisible(channel){return orientationFrameCurrent(channel)&&previewFrameVisible(channel.frame)}function retireOrientationInteraction(channel=orientation){if(channel)channel.pending=null}function closeOrientation(){retireOrientationInteraction();orientation?.port?.close();orientation=null}function orientationInteractionCurrent(channel,pending){return channel.pending===pending&&orientationFrameVisible(channel)&&learningOwner()===pending.owner&&pending.owner.exerciseCurrent(pending.ticket)}function handleOrientationPacket(channel,input){if(!orientationFrameCurrent(channel))return;const common=[`type`,`protocolVersion`,`playerInstanceId`,`instanceId`];if(input?.protocolVersion!==1||input.playerInstanceId!==channel.playerInstanceId||input.instanceId!==channel.instanceId){retireOrientationInteraction(channel);return}if(input.type===`ready`&&orientationFields(input,common)){channel.ready=true;return}if(!channel.ready||!orientationFrameVisible(channel)){retireOrientationInteraction(channel);return}if(input.type===`button`&&orientationFields(input,[...common,`interactionId`])&&orientationUuid(input.interactionId)){retireOrientationInteraction(channel);reportActivity(`app-pressed`,{projectSlug:channel.projectSlug,sessionId:channel.sessionId});const owner=learningOwner();const ticket=owner?.beginExercise(channel.projectSlug);if(ticket)channel.pending={owner,ticket,interactionId:input.interactionId,phase:`button`};return}const pending=channel.pending;if(!pending||input.interactionId!==pending.interactionId)return;if(!orientationInteractionCurrent(channel,pending)){retireOrientationInteraction(channel);return}if(input.type===`request`&&pending.phase===`button`&&input.method===`POST`&&input.path===`/api/greeting`&&orientationFields(input,[...common,`interactionId`,`method`,`path`])){pending.phase=`request`;return}if(input.type===`response-displayed`&&pending.phase===`request`&&orientationUuid(input.requestId)&&input.message===`Hello from the server!`&&orientationFields(input,[...common,`interactionId`,`requestId`,`message`])){retireOrientationInteraction(channel);pending.owner.finishExercise(pending.ticket,{sessionId:channel.sessionId,instanceId:channel.instanceId,interactionId:pending.interactionId,requestId:input.requestId});return}retireOrientationInteraction(channel)}function connectOrientation(){const channel=orientation;if(!channel||channel.port||!orientationFrameCurrent(channel)||!previewFrameLoaded.value)return;const ports=new MessageChannel;channel.port=ports.port1;channel.port.onmessage=event=>handleOrientationPacket(channel,event.data);channel.port.onmessageerror=()=>retireOrientationInteraction(channel);channel.port.start();try{channel.window.postMessage({type:`orientation-init`,protocolVersion:1,playerInstanceId:channel.playerInstanceId},channel.origin,[ports.port2])}catch{ports.port2.close();closeOrientation()}}function handleOrientationAvailable(event){const owner=learningOwner();if(!owner||!orientationFields(event.data,[`type`,`protocolVersion`,`instanceId`])||event.data.protocolVersion!==1||!orientationUuid(event.data.instanceId)||event.ports?.length||!props.embeddedPreview||!previewFrameRequestId.value||!previewUrl.value||!projectSlug.value||!props.session?.sessionId||!terminalSessionId.value)return;owner.prepareExercise?.(projectSlug.value);if(orientation&&orientationFrameCurrent(orientation)&&orientation.instanceId===event.data.instanceId)return;closeOrientation();orientation={frame:previewFrame.value,window:event.source,origin:event.origin,frameRequestId:previewFrameRequestId.value,projectSlug:projectSlug.value,sessionId:props.session.sessionId,terminalSessionId:terminalSessionId.value,instanceId:event.data.instanceId,playerInstanceId:crypto.randomUUID(),ready:false,port:null,pending:null};connectOrientation()}function invalidateHiddenOrientation(){if(orientation?.pending&&!orientationInteractionCurrent(orientation,orientation.pending))retireOrientationInteraction()}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);const resourceKind=String(message?.kind||`resource`).trim()||`resource`;const resourceUrl=String(message?.href||``).trim();const willRetry=previewResourceRetryCount<PREVIEW_RESOURCE_RETRY_LIMIT;previewDebugLog(`resource.failed`,{resourceKind,resourceUrl,retryCount:previewResourceRetryCount,willRetry});if(message.recover===false||previewResourceRetryTimer!==null)return false;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});if(!willRetry)return false;previewResourceRetryCount+=1;const failedFrameRequestId=previewFrameRequestId.value;previewResourceRetryTimer=setTimeout(()=>{previewResourceRetryTimer=null;if(previewResourceRetryLifecycle!==previewIdentityLifecycleKey.value||failedFrameRequestId!==previewFrameRequestId.value){previewDebugLog(`resource.retry.skipped`);return}previewDebugLog(`resource.retry`);if(!requestPreviewFrame({force:true,reason:`resource-load-retry`})){previewDebugLog(`resource.retry.unavailable`);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=``){closeOrientation();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}={}){if(previewSuspended.value||!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:activeOutputTarget.value?.id,sessionId:props.session?.sessionId,src:nextSrc,terminalSessionId:terminalSessionId.value});if(!nextIdentity||!force&&nextIdentity===previewFrameRequest.value.identity)return false;closeOrientation();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}function suspendPreview(){previewIdentityResumeSelection=previewIdentityRequested.value;previewSuspended.value=true;resetPreviewResourceRecovery(previewIdentityLifecycleKey.value);clearPreviewFrame(`suspended`);completePreviewIdentityTransition()}async function resumePreview(){const frameRequestId=previewFrameRequestId.value;const project=projectSlug.value;const sessionId=props.session?.sessionId;await refreshOutputs();await nextTick();if(project!==projectSlug.value||sessionId!==props.session?.sessionId||frameRequestId!==previewFrameRequestId.value||!previewSuspended.value)return false;previewSuspended.value=false;if(previewIdentityResumeSelection)previewIdentityAutomaticAttempt=``;return requestPreviewFrame({force:true,reason:`resumed`})}async function reloadPreview(){if(previewSuspended.value)return false;resetPreviewResourceRecovery(previewIdentityLifecycleKey.value);const requestIdBeforeRefresh=previewFrameRequestId.value;await refreshOutputs();await nextTick();const reloaded=previewFrameRequestId.value!==requestIdBeforeRefresh||await requestPreviewFrame({force:true,reason:`manual-reload`});if(reloaded)reportActivity(`preview-reloaded`,{projectSlug:projectSlug.value,sessionId:props.session?.sessionId});return reloaded}async function retryLaunchStatus(){await 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(){if(!previewDisplayedAddress.value||typeof navigator===`undefined`||!navigator.clipboard?.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);if((history.at(-1)||``)===normalizedUrl)return;if((history.at(-2)||``)===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?.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(){if(!previewPaneDisplayed.value||!previewFrame.value?.contentWindow||!previewUrl.value){if(previewUrl.value)previewDebugLog(`query.skipped`,{hasContentWindow:Boolean(previewFrame.value?.contentWindow),previewPaneDisplayed:previewPaneDisplayed.value});return}previewDebugLog(`query.post`);previewFrame.value.contentWindow.postMessage({type:PREVIEW_QUERY_MESSAGE_TYPE},`*`)}async function requestPreviewDiagnostics({signal=null}={}){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:previewFrame.value?.contentWindow,timeoutMessage:`The proxied app did not return its diagnostics in time.`,timeoutMs:PREVIEW_DIAGNOSTICS_TIMEOUT_MS})}finally{previewDiagnosticsBusy.value=false}}function requestPreviewIdentityExchange(grant=``){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:previewFrame.value?.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`){if(!requestPreviewFrame({force:true,reason})){completePreviewIdentityTransition();return false}previewIdentityReloadRequestId=previewFrameRequestId.value;return true}async function selectPreviewIdentity(selection={}){if(previewIdentitySelectionDisabled.value||!previewIdentityAvailable.value)return false;const frameRequestId=previewFrameRequestId.value;const current=()=>!previewSuspended.value&&frameRequestId===previewFrameRequestId.value;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;let pendingSelection=previewIdentityRequested.value;function retireSelection(){if(previewIdentityRequested.value===pendingSelection)completePreviewIdentityTransition();return false}try{const grantResult=await requestPreviewIdentityGrant(requested);if(!current())return retireSelection();const grant=String(grantResult?.grant||``).trim();if(!grant||grantResult?.ok===false)throw new Error(String(grantResult?.error||`Vibe64 could not authorize the preview identity exchange.`));const requestedIdentity=grantResult.requestedIdentity||requested;previewIdentityRequested.value=requestedIdentity;pendingSelection=previewIdentityRequested.value;const exchangeResult=await requestPreviewIdentityExchange(grant);if(!current())return retireSelection();previewIdentityCurrent.value=previewIdentityFromExchange(exchangeResult,requestedIdentity);reloadPreviewForIdentity(`identity-selected`);return true}catch(error){if(!current())return retireSelection();const message=String(error?.message||error||`Preview identity exchange failed.`);previewIdentityError.value=message;if(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?.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;const selection=previewIdentityResumeSelection||defaultPreviewIdentitySelection({capability:previewIdentityCapability.value});previewIdentityResumeSelection=null;selectPreviewIdentity(selection);return true}function markPreviewFrameReady(requestId,reason=``){const normalizedRequestId=Math.max(0,Number(requestId)||0);if(!normalizedRequestId||normalizedRequestId!==previewFrameRequestId.value||!previewFrame.value?.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){const frame=event?.currentTarget||null;const requestId=Number(frame?.dataset?.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}={}){if(operationBusy.value)return false;const project=projectSlug.value;const session=props.session?.sessionId;operationBusy.value=true;try{await refreshOutputs();await nextTick()}finally{operationBusy.value=false}if(project!==projectSlug.value||session!==props.session?.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){expandTerminal();return}minimizeTerminal()}function showLaunchLog(){collapsePreviewToolbar();previewLogVisible.value=true;expandTerminal()}function previewMessageUrl(data={}){if(!data||typeof data!==`object`||data.type!==`vibe64:preview-location`)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``;if(!launchActions.value.find(action=>{try{return new URL(String(action?.href||``)).origin===targetUrl.origin&&String(action?.previewHref||``).trim()}catch{return false}}))return``;try{const previewUrl=new URL(previewBase);previewUrl.pathname=targetUrl.pathname;previewUrl.search=targetUrl.search;previewUrl.hash=targetUrl.hash;return previewUrl.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?.origin||``))}function previewMessageType(value={}){return String(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){if(previewSuspended.value)return;const orientationAvailable=event?.data?.type===`orientation-available`;if(!orientationAvailable&&!isPreviewBridgeMessage(event?.data))return;if(event?.source!==previewFrame.value?.contentWindow){previewDebugLog(`message.ignored`,{messageType:previewMessageType(event?.data),origin:String(event?.origin||``),reason:`source_mismatch`});return}if(!previewMessageOriginAllowed(event)){previewDebugLog(`message.ignored`,{messageType:previewMessageType(event?.data),origin:String(event?.origin||``),reason:`origin_not_allowed`});return}if(orientationAvailable){handleOrientationAvailable(event);return}const messageType=previewMessageType(event.data);const bridgeReady=isPreviewBridgeReadyMessage(event.data);if(bridgeReady&&previewFrameLoaded.value){closeOrientation();resetPreviewBridge(`bridge-document-ready`)}previewBridgeVersion.value=Math.max(previewBridgeVersion.value,Math.max(0,Number(event?.data?.version)||0));if(bridgeReady){markPreviewFrameReady(previewFrameRequestId.value,`bridge-ready`);return}if(messageType===`vibe64:preview-resource-failure`){handlePreviewResourceFailure(event.data);return}if(messageType===`vibe64:preview-diagnostics-response`){const requestId=String(event.data?.requestId||``);previewBridgeRequests.resolve(requestId,event.data?.diagnostics||{});return}if(messageType===`vibe64:preview-identity-response`){const requestId=String(event.data?.requestId||``);if(event.data?.ok===true)previewBridgeRequests.resolve(requestId,{identity:event.data?.identity||null});else previewBridgeRequests.reject(requestId,Object.assign(new Error(String(event.data?.error||`Preview identity exchange failed.`)),{code:String(event.data?.code||`vibe64_preview_identity_exchange_failed`),signedOut:event.data?.signedOut===true}));return}const frameUrl=previewMessageUrl(event.data);previewDebugLog(`message.received`,{frameUrl,href:String(event?.data?.href||event?.data?.url||``),messageType:previewMessageType(event?.data),origin:String(event?.origin||``),reason:String(event?.data?.reason||``)});if(frameUrl){setPreviewVisitedUrl(frameUrl,{reason:String(event?.data?.reason||``)});publishPreviewState({route:previewRouteFromUrl(frameUrl),title:String(event?.data?.title||``)})}}watch(previewIdentityLifecycleKey,lifecycle=>{if(lifecycle===previewIdentityLifecycle)return;closeOrientation();previewIdentityLifecycle=lifecycle;previewIdentityAutomaticAttempt=``;previewIdentityResumeSelection=null;resetPreviewResourceRecovery(lifecycle);resetPreviewIdentityState();previewBridgeRequests.rejectAll(`The active application preview changed.`);previewDiagnosticsBusy.value=false},{flush:`sync`,immediate:true});watch([previewFrameLoaded,previewFrame],()=>{if(orientation&&!orientationFrameCurrent(orientation))closeOrientation();else connectOrientation()},{flush:`sync`});watch([previewPaneDisplayed,()=>props.windowDisplayed,()=>learningOwner()?.exerciseStep(projectSlug.value)],invalidateHiddenOrientation,{flush:`sync`});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(previewState,state=>{if(outputTargetsLoaded.value&&[`failed`,`idle`,`project_closed`,`stopped`].includes(state))clearPreviewFrame(`preview-not-running`)},{flush:`sync`});watch([projectSlug,()=>String(props.session?.sessionId||``)],()=>{previewSuspended.value=false;cancelPreviewResourceRetry();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);document.addEventListener(`visibilitychange`,invalidateHiddenOrientation)});onBeforeUnmount(()=>{window.removeEventListener(`message`,handlePreviewBridgeMessage);document.removeEventListener(`visibilitychange`,invalidateHiddenOrientation);closeOrientation();cancelPreviewResourceRetry();previewBridgeRequests.rejectAll(`The application preview closed.`)});return{outputOptionsAction,previewWorkNotice,previewTestNotice,outputOptionsAvailable,outputOptionsError,outputOptionsErrors,outputOptionsRemember,outputOptionsSelection,outputOptionsValues,outputOptionsVisible,openOutputOptions,resetOutputOptions,runWithOptions,submitOutputOptions,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,previewBrowserControlsVisible,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,previewSuspended,suspendPreview,resumePreview,retryLaunchStatus,requestPreviewDiagnostics,resetPreviewAddressDraft,selectPreviewConfiguredIdentity,selectPreviewGuest,submitPreviewRouteDialog,submitPreviewAddress,restartTerminal,retryTerminal,runMenuDisabled,showLaunchLog,stopTerminal,setTerminalExpanded,terminal,terminalCanStop,terminalCanRestart,terminalCanRetry,terminalCommandPreview,terminalDisplayed,terminalExpanded,terminalError,terminalIndicatorLabel,terminalIndicatorState,terminalIsRunning,terminalStatus,terminalSubtitle,terminalTitle,terminalVisible,terminalWindowStorageKey,terminalWindowVisible,toolbarTeleportTarget,visible}}function launchPreviewEmptyText({launchStatusText=``,launchStarting=false,loadError=``,loading=false,outputTargetsUnavailable=false,nonWebOutputsAvailable=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 not running. Start it to see the app.`;if(launchStatusText)return launchStatusText;if(loadError)return`Preview status request failed: ${String(loadError||``).trim()}`;if(loading)return`Checking preview status.`;if(outputTargetsUnavailable)return`No runnable output is declared. You can continue working in the conversation.`;if(nonWebOutputsAvailable)return`This project has no web preview. Use Run to choose an output; terminal output and downloads appear here.`;return`Preview will appear here when it is ready.`}function outputTargetLabel(outputTarget=null){return String(outputTarget?.label||outputTarget?.id||``).trim()||`selected output target`}function launchPreviewInFlightText({workspacePreparing=false,activeOutputTarget=null,embeddedStartTarget=null,launchStarting=false,launchWaiting=false,launchStatusText=``,loading=false,operationBusy=false,previewDisplayedAddress=``,previewEmbedUnavailableReason=``,previewLoadingOverlayVisible=false,previewUrl=``,terminalCanRestart=false,terminalCanRetry=false,terminalIsRunning=false}={}){if(workspacePreparing)return`Preparing workspace before Preview can start. Expand Preparing workspace to see progress. Preview will retry automatically when setup finishes.`;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 current workspace 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();return`Loading preview page${address?`: ${address}`:``}. 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)}var PREVIEW_DIAGNOSTICS_MAX_TEXT_CHARACTERS=7e5;var 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(`
2
2
  `).map(line=>` ${line}`).join(`
3
3
  `):` (empty)`}function previewConsoleEntryText(entry={}){const source=clippedDiagnosticsValue(entry.source||`console`,80);const level=clippedDiagnosticsValue(entry.level||`log`,40).toUpperCase();return`[${clippedDiagnosticsValue(entry.timestamp||`unknown time`,80)}] [${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:\n${indentedDiagnosticsValue(error)}`);const requestHeaders=diagnosticsHeaders(entry.requestHeaders);if(Object.keys(requestHeaders).length>0)details.push(` Request headers:\n${indentedDiagnosticsValue(diagnosticsJson(requestHeaders))}`);if(entry.requestBody!==void 0&&String(entry.requestBody||``))details.push(` Request body:\n${indentedDiagnosticsValue(entry.requestBody)}`);const responseHeaders=diagnosticsHeaders(entry.responseHeaders);if(Object.keys(responseHeaders).length>0)details.push(` Response headers:\n${indentedDiagnosticsValue(diagnosticsJson(responseHeaders))}`);if(entry.responseBody!==void 0&&String(entry.responseBody||``))details.push(` Response body:\n${indentedDiagnosticsValue(entry.responseBody)}`);if(Number(entry.transferSize)>0)details.push(` Transfer size: ${Number(entry.transferSize)} bytes`);return[`[${timestamp}] [${kind}] ${method} ${diagnosticsUrl(entry.url)||`(unknown URL)`}`,...details].join(`
4
4
  `)}function diagnosticsSection(title,entries=[],formatEntry){const values=Array.isArray(entries)?entries:[];return[`## ${title} (${values.length})`,values.length>0?values.map(formatEntry).join(`